coding-agent-harness 1.0.5 → 1.0.6

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 (260) hide show
  1. package/CONTRIBUTING.md +2 -2
  2. package/README.md +63 -3
  3. package/README.zh-CN.md +52 -3
  4. package/SKILL.md +43 -43
  5. package/dist/build-dist.mjs +189 -0
  6. package/dist/check-dist-observation.mjs +428 -0
  7. package/dist/check-harness.mjs +489 -0
  8. package/dist/check-import-graph.mjs +511 -0
  9. package/dist/check-runtime-emit.mjs +304 -0
  10. package/dist/check-type-boundaries.mjs +139 -0
  11. package/dist/commands/dashboard-command.mjs +80 -0
  12. package/dist/commands/migration-command.mjs +152 -0
  13. package/dist/commands/preset-command.mjs +91 -0
  14. package/dist/commands/task-command.mjs +324 -0
  15. package/dist/harness.mjs +304 -0
  16. package/dist/lib/capability-registry.mjs +643 -0
  17. package/dist/lib/check-module-parallel.mjs +227 -0
  18. package/dist/lib/check-profiles.mjs +414 -0
  19. package/dist/lib/check-task-contracts.mjs +54 -0
  20. package/dist/lib/core-shared.mjs +254 -0
  21. package/dist/lib/dashboard-data.mjs +608 -0
  22. package/dist/lib/dashboard-workbench.mjs +334 -0
  23. package/dist/lib/dashboard-writer.mjs +200 -0
  24. package/dist/lib/git-status-summary.mjs +45 -0
  25. package/dist/lib/governance-index-generator.mjs +236 -0
  26. package/dist/lib/governance-sync.mjs +617 -0
  27. package/dist/lib/governance-table-boundary.mjs +161 -0
  28. package/{scripts → dist}/lib/harness-core.mjs +2 -0
  29. package/dist/lib/harness-paths.mjs +338 -0
  30. package/dist/lib/lesson-maintenance.mjs +139 -0
  31. package/dist/lib/markdown-utils.mjs +193 -0
  32. package/dist/lib/migration-planner.mjs +439 -0
  33. package/dist/lib/migration-support.mjs +317 -0
  34. package/dist/lib/phase-kind.mjs +46 -0
  35. package/dist/lib/preset-audit-contracts.mjs +40 -0
  36. package/dist/lib/preset-engine.mjs +516 -0
  37. package/dist/lib/preset-registry.mjs +831 -0
  38. package/dist/lib/preset-resource-contracts.mjs +83 -0
  39. package/dist/lib/review-confirm-git-gate.mjs +244 -0
  40. package/dist/lib/status-builder.mjs +87 -0
  41. package/{scripts → dist}/lib/status-dashboard-renderer.mjs +44 -46
  42. package/dist/lib/structure-migration.mjs +404 -0
  43. package/dist/lib/subagent-authorization-audit.mjs +198 -0
  44. package/dist/lib/task-audit-metadata.mjs +376 -0
  45. package/dist/lib/task-audit-migration.mjs +355 -0
  46. package/dist/lib/task-completion-consistency.mjs +29 -0
  47. package/dist/lib/task-index.mjs +133 -0
  48. package/dist/lib/task-lesson-candidates.mjs +239 -0
  49. package/dist/lib/task-lesson-sedimentation.mjs +300 -0
  50. package/dist/lib/task-lifecycle/create-task-helpers.mjs +84 -0
  51. package/dist/lib/task-lifecycle/phase-sync.mjs +82 -0
  52. package/dist/lib/task-lifecycle/review-confirm.mjs +93 -0
  53. package/dist/lib/task-lifecycle/review-gates.mjs +62 -0
  54. package/dist/lib/task-lifecycle/review-submission.mjs +52 -0
  55. package/dist/lib/task-lifecycle/scaffold-provenance.mjs +54 -0
  56. package/dist/lib/task-lifecycle/template-files.mjs +52 -0
  57. package/dist/lib/task-lifecycle/text-utils.mjs +26 -0
  58. package/dist/lib/task-lifecycle.mjs +611 -0
  59. package/dist/lib/task-metadata.mjs +116 -0
  60. package/dist/lib/task-review-model.mjs +474 -0
  61. package/dist/lib/task-scanner.mjs +439 -0
  62. package/dist/lib/task-tombstone-commands.mjs +125 -0
  63. package/dist/postinstall.mjs +14 -0
  64. package/dist/run-built-tests.mjs +84 -0
  65. package/docs-release/README.md +1 -0
  66. package/docs-release/architecture/overview.md +12 -12
  67. package/docs-release/architecture/overview.zh-CN.md +12 -12
  68. package/docs-release/architecture/system-explainer/01-system-overview.md +15 -14
  69. package/docs-release/architecture/system-explainer/02-module-dependency.md +8 -8
  70. package/docs-release/architecture/system-explainer/03-task-lifecycle.md +3 -3
  71. package/docs-release/architecture/system-explainer/04-check-and-governance.md +9 -7
  72. package/docs-release/architecture/system-explainer/05-data-flow.md +5 -5
  73. package/docs-release/architecture/system-explainer/06-preset-and-migration.md +1 -4
  74. package/docs-release/architecture/system-explainer/en-US/01-system-overview.md +15 -14
  75. package/docs-release/architecture/system-explainer/en-US/02-module-dependency.md +8 -8
  76. package/docs-release/architecture/system-explainer/en-US/03-task-lifecycle.md +3 -3
  77. package/docs-release/architecture/system-explainer/en-US/04-check-and-governance.md +10 -8
  78. package/docs-release/architecture/system-explainer/en-US/05-data-flow.md +5 -5
  79. package/docs-release/architecture/system-explainer/en-US/06-preset-and-migration.md +1 -4
  80. package/docs-release/guides/agent-installation.en-US.md +14 -8
  81. package/docs-release/guides/agent-installation.md +14 -8
  82. package/docs-release/guides/contributing.md +3 -3
  83. package/docs-release/guides/contributing.zh-CN.md +3 -3
  84. package/docs-release/guides/document-audience-and-surfaces.en-US.md +10 -10
  85. package/docs-release/guides/document-audience-and-surfaces.md +10 -10
  86. package/docs-release/guides/legacy-migration-agent-prompt.md +25 -2
  87. package/docs-release/guides/legacy-migration-agent-prompt.zh-CN.md +25 -2
  88. package/docs-release/guides/migration-playbook.en-US.md +63 -1
  89. package/docs-release/guides/migration-playbook.md +59 -1
  90. package/docs-release/guides/parent-control-repository-pattern.en-US.md +25 -25
  91. package/docs-release/guides/parent-control-repository-pattern.md +25 -25
  92. package/docs-release/guides/preset-development.md +2 -2
  93. package/docs-release/guides/repository-operating-models.en-US.md +21 -21
  94. package/docs-release/guides/repository-operating-models.md +21 -21
  95. package/docs-release/guides/task-state-machine.en-US.md +5 -5
  96. package/docs-release/guides/task-state-machine.md +5 -5
  97. package/docs-release/guides/typescript-runtime-migration-closeout.md +96 -0
  98. package/examples/minimal-project/AGENTS.md +2 -2
  99. package/examples/minimal-project/coding-agent-harness/harness.yaml +14 -0
  100. package/examples/minimal-project/coding-agent-harness/planning/tasks/demo-task/progress.md +11 -0
  101. package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/review.md +1 -1
  102. package/package.json +20 -12
  103. package/presets/legacy-migration/preset.yaml +5 -5
  104. package/presets/legacy-migration/templates/execution_strategy.append.md +1 -1
  105. package/presets/lesson-sedimentation/preset.yaml +3 -3
  106. package/presets/module/preset.yaml +2 -2
  107. package/presets/module/templates/execution_strategy.append.md +1 -1
  108. package/presets/module/templates/task_plan.append.md +3 -3
  109. package/presets/standard-task/preset.yaml +2 -2
  110. package/references/adversarial-review-standard.md +2 -2
  111. package/references/agents-md-pattern.md +14 -14
  112. package/references/cadence-ledger.md +1 -1
  113. package/references/ci-cd-standard.md +1 -1
  114. package/references/delivery-operating-model-standard.md +4 -4
  115. package/references/docs-directory-standard.md +65 -159
  116. package/references/external-source-intake-standard.md +10 -10
  117. package/references/harness-ledger.md +5 -5
  118. package/references/legacy-12-phase-bootstrap.md +2 -2
  119. package/references/lessons-governance.md +15 -15
  120. package/references/long-running-task-standard.md +6 -6
  121. package/references/module-parallel-standard.md +34 -34
  122. package/references/planning-loop.md +6 -6
  123. package/references/project-onboarding-audit.md +4 -4
  124. package/references/regression-system.md +2 -2
  125. package/references/repo-governance-standard.md +4 -4
  126. package/references/review-routing-standard.md +1 -1
  127. package/references/ssot-governance.md +19 -19
  128. package/references/taskr-gap-analysis.md +5 -5
  129. package/references/walkthrough-closeout.md +14 -14
  130. package/references/worktree-parallel.md +3 -3
  131. package/skills/preset-creator/references/complex-task-skeleton/task_plan.md +1 -1
  132. package/skills/preset-creator/references/preset-package-skeleton.md +5 -5
  133. package/templates/AGENTS.md.template +26 -26
  134. package/templates/architecture/README.md +4 -4
  135. package/templates/architecture/service-catalog.md +2 -2
  136. package/templates/architecture/services/service-template.md +1 -1
  137. package/templates/dashboard/assets/app-src/20-overview.js +11 -5
  138. package/templates/dashboard/assets/app-src/40-modules.js +1 -1
  139. package/templates/dashboard/assets/app.js +12 -6
  140. package/templates/dashboard/assets/i18n.js +4 -2
  141. package/templates/development/README.md +10 -10
  142. package/templates/development/cross-repo-debugging.md +3 -3
  143. package/templates/development/external-context/service-template.md +2 -2
  144. package/templates/development/external-source-packs/README.md +4 -4
  145. package/templates/integrations/README.md +4 -4
  146. package/templates/integrations/api-contract.md +2 -2
  147. package/templates/integrations/event-contract.md +2 -2
  148. package/templates/integrations/third-party/vendor-template.md +2 -2
  149. package/templates/integrations/webhook-contract.md +2 -2
  150. package/templates/ledger/Harness-Ledger.md +1 -1
  151. package/templates/planning/INDEX.md +1 -0
  152. package/templates/planning/module_session_prompt.md +1 -1
  153. package/templates/planning/task_plan.md +1 -1
  154. package/templates/planning/walkthrough.md +47 -0
  155. package/templates/reference/docs-library-standard.md +8 -8
  156. package/templates/reference/external-source-intake-standard.md +15 -15
  157. package/templates/reference/repo-governance-standard.md +1 -1
  158. package/templates/ssot/Module-Registry.md +1 -1
  159. package/templates/walkthrough/walkthrough-template.md +2 -2
  160. package/templates-zh-CN/AGENTS.md.template +26 -26
  161. package/templates-zh-CN/CLAUDE.md.template +1 -1
  162. package/templates-zh-CN/architecture/README.md +4 -4
  163. package/templates-zh-CN/architecture/service-catalog.md +2 -2
  164. package/templates-zh-CN/architecture/services/service-template.md +1 -1
  165. package/templates-zh-CN/development/README.md +10 -10
  166. package/templates-zh-CN/development/cross-repo-debugging.md +3 -3
  167. package/templates-zh-CN/development/external-context/service-template.md +2 -2
  168. package/templates-zh-CN/development/external-source-packs/README.md +4 -4
  169. package/templates-zh-CN/integrations/README.md +4 -4
  170. package/templates-zh-CN/integrations/api-contract.md +2 -2
  171. package/templates-zh-CN/integrations/event-contract.md +2 -2
  172. package/templates-zh-CN/integrations/third-party/vendor-template.md +2 -2
  173. package/templates-zh-CN/integrations/webhook-contract.md +2 -2
  174. package/templates-zh-CN/ledger/Harness-Ledger.md +1 -1
  175. package/templates-zh-CN/lessons/lesson-arch-process-change.md +1 -1
  176. package/templates-zh-CN/lessons/lesson-new-doc.md +3 -3
  177. package/templates-zh-CN/lessons/lesson-ref-change.md +4 -4
  178. package/templates-zh-CN/planning/module_session_prompt.md +11 -11
  179. package/templates-zh-CN/planning/walkthrough.md +47 -0
  180. package/templates-zh-CN/reference/adversarial-review-standard.md +2 -2
  181. package/templates-zh-CN/reference/delivery-operating-model-standard.md +3 -3
  182. package/templates-zh-CN/reference/docs-library-standard.md +28 -28
  183. package/templates-zh-CN/reference/execution-workflow-standard.md +1 -1
  184. package/templates-zh-CN/reference/external-source-intake-standard.md +16 -16
  185. package/templates-zh-CN/reference/harness-ledger-standard.md +6 -6
  186. package/templates-zh-CN/reference/regression-ssot-governance.md +2 -2
  187. package/templates-zh-CN/reference/repo-governance-standard.md +1 -1
  188. package/templates-zh-CN/reference/review-routing-standard.md +1 -1
  189. package/templates-zh-CN/reference/walkthrough-standard.md +7 -7
  190. package/templates-zh-CN/reference/worktree-standard.md +1 -1
  191. package/templates-zh-CN/regression/Cadence-Ledger.md +2 -2
  192. package/templates-zh-CN/ssot/Delivery-SSoT.md +3 -3
  193. package/templates-zh-CN/ssot/Module-Registry.md +3 -3
  194. package/templates-zh-CN/ssot/Regression-SSoT.md +2 -2
  195. package/templates-zh-CN/walkthrough/walkthrough-template.md +5 -5
  196. package/tsconfig.dist.json +16 -0
  197. package/tsconfig.json +25 -0
  198. package/tsconfig.runtime.json +24 -0
  199. package/examples/minimal-project/.harness-capabilities.json +0 -8
  200. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/progress.md +0 -11
  201. package/scripts/check-harness.mjs +0 -508
  202. package/scripts/commands/dashboard-command.mjs +0 -67
  203. package/scripts/commands/migration-command.mjs +0 -126
  204. package/scripts/commands/preset-command.mjs +0 -73
  205. package/scripts/commands/task-command.mjs +0 -328
  206. package/scripts/harness.mjs +0 -291
  207. package/scripts/lib/capability-registry.mjs +0 -587
  208. package/scripts/lib/check-module-parallel.mjs +0 -230
  209. package/scripts/lib/check-profiles.mjs +0 -372
  210. package/scripts/lib/check-task-contracts.mjs +0 -55
  211. package/scripts/lib/core-shared.mjs +0 -249
  212. package/scripts/lib/dashboard-data.mjs +0 -520
  213. package/scripts/lib/dashboard-workbench.mjs +0 -336
  214. package/scripts/lib/dashboard-writer.mjs +0 -202
  215. package/scripts/lib/git-status-summary.mjs +0 -46
  216. package/scripts/lib/governance-index-generator.mjs +0 -174
  217. package/scripts/lib/governance-sync.mjs +0 -611
  218. package/scripts/lib/governance-table-boundary.mjs +0 -175
  219. package/scripts/lib/lesson-maintenance.mjs +0 -152
  220. package/scripts/lib/markdown-utils.mjs +0 -191
  221. package/scripts/lib/migration-planner.mjs +0 -476
  222. package/scripts/lib/migration-support.mjs +0 -312
  223. package/scripts/lib/phase-kind.mjs +0 -50
  224. package/scripts/lib/preset-audit-contracts.mjs +0 -37
  225. package/scripts/lib/preset-engine.mjs +0 -494
  226. package/scripts/lib/preset-registry.mjs +0 -776
  227. package/scripts/lib/preset-resource-contracts.mjs +0 -83
  228. package/scripts/lib/review-confirm-git-gate.mjs +0 -248
  229. package/scripts/lib/status-builder.mjs +0 -88
  230. package/scripts/lib/subagent-authorization-audit.mjs +0 -196
  231. package/scripts/lib/task-audit-metadata.mjs +0 -385
  232. package/scripts/lib/task-audit-migration.mjs +0 -350
  233. package/scripts/lib/task-completion-consistency.mjs +0 -26
  234. package/scripts/lib/task-index.mjs +0 -93
  235. package/scripts/lib/task-lesson-candidates.mjs +0 -242
  236. package/scripts/lib/task-lesson-sedimentation.mjs +0 -326
  237. package/scripts/lib/task-lifecycle/create-task-helpers.mjs +0 -67
  238. package/scripts/lib/task-lifecycle/phase-sync.mjs +0 -88
  239. package/scripts/lib/task-lifecycle/review-confirm.mjs +0 -112
  240. package/scripts/lib/task-lifecycle/review-gates.mjs +0 -73
  241. package/scripts/lib/task-lifecycle/review-submission.mjs +0 -63
  242. package/scripts/lib/task-lifecycle/scaffold-provenance.mjs +0 -49
  243. package/scripts/lib/task-lifecycle/template-files.mjs +0 -53
  244. package/scripts/lib/task-lifecycle/text-utils.mjs +0 -24
  245. package/scripts/lib/task-lifecycle.mjs +0 -616
  246. package/scripts/lib/task-metadata.mjs +0 -118
  247. package/scripts/lib/task-review-model.mjs +0 -455
  248. package/scripts/lib/task-scanner.mjs +0 -503
  249. package/scripts/lib/task-tombstone-commands.mjs +0 -140
  250. package/scripts/postinstall.mjs +0 -14
  251. package/templates/walkthrough/Closeout-SSoT.md +0 -43
  252. package/templates-zh-CN/walkthrough/Closeout-SSoT.md +0 -42
  253. /package/examples/minimal-project/{docs → coding-agent-harness/governance/generated}/Harness-Ledger.md +0 -0
  254. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/INDEX.md +0 -0
  255. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/brief.md +0 -0
  256. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/execution_strategy.md +0 -0
  257. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/findings.md +0 -0
  258. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/lesson_candidates.md +0 -0
  259. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/task_plan.md +0 -0
  260. /package/examples/minimal-project/{docs/09-PLANNING/TASKS → coding-agent-harness/planning/tasks}/demo-task/visual_map.md +0 -0
