@opengsd/gsd-core 1.3.0-rc.1 → 1.3.0

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 (521) hide show
  1. package/README.ja-JP.md +44 -790
  2. package/README.ko-KR.md +41 -778
  3. package/README.md +39 -180
  4. package/README.pt-BR.md +45 -413
  5. package/README.zh-CN.md +43 -761
  6. package/agents/gsd-ai-researcher.md +1 -1
  7. package/agents/gsd-debugger.md +8 -8
  8. package/agents/gsd-domain-researcher.md +14 -1
  9. package/agents/gsd-eval-auditor.md +1 -1
  10. package/agents/gsd-eval-planner.md +1 -1
  11. package/agents/gsd-executor.md +21 -8
  12. package/agents/gsd-framework-selector.md +1 -1
  13. package/agents/gsd-intel-updater.md +4 -4
  14. package/agents/gsd-phase-researcher.md +18 -5
  15. package/agents/gsd-plan-checker.md +3 -3
  16. package/agents/gsd-planner.md +36 -23
  17. package/agents/gsd-project-researcher.md +13 -0
  18. package/agents/gsd-research-synthesizer.md +6 -2
  19. package/agents/gsd-roadmapper.md +6 -6
  20. package/agents/gsd-ui-researcher.md +15 -2
  21. package/agents/gsd-user-profiler.md +2 -2
  22. package/agents/gsd-verifier.md +7 -7
  23. package/bin/install.js +169 -59
  24. package/commands/gsd/add-tests.md +1 -1
  25. package/commands/gsd/ai-integration-phase.md +3 -3
  26. package/commands/gsd/audit-fix.md +1 -1
  27. package/commands/gsd/audit-milestone.md +1 -1
  28. package/commands/gsd/audit-uat.md +1 -1
  29. package/commands/gsd/autonomous.md +2 -2
  30. package/commands/gsd/capture.md +6 -6
  31. package/commands/gsd/cleanup.md +1 -1
  32. package/commands/gsd/code-review.md +1 -1
  33. package/commands/gsd/complete-milestone.md +2 -2
  34. package/commands/gsd/config.md +3 -3
  35. package/commands/gsd/debug.md +1 -1
  36. package/commands/gsd/discuss-phase.md +5 -4
  37. package/commands/gsd/docs-update.md +1 -1
  38. package/commands/gsd/eval-review.md +2 -2
  39. package/commands/gsd/execute-phase.md +2 -2
  40. package/commands/gsd/explore.md +1 -1
  41. package/commands/gsd/extract-learnings.md +2 -2
  42. package/commands/gsd/fast.md +1 -1
  43. package/commands/gsd/forensics.md +1 -1
  44. package/commands/gsd/graphify.md +9 -9
  45. package/commands/gsd/health.md +1 -1
  46. package/commands/gsd/help.md +2 -2
  47. package/commands/gsd/import.md +5 -5
  48. package/commands/gsd/inbox.md +1 -1
  49. package/commands/gsd/ingest-docs.md +4 -4
  50. package/commands/gsd/manager.md +3 -3
  51. package/commands/gsd/map-codebase.md +1 -1
  52. package/commands/gsd/milestone-summary.md +1 -1
  53. package/commands/gsd/mvp-phase.md +4 -4
  54. package/commands/gsd/new-milestone.md +5 -5
  55. package/commands/gsd/new-project.md +5 -5
  56. package/commands/gsd/pause-work.md +2 -2
  57. package/commands/gsd/phase.md +4 -4
  58. package/commands/gsd/plan-phase.md +2 -2
  59. package/commands/gsd/plan-review-convergence.md +4 -4
  60. package/commands/gsd/pr-branch.md +1 -1
  61. package/commands/gsd/profile-user.md +2 -2
  62. package/commands/gsd/progress.md +4 -4
  63. package/commands/gsd/quick.md +1 -1
  64. package/commands/gsd/resume-work.md +1 -1
  65. package/commands/gsd/review.md +1 -1
  66. package/commands/gsd/secure-phase.md +1 -1
  67. package/commands/gsd/settings.md +1 -1
  68. package/commands/gsd/ship.md +2 -2
  69. package/commands/gsd/sketch.md +7 -7
  70. package/commands/gsd/spec-phase.md +2 -2
  71. package/commands/gsd/spike.md +3 -3
  72. package/commands/gsd/stats.md +1 -1
  73. package/commands/gsd/surface.md +4 -4
  74. package/commands/gsd/thread.md +1 -1
  75. package/commands/gsd/ui-phase.md +2 -2
  76. package/commands/gsd/ui-review.md +2 -2
  77. package/commands/gsd/ultraplan-phase.md +2 -2
  78. package/commands/gsd/undo.md +3 -3
  79. package/commands/gsd/update.md +3 -3
  80. package/commands/gsd/validate-phase.md +1 -1
  81. package/commands/gsd/verify-work.md +2 -2
  82. package/commands/gsd/workspace.md +4 -4
  83. package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
  84. package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +13 -3
  85. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  86. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  87. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  88. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  89. package/gsd-core/bin/lib/audit.cjs +743 -0
  90. package/gsd-core/bin/lib/check-command-router.cjs +342 -0
  91. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  92. package/gsd-core/bin/lib/clock.cjs +95 -0
  93. package/gsd-core/bin/lib/clusters.cjs +128 -0
  94. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  95. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  96. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  97. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  98. package/gsd-core/bin/lib/commands.cjs +1202 -0
  99. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  100. package/{get-shit-done → gsd-core}/bin/lib/config-types.cjs +1 -1
  101. package/gsd-core/bin/lib/config.cjs +714 -0
  102. package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
  103. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  104. package/gsd-core/bin/lib/core.cjs +2007 -0
  105. package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
  106. package/gsd-core/bin/lib/docs.cjs +252 -0
  107. package/gsd-core/bin/lib/drift.cjs +364 -0
  108. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  109. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  110. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  111. package/gsd-core/bin/lib/graphify.cjs +496 -0
  112. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  113. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  114. package/gsd-core/bin/lib/init.cjs +1799 -0
  115. package/gsd-core/bin/lib/install-profiles.cjs +526 -0
  116. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  117. package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
  118. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  119. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  120. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  121. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  122. package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
  123. package/gsd-core/bin/lib/intel.cjs +607 -0
  124. package/gsd-core/bin/lib/learnings.cjs +270 -0
  125. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  126. package/gsd-core/bin/lib/milestone.cjs +373 -0
  127. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  128. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  129. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  130. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  131. package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
  132. package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
  133. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  134. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  135. package/gsd-core/bin/lib/phase.cjs +1307 -0
  136. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  137. package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
  138. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  139. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  140. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  141. package/gsd-core/bin/lib/project-root.cjs +119 -0
  142. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  143. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  144. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  145. package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
  146. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  147. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
  148. package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
  149. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  150. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  151. package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
  152. package/gsd-core/bin/lib/secrets.cjs +34 -0
  153. package/gsd-core/bin/lib/security.cjs +407 -0
  154. package/{get-shit-done → gsd-core}/bin/lib/semver-compare.cjs +1 -1
  155. package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
  156. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  157. package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -78
  158. package/gsd-core/bin/lib/state.cjs +2010 -0
  159. package/gsd-core/bin/lib/surface.cjs +406 -0
  160. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  161. package/gsd-core/bin/lib/template.cjs +237 -0
  162. package/gsd-core/bin/lib/uat.cjs +297 -0
  163. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  164. package/gsd-core/bin/lib/update-context.cjs +218 -0
  165. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  166. package/gsd-core/bin/lib/validate.cjs +112 -0
  167. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  168. package/gsd-core/bin/lib/verify.cjs +1451 -0
  169. package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
  170. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  171. package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
  172. package/gsd-core/bin/lib/workstream.cjs +380 -0
  173. package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
  174. package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +5 -0
  175. package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
  176. package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
  177. package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
  178. package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
  179. package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
  180. package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
  181. package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
  182. package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
  183. package/gsd-core/references/worktree-branch-check.md +38 -0
  184. package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
  185. package/{get-shit-done → gsd-core}/templates/README.md +2 -2
  186. package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
  187. package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
  188. package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
  189. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  190. package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
  191. package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
  192. package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
  193. package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
  194. package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
  195. package/{get-shit-done → gsd-core}/workflows/audit-fix.md +1 -1
  196. package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +1 -1
  197. package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
  198. package/{get-shit-done → gsd-core}/workflows/autonomous.md +4 -4
  199. package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
  200. package/{get-shit-done → gsd-core}/workflows/cleanup.md +1 -1
  201. package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +1 -1
  202. package/{get-shit-done → gsd-core}/workflows/code-review.md +4 -4
  203. package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
  204. package/{get-shit-done → gsd-core}/workflows/debug.md +1 -1
  205. package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +4 -2
  206. package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
  207. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +4 -4
  208. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
  209. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
  210. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
  211. package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +2 -2
  212. package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
  213. package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
  214. package/{get-shit-done → gsd-core}/workflows/docs-update.md +1 -1
  215. package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
  216. package/{get-shit-done → gsd-core}/workflows/eval-review.md +2 -2
  217. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +15 -2
  218. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  219. package/{get-shit-done → gsd-core}/workflows/execute-phase.md +68 -46
  220. package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
  221. package/{get-shit-done → gsd-core}/workflows/explore.md +3 -3
  222. package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
  223. package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
  224. package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
  225. package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
  226. package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +1 -1
  227. package/{get-shit-done → gsd-core}/workflows/import.md +1 -1
  228. package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +3 -3
  229. package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
  230. package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
  231. package/{get-shit-done → gsd-core}/workflows/manager.md +1 -1
  232. package/{get-shit-done → gsd-core}/workflows/map-codebase.md +1 -1
  233. package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
  234. package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
  235. package/{get-shit-done → gsd-core}/workflows/new-milestone.md +3 -3
  236. package/{get-shit-done → gsd-core}/workflows/new-project.md +6 -6
  237. package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
  238. package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
  239. package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
  240. package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
  241. package/{get-shit-done → gsd-core}/workflows/plan-phase.md +15 -15
  242. package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +7 -7
  243. package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
  244. package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
  245. package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
  246. package/{get-shit-done → gsd-core}/workflows/quick.md +2 -26
  247. package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
  248. package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
  249. package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
  250. package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
  251. package/{get-shit-done → gsd-core}/workflows/review.md +1 -1
  252. package/{get-shit-done → gsd-core}/workflows/scan.md +1 -1
  253. package/{get-shit-done → gsd-core}/workflows/secure-phase.md +3 -3
  254. package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +1 -1
  255. package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
  256. package/{get-shit-done → gsd-core}/workflows/settings.md +1 -1
  257. package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
  258. package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
  259. package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
  260. package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
  261. package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
  262. package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
  263. package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
  264. package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
  265. package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
  266. package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
  267. package/{get-shit-done → gsd-core}/workflows/ui-phase.md +3 -3
  268. package/{get-shit-done → gsd-core}/workflows/ui-review.md +2 -2
  269. package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
  270. package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
  271. package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
  272. package/{get-shit-done → gsd-core}/workflows/validate-phase.md +3 -3
  273. package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
  274. package/{get-shit-done → gsd-core}/workflows/verify-work.md +5 -5
  275. package/hooks/dist/gsd-check-update-worker.js +16 -3
  276. package/hooks/dist/gsd-check-update.js +7 -5
  277. package/hooks/dist/gsd-context-monitor.js +2 -2
  278. package/hooks/dist/gsd-statusline.js +39 -21
  279. package/hooks/dist/gsd-update-banner.js +6 -2
  280. package/hooks/dist/managed-hooks-registry.cjs +35 -0
  281. package/hooks/gsd-check-update-worker.js +16 -3
  282. package/hooks/gsd-check-update.js +7 -5
  283. package/hooks/gsd-context-monitor.js +2 -2
  284. package/hooks/gsd-statusline.js +39 -21
  285. package/hooks/gsd-update-banner.js +6 -2
  286. package/package.json +9 -6
  287. package/scripts/affected-tests-lib.cjs +1 -1
  288. package/scripts/base64-scan.sh +12 -0
  289. package/scripts/build-hooks.js +4 -1
  290. package/scripts/changeset/cli.cjs +2 -2
  291. package/scripts/changeset/github-release-notes.cjs +1 -1
  292. package/scripts/changeset/lint.cjs +1 -1
  293. package/scripts/check-alias-drift.cjs +8 -8
  294. package/scripts/check-env.cjs +5 -1
  295. package/scripts/ci-test-scope.cjs +25 -10
  296. package/scripts/command-contract-helpers.cjs +1 -1
  297. package/scripts/fix-slash-commands.cjs +5 -5
  298. package/scripts/gen-inventory-manifest.cjs +3 -3
  299. package/scripts/generate-package-identity.cjs +28 -7
  300. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  301. package/scripts/lint-command-contract.cjs +1 -1
  302. package/scripts/lint-legacy-dir-name.cjs +156 -0
  303. package/scripts/lint-package-identity-drift.cjs +8 -8
  304. package/scripts/lint-pr-check-project-dir.cjs +0 -1
  305. package/scripts/lint-shell-command-projection-drift.cjs +1 -1
  306. package/scripts/lint-skill-deps.cjs +1 -1
  307. package/scripts/lint-test-file-count.allowlist.json +129 -32
  308. package/scripts/lint-test-file-count.cjs +85 -30
  309. package/scripts/mutation-matrix.cjs +219 -0
  310. package/scripts/prompt-injection-scan.sh +5 -1
  311. package/scripts/release-notes/format-github-release-notes.cjs +256 -0
  312. package/scripts/release-tarball-smoke.cjs +9 -9
  313. package/scripts/run-tests.cjs +11 -3
  314. package/scripts/strip-prose-atrefs.cjs +2 -2
  315. package/scripts/sync-runtime-launcher.cjs +2 -2
  316. package/scripts/verify-npm-publish.cjs +252 -0
  317. package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
  318. package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
  319. package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
  320. package/get-shit-done/bin/lib/artifacts.cjs +0 -53
  321. package/get-shit-done/bin/lib/audit.cjs +0 -755
  322. package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
  323. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
  324. package/get-shit-done/bin/lib/clock.cjs +0 -96
  325. package/get-shit-done/bin/lib/clusters.cjs +0 -135
  326. package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
  327. package/get-shit-done/bin/lib/command-aliases.cjs +0 -831
  328. package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
  329. package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
  330. package/get-shit-done/bin/lib/commands.cjs +0 -1292
  331. package/get-shit-done/bin/lib/config-schema.cjs +0 -31
  332. package/get-shit-done/bin/lib/config.cjs +0 -728
  333. package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
  334. package/get-shit-done/bin/lib/core.cjs +0 -2513
  335. package/get-shit-done/bin/lib/docs.cjs +0 -270
  336. package/get-shit-done/bin/lib/drift.cjs +0 -388
  337. package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
  338. package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
  339. package/get-shit-done/bin/lib/gap-checker.cjs +0 -254
  340. package/get-shit-done/bin/lib/graphify.cjs +0 -592
  341. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
  342. package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
  343. package/get-shit-done/bin/lib/init.cjs +0 -2112
  344. package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
  345. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
  346. package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -355
  347. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
  348. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
  349. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
  350. package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
  351. package/get-shit-done/bin/lib/intel.cjs +0 -708
  352. package/get-shit-done/bin/lib/learnings.cjs +0 -421
  353. package/get-shit-done/bin/lib/milestone.cjs +0 -372
  354. package/get-shit-done/bin/lib/model-catalog.cjs +0 -229
  355. package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
  356. package/get-shit-done/bin/lib/observability/event.cjs +0 -82
  357. package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
  358. package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
  359. package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -79
  360. package/get-shit-done/bin/lib/phase.cjs +0 -1607
  361. package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
  362. package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
  363. package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
  364. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  365. package/get-shit-done/bin/lib/project-root.cjs +0 -112
  366. package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
  367. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -126
  368. package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -162
  369. package/get-shit-done/bin/lib/roadmap-upgrade.cjs +0 -569
  370. package/get-shit-done/bin/lib/roadmap.cjs +0 -651
  371. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
  372. package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
  373. package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
  374. package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
  375. package/get-shit-done/bin/lib/secrets.cjs +0 -32
  376. package/get-shit-done/bin/lib/security.cjs +0 -600
  377. package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -535
  378. package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
  379. package/get-shit-done/bin/lib/state.cjs +0 -2073
  380. package/get-shit-done/bin/lib/surface.cjs +0 -470
  381. package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
  382. package/get-shit-done/bin/lib/template.cjs +0 -228
  383. package/get-shit-done/bin/lib/uat.cjs +0 -289
  384. package/get-shit-done/bin/lib/ui-safety-gate.cjs +0 -111
  385. package/get-shit-done/bin/lib/update-context.cjs +0 -209
  386. package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
  387. package/get-shit-done/bin/lib/validate.cjs +0 -118
  388. package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
  389. package/get-shit-done/bin/lib/verify.cjs +0 -1614
  390. package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
  391. package/get-shit-done/bin/lib/workstream.cjs +0 -389
  392. package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
  393. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
  394. package/scripts/lint-no-source-grep-extras.cjs +0 -81
  395. package/scripts/lint-no-source-grep.cjs +0 -174
  396. /package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +0 -0
  397. /package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +0 -0
  398. /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
  399. /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
  400. /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
  401. /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
  402. /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
  403. /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
  404. /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
  405. /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
  406. /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
  407. /package/{get-shit-done → gsd-core}/references/checkpoints.md +0 -0
  408. /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
  409. /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
  410. /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
  411. /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
  412. /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
  413. /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
  414. /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
  415. /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
  416. /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
  417. /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
  418. /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
  419. /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
  420. /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
  421. /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
  422. /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
  423. /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
  424. /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
  425. /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
  426. /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
  427. /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
  428. /package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +0 -0
  429. /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
  430. /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
  431. /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
  432. /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
  433. /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
  434. /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
  435. /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
  436. /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
  437. /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
  438. /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
  439. /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
  440. /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
  441. /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
  442. /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
  443. /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
  444. /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
  445. /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
  446. /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
  447. /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
  448. /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
  449. /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
  450. /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
  451. /package/{get-shit-done → gsd-core}/references/ui-brand.md +0 -0
  452. /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
  453. /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
  454. /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
  455. /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
  456. /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
  457. /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
  458. /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
  459. /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
  460. /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
  461. /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
  462. /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
  463. /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
  464. /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
  465. /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
  466. /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
  467. /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
  468. /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
  469. /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
  470. /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
  471. /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
  472. /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
  473. /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
  474. /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
  475. /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
  476. /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
  477. /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
  478. /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
  479. /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
  480. /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
  481. /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
  482. /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
  483. /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
  484. /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
  485. /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
  486. /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
  487. /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
  488. /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
  489. /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
  490. /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
  491. /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
  492. /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
  493. /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
  494. /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
  495. /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
  496. /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
  497. /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
  498. /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
  499. /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
  500. /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
  501. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
  502. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
  503. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
  504. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
  505. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
  506. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
  507. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
  508. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
  509. /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
  510. /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
  511. /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
  512. /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
  513. /package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +0 -0
  514. /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
  515. /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
  516. /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
  517. /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
  518. /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
  519. /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
  520. /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
  521. /package/{get-shit-done → gsd-core}/workflows/session-report.md +0 -0
