coding-agent-harness 1.0.2 → 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.
Files changed (219) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/CONTRIBUTING.md +98 -0
  3. package/LICENSE +661 -21
  4. package/LICENSE-EXCEPTION.md +37 -0
  5. package/README.md +244 -87
  6. package/README.zh-CN.md +77 -35
  7. package/SKILL.md +32 -24
  8. package/docs-release/README.md +9 -5
  9. package/docs-release/architecture/overview.md +17 -5
  10. package/docs-release/architecture/overview.zh-CN.md +9 -5
  11. package/docs-release/architecture/system-explainer/01-system-overview.md +217 -0
  12. package/docs-release/architecture/system-explainer/02-module-dependency.md +257 -0
  13. package/docs-release/architecture/system-explainer/03-task-lifecycle.md +304 -0
  14. package/docs-release/architecture/system-explainer/04-check-and-governance.md +239 -0
  15. package/docs-release/architecture/system-explainer/05-data-flow.md +276 -0
  16. package/docs-release/architecture/system-explainer/06-preset-and-migration.md +303 -0
  17. package/docs-release/architecture/system-explainer/README.md +67 -0
  18. package/docs-release/architecture/system-explainer/en-US/01-system-overview.md +226 -0
  19. package/docs-release/architecture/system-explainer/en-US/02-module-dependency.md +263 -0
  20. package/docs-release/architecture/system-explainer/en-US/03-task-lifecycle.md +319 -0
  21. package/docs-release/architecture/system-explainer/en-US/04-check-and-governance.md +250 -0
  22. package/docs-release/architecture/system-explainer/en-US/05-data-flow.md +290 -0
  23. package/docs-release/architecture/system-explainer/en-US/06-preset-and-migration.md +323 -0
  24. package/docs-release/architecture/system-explainer/en-US/README.md +70 -0
  25. package/docs-release/assets/dashboard-overview.png +0 -0
  26. package/docs-release/guides/agent-installation.en-US.md +39 -15
  27. package/docs-release/guides/agent-installation.md +43 -16
  28. package/docs-release/guides/contributing.md +100 -0
  29. package/docs-release/guides/contributing.zh-CN.md +99 -0
  30. package/docs-release/guides/document-audience-and-surfaces.en-US.md +3 -2
  31. package/docs-release/guides/document-audience-and-surfaces.md +3 -2
  32. package/docs-release/guides/full-legacy-migration-subagent-strategy.md +2 -2
  33. package/docs-release/guides/full-legacy-migration-subagent-strategy.zh-CN.md +2 -2
  34. package/docs-release/guides/legacy-migration-agent-prompt.md +0 -11
  35. package/docs-release/guides/legacy-migration-agent-prompt.zh-CN.md +0 -11
  36. package/docs-release/guides/migration-playbook.en-US.md +14 -15
  37. package/docs-release/guides/migration-playbook.md +14 -15
  38. package/docs-release/guides/parent-control-repository-pattern.en-US.md +7 -5
  39. package/docs-release/guides/parent-control-repository-pattern.md +7 -5
  40. package/docs-release/guides/preset-development.md +238 -0
  41. package/docs-release/guides/repository-operating-models.en-US.md +5 -4
  42. package/docs-release/guides/repository-operating-models.md +5 -4
  43. package/docs-release/guides/task-state-machine.en-US.md +224 -0
  44. package/docs-release/guides/task-state-machine.md +231 -0
  45. package/docs-release/intl/en-US.md +1 -1
  46. package/docs-release/intl/zh-CN.md +1 -1
  47. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/INDEX.md +60 -0
  48. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/findings.md +7 -0
  49. package/package.json +10 -4
  50. package/presets/legacy-migration/checks/preset-check.mjs +3 -0
  51. package/presets/legacy-migration/preset.yaml +134 -0
  52. package/presets/legacy-migration/scripts/plan-work-queue.mjs +4 -0
  53. package/presets/legacy-migration/scripts/scaffold-task-contracts.mjs +4 -0
  54. package/presets/legacy-migration/templates/execution_strategy.append.md +18 -0
  55. package/presets/legacy-migration/templates/findings.seed.md +17 -0
  56. package/presets/legacy-migration/templates/review.seed.md +12 -0
  57. package/presets/legacy-migration/templates/task_plan.append.md +9 -0
  58. package/presets/legacy-migration/templates/visual_map.append.md +12 -0
  59. package/presets/legacy-migration/workbench/dashboard-panels.yaml +2 -0
  60. package/presets/legacy-migration/workbench/migration-queue.schema.json +23 -0
  61. package/presets/lesson-sedimentation/preset.yaml +23 -0
  62. package/presets/lesson-sedimentation/templates/prompt.md +23 -0
  63. package/presets/module/preset.yaml +25 -0
  64. package/presets/module/templates/execution_strategy.append.md +8 -0
  65. package/presets/module/templates/task_plan.append.md +17 -0
  66. package/presets/standard-task/preset.yaml +31 -0
  67. package/presets/standard-task/templates/task_plan.append.md +7 -0
  68. package/references/adversarial-review-standard.md +2 -2
  69. package/references/agents-md-pattern.md +2 -2
  70. package/references/delivery-operating-model-standard.md +3 -3
  71. package/references/docs-directory-standard.md +6 -7
  72. package/references/harness-ledger.md +53 -96
  73. package/references/lessons-governance.md +88 -93
  74. package/references/module-parallel-standard.md +14 -14
  75. package/references/planning-loop.md +12 -6
  76. package/references/pull-request-standard.md +118 -0
  77. package/references/repo-governance-standard.md +11 -2
  78. package/references/review-routing-standard.md +7 -1
  79. package/references/ssot-governance.md +67 -59
  80. package/references/taskr-gap-analysis.md +600 -0
  81. package/references/walkthrough-closeout.md +7 -7
  82. package/scripts/check-harness.mjs +40 -301
  83. package/scripts/commands/dashboard-command.mjs +67 -0
  84. package/scripts/commands/migration-command.mjs +126 -0
  85. package/scripts/commands/preset-command.mjs +73 -0
  86. package/scripts/commands/task-command.mjs +328 -0
  87. package/scripts/harness.mjs +59 -260
  88. package/scripts/lib/capability-registry.mjs +82 -28
  89. package/scripts/lib/check-module-parallel.mjs +230 -0
  90. package/scripts/lib/check-profiles.mjs +90 -228
  91. package/scripts/lib/check-task-contracts.mjs +55 -0
  92. package/scripts/lib/core-shared.mjs +65 -2
  93. package/scripts/lib/dashboard-data.mjs +155 -24
  94. package/scripts/lib/dashboard-workbench.mjs +131 -12
  95. package/scripts/lib/dashboard-writer.mjs +20 -4
  96. package/scripts/lib/git-status-summary.mjs +46 -0
  97. package/scripts/lib/governance-index-generator.mjs +174 -0
  98. package/scripts/lib/governance-sync.mjs +611 -0
  99. package/scripts/lib/governance-table-boundary.mjs +175 -0
  100. package/scripts/lib/harness-core.mjs +6 -0
  101. package/scripts/lib/lesson-maintenance.mjs +36 -29
  102. package/scripts/lib/markdown-utils.mjs +33 -0
  103. package/scripts/lib/migration-planner.mjs +4 -6
  104. package/scripts/lib/migration-support.mjs +1 -1
  105. package/scripts/lib/phase-kind.mjs +50 -0
  106. package/scripts/lib/preset-audit-contracts.mjs +37 -0
  107. package/scripts/lib/preset-engine.mjs +494 -0
  108. package/scripts/lib/preset-registry.mjs +776 -0
  109. package/scripts/lib/preset-resource-contracts.mjs +83 -0
  110. package/scripts/lib/review-confirm-git-gate.mjs +248 -0
  111. package/scripts/lib/status-builder.mjs +88 -0
  112. package/scripts/lib/status-dashboard-renderer.mjs +105 -0
  113. package/scripts/lib/subagent-authorization-audit.mjs +196 -0
  114. package/scripts/lib/task-audit-metadata.mjs +385 -0
  115. package/scripts/lib/task-audit-migration.mjs +350 -0
  116. package/scripts/lib/task-completion-consistency.mjs +26 -0
  117. package/scripts/lib/task-index.mjs +93 -0
  118. package/scripts/lib/task-lesson-candidates.mjs +242 -0
  119. package/scripts/lib/task-lesson-sedimentation.mjs +326 -0
  120. package/scripts/lib/task-lifecycle/create-task-helpers.mjs +67 -0
  121. package/scripts/lib/task-lifecycle/phase-sync.mjs +88 -0
  122. package/scripts/lib/task-lifecycle/review-confirm.mjs +112 -0
  123. package/scripts/lib/task-lifecycle/review-gates.mjs +73 -0
  124. package/scripts/lib/task-lifecycle/review-submission.mjs +63 -0
  125. package/scripts/lib/task-lifecycle/scaffold-provenance.mjs +49 -0
  126. package/scripts/lib/task-lifecycle/template-files.mjs +53 -0
  127. package/scripts/lib/task-lifecycle/text-utils.mjs +24 -0
  128. package/scripts/lib/task-lifecycle.mjs +338 -477
  129. package/scripts/lib/task-metadata.mjs +118 -0
  130. package/scripts/lib/task-review-model.mjs +455 -0
  131. package/scripts/lib/task-scanner.mjs +193 -372
  132. package/scripts/lib/task-tombstone-commands.mjs +140 -0
  133. package/scripts/postinstall.mjs +14 -0
  134. package/skills/preset-creator/SKILL.md +179 -0
  135. package/skills/preset-creator/references/complex-task-skeleton/README.md +31 -0
  136. package/skills/preset-creator/references/complex-task-skeleton/artifacts/INDEX.md +12 -0
  137. package/skills/preset-creator/references/complex-task-skeleton/brief.md +43 -0
  138. package/skills/preset-creator/references/complex-task-skeleton/execution_strategy.md +71 -0
  139. package/skills/preset-creator/references/complex-task-skeleton/findings.md +24 -0
  140. package/skills/preset-creator/references/complex-task-skeleton/lesson_candidates.md +70 -0
  141. package/skills/preset-creator/references/complex-task-skeleton/long-running-task-contract.md +76 -0
  142. package/skills/preset-creator/references/complex-task-skeleton/progress.md +33 -0
  143. package/skills/preset-creator/references/complex-task-skeleton/references/INDEX.md +13 -0
  144. package/skills/preset-creator/references/complex-task-skeleton/review.md +107 -0
  145. package/skills/preset-creator/references/complex-task-skeleton/task_plan.md +111 -0
  146. package/skills/preset-creator/references/complex-task-skeleton/visual_map.md +50 -0
  147. package/skills/preset-creator/references/preset-package-skeleton.md +296 -0
  148. package/templates/AGENTS.md.template +24 -18
  149. package/templates/dashboard/assets/app-src/00-state.js +13 -0
  150. package/templates/dashboard/assets/app-src/10-router.js +5 -1
  151. package/templates/dashboard/assets/app-src/20-overview.js +18 -8
  152. package/templates/dashboard/assets/app-src/30-tasks.js +92 -246
  153. package/templates/dashboard/assets/app-src/35-task-detail.js +286 -0
  154. package/templates/dashboard/assets/app-src/45-review.js +241 -22
  155. package/templates/dashboard/assets/app-src/50-migration.js +24 -10
  156. package/templates/dashboard/assets/app-src/55-presets.js +375 -0
  157. package/templates/dashboard/assets/app-src/60-shared.js +3 -1
  158. package/templates/dashboard/assets/app-src/90-bindings.js +302 -29
  159. package/templates/dashboard/assets/app.css +1501 -376
  160. package/templates/dashboard/assets/app.css.manifest.json +10 -0
  161. package/templates/dashboard/assets/app.js +1240 -101
  162. package/templates/dashboard/assets/app.manifest.json +2 -0
  163. package/templates/dashboard/assets/css-src/00-foundation.css +346 -0
  164. package/templates/dashboard/assets/css-src/10-panels-flow.css +236 -0
  165. package/templates/dashboard/assets/css-src/20-briefs-controls.css +398 -0
  166. package/templates/dashboard/assets/css-src/30-task-index.css +739 -0
  167. package/templates/dashboard/assets/css-src/35-review-workspace.css +507 -0
  168. package/templates/dashboard/assets/css-src/40-detail-modules-migration.css +489 -0
  169. package/templates/dashboard/assets/css-src/45-presets.css +516 -0
  170. package/templates/dashboard/assets/css-src/50-responsive-overrides.css +551 -0
  171. package/templates/dashboard/assets/i18n.js +263 -23
  172. package/templates/ledger/Harness-Ledger.md +13 -25
  173. package/templates/lessons/lesson-arch-process-change.md +1 -1
  174. package/templates/lessons/lesson-new-doc.md +1 -1
  175. package/templates/lessons/lesson-ref-change.md +1 -1
  176. package/templates/planning/INDEX.md +87 -0
  177. package/templates/planning/brief.md +1 -1
  178. package/templates/planning/execution_strategy.md +31 -0
  179. package/templates/planning/lesson_candidates.md +18 -6
  180. package/templates/planning/module_session_prompt.md +1 -0
  181. package/templates/planning/optional/artifacts/INDEX.md +3 -3
  182. package/templates/planning/optional/references/INDEX.md +3 -3
  183. package/templates/planning/review.md +41 -0
  184. package/templates/planning/task_plan.md +5 -21
  185. package/templates/planning/visual_map.md +13 -9
  186. package/templates/planning/visual_map.simple.md +52 -0
  187. package/templates/reference/execution-workflow-standard.md +31 -3
  188. package/templates/reference/pull-request-standard.md +80 -0
  189. package/templates/reference/repo-governance-standard.md +7 -6
  190. package/templates/reference/review-routing-standard.md +6 -0
  191. package/templates/reference/walkthrough-standard.md +2 -1
  192. package/templates/verifier/verifier-output.md +1 -1
  193. package/templates-zh-CN/AGENTS.md.template +25 -19
  194. package/templates-zh-CN/ledger/Harness-Ledger.md +17 -40
  195. package/templates-zh-CN/planning/INDEX.md +87 -0
  196. package/templates-zh-CN/planning/brief.md +1 -1
  197. package/templates-zh-CN/planning/execution_strategy.md +30 -0
  198. package/templates-zh-CN/planning/lesson_candidates.md +18 -6
  199. package/templates-zh-CN/planning/module_session_prompt.md +1 -0
  200. package/templates-zh-CN/planning/review.md +41 -1
  201. package/templates-zh-CN/planning/task_plan.md +4 -44
  202. package/templates-zh-CN/planning/visual_map.md +14 -7
  203. package/templates-zh-CN/planning/visual_map.simple.md +48 -0
  204. package/templates-zh-CN/reference/adversarial-review-standard.md +1 -1
  205. package/templates-zh-CN/reference/docs-library-standard.md +1 -1
  206. package/templates-zh-CN/reference/execution-workflow-standard.md +33 -7
  207. package/templates-zh-CN/reference/harness-ledger-standard.md +2 -2
  208. package/templates-zh-CN/reference/pull-request-standard.md +106 -0
  209. package/templates-zh-CN/reference/repo-governance-standard.md +4 -3
  210. package/templates-zh-CN/reference/review-routing-standard.md +8 -1
  211. package/templates-zh-CN/reference/walkthrough-standard.md +3 -2
  212. package/templates-zh-CN/walkthrough/Closeout-SSoT.md +1 -1
  213. package/docs-release/assets/dashboard-overview-en.png +0 -0
  214. package/scripts/smoke-dashboard.mjs +0 -92
  215. package/scripts/test-harness.mjs +0 -1395
  216. package/templates/ssot/Feature-SSoT.md +0 -43
  217. package/templates/ssot/Lessons-SSoT.md +0 -44
  218. package/templates-zh-CN/ssot/Feature-SSoT.md +0 -49
  219. package/templates-zh-CN/ssot/Lessons-SSoT.md +0 -49
@@ -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` |