diff --git a/claude_code/wrapper/main.go b/claude_code/wrapper/main.go index 9bcb4f8..4dd1943 100644 --- a/claude_code/wrapper/main.go +++ b/claude_code/wrapper/main.go @@ -249,6 +249,10 @@ func cmdBuild(args []string) { cmd = append(cmd, "--dangerously-skip-permissions") } + // Stream-json output format: emits JSONL to stdout, including a final + // "result" message with token usage data for cost tracking. + cmd = append(cmd, "--output-format", "stream-json") + // Disallow Claude Code's native scheduling tools — StrawPot manages // scheduling through its own orchestrator (denden). cmd = append(cmd, "--disallowedTools", "CronCreate,CronDelete,CronList") diff --git a/claude_code/wrapper/main_test.go b/claude_code/wrapper/main_test.go index e5e4593..334760a 100644 --- a/claude_code/wrapper/main_test.go +++ b/claude_code/wrapper/main_test.go @@ -364,6 +364,25 @@ func TestCmdBuild_DangerouslySkipPermissions_Disabled(t *testing.T) { } } +func TestCmdBuild_StreamJsonOutputFormat(t *testing.T) { + tmpDir := t.TempDir() + wsDir := filepath.Join(tmpDir, "workspace") + + args := []string{ + "--agent-workspace-dir", wsDir, + } + + output := captureBuildOutput(t, args) + + var result map[string]interface{} + if err := json.Unmarshal(output, &result); err != nil { + t.Fatalf("Failed to parse JSON output: %v", err) + } + + cmd := result["cmd"].([]interface{}) + assertSequence(t, cmd, "--output-format", "stream-json") +} + func TestCmdBuild_DisallowedSchedulingTools(t *testing.T) { tmpDir := t.TempDir() wsDir := filepath.Join(tmpDir, "workspace")