takt/src/app/cli/helpers.ts

68 lines
2.1 KiB
TypeScript

/**
* CLI helper functions
*
* Utility functions for option parsing and task classification.
*/
import type { Command } from 'commander';
import type { TaskExecutionOptions } from '../../features/tasks/index.js';
import type { ProviderType } from '../../infra/providers/index.js';
import { error } from '../../shared/ui/index.js';
import { isIssueReference } from '../../infra/github/index.js';
/**
* Resolve --provider and --model options into TaskExecutionOptions.
* Returns undefined if neither is specified.
*/
export function resolveAgentOverrides(program: Command): TaskExecutionOptions | undefined {
const opts = program.opts();
const provider = opts.provider as ProviderType | undefined;
const model = opts.model as string | undefined;
if (!provider && !model) {
return undefined;
}
return { provider, model };
}
/**
* Parse --create-worktree option value (yes/no/true/false).
* Returns undefined if not specified, boolean otherwise.
* Exits with error on invalid value.
*/
export function parseCreateWorktreeOption(value?: string): boolean | undefined {
if (!value) {
return undefined;
}
const normalized = value.toLowerCase();
if (normalized === 'yes' || normalized === 'true') {
return true;
}
if (normalized === 'no' || normalized === 'false') {
return false;
}
error('Invalid value for --create-worktree. Use yes or no.');
process.exit(1);
}
/**
* Check if the input is a task description that should execute directly
* vs one that should enter interactive mode.
*
* Direct execution (returns true):
* - Valid issue references (e.g., "#32", "#10 #20")
*
* Interactive mode (returns false):
* - All other inputs (task descriptions, single words, slash-prefixed, etc.)
*
* Note: This simplified logic ensures that only explicit issue references
* trigger direct execution. All other inputs go through interactive mode
* for requirement clarification.
*/
export function isDirectTask(input: string): boolean {
return isIssueReference(input) || input.trim().split(/\s+/).every((t: string) => isIssueReference(t));
}