@@ -1,372 +0,0 @@
1
- /**
2
- * Milestone — Milestone and requirements lifecycle operations
3
- */
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const { escapeRegex, getMilestonePhaseFilter, extractOneLinerFromBody, normalizePhaseName, phaseTokenMatches, output, error } = require('./core.cjs');
8
- const { platformWriteSync, platformEnsureDir } = require('./shell-command-projection.cjs');
9
- const { planningPaths } = require('./planning-workspace.cjs');
10
- const { extractFrontmatter } = require('./frontmatter.cjs');
11
- const { writeStateMd, stateReplaceFieldWithFallback } = require('./state.cjs');
12
- const { formatGsdSlash, resolveRuntime } = require('./runtime-slash.cjs');
13
-
14
- function cmdRequirementsMarkComplete(cwd, reqIdsRaw, raw) {
15
- if (!reqIdsRaw || reqIdsRaw.length === 0) {
16
- error('requirement IDs required. Usage: requirements mark-complete REQ-01,REQ-02 or REQ-01 REQ-02');
17
- }
18
-
19
- // Accept comma-separated, space-separated, or bracket-wrapped: [REQ-01, REQ-02]
20
- const reqIds = reqIdsRaw
21
- .join(' ')
22
- .replace(/[\[\]]/g, '')
23
- .split(/[,\s]+/)
24
- .map(r => r.trim())
25
- .filter(Boolean);
26
-
27
- if (reqIds.length === 0) {
28
- error('no valid requirement IDs found');
29
- }
30
-
31
- const reqPath = planningPaths(cwd).requirements;
32
- if (!fs.existsSync(reqPath)) {
33
- output({ updated: false, reason: 'REQUIREMENTS.md not found', ids: reqIds }, raw, 'no requirements file');
34
- return;
35
- }
36
-
37
- let reqContent = fs.readFileSync(reqPath, 'utf-8');
38
- const updated = [];
39
- const alreadyComplete = [];
40
- const notFound = [];
41
-
42
- for (const reqId of reqIds) {
43
- let found = false;
44
- const reqEscaped = escapeRegex(reqId);
45
-
46
- // Update checkbox: - [ ] **REQ-ID** → - [x] **REQ-ID**
47
- // Use replace() directly and compare — avoids test()+replace() global regex
48
- // lastIndex bug where test() advances state and replace() misses matches.
49
- const checkboxPattern = new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${reqEscaped}\\*\\*)`, 'gi');
50
- const afterCheckbox = reqContent.replace(checkboxPattern, '$1x$2');
51
- if (afterCheckbox !== reqContent) {
52
- reqContent = afterCheckbox;
53
- found = true;
54
- }
55
-
56
- // Update traceability table: | REQ-ID | Phase N | Pending | → | REQ-ID | Phase N | Complete |
57
- const tablePattern = new RegExp(`(\\|\\s*${reqEscaped}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`, 'gi');
58
- const afterTable = reqContent.replace(tablePattern, '$1 Complete $2');
59
- if (afterTable !== reqContent) {
60
- reqContent = afterTable;
61
- found = true;
62
- }
63
-
64
- if (found) {
65
- updated.push(reqId);
66
- } else {
67
- // Check if already complete before declaring not_found.
68
- // Non-global flag is fine here — we only need to know if a match exists.
69
- const doneCheckbox = new RegExp(`-\\s*\\[x\\]\\s*\\*\\*${reqEscaped}\\*\\*`, 'i');
70
- const doneTable = new RegExp(`\\|\\s*${reqEscaped}\\s*\\|[^|]+\\|\\s*Complete\\s*\\|`, 'i');
71
- if (doneCheckbox.test(reqContent) || doneTable.test(reqContent)) {
72
- alreadyComplete.push(reqId);
73
- } else {
74
- notFound.push(reqId);
75
- }
76
- }
77
- }
78
-
79
- if (updated.length > 0) {
80
- platformWriteSync(reqPath, reqContent);
81
- }
82
-
83
- output({
84
- updated: updated.length > 0,
85
- marked_complete: updated,
86
- already_complete: alreadyComplete,
87
- not_found: notFound,
88
- total: reqIds.length,
89
- }, raw, `${updated.length}/${reqIds.length} requirements marked complete`);
90
- }
91
-
92
- function cmdMilestoneComplete(cwd, version, options, raw) {
93
- if (!version) {
94
- error('version required for milestone complete (e.g., v1.0)');
95
- }
96
-
97
- const roadmapPath = planningPaths(cwd).roadmap;
98
- const reqPath = planningPaths(cwd).requirements;
99
- const statePath = planningPaths(cwd).state;
100
- const milestonesPath = path.join(cwd, '.planning', 'MILESTONES.md');
101
- const archiveDir = path.join(cwd, '.planning', 'milestones');
102
- const phasesDir = planningPaths(cwd).phases;
103
- const today = new Date().toISOString().split('T')[0];
104
- const milestoneName = options.name || version;
105
-
106
- // Ensure archive directory exists
107
- platformEnsureDir(archiveDir);
108
-
109
- // Scope stats and accomplishments to only the phases belonging to the
110
- // current milestone's ROADMAP. Uses the shared filter from core.cjs
111
- // (same logic used by cmdPhasesList and other callers).
112
- const isDirInMilestone = getMilestonePhaseFilter(cwd, version);
113
- if (isDirInMilestone.missingExplicitVersion) {
114
- error(`no phases found for milestone ${version} in ROADMAP.md`);
115
- }
116
-
117
- // Guard: prevent marking complete when ROADMAP still lists phases that have
118
- // no directory on disk (disk_status: no_directory). This catches the case
119
- // where the active milestone was erroneously marked complete before phases
120
- // were even started. Only fires when STATE.md confirms the current milestone
121
- // version matches what is being completed — no false positives on fresh
122
- // projects where phases haven't been scaffolded yet.
123
- // Pass --force to override this guard.
124
- if (!options.force) {
125
- try {
126
- // Only guard when STATE.md's milestone field matches the version being completed.
127
- let stateVersion = null;
128
- try {
129
- const stateRaw = fs.existsSync(statePath) ? fs.readFileSync(statePath, 'utf-8') : null;
130
- if (stateRaw) {
131
- const milestoneMatch = stateRaw.match(/^milestone:\s*(.+)/m);
132
- if (milestoneMatch) stateVersion = milestoneMatch[1].trim();
133
- }
134
- } catch { /* skip */ }
135
-
136
- if (stateVersion && stateVersion === version) {
137
- const { extractCurrentMilestone } = require('./core.cjs');
138
- const roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
139
- const scopedContent = extractCurrentMilestone(roadmapContent, cwd);
140
- const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi;
141
- const noDirectoryPhases = [];
142
- let pm;
143
- const phaseDirEntries = (() => {
144
- try {
145
- return fs.readdirSync(phasesDir, { withFileTypes: true })
146
- .filter(e => e.isDirectory()).map(e => e.name);
147
- } catch { return []; }
148
- })();
149
- while ((pm = phasePattern.exec(scopedContent)) !== null) {
150
- const phaseNum = pm[1];
151
- const normalized = normalizePhaseName(phaseNum);
152
- // A phase has disk_status: 'no_directory' when no phase directory
153
- // with a matching token exists on disk. Use the same phaseTokenMatches
154
- // helper that roadmap.analyze uses to avoid false positives on decimal
155
- // (2.1) and letter-suffix (12A) phase IDs.
156
- const hasDirectory = phaseDirEntries.some(d => phaseTokenMatches(d, normalized));
157
- if (!hasDirectory) {
158
- noDirectoryPhases.push(phaseNum);
159
- }
160
- }
161
- if (noDirectoryPhases.length > 0) {
162
- error(
163
- `Cannot mark milestone complete: ROADMAP lists ${noDirectoryPhases.length} unstarted phase(s) ` +
164
- `(e.g. Phase ${noDirectoryPhases[0]}). Re-run with --force to override.`
165
- );
166
- }
167
- }
168
- } catch (e) {
169
- // If the error came from our guard, re-throw it; otherwise skip silently.
170
- if (e.message && e.message.startsWith('Cannot mark milestone complete:')) throw e;
171
- // Phase scan failed or STATE version mismatch — allow completion to proceed.
172
- }
173
- }
174
-
175
- // Gather stats from phases (scoped to current milestone only)
176
- let phaseCount = 0;
177
- let totalPlans = 0;
178
- let totalTasks = 0;
179
- const accomplishments = [];
180
-
181
- try {
182
- const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
183
- const dirs = entries.filter(e => e.isDirectory()).map(e => e.name).sort();
184
-
185
- for (const dir of dirs) {
186
- if (!isDirInMilestone(dir)) continue;
187
-
188
- phaseCount++;
189
- const phaseFiles = fs.readdirSync(path.join(phasesDir, dir));
190
- const plans = phaseFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md');
191
- const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
192
- totalPlans += plans.length;
193
-
194
- // Extract one-liners from summaries
195
- for (const s of summaries) {
196
- try {
197
- const content = fs.readFileSync(path.join(phasesDir, dir, s), 'utf-8');
198
- const fm = extractFrontmatter(content);
199
- const oneLiner = fm['one-liner'] || extractOneLinerFromBody(content);
200
- if (oneLiner) {
201
- accomplishments.push(oneLiner);
202
- }
203
- // Count tasks: prefer **Tasks:** N from Performance section,
204
- // then <task XML tags, then ## Task N markdown headers
205
- const tasksFieldMatch = content.match(/\*\*Tasks:\*\*\s*(\d+)/);
206
- if (tasksFieldMatch) {
207
- totalTasks += parseInt(tasksFieldMatch[1], 10);
208
- } else {
209
- const xmlTaskMatches = content.match(/<task[\s>]/gi) || [];
210
- const mdTaskMatches = content.match(/##\s*Task\s*\d+/gi) || [];
211
- totalTasks += xmlTaskMatches.length || mdTaskMatches.length;
212
- }
213
- } catch { /* intentionally empty */ }
214
- }
215
- }
216
- } catch { /* intentionally empty */ }
217
-
218
- // Archive ROADMAP.md
219
- if (fs.existsSync(roadmapPath)) {
220
- const roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
221
- platformWriteSync(path.join(archiveDir, `${version}-ROADMAP.md`), roadmapContent);
222
- }
223
-
224
- // Archive REQUIREMENTS.md
225
- if (fs.existsSync(reqPath)) {
226
- const reqContent = fs.readFileSync(reqPath, 'utf-8');
227
- const archiveHeader = `# Requirements Archive: ${version} ${milestoneName}\n\n**Archived:** ${today}\n**Status:** SHIPPED\n\nFor current requirements, see \`.planning/REQUIREMENTS.md\`.\n\n---\n\n`;
228
- platformWriteSync(path.join(archiveDir, `${version}-REQUIREMENTS.md`), archiveHeader + reqContent);
229
- }
230
-
231
- // Archive audit file if exists
232
- const auditFile = path.join(cwd, '.planning', `${version}-MILESTONE-AUDIT.md`);
233
- if (fs.existsSync(auditFile)) {
234
- fs.renameSync(auditFile, path.join(archiveDir, `${version}-MILESTONE-AUDIT.md`));
235
- }
236
-
237
- // Create/append MILESTONES.md entry
238
- const accomplishmentsList = accomplishments.map(a => `- ${a}`).join('\n');
239
- const milestoneEntry = `## ${version} ${milestoneName} (Shipped: ${today})\n\n**Phases completed:** ${phaseCount} phases, ${totalPlans} plans, ${totalTasks} tasks\n\n**Key accomplishments:**\n${accomplishmentsList || '- (none recorded)'}\n\n---\n\n`;
240
-
241
- if (fs.existsSync(milestonesPath)) {
242
- const existing = fs.readFileSync(milestonesPath, 'utf-8');
243
- if (!existing.trim()) {
244
- // Empty file — treat like new
245
- platformWriteSync(milestonesPath, `# Milestones\n\n${milestoneEntry}`);
246
- } else {
247
- // Insert after the header line(s) for reverse chronological order (newest first)
248
- const headerMatch = existing.match(/^(#{1,3}\s+[^\n]*\n\n?)/);
249
- if (headerMatch) {
250
- const header = headerMatch[1];
251
- const rest = existing.slice(header.length);
252
- platformWriteSync(milestonesPath, header + milestoneEntry + rest);
253
- } else {
254
- // No recognizable header — prepend the entry
255
- platformWriteSync(milestonesPath, milestoneEntry + existing);
256
- }
257
- }
258
- } else {
259
- platformWriteSync(milestonesPath, `# Milestones\n\n${milestoneEntry}`);
260
- }
261
-
262
- // Update STATE.md — keep frontmatter/body semantically aligned after closure
263
- if (fs.existsSync(statePath)) {
264
- let stateContent = fs.readFileSync(statePath, 'utf-8');
265
-
266
- stateContent = stateReplaceFieldWithFallback(stateContent, 'Status', null, `${version} milestone complete`);
267
- stateContent = stateReplaceFieldWithFallback(stateContent, 'Last Activity', 'Last activity', today);
268
- stateContent = stateReplaceFieldWithFallback(stateContent, 'Last Activity Description', null,
269
- `${version} milestone completed and archived`);
270
-
271
- // Reset Current Position narrative so resume/progress flows do not keep
272
- // pointing at closed-phase execution instructions.
273
- const positionPattern = /(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i;
274
- const closedPositionBody =
275
- `\nPhase: Milestone ${version} complete\n` +
276
- `Plan: —\n` +
277
- `Status: Awaiting next milestone\n` +
278
- `Last activity: ${today} — Milestone ${version} completed and archived\n\n`;
279
- if (positionPattern.test(stateContent)) {
280
- stateContent = stateContent.replace(positionPattern, (_m, header) => `${header}${closedPositionBody}`);
281
- } else {
282
- stateContent = `${stateContent.trimEnd()}\n\n## Current Position\n${closedPositionBody}`;
283
- }
284
-
285
- // Normalize operator-next-step tails that can become stale after close.
286
- const operatorPattern = /(##\s*Operator Next Steps\s*\n)([\s\S]*?)(?=\n##|$)/i;
287
- if (operatorPattern.test(stateContent)) {
288
- stateContent = stateContent.replace(
289
- operatorPattern,
290
- `$1\n- Start the next milestone with ${formatGsdSlash('new-milestone', resolveRuntime(cwd))}\n\n`,
291
- );
292
- } else {
293
- stateContent = `${stateContent.trimEnd()}\n\n## Operator Next Steps\n\n- Start the next milestone with ${formatGsdSlash('new-milestone', resolveRuntime(cwd))}\n`;
294
- }
295
-
296
- writeStateMd(statePath, stateContent, cwd);
297
- }
298
-
299
- // Archive phase directories if requested
300
- let phasesArchived = false;
301
- if (options.archivePhases) {
302
- try {
303
- const phaseArchiveDir = path.join(archiveDir, `${version}-phases`);
304
- platformEnsureDir(phaseArchiveDir);
305
-
306
- const phaseEntries = fs.readdirSync(phasesDir, { withFileTypes: true });
307
- const phaseDirNames = phaseEntries.filter(e => e.isDirectory()).map(e => e.name);
308
- let archivedCount = 0;
309
- for (const dir of phaseDirNames) {
310
- if (!isDirInMilestone(dir)) continue;
311
- fs.renameSync(path.join(phasesDir, dir), path.join(phaseArchiveDir, dir));
312
- archivedCount++;
313
- }
314
- phasesArchived = archivedCount > 0;
315
- } catch { /* intentionally empty */ }
316
- }
317
-
318
- const result = {
319
- version,
320
- name: milestoneName,
321
- date: today,
322
- phases: phaseCount,
323
- plans: totalPlans,
324
- tasks: totalTasks,
325
- accomplishments,
326
- archived: {
327
- roadmap: fs.existsSync(path.join(archiveDir, `${version}-ROADMAP.md`)),
328
- requirements: fs.existsSync(path.join(archiveDir, `${version}-REQUIREMENTS.md`)),
329
- audit: fs.existsSync(path.join(archiveDir, `${version}-MILESTONE-AUDIT.md`)),
330
- phases: phasesArchived,
331
- },
332
- milestones_updated: true,
333
- state_updated: fs.existsSync(statePath),
334
- };
335
-
336
- output(result, raw);
337
- }
338
-
339
- function cmdPhasesClear(cwd, raw, args) {
340
- const phasesDir = planningPaths(cwd).phases;
341
- const confirm = Array.isArray(args) && args.includes('--confirm');
342
- let cleared = 0;
343
-
344
- if (fs.existsSync(phasesDir)) {
345
- const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
346
- const dirs = entries.filter(e => e.isDirectory() && !/^999(?:\.|$)/.test(e.name));
347
-
348
- if (dirs.length > 0 && !confirm) {
349
- error(
350
- `phases clear would delete ${dirs.length} phase director${dirs.length === 1 ? 'y' : 'ies'}. ` +
351
- `Pass --confirm to proceed.`
352
- );
353
- }
354
-
355
- try {
356
- for (const entry of dirs) {
357
- fs.rmSync(path.join(phasesDir, entry.name), { recursive: true, force: true });
358
- cleared++;
359
- }
360
- } catch (e) {
361
- error('Failed to clear phases directory: ' + e.message);
362
- }
363
- }
364
-
365
- output({ cleared }, raw, `${cleared} phase director${cleared === 1 ? 'y' : 'ies'} cleared`);
366
- }
367
-
368
- module.exports = {
369
- cmdRequirementsMarkComplete,
370
- cmdMilestoneComplete,
371
- cmdPhasesClear,
372
- };
@@ -1,229 +0,0 @@
1
- 'use strict';
2
-
3
- const path = require('node:path');
4
-
5
- // Resolve model-catalog.json via a prioritised candidate list so the module
6
- // works in every layout:
7
- //
8
- // 1. Co-located install path — get-shit-done/bin/shared/model-catalog.json
9
- // Written by bin/install.js (#3288 fix). This is the canonical post-install
10
- // location across all runtimes (Claude Code, Codex, OpenCode, etc.).
11
- //
12
- // 2. Source-repo dev path — sdk/shared/model-catalog.json
13
- // Three levels up from bin/lib/: works when running directly from the
14
- // open-gsd/gsd-core clone (the original path introduced by #3230).
15
- //
16
- // 3. GSD_MODEL_CATALOG env override — allows test harnesses and custom
17
- // deployments to point at an arbitrary catalog file.
18
- //
19
- // Throws with a diagnostic message that lists all candidates when none resolve,
20
- // so MODULE_NOT_FOUND surfaces as a clear actionable error (PRED.k301).
21
- const _catalogCandidates = [
22
- path.resolve(__dirname, '..', 'shared', 'model-catalog.json'),
23
- path.resolve(__dirname, '..', '..', '..', 'sdk', 'shared', 'model-catalog.json'),
24
- process.env.GSD_MODEL_CATALOG ? path.resolve(process.env.GSD_MODEL_CATALOG) : null,
25
- ].filter(Boolean);
26
-
27
- let catalog = null;
28
- let _catalogLastErr = null;
29
- for (const _p of _catalogCandidates) {
30
- try {
31
- catalog = require(_p);
32
- break;
33
- } catch (e) {
34
- // Only treat missing-file errors as recoverable — rethrow parse errors,
35
- // permission errors, and any other real failures so they surface clearly
36
- // instead of being silently swallowed (CR finding, PR #3293).
37
- const isMissingCandidate =
38
- (e && e.code === 'MODULE_NOT_FOUND' && String(e.message || '').includes(_p)) ||
39
- (e && e.code === 'ENOENT');
40
- if (!isMissingCandidate) throw e;
41
- _catalogLastErr = e;
42
- }
43
- }
44
- if (!catalog) {
45
- throw new Error(
46
- `model-catalog.json not found. Tried:\n${_catalogCandidates.map((p) => ` ${p}`).join('\n')}\nLast error: ${_catalogLastErr?.message}`
47
- );
48
- }
49
-
50
- const VALID_PROFILES = [...catalog.profiles];
51
- const VALID_PHASE_TYPES = new Set(catalog.phaseTypes);
52
- const VALID_AGENT_TIERS = new Set(Object.keys(catalog.adaptiveTierMap));
53
-
54
- const MODEL_PROFILES = Object.fromEntries(
55
- Object.entries(catalog.agents).map(([agent, meta]) => [agent, {
56
- quality: meta.golden,
57
- balanced: meta.balanced,
58
- budget: meta.budget,
59
- adaptive: catalog.adaptiveTierMap[meta.routingTier],
60
- }])
61
- );
62
-
63
- const AGENT_TO_PHASE_TYPE = Object.fromEntries(
64
- Object.entries(catalog.agents).map(([agent, meta]) => [agent, meta.phaseType])
65
- );
66
-
67
- const AGENT_DEFAULT_TIERS = Object.fromEntries(
68
- Object.entries(catalog.agents).map(([agent, meta]) => [agent, meta.routingTier])
69
- );
70
-
71
- const MODEL_ALIAS_MAP = Object.fromEntries(
72
- Object.entries(catalog.runtimeTierDefaults.claude).map(([tier, entry]) => [tier, entry?.model])
73
- );
74
-
75
- const RUNTIME_PROFILE_MAP = Object.fromEntries(
76
- Object.entries(catalog.runtimeTierDefaults)
77
- .map(([runtime, tiers]) => [
78
- runtime,
79
- Object.fromEntries(
80
- Object.entries(tiers).filter(([, entry]) => entry).map(([tier, entry]) => [tier, entry])
81
- ),
82
- ])
83
- .filter(([, tiers]) => Object.keys(tiers).length > 0)
84
- );
85
-
86
- const KNOWN_RUNTIMES = new Set(Object.keys(catalog.runtimeTierDefaults));
87
- const RUNTIMES_WITH_REASONING_EFFORT = new Set(
88
- Object.entries(catalog.runtimeTierDefaults)
89
- .filter(([, tiers]) => Object.values(tiers).some((entry) => entry && entry.reasoning_effort))
90
- .map(([runtime]) => runtime)
91
- );
92
-
93
- const PROVIDER_PRESETS = catalog.providerPresets || {};
94
-
95
- // KNOWN_PROVIDERS excludes 'generic' — it is a sentinel (all null entries) that
96
- // forces users to supply model IDs via model_profile_overrides. It is not a
97
- // real catalog-backed provider (#49).
98
- const KNOWN_PROVIDERS = new Set(
99
- Object.entries(PROVIDER_PRESETS)
100
- .filter(([, tiers]) =>
101
- Object.values(tiers).some((budgets) =>
102
- budgets && Object.values(budgets).some((entry) => entry && entry.model)
103
- )
104
- )
105
- .map(([name]) => name)
106
- );
107
-
108
- function nextTier(currentTier) {
109
- const order = ['light', 'standard', 'heavy'];
110
- const idx = order.indexOf(String(currentTier));
111
- if (idx === -1) return null;
112
- return order[Math.min(idx + 1, order.length - 1)];
113
- }
114
-
115
- function formatAgentToModelMapAsTable(agentToModelMap) {
116
- const agentWidth = Math.max('Agent'.length, ...Object.keys(agentToModelMap).map((a) => a.length));
117
- const modelWidth = Math.max('Model'.length, ...Object.values(agentToModelMap).map((m) => m.length));
118
- const sep = '─'.repeat(agentWidth + 2) + '┼' + '─'.repeat(modelWidth + 2);
119
- const header = ` ${'Agent'.padEnd(agentWidth)} │ ${'Model'.padEnd(modelWidth)}`;
120
- let out = `${header}\n${sep}\n`;
121
- for (const [agent, model] of Object.entries(agentToModelMap)) {
122
- out += ` ${agent.padEnd(agentWidth)} │ ${model.padEnd(modelWidth)}\n`;
123
- }
124
- return out;
125
- }
126
-
127
- function getAgentToModelMapForProfile(normalizedProfile) {
128
- const profile = VALID_PROFILES.includes(normalizedProfile) ? normalizedProfile : 'balanced';
129
- const out = {};
130
- for (const [agent, profiles] of Object.entries(MODEL_PROFILES)) {
131
- out[agent] = profile === 'inherit' ? 'inherit' : (profiles[profile] ?? profiles.balanced);
132
- }
133
- return out;
134
- }
135
-
136
- // ─── Effort rendering ────────────────────────────────────────────────────────
137
- //
138
- // Universal effort ladder: minimal < low < medium < high < xhigh < max
139
- //
140
- // Each runtime supports a subset. The unique tails must be clamped when emitting
141
- // to a runtime that does not support them:
142
- // - 'max' is Anthropic-only: Codex does not support it -> clamp to 'xhigh'
143
- // - 'minimal' is Codex-only: Claude does not support it -> clamp to 'low'
144
- //
145
- // Rendering maps the universal effort string to the runtime's native parameter.
146
-
147
- const EFFORT_RENDERING = {
148
- // Claude Code subagent effort: output_config.effort frontmatter key /
149
- // CLAUDE_CODE_EFFORT_LEVEL env. Supports: low, medium, high, xhigh, max.
150
- // Does NOT support 'minimal' (Codex-only) -> clamp to 'low'.
151
- claude: {
152
- param: 'output_config.effort',
153
- channel: 'frontmatter',
154
- supported: new Set(['low', 'medium', 'high', 'xhigh', 'max']),
155
- clamp(level) {
156
- if (level === 'minimal') return 'low';
157
- return level;
158
- },
159
- },
160
- // Codex Responses API reasoning.effort. Supports: minimal, low, medium, high, xhigh.
161
- // Does NOT support 'max' (Anthropic-only) -> clamp to 'xhigh'.
162
- codex: {
163
- param: 'model_reasoning_effort',
164
- channel: 'api',
165
- supported: new Set(['minimal', 'low', 'medium', 'high', 'xhigh']),
166
- clamp(level) {
167
- if (level === 'max') return 'xhigh';
168
- return level;
169
- },
170
- },
171
- };
172
-
173
- /**
174
- * Render a universal effort string for a specific runtime.
175
- *
176
- * Returns { value (clamped), param, channel } where:
177
- * - value: the clamped effort string safe to pass to the runtime
178
- * - param: the native parameter name (e.g. 'output_config.effort')
179
- * - channel: how the value is propagated ('frontmatter', 'api', null)
180
- *
181
- * Unknown runtimes return { value: universalEffort, param: null, channel: null }
182
- * so callers can always read .value safely.
183
- */
184
- function renderEffortForRuntime(runtime, universalEffort) {
185
- const spec = EFFORT_RENDERING[runtime];
186
- if (!spec) {
187
- return { value: universalEffort, param: null, channel: null };
188
- }
189
- return {
190
- value: spec.clamp(universalEffort),
191
- param: spec.param,
192
- channel: spec.channel,
193
- };
194
- }
195
-
196
- // ─── Fast mode propagation ───────────────────────────────────────────────────
197
- //
198
- // RUNTIMES_WITH_FAST_MODE is the set of runtimes where fast_mode=true can be
199
- // propagated to a SPAWNED SUBAGENT via a native mechanism.
200
- //
201
- // Claude Code has NO per-subagent fast-mode mechanism — /fast is a session-level
202
- // toggle only. Emitting a `fast_mode: true` frontmatter key on a Claude subagent
203
- // would be a SILENT NO-OP, which is why 'claude' is deliberately excluded here.
204
- //
205
- // Only API-direct runtimes ('api') accept a speed:"fast" field in the request.
206
- // Codex and other runtimes do not expose per-call fast_mode either.
207
- const RUNTIMES_WITH_FAST_MODE = new Set(['api']);
208
-
209
- module.exports = {
210
- catalog,
211
- MODEL_PROFILES,
212
- VALID_PROFILES,
213
- AGENT_TO_PHASE_TYPE,
214
- VALID_PHASE_TYPES,
215
- AGENT_DEFAULT_TIERS,
216
- VALID_AGENT_TIERS,
217
- MODEL_ALIAS_MAP,
218
- RUNTIME_PROFILE_MAP,
219
- KNOWN_RUNTIMES,
220
- RUNTIMES_WITH_REASONING_EFFORT,
221
- PROVIDER_PRESETS,
222
- KNOWN_PROVIDERS,
223
- nextTier,
224
- formatAgentToModelMapAsTable,
225
- getAgentToModelMapForProfile,
226
- EFFORT_RENDERING,
227
- renderEffortForRuntime,
228
- RUNTIMES_WITH_FAST_MODE,
229
- };
@@ -1,31 +0,0 @@
1
- 'use strict';
2
-
3
- const {
4
- MODEL_PROFILES,
5
- VALID_PROFILES,
6
- AGENT_TO_PHASE_TYPE,
7
- VALID_PHASE_TYPES,
8
- AGENT_DEFAULT_TIERS,
9
- VALID_AGENT_TIERS,
10
- nextTier,
11
- formatAgentToModelMapAsTable,
12
- getAgentToModelMapForProfile,
13
- EFFORT_RENDERING,
14
- renderEffortForRuntime,
15
- RUNTIMES_WITH_FAST_MODE,
16
- } = require('./model-catalog.cjs');
17
-
18
- module.exports = {
19
- MODEL_PROFILES,
20
- VALID_PROFILES,
21
- AGENT_TO_PHASE_TYPE,
22
- VALID_PHASE_TYPES,
23
- AGENT_DEFAULT_TIERS,
24
- VALID_AGENT_TIERS,
25
- nextTier,
26
- formatAgentToModelMapAsTable,
27
- getAgentToModelMapForProfile,
28
- EFFORT_RENDERING,
29
- renderEffortForRuntime,
30
- RUNTIMES_WITH_FAST_MODE,
31
- };