package run // exec_dto.go 定义一次性 exec(run_command / run_tests)的请求/响应契约。 // 与 run profile 不同:exec 是同步请求-响应,输出在内存捕获后一次性返回。 // ExecCommandReq 是 run_command 的输入。WorktreeID 为空 → 在 workspace main_path 执行。 type ExecCommandReq struct { WorkspaceID string `json:"workspace_id"` WorktreeID string `json:"worktree_id,omitempty"` Command string `json:"command"` Args []string `json:"args,omitempty"` Env map[string]string `json:"env,omitempty"` // 临时覆盖(明文,不落库) TimeoutSec int `json:"timeout_sec,omitempty"` } // ExecCommandResp 是 run_command 的结构化结果。 type ExecCommandResp struct { ExitCode int `json:"exit_code"` Stdout string `json:"stdout"` Stderr string `json:"stderr"` DurationMs int64 `json:"duration_ms"` TimedOut bool `json:"timed_out"` Truncated bool `json:"truncated"` } // ExecTestsReq 是 run_tests 的输入:在 run_command 基础上增加 Format(解析格式)。 type ExecTestsReq struct { WorkspaceID string `json:"workspace_id"` WorktreeID string `json:"worktree_id,omitempty"` Command string `json:"command"` Args []string `json:"args,omitempty"` Format string `json:"format,omitempty"` // gotest|junit|vitest|auto(默认 auto) Env map[string]string `json:"env,omitempty"` TimeoutSec int `json:"timeout_sec,omitempty"` } // ExecTestsResp 是 run_tests 的结果:run_command 输出 + 结构化测试摘要。 // ParseError 非空表示解析失败,但原始输出与退出码仍可用——run_tests 永不因解析失败 // 而向 agent 返回错误。 type ExecTestsResp struct { ExecCommandResp Summary TestSummary `json:"summary"` ParseError string `json:"parse_error,omitempty"` } // TestSummary 是跨框架(go test / JUnit / vitest)归一化的测试结果摘要。 type TestSummary struct { Framework string `json:"framework"` Total int `json:"total"` Passed int `json:"passed"` Failed int `json:"failed"` Skipped int `json:"skipped"` DurationMs int64 `json:"duration_ms"` Failures []TestFailure `json:"failures"` } // TestFailure 描述单个失败用例。Package 对非 go 框架可能为空。 type TestFailure struct { Name string `json:"name"` Package string `json:"package,omitempty"` Message string `json:"message,omitempty"` }