42 lines
1.5 KiB
TypeScript
42 lines
1.5 KiB
TypeScript
import { resolveClaudeBin } from './claudeBin'
|
|
|
|
/**
|
|
* Single source of truth for the `claude` (cc) terminal launch command.
|
|
*
|
|
* Every session entry point (brainstorm / implement / test / review / resume /
|
|
* managed session) shells out `claude` with the same flags; building the
|
|
* string in one place keeps those call sites from drifting apart.
|
|
*
|
|
* We deliberately pass no `--system-prompt`; cc runs with its own default
|
|
* system prompt.
|
|
*/
|
|
|
|
export interface CcCommandOpts {
|
|
/** Path passed to `--settings` (caller guarantees it contains no single quote). */
|
|
profilePath: string
|
|
/** e.g. 'high' → `--effort high`; omitted means no `--effort`. */
|
|
effort?: string
|
|
/** When set, append `--resume <id>`. Mutually exclusive with prompt; resume wins. */
|
|
resumeSessionId?: string
|
|
/** When set (and no resume), append the prompt as a positional `'<prompt>'` arg. */
|
|
prompt?: string
|
|
}
|
|
|
|
function quoteIfNeeded(bin: string): string {
|
|
return bin.includes(' ') ? `'${bin}'` : bin
|
|
}
|
|
|
|
export function buildCcCommand(opts: CcCommandOpts): string {
|
|
const parts = [quoteIfNeeded(resolveClaudeBin() ?? 'claude')]
|
|
if (opts.effort)
|
|
parts.push(`--effort ${opts.effort}`)
|
|
parts.push('--dangerously-skip-permissions', `--settings '${opts.profilePath}'`)
|
|
// resume and prompt are mutually exclusive; a resumed session restores its
|
|
// own conversation, so a fresh prompt would be meaningless.
|
|
if (opts.resumeSessionId)
|
|
parts.push(`--resume ${opts.resumeSessionId}`)
|
|
else if (opts.prompt)
|
|
parts.push(`'${opts.prompt}'`)
|
|
return parts.join(' ')
|
|
}
|