coding-agent-harness 1.0.1 → 1.0.4

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 (262) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/CONTRIBUTING.md +98 -0
  3. package/README.en-US.md +14 -0
  4. package/README.md +230 -80
  5. package/README.zh-CN.md +290 -0
  6. package/SKILL.md +132 -198
  7. package/docs-release/README.md +80 -9
  8. package/docs-release/architecture/overview.md +298 -28
  9. package/docs-release/architecture/overview.zh-CN.md +292 -0
  10. package/docs-release/assets/dashboard-overview.png +0 -0
  11. package/docs-release/assets/harness-architecture.svg +163 -0
  12. package/docs-release/assets/harness-workflow.svg +64 -0
  13. package/docs-release/guides/agent-installation.en-US.md +237 -0
  14. package/docs-release/guides/agent-installation.md +149 -27
  15. package/docs-release/guides/contributing.md +100 -0
  16. package/docs-release/guides/contributing.zh-CN.md +99 -0
  17. package/docs-release/guides/document-audience-and-surfaces.en-US.md +113 -0
  18. package/docs-release/guides/document-audience-and-surfaces.md +113 -0
  19. package/docs-release/guides/full-legacy-migration-subagent-strategy.md +334 -0
  20. package/docs-release/guides/full-legacy-migration-subagent-strategy.zh-CN.md +334 -0
  21. package/docs-release/guides/legacy-migration-agent-prompt.md +373 -0
  22. package/docs-release/guides/legacy-migration-agent-prompt.zh-CN.md +350 -0
  23. package/docs-release/guides/migration-playbook.en-US.md +324 -0
  24. package/docs-release/guides/migration-playbook.md +328 -0
  25. package/docs-release/guides/parent-control-repository-pattern.en-US.md +254 -0
  26. package/docs-release/guides/parent-control-repository-pattern.md +254 -0
  27. package/docs-release/guides/preset-development.md +214 -0
  28. package/docs-release/guides/repository-operating-models.en-US.md +197 -0
  29. package/docs-release/guides/repository-operating-models.md +197 -0
  30. package/docs-release/guides/task-state-machine.en-US.md +207 -0
  31. package/docs-release/guides/task-state-machine.md +214 -0
  32. package/docs-release/intl/README.md +15 -0
  33. package/docs-release/intl/de-DE.md +18 -0
  34. package/docs-release/intl/en-US.md +18 -0
  35. package/docs-release/intl/es-ES.md +18 -0
  36. package/docs-release/intl/fr-FR.md +18 -0
  37. package/docs-release/intl/ja-JP.md +18 -0
  38. package/docs-release/intl/ko-KR.md +18 -0
  39. package/docs-release/intl/zh-CN.md +18 -0
  40. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/brief.md +13 -0
  41. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/findings.md +7 -0
  42. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/lesson_candidates.md +24 -0
  43. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/progress.md +1 -1
  44. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/task_plan.md +4 -2
  45. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/{visual_roadmap.md → visual_map.md} +9 -1
  46. package/package.json +10 -3
  47. package/presets/legacy-migration/checks/preset-check.mjs +3 -0
  48. package/presets/legacy-migration/preset.yaml +134 -0
  49. package/presets/legacy-migration/scripts/plan-work-queue.mjs +4 -0
  50. package/presets/legacy-migration/scripts/scaffold-task-contracts.mjs +4 -0
  51. package/presets/legacy-migration/templates/execution_strategy.append.md +18 -0
  52. package/presets/legacy-migration/templates/findings.seed.md +17 -0
  53. package/presets/legacy-migration/templates/review.seed.md +12 -0
  54. package/presets/legacy-migration/templates/task_plan.append.md +9 -0
  55. package/presets/legacy-migration/templates/visual_map.append.md +12 -0
  56. package/presets/legacy-migration/workbench/dashboard-panels.yaml +2 -0
  57. package/presets/legacy-migration/workbench/migration-queue.schema.json +23 -0
  58. package/presets/lesson-sedimentation/preset.yaml +23 -0
  59. package/presets/lesson-sedimentation/templates/prompt.md +23 -0
  60. package/presets/module/preset.yaml +25 -0
  61. package/presets/module/templates/execution_strategy.append.md +8 -0
  62. package/presets/module/templates/task_plan.append.md +17 -0
  63. package/presets/standard-task/preset.yaml +31 -0
  64. package/presets/standard-task/templates/task_plan.append.md +7 -0
  65. package/references/adversarial-review-standard.md +2 -2
  66. package/references/agents-md-pattern.md +5 -5
  67. package/references/delivery-operating-model-standard.md +3 -3
  68. package/references/docs-directory-standard.md +53 -10
  69. package/references/external-source-intake-standard.md +75 -0
  70. package/references/harness-ledger.md +53 -94
  71. package/references/legacy-12-phase-bootstrap.md +41 -0
  72. package/references/lessons-governance.md +100 -88
  73. package/references/module-parallel-standard.md +14 -14
  74. package/references/planning-loop.md +51 -7
  75. package/references/project-onboarding-audit.md +10 -0
  76. package/references/pull-request-standard.md +118 -0
  77. package/references/repo-governance-standard.md +12 -1
  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/testing-standard.md +50 -0
  82. package/references/walkthrough-closeout.md +10 -9
  83. package/scripts/check-harness.mjs +111 -331
  84. package/scripts/commands/dashboard-command.mjs +67 -0
  85. package/scripts/commands/migration-command.mjs +96 -0
  86. package/scripts/commands/preset-command.mjs +73 -0
  87. package/scripts/commands/task-command.mjs +327 -0
  88. package/scripts/harness.mjs +106 -20
  89. package/scripts/lib/capability-registry.mjs +591 -0
  90. package/scripts/lib/check-module-parallel.mjs +237 -0
  91. package/scripts/lib/check-profiles.mjs +418 -0
  92. package/scripts/lib/check-task-contracts.mjs +47 -0
  93. package/scripts/lib/core-shared.mjs +196 -0
  94. package/scripts/lib/dashboard-data.mjs +412 -0
  95. package/scripts/lib/dashboard-workbench.mjs +257 -0
  96. package/scripts/lib/dashboard-writer.mjs +107 -4
  97. package/scripts/lib/git-status-summary.mjs +46 -0
  98. package/scripts/lib/governance-index-generator.mjs +174 -0
  99. package/scripts/lib/governance-sync.mjs +514 -0
  100. package/scripts/lib/governance-table-boundary.mjs +175 -0
  101. package/scripts/lib/harness-core.mjs +15 -1318
  102. package/scripts/lib/lesson-maintenance.mjs +152 -0
  103. package/scripts/lib/markdown-utils.mjs +158 -0
  104. package/scripts/lib/migration-planner.mjs +478 -0
  105. package/scripts/lib/migration-support.mjs +312 -0
  106. package/scripts/lib/preset-audit-contracts.mjs +37 -0
  107. package/scripts/lib/preset-engine.mjs +497 -0
  108. package/scripts/lib/preset-registry.mjs +627 -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-dashboard-renderer.mjs +102 -0
  112. package/scripts/lib/subagent-authorization-audit.mjs +196 -0
  113. package/scripts/lib/task-completion-consistency.mjs +16 -0
  114. package/scripts/lib/task-index.mjs +93 -0
  115. package/scripts/lib/task-lesson-candidates.mjs +242 -0
  116. package/scripts/lib/task-lesson-sedimentation.mjs +326 -0
  117. package/scripts/lib/task-lifecycle/review-confirm.mjs +101 -0
  118. package/scripts/lib/task-lifecycle/review-gates.mjs +70 -0
  119. package/scripts/lib/task-lifecycle/text-utils.mjs +24 -0
  120. package/scripts/lib/task-lifecycle.mjs +649 -0
  121. package/scripts/lib/task-review-model.mjs +469 -0
  122. package/scripts/lib/task-scanner.mjs +576 -0
  123. package/scripts/lib/task-tombstone-commands.mjs +140 -0
  124. package/scripts/postinstall.mjs +14 -0
  125. package/skills/preset-creator/SKILL.md +179 -0
  126. package/skills/preset-creator/references/complex-task-skeleton/README.md +31 -0
  127. package/skills/preset-creator/references/complex-task-skeleton/artifacts/INDEX.md +12 -0
  128. package/skills/preset-creator/references/complex-task-skeleton/brief.md +32 -0
  129. package/skills/preset-creator/references/complex-task-skeleton/execution_strategy.md +71 -0
  130. package/skills/preset-creator/references/complex-task-skeleton/findings.md +24 -0
  131. package/skills/preset-creator/references/complex-task-skeleton/lesson_candidates.md +70 -0
  132. package/skills/preset-creator/references/complex-task-skeleton/long-running-task-contract.md +76 -0
  133. package/skills/preset-creator/references/complex-task-skeleton/progress.md +33 -0
  134. package/skills/preset-creator/references/complex-task-skeleton/references/INDEX.md +13 -0
  135. package/skills/preset-creator/references/complex-task-skeleton/review.md +107 -0
  136. package/skills/preset-creator/references/complex-task-skeleton/task_plan.md +111 -0
  137. package/{templates/planning/visual_roadmap.md → skills/preset-creator/references/complex-task-skeleton/visual_map.md} +24 -2
  138. package/skills/preset-creator/references/preset-package-skeleton.md +296 -0
  139. package/templates/AGENTS.md.template +51 -36
  140. package/templates/architecture/Architecture-SSoT.md +21 -0
  141. package/templates/architecture/README.md +49 -0
  142. package/templates/architecture/critical-flows.md +22 -0
  143. package/templates/architecture/local-repo-context.md +20 -0
  144. package/templates/architecture/service-catalog.md +17 -0
  145. package/templates/architecture/services/service-template.md +31 -0
  146. package/templates/architecture/system-map.md +22 -0
  147. package/templates/dashboard/assets/app-src/00-state.js +42 -0
  148. package/templates/dashboard/assets/app-src/10-router.js +77 -0
  149. package/templates/dashboard/assets/app-src/20-overview.js +241 -0
  150. package/templates/dashboard/assets/app-src/30-tasks.js +409 -0
  151. package/templates/dashboard/assets/app-src/35-task-detail.js +246 -0
  152. package/templates/dashboard/assets/app-src/40-modules.js +58 -0
  153. package/templates/dashboard/assets/app-src/45-review.js +347 -0
  154. package/templates/dashboard/assets/app-src/50-migration.js +183 -0
  155. package/templates/dashboard/assets/app-src/60-shared.js +61 -0
  156. package/templates/dashboard/assets/app-src/90-bindings.js +524 -0
  157. package/templates/dashboard/assets/app.css +3107 -300
  158. package/templates/dashboard/assets/app.css.manifest.json +9 -0
  159. package/templates/dashboard/assets/app.js +2068 -306
  160. package/templates/dashboard/assets/app.manifest.json +12 -0
  161. package/templates/dashboard/assets/css-src/00-foundation.css +342 -0
  162. package/templates/dashboard/assets/css-src/10-panels-flow.css +236 -0
  163. package/templates/dashboard/assets/css-src/20-briefs-controls.css +398 -0
  164. package/templates/dashboard/assets/css-src/30-task-index.css +739 -0
  165. package/templates/dashboard/assets/css-src/35-review-workspace.css +507 -0
  166. package/templates/dashboard/assets/css-src/40-detail-modules-migration.css +427 -0
  167. package/templates/dashboard/assets/css-src/50-responsive-overrides.css +551 -0
  168. package/templates/dashboard/assets/i18n.js +531 -44
  169. package/templates/dashboard/assets/mermaid-renderer.js +58 -8
  170. package/templates/development/README.md +52 -0
  171. package/templates/development/codebase-map.md +11 -0
  172. package/templates/development/cross-repo-debugging.md +18 -0
  173. package/templates/development/external-context/service-template.md +33 -0
  174. package/templates/development/external-source-packs/README.md +24 -0
  175. package/templates/development/external-source-packs/digest-template.md +28 -0
  176. package/templates/development/local-setup.md +16 -0
  177. package/templates/development/stubs-and-mocks.md +11 -0
  178. package/templates/integrations/README.md +40 -0
  179. package/templates/integrations/api-contract.md +42 -0
  180. package/templates/integrations/event-contract.md +46 -0
  181. package/templates/integrations/third-party/vendor-template.md +42 -0
  182. package/templates/integrations/webhook-contract.md +41 -0
  183. package/templates/ledger/Harness-Ledger.md +13 -25
  184. package/templates/lessons/lesson-arch-process-change.md +1 -1
  185. package/templates/lessons/lesson-new-doc.md +1 -1
  186. package/templates/lessons/lesson-ref-change.md +1 -1
  187. package/templates/planning/brief.md +32 -0
  188. package/templates/planning/execution_strategy.md +31 -0
  189. package/templates/planning/lesson_candidates.md +70 -0
  190. package/templates/planning/long-running-task-contract.md +7 -0
  191. package/templates/planning/module_brief.md +25 -0
  192. package/templates/planning/module_session_prompt.md +6 -0
  193. package/templates/planning/optional/artifacts/INDEX.md +3 -3
  194. package/templates/planning/optional/references/INDEX.md +3 -3
  195. package/templates/planning/review.md +59 -0
  196. package/templates/planning/task_plan.md +40 -15
  197. package/templates/planning/visual_map.md +50 -0
  198. package/templates/reference/docs-library-standard.md +31 -0
  199. package/templates/reference/execution-workflow-standard.md +5 -2
  200. package/templates/reference/external-source-intake-standard.md +82 -0
  201. package/templates/reference/harness-ledger-standard.md +1 -0
  202. package/templates/reference/pull-request-standard.md +80 -0
  203. package/templates/reference/repo-governance-standard.md +8 -5
  204. package/templates/reference/review-routing-standard.md +6 -0
  205. package/templates/reference/walkthrough-standard.md +3 -1
  206. package/templates/verifier/verifier-output.md +1 -1
  207. package/templates/walkthrough/walkthrough-template.md +2 -2
  208. package/templates-zh-CN/AGENTS.md.template +73 -70
  209. package/templates-zh-CN/architecture/Architecture-SSoT.md +21 -0
  210. package/templates-zh-CN/architecture/README.md +51 -0
  211. package/templates-zh-CN/architecture/critical-flows.md +24 -0
  212. package/templates-zh-CN/architecture/local-repo-context.md +20 -0
  213. package/templates-zh-CN/architecture/service-catalog.md +17 -0
  214. package/templates-zh-CN/architecture/services/service-template.md +31 -0
  215. package/templates-zh-CN/architecture/system-map.md +22 -0
  216. package/templates-zh-CN/development/README.md +54 -0
  217. package/templates-zh-CN/development/codebase-map.md +11 -0
  218. package/templates-zh-CN/development/cross-repo-debugging.md +18 -0
  219. package/templates-zh-CN/development/external-context/service-template.md +33 -0
  220. package/templates-zh-CN/development/external-source-packs/README.md +24 -0
  221. package/templates-zh-CN/development/external-source-packs/digest-template.md +28 -0
  222. package/templates-zh-CN/development/local-setup.md +16 -0
  223. package/templates-zh-CN/development/stubs-and-mocks.md +11 -0
  224. package/templates-zh-CN/integrations/README.md +42 -0
  225. package/templates-zh-CN/integrations/api-contract.md +42 -0
  226. package/templates-zh-CN/integrations/event-contract.md +46 -0
  227. package/templates-zh-CN/integrations/third-party/vendor-template.md +42 -0
  228. package/templates-zh-CN/integrations/webhook-contract.md +41 -0
  229. package/templates-zh-CN/ledger/Harness-Ledger.md +17 -40
  230. package/templates-zh-CN/planning/brief.md +32 -0
  231. package/templates-zh-CN/planning/execution_strategy.md +30 -0
  232. package/templates-zh-CN/planning/lesson_candidates.md +70 -0
  233. package/templates-zh-CN/planning/long-running-task-contract.md +1 -1
  234. package/templates-zh-CN/planning/module_brief.md +25 -0
  235. package/templates-zh-CN/planning/module_plan.md +2 -2
  236. package/templates-zh-CN/planning/module_session_prompt.md +4 -3
  237. package/templates-zh-CN/planning/review.md +59 -1
  238. package/templates-zh-CN/planning/task_plan.md +37 -11
  239. package/templates-zh-CN/planning/{visual_roadmap.md → visual_map.md} +21 -2
  240. package/templates-zh-CN/reference/adversarial-review-standard.md +1 -1
  241. package/templates-zh-CN/reference/docs-library-standard.md +36 -1
  242. package/templates-zh-CN/reference/execution-workflow-standard.md +10 -2
  243. package/templates-zh-CN/reference/external-source-intake-standard.md +82 -0
  244. package/templates-zh-CN/reference/harness-ledger-standard.md +7 -4
  245. package/templates-zh-CN/reference/pull-request-standard.md +106 -0
  246. package/templates-zh-CN/reference/repo-governance-standard.md +4 -1
  247. package/templates-zh-CN/reference/review-routing-standard.md +8 -1
  248. package/templates-zh-CN/reference/walkthrough-standard.md +6 -5
  249. package/templates-zh-CN/walkthrough/Closeout-SSoT.md +2 -2
  250. package/templates-zh-CN/walkthrough/walkthrough-template.md +2 -2
  251. package/scripts/smoke-dashboard.mjs +0 -70
  252. package/scripts/test-harness.mjs +0 -483
  253. package/templates/ssot/Feature-SSoT.md +0 -43
  254. package/templates/ssot/Lessons-SSoT.md +0 -44
  255. package/templates-zh-CN/dashboard/assets/app.css +0 -399
  256. package/templates-zh-CN/dashboard/assets/app.js +0 -435
  257. package/templates-zh-CN/dashboard/assets/i18n.js +0 -47
  258. package/templates-zh-CN/dashboard/assets/markdown-reader.js +0 -116
  259. package/templates-zh-CN/dashboard/assets/mermaid-renderer.js +0 -59
  260. package/templates-zh-CN/dashboard/index.html +0 -18
  261. package/templates-zh-CN/ssot/Feature-SSoT.md +0 -49
  262. package/templates-zh-CN/ssot/Lessons-SSoT.md +0 -49
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import fs from "node:fs";
4
+ import os from "node:os";
4
5
  import path from "node:path";
