coding-agent-harness 1.0.4 → 1.0.5
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/CHANGELOG.md +7 -0
- package/LICENSE +661 -21
- package/LICENSE-EXCEPTION.md +37 -0
- package/README.md +33 -1
- package/README.zh-CN.md +23 -1
- package/SKILL.md +9 -8
- package/docs-release/architecture/overview.md +1 -1
- package/docs-release/architecture/overview.zh-CN.md +1 -1
- package/docs-release/architecture/system-explainer/01-system-overview.md +217 -0
- package/docs-release/architecture/system-explainer/02-module-dependency.md +257 -0
- package/docs-release/architecture/system-explainer/03-task-lifecycle.md +304 -0
- package/docs-release/architecture/system-explainer/04-check-and-governance.md +239 -0
- package/docs-release/architecture/system-explainer/05-data-flow.md +276 -0
- package/docs-release/architecture/system-explainer/06-preset-and-migration.md +303 -0
- package/docs-release/architecture/system-explainer/README.md +67 -0
- package/docs-release/architecture/system-explainer/en-US/01-system-overview.md +226 -0
- package/docs-release/architecture/system-explainer/en-US/02-module-dependency.md +263 -0
- package/docs-release/architecture/system-explainer/en-US/03-task-lifecycle.md +319 -0
- package/docs-release/architecture/system-explainer/en-US/04-check-and-governance.md +250 -0
- package/docs-release/architecture/system-explainer/en-US/05-data-flow.md +290 -0
- package/docs-release/architecture/system-explainer/en-US/06-preset-and-migration.md +323 -0
- package/docs-release/architecture/system-explainer/en-US/README.md +70 -0
- package/docs-release/guides/agent-installation.en-US.md +8 -7
- package/docs-release/guides/agent-installation.md +9 -7
- package/docs-release/guides/preset-development.md +26 -2
- package/docs-release/guides/task-state-machine.en-US.md +30 -13
- package/docs-release/guides/task-state-machine.md +30 -13
- package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/INDEX.md +60 -0
- package/package.json +3 -2
- package/references/harness-ledger.md +1 -1
- package/scripts/commands/migration-command.mjs +30 -0
- package/scripts/commands/task-command.mjs +26 -25
- package/scripts/harness.mjs +7 -3
- package/scripts/lib/capability-registry.mjs +17 -21
- package/scripts/lib/check-module-parallel.mjs +9 -16
- package/scripts/lib/check-profiles.mjs +35 -81
- package/scripts/lib/check-task-contracts.mjs +13 -5
- package/scripts/lib/core-shared.mjs +55 -2
- package/scripts/lib/dashboard-data.mjs +126 -18
- package/scripts/lib/dashboard-workbench.mjs +80 -1
- package/scripts/lib/dashboard-writer.mjs +6 -2
- package/scripts/lib/git-status-summary.mjs +1 -1
- package/scripts/lib/governance-sync.mjs +180 -83
- package/scripts/lib/harness-core.mjs +1 -0
- package/scripts/lib/markdown-utils.mjs +33 -0
- package/scripts/lib/migration-planner.mjs +4 -6
- package/scripts/lib/phase-kind.mjs +50 -0
- package/scripts/lib/preset-engine.mjs +5 -8
- package/scripts/lib/preset-registry.mjs +188 -39
- package/scripts/lib/review-confirm-git-gate.mjs +1 -1
- package/scripts/lib/status-builder.mjs +88 -0
- package/scripts/lib/status-dashboard-renderer.mjs +7 -4
- package/scripts/lib/task-audit-metadata.mjs +385 -0
- package/scripts/lib/task-audit-migration.mjs +350 -0
- package/scripts/lib/task-completion-consistency.mjs +11 -1
- package/scripts/lib/task-lifecycle/create-task-helpers.mjs +67 -0
- package/scripts/lib/task-lifecycle/phase-sync.mjs +88 -0
- package/scripts/lib/task-lifecycle/review-confirm.mjs +40 -29
- package/scripts/lib/task-lifecycle/review-gates.mjs +13 -10
- package/scripts/lib/task-lifecycle/review-submission.mjs +63 -0
- package/scripts/lib/task-lifecycle/scaffold-provenance.mjs +49 -0
- package/scripts/lib/task-lifecycle/template-files.mjs +53 -0
- package/scripts/lib/task-lifecycle.mjs +114 -147
- package/scripts/lib/task-metadata.mjs +118 -0
- package/scripts/lib/task-review-model.mjs +54 -68
- package/scripts/lib/task-scanner.mjs +70 -143
- package/skills/preset-creator/references/complex-task-skeleton/brief.md +11 -0
- package/templates/AGENTS.md.template +7 -5
- package/templates/dashboard/assets/app-src/00-state.js +12 -0
- package/templates/dashboard/assets/app-src/10-router.js +3 -0
- package/templates/dashboard/assets/app-src/20-overview.js +7 -3
- package/templates/dashboard/assets/app-src/35-task-detail.js +46 -6
- package/templates/dashboard/assets/app-src/55-presets.js +375 -0
- package/templates/dashboard/assets/app-src/60-shared.js +3 -1
- package/templates/dashboard/assets/app-src/90-bindings.js +131 -0
- package/templates/dashboard/assets/app.css +583 -0
- package/templates/dashboard/assets/app.css.manifest.json +1 -0
- package/templates/dashboard/assets/app.js +578 -10
- package/templates/dashboard/assets/app.manifest.json +1 -0
- package/templates/dashboard/assets/css-src/00-foundation.css +4 -0
- package/templates/dashboard/assets/css-src/40-detail-modules-migration.css +62 -0
- package/templates/dashboard/assets/css-src/45-presets.css +516 -0
- package/templates/dashboard/assets/i18n.js +140 -2
- package/templates/planning/INDEX.md +87 -0
- package/templates/planning/brief.md +1 -1
- package/templates/planning/module_session_prompt.md +1 -0
- package/templates/planning/review.md +0 -18
- package/templates/planning/task_plan.md +4 -43
- package/templates/planning/visual_map.md +13 -9
- package/templates/planning/visual_map.simple.md +52 -0
- package/templates/reference/execution-workflow-standard.md +29 -2
- package/templates-zh-CN/AGENTS.md.template +7 -5
- package/templates-zh-CN/planning/INDEX.md +87 -0
- package/templates-zh-CN/planning/brief.md +1 -1
- package/templates-zh-CN/planning/module_session_prompt.md +1 -0
- package/templates-zh-CN/planning/review.md +0 -18
- package/templates-zh-CN/planning/task_plan.md +3 -63
- package/templates-zh-CN/planning/visual_map.md +14 -7
- package/templates-zh-CN/planning/visual_map.simple.md +48 -0
- package/templates-zh-CN/reference/execution-workflow-standard.md +31 -6
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Additional Permission for Generated Harness Materials
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ZeyuLi (FairladyZ)
|
|
4
|
+
|
|
5
|
+
Coding Agent Harness is licensed under the GNU Affero General Public License
|
|
6
|
+
version 3 or any later version (`AGPL-3.0-or-later`). This file grants an
|
|
7
|
+
additional permission under section 7 of the AGPL.
|
|
8
|
+
|
|
9
|
+
## Generated Harness Materials
|
|
10
|
+
|
|
11
|
+
For the purposes of this permission, "Generated Harness Materials" means files
|
|
12
|
+
created, copied, rendered, scaffolded, or installed into a target project by
|
|
13
|
+
Coding Agent Harness from bundled or user-provided templates, presets, skills,
|
|
14
|
+
reference packs, examples, or documentation skeletons. This includes generated
|
|
15
|
+
or installed project governance files such as `AGENTS.md`, `CLAUDE.md`, task
|
|
16
|
+
plans, review files, ledgers, walkthroughs, generated dashboard data, and other
|
|
17
|
+
target-project harness documents.
|
|
18
|
+
|
|
19
|
+
## Permission
|
|
20
|
+
|
|
21
|
+
You may use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
22
|
+
Generated Harness Materials under the license terms of the target project or
|
|
23
|
+
under any other terms chosen by that target project's copyright holder.
|
|
24
|
+
|
|
25
|
+
The AGPL does not apply to a target project, to that target project's source
|
|
26
|
+
code, or to Generated Harness Materials solely because Coding Agent Harness was
|
|
27
|
+
used to create, copy, render, scaffold, install, or update those materials.
|
|
28
|
+
|
|
29
|
+
## Limits
|
|
30
|
+
|
|
31
|
+
This additional permission does not apply to Coding Agent Harness itself,
|
|
32
|
+
including its CLI/runtime source code, dashboard implementation, package source,
|
|
33
|
+
or the bundled templates, presets, skills, reference packs, examples, and
|
|
34
|
+
documentation as distributed in this repository or package.
|
|
35
|
+
|
|
36
|
+
This permission does not grant trademark rights or remove any third-party
|
|
37
|
+
license obligations that may apply independently.
|
package/README.md
CHANGED
|
@@ -67,6 +67,26 @@ Harness covers the continuity layer of real development: task lifecycle, Brief,
|
|
|
67
67
|
|
|
68
68
|
It gives each agent step context, evidence, and a finish condition.
|
|
69
69
|
|
|
70
|
+
### Reusable Presets For Task Families
|
|
71
|
+
|
|
72
|
+
A preset is a versioned, declarative task method package. It does not install a
|
|
73
|
+
new agent and it does not replace the Harness. It tells `harness new-task` how
|
|
74
|
+
to create a task for a repeatable work type: what task kind to set, which inputs
|
|
75
|
+
to ask for, which shared references or artifacts to copy into the task, which
|
|
76
|
+
files the agent must read first, and what audit/evidence files should prove the
|
|
77
|
+
task was created correctly.
|
|
78
|
+
|
|
79
|
+
Use presets when a group of tasks share the same setup. For example, several
|
|
80
|
+
interface tasks may all depend on the same upstream microservice contract,
|
|
81
|
+
fixture packet, runbook, and verification checklist. Instead of repeating that
|
|
82
|
+
context in every prompt, put it in a preset and create each task with
|
|
83
|
+
`harness new-task --preset <preset-id> ...`.
|
|
84
|
+
|
|
85
|
+
Harness ships bundled presets, `harness init` seeds them into the target project,
|
|
86
|
+
and teams can add project-local presets under `.coding-agent-harness/presets/`.
|
|
87
|
+
The `preset-creator` Skill is for authoring these preset packages; the Harness
|
|
88
|
+
CLI is what checks, installs, lists, and applies them.
|
|
89
|
+
|
|
70
90
|
### Safe Migration For Existing Projects
|
|
71
91
|
|
|
72
92
|
Legacy project migration starts with a scan, a migration plan, a recommended migration mode, and user confirmation. Only then should the agent write files. Final status is proven with a dashboard and checks.
|
|
@@ -157,6 +177,10 @@ Start the local dynamic Workbench:
|
|
|
157
177
|
npx --yes coding-agent-harness dev .
|
|
158
178
|
```
|
|
159
179
|
|
|
180
|
+
The Workbench includes a Presets view for checking, installing, seeding, and
|
|
181
|
+
uninstalling project or user presets. Static dashboards show the same preset
|
|
182
|
+
catalog as read-only evidence.
|
|
183
|
+
|
|
160
184
|
Generate a static Dashboard that can be opened offline:
|
|
161
185
|
|
|
162
186
|
```bash
|
|
@@ -281,6 +305,8 @@ When done, summarize what changed, list verification results, call out any skipp
|
|
|
281
305
|
- Legacy migration playbook: [`docs-release/guides/migration-playbook.en-US.md`](docs-release/guides/migration-playbook.en-US.md)
|
|
282
306
|
- Full legacy migration strategy: [`docs-release/guides/full-legacy-migration-subagent-strategy.md`](docs-release/guides/full-legacy-migration-subagent-strategy.md)
|
|
283
307
|
- Architecture overview: [`docs-release/architecture/overview.md`](docs-release/architecture/overview.md)
|
|
308
|
+
- Deep architecture explainer (zh-CN): [`docs-release/architecture/system-explainer/`](docs-release/architecture/system-explainer/) — system design, module dependencies, task lifecycle, check system, data flow, and preset/migration engine with design rationale
|
|
309
|
+
- Deep architecture explainer (en-US): [`docs-release/architecture/system-explainer/en-US/`](docs-release/architecture/system-explainer/en-US/)
|
|
284
310
|
|
|
285
311
|
## Star History
|
|
286
312
|
|
|
@@ -288,4 +314,10 @@ When done, summarize what changed, list verification results, call out any skipp
|
|
|
288
314
|
|
|
289
315
|
## License
|
|
290
316
|
|
|
291
|
-
|
|
317
|
+
AGPL-3.0-or-later with an additional permission for Generated Harness
|
|
318
|
+
Materials.
|
|
319
|
+
|
|
320
|
+
See [`LICENSE`](LICENSE) and [`LICENSE-EXCEPTION.md`](LICENSE-EXCEPTION.md).
|
|
321
|
+
The additional permission keeps files generated or installed into a target
|
|
322
|
+
project from becoming AGPL-covered solely because Coding Agent Harness created
|
|
323
|
+
or updated them.
|
package/README.zh-CN.md
CHANGED
|
@@ -67,6 +67,22 @@ Harness 覆盖长程开发里的持续性问题:任务生命周期、Brief、E
|
|
|
67
67
|
|
|
68
68
|
它让 Agent 每一步都有上下文、证据和收口标准。
|
|
69
69
|
|
|
70
|
+
### 面向任务族的可复用 Preset
|
|
71
|
+
|
|
72
|
+
Preset 是一个可版本化、声明式的任务方法包。它不是安装一个新 Agent,也不是替代
|
|
73
|
+
Harness;它告诉 `harness new-task` 如何为某一类可重复工作创建任务:应该设置什么
|
|
74
|
+
Task Kind、需要询问哪些输入、要把哪些共享 Reference 或 Artifact 复制进任务、Agent
|
|
75
|
+
必须先读哪些文件,以及要生成哪些 audit / evidence 文件来证明任务创建正确。
|
|
76
|
+
|
|
77
|
+
当一组任务共享同一套启动上下文时,就适合用 Preset。比如多个接口任务都依赖同一个
|
|
78
|
+
上游微服务 contract、fixture packet、runbook 和验证清单,就不应该每次都把这些内容塞进
|
|
79
|
+
prompt;应该把它们放进 Preset,然后用
|
|
80
|
+
`harness new-task --preset <preset-id> ...` 创建每个任务。
|
|
81
|
+
|
|
82
|
+
Harness 自带内置 Preset,`harness init` 会把它们 seed 到目标项目,团队也可以在
|
|
83
|
+
`.coding-agent-harness/presets/` 下维护项目级 Preset。`preset-creator` Skill 用来制作
|
|
84
|
+
这些 Preset 包;真正检查、安装、列出和应用 Preset 的是 Harness CLI。
|
|
85
|
+
|
|
70
86
|
### 旧项目也能迁移
|
|
71
87
|
|
|
72
88
|
旧项目迁移不是直接套模板。标准流程是:先扫描项目,生成迁移计划,推荐迁移模式,向用户提问确认,再执行迁移,最后用 Dashboard 和检查结果证明迁移状态。
|
|
@@ -280,6 +296,8 @@ npx --yes coding-agent-harness migrate-plan --json --limit 1000 .
|
|
|
280
296
|
- 旧项目迁移指南:[`docs-release/guides/migration-playbook.md`](docs-release/guides/migration-playbook.md)
|
|
281
297
|
- 完整旧项目迁移策略:[`docs-release/guides/full-legacy-migration-subagent-strategy.zh-CN.md`](docs-release/guides/full-legacy-migration-subagent-strategy.zh-CN.md)
|
|
282
298
|
- 架构说明:[`docs-release/architecture/overview.md`](docs-release/architecture/overview.md)
|
|
299
|
+
- 深度架构解析(中文):[`docs-release/architecture/system-explainer/`](docs-release/architecture/system-explainer/) — 系统设计、模块依赖、任务生命周期、检查体系、数据流、Preset 与迁移引擎,含设计决策背景
|
|
300
|
+
- Deep architecture explainer (en-US): [`docs-release/architecture/system-explainer/en-US/`](docs-release/architecture/system-explainer/en-US/)
|
|
283
301
|
|
|
284
302
|
## Star History
|
|
285
303
|
|
|
@@ -287,4 +305,8 @@ npx --yes coding-agent-harness migrate-plan --json --limit 1000 .
|
|
|
287
305
|
|
|
288
306
|
## License
|
|
289
307
|
|
|
290
|
-
|
|
308
|
+
AGPL-3.0-or-later,并附带 Generated Harness Materials 额外许可。
|
|
309
|
+
|
|
310
|
+
详见 [`LICENSE`](LICENSE) 和 [`LICENSE-EXCEPTION.md`](LICENSE-EXCEPTION.md)。
|
|
311
|
+
该额外许可确保 Harness 生成或安装到目标项目里的文件,不会仅仅因为由
|
|
312
|
+
Coding Agent Harness 创建或更新,就自动变成 AGPL 覆盖范围。
|
package/SKILL.md
CHANGED
|
@@ -152,20 +152,21 @@ Project、Verify、Residual。`external-source-packs/` 只保存资料索引、
|
|
|
152
152
|
初始化或迁移完成后,活跃任务必须通过 CLI 创建和推进,避免 agent 手工复制模板造成漂移:
|
|
153
153
|
|
|
154
154
|
```bash
|
|
155
|
-
harness new-task
|
|
156
|
-
harness task-start <task-id> --message "<what started>" /path/to/project
|
|
157
|
-
harness task-log <task-id> --message "<what changed>" --evidence "command:TARGET:path:summary" /path/to/project
|
|
158
|
-
harness task-block <task-id> --message "<blocker>" /path/to/project
|
|
159
|
-
harness task-review <task-id> --message "<ready for review>" /path/to/project
|
|
160
|
-
harness review-confirm <task-id> --message "<human confirmation>" /path/to/project
|
|
161
|
-
harness task-complete <task-id> --message "<closeout>" /path/to/project
|
|
162
|
-
harness lesson-promote <task-id> <candidate-id> --dry-run /path/to/project
|
|
155
|
+
harness new-task --title "<title>" --locale zh-CN|en-US /path/to/project
|
|
156
|
+
harness task-start <task-id-from-new-task-output> --message "<what started>" /path/to/project
|
|
157
|
+
harness task-log <task-id-from-new-task-output> --message "<what changed>" --evidence "command:TARGET:path:summary" /path/to/project
|
|
158
|
+
harness task-block <task-id-from-new-task-output> --message "<blocker>" /path/to/project
|
|
159
|
+
harness task-review <task-id-from-new-task-output> --message "<ready for review>" /path/to/project
|
|
160
|
+
harness review-confirm <task-id-from-new-task-output> --confirm <task-id-from-new-task-output> --message "<human confirmation>" /path/to/project
|
|
161
|
+
harness task-complete <task-id-from-new-task-output> --message "<closeout>" /path/to/project
|
|
162
|
+
harness lesson-promote <task-id-from-new-task-output> <candidate-id> --dry-run /path/to/project
|
|
163
163
|
harness task-list --json /path/to/project
|
|
164
164
|
```
|
|
165
165
|
|
|
166
166
|
- `new-task --budget simple` 创建轻量任务目录:`brief.md`、`task_plan.md`、`visual_map.md`、`progress.md`。
|
|
167
167
|
- `new-task` 默认 `standard`,创建完整任务目录,包括 `brief.md`、计划、策略、路线图、进度、发现和审查文件。
|
|
168
168
|
- `new-task --budget complex` 在完整任务文件之外创建 optional references/artifacts 索引。
|
|
169
|
+
- `new-task --title "<title>"` 默认生成 `YYYY-MM-DD-<title-slug>-<8hex>` 任务 ID,降低多人和多 agent 同仓创建任务时的重名概率;只有 coordinator 需要固定兼容 ID 时才传显式 `<task-id>`。
|
|
169
170
|
- 已存在任务不会被覆盖;旧项目迁移时先 `task-list --json`,再决定复用旧任务还是开新任务。
|
|
170
171
|
- 状态推进只写 `progress.md`,不得重写历史 `task_plan.md`。
|
|
171
172
|
- `simple` 任务可以直接 `in_progress -> done`;`standard` / `complex` 必须 `in_progress -> review -> done`,不能跳过 `task-review`。
|
|
@@ -225,7 +225,7 @@ confirmation. Tasks with missing packets, incomplete evidence, lesson-routing
|
|
|
225
225
|
work, blocking findings, or historical closeout debt are routed to separate
|
|
226
226
|
lifecycle queues: Missing Materials, Blocked, Lessons, Confirmed / Finalized,
|
|
227
227
|
and Soft-deleted / Superseded. Agent-authored submissions can request review,
|
|
228
|
-
but only
|
|
228
|
+
but only committed Task Audit Metadata in `INDEX.md` marks the task as
|
|
229
229
|
`confirmed`.
|
|
230
230
|
|
|
231
231
|
## Migration Rails
|
|
@@ -202,7 +202,7 @@ flowchart TB
|
|
|
202
202
|
|
|
203
203
|
standard 和 complex 任务必须具备进度、证据、lesson 决议、人工确认和收口链接,才会被视为真正关闭。
|
|
204
204
|
|
|
205
|
-
Review 队列只展示已经提交审查材料包、并且可以等待人工确认的任务。缺少审查提交、证据不完整、仍有 Lesson 路由、存在阻塞发现,或历史收口债务的任务,会进入独立的生命周期队列:Missing Materials、Blocked、Lessons、Confirmed / Finalized、Soft-deleted / Superseded。Agent
|
|
205
|
+
Review 队列只展示已经提交审查材料包、并且可以等待人工确认的任务。缺少审查提交、证据不完整、仍有 Lesson 路由、存在阻塞发现,或历史收口债务的任务,会进入独立的生命周期队列:Missing Materials、Blocked、Lessons、Confirmed / Finalized、Soft-deleted / Superseded。Agent 写入的提交只能请求审查;只有 `INDEX.md` 中已提交的 Task Audit Metadata 才能把任务标记为 `confirmed`。
|
|
206
206
|
|
|
207
207
|
## 迁移轨道
|
|
208
208
|
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# 01 — 系统全景
|
|
2
|
+
|
|
3
|
+
## 这是什么,解决什么问题
|
|
4
|
+
|
|
5
|
+
在 AI 编程工具(Codex、Claude Code、Gemini CLI)普及之前,
|
|
6
|
+
"任务管理"对开发者来说意味着 Jira ticket 或 GitHub issue——
|
|
7
|
+
这些工具是为人类设计的,Agent 读不懂,也无法从中派生出可验证的状态。
|
|
8
|
+
|
|
9
|
+
**Coding Agent Harness** 解决的核心问题是:
|
|
10
|
+
|
|
11
|
+
> 当 Agent 在你的代码仓库里工作时,如何确保它的工作有迹可查、有门可守、有人可审?
|
|
12
|
+
|
|
13
|
+
它不是 Agent 本身,也不是给人用的任务管理工具。
|
|
14
|
+
它是一个**仓库原生的 Agent 操作层**(repository-native operating layer)——
|
|
15
|
+
给 Agent 提供可执行的结构化上下文,让 Agent 能从文件中恢复执行,
|
|
16
|
+
而不依赖之前的聊天记忆。
|
|
17
|
+
|
|
18
|
+
核心设计理念只有一句话:
|
|
19
|
+
|
|
20
|
+
> **把重要状态保存在 Agent 能读的 Markdown 文件里,然后用 CLI 从这些文件派生出
|
|
21
|
+
> 状态、检查、迁移计划和 Dashboard 视图。**
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 为什么叫 "Harness"
|
|
26
|
+
|
|
27
|
+
"Harness"在工程语境中是"约束装置"的意思——用来约束、引导、测量一个系统的行为,
|
|
28
|
+
而不是替代它。就像测试框架中的 "test harness" 不是测试本身,
|
|
29
|
+
而是让测试可以被组织、执行和验证的基础设施。
|
|
30
|
+
|
|
31
|
+
Coding Agent Harness 不是 Agent 的替代品,而是 Agent 的约束装置:
|
|
32
|
+
- 任务有生命周期(创建 → 执行 → 审查 → 收口)
|
|
33
|
+
- 审查有门禁(Agent 不能自己给自己打通关)
|
|
34
|
+
- 状态有记录(每次变更都写入 Markdown,可 git blame)
|
|
35
|
+
- 人类有检查入口(本地 Dashboard + Workbench 审查确认)
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 和 Jira / Linear / GitHub Issues 的本质区别
|
|
40
|
+
|
|
41
|
+
| | Jira / Linear / GitHub Issues | Coding Agent Harness |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| 设计给谁 | 人类协作 | Agent 执行 + 人类审查 |
|
|
44
|
+
| 状态存在哪 | 外部 SaaS 数据库 | 仓库内的 Markdown 文件 |
|
|
45
|
+
| Agent 能读吗 | 需要 API 集成 | 直接读文件 |
|
|
46
|
+
| 能 git diff 吗 | 不能 | 可以 |
|
|
47
|
+
| 能离线工作吗 | 不能 | 可以 |
|
|
48
|
+
| 能从文件恢复执行吗 | 不能 | 可以 |
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Level 0 — 四个大块
|
|
53
|
+
|
|
54
|
+
先看最高层。整个系统由四个大块组成:
|
|
55
|
+
|
|
56
|
+
```mermaid
|
|
57
|
+
flowchart LR
|
|
58
|
+
A["📦 Package\n发布的 npm 包\n(CLI + 模板 + 标准 + Preset)"]
|
|
59
|
+
B["📁 Target Repo\n用户的项目仓库\n(文档树 + 状态文件)"]
|
|
60
|
+
C["⚙️ Runtime\n运行时引擎\n(扫描 + 检查 + 生成)"]
|
|
61
|
+
D["👤 Human\n人类检查入口\n(Dashboard + 审查确认)"]
|
|
62
|
+
|
|
63
|
+
A -->|"scaffold + validate"| B
|
|
64
|
+
B -->|"读取"| C
|
|
65
|
+
C -->|"生成"| D
|
|
66
|
+
D -->|"review-confirm"| B
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
- **Package**:你 `npm install` 的那个东西,包含 CLI、模板、标准文档、Preset 包
|
|
70
|
+
- **Target Repo**:你的项目,harness 在里面创建 `docs/` 文档树来记录任务状态
|
|
71
|
+
- **Runtime**:CLI 运行时,扫描文档树、验证合规、生成 Dashboard
|
|
72
|
+
- **Human**:浏览器里看 Dashboard,在 Workbench 里做审查确认
|
|
73
|
+
|
|
74
|
+
注意这个循环的方向:**Package 写入 Target Repo,Runtime 读取 Target Repo,
|
|
75
|
+
Human 通过 review-confirm 再写回 Target Repo**。
|
|
76
|
+
整个系统是一个以 Markdown 文件为中心的读写循环,没有任何隐藏状态。
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Level 1 — 每个大块里有什么
|
|
81
|
+
|
|
82
|
+
### Package 里有什么
|
|
83
|
+
|
|
84
|
+
```mermaid
|
|
85
|
+
flowchart TD
|
|
86
|
+
PKG["📦 Package\ncoding-agent-harness@npm"]
|
|
87
|
+
|
|
88
|
+
PKG --> CLI["harness CLI\nscripts/harness.mjs\n唯一命令入口"]
|
|
89
|
+
PKG --> Lib["核心库\nscripts/lib/\n~30 个模块,6 个功能层"]
|
|
90
|
+
PKG --> Templates["任务模板\ntemplates/\n任务骨架文件(task_plan / visual_map 等)"]
|
|
91
|
+
PKG --> References["操作标准\nreferences/\n可复制到目标仓库的规范文档"]
|
|
92
|
+
PKG --> Presets["Preset 包\npresets/\n可复用任务方法(legacy-migration / module 等)"]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Package 是**只读的**——它提供工具和模板,但不存储任何状态。
|
|
96
|
+
状态全部在 Target Repo 里。
|
|
97
|
+
|
|
98
|
+
### Target Repo 里有什么
|
|
99
|
+
|
|
100
|
+
```mermaid
|
|
101
|
+
flowchart TD
|
|
102
|
+
REPO["📁 Target Repo\n你的项目仓库"]
|
|
103
|
+
|
|
104
|
+
REPO --> Entry["AGENTS.md\nAgent 入口和路由\n(告诉 Agent 去哪里找上下文)"]
|
|
105
|
+
REPO --> Caps[".harness-capabilities.json\n启用了哪些能力模块"]
|
|
106
|
+
REPO --> Docs["docs/\n文档树(harness 的工作区)"]
|
|
107
|
+
|
|
108
|
+
Docs --> Planning["09-PLANNING/\n任务目录 + 模块目录"]
|
|
109
|
+
Docs --> Ledger["Harness-Ledger.md\n全局账本(所有任务汇总)"]
|
|
110
|
+
Docs --> Walkthrough["10-WALKTHROUGH/\n收口证据和 Closeout SSoT"]
|
|
111
|
+
Docs --> Reference["11-REFERENCE/\n本地操作标准(从 Package 复制过来)"]
|
|
112
|
+
Docs --> Governance["01-GOVERNANCE/\nLesson 沉淀库"]
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
每个任务对应 `docs/09-PLANNING/TASKS/<task-id>/` 下的一个目录,
|
|
116
|
+
里面有 `task_plan.md`、`progress.md`、`visual_map.md`、`review.md` 等文件。
|
|
117
|
+
|
|
118
|
+
### Runtime 做什么
|
|
119
|
+
|
|
120
|
+
```mermaid
|
|
121
|
+
flowchart TD
|
|
122
|
+
RT["⚙️ Runtime\nharness CLI 运行时"]
|
|
123
|
+
|
|
124
|
+
RT --> Scan["扫描\n读取所有任务文件\n解析状态 / 阶段 / 审查 / Lesson"]
|
|
125
|
+
RT --> Check["检查\n9 个验证器验证合规性\n输出 failures / warnings"]
|
|
126
|
+
RT --> Generate["生成\n输出 Dashboard HTML + JSON 索引\n输出治理索引表"]
|
|
127
|
+
RT --> Migrate["迁移\n分析旧项目差距\n生成迁移动作队列"]
|
|
128
|
+
RT --> Lifecycle["生命周期\n执行状态转换命令\n写入 Governance Sync"]
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Runtime 是**无状态的**——每次运行都从 Markdown 文件重新读取,
|
|
132
|
+
不缓存任何中间状态(除了 `harness dev` 的文件监听)。
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Level 2 — 核心概念词汇表
|
|
137
|
+
|
|
138
|
+
| 概念 | 一句话解释 | 在哪里 |
|
|
139
|
+
| --- | --- | --- |
|
|
140
|
+
| **Task** | 一个有生命周期的工作单元 | `docs/09-PLANNING/TASKS/<id>/` |
|
|
141
|
+
| **Budget** | 任务复杂度:`simple` / `standard` / `complex`,决定门禁严格程度 | `task_plan.md` |
|
|
142
|
+
| **Phase** | Visual Map 中的执行阶段,有状态和完成度 | `visual_map.md` |
|
|
143
|
+
| **Capability** | 可选功能模块,如 `dashboard`、`adversarial-review` | `.harness-capabilities.json` |
|
|
144
|
+
| **Review Gate** | 阻止任务完成的审查门禁,必须人工确认才能通过 | `INDEX.md` + `review.md` |
|
|
145
|
+
| **Governance Sync** | 任务状态变更时自动更新全局账本的原子操作 | `Harness-Ledger.md` |
|
|
146
|
+
| **Preset** | 可复用的任务方法包,如 `legacy-migration`、`module` | `presets/<id>/` |
|
|
147
|
+
| **Lesson** | 从任务中沉淀的可复用经验 | `docs/01-GOVERNANCE/lessons/` |
|
|
148
|
+
| **Tombstone** | 软删除 / 合并 / 被取代的任务标记 | `task_plan.md` 中的特殊块 |
|
|
149
|
+
| **lifecycleState** | 从任务状态 + 审查状态综合派生的队列分类 | 运行时派生,不存文件 |
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Level 2 — 设计决策
|
|
154
|
+
|
|
155
|
+
### 为什么用 Markdown 而不是数据库
|
|
156
|
+
|
|
157
|
+
这是最常被问到的问题。
|
|
158
|
+
|
|
159
|
+
**选择 Markdown 的原因**:
|
|
160
|
+
|
|
161
|
+
1. **Agent 可读**:所有主流 AI 编程工具都能读写 Markdown,不需要特殊 API
|
|
162
|
+
2. **Git 原生**:状态变更可以 diff、可以 blame、可以回滚,审计链天然存在
|
|
163
|
+
3. **人类可读**:不需要工具就能直接查看状态,降低工具依赖
|
|
164
|
+
4. **离线工作**:不依赖外部服务,断网也能用
|
|
165
|
+
5. **可移植**:换 Agent 工具不需要迁移数据
|
|
166
|
+
6. **单一事实源**:避免 Markdown、JSON、SQLite 三份事实互相漂移
|
|
167
|
+
|
|
168
|
+
**代价**:
|
|
169
|
+
|
|
170
|
+
- 解析 Markdown 比查数据库慢(但对于任务管理规模,这不是瓶颈)
|
|
171
|
+
- 格式约束需要靠检查器维护,而不是数据库 schema 强制
|
|
172
|
+
- 并发写入需要文件锁(`governance-sync` 的锁机制)
|
|
173
|
+
|
|
174
|
+
**被考虑但否决的方案**:
|
|
175
|
+
- **SQLite**:Git diff 不友好,引入二进制文件,且当前规模(几百任务)不需要
|
|
176
|
+
- **JSON**:适合机器解析但不适合 Agent 理解叙述性上下文
|
|
177
|
+
- **YAML/TOML**:不适合承载 brief、执行策略这类长文本内容
|
|
178
|
+
|
|
179
|
+
### 为什么是 npm 包而不是 SaaS
|
|
180
|
+
|
|
181
|
+
Agent 需要在本地文件系统上读写状态。SaaS 会引入网络依赖、认证、延迟,
|
|
182
|
+
破坏 Agent 的自主执行能力。npm 包让任何能运行 Node.js 的环境都能直接使用,
|
|
183
|
+
无需账号或网络。`package.json` 的 `dependencies` 为空——零运行时依赖。
|
|
184
|
+
|
|
185
|
+
### 为什么 review-confirm 必须是人工操作
|
|
186
|
+
|
|
187
|
+
`review-confirm` 是整个系统里**唯一不能被 Agent 自动执行**的操作。
|
|
188
|
+
|
|
189
|
+
原因:
|
|
190
|
+
|
|
191
|
+
> Agent 不能给自己的工作打通关。
|
|
192
|
+
|
|
193
|
+
这个边界不是一开始就有的。最初 Dashboard workbench 的 review action 没有 Agent/Human 区分。
|
|
194
|
+
后来通过竞品分析(Taskr competitive intake)识别出"Agent 自动确认 review"是 P0 风险,
|
|
195
|
+
才引入了 Git 提交门禁:`review-confirm` 会把带有 Git `user.name` / `user.email` 的
|
|
196
|
+
人工确认审计字段写入任务 `INDEX.md`,并做两次 Git 原子提交——第一次提交确认字段,
|
|
197
|
+
第二次提交包含第一个 commit SHA 的最终审计记录。这个 Git commit 是**可审计的人类签名**,
|
|
198
|
+
证明有真实的人类看过这个任务。
|
|
199
|
+
|
|
200
|
+
### 为什么派生状态不存储在文件里
|
|
201
|
+
|
|
202
|
+
`lifecycleState`、`taskQueues`、`reviewQueueState` 这些派生状态每次运行时重新计算,
|
|
203
|
+
不写回 Markdown 文件。原因有三:
|
|
204
|
+
|
|
205
|
+
1. **避免事实漂移**:如果派生状态也写回文件,就有了两份事实源,任何一份过期都会造成误报
|
|
206
|
+
2. **防止绕过门禁**:如果 Agent 能直接修改派生字段,就能绕过 review-confirm 的门禁
|
|
207
|
+
3. **治理规则即代码**:scanner 的推导规则本身就是治理规则的机器可读表达,每次运行重新计算等于每次都重新执行一遍治理检查
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 下一步
|
|
212
|
+
|
|
213
|
+
- 想理解代码怎么组织的 → [02-module-dependency.md](02-module-dependency.md)
|
|
214
|
+
- 想理解一个任务从头到尾怎么走 → [03-task-lifecycle.md](03-task-lifecycle.md)
|
|
215
|
+
- 想理解检查器在验什么 → [04-check-and-governance.md](04-check-and-governance.md)
|
|
216
|
+
- 想理解 Dashboard 数据从哪来 → [05-data-flow.md](05-data-flow.md)
|
|
217
|
+
- 想理解 Preset 和迁移怎么工作 → [06-preset-and-migration.md](06-preset-and-migration.md)
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# 02 — 代码模块依赖关系
|
|
2
|
+
|
|
3
|
+
## Level 0 — 入口在哪
|
|
4
|
+
|
|
5
|
+
所有命令都从一个文件进来:
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
flowchart LR
|
|
9
|
+
User["用户 / Agent\n$ harness <command> [target]"] -->|"解析参数 + 分发"| Entry["scripts/harness.mjs\n唯一 CLI 入口"]
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
`harness.mjs` 做两件事:解析命令行参数,然后分发给对应的 command 模块或直接调用核心库。
|
|
13
|
+
它本身不包含任何业务逻辑。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Level 1 — 命令如何分发
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
flowchart TD
|
|
21
|
+
Entry["scripts/harness.mjs"]
|
|
22
|
+
|
|
23
|
+
Entry -->|"dashboard\ndev"| DashCmd["scripts/dashboard-command.mjs\nDashboard 生成 + 动态服务"]
|
|
24
|
+
Entry -->|"migrate-plan\nmigrate-run\nmigrate-verify"| MigCmd["scripts/migration-command.mjs\n迁移三阶段命令"]
|
|
25
|
+
Entry -->|"new-task / task-start\ntask-phase / task-review\ntask-complete / review-confirm\ntask-tombstone"| TaskCmd["scripts/task-command.mjs\n任务生命周期命令"]
|
|
26
|
+
Entry -->|"preset catalog\npreset install\npreset uninstall"| PresetCmd["scripts/preset-command.mjs\nPreset 管理命令"]
|
|
27
|
+
Entry -->|"check / status / init\ngovernance / lesson-promote\n..."| Core["lib/harness-core.mjs\n(直接调用)"]
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
四个 command 模块各自负责一个领域,其余命令直接调用 `harness-core.mjs`。
|
|
31
|
+
|
|
32
|
+
**为什么这样分**:command 模块处理的是有复杂交互逻辑的命令(多步骤、需要读写多个文件、
|
|
33
|
+
有用户提示),而简单的查询类命令(`check`、`status`)直接调用核心库更简洁。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Level 2 — harness-core.mjs 是什么
|
|
38
|
+
|
|
39
|
+
`harness-core.mjs` 是一个 **facade(门面)**,它自己不写任何业务逻辑,
|
|
40
|
+
只是把 `lib/` 下所有模块的导出重新 re-export 出来。
|
|
41
|
+
|
|
42
|
+
这样设计的好处:外部代码只需要 `import from "./lib/harness-core.mjs"` 就能拿到所有功能,
|
|
43
|
+
不需要知道具体在哪个子模块里。
|
|
44
|
+
|
|
45
|
+
```mermaid
|
|
46
|
+
flowchart TD
|
|
47
|
+
Core["harness-core.mjs\n(纯 re-export facade)"]
|
|
48
|
+
|
|
49
|
+
Core --> G1["① 核心工具层\ncore-shared + markdown-utils"]
|
|
50
|
+
Core --> G2["② 任务扫描层\ntask-scanner + review-model + lesson-candidates"]
|
|
51
|
+
Core --> G3["③ 检查与治理层\ncheck-profiles + governance-sync + governance-index"]
|
|
52
|
+
Core --> G4["④ Dashboard 层\ndashboard-data + dashboard-writer + workbench"]
|
|
53
|
+
Core --> G5["⑤ 任务生命周期层\ntask-lifecycle + review-gates + review-confirm"]
|
|
54
|
+
Core --> G6["⑥ 迁移与 Preset 层\nmigration-planner + preset-registry + tombstone"]
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
下面逐层展开。
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Level 3 — 六个功能层详解
|
|
62
|
+
|
|
63
|
+
### ① 核心工具层
|
|
64
|
+
|
|
65
|
+
这两个模块是所有其他模块的基础,几乎每个模块都会 import 它们:
|
|
66
|
+
|
|
67
|
+
```mermaid
|
|
68
|
+
flowchart LR
|
|
69
|
+
CoreShared["core-shared.mjs\n路径解析 / 常量枚举\n文件读写 / locale 处理\n模板渲染"]
|
|
70
|
+
MarkdownUtils["markdown-utils.mjs\nMarkdown 表格提取\n行更新 / 列查找\n依赖列表拆分"]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`core-shared` 定义了所有允许的枚举值,是整个系统的"类型系统":
|
|
74
|
+
|
|
75
|
+
| 枚举 | 允许值 |
|
|
76
|
+
| --- | --- |
|
|
77
|
+
| `allowedTaskStates` | `not_started / planned / in_progress / review / blocked / done` |
|
|
78
|
+
| `allowedTaskBudgets` | `simple / standard / complex` |
|
|
79
|
+
| `allowedPhaseStates` | `planned / in_progress / review / blocked / done / skipped` |
|
|
80
|
+
| `allowedCapabilities` | `core / module-parallel / subagent-worker / adversarial-review / ...` |
|
|
81
|
+
|
|
82
|
+
`markdown-utils` 提供了对 Markdown 表格的结构化操作——这是整个系统能从 Markdown 文件
|
|
83
|
+
派生状态的技术基础。
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
### ② 任务扫描层
|
|
88
|
+
|
|
89
|
+
负责读取 `docs/09-PLANNING/TASKS/` 下的所有文件,解析出结构化数据:
|
|
90
|
+
|
|
91
|
+
```mermaid
|
|
92
|
+
flowchart TD
|
|
93
|
+
TaskScanner["task-scanner.mjs\n扫描所有任务目录\n解析状态 / 预算 / 阶段 / 元数据"]
|
|
94
|
+
|
|
95
|
+
TaskScanner --> ReviewModel["task-review-model.mjs\n审查确认解析\n生命周期队列派生\ntombstone 解析"]
|
|
96
|
+
TaskScanner --> LessonCandidates["task-lesson-candidates.mjs\nLesson candidate 状态解析\n决策完成判定"]
|
|
97
|
+
|
|
98
|
+
ReviewModel --> CoreShared
|
|
99
|
+
ReviewModel --> MarkdownUtils
|
|
100
|
+
TaskScanner --> CoreShared
|
|
101
|
+
TaskScanner --> MarkdownUtils
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
`task-review-model` 里有几个关键的**派生函数**——它们不读文件,
|
|
105
|
+
只根据已解析的数据计算出新的状态:
|
|
106
|
+
|
|
107
|
+
| 函数 | 输入 | 输出 |
|
|
108
|
+
| --- | --- | --- |
|
|
109
|
+
| `deriveLifecycleState()` | taskState + reviewStatus + tombstone | `lifecycleState`(队列分类) |
|
|
110
|
+
| `deriveTaskQueues()` | lifecycleState + materials + lessons | `taskQueues[]`(属于哪些队列) |
|
|
111
|
+
| `deriveReviewQueueState()` | findings + confirmation | `reviewQueueState` |
|
|
112
|
+
| `parseTaskTombstone()` | task_plan.md 内容 | 软删除 / 合并 / 被取代状态 |
|
|
113
|
+
|
|
114
|
+
这些派生函数是**纯函数**,相同输入永远得到相同输出,便于测试和调试。
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
### ③ 检查与治理层
|
|
119
|
+
|
|
120
|
+
负责验证合规性,以及维护全局索引的原子写入:
|
|
121
|
+
|
|
122
|
+
```mermaid
|
|
123
|
+
flowchart TD
|
|
124
|
+
CheckProfiles["check-profiles.mjs\nbuildStatus() 编排 9 个验证器\n返回 failures + warnings + tasks"]
|
|
125
|
+
|
|
126
|
+
CheckProfiles --> V1["validateCapabilities\n能力注册表一致性"]
|
|
127
|
+
CheckProfiles --> V2["validateReviewSchema\nreview.md 结构"]
|
|
128
|
+
CheckProfiles --> V3["validateVisualMaps\nvisual_map 合规"]
|
|
129
|
+
CheckProfiles --> V4["validatePlanContracts\n任务合约标记"]
|
|
130
|
+
CheckProfiles --> V5["validateTaskPresetContracts\nPreset 合约"]
|
|
131
|
+
CheckProfiles --> V6["validateContextDocs\n上下文文档完整性"]
|
|
132
|
+
CheckProfiles --> V7["validateGovernanceTableBoundaries\n表格边界"]
|
|
133
|
+
CheckProfiles --> V8["validateSubagentAuthorization\nsubagent 授权"]
|
|
134
|
+
CheckProfiles --> V9["validateTaskCompletionConsistency\n完成一致性"]
|
|
135
|
+
|
|
136
|
+
CheckProfiles --> GitSummary["git-status-summary.mjs\nGit 状态摘要(dirty files 等)"]
|
|
137
|
+
|
|
138
|
+
GovSync["governance-sync.mjs\n原子锁 + 行级更新 + Git commit\n(任务状态变更时自动调用)"]
|
|
139
|
+
GovIndex["governance-index-generator.mjs\n重建全局索引表\n(手动触发)"]
|
|
140
|
+
GovIndex --> GovSync
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**重要区分**:`governance-sync` 和 `check-profiles` 没有依赖关系。
|
|
144
|
+
- `check-profiles`:只读,验证状态,不写文件
|
|
145
|
+
- `governance-sync`:只写,更新账本,不做验证
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
### ④ Dashboard 层
|
|
150
|
+
|
|
151
|
+
负责把扫描结果转换成 HTML Dashboard:
|
|
152
|
+
|
|
153
|
+
```mermaid
|
|
154
|
+
flowchart TD
|
|
155
|
+
DashData["dashboard-data.mjs\nbuildDashboardBundle()\n收集 status + documents + tables + graph + adoption"]
|
|
156
|
+
|
|
157
|
+
DashData --> CheckProfiles["check-profiles.mjs\n(调用 buildStatus)"]
|
|
158
|
+
DashData --> DashWriter["dashboard-writer.mjs\n写入 HTML + JSON 文件\n(静态快照模式)"]
|
|
159
|
+
DashData --> StatusRenderer["status-dashboard-renderer.mjs\n渲染状态摘要文本"]
|
|
160
|
+
|
|
161
|
+
DashWorkbench["dashboard-workbench.mjs\nDev 动态服务\nHTTP server + 文件监听 + 自动刷新\n(harness dev 命令)"]
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
`DashWorkbench` 和 `DashData` / `DashWriter` 是**独立的**:
|
|
165
|
+
- `DashData` + `DashWriter`:生成静态快照(只读)
|
|
166
|
+
- `DashWorkbench`:启动本地 HTTP 服务,支持 Workbench 写操作
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
### ⑤ 任务生命周期层
|
|
171
|
+
|
|
172
|
+
负责执行所有任务状态转换命令:
|
|
173
|
+
|
|
174
|
+
```mermaid
|
|
175
|
+
flowchart TD
|
|
176
|
+
TaskLifecycle["task-lifecycle.mjs\n生命周期命令实现\nnew-task / task-start / task-phase\ntask-review / task-complete"]
|
|
177
|
+
|
|
178
|
+
TaskLifecycle --> ReviewGates["task-lifecycle/review-gates.mjs\n门禁验证逻辑\n(进入 review 前的检查)"]
|
|
179
|
+
TaskLifecycle --> ReviewConfirm["task-lifecycle/review-confirm.mjs\n人工确认执行\n(review-confirm 命令)"]
|
|
180
|
+
TaskLifecycle --> TextUtils["task-lifecycle/text-utils.mjs\n文本追加工具\n(向 Markdown 文件追加内容)"]
|
|
181
|
+
TaskLifecycle --> GovSync["governance-sync.mjs\n状态变更时同步账本"]
|
|
182
|
+
TaskLifecycle --> MigPreset["task-migration-preset.mjs\n迁移 preset 上下文注入"]
|
|
183
|
+
|
|
184
|
+
ReviewConfirm --> GitGate["review-confirm-git-gate.mjs\nGit 原子提交门禁\n(写入人工确认块 + commit)"]
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
`review-confirm` 是整个生命周期层里最特殊的命令——它是唯一需要 Git 原子提交的操作,
|
|
188
|
+
也是唯一不能被 Agent 自动执行的操作(见 [01-system-overview.md](01-system-overview.md) 的设计决策)。
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### ⑥ 迁移与 Preset 层
|
|
193
|
+
|
|
194
|
+
```mermaid
|
|
195
|
+
flowchart TD
|
|
196
|
+
PresetReg["preset-registry.mjs\n读取 presets/ YAML\n验证包完整性\n分层发现(project / user / bundled)"]
|
|
197
|
+
PresetEngine["preset-engine.mjs\n执行 preset entrypoints\n(template / script / check 类型)"]
|
|
198
|
+
PresetAudit["preset-audit-contracts.mjs\n验证 preset 合约完整性"]
|
|
199
|
+
PresetResource["preset-resource-contracts.mjs\n验证 preset 资源声明"]
|
|
200
|
+
|
|
201
|
+
MigPlanner["migration-planner.mjs\n分析目标仓库差距\n生成迁移动作队列"]
|
|
202
|
+
MigSupport["migration-support.mjs\nsession 管理 / locale 探测\nGit 状态检查 / full-cutover 验证"]
|
|
203
|
+
Tombstone["task-tombstone-commands.mjs\n软删除 / 合并 / 重开命令"]
|
|
204
|
+
|
|
205
|
+
LessonSed["task-lesson-sedimentation.mjs\nLesson 沉淀任务创建"]
|
|
206
|
+
LessonMaint["lesson-maintenance.mjs\nLesson 库维护"]
|
|
207
|
+
TaskIndex["task-index.mjs\n任务索引生成"]
|
|
208
|
+
|
|
209
|
+
MigPlanner --> MigSupport
|
|
210
|
+
PresetEngine --> PresetReg
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 一张完整的依赖总图(参考用)
|
|
216
|
+
|
|
217
|
+
如果你已经理解了上面的分层,这张图可以作为查阅索引:
|
|
218
|
+
|
|
219
|
+
```mermaid
|
|
220
|
+
flowchart TD
|
|
221
|
+
Entry["harness.mjs"] --> DashCmd & MigCmd & TaskCmd & PresetCmd & Core["harness-core.mjs"]
|
|
222
|
+
|
|
223
|
+
Core --> CoreShared & MarkdownUtils
|
|
224
|
+
Core --> TaskScanner --> ReviewModel & LessonCandidates
|
|
225
|
+
Core --> CheckProfiles --> GitSummary
|
|
226
|
+
Core --> GovSync
|
|
227
|
+
Core --> GovIndex --> GovSync
|
|
228
|
+
Core --> DashData --> DashWriter & StatusRenderer
|
|
229
|
+
Core --> DashWorkbench
|
|
230
|
+
Core --> TaskLifecycle --> ReviewGates & ReviewConfirm & TextUtils & GovSync & MigPreset
|
|
231
|
+
ReviewConfirm --> GitGate
|
|
232
|
+
Core --> PresetReg
|
|
233
|
+
Core --> PresetEngine --> PresetReg
|
|
234
|
+
Core --> MigPlanner --> MigSupport
|
|
235
|
+
Core --> Tombstone
|
|
236
|
+
Core --> LessonSed
|
|
237
|
+
Core --> LessonMaint
|
|
238
|
+
Core --> TaskIndex
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Level 2 — 模块命名规律
|
|
244
|
+
|
|
245
|
+
理解命名规律可以帮你快速定位代码:
|
|
246
|
+
|
|
247
|
+
| 前缀 / 后缀 | 含义 | 例子 |
|
|
248
|
+
| --- | --- | --- |
|
|
249
|
+
| `task-` | 与任务相关 | `task-scanner`, `task-lifecycle`, `task-review-model` |
|
|
250
|
+
| `dashboard-` | 与 Dashboard 相关 | `dashboard-data`, `dashboard-writer`, `dashboard-workbench` |
|
|
251
|
+
| `governance-` | 与治理 / 账本相关 | `governance-sync`, `governance-index-generator` |
|
|
252
|
+
| `migration-` | 与迁移相关 | `migration-planner`, `migration-support` |
|
|
253
|
+
| `preset-` | 与 Preset 相关 | `preset-registry`, `preset-engine`, `preset-audit-contracts` |
|
|
254
|
+
| `check-` | 验证器 | `check-profiles`, `check-module-parallel` |
|
|
255
|
+
| `-command.mjs` | CLI 命令模块 | `task-command`, `dashboard-command` |
|
|
256
|
+
| `-utils.mjs` | 工具函数 | `markdown-utils`, `text-utils` |
|
|
257
|
+
| `-gates.mjs` | 门禁逻辑 | `review-gates`, `review-confirm-git-gate` |
|