takt/src/features/interactive/modeSelection.ts
nrs f7d540b069
github-issue-154-moodoni4tsuno (#165)
* caffeinate に -d フラグを追加し、ディスプレイスリープ中の App Nap によるプロセス凍結を防止

* takt 対話モードの save_task を takt add と同じ worktree 設定フローに統一

takt 対話モードで Save Task を選択した際に worktree/branch/auto_pr の
設定プロンプトがスキップされ、takt run で clone なしに実行されて成果物が
消失するバグを修正。promptWorktreeSettings() を共通関数として抽出し、
saveTaskFromInteractive() と addTask() の両方から使用するようにした。

* Release v0.9.0

* takt: github-issue-154-moodoni4tsuno
2026-02-09 00:18:29 +09:00

36 lines
1.3 KiB
TypeScript

/**
* Interactive mode selection UI.
*
* Presents the four interactive mode options after piece selection
* and returns the user's choice.
*/
import type { InteractiveMode } from '../../core/models/index.js';
import { DEFAULT_INTERACTIVE_MODE, INTERACTIVE_MODES } from '../../core/models/index.js';
import { selectOptionWithDefault } from '../../shared/prompt/index.js';
import { getLabel } from '../../shared/i18n/index.js';
/**
* Prompt the user to select an interactive mode.
*
* @param lang - Display language
* @param pieceDefault - Piece-level default mode (overrides user default)
* @returns Selected mode, or null if cancelled
*/
export async function selectInteractiveMode(
lang: 'en' | 'ja',
pieceDefault?: InteractiveMode,
): Promise<InteractiveMode | null> {
const defaultMode = pieceDefault ?? DEFAULT_INTERACTIVE_MODE;
const options: { label: string; value: InteractiveMode; description: string }[] = INTERACTIVE_MODES.map((mode) => ({
label: getLabel(`interactive.modeSelection.${mode}`, lang),
value: mode,
description: getLabel(`interactive.modeSelection.${mode}Description`, lang),
}));
const prompt = getLabel('interactive.modeSelection.prompt', lang);
return selectOptionWithDefault<InteractiveMode>(prompt, options, defaultMode);
}