* 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
36 lines
1.3 KiB
TypeScript
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);
|
|
}
|