5
6
  import { createInterface } from "node:readline/promises";
6
7
  import {
@@ -8,11 +9,16 @@ import {
8
9
  buildStatus,
9
10
  doctorUserSkill,
10
11
  installUserSkill,
11
- renderDashboard,
12
12
  normalizeLocale,
13
- writeDashboardFolder,
13
+ rebuildGovernanceIndexes,
14
+ serveDashboardWorkbench,
15
+ validateSourcePackageBoundary,
14
16
  writeInitFiles,
15
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";
16
22
 
17
23
  const args = process.argv.slice(2);
18
24
  const command = args.shift() || "help";
@@ -76,14 +82,54 @@ function printHelp() {
76
82
  Usage:
77
83
  harness check [--profile source-package|private-harness|target-project] [target]
78
84
  harness status [--json] [--strict] [target]
79
- harness dashboard [--out file.html] [--out-dir folder] [target]
80
- harness init [--dry-run] [--locale zh-CN|en-US] [--capabilities core,dashboard] [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]
81
88
  harness add-capability <name> [--dry-run] [--locale zh-CN|en-US] [target]
82
- harness install-user [--agent codex|claude|gemini|openclaw|agents|all] [--home dir] [--dry-run] [--force] [--yes]
89
+ harness migrate-plan [--json] [--limit n] [target]
90
+ harness migrate-run [--locale zh-CN|en-US] [--assume-locale] [--allow-dirty] [--plan-only] [--out-dir folder] [--session-dir folder] [target]
91
+ harness migrate-verify [--json] [--full-cutover] <session.json>
92
+ harness governance rebuild [--dry-run] [--archive] [--apply] [target]
93
+ harness preset list [--json] [target]
94
+ harness preset inspect <id> [--json] [target]
95
+ harness preset check <id> [--json] [target]
96
+ harness preset install <path-or-builtin-id> [--project] [--force] [--json] [target]
97
+ harness preset seed [--project] [--force] [--dry-run] [--json] [target]
98
+ harness preset uninstall <id> [--project] [--json] [target]
99
+ 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]
100
+ harness task-start <task-id> [--message text] [target]
101
+ harness task-phase <task-id> <phase-id> [--state done] [--completion 100] [--evidence present] [target]
102
+ harness task-log <task-id> --message text [--evidence type:PATH:summary] [target]
103
+ harness task-block <task-id> [--message text] [target]
104
+ harness task-review <task-id> [--message text] [target]
105
+ harness review-confirm <task-id> --confirm task-id [--reviewer name] [--message text] [target]
106
+ harness lesson-promote <task-id> <candidate-id> [--dry-run|--apply] [target]
107
+ harness lesson-sediment <task-id> <candidate-id> [--dry-run] [--title title] [target]
108
+ harness task-complete <task-id> [--message text] [target]
109
+ harness task-list [--json] [--state state] [--module key] [--queue queue] [--preset id] [--review status] [--lesson status] [--missing-materials] [--search text] [target]
110
+ harness task-index [--json] [target]
111
+ harness task-supersede <old-task-id> --by <new-task-id> [--reason text] [target]
112
+ harness task-delete <task-id> --soft [--reason text] [target]
113
+ harness task-archive <task-id> [--reason text] [target]
114
+ harness task-reopen <task-id> [--reason text] [target]
115
+ harness module-step <module-key> <step-id> [--state done|in-progress|blocked] [target]
116
+ harness install-user [--agent codex|claude|gemini|openclaw|agents|all] [--home dir] [--dry-run] [--force] [--skip-presets] [--yes]
83
117
  harness doctor-user [--agent codex|claude|gemini|openclaw|agents|all] [--home dir]
84
118
 
85
119
  If init runs in an interactive terminal and --locale is omitted, it asks for a
86
120
  language. Non-interactive init defaults to en-US.
121
+
122
+ Preset discovery:
123
+ Project presets live in <target>/.coding-agent-harness/presets/<preset-id>/.
124
+ User presets live in ~/.coding-agent-harness/presets/<preset-id>/.
125
+ Harness discovers project presets first when a target is supplied, then user
126
+ presets, then bundled package presets under presets/<preset-id>/.
127
+ "harness init" seeds bundled presets into the target project. "harness
128
+ install-user" and npm postinstall seed bundled presets into the user root.
129
+ Use "harness preset seed" to repair or re-run preset seeding.
130
+ Use "harness preset list --json" to see available presets, their source,
131
+ purpose, compatible budgets, and manifest path. Use "harness preset inspect
132
+ <id> --json" for the full preset manifest summary.
87
133
  `);
88
134
  }
89
135
 
@@ -95,6 +141,8 @@ function exitWithReport(report) {
95
141
 
96
142
  if (command === "help" || command === "--help" || command === "-h") {
97
143
  printHelp();
144
+ } else if (args[0] === "help" || args.includes("--help") || args.includes("-h")) {
145
+ printHelp();
98
146
  } else if (command === "check") {
99
147
  const profile = takeOption("--profile", "target-project");
100
148
  const strict = takeFlag("--strict");
@@ -106,6 +154,9 @@ if (command === "help" || command === "--help" || command === "-h") {
106
154
  for (const required of ["package.json", "scripts/harness.mjs", "scripts/check-harness.mjs", "templates/planning/task_plan.md"]) {
107
155
  if (!fs.existsSync(path.resolve(target, required))) failures.push(`missing source package file: ${required}`);
108
156
  }
157
+ const boundary = validateSourcePackageBoundary(target);
158
+ failures.push(...boundary.failures);
159
+ warnings.push(...boundary.warnings);
109
160
  }
110
161
 
111
162
  const status = buildStatus(target, { skipLegacyCheck: profile === "source-package", strictLegacy: strict, strict });
@@ -127,27 +178,33 @@ if (command === "help" || command === "--help" || command === "-h") {
127
178
  console.log(`capabilities: ${status.capabilities.map((capability) => `${capability.name}:${capability.state}`).join(", ")}`);
128
179
  console.log(`tasks: ${status.tasks.length}`);
129
180
  }
130
- process.exit(status.checkState.status === "fail" ? 1 : 0);
131
- } else if (command === "dashboard") {
132
- const out = takeOption("--out", "harness-dashboard.html");
181
+ process.exitCode = status.checkState.status === "fail" ? 1 : 0;
182
+ } else if (command === "dev") {
183
+ const open = !takeFlag("--no-open");
133
184
  const outDir = takeOption("--out-dir", "");
134
- if (outDir) {
135
- console.log(writeDashboardFolder(outDir, targetArg()));
136
- } else {
137
- const status = buildStatus(targetArg());
138
- const html = renderDashboard(status);
139
- fs.mkdirSync(path.dirname(path.resolve(out)), { recursive: true });
140
- fs.writeFileSync(path.resolve(out), html);
141
- console.log(path.resolve(out));
185
+ const host = takeOption("--host", "127.0.0.1");
186
+ const port = takeOption("--port", "0");
187
+ const localeOverride = takeOption("--locale", "");
188
+ const target = targetArg();
189
+ const usesDefaultOutDir = !outDir;
190
+ const dashboardOutDir = outDir || defaultDevOutDir(target);
191
+ const opts = { ...(localeOverride ? { localeOverride } : {}), recoverGeneratedDashboard: usesDefaultOutDir };
192
+ try {
193
+ await serveDashboardWorkbench(dashboardOutDir, target, { ...opts, host, port, autoRefresh: true, open, label: "harness dev" });
194
+ } catch (error) {
195
+ console.error(error.message);
196
+ process.exit(1);
142
197
  }
143
- process.exit(0);
198
+ } else if (command === "dashboard") {
199
+ await runDashboardCommand({ takeFlag, takeOption, targetArg });
144
200
  } else if (command === "init") {
145
201
  const dryRun = takeFlag("--dry-run");
202
+ const addNpmScripts = takeFlag("--add-npm-scripts");
146
203
  const locale = await resolveInitLocale(takeOption("--locale", ""));
147
204
  const capabilities = takeOption("--capabilities", "core").split(",").map((item) => item.trim()).filter(Boolean);
148
205
  try {
149
- const result = writeInitFiles(targetArg(), capabilities, { dryRun, locale });
150
- console.log(JSON.stringify({ dryRun, locale: result.locale, capabilities: result.capabilities, changes: result.changes, report: result.report }, null, 2));
206
+ const result = writeInitFiles(targetArg(), capabilities, { dryRun, locale, addNpmScripts });
207
+ 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));
151
208
  } catch (error) {
152
209
  console.error(error.message);
153
210
  process.exit(1);
@@ -167,10 +224,32 @@ if (command === "help" || command === "--help" || command === "-h") {
167
224
  console.error(error.message);
168
225
  process.exit(1);
169
226
  }
227
+ } else if (["migrate-plan", "migrate-run", "migrate-verify"].includes(command)) {
228
+ runMigrationCommand(command, { args, takeFlag, takeOption, targetArg });
229
+ } else if (command === "governance") {
230
+ const subcommand = args.shift() || "";
231
+ if (subcommand !== "rebuild") {
232
+ console.error(`Unknown governance subcommand: ${subcommand || "(missing)"}`);
233
+ process.exit(2);
234
+ }
235
+ const dryRun = takeFlag("--dry-run");
236
+ const archive = takeFlag("--archive");
237
+ const apply = takeFlag("--apply");
238
+ try {
239
+ console.log(JSON.stringify(rebuildGovernanceIndexes(targetArg(), { dryRun, archive, apply }), null, 2));
240
+ } catch (error) {
241
+ console.error(error.message);
242
+ process.exit(1);
243
+ }
244
+ } else if (command === "preset") {
245
+ runPresetCommand({ args, takeFlag, targetArg });
246
+ } 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)) {
247
+ runTaskCommand(command, { args, takeFlag, takeOption, targetArg });
170
248
  } else if (command === "install-user") {
171
249
  const dryRun = takeFlag("--dry-run");
172
250
  const force = takeFlag("--force");
173
251
  const yes = takeFlag("--yes") || takeFlag("-y");
252
+ const skipPresets = takeFlag("--skip-presets");
174
253
  takeFlag("--global");
175
254
  const agent = takeOption("--agent", "codex");
176
255
  const home = takeOption("--home", "");
@@ -179,7 +258,7 @@ if (command === "help" || command === "--help" || command === "-h") {
179
258
  process.exit(2);
180
259
  }
181
260
  try {
182
- console.log(JSON.stringify(installUserSkill({ agent, home, dryRun, force }), null, 2));
261
+ console.log(JSON.stringify(installUserSkill({ agent, home, dryRun, force, seedPresets: !skipPresets }), null, 2));
183
262
  } catch (error) {
184
263
  console.error(error.message);
185
264
  process.exit(1);
@@ -199,3 +278,10 @@ if (command === "help" || command === "--help" || command === "-h") {
199
278
  printHelp();
200
279
  process.exit(2);
201
280
  }
281
+
282
+ function defaultDevOutDir(targetInput) {
283
+ const target = path.resolve(targetInput || ".");
284
+ const name = path.basename(target) || "project";
285
+ const hash = Buffer.from(target).toString("hex").slice(0, 16);
286
+ return path.join(os.tmpdir(), "coding-agent-harness-dev", `${name}-${hash}`);
287
+ }