Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions apps/cli/src/parse-args.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,23 @@ describe('parseArgs', () => {
expect(p.unknownFlags).toContain('--mode invalid');
});

it('--permission-mode is a true alias for --mode (sets mode, is wired)', () => {
// Regression: previously parsed into a separate field that cli.ts never read,
// so --permission-mode was silently ignored. It must set `mode` like --mode.
expect(parseArgs(['--permission-mode', 'plan']).mode).toBe('plan');
expect(parseArgs(['--permission-mode', 'bypassPermissions']).mode).toBe('bypassPermissions');
const p = parseArgs(['--permission-mode', 'invalid']);
expect(p.mode).toBeUndefined();
expect(p.unknownFlags).toContain('--permission-mode invalid');
});

it('--mode and --permission-mode: last flag wins', () => {
expect(parseArgs(['--mode', 'plan', '--permission-mode', 'acceptEdits']).mode).toBe(
'acceptEdits',
);
expect(parseArgs(['--permission-mode', 'acceptEdits', '--mode', 'plan']).mode).toBe('plan');
});

it('--effort validation', () => {
expect(parseArgs(['--effort', 'high']).effort).toBe('high');
expect(parseArgs(['--effort', 'wrong']).unknownFlags).toContain('--effort wrong');
Expand Down
6 changes: 4 additions & 2 deletions apps/cli/src/parse-args.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ export interface ParsedArgs {

// Session shaping
mode?: Mode;
permissionMode?: Mode;
model?: string;
effort?: Effort;
maxTurns?: number;
Expand Down Expand Up @@ -159,9 +158,12 @@ export function parseArgs(argv: string[]): ParsedArgs {
else out.unknownFlags.push(`--mode ${v ?? ''}`);
break;
}
// Claude Code alias for --mode: set out.mode directly so it's actually
// wired through cli.ts (which only forwards args.mode). Last flag wins if
// both --mode and --permission-mode are given.
case a === '--permission-mode': {
const v = next();
if (v && (VALID_MODES as string[]).includes(v)) out.permissionMode = v as Mode;
if (v && (VALID_MODES as string[]).includes(v)) out.mode = v as Mode;
else out.unknownFlags.push(`--permission-mode ${v ?? ''}`);
break;
}
Expand Down
Loading