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

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 +823 -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,82 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * DispatchEvent shape factory — issue #177 (ADR-0174 P1.3), extended in #178 (P1.4).
5
- *
6
- * Creates a structured event record for every Hub dispatch, used by
7
- * DispatchLogger to emit stderr errors and opt-in file audit trails.
8
- *
9
- * Shape:
10
- * traceId: string — UUID v4, generated per dispatch
11
- * parentTraceId: string|undefined — propagated from the caller when it is a canonical UUID v4
12
- * (RFC 4122); invalid values are silently coerced to undefined.
13
- * Enables a future init-composer (Phase 2) to correlate child
14
- * dispatches to their parent via the audit file.
15
- * command: string — the dispatched verb
16
- * args?: unknown — only present when includeArgs === true
17
- * result: { kind: 'ok' | 'UnknownCommand' | 'InvalidArgs' | 'HandlerRefusal' | 'HandlerFailure', ...payload }
18
- * timestamp: string — ISO 8601
19
- */
20
-
21
- const { randomUUID } = require('crypto');
22
-
23
- /**
24
- * Canonical UUID v4 regex (RFC 4122).
25
- * - 36 characters total (32 hex + 4 hyphens)
26
- * - Version nibble: 4
27
- * - Variant bits: [89ab]
28
- * - Case-insensitive: accepts both upper- and lowercase hex
29
- *
30
- * Used to validate parentTraceId before propagation. traceId is always
31
- * generated internally by crypto.randomUUID() and is guaranteed valid.
32
- */
33
- const UUID_V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
34
-
35
- /**
36
- * Returns true only when value is a canonical UUID v4 string.
37
- * Any other value (non-string, wrong format, wrong version/variant) → false.
38
- *
39
- * @param {unknown} value
40
- * @returns {boolean}
41
- */
42
- function isValidParentTraceId(value) {
43
- return typeof value === 'string' && UUID_V4_REGEX.test(value);
44
- }
45
-
46
- /**
47
- * Create a DispatchEvent.
48
- *
49
- * @param {object} opts
50
- * @param {string} opts.command - The dispatched command verb.
51
- * @param {unknown} [opts.args] - Raw args passed to the hub.
52
- * @param {object} opts.result - The HubResult returned by the hub.
53
- * @param {boolean} [opts.includeArgs=false] - When true, include args in the event.
54
- * @param {string} [opts.parentTraceId] - Must be a canonical UUID v4 (RFC 4122).
55
- * Invalid values (non-string, wrong format, wrong version/variant) are silently coerced
56
- * to undefined — no stderr warn is emitted. This prevents correlation poisoning from
57
- * unvalidated caller input while keeping the factory pure and side-effect-free.
58
- * @returns {object} Immutable DispatchEvent record.
59
- */
60
- function makeDispatchEvent({ command, args, result, includeArgs = false, parentTraceId }) {
61
- // Validate parentTraceId against UUID v4 format before propagation.
62
- // Invalid inputs (empty string, non-UUID, UUID v1, oversized, etc.) are silently
63
- // coerced to undefined. Silent coercion keeps the factory pure — no side effects,
64
- // no log spam on bad input, consistent with how non-string values already collapse.
65
- const resolvedParentTraceId = isValidParentTraceId(parentTraceId) ? parentTraceId : undefined;
66
-
67
- const event = {
68
- traceId: randomUUID(),
69
- parentTraceId: resolvedParentTraceId,
70
- command: String(command),
71
- result,
72
- timestamp: new Date().toISOString(),
73
- };
74
-
75
- if (includeArgs && args !== undefined) {
76
- event.args = args;
77
- }
78
-
79
- return Object.freeze(event);
80
- }
81
-
82
- module.exports = { makeDispatchEvent };
@@ -1,174 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * DispatchLogger interface + default implementation — issue #177 (ADR-0174 P1.3).
5
- *
6
- * Interface:
7
- * { onEvent(event: DispatchEvent): void }
8
- *
9
- * Default behaviour (createDefaultLogger):
10
- * 1. Silent on success — no stdout/stderr when result.kind === 'ok'.
11
- * 2. Structured JSON to stderr on error — one line per dispatch error.
12
- * 3. Opt-in audit file — when GSD_AUDIT=1 OR config.audit.enabled===true,
13
- * appends every event (success + error) as one JSON line to
14
- * .planning/.gsd-trace.jsonl relative to `cwd`. Creates .planning/ if absent.
15
- * 4. Args redaction — args omitted by default; included when GSD_AUDIT_ARGS=1.
16
- *
17
- * No-op logger (createNoOpLogger):
18
- * Silent on all events. Used as the Hub default when no logger is injected.
19
- */
20
-
21
- const fs = require('fs');
22
- const path = require('path');
23
-
24
- const { redactEvent, shouldIncludeArgs } = require('./redaction.cjs');
25
-
26
- const AUDIT_FILE_NAME = '.gsd-trace.jsonl';
27
- const PLANNING_DIR = '.planning';
28
-
29
- // ─── helpers ─────────────────────────────────────────────────────────────────
30
-
31
- /**
32
- * Safely serialise a value to JSON, falling back to a placeholder on circular refs.
33
- * @param {unknown} value
34
- * @returns {string}
35
- */
36
- function _safeStringify(value) {
37
- try {
38
- return JSON.stringify(value);
39
- } catch {
40
- return JSON.stringify({ _serializationError: true });
41
- }
42
- }
43
-
44
- /**
45
- * Determine whether the audit file should be written to.
46
- *
47
- * @param {{ audit?: { enabled?: boolean } } | undefined} config
48
- * @returns {boolean}
49
- */
50
- function _isAuditEnabled(config) {
51
- if (process.env.GSD_AUDIT === '1') return true;
52
- if (config && config.audit && config.audit.enabled === true) return true;
53
- return false;
54
- }
55
-
56
- /**
57
- * Build the redacted plain object for the audit file.
58
- * Preserves the full DispatchEvent structure.
59
- *
60
- * @param {object} event - DispatchEvent
61
- * @returns {object}
62
- */
63
- function _toAuditRecord(event) {
64
- return redactEvent(event);
65
- }
66
-
67
- /**
68
- * Build the flattened stderr error line.
69
- *
70
- * Per ADR-0174 P1.3 contract: { "kind": "<variant>", "traceId": "<uuid>", ...typedPayload }
71
- * The result's kind is promoted to top-level and the typed payload fields are spread in.
72
- * The `result` wrapper is removed.
73
- *
74
- * @param {object} event - DispatchEvent with an error result
75
- * @returns {object}
76
- */
77
- function _toStderrRecord(event) {
78
- const redacted = redactEvent(event);
79
- const { result, ...eventWithoutResult } = redacted;
80
- // Flatten: top-level gets kind + typed payload fields from result
81
- const { kind, ...typedPayload } = result;
82
- return Object.assign({}, eventWithoutResult, { kind }, typedPayload);
83
- }
84
-
85
- /**
86
- * Append one JSON line to the audit file.
87
- * Creates .planning/ directory if it does not exist.
88
- *
89
- * Uses synchronous fs API (crash-safe for v1 — dispatch is synchronous).
90
- *
91
- * @param {string} cwd - Project root directory.
92
- * @param {object} event - Redacted DispatchEvent.
93
- */
94
- function _appendAuditLine(cwd, event) {
95
- const planningDir = path.join(cwd, PLANNING_DIR);
96
- // Ensure the directory exists
97
- if (!fs.existsSync(planningDir)) {
98
- fs.mkdirSync(planningDir, { recursive: true });
99
- }
100
- const auditPath = path.join(planningDir, AUDIT_FILE_NAME);
101
- fs.appendFileSync(auditPath, _safeStringify(event) + '\n', 'utf8');
102
- }
103
-
104
- // ─── Public factories ─────────────────────────────────────────────────────────
105
-
106
- /**
107
- * Create a no-op logger. All events are silently dropped.
108
- * This is the Hub's default when no logger is injected by the caller.
109
- *
110
- * @returns {{ onEvent(event: object): void }}
111
- */
112
- function createNoOpLogger() {
113
- return {
114
- onEvent(_event) {
115
- // intentionally empty
116
- },
117
- };
118
- }
119
-
120
- /**
121
- * Create the default DispatchLogger.
122
- *
123
- * @param {object} [opts]
124
- * @param {string} [opts.cwd=process.cwd()] - Project root; audit file is written relative to this.
125
- * @param {object} [opts.config] - GSD config object. config.audit.enabled triggers audit.
126
- * @returns {{ onEvent(event: object): void }}
127
- */
128
- function createDefaultLogger({ cwd = process.cwd(), config } = {}) {
129
- return {
130
- /**
131
- * @param {object} event - A DispatchEvent from the Hub.
132
- */
133
- onEvent(event) {
134
- const isOk = event && event.result && event.result.kind === 'ok';
135
-
136
- // ── Audit file (both ok and error) ────────────────────────────────────
137
- if (_isAuditEnabled(config)) {
138
- try {
139
- const auditRecord = _toAuditRecord(event);
140
- _appendAuditLine(cwd, auditRecord);
141
- } catch (auditErr) {
142
- // Audit errors must not surface to callers
143
- process.stderr.write(
144
- _safeStringify({
145
- level: 'warn',
146
- source: 'DispatchLogger',
147
- message: 'audit file write failed: ' + String(auditErr && auditErr.message || auditErr),
148
- }) + '\n'
149
- );
150
- }
151
- }
152
-
153
- // ── Stderr on error ───────────────────────────────────────────────────
154
- if (!isOk) {
155
- try {
156
- const stderrRecord = _toStderrRecord(event);
157
- process.stderr.write(_safeStringify(stderrRecord) + '\n');
158
- } catch (stderrErr) {
159
- // Last-resort: we cannot throw from the logger
160
- process.stderr.write(
161
- _safeStringify({
162
- level: 'warn',
163
- source: 'DispatchLogger',
164
- message: 'stderr emit failed: ' + String(stderrErr && stderrErr.message || stderrErr),
165
- }) + '\n'
166
- );
167
- }
168
- }
169
- // ── Silent on success (no else branch needed) ─────────────────────────
170
- },
171
- };
172
- }
173
-
174
- module.exports = { createDefaultLogger, createNoOpLogger };
@@ -1,191 +0,0 @@
1
- 'use strict';
2
-
3
- const { PHASE_SUBCOMMANDS } = require('./command-aliases.cjs');
4
-
5
- // ─── CommandRoutingHub (issue #3788, simplified in #175, typed in #176) ───────
6
- const { createHub, ERROR_KINDS, makeInvalidArgs } = require('./command-routing-hub.cjs');
7
-
8
- /**
9
- * Manifest-backed phase subcommand router.
10
- * Keeps gsd-tools.cjs thin while preserving existing command semantics.
11
- *
12
- * Unsupported in this router:
13
- * - scaffold: routed through top-level scaffold command.
14
- *
15
- * CJS-only subcommands: mvp-mode (dispatched directly, before hub).
16
- *
17
- * #3788: dispatch is mediated by CommandRoutingHub. The public entry point
18
- * and observable CLI behaviour are unchanged.
19
- */
20
- function routePhaseCommand({ phase, args, cwd, raw, error }) {
21
- // ── Unsupported subcommands ─────────────────────────────────────────────────
22
- // Resolved before dispatch so the error message stays deterministic.
23
- const UNSUPPORTED = {
24
- scaffold: 'phase scaffold is routed through the top-level scaffold command.',
25
- };
26
-
27
- const subcommand = args[1];
28
-
29
- if (subcommand && UNSUPPORTED[subcommand]) {
30
- error(UNSUPPORTED[subcommand]);
31
- return;
32
- }
33
-
34
- // ── No subcommand → reject early with helpful error ────────────────────────
35
- // Pre-#3788 code resolved unknown subcommands via routeCjsCommandFamily which
36
- // fell through to error() when no handler matched (including undefined).
37
- // Post-#3788 the hub's manifest check is skipped for falsy subcommand, so we
38
- // must guard here to preserve the deterministic "Available: ..." error message.
39
- if (!subcommand) {
40
- const available = PHASE_SUBCOMMANDS.filter(s => !UNSUPPORTED[s]).join(', ');
41
- error(`Unknown phase subcommand. Available: ${available}`);
42
- return;
43
- }
44
-
45
- // ── CJS-only subcommands (dispatched directly, before hub) ─────────────────
46
- // `mvp-mode` has a CJS-native implementation in phase.cmdPhaseMvpMode that
47
- // differs from the SDK query layer (different ROADMAP scan + error codes).
48
- // Dispatch it early to preserve pre-migration observable behaviour (correct
49
- // exit code, correct JSON error reason code, correct ROADMAP scan).
50
- if (subcommand === 'mvp-mode') {
51
- phase.cmdPhaseMvpMode(cwd, args.slice(2), raw);
52
- return;
53
- }
54
-
55
- // ── Build the CJS registry ──────────────────────────────────────────────────
56
- // Each handler receives a ctx object from the hub and must return a HubResult.
57
- const cjsRegistry = {
58
- phase: {
59
- 'next-decimal': (_ctx) => {
60
- phase.cmdPhaseNextDecimal(cwd, args[2], raw);
61
- return { ok: true, data: null };
62
- },
63
- add: (_ctx) => {
64
- let customId = null;
65
- const descArgs = [];
66
- for (let i = 2; i < args.length; i++) {
67
- const token = args[i];
68
- if (token === '--raw') {
69
- continue;
70
- }
71
- if (token === '--id') {
72
- const id = args[i + 1];
73
- if (!id || id.startsWith('--')) {
74
- return makeInvalidArgs('--id', '--id requires a value');
75
- }
76
- customId = id;
77
- i++;
78
- } else if (token.startsWith('--')) {
79
- return makeInvalidArgs(token, `phase add does not support ${token}`);
80
- } else {
81
- descArgs.push(token);
82
- }
83
- }
84
- phase.cmdPhaseAdd(cwd, descArgs.join(' '), raw, customId);
85
- return { ok: true, data: null };
86
- },
87
- 'add-batch': (_ctx) => {
88
- const descFlagIdx = args.indexOf('--descriptions');
89
- let descriptions;
90
- if (descFlagIdx !== -1) {
91
- const rawDescriptions = args[descFlagIdx + 1];
92
- if (!rawDescriptions || rawDescriptions.startsWith('--')) {
93
- return makeInvalidArgs('--descriptions', '--descriptions must be a JSON array');
94
- }
95
- try {
96
- descriptions = JSON.parse(rawDescriptions);
97
- } catch {
98
- return makeInvalidArgs('--descriptions', '--descriptions must be a JSON array');
99
- }
100
- if (!Array.isArray(descriptions)) {
101
- return makeInvalidArgs('--descriptions', '--descriptions must be a JSON array');
102
- }
103
- } else {
104
- descriptions = args.slice(2).filter(a => a !== '--raw');
105
- }
106
- phase.cmdPhaseAddBatch(cwd, descriptions, raw);
107
- return { ok: true, data: null };
108
- },
109
- insert: (_ctx) => {
110
- if (args.includes('--dry-run')) {
111
- return makeInvalidArgs('--dry-run', 'phase insert does not support --dry-run');
112
- }
113
- phase.cmdPhaseInsert(cwd, args[2], args.slice(3).join(' '), raw);
114
- return { ok: true, data: null };
115
- },
116
- remove: (_ctx) => {
117
- const removeArgs = args.slice(2).filter(token => token !== '--raw');
118
- let forceFlag = false;
119
- const positional = [];
120
- for (const token of removeArgs) {
121
- if (token === '--force') {
122
- forceFlag = true;
123
- continue;
124
- }
125
- if (token.startsWith('--')) {
126
- return makeInvalidArgs(token, `phase remove does not support ${token}`);
127
- }
128
- positional.push(token);
129
- }
130
- if (positional.length !== 1) {
131
- return makeInvalidArgs('<phase-number>', 'phase remove accepts exactly one phase number');
132
- }
133
- phase.cmdPhaseRemove(cwd, positional[0], { force: forceFlag }, raw);
134
- return { ok: true, data: null };
135
- },
136
- complete: (_ctx) => {
137
- phase.cmdPhaseComplete(cwd, args[2], raw);
138
- return { ok: true, data: null };
139
- },
140
- },
141
- };
142
-
143
- // ── Build manifest (available subcommands for UnknownCommand detection) ─────
144
- // `availableSubcommands` is what the error message shows. It excludes
145
- // unsupported commands (already handled above) but does NOT include 'mvp-mode'
146
- // because it was absent from PHASE_SUBCOMMANDS in the original and was not
147
- // shown in the "Available:" list there either.
148
- //
149
- // `manifestSubcommands` is the full routing set for the hub — it includes
150
- // 'mvp-mode' (which the original code routed via a handler even without a
151
- // manifest entry) so the hub's UnknownCommand check passes for it.
152
- const availableSubcommands = PHASE_SUBCOMMANDS.filter(s => !UNSUPPORTED[s]);
153
- const manifestSubcommands = ['mvp-mode', ...availableSubcommands];
154
- const manifest = { phase: manifestSubcommands };
155
-
156
- // ── Construct hub ──────────────────────────────────────────────────────────
157
- // #175: Hub is CJS-only — no mode param, no sdkLoader.
158
- const hub = createHub({ cjsRegistry, manifest });
159
-
160
- // ── Dispatch ────────────────────────────────────────────────────────────────
161
- const result = hub.dispatch({
162
- family: 'phase',
163
- subcommand,
164
- args: args.slice(2),
165
- cwd,
166
- raw,
167
- });
168
-
169
- // ── Translate result → CLI output / error (adapter responsibility) ──────────
170
- // CJS handlers call output() themselves (inside phase.cmdPhase*()).
171
- // No further output call is needed here.
172
- if (!result.ok) {
173
- if (result.kind === ERROR_KINDS.UnknownCommand) {
174
- const available = availableSubcommands.join(', ');
175
- error(`Unknown phase subcommand. Available: ${available}`);
176
- return;
177
- }
178
- if (result.kind === ERROR_KINDS.InvalidArgs || result.kind === ERROR_KINDS.HandlerRefusal) {
179
- // #176: typed payload — reason holds the human-readable message
180
- error(result.reason);
181
- return;
182
- }
183
- // HandlerFailure: message field
184
- error(result.message);
185
- return;
186
- }
187
- }
188
-
189
- module.exports = {
190
- routePhaseCommand,
191
- };
@@ -1,79 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * Phase Lifecycle Pure Helpers — pure-computation functions extracted from
5
- * the phase-lifecycle SDK handler.
6
- *
7
- * I/O adapter pattern (ADR-3524 Section 4): each side supplies its own I/O
8
- * (sync readFileSync for CJS, async readFile for SDK); the pure computation
9
- * logic is shared via this generated artifact.
10
- *
11
- * Scope:
12
- * - deriveProgressFromRoadmap(roadmapContent): count Complete rows => idempotent
13
- * - clampPercent(completed, total): percent with 100 ceiling
14
- *
15
- * These two functions are the root-cause fix for issue #4.
16
- *
17
- * References:
18
- * - ADR-3524 (docs/adr/3524-cjs-sdk-hard-seam.md)
19
- * - Issue #4 (open-gsd/gsd-core)
20
- */
21
-
22
- /**
23
- * Derive completed_phases, total_phases, and total_plans from ROADMAP content.
24
- * Root cause fix for issue #4 — see gen-phase-lifecycle.mjs for full documentation.
25
- */
26
- function deriveProgressFromRoadmap(roadmapContent) {
27
- let completedPhases = null;
28
- let totalPhases = null;
29
- let totalPlans = null;
30
-
31
- try {
32
- // Count Complete rows in the progress table (Status column = "Complete").
33
- // Pattern: row where the phase cell starts with a digit (data row, not header),
34
- // followed by any cell content, then a "Complete" status cell.
35
- // Handles both short form ("| 4. |") and long form ("| 01. Foundation |").
36
- // See phase-lifecycle.ts ~line 1655 for the original SDK pattern.
37
- const tableCompletePattern = /\|\s*\d+[^|]*\|\s*[^|]*\|\s*Complete\s*\|/gi;
38
- const completeMatches = roadmapContent.match(tableCompletePattern);
39
- completedPhases = completeMatches ? completeMatches.length : null;
40
-
41
- // Count total phase rows in the progress table.
42
- // Identify the table by looking for Phase|...|Status|...|Completed header.
43
- const progressTableMatch = roadmapContent.match(
44
- /\|\s*Phase\s*\|[^|]*\|[^|]*Status[^|]*\|[^|]*Completed[^|]*\|[\s\S]*?(?=\n\n|\n##|$)/i,
45
- );
46
- if (progressTableMatch) {
47
- const tableText = progressTableMatch[0];
48
- // Count data rows (rows starting with pipe then a phase number)
49
- const dataRowPattern = /^\|\s*\d+/gm;
50
- const dataRows = tableText.match(dataRowPattern);
51
- totalPhases = dataRows ? dataRows.length : null;
52
- }
53
-
54
- // Sum plan counts from M/N columns in progress table
55
- let totalPlansSum = 0;
56
- const planCellPattern = /\|\s*\d+[^|]*\|\s*(\d+)\/(\d+)\s*\|/gi;
57
- let pm;
58
- while ((pm = planCellPattern.exec(roadmapContent)) !== null) {
59
- totalPlansSum += parseInt(pm[2], 10);
60
- }
61
- if (totalPlansSum > 0) totalPlans = totalPlansSum;
62
- } catch { /* intentionally empty — fall through to existing values */ }
63
-
64
- return { completedPhases, totalPhases, totalPlans };
65
- }
66
-
67
- /**
68
- * Compute progress percent clamped to 100.
69
- * Root cause fix for issue #4 — see gen-phase-lifecycle.mjs for full documentation.
70
- */
71
- function clampPercent(completed, total) {
72
- if (!total || total <= 0) return 0;
73
- return Math.min(100, Math.round((completed / total) * 100));
74
- }
75
-
76
- module.exports = {
77
- deriveProgressFromRoadmap,
78
- clampPercent,
79
- };