harness-engineering-agent 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +439 -62
- package/dist/config/config-defaults.d.ts +0 -0
- package/dist/config/config-defaults.d.ts.map +0 -0
- package/dist/config/config-defaults.js +0 -0
- package/dist/config/config-defaults.js.map +0 -0
- package/dist/config/config-errors.d.ts +0 -0
- package/dist/config/config-errors.d.ts.map +0 -0
- package/dist/config/config-errors.js +0 -0
- package/dist/config/config-errors.js.map +0 -0
- package/dist/config/config-file.d.ts +0 -0
- package/dist/config/config-file.d.ts.map +0 -0
- package/dist/config/config-file.js +0 -0
- package/dist/config/config-file.js.map +0 -0
- package/dist/config/config-merge.d.ts +0 -0
- package/dist/config/config-merge.d.ts.map +0 -0
- package/dist/config/config-merge.js +0 -0
- package/dist/config/config-merge.js.map +0 -0
- package/dist/config/config-schema.d.ts +0 -0
- package/dist/config/config-schema.d.ts.map +0 -0
- package/dist/config/config-schema.js +0 -0
- package/dist/config/config-schema.js.map +0 -0
- package/dist/config/config-types.d.ts +0 -0
- package/dist/config/config-types.d.ts.map +0 -0
- package/dist/config/config-types.js +0 -0
- package/dist/config/config-types.js.map +0 -0
- package/dist/config/harness-config.d.ts +0 -0
- package/dist/config/harness-config.d.ts.map +0 -0
- package/dist/config/harness-config.js +0 -0
- package/dist/config/harness-config.js.map +0 -0
- package/dist/config/index.d.ts +0 -0
- package/dist/config/index.d.ts.map +0 -0
- package/dist/config/index.js +0 -0
- package/dist/config/index.js.map +0 -0
- package/dist/config/load-harness-config.d.ts +0 -0
- package/dist/config/load-harness-config.d.ts.map +0 -0
- package/dist/config/load-harness-config.js +0 -0
- package/dist/config/load-harness-config.js.map +0 -0
- package/dist/controller/agent-output.d.ts +0 -0
- package/dist/controller/agent-output.d.ts.map +0 -0
- package/dist/controller/agent-output.js +0 -0
- package/dist/controller/agent-output.js.map +0 -0
- package/dist/controller/agent-session.d.ts +0 -0
- package/dist/controller/agent-session.d.ts.map +0 -0
- package/dist/controller/agent-session.js +0 -0
- package/dist/controller/agent-session.js.map +0 -0
- package/dist/controller/contracts.d.ts +0 -0
- package/dist/controller/contracts.d.ts.map +0 -0
- package/dist/controller/contracts.js +0 -0
- package/dist/controller/contracts.js.map +0 -0
- package/dist/controller/errors.d.ts +0 -0
- package/dist/controller/errors.d.ts.map +0 -0
- package/dist/controller/errors.js +0 -0
- package/dist/controller/errors.js.map +0 -0
- package/dist/controller/evidence-factory.d.ts +0 -0
- package/dist/controller/evidence-factory.d.ts.map +0 -0
- package/dist/controller/evidence-factory.js +0 -0
- package/dist/controller/evidence-factory.js.map +0 -0
- package/dist/controller/failure-analysis.d.ts +0 -0
- package/dist/controller/failure-analysis.d.ts.map +0 -0
- package/dist/controller/failure-analysis.js +0 -0
- package/dist/controller/failure-analysis.js.map +0 -0
- package/dist/controller/failure-factory.d.ts +0 -0
- package/dist/controller/failure-factory.d.ts.map +0 -0
- package/dist/controller/failure-factory.js +0 -0
- package/dist/controller/failure-factory.js.map +0 -0
- package/dist/controller/graph-validator.d.ts +0 -0
- package/dist/controller/graph-validator.d.ts.map +0 -0
- package/dist/controller/graph-validator.js +0 -0
- package/dist/controller/graph-validator.js.map +0 -0
- package/dist/controller/index.d.ts +0 -0
- package/dist/controller/index.d.ts.map +0 -0
- package/dist/controller/index.js +0 -0
- package/dist/controller/index.js.map +0 -0
- package/dist/controller/repair-loop.d.ts +0 -0
- package/dist/controller/repair-loop.d.ts.map +0 -0
- package/dist/controller/repair-loop.js +0 -0
- package/dist/controller/repair-loop.js.map +0 -0
- package/dist/controller/report-factory.d.ts +0 -0
- package/dist/controller/report-factory.d.ts.map +0 -0
- package/dist/controller/report-factory.js +0 -0
- package/dist/controller/report-factory.js.map +0 -0
- package/dist/controller/role-prompts.d.ts +0 -0
- package/dist/controller/role-prompts.d.ts.map +0 -0
- package/dist/controller/role-prompts.js +0 -0
- package/dist/controller/role-prompts.js.map +0 -0
- package/dist/controller/run-controller.d.ts +0 -0
- package/dist/controller/run-controller.d.ts.map +0 -0
- package/dist/controller/run-controller.js +0 -0
- package/dist/controller/run-controller.js.map +0 -0
- package/dist/controller/run-persistence.d.ts +0 -0
- package/dist/controller/run-persistence.d.ts.map +0 -0
- package/dist/controller/run-persistence.js +0 -0
- package/dist/controller/run-persistence.js.map +0 -0
- package/dist/controller/run-state.d.ts +0 -0
- package/dist/controller/run-state.d.ts.map +0 -0
- package/dist/controller/run-state.js +0 -0
- package/dist/controller/run-state.js.map +0 -0
- package/dist/controller/task-agent-output.d.ts +0 -0
- package/dist/controller/task-agent-output.d.ts.map +0 -0
- package/dist/controller/task-agent-output.js +0 -0
- package/dist/controller/task-agent-output.js.map +0 -0
- package/dist/controller/task-agent-schemas.d.ts +0 -0
- package/dist/controller/task-agent-schemas.d.ts.map +0 -0
- package/dist/controller/task-agent-schemas.js +0 -0
- package/dist/controller/task-agent-schemas.js.map +0 -0
- package/dist/controller/task-executor.d.ts +0 -0
- package/dist/controller/task-executor.d.ts.map +0 -0
- package/dist/controller/task-executor.js +0 -0
- package/dist/controller/task-executor.js.map +0 -0
- package/dist/controller/task-paths.d.ts +0 -0
- package/dist/controller/task-paths.d.ts.map +0 -0
- package/dist/controller/task-paths.js +0 -0
- package/dist/controller/task-paths.js.map +0 -0
- package/dist/controller/task-retry.d.ts +0 -0
- package/dist/controller/task-retry.d.ts.map +0 -0
- package/dist/controller/task-retry.js +0 -0
- package/dist/controller/task-retry.js.map +0 -0
- package/dist/controller/worktree-eligibility.d.ts +0 -0
- package/dist/controller/worktree-eligibility.d.ts.map +0 -0
- package/dist/controller/worktree-eligibility.js +0 -0
- package/dist/controller/worktree-eligibility.js.map +0 -0
- package/dist/controller/worktree-scheduler.d.ts +0 -0
- package/dist/controller/worktree-scheduler.d.ts.map +0 -0
- package/dist/controller/worktree-scheduler.js +0 -0
- package/dist/controller/worktree-scheduler.js.map +0 -0
- package/dist/domain/agent-result.d.ts +0 -0
- package/dist/domain/agent-result.d.ts.map +0 -0
- package/dist/domain/agent-result.js +0 -0
- package/dist/domain/agent-result.js.map +0 -0
- package/dist/domain/evidence.d.ts +0 -0
- package/dist/domain/evidence.d.ts.map +0 -0
- package/dist/domain/evidence.js +0 -0
- package/dist/domain/evidence.js.map +0 -0
- package/dist/domain/failure.d.ts +0 -0
- package/dist/domain/failure.d.ts.map +0 -0
- package/dist/domain/failure.js +0 -0
- package/dist/domain/failure.js.map +0 -0
- package/dist/domain/index.d.ts +0 -0
- package/dist/domain/index.d.ts.map +0 -0
- package/dist/domain/index.js +0 -0
- package/dist/domain/index.js.map +0 -0
- package/dist/domain/report.d.ts +0 -0
- package/dist/domain/report.d.ts.map +0 -0
- package/dist/domain/report.js +0 -0
- package/dist/domain/report.js.map +0 -0
- package/dist/domain/requirement.d.ts +0 -0
- package/dist/domain/requirement.d.ts.map +0 -0
- package/dist/domain/requirement.js +0 -0
- package/dist/domain/requirement.js.map +0 -0
- package/dist/domain/run.d.ts +0 -0
- package/dist/domain/run.d.ts.map +0 -0
- package/dist/domain/run.js +0 -0
- package/dist/domain/run.js.map +0 -0
- package/dist/domain/shared.d.ts +0 -0
- package/dist/domain/shared.d.ts.map +0 -0
- package/dist/domain/shared.js +0 -0
- package/dist/domain/shared.js.map +0 -0
- package/dist/domain/task.d.ts +0 -0
- package/dist/domain/task.d.ts.map +0 -0
- package/dist/domain/task.js +0 -0
- package/dist/domain/task.js.map +0 -0
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +0 -0
- package/dist/index.js +0 -0
- package/dist/index.js.map +0 -0
- package/dist/path/workspace-path.d.ts +0 -0
- package/dist/path/workspace-path.d.ts.map +0 -0
- package/dist/path/workspace-path.js +0 -0
- package/dist/path/workspace-path.js.map +0 -0
- package/dist/plugin/create-harness-plugin.d.ts +0 -0
- package/dist/plugin/create-harness-plugin.d.ts.map +0 -0
- package/dist/plugin/create-harness-plugin.js +0 -0
- package/dist/plugin/create-harness-plugin.js.map +0 -0
- package/dist/plugin/harness-agent-config.d.ts +0 -0
- package/dist/plugin/harness-agent-config.d.ts.map +0 -0
- package/dist/plugin/harness-agent-config.js +0 -0
- package/dist/plugin/harness-agent-config.js.map +0 -0
- package/dist/plugin/harness-chat-hook.d.ts +0 -0
- package/dist/plugin/harness-chat-hook.d.ts.map +0 -0
- package/dist/plugin/harness-chat-hook.js +0 -0
- package/dist/plugin/harness-chat-hook.js.map +0 -0
- package/dist/plugin/harness-chat-parts.d.ts +0 -0
- package/dist/plugin/harness-chat-parts.d.ts.map +0 -0
- package/dist/plugin/harness-chat-parts.js +0 -0
- package/dist/plugin/harness-chat-parts.js.map +0 -0
- package/dist/plugin/harness-chat-protocol.d.ts +0 -0
- package/dist/plugin/harness-chat-protocol.d.ts.map +0 -0
- package/dist/plugin/harness-chat-protocol.js +0 -0
- package/dist/plugin/harness-chat-protocol.js.map +0 -0
- package/dist/plugin/harness-coordinator.d.ts +0 -0
- package/dist/plugin/harness-coordinator.d.ts.map +0 -0
- package/dist/plugin/harness-coordinator.js +0 -0
- package/dist/plugin/harness-coordinator.js.map +0 -0
- package/dist/plugin/harness-intake-prompt.d.ts +0 -0
- package/dist/plugin/harness-intake-prompt.d.ts.map +0 -0
- package/dist/plugin/harness-intake-prompt.js +0 -0
- package/dist/plugin/harness-intake-prompt.js.map +0 -0
- package/dist/plugin/harness-intent.d.ts +0 -0
- package/dist/plugin/harness-intent.d.ts.map +0 -0
- package/dist/plugin/harness-intent.js +0 -0
- package/dist/plugin/harness-intent.js.map +0 -0
- package/dist/plugin/harness-parent-session-dispatcher.d.ts +0 -0
- package/dist/plugin/harness-parent-session-dispatcher.d.ts.map +0 -0
- package/dist/plugin/harness-parent-session-dispatcher.js +0 -0
- package/dist/plugin/harness-parent-session-dispatcher.js.map +0 -0
- package/dist/plugin/harness-requirement.d.ts +0 -0
- package/dist/plugin/harness-requirement.d.ts.map +0 -0
- package/dist/plugin/harness-requirement.js +0 -0
- package/dist/plugin/harness-requirement.js.map +0 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +9 -0
- package/dist/server.js.map +1 -0
- package/dist/session/contracts.d.ts +0 -0
- package/dist/session/contracts.d.ts.map +0 -0
- package/dist/session/contracts.js +0 -0
- package/dist/session/contracts.js.map +0 -0
- package/dist/session/fake-session-adapter.d.ts +0 -0
- package/dist/session/fake-session-adapter.d.ts.map +0 -0
- package/dist/session/fake-session-adapter.js +0 -0
- package/dist/session/fake-session-adapter.js.map +0 -0
- package/dist/session/fake-session-errors.d.ts +0 -0
- package/dist/session/fake-session-errors.d.ts.map +0 -0
- package/dist/session/fake-session-errors.js +0 -0
- package/dist/session/fake-session-errors.js.map +0 -0
- package/dist/session/harness-agent-names.d.ts +0 -0
- package/dist/session/harness-agent-names.d.ts.map +0 -0
- package/dist/session/harness-agent-names.js +0 -0
- package/dist/session/harness-agent-names.js.map +0 -0
- package/dist/session/index.d.ts +0 -0
- package/dist/session/index.d.ts.map +0 -0
- package/dist/session/index.js +0 -0
- package/dist/session/index.js.map +0 -0
- package/dist/session/opencode-session-adapter.d.ts +0 -0
- package/dist/session/opencode-session-adapter.d.ts.map +0 -0
- package/dist/session/opencode-session-adapter.js +0 -0
- package/dist/session/opencode-session-adapter.js.map +0 -0
- package/dist/session/opencode-session-client.d.ts +0 -0
- package/dist/session/opencode-session-client.d.ts.map +0 -0
- package/dist/session/opencode-session-client.js +0 -0
- package/dist/session/opencode-session-client.js.map +0 -0
- package/dist/session/opencode-session-errors.d.ts +0 -0
- package/dist/session/opencode-session-errors.d.ts.map +0 -0
- package/dist/session/opencode-session-errors.js +0 -0
- package/dist/session/opencode-session-errors.js.map +0 -0
- package/dist/session/opencode-session-prompts.d.ts +0 -0
- package/dist/session/opencode-session-prompts.d.ts.map +0 -0
- package/dist/session/opencode-session-prompts.js +0 -0
- package/dist/session/opencode-session-prompts.js.map +0 -0
- package/dist/store/filesystem-run-store-io.d.ts +0 -0
- package/dist/store/filesystem-run-store-io.d.ts.map +0 -0
- package/dist/store/filesystem-run-store-io.js +0 -0
- package/dist/store/filesystem-run-store-io.js.map +0 -0
- package/dist/store/filesystem-run-store.d.ts +0 -0
- package/dist/store/filesystem-run-store.d.ts.map +0 -0
- package/dist/store/filesystem-run-store.js +0 -0
- package/dist/store/filesystem-run-store.js.map +0 -0
- package/dist/store/index.d.ts +0 -0
- package/dist/store/index.d.ts.map +0 -0
- package/dist/store/index.js +0 -0
- package/dist/store/index.js.map +0 -0
- package/dist/store/run-event.d.ts +0 -0
- package/dist/store/run-event.d.ts.map +0 -0
- package/dist/store/run-event.js +0 -0
- package/dist/store/run-event.js.map +0 -0
- package/dist/store/run-store-errors.d.ts +0 -0
- package/dist/store/run-store-errors.d.ts.map +0 -0
- package/dist/store/run-store-errors.js +0 -0
- package/dist/store/run-store-errors.js.map +0 -0
- package/dist/tools/context7-client.d.ts +0 -0
- package/dist/tools/context7-client.d.ts.map +0 -0
- package/dist/tools/context7-client.js +0 -0
- package/dist/tools/context7-client.js.map +0 -0
- package/dist/tools/grep-app-client.d.ts +0 -0
- package/dist/tools/grep-app-client.d.ts.map +0 -0
- package/dist/tools/grep-app-client.js +0 -0
- package/dist/tools/grep-app-client.js.map +0 -0
- package/dist/tools/harness-research-tools.d.ts +0 -0
- package/dist/tools/harness-research-tools.d.ts.map +0 -0
- package/dist/tools/harness-research-tools.js +0 -0
- package/dist/tools/harness-research-tools.js.map +0 -0
- package/dist/tools/lsp-client.d.ts +0 -0
- package/dist/tools/lsp-client.d.ts.map +0 -0
- package/dist/tools/lsp-client.js +0 -0
- package/dist/tools/lsp-client.js.map +0 -0
- package/dist/tools/lsp-json-rpc.d.ts +0 -0
- package/dist/tools/lsp-json-rpc.d.ts.map +0 -0
- package/dist/tools/lsp-json-rpc.js +0 -0
- package/dist/tools/lsp-json-rpc.js.map +0 -0
- package/dist/verification/command-policy.d.ts +0 -0
- package/dist/verification/command-policy.d.ts.map +0 -0
- package/dist/verification/command-policy.js +0 -0
- package/dist/verification/command-policy.js.map +0 -0
- package/dist/verification/contracts.d.ts +0 -0
- package/dist/verification/contracts.d.ts.map +0 -0
- package/dist/verification/contracts.js +0 -0
- package/dist/verification/contracts.js.map +0 -0
- package/dist/verification/fake-process-runner.d.ts +0 -0
- package/dist/verification/fake-process-runner.d.ts.map +0 -0
- package/dist/verification/fake-process-runner.js +0 -0
- package/dist/verification/fake-process-runner.js.map +0 -0
- package/dist/verification/index.d.ts +0 -0
- package/dist/verification/index.d.ts.map +0 -0
- package/dist/verification/index.js +0 -0
- package/dist/verification/index.js.map +0 -0
- package/dist/verification/node-process-runner.d.ts +0 -0
- package/dist/verification/node-process-runner.d.ts.map +0 -0
- package/dist/verification/node-process-runner.js +0 -0
- package/dist/verification/node-process-runner.js.map +0 -0
- package/dist/verification/verification-runner.d.ts +0 -0
- package/dist/verification/verification-runner.d.ts.map +0 -0
- package/dist/verification/verification-runner.js +0 -0
- package/dist/verification/verification-runner.js.map +0 -0
- package/dist/workspace/git-baseline.d.ts +0 -0
- package/dist/workspace/git-baseline.d.ts.map +0 -0
- package/dist/workspace/git-baseline.js +0 -0
- package/dist/workspace/git-baseline.js.map +0 -0
- package/dist/workspace/git-workspace-adapter.d.ts +0 -0
- package/dist/workspace/git-workspace-adapter.d.ts.map +0 -0
- package/dist/workspace/git-workspace-adapter.js +0 -0
- package/dist/workspace/git-workspace-adapter.js.map +0 -0
- package/dist/workspace/git-worktree-adapter.d.ts +0 -0
- package/dist/workspace/git-worktree-adapter.d.ts.map +0 -0
- package/dist/workspace/git-worktree-adapter.js +0 -0
- package/dist/workspace/git-worktree-adapter.js.map +0 -0
- package/dist/workspace/index.d.ts +0 -0
- package/dist/workspace/index.d.ts.map +0 -0
- package/dist/workspace/index.js +0 -0
- package/dist/workspace/index.js.map +0 -0
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -1,21 +1,196 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
1
3
|
# Harness Engineering Agent
|
|
2
4
|
|
|
3
|
-
面向复杂项目工程的 OpenCode
|
|
5
|
+
面向复杂项目工程的 OpenCode 自动开发插件,也是 OpenCode 之上的**确定性控制平面**。
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
插件通过一个专用 primary `harness` Agent 和七个内部 Harness Agent 协调完成需求塑形、规划编排、代码实现、独立验证、最终验收、失败归因与修复规划。插件全局安装,按项目配置运行,不依赖 Sisyphus、OMO 或 OpenSpec 运行时。
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
Harness 是确定性的控制平面,内部 Agent 是受约束的概率执行器。只有 Controller 才能推进全局状态,Agent 输出只是结构化建议,不能绕过 Guard Condition。
|
|
10
|
+
|
|
11
|
+
## 核心能力
|
|
8
12
|
|
|
9
13
|
- 选择 `harness` Agent 后,使用自然语言发起 `start`、`status`、`resume`、`pause`、`cancel`、`answer`、`waive`、`report` 生命周期操作。
|
|
10
|
-
- 插件只在当前消息的 `agent === "harness"` 时触发 Harness
|
|
14
|
+
- 插件只在当前消息的 `agent === "harness"` 时触发 Harness 协调。普通 Agent 和普通聊天不会自动拦截。
|
|
11
15
|
- 自然语言请求先进入内部 Intake Session,转换为严格 JSON intent,再由确定性的 RunController 执行对应操作。
|
|
12
16
|
- `chat.message` 采用两阶段非阻塞流程:前台先返回 synthetic 受理确认,协调工作在后台运行;后台完成后再向同一父会话补发 Harness 内部完成消息,供 `harness` Agent 做最终总结。
|
|
13
|
-
- 所有内部 Session
|
|
14
|
-
- 当前激活链为 `Nuwa -> Fuxi -> Luban -> deterministic verification -> Zhulong -> Yinglong`;失败时经 `Xingtian` 归因,允许自动修复时由 `Jingwei` 生成 Repair Task,再交回 `Luban` 在受限范围内执行。
|
|
15
|
-
- `resume` 会从 `.harness/runs/<run-id>/` 的快照与事件恢复上下文,不会重复已完成 Task 或丢失既有 evidence。
|
|
17
|
+
- 所有内部 Session 显式绑定到 Harness 自有 agent,并同时保留稳定兼容 ID 与英文显示名映射。
|
|
16
18
|
- Git 基线、脏工作区、外部修改、scope drift、merge conflict 与 verification evidence gap 全部由 Controller 的确定性状态机保护,不能被 Agent 自报绕过。
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
+
- 验证命令通过结构化 argv、`shell: false`、工作区包含校验、嵌套解释器/包管理器绕过检查和审批元数据约束执行,不接受 Agent 自报"已通过"替代命令证据。
|
|
20
|
+
- `resume` 会从 `.harness/runs/<run-id>/` 的快照与事件恢复上下文,不会重复已完成 Task 或丢失既有 evidence。
|
|
21
|
+
|
|
22
|
+
## 正常主链
|
|
23
|
+
|
|
24
|
+
需求从自然语言开始,经过结构化、规划、执行、验证、验收,最终生成报告:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
用户自然语言
|
|
28
|
+
|
|
|
29
|
+
v
|
|
30
|
+
Harness (primary)
|
|
31
|
+
|
|
|
32
|
+
v
|
|
33
|
+
Nuwa (Intake) ── 结构化 HarnessIntent;start 携带 Requirement
|
|
34
|
+
|
|
|
35
|
+
v
|
|
36
|
+
Fuxi (Planner) ── TaskGraph JSON
|
|
37
|
+
|
|
|
38
|
+
v
|
|
39
|
+
Luban (Worker) ── 在 allowedPaths 内实现任务
|
|
40
|
+
|
|
|
41
|
+
v
|
|
42
|
+
确定性验证 (Controller 执行命令)
|
|
43
|
+
|
|
|
44
|
+
v
|
|
45
|
+
Zhulong (Verifier) ── 依据 evidence 判定
|
|
46
|
+
|
|
|
47
|
+
v
|
|
48
|
+
Yinglong (Acceptance) ── 检查 requirement/task/evidence 闭环
|
|
49
|
+
|
|
|
50
|
+
v
|
|
51
|
+
最终报告 (final-report.md)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 失败修复链
|
|
55
|
+
|
|
56
|
+
当验证或验收失败时,进入归因与修复闭环:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
失败证据
|
|
60
|
+
|
|
|
61
|
+
v
|
|
62
|
+
Xingtian (Failure Analyzer) ── 分类根因,给出恢复建议
|
|
63
|
+
|
|
|
64
|
+
v (需要修复时)
|
|
65
|
+
Jingwei (Repair Worker) ── 生成受限 Repair Task,不直接改代码
|
|
66
|
+
|
|
|
67
|
+
v
|
|
68
|
+
Luban (Worker) ── 在受限范围内执行修复
|
|
69
|
+
|
|
|
70
|
+
v
|
|
71
|
+
重新验证 ──> Zhulong ──> Yinglong ──> 报告或再次归因
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
每个 Task 拥有有限 retry budget。预算耗尽后进入 `PAUSED` 或 `FAILED`,不会无限循环。
|
|
75
|
+
|
|
76
|
+
## Agent 总览表
|
|
77
|
+
|
|
78
|
+
| 英文名 | 中文名 | 稳定 ID | Session role | 写权限 | 主要产物 |
|
|
79
|
+
|---|---|---|---|---|---|
|
|
80
|
+
| Harness | 工程总控 | `harness` | primary | 无(只读呈现) | 用户交互摘要、运行状态展示 |
|
|
81
|
+
| Nuwa | 女娲,需求塑形智能体 | `harness-intake` | `intake` | 只读 | HarnessIntent JSON;start Requirement |
|
|
82
|
+
| Fuxi | 伏羲,规划编排智能体 | `harness-planner` | `planner` | 只读 | TaskGraph JSON |
|
|
83
|
+
| Luban | 鲁班,实现执行智能体 | `harness-worker` | `worker` | edit/write/patch/bash | WorkerOutput JSON、代码变更 |
|
|
84
|
+
| Zhulong | 烛龙,独立验证智能体 | `harness-verifier` | `verifier` | 只读 | VerifierOutput JSON |
|
|
85
|
+
| Yinglong | 应龙,最终验收智能体 | `harness-acceptance` | `acceptance` | 只读 | AcceptanceOutput JSON |
|
|
86
|
+
| Xingtian | 刑天,失败归因智能体 | `harness-failure-analyzer` | `failure-analyzer` | 只读 | FailureAnalyzerOutput JSON |
|
|
87
|
+
| Jingwei | 精卫,修复规划智能体 | `harness-repair-worker` | `repair-worker` | 只读 | RepairTask(结构化修复建议) |
|
|
88
|
+
|
|
89
|
+
只有 `Luban` 可以 edit/write/patch/bash。其他内部 Agent 全部只读。`Jingwei` 只生成 Repair Task,不直接修改代码。
|
|
90
|
+
|
|
91
|
+
## Agent 详细说明
|
|
92
|
+
|
|
93
|
+
### Harness(工程总控)
|
|
94
|
+
|
|
95
|
+
- **稳定 ID**:`harness`
|
|
96
|
+
- **Session role**:primary
|
|
97
|
+
- **定位**:用户与 Harness 控制平面之间的唯一交互界面。
|
|
98
|
+
- **主要职责**:接收自然语言生命周期请求,将后台协调结果整理为用户可读的总结。
|
|
99
|
+
- **输入**:用户在 OpenCode 中发送的自然语言请求;内部完成消息(带 `<!-- HARNESS_INTERNAL_RESULT -->` 标记的 synthetic result 是唯一权威完成结果)。
|
|
100
|
+
- **输出**:面向用户的运行状态、阻塞原因和下一步操作说明。
|
|
101
|
+
- **权限边界**:`task/edit/write/patch/bash` 全部禁用,不使用任何研究工具。不直接编辑文件、执行 shell、委派子 Agent 或声明未完成的任务已完成。
|
|
102
|
+
- **上下游关系**:接收用户请求后交给 Controller;Controller 完成后再将结果返回给 Harness 做最终总结。
|
|
103
|
+
|
|
104
|
+
### Nuwa(女娲,需求塑形智能体)
|
|
105
|
+
|
|
106
|
+
- **稳定 ID**:`harness-intake`
|
|
107
|
+
- **Session role**:`intake`
|
|
108
|
+
- **定位**:将自然语言请求整理为结构化生命周期意图。
|
|
109
|
+
- **主要职责**:识别 `start/status/pause/answer/resume/cancel/waive/report/clarification`;对于 `start`,提炼 title、summary、acceptanceCriteria 形成 Requirement 输入。发现阻塞性歧义时返回 clarification,不会猜测。
|
|
110
|
+
- **输入**:用户自然语言请求(通过 Controller 转发)。
|
|
111
|
+
- **输出**:HarnessIntent JSON;`start` intent 内包含结构化 Requirement 字段。
|
|
112
|
+
- **权限边界**:只读。`task/edit/write/patch/bash` 全部禁用,不调用任何工具。
|
|
113
|
+
- **上下游关系**:上游是 Harness primary;生命周期意图交给 Controller 执行,其中 `start` 的 Requirement 再传给 Fuxi 规划。
|
|
114
|
+
|
|
115
|
+
### Fuxi(伏羲,规划编排智能体)
|
|
116
|
+
|
|
117
|
+
- **稳定 ID**:`harness-planner`
|
|
118
|
+
- **Session role**:`planner`
|
|
119
|
+
- **定位**:根据 Requirement 生成可执行、可验证的 TaskGraph。
|
|
120
|
+
- **主要职责**:将 Requirement 拆解为有向无环 Task Graph,每个 Task 包含依赖、allowedPaths、verificationPlan、retryBudget 和 evidenceRefs。
|
|
121
|
+
- **输入**:Requirement JSON + runId。
|
|
122
|
+
- **输出**:TaskGraph JSON。
|
|
123
|
+
- **权限边界**:只读。可使用全部研究工具(Context7、grep.app、LSP),但不编辑文件、不执行 shell、不委派子 Agent。
|
|
124
|
+
- **上下游关系**:上游是 Nuwa,下游是 Luban。Controller 在接受 TaskGraph 前执行结构校验(ID 唯一、依赖存在、图无环、文件范围不冲突)。
|
|
125
|
+
|
|
126
|
+
### Luban(鲁班,实现执行智能体)
|
|
127
|
+
|
|
128
|
+
- **稳定 ID**:`harness-worker`
|
|
129
|
+
- **Session role**:`worker`
|
|
130
|
+
- **定位**:唯一被允许修改代码的 Harness Agent。
|
|
131
|
+
- **主要职责**:在 Task 指定的 `allowedPaths` 范围内实现代码变更,输出结构化 WorkerOutput。
|
|
132
|
+
- **输入**:Task JSON + Requirement JSON + allowedPaths。
|
|
133
|
+
- **输出**:WorkerOutput JSON(包含 summary、changedPaths、verificationCommands、evidence)。
|
|
134
|
+
- **权限边界**:`edit/write/patch/bash` 全部允许,`permission.edit=allow`,`permission.bash=allow`。可使用全部研究工具。必须严格遵守 allowedPaths,不得请求父会话完整历史。
|
|
135
|
+
- **上下游关系**:上游是 Fuxi(通过 Controller 分发 Task),下游是确定性验证和 Zhulong。修复链中,Jingwei 生成的 Repair Task 也交回 Luban 执行。
|
|
136
|
+
|
|
137
|
+
### Zhulong(烛龙,独立验证智能体)
|
|
138
|
+
|
|
139
|
+
- **稳定 ID**:`harness-verifier`
|
|
140
|
+
- **Session role**:`verifier`
|
|
141
|
+
- **定位**:独立于 Luban 的验证判定者,只依据任务与实际 evidence 判断。
|
|
142
|
+
- **主要职责**:审查 Controller 执行的确定性验证结果和 evidence,输出 passed、failed 或 evidence_gap 判定。
|
|
143
|
+
- **输入**:Task JSON + Requirement JSON + Evidence 列表。
|
|
144
|
+
- **输出**:VerifierOutput JSON(包含 status、summary、evidenceRefs、followUp)。
|
|
145
|
+
- **权限边界**:只读。`task/edit/write/patch/bash` 全部禁用。可使用全部研究工具辅助审查,但不执行修改、不执行 shell。
|
|
146
|
+
- **上下游关系**:上游是 Controller(传递 evidence),下游是 Yinglong(通过时)或 Xingtian(失败时)。Zhulong 不能修改代码。
|
|
147
|
+
|
|
148
|
+
### Yinglong(应龙,最终验收智能体)
|
|
149
|
+
|
|
150
|
+
- **稳定 ID**:`harness-acceptance`
|
|
151
|
+
- **Session role**:`acceptance`
|
|
152
|
+
- **定位**:检查需求、任务和 evidence 的闭环完整性。
|
|
153
|
+
- **主要职责**:验证每个需求和验收项是否都有对应 evidence 覆盖,输出 accepted、failed 或 evidence_gap 判定。
|
|
154
|
+
- **输入**:Task JSON + Requirement JSON + Evidence 列表。
|
|
155
|
+
- **输出**:AcceptanceOutput JSON(包含 status、summary、evidenceIds)。
|
|
156
|
+
- **权限边界**:只读。`task/edit/write/patch/bash` 全部禁用。可使用 grep.app 和 LSP 工具辅助审查,不使用 Context7。
|
|
157
|
+
- **上下游关系**:上游是 Zhulong(验证通过后进入验收),下游是 Controller(Controller 再执行确定性 Guard Condition 决定是否进入 COMPLETED)。Yinglong 不能修改代码。
|
|
158
|
+
|
|
159
|
+
### Xingtian(刑天,失败归因智能体)
|
|
160
|
+
|
|
161
|
+
- **稳定 ID**:`harness-failure-analyzer`
|
|
162
|
+
- **Session role**:`failure-analyzer`
|
|
163
|
+
- **定位**:根据实际失败证据分类根因并给出结构化恢复建议。
|
|
164
|
+
- **主要职责**:将失败分类为 `context-gap`、`requirement-ambiguity`、`dependency-blocked`、`implementation-defect`、`verification-environment`、`scope-drift`、`merge-conflict`、`model-failure`,并给出对应恢复动作。
|
|
165
|
+
- **输入**:Task JSON + Requirement JSON + Failure + Evidence 列表。
|
|
166
|
+
- **输出**:FailureAnalyzerOutput JSON(包含 action、category、summary、evidenceIds)。
|
|
167
|
+
- **权限边界**:只读。`task/edit/write/patch/bash` 全部禁用。可使用全部研究工具辅助归因,但不执行修改。
|
|
168
|
+
- **上下游关系**:上游是 Controller(传递失败证据),下游是 Jingwei(需要修复时)或 Controller(需要澄清、等待或终止时)。Xingtian 不能修改代码。
|
|
169
|
+
|
|
170
|
+
### Jingwei(精卫,修复规划智能体)
|
|
171
|
+
|
|
172
|
+
- **稳定 ID**:`harness-repair-worker`
|
|
173
|
+
- **Session role**:`repair-worker`
|
|
174
|
+
- **定位**:根据失败证据输出结构化修复建议,只建议,不直接修改代码。
|
|
175
|
+
- **主要职责**:分析失败原因和当前 Task 约束,生成受限的 RepairTask,包含修复步骤、影响范围和验证要求。
|
|
176
|
+
- **输入**:Task JSON + Requirement JSON + Failure + Evidence 列表 + allowedPaths + retryBudget。
|
|
177
|
+
- **输出**:RepairWorkerOutput JSON(包含 status、summary、repairTask、evidenceIds)。
|
|
178
|
+
- **权限边界**:只读。`task/edit/write/patch/bash` 全部禁用。可使用全部研究工具辅助分析,但明确禁止直接修改代码或调用写工具。
|
|
179
|
+
- **上下游关系**:上游是 Xingtian(通过 Controller 传递失败上下文),下游是 Luban(Controller 将 RepairTask 交给 Luban 在受限范围内执行)。Jingwei 不直接修改代码。
|
|
180
|
+
|
|
181
|
+
## 权限矩阵
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
Luban / harness-worker:
|
|
185
|
+
task=false, edit/write/patch/bash=true
|
|
186
|
+
permission.edit=allow, permission.bash=allow
|
|
187
|
+
|
|
188
|
+
其他全部 Harness agent:
|
|
189
|
+
task/edit/write/patch/bash=false
|
|
190
|
+
permission.edit=deny, permission.bash=deny
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
`harness` primary 同样只读,不使用任何研究工具。
|
|
19
194
|
|
|
20
195
|
## 内部工程工具
|
|
21
196
|
|
|
@@ -25,31 +200,142 @@ Harness 自研并注册以下只读工程工具,不依赖 OMO 或用户的 MCP
|
|
|
25
200
|
- `harness_grep_app_search`:通过自研 Streamable HTTP MCP 客户端调用 grep.app 官方 `searchGitHub`。
|
|
26
201
|
- `harness_lsp_status`、`harness_lsp_diagnostics`、`harness_lsp_definition`、`harness_lsp_references`:通过自研 JSON-RPC stdio 客户端访问 JDT LS 和 TypeScript Language Server。
|
|
27
202
|
|
|
28
|
-
|
|
203
|
+
这些工具在执行时边界校验 Agent 身份,普通 OpenCode Agent 无法调用。工具使用权限按角色分配:
|
|
204
|
+
|
|
205
|
+
- **全部研究工具**:Fuxi(Planner)、Luban(Worker)、Zhulong(Verifier)、Xingtian(Failure Analyzer)、Jingwei(Repair Worker)。
|
|
206
|
+
- **grep.app + LSP**:Yinglong(Acceptance)。
|
|
207
|
+
- **不使用研究工具**:Harness(primary)、Nuwa(Intake)。
|
|
208
|
+
|
|
209
|
+
LSP 只提供只读查询,不实现重命名或代码写入。JDT LS 数据目录位于系统临时目录,并在插件释放时清理。
|
|
210
|
+
|
|
211
|
+
Context7 默认匿名访问,可通过环境变量 `CONTEXT7_API_KEY` 提升限额。JDT LS 命令可通过 `HARNESS_JDTLS_COMMAND` 覆盖。
|
|
212
|
+
|
|
213
|
+
## 项目架构
|
|
214
|
+
|
|
215
|
+
本项目采用分层架构设计,主要包含以下核心模块:
|
|
216
|
+
|
|
217
|
+
### 配置层 (`src/config/`)
|
|
218
|
+
负责 Harness 配置的解析、验证和合并:
|
|
219
|
+
- `config-schema.ts`: 配置模式定义
|
|
220
|
+
- `config-errors.ts`: 配置错误处理
|
|
221
|
+
- `config-merge.ts`: 配置合并逻辑
|
|
222
|
+
- `load-harness-config.ts`: 配置加载器
|
|
223
|
+
|
|
224
|
+
### 控制器层 (`src/controller/`)
|
|
225
|
+
核心运行控制器,负责执行和协调整个工程流程:
|
|
226
|
+
- `run-controller.ts`: 主运行控制器
|
|
227
|
+
- `task-executor.ts`: 任务执行器
|
|
228
|
+
- `worktree-scheduler.ts`: 工作树调度器
|
|
229
|
+
- `failure-analysis.ts`: 失败分析
|
|
230
|
+
- `repair-loop.ts`: 修复循环
|
|
231
|
+
- `report-factory.ts`: 报告生成
|
|
232
|
+
|
|
233
|
+
### 领域层 (`src/domain/`)
|
|
234
|
+
定义核心领域模型:
|
|
235
|
+
- `run.ts`: 运行状态管理
|
|
236
|
+
- `task.ts`: 任务模型
|
|
237
|
+
- `requirement.ts`: 需求模型
|
|
238
|
+
- `evidence.ts`: 证据模型
|
|
239
|
+
- `failure.ts`: 失败模型
|
|
240
|
+
|
|
241
|
+
### 插件层 (`src/plugin/`)
|
|
242
|
+
OpenCode 插件集成:
|
|
243
|
+
- `create-harness-plugin.ts`: 插件入口
|
|
244
|
+
- `harness-coordinator.ts`: 协调器
|
|
245
|
+
- `harness-chat-hook.ts`: 聊天钩子
|
|
246
|
+
- `harness-intent.ts`: 意图解析
|
|
247
|
+
|
|
248
|
+
### 工具层 (`src/tools/`)
|
|
249
|
+
集成自研工程工具:
|
|
250
|
+
- `context7-client.ts`: Context7 官方 API 客户端
|
|
251
|
+
- `grep-app-client.ts`: grep.app 搜索客户端
|
|
252
|
+
- `lsp-client.ts`: LSP 客户端(JDT LS/TypeScript)
|
|
253
|
+
- `harness-research-tools.ts`: 研究工具统一接口
|
|
254
|
+
|
|
255
|
+
### 会话层 (`src/session/`)
|
|
256
|
+
会话管理适配器:
|
|
257
|
+
- `opencode-session-adapter.ts`: OpenCode 会话适配器
|
|
258
|
+
- `fake-session-adapter.ts`: 模拟会话适配器(测试用)
|
|
259
|
+
- `harness-agent-names.ts`: Agent 名称映射
|
|
260
|
+
|
|
261
|
+
### 存储层 (`src/store/`)
|
|
262
|
+
运行状态持久化:
|
|
263
|
+
- `filesystem-run-store.ts`: 文件系统存储实现
|
|
264
|
+
- `run-event.ts`: 运行事件模型
|
|
265
|
+
|
|
266
|
+
### 验证层 (`src/verification/`)
|
|
267
|
+
验证命令执行与策略:
|
|
268
|
+
- `command-policy.ts`: 命令策略检查
|
|
269
|
+
- `verification-runner.ts`: 验证运行器
|
|
270
|
+
- `node-process-runner.ts`: 进程执行器
|
|
271
|
+
|
|
272
|
+
### 工作区层 (`src/workspace/`)
|
|
273
|
+
Git 与工作区管理:
|
|
274
|
+
- `git-workspace-adapter.ts`: Git 工作区适配器
|
|
275
|
+
- `git-worktree-adapter.ts`: Git Worktree 管理
|
|
276
|
+
- `git-baseline.ts`: Git 基线捕获
|
|
277
|
+
|
|
278
|
+
## 功能特性
|
|
279
|
+
|
|
280
|
+
### Agent 生命周期管理
|
|
281
|
+
- 支持 `start`、`status`、`resume`、`pause`、`cancel`、`answer`、`waive`、`report` 操作
|
|
282
|
+
- 自然语言请求转换为严格 JSON intent
|
|
283
|
+
- 两阶段非阻塞流程:先受理确认,后台协调运行
|
|
284
|
+
|
|
285
|
+
### 内部 Agent 链
|
|
286
|
+
当前激活链:`Nuwa → Fuxi → Luban → deterministic verification → Zhulong → Yinglong`
|
|
287
|
+
|
|
288
|
+
失败处理:`Xingtian` 归因 → `Jingwei` 生成修复任务 → `Luban` 有限修复
|
|
289
|
+
|
|
290
|
+
### 只读工程工具
|
|
291
|
+
- **Context7**: 直连官方 HTTP API
|
|
292
|
+
- **grep.app**: 通过 Streamable HTTP MCP 客户端搜索
|
|
293
|
+
- **LSP**: 自研 JSON-RPC 客户端访问 JDT LS 和 TypeScript LS
|
|
294
|
+
|
|
295
|
+
### 确定性恢复
|
|
296
|
+
- 快照与事件持久化到 `.harness/runs/<run-id>/`
|
|
297
|
+
- 原子替换写入,追加持久化带幂等键
|
|
298
|
+
- 恢复时重放快照和事件
|
|
299
|
+
|
|
300
|
+
### 并行执行
|
|
301
|
+
- 依赖、路径范围和验证资源无冲突时启用
|
|
302
|
+
- 独立 git worktree 执行
|
|
303
|
+
- 冲突时保留诊断 worktree refs
|
|
304
|
+
|
|
305
|
+
## 快速开始
|
|
306
|
+
|
|
307
|
+
### 环境要求
|
|
308
|
+
|
|
309
|
+
- Node.js >= 18
|
|
310
|
+
- pnpm >= 8
|
|
311
|
+
- Git
|
|
312
|
+
|
|
313
|
+
### 安装依赖
|
|
29
314
|
|
|
30
|
-
|
|
315
|
+
```bash
|
|
316
|
+
pnpm install
|
|
317
|
+
```
|
|
31
318
|
|
|
32
|
-
|
|
319
|
+
### 构建插件
|
|
33
320
|
|
|
34
321
|
```bash
|
|
35
|
-
pnpm install
|
|
36
322
|
pnpm build
|
|
37
323
|
```
|
|
38
324
|
|
|
39
|
-
|
|
325
|
+
### 配置 OpenCode
|
|
326
|
+
|
|
327
|
+
OpenCode 会自动加载 `~/.config/opencode/plugins/` 下的插件。开发环境可创建符号链接或文件:
|
|
40
328
|
|
|
41
329
|
```typescript
|
|
42
330
|
// ~/.config/opencode/plugins/harness-engineering-agent.ts
|
|
43
|
-
export { server } from "/
|
|
331
|
+
export { server } from "/path/to/harness-engineering-agent/dist/index.js"
|
|
44
332
|
```
|
|
45
333
|
|
|
46
334
|
修改插件或配置后需要重新执行 `pnpm build`,并重启 OpenCode。
|
|
47
335
|
|
|
48
336
|
## 发布到 npm
|
|
49
337
|
|
|
50
|
-
交互式发布脚本会调用 npm 官方登录流程。用户名正常显示,密码由 npm
|
|
51
|
-
隐藏读取,不会作为命令参数、环境变量或脚本变量保存。账号启用 2FA 时,
|
|
52
|
-
npm 会继续提示输入 OTP。
|
|
338
|
+
交互式发布脚本会调用 npm 官方登录流程。用户名正常显示,密码由 npm 隐藏读取,不会作为命令参数、环境变量或脚本变量保存。账号启用 2FA 时,npm 会继续提示输入 OTP。
|
|
53
339
|
|
|
54
340
|
先执行不发布的完整检查:
|
|
55
341
|
|
|
@@ -63,8 +349,7 @@ pnpm publish:npm -- --dry-run
|
|
|
63
349
|
pnpm publish:npm
|
|
64
350
|
```
|
|
65
351
|
|
|
66
|
-
脚本依次执行登录、版本占用检查、类型检查、Lint
|
|
67
|
-
和发布确认。npm 不允许覆盖已有版本,后续发布前先升级版本:
|
|
352
|
+
脚本依次执行登录、版本占用检查、类型检查、Lint、测试、构建、打包预览和发布确认。npm 不允许覆盖已有版本,后续发布前先升级版本:
|
|
68
353
|
|
|
69
354
|
```bash
|
|
70
355
|
npm version patch --no-git-tag-version
|
|
@@ -76,21 +361,17 @@ npm registry 要求发布者启用双重验证。账号密码登录后先执行
|
|
|
76
361
|
npm profile enable-2fa auth-and-writes
|
|
77
362
|
```
|
|
78
363
|
|
|
79
|
-
重新运行 `pnpm publish:npm`,发布阶段按 npm 提示输入 OTP
|
|
80
|
-
在 npm 网站创建 granular access token,为目标包授予 `Read and write`
|
|
81
|
-
权限并启用 `Bypass 2FA`。运行脚本时隐藏输入 token:
|
|
364
|
+
重新运行 `pnpm publish:npm`,发布阶段按 npm 提示输入 OTP。另一种方式是在 npm 网站创建 granular access token,为目标包授予 `Read and write` 权限并启用 `Bypass 2FA`。运行脚本时隐藏输入 token:
|
|
82
365
|
|
|
83
366
|
```bash
|
|
84
367
|
pnpm publish:npm -- --token-auth
|
|
85
368
|
```
|
|
86
369
|
|
|
87
|
-
脚本将 token 临时写入权限为 `600` 的 npmrc,并仅通过
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
项目文件或日志。该参数不能绕过 npm registry 的服务端权限校验。
|
|
370
|
+
脚本将 token 临时写入权限为 `600` 的 npmrc,并仅通过 `NPM_CONFIG_USERCONFIG` 传给 npm 子进程。`pnpm test/build` 不会继承该认证文件。脚本结束后自动删除。token 不会写入命令参数、shell 历史、项目文件或日志。该参数不能绕过 npm registry 的服务端权限校验。
|
|
371
|
+
|
|
372
|
+
如果 token 曾经出现在日志、聊天或公开文件中,应立即在 npm 网站撤销并重新创建,不要继续使用泄露的 token。
|
|
91
373
|
|
|
92
|
-
|
|
93
|
-
重新创建,不要继续使用泄露的 token。
|
|
374
|
+
## OpenCode npm 引用
|
|
94
375
|
|
|
95
376
|
发布后在 `opencode.json` 中通过 npm 包名加载:
|
|
96
377
|
|
|
@@ -101,6 +382,9 @@ pnpm publish:npm -- --token-auth
|
|
|
101
382
|
}
|
|
102
383
|
```
|
|
103
384
|
|
|
385
|
+
OpenCode 会通过包的 `./server` 导出加载专用插件入口;根入口仍保留完整 SDK 导出,供其它
|
|
386
|
+
npm 调用方使用。
|
|
387
|
+
|
|
104
388
|
## 项目配置
|
|
105
389
|
|
|
106
390
|
在目标项目创建 `.harness/config.yaml`:
|
|
@@ -130,56 +414,146 @@ maxRunAttempts: 3
|
|
|
130
414
|
stateDirectory: .harness/runs
|
|
131
415
|
```
|
|
132
416
|
|
|
133
|
-
`harness` profile 只用于专用 `harness` Agent 和内部 Intake Session
|
|
417
|
+
`harness` profile 只用于专用 `harness` Agent 和内部 Intake Session。不要在这里重新引入 `maxSteps` 等 OpenCode Agent 运行时字段。
|
|
418
|
+
|
|
419
|
+
**Profile 继承规则**:
|
|
420
|
+
- `acceptance` 缺省继承 `verifier` 的 provider/model。
|
|
421
|
+
- `failureAnalyzer` 缺省继承 `planner` 的 provider/model。
|
|
422
|
+
- `repair-worker`(Jingwei)当前复用 `worker` profile,而不是单独配置项。
|
|
423
|
+
- 三者都参与实际控制链,不是预留配置。
|
|
424
|
+
|
|
425
|
+
配置优先级:插件默认值 < 用户全局配置 < 项目 `.harness/config.yaml` < 当前 Run 覆盖。
|
|
426
|
+
|
|
427
|
+
## 使用指南
|
|
428
|
+
|
|
429
|
+
### 启动运行
|
|
430
|
+
|
|
431
|
+
1. 在 OpenCode 中选择 primary `harness` Agent
|
|
432
|
+
2. 发送自然语言请求,例如:"启动一个 run,目标是实现用户登录功能"
|
|
433
|
+
|
|
434
|
+
使用要点:
|
|
435
|
+
- `start` 请求必须能被 Intake 提炼成 title、summary、acceptanceCriteria。如果缺少必要信息,Harness 会返回 clarification 响应而不是猜测。
|
|
436
|
+
- `status`、`resume`、`cancel`、`report` 必须显式提供 `runId`。Harness 不会默认选择"最近一次运行"。
|
|
134
437
|
|
|
135
|
-
|
|
438
|
+
### 基本操作
|
|
136
439
|
|
|
137
|
-
|
|
440
|
+
| 操作 | 说明 | 必填参数 |
|
|
441
|
+
|------|------|----------|
|
|
442
|
+
| `start` | 启动新运行 | title, summary, acceptanceCriteria |
|
|
443
|
+
| `status` | 查询状态 | runId |
|
|
444
|
+
| `resume` | 恢复运行 | runId |
|
|
445
|
+
| `pause` | 暂停运行 | runId |
|
|
446
|
+
| `cancel` | 取消运行 | runId |
|
|
447
|
+
| `report` | 生成报告 | runId |
|
|
448
|
+
| `answer` | 回答问题 | runId |
|
|
449
|
+
| `waive` | 放弃要求 | runId, requirementId |
|
|
138
450
|
|
|
139
|
-
|
|
451
|
+
### 恢复运行
|
|
140
452
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
4. `status`、`resume`、`cancel`、`report` 必须显式提供 `runId`;Harness 不会默认选择“最近一次运行”。
|
|
453
|
+
```bash
|
|
454
|
+
resume run-abc
|
|
455
|
+
```
|
|
145
456
|
|
|
146
|
-
|
|
457
|
+
将从 `.harness/runs/run-abc/` 快照恢复上下文。
|
|
147
458
|
|
|
148
|
-
|
|
459
|
+
## 验证策略
|
|
149
460
|
|
|
150
|
-
|
|
151
|
-
-
|
|
461
|
+
验证命令执行受严格策略约束:
|
|
462
|
+
- 必须使用结构化 argv
|
|
463
|
+
- `shell: false` 执行
|
|
464
|
+
- 工作区包含校验
|
|
465
|
+
- 嵌套解释器/包管理器绕过检查
|
|
466
|
+
- 审批元数据约束
|
|
152
467
|
|
|
153
|
-
|
|
468
|
+
不允许 Agent 自报"已通过"替代命令证据。
|
|
154
469
|
|
|
155
|
-
|
|
156
|
-
- `planner -> Fuxi`(兼容 ID:`harness-planner`)
|
|
157
|
-
- `worker -> Luban`(兼容 ID:`harness-worker`)
|
|
158
|
-
- `verifier -> Zhulong`(兼容 ID:`harness-verifier`)
|
|
159
|
-
- `acceptance -> Yinglong`(兼容 ID:`harness-acceptance`)
|
|
160
|
-
- `failure-analyzer -> Xingtian`(兼容 ID:`harness-failure-analyzer`)
|
|
161
|
-
- `repair-worker -> Jingwei`(兼容 ID:`harness-repair-worker`)
|
|
470
|
+
## 测试
|
|
162
471
|
|
|
163
|
-
|
|
472
|
+
```bash
|
|
473
|
+
# 运行所有测试
|
|
474
|
+
pnpm test
|
|
164
475
|
|
|
165
|
-
|
|
166
|
-
|
|
476
|
+
# 运行单元测试
|
|
477
|
+
pnpm test:unit
|
|
167
478
|
|
|
168
|
-
|
|
479
|
+
# 运行集成测试
|
|
480
|
+
pnpm test:integration
|
|
169
481
|
|
|
170
|
-
|
|
482
|
+
# 运行 E2E 测试
|
|
483
|
+
pnpm test:e2e
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
## 项目结构
|
|
487
|
+
|
|
488
|
+
```
|
|
489
|
+
harness-engineering-agent/
|
|
490
|
+
├── src/
|
|
491
|
+
│ ├── config/ # 配置管理
|
|
492
|
+
│ ├── controller/ # 核心控制器
|
|
493
|
+
│ ├── domain/ # 领域模型
|
|
494
|
+
│ ├── plugin/ # 插件集成
|
|
495
|
+
│ ├── session/ # 会话管理
|
|
496
|
+
│ ├── store/ # 状态存储
|
|
497
|
+
│ ├── tools/ # 工程工具
|
|
498
|
+
│ ├── verification/ # 验证执行
|
|
499
|
+
│ ├── workspace/ # 工作区管理
|
|
500
|
+
│ └── index.ts # 入口文件
|
|
501
|
+
├── tests/ # 测试用例
|
|
502
|
+
│ ├── config/
|
|
503
|
+
│ ├── controller/
|
|
504
|
+
│ ├── domain/
|
|
505
|
+
│ ├── e2e/
|
|
506
|
+
│ ├── integration/
|
|
507
|
+
│ ├── plugin/
|
|
508
|
+
│ ├── session/
|
|
509
|
+
│ ├── store/
|
|
510
|
+
│ ├── tools/
|
|
511
|
+
│ ├── verification/
|
|
512
|
+
│ └── workspace/
|
|
513
|
+
├── harness/ # 设计文档
|
|
514
|
+
├── package.json
|
|
515
|
+
├── tsconfig.json
|
|
516
|
+
└── biome.json
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
## 环境变量
|
|
520
|
+
|
|
521
|
+
| 变量 | 说明 | 默认值 |
|
|
522
|
+
|------|------|--------|
|
|
523
|
+
| `CONTEXT7_API_KEY` | Context7 API Key | 匿名访问 |
|
|
524
|
+
| `HARNESS_JDTLS_COMMAND` | JDT LS 命令覆盖 | 自动检测 |
|
|
525
|
+
|
|
526
|
+
## 状态恢复与证据
|
|
171
527
|
|
|
172
528
|
- `.harness/runs/<run-id>/state.json` 使用原子替换写入,`events.jsonl` 追加持久化并带稳定幂等键。
|
|
173
|
-
- `FilesystemRunStore`
|
|
529
|
+
- `FilesystemRunStore` 在读取时重放快照后的事件,并拒绝未知 major schema version。
|
|
174
530
|
- Evidence Ledger 记录 requirement、acceptance criterion、task、changed paths、verification command、输出摘要 digest 和 redaction metadata。
|
|
175
|
-
- Bug 修复与 `repairEnabled` Task 要求 RED/GREEN/REFACTOR 三阶段 evidence
|
|
176
|
-
-
|
|
531
|
+
- Bug 修复与 `repairEnabled` Task 要求 RED/GREEN/REFACTOR 三阶段 evidence。Design Bundle 场景要求 requirement / acceptance / tasks / evidence / report 结构可追踪。
|
|
532
|
+
- 最终报告汇总 `traceability`、`unfinishedTasks`、`verificationSummaries`、`failures`、`evidenceGaps` 和 `residualRisks`,不会因为 run 结束就抹平历史失败记录。
|
|
177
533
|
|
|
178
|
-
##
|
|
534
|
+
## 目录结构
|
|
535
|
+
|
|
536
|
+
```
|
|
537
|
+
.harness/
|
|
538
|
+
config.yaml # 项目级 Harness 配置
|
|
539
|
+
runs/<run-id>/
|
|
540
|
+
requirement.json # 结构化需求
|
|
541
|
+
state.json # 完整 Run 状态快照(含需求、任务、Agent 结果、失败和 evidence)
|
|
542
|
+
events.jsonl # 不可变事件日志(追加)
|
|
543
|
+
```
|
|
179
544
|
|
|
180
|
-
-
|
|
181
|
-
|
|
182
|
-
|
|
545
|
+
`state.json` 使用临时文件校验后原子替换,`events.jsonl` 使用稳定幂等键追加。`report` 操作根据当前 Run 生成结构化报告并返回给用户;当前实现不自动写入 `final-report.md`。目标项目应将配置的运行状态目录(默认 `.harness/runs/`)和临时 worktree 元数据加入自身 `.gitignore`。
|
|
546
|
+
|
|
547
|
+
## 验证命令
|
|
548
|
+
|
|
549
|
+
当前项目验证命令:
|
|
550
|
+
|
|
551
|
+
```bash
|
|
552
|
+
pnpm typecheck # 类型检查
|
|
553
|
+
pnpm lint # Biome lint
|
|
554
|
+
pnpm test # Vitest 测试(当前 176 个测试全部通过,单 worker 模式)
|
|
555
|
+
pnpm build # 构建
|
|
556
|
+
```
|
|
183
557
|
|
|
184
558
|
## 设计文档
|
|
185
559
|
|
|
@@ -187,5 +561,8 @@ stateDirectory: .harness/runs
|
|
|
187
561
|
- [总体架构](harness/architecture.md)
|
|
188
562
|
- [实施计划](harness/implementation-plan.md)
|
|
189
563
|
- [能力规格](harness/specs/)
|
|
564
|
+
- [架构决策记录](harness/adr/)
|
|
565
|
+
|
|
566
|
+
## 许可证
|
|
190
567
|
|
|
191
|
-
|
|
568
|
+
本项目采用 [MIT License](LICENSE) 开源协议。
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|