From b4f25cce4897d1722636c95f1915b2611542e038 Mon Sep 17 00:00:00 2001 From: Chris La Date: Mon, 23 Mar 2026 16:33:30 -0700 Subject: [PATCH] Add --output-format stream-json to Claude Code command Enable stream-json output format so Claude Code emits JSONL to stdout, including a final "result" message with token usage data. This is the prerequisite for cost tracking in StrawPot sessions. Part of strawpot#422 (Cost Observability Phase 1). Co-Authored-By: Claude Opus 4.6 (1M context) --- claude_code/wrapper/main.go | 4 ++++ claude_code/wrapper/main_test.go | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) 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")