@@ -0,0 +1,236 @@
1
+ // @ts-nocheck
2
+ // Governance index rendering stays behavior-first until task/governance surface types are modeled.
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { normalizeTarget, readBundledTemplate, todayDate, toPosix, } from "./core-shared.mjs";
6
+ import { splitMarkdownRow } from "./markdown-utils.mjs";
7
+ import { collectTasks } from "./task-scanner.mjs";
8
+ import { buildTaskIndex } from "./task-index.mjs";
9
+ import { beginGovernanceSync, commitGovernanceSync, moduleGeneratedIndexSurfaces, releaseGovernanceSync, } from "./governance-sync.mjs";
10
+ import { markdownCell } from "./task-lifecycle/text-utils.mjs";
11
+ export function rebuildGovernanceIndexes(targetInput, { dryRun = false, archive = false, apply = false } = {}) {
12
+ const target = normalizeTarget(targetInput);
13
+ const effectiveApply = Boolean(apply && !dryRun);
14
+ const context = beginGovernanceSync(target, { operation: "governance rebuild", dryRun: !effectiveApply });
15
+ try {
16
+ const tasks = collectTasks(target)
17
+ .filter((task) => task.deletionState !== "deleted")
18
+ .sort((a, b) => String(a.id).localeCompare(String(b.id)));
19
+ const surfaces = [...governanceSurfaces(target, tasks), ...taskIndexSurfaces(target, tasks), ...moduleGeneratedIndexSurfaces(target, tasks)];
20
+ const archiveDir = archive ? uniqueArchiveDir(target) : "";
21
+ const changes = surfaces.map((surface) => ({
22
+ surface: surface.surface,
23
+ destination: surface.relative,
24
+ action: surface.archiveOnly
25
+ ? apply ? "archive-legacy-governance-table" : "would-archive-legacy-governance-table"
26
+ : apply ? "rebuild-governance-index" : "would-rebuild-governance-index",
27
+ generatedRows: surface.rows.length,
28
+ archive: archive ? `${archiveDir}/${surface.relative}` : "",
29
+ }));
30
+ if (!effectiveApply) {
31
+ return { dryRun: true, archive, applied: false, archiveDir, changes };
32
+ }
33
+ const allowed = [];
34
+ for (const surface of surfaces) {
35
+ if (archive && fs.existsSync(surface.absolute)) {
36
+ const archivePath = path.join(target.projectRoot, archiveDir, surface.relative);
37
+ fs.mkdirSync(path.dirname(archivePath), { recursive: true });
38
+ fs.copyFileSync(surface.absolute, archivePath);
39
+ allowed.push(toPosix(path.relative(target.projectRoot, archivePath)));
40
+ }
41
+ if (surface.archiveOnly) {
42
+ if (archive && fs.existsSync(surface.absolute)) {
43
+ fs.rmSync(surface.absolute);
44
+ allowed.push(surface.relative);
45
+ }
46
+ continue;
47
+ }
48
+ fs.mkdirSync(path.dirname(surface.absolute), { recursive: true });
49
+ fs.writeFileSync(surface.absolute, surface.content);
50
+ allowed.push(surface.relative);
51
+ }
52
+ const commit = commitGovernanceSync(context, allowed, { message: "chore(harness): rebuild generated governance indexes" });
53
+ return { dryRun: false, archive, applied: true, archiveDir, changes, commit };
54
+ }
55
+ finally {
56
+ releaseGovernanceSync(context);
57
+ }
58
+ }
59
+ function governanceSurfaces(target, tasks) {
60
+ return [
61
+ {
62
+ surface: "harness-ledger",
63
+ absolute: target.harness.ledgerPath,
64
+ relative: toPosix(path.relative(target.projectRoot, target.harness.ledgerPath)),
65
+ rows: tasks.map(ledgerRow),
66
+ content: replaceTableRows(readBundledTemplate("templates/ledger/Harness-Ledger.md"), /^ID$/i, tasks.map(ledgerRow)),
67
+ },
68
+ ...legacyFeatureSurfaces(target),
69
+ ];
70
+ }
71
+ function legacyFeatureSurfaces(target) {
72
+ return [
73
+ ["legacy-feature-ssot", path.join(target.harness.planningRoot, "Feature-SSoT.md")],
74
+ ["legacy-private-feature-ssot", path.join(target.harness.planningRoot, "Private-Feature-SSoT.md")],
75
+ ].filter(([, absolute]) => fs.existsSync(absolute)).map(([surface, absolute]) => ({
76
+ surface,
77
+ absolute,
78
+ relative: toPosix(path.relative(target.projectRoot, absolute)),
79
+ rows: [],
80
+ content: "",
81
+ archiveOnly: true,
82
+ }));
83
+ }
84
+ function taskIndexSurfaces(target, tasks) {
85
+ const planningGeneratedRoot = path.join(target.harness.planningRoot, "generated");
86
+ const taskIndexJson = buildTaskIndex(target.projectRoot);
87
+ const taskIndexRows = tasks.map((task) => [
88
+ task.taskKey || task.id,
89
+ task.title || task.shortId || task.id,
90
+ task.state,
91
+ task.lifecycleState,
92
+ task.reviewStatus,
93
+ task.closeoutStatus,
94
+ task.walkthroughPath || "pending",
95
+ ]);
96
+ const surfaces = [
97
+ {
98
+ surface: "task-index-json",
99
+ absolute: path.join(planningGeneratedRoot, "task-index.json"),
100
+ relative: toPosix(path.relative(target.projectRoot, path.join(planningGeneratedRoot, "task-index.json"))),
101
+ rows: tasks,
102
+ content: `${JSON.stringify(taskIndexJson, null, 2)}\n`,
103
+ },
104
+ {
105
+ surface: "task-index-md",
106
+ absolute: path.join(planningGeneratedRoot, "task-index.md"),
107
+ relative: toPosix(path.relative(target.projectRoot, path.join(planningGeneratedRoot, "task-index.md"))),
108
+ rows: taskIndexRows,
109
+ content: renderTaskIndexMarkdown(taskIndexRows),
110
+ },
111
+ ];
112
+ if (target.harness.version === 2) {
113
+ const closeoutRows = tasks.map((task) => [
114
+ `CO-${taskSlug(task)}`,
115
+ task.taskKey || task.id,
116
+ task.closeoutStatus || "missing",
117
+ stripTarget(task.walkthroughPath) || "pending",
118
+ task.reviewStatus || "pending",
119
+ task.lessonCandidateDecisionComplete ? "checked" : (task.lessonCandidateStatus || "pending"),
120
+ residual(task),
121
+ todayDate(),
122
+ ]);
123
+ surfaces.push({
124
+ surface: "closeout-index",
125
+ absolute: target.harness.closeoutIndexPath,
126
+ relative: toPosix(path.relative(target.projectRoot, target.harness.closeoutIndexPath)),
127
+ rows: closeoutRows,
128
+ content: renderCloseoutIndexMarkdown(closeoutRows),
129
+ });
130
+ }
131
+ return surfaces;
132
+ }
133
+ function renderTaskIndexMarkdown(rows) {
134
+ return `# Generated Task Index
135
+
136
+ Generated by \`harness governance rebuild\`. Do not edit by hand.
137
+
138
+ | Task Key | Title | State | Lifecycle | Review | Closeout | Walkthrough |
139
+ | --- | --- | --- | --- | --- | --- | --- |
140
+ ${rows.map((row) => `| ${fitRow(row, 7).join(" | ")} |`).join("\n")}
141
+ `;
142
+ }
143
+ function renderCloseoutIndexMarkdown(rows) {
144
+ return `# Generated Closeout Index
145
+
146
+ Generated from task-local Walkthrough files by \`harness governance rebuild\`. Do not edit by hand.
147
+
148
+ | ID | Task Key | Closeout | Walkthrough | Review | Lessons Check | Residual | Updated |
149
+ | --- | --- | --- | --- | --- | --- | --- | --- |
150
+ ${rows.map((row) => `| ${fitRow(row, 8).join(" | ")} |`).join("\n")}
151
+ `;
152
+ }
153
+ function replaceTableRows(content, headerPattern, rows) {
154
+ const lines = String(content || "").split(/\r?\n/);
155
+ for (let index = 0; index < lines.length - 1; index += 1) {
156
+ if (!lines[index].trim().startsWith("|"))
157
+ continue;
158
+ const header = splitMarkdownRow(lines[index]);
159
+ if (!header.some((cell) => headerPattern.test(cell)))
160
+ continue;
161
+ const separator = splitMarkdownRow(lines[index + 1]);
162
+ if (!separator.every((cell) => /^:?-{3,}:?$/.test(cell)))
163
+ continue;
164
+ let end = index + 2;
165
+ while (end < lines.length && lines[end].trim().startsWith("|"))
166
+ end += 1;
167
+ const fitted = rows.map((row) => fitRow(row, header.length));
168
+ lines.splice(index + 2, end - index - 2, ...fitted.map((row) => `| ${row.join(" | ")} |`));
169
+ return `${lines.join("\n").trimEnd()}\n`;
170
+ }
171
+ return `${String(content || "").trimEnd()}\n\n${rows.map((row) => `| ${row.join(" | ")} |`).join("\n")}\n`;
172
+ }
173
+ function fitRow(row, length) {
174
+ const next = row.map((cell) => markdownCell(cell));
175
+ while (next.length < length)
176
+ next.push("");
177
+ return next.slice(0, length);
178
+ }
179
+ function ledgerRow(task) {
180
+ const plan = stripTarget(task.taskPlanPath || `${stripTarget(task.path)}/task_plan.md`);
181
+ const scope = task.module ? "module" : "task";
182
+ const moduleKey = task.module || "none";
183
+ return [
184
+ taskLedgerId(task),
185
+ scope,
186
+ moduleKey,
187
+ task.title || task.shortId || task.id,
188
+ mapLedgerState(task.state),
189
+ Array.isArray(task.taskQueues) && task.taskQueues.length ? task.taskQueues.join(",") : "none",
190
+ plan,
191
+ task.reviewStatus === "confirmed" ? stripTarget(task.reviewPath) : (task.reviewStatus || "pending"),
192
+ task.lessonCandidateDecisionComplete ? "checked" : (task.lessonCandidateStatus || "pending"),
193
+ task.walkthroughPath ? stripTarget(task.walkthroughPath) : (task.closeoutStatus || "pending"),
194
+ residual(task),
195
+ todayDate(),
196
+ ];
197
+ }
198
+ function residual(task) {
199
+ if (Array.isArray(task.stateConflicts) && task.stateConflicts.length)
200
+ return `state-conflicts:${task.stateConflicts.length}`;
201
+ if (Array.isArray(task.materialIssues) && task.materialIssues.length)
202
+ return `material-issues:${task.materialIssues.length}`;
203
+ return "none";
204
+ }
205
+ function taskLedgerId(task) {
206
+ return `HL-${taskSlug(task)}`;
207
+ }
208
+ function taskSlug(task) {
209
+ return String(task.shortId || task.id || "task").replace(/^TASKS\//, "").replace(/^MODULES\//, "").replace(/[^A-Za-z0-9-]+/g, "-").slice(0, 72);
210
+ }
211
+ function stripTarget(value) {
212
+ return String(value || "").replace(/^TARGET:/, "");
213
+ }
214
+ function mapLedgerState(state) {
215
+ if (state === "in_progress")
216
+ return "active";
217
+ if (state === "review")
218
+ return "review";
219
+ if (state === "done")
220
+ return "closed";
221
+ if (state === "blocked")
222
+ return "blocked";
223
+ return "planned";
224
+ }
225
+ function uniqueArchiveDir(target) {
226
+ const stamp = new Date().toISOString().replace(/[-:]/g, "").replace(".", "-");
227
+ const base = target.harness.version === 2
228
+ ? `coding-agent-harness/governance/archive/generated-governance-tables/${stamp}`
229
+ : `docs/01-GOVERNANCE/archive/generated-governance-tables/${stamp}`;
230
+ for (let index = 0; index < 100; index += 1) {
231
+ const candidate = index === 0 ? base : `${base}-${String(index).padStart(2, "0")}`;
232
+ if (!fs.existsSync(path.join(target.projectRoot, candidate)))
233
+ return candidate;
234
+ }
235
+ throw new Error("Unable to allocate a unique governance table archive directory");
236
+ }