import { describe, expect, it } from 'vitest' import { planCommitMessageGeneration } from './commit-message-plan' describe('planCommitMessageGeneration', () => { it('plans Claude non-interactive generation with the prompt on stdin only', () => { const result = planCommitMessageGeneration( { agentId: 'claude', model: 'sonnet', thinkingLevel: 'high' }, 'PROMPT' ) expect(result).toEqual({ ok: true, plan: { binary: 'claude', args: [ '-p', '--output-format', 'text', '--model', 'sonnet', '--permission-mode', 'plan', '--effort', 'high' ], stdinPayload: 'PROMPT', label: 'Claude' } }) }) it('plans OpenCode run with prompt in argv and model variant', () => { const result = planCommitMessageGeneration( { agentId: 'opencode', model: 'opencode/gpt-5.4-mini', thinkingLevel: 'high' }, 'PROMPT' ) expect(result).toEqual({ ok: true, plan: { binary: 'opencode', args: [ 'run', '--model', 'opencode/gpt-5.4-mini', '--agent', 'build', '--format', 'default', '--variant', 'high', 'PROMPT' ], stdinPayload: null, label: 'OpenCode' } }) }) it('allows discovered dynamic models that are not in the seed catalog', () => { const result = planCommitMessageGeneration( { agentId: 'cursor', model: 'gpt-5.2', thinkingLevel: 'xhigh' }, 'PROMPT' ) expect(result).toEqual({ ok: true, plan: { binary: 'cursor-agent', args: [ '--print', '--mode', 'ask', '--trust', '--output-format', 'text', '--model', 'gpt-5.2', 'PROMPT' ], stdinPayload: null, label: 'Cursor' } }) }) it('plans Codex exec as non-interactive read-only generation with the prompt on stdin only', () => { const result = planCommitMessageGeneration( { agentId: 'codex', model: 'gpt-5.4-mini', thinkingLevel: 'medium' }, 'PROMPT' ) expect(result).toEqual({ ok: true, plan: { binary: 'codex', args: [ 'exec', '--ephemeral', '--skip-git-repo-check', '-s', 'read-only', '--model', 'gpt-5.4-mini', '-c', 'model_reasoning_effort=medium' ], stdinPayload: 'PROMPT', label: 'Codex' } }) }) it('uses preset agent command overrides as the spawn command prefix', () => { const result = planCommitMessageGeneration( { agentId: 'codex', model: 'gpt-5.4-mini', agentCommandOverride: 'npx codex' }, 'PROMPT' ) expect(result).toMatchObject({ ok: true, plan: { binary: 'npx', args: [ 'codex', 'exec', '--ephemeral', '--skip-git-repo-check', '-s', 'read-only', '--model', 'gpt-5.4-mini' ], stdinPayload: 'PROMPT' } }) }) it('rejects invalid preset agent command overrides before spawning', () => { const result = planCommitMessageGeneration( { agentId: 'claude', model: 'haiku', agentCommandOverride: 'claude "unterminated' }, 'PROMPT' ) expect(result).toEqual({ ok: false, error: 'Agent command override is invalid: Unclosed quote in command template.' }) }) })