fix(exec): use --output-format json to get structured output from claude
--json-schema combined with --output-format text produces empty stdout. The structured result is in the "structured_output" field of the json envelope. Updated executor to unwrap the envelope. Also removes --bare flag which disables OAuth keychain reads, causing silent auth failure when ANTHROPIC_API_KEY is not set. Adds goreman Procfile + stdio bridge (cmd/bridge) for Claude Code MCP integration. Task start/stop replaced with goreman + port-kill. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -68,11 +68,10 @@ func (e *Executor) Run(ctx context.Context, req Request) (Result, error) {
|
||||
|
||||
args := []string{
|
||||
"--print",
|
||||
"--bare",
|
||||
"--permission-mode", "bypassPermissions",
|
||||
"--tools", tools,
|
||||
"--json-schema", Schema,
|
||||
"--output-format", "text",
|
||||
"--output-format", "json",
|
||||
prompt,
|
||||
}
|
||||
|
||||
@@ -89,12 +88,21 @@ func (e *Executor) Run(ctx context.Context, req Request) (Result, error) {
|
||||
return Result{}, fmt.Errorf("claude exited with error: %w — stderr: %s", err, stderr.String())
|
||||
}
|
||||
|
||||
var r Result
|
||||
if err := json.Unmarshal(stdout.Bytes(), &r); err != nil {
|
||||
return Result{}, fmt.Errorf("parse result JSON: %w — raw output: %s", err, stdout.String())
|
||||
// --output-format json wraps the response in an envelope; structured output
|
||||
// from --json-schema is in the "structured_output" field.
|
||||
var envelope struct {
|
||||
StructuredOutput *Result `json:"structured_output"`
|
||||
IsError bool `json:"is_error"`
|
||||
Result string `json:"result"` // fallback text result for error messages
|
||||
}
|
||||
if err := r.Validate(); err != nil {
|
||||
if err := json.Unmarshal(stdout.Bytes(), &envelope); err != nil {
|
||||
return Result{}, fmt.Errorf("parse envelope JSON: %w — raw: %s — stderr: %s", err, stdout.String(), stderr.String())
|
||||
}
|
||||
if envelope.StructuredOutput == nil {
|
||||
return Result{}, fmt.Errorf("no structured_output in response — result: %s — stderr: %s", envelope.Result, stderr.String())
|
||||
}
|
||||
if err := envelope.StructuredOutput.Validate(); err != nil {
|
||||
return Result{}, fmt.Errorf("invalid result: %w", err)
|
||||
}
|
||||
return r, nil
|
||||
return *envelope.StructuredOutput, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user