diff --git a/src/workspaces/adapters/ai-config.spec.ts b/src/workspaces/adapters/ai-config.spec.ts index 6f5f48433..3e7fa615d 100644 --- a/src/workspaces/adapters/ai-config.spec.ts +++ b/src/workspaces/adapters/ai-config.spec.ts @@ -769,6 +769,9 @@ describe('composeHeadlessCommand (one-shot headless argv, prompt placed per-CLI) '{"enableAllProjectMcpServers":true}', '--allowedTools', 'Bash(alice:*),Bash(alice-workspace:*),Bash(alice-uta:*),Bash(traderhub:*)', + // Without this, Write/Edit fall through to a permission prompt headless has no way to answer. + '--permission-mode', + 'acceptEdits', '-p', '--output-format', 'stream-json', diff --git a/src/workspaces/adapters/claude.ts b/src/workspaces/adapters/claude.ts index 53897f64b..c8d8e3c92 100644 --- a/src/workspaces/adapters/claude.ts +++ b/src/workspaces/adapters/claude.ts @@ -89,6 +89,10 @@ const HEADLESS_ALLOWED_TOOLS = [ 'Bash(traderhub:*)', ].join(','); +// The allowlist above covers Bash only. Without this, Write/Edit fall through +// to a permission prompt `-p` cannot answer, so headless runs lose all file output. +const HEADLESS_PERMISSION_MODE = 'acceptEdits'; + function isRecord(value: unknown): value is Record { return typeof value === 'object' && value !== null && !Array.isArray(value); } @@ -277,6 +281,7 @@ export const claudeAdapter: CliAdapter = { ...base, '--settings', AUTOTRUST_SETTINGS, '--allowedTools', HEADLESS_ALLOWED_TOOLS, + '--permission-mode', HEADLESS_PERMISSION_MODE, ...(ctx.sessionRuntime?.headlessArgs ?? []), ...(ctx.resume ? ['--resume', ctx.resume.sessionId] : []), '-p', '--output-format', 'stream-json', '--verbose',