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
@@ -1,291 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import fs from "node:fs";
4
- import os from "node:os";
5
- import path from "node:path";
6
- import { createInterface } from "node:readline/promises";
7
- import {
8
- addCapability,
9
- buildStatus,
10
- doctorUserSkill,
11
- installUserSkill,
12
- normalizeLocale,
13
- rebuildGovernanceIndexes,
14
- serveDashboardWorkbench,
15
- validateSourcePackageBoundary,
16
- writeInitFiles,
17
- } from "./lib/harness-core.mjs";
18
- import { runDashboardCommand } from "./commands/dashboard-command.mjs";
19
- import { runMigrationCommand } from "./commands/migration-command.mjs";
20
- import { runPresetCommand } from "./commands/preset-command.mjs";
21
- import { runTaskCommand } from "./commands/task-command.mjs";
22
-
23
- const args = process.argv.slice(2);
24
- const command = args.shift() || "help";
25
-
26
- function takeFlag(name, fallback = false) {
27
- const index = args.indexOf(name);
28
- if (index < 0) return fallback;
29
- args.splice(index, 1);
30
- return true;
31
- }
32
-
33
- function takeOption(name, fallback = "") {
34
- const index = args.indexOf(name);
35
- if (index < 0) return fallback;
36
- const value = args[index + 1] || fallback;
37
- args.splice(index, 2);
38
- return value;
39
- }
40
-
41
- async function resolveInitLocale(requestedLocale) {
42
- if (requestedLocale) return normalizeLocale(requestedLocale);
43
- if (!process.stdin.isTTY || !process.stdout.isTTY) return "en-US";
44
-
45
- const prompt = [
46
- "Select harness language / 选择初始化语言:",
47
- " 1. 中文 (zh-CN)",
48
- " 2. English (en-US)",
49
- "Language [1/2, default 2]: ",
50
- ].join("\n");
51
- const reader = createInterface({ input: process.stdin, output: process.stdout });
52
- try {
53
- const answer = (await reader.question(prompt)).trim().toLowerCase();
54
- if (["1", "zh", "zh-cn", "cn", "中文"].includes(answer)) return "zh-CN";
55
- if (["2", "en", "en-us", "english", "英文", ""].includes(answer)) return "en-US";
56
- console.error(`Unknown language selection: ${answer}. Falling back to en-US.`);
57
- return "en-US";
58
- } finally {
59
- reader.close();
60
- }
61
- }
62
-
63
- async function confirmUserInstall({ yes = false, dryRun = false, agent = "codex" } = {}) {
64
- if (yes || dryRun) return true;
65
- if (!process.stdin.isTTY || !process.stdout.isTTY) return false;
66
- const reader = createInterface({ input: process.stdin, output: process.stdout });
67
- try {
68
- const answer = (await reader.question(`Install Coding Agent Harness into user skill directory for ${agent}? [y/N] `)).trim().toLowerCase();
69
- return ["y", "yes"].includes(answer);
70
- } finally {
71
- reader.close();
72
- }
73
- }
74
-
75
- function targetArg() {
76
- return args[args.length - 1] && !args[args.length - 1].startsWith("-") ? args[args.length - 1] : ".";
77
- }
78
-
79
- function printHelp() {
80
- console.log(`Coding Agent Harness
81
-
82
- Usage:
83
- harness check [--profile source-package|private-harness|target-project] [target]
84
- harness status [--json] [--strict] [target]
85
- harness dev [--no-open] [--out-dir folder] [--host 127.0.0.1] [--port n] [target]
86
- harness dashboard [--out file.html] [--out-dir folder] [--workbench] [--host 127.0.0.1] [--port n] [target]
87
- harness init [--dry-run] [--locale zh-CN|en-US] [--capabilities core,dashboard] [--add-npm-scripts] [target]
88
- harness add-capability <name> [--dry-run] [--locale zh-CN|en-US] [target]
89
- harness migrate-plan [--json] [--limit n] [target]
90
- harness migrate-task-audit-index [--plan] [--apply] [--json] [target]
91
- harness migrate-run [--locale zh-CN|en-US] [--assume-locale] [--allow-dirty] [--plan-only] [--out-dir folder] [--session-dir folder] [target]
92
- harness migrate-verify [--json] [--full-cutover] <session.json>
93
- harness governance rebuild [--dry-run] [--archive] [--apply] [target]
94
- harness preset list [--json] [target]
95
- harness preset inspect <id> [--json] [target]
96
- harness preset check <id> [--json] [target]
97
- harness preset install <folder|zip|builtin-id> [--project] [--force] [--json] [target]
98
- harness preset seed [--project] [--force] [--dry-run] [--json] [target]
99
- harness preset uninstall <id> [--project] [--json] [target]
100
- harness new-task [task-id] [--module key] [--budget simple|standard|complex] [--preset id] [--from-session session.json] [--long-running] [--title title] [--locale zh-CN|en-US] [--dry-run] [target]
101
- harness task-start <task-id> [--message text] [target]
102
- harness task-phase <task-id> <phase-id> [--state done] [--completion 100] [--evidence present] [target]
103
- harness task-log <task-id> --message text [--evidence type:PATH:summary] [target]
104
- harness task-block <task-id> [--message text] [target]
105
- harness task-review <task-id> [--message text] [target]
106
- harness review-confirm <task-id> --confirm task-id [--reviewer name] [--message text] [target]
107
- harness lesson-promote <task-id> <candidate-id> [--dry-run|--apply] [target]
108
- harness lesson-sediment <task-id> <candidate-id> [--dry-run] [--title title] [target]
109
- harness task-complete <task-id> [--message text] [target]
110
- harness task-list [--json] [--state state] [--module key] [--queue queue] [--preset id] [--review status] [--lesson status] [--missing-materials] [--search text] [target]
111
- harness task-index [--json] [target]
112
- harness task-supersede <old-task-id> --by <new-task-id> [--reason text] [target]
113
- harness task-delete <task-id> --soft [--reason text] [target]
114
- harness task-archive <task-id> [--reason text] [target]
115
- harness task-reopen <task-id> [--reason text] [target]
116
- harness module-step <module-key> <step-id> [--state done|in-progress|blocked] [target]
117
- harness install-user [--agent codex|claude|gemini|openclaw|agents|all] [--home dir] [--dry-run] [--force] [--skip-presets] [--yes]
118
- harness doctor-user [--agent codex|claude|gemini|openclaw|agents|all] [--home dir]
119
-
120
- If init runs in an interactive terminal and --locale is omitted, it asks for a
121
- language. Non-interactive init defaults to en-US.
122
-
123
- Preset discovery:
124
- Project presets live in <target>/.coding-agent-harness/presets/<preset-id>/.
125
- User presets live in ~/.coding-agent-harness/presets/<preset-id>/.
126
- Harness discovers project presets first when a target is supplied, then user
127
- presets, then bundled package presets under presets/<preset-id>/.
128
- "harness init" seeds bundled presets into the target project. "harness
129
- install-user" and npm postinstall seed bundled presets into the user root.
130
- Use "harness preset seed" to repair or re-run preset seeding.
131
- Use "harness preset install" with a local preset folder, .zip archive, or
132
- bundled preset id. Preset archives must contain preset.yaml at the archive
133
- root or inside one top-level folder.
134
- Use "harness preset list --json" to see available presets, their source,
135
- purpose, compatible budgets, and manifest path. Use "harness preset inspect
136
- <id> --json" for the full preset manifest summary.
137
- `);
138
- }
139
-
140
- function exitWithReport(report) {
141
- for (const warning of report.warnings || []) console.log(`Warning: ${warning}`);
142
- for (const failure of report.failures || []) console.error(`Failure: ${failure}`);
143
- process.exit((report.failures || []).length > 0 ? 1 : 0);
144
- }
145
-
146
- if (command === "help" || command === "--help" || command === "-h") {
147
- printHelp();
148
- } else if (args[0] === "help" || args.includes("--help") || args.includes("-h")) {
149
- printHelp();
150
- } else if (command === "check") {
151
- const profile = takeOption("--profile", "target-project");
152
- const strict = takeFlag("--strict");
153
- const target = targetArg();
154
- const failures = [];
155
- const warnings = [];
156
-
157
- if (profile === "source-package") {
158
- for (const required of ["package.json", "scripts/harness.mjs", "scripts/check-harness.mjs", "templates/planning/task_plan.md"]) {
159
- if (!fs.existsSync(path.resolve(target, required))) failures.push(`missing source package file: ${required}`);
160
- }
161
- const boundary = validateSourcePackageBoundary(target);
162
- failures.push(...boundary.failures);
163
- warnings.push(...boundary.warnings);
164
- }
165
-
166
- const status = buildStatus(target, { skipLegacyCheck: profile === "source-package", strictLegacy: strict, strict });
167
- failures.push(...status.checkState.details.failures);
168
- warnings.push(...status.checkState.details.warnings);
169
-
170
- if (!["source-package", "private-harness", "target-project"].includes(profile)) failures.push(`unknown profile: ${profile}`);
171
- if (failures.length === 0) console.log(`Harness check passed (${profile}): ${path.resolve(target)}`);
172
- exitWithReport({ failures: [...new Set(failures)], warnings: [...new Set(warnings)] });
173
- } else if (command === "status") {
174
- const json = takeFlag("--json");
175
- const strict = takeFlag("--strict");
176
- const status = buildStatus(targetArg(), { strictLegacy: strict, strict });
177
- if (json) {
178
- console.log(JSON.stringify(status, null, 2));
179
- } else {
180
- console.log(`${status.project.name}: ${status.checkState.status} (${status.checkState.failures} failures, ${status.checkState.warnings} warnings)`);
181
- console.log(`mode: ${status.mode}`);
182
- console.log(`capabilities: ${status.capabilities.map((capability) => `${capability.name}:${capability.state}`).join(", ")}`);
183
- console.log(`tasks: ${status.tasks.length}`);
184
- }
185
- process.exitCode = status.checkState.status === "fail" ? 1 : 0;
186
- } else if (command === "dev") {
187
- const open = !takeFlag("--no-open");
188
- const outDir = takeOption("--out-dir", "");
189
- const host = takeOption("--host", "127.0.0.1");
190
- const port = takeOption("--port", "0");
191
- const localeOverride = takeOption("--locale", "");
192
- const target = targetArg();
193
- const usesDefaultOutDir = !outDir;
194
- const dashboardOutDir = outDir || defaultDevOutDir(target);
195
- const opts = { ...(localeOverride ? { localeOverride } : {}), recoverGeneratedDashboard: usesDefaultOutDir };
196
- try {
197
- await serveDashboardWorkbench(dashboardOutDir, target, { ...opts, host, port, autoRefresh: true, open, label: "harness dev" });
198
- } catch (error) {
199
- console.error(error.message);
200
- process.exit(1);
201
- }
202
- } else if (command === "dashboard") {
203
- await runDashboardCommand({ takeFlag, takeOption, targetArg });
204
- } else if (command === "init") {
205
- const dryRun = takeFlag("--dry-run");
206
- const addNpmScripts = takeFlag("--add-npm-scripts");
207
- const locale = await resolveInitLocale(takeOption("--locale", ""));
208
- const capabilities = takeOption("--capabilities", "core").split(",").map((item) => item.trim()).filter(Boolean);
209
- try {
210
- const result = writeInitFiles(targetArg(), capabilities, { dryRun, locale, addNpmScripts });
211
- console.log(JSON.stringify({ dryRun, locale: result.locale, capabilities: result.capabilities, changes: result.changes, presetSeed: result.presetSeed, nextCommands: result.nextCommands, report: result.report }, null, 2));
212
- } catch (error) {
213
- console.error(error.message);
214
- process.exit(1);
215
- }
216
- } else if (command === "add-capability") {
217
- const dryRun = takeFlag("--dry-run");
218
- const locale = normalizeLocale(takeOption("--locale", ""));
219
- const capability = args.shift();
220
- if (!capability) {
221
- console.error("Missing capability name");
222
- process.exit(2);
223
- }
224
- try {
225
- const result = addCapability(targetArg(), capability, { dryRun, locale });
226
- console.log(JSON.stringify({ dryRun, registry: result.registry, changes: result.changes, report: result.report }, null, 2));
227
- } catch (error) {
228
- console.error(error.message);
229
- process.exit(1);
230
- }
231
- } else if (["migrate-plan", "migrate-run", "migrate-verify", "migrate-task-audit-index"].includes(command)) {
232
- runMigrationCommand(command, { args, takeFlag, takeOption, targetArg });
233
- } else if (command === "governance") {
234
- const subcommand = args.shift() || "";
235
- if (subcommand !== "rebuild") {
236
- console.error(`Unknown governance subcommand: ${subcommand || "(missing)"}`);
237
- process.exit(2);
238
- }
239
- const dryRun = takeFlag("--dry-run");
240
- const archive = takeFlag("--archive");
241
- const apply = takeFlag("--apply");
242
- try {
243
- console.log(JSON.stringify(rebuildGovernanceIndexes(targetArg(), { dryRun, archive, apply }), null, 2));
244
- } catch (error) {
245
- console.error(error.message);
246
- process.exit(1);
247
- }
248
- } else if (command === "preset") {
249
- runPresetCommand({ args, takeFlag, targetArg });
250
- } else if (["new-task", "task-phase", "task-start", "task-log", "task-block", "task-review", "task-complete", "review-confirm", "lesson-promote", "lesson-sediment", "task-list", "task-index", "task-supersede", "task-delete", "task-archive", "task-reopen", "module-step"].includes(command)) {
251
- runTaskCommand(command, { args, takeFlag, takeOption, targetArg });
252
- } else if (command === "install-user") {
253
- const dryRun = takeFlag("--dry-run");
254
- const force = takeFlag("--force");
255
- const yes = takeFlag("--yes") || takeFlag("-y");
256
- const skipPresets = takeFlag("--skip-presets");
257
- takeFlag("--global");
258
- const agent = takeOption("--agent", "codex");
259
- const home = takeOption("--home", "");
260
- if (!(await confirmUserInstall({ yes, dryRun, agent }))) {
261
- console.error("Refusing to write user skill files without confirmation. Re-run with --yes or --dry-run.");
262
- process.exit(2);
263
- }
264
- try {
265
- console.log(JSON.stringify(installUserSkill({ agent, home, dryRun, force, seedPresets: !skipPresets }), null, 2));
266
- } catch (error) {
267
- console.error(error.message);
268
- process.exit(1);
269
- }
270
- } else if (command === "doctor-user") {
271
- const agent = takeOption("--agent", "codex");
272
- const home = takeOption("--home", "");
273
- try {
274
- const report = doctorUserSkill({ agent, home });
275
- console.log(JSON.stringify(report, null, 2));
276
- process.exit(report.status === "pass" ? 0 : 1);
277
- } catch (error) {
278
- console.error(error.message);
279
- process.exit(1);
280
- }
281
- } else {
282
- printHelp();
283
- process.exit(2);
284
- }
285
-
286
- function defaultDevOutDir(targetInput) {
287
- const target = path.resolve(targetInput || ".");
288
- const name = path.basename(target) || "project";
289
- const hash = Buffer.from(target).toString("hex").slice(0, 16);
290
- return path.join(os.tmpdir(), "coding-agent-harness-dev", `${name}-${hash}`);
291
- }