@opengsd/gsd-core 1.2.0 → 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 (532) hide show
  1. package/README.ja-JP.md +46 -791
  2. package/README.ko-KR.md +44 -780
  3. package/README.md +42 -218
  4. package/README.pt-BR.md +47 -414
  5. package/README.zh-CN.md +46 -763
  6. package/agents/gsd-ai-researcher.md +2 -2
  7. package/agents/gsd-debug-session-manager.md +1 -1
  8. package/agents/gsd-debugger.md +8 -8
  9. package/agents/gsd-doc-writer.md +7 -6
  10. package/agents/gsd-domain-researcher.md +15 -2
  11. package/agents/gsd-eval-auditor.md +1 -1
  12. package/agents/gsd-eval-planner.md +2 -2
  13. package/agents/gsd-executor.md +21 -8
  14. package/agents/gsd-framework-selector.md +1 -1
  15. package/agents/gsd-intel-updater.md +4 -4
  16. package/agents/gsd-phase-researcher.md +19 -6
  17. package/agents/gsd-plan-checker.md +3 -3
  18. package/agents/gsd-planner.md +36 -23
  19. package/agents/gsd-project-researcher.md +13 -0
  20. package/agents/gsd-research-synthesizer.md +6 -2
  21. package/agents/gsd-roadmapper.md +6 -6
  22. package/agents/gsd-ui-researcher.md +16 -3
  23. package/agents/gsd-user-profiler.md +2 -2
  24. package/agents/gsd-verifier.md +8 -8
  25. package/assets/gsd-logo-2000-transparent.png +0 -0
  26. package/assets/gsd-logo-2000-transparent.svg +17 -0
  27. package/assets/gsd-logo-2000.png +0 -0
  28. package/assets/gsd-logo-2000.svg +21 -0
  29. package/assets/terminal.svg +68 -0
  30. package/bin/install.js +255 -103
  31. package/commands/gsd/add-tests.md +1 -1
  32. package/commands/gsd/ai-integration-phase.md +3 -3
  33. package/commands/gsd/audit-fix.md +1 -1
  34. package/commands/gsd/audit-milestone.md +1 -1
  35. package/commands/gsd/audit-uat.md +1 -1
  36. package/commands/gsd/autonomous.md +2 -2
  37. package/commands/gsd/capture.md +6 -6
  38. package/commands/gsd/cleanup.md +1 -1
  39. package/commands/gsd/code-review.md +1 -1
  40. package/commands/gsd/complete-milestone.md +2 -2
  41. package/commands/gsd/config.md +3 -3
  42. package/commands/gsd/debug.md +1 -1
  43. package/commands/gsd/discuss-phase.md +5 -4
  44. package/commands/gsd/docs-update.md +1 -1
  45. package/commands/gsd/eval-review.md +2 -2
  46. package/commands/gsd/execute-phase.md +2 -2
  47. package/commands/gsd/explore.md +1 -1
  48. package/commands/gsd/extract-learnings.md +2 -2
  49. package/commands/gsd/fast.md +1 -1
  50. package/commands/gsd/forensics.md +1 -1
  51. package/commands/gsd/graphify.md +9 -9
  52. package/commands/gsd/health.md +1 -1
  53. package/commands/gsd/help.md +2 -2
  54. package/commands/gsd/import.md +5 -5
  55. package/commands/gsd/inbox.md +1 -1
  56. package/commands/gsd/ingest-docs.md +4 -4
  57. package/commands/gsd/manager.md +3 -3
  58. package/commands/gsd/map-codebase.md +1 -1
  59. package/commands/gsd/milestone-summary.md +1 -1
  60. package/commands/gsd/mvp-phase.md +4 -4
  61. package/commands/gsd/new-milestone.md +5 -5
  62. package/commands/gsd/new-project.md +5 -5
  63. package/commands/gsd/pause-work.md +2 -2
  64. package/commands/gsd/phase.md +4 -4
  65. package/commands/gsd/plan-phase.md +2 -2
  66. package/commands/gsd/plan-review-convergence.md +4 -4
  67. package/commands/gsd/pr-branch.md +1 -1
  68. package/commands/gsd/profile-user.md +2 -2
  69. package/commands/gsd/progress.md +4 -4
  70. package/commands/gsd/quick.md +1 -1
  71. package/commands/gsd/resume-work.md +1 -1
  72. package/commands/gsd/review.md +3 -2
  73. package/commands/gsd/secure-phase.md +1 -1
  74. package/commands/gsd/settings.md +1 -1
  75. package/commands/gsd/ship.md +2 -2
  76. package/commands/gsd/sketch.md +7 -7
  77. package/commands/gsd/spec-phase.md +2 -2
  78. package/commands/gsd/spike.md +3 -3
  79. package/commands/gsd/stats.md +1 -1
  80. package/commands/gsd/surface.md +4 -4
  81. package/commands/gsd/thread.md +1 -1
  82. package/commands/gsd/ui-phase.md +2 -2
  83. package/commands/gsd/ui-review.md +2 -2
  84. package/commands/gsd/ultraplan-phase.md +2 -2
  85. package/commands/gsd/undo.md +3 -3
  86. package/commands/gsd/update.md +3 -3
  87. package/commands/gsd/validate-phase.md +1 -1
  88. package/commands/gsd/verify-work.md +2 -2
  89. package/commands/gsd/workspace.md +4 -4
  90. package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
  91. package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +50 -4
  92. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  93. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  94. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  95. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  96. package/gsd-core/bin/lib/audit.cjs +743 -0
  97. package/gsd-core/bin/lib/check-command-router.cjs +342 -0
  98. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  99. package/gsd-core/bin/lib/clock.cjs +95 -0
  100. package/gsd-core/bin/lib/clusters.cjs +128 -0
  101. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  102. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  103. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  104. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  105. package/gsd-core/bin/lib/commands.cjs +1202 -0
  106. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  107. package/gsd-core/bin/lib/config-types.cjs +19 -0
  108. package/gsd-core/bin/lib/config.cjs +714 -0
  109. package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
  110. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  111. package/gsd-core/bin/lib/core.cjs +2007 -0
  112. package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
  113. package/gsd-core/bin/lib/docs.cjs +252 -0
  114. package/gsd-core/bin/lib/drift.cjs +364 -0
  115. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  116. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  117. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  118. package/gsd-core/bin/lib/graphify.cjs +496 -0
  119. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  120. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  121. package/gsd-core/bin/lib/init.cjs +1799 -0
  122. package/gsd-core/bin/lib/install-profiles.cjs +526 -0
  123. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  124. package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
  125. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  126. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  127. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  128. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  129. package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
  130. package/gsd-core/bin/lib/intel.cjs +607 -0
  131. package/gsd-core/bin/lib/learnings.cjs +270 -0
  132. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  133. package/gsd-core/bin/lib/milestone.cjs +373 -0
  134. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  135. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  136. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  137. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  138. package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
  139. package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
  140. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  141. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  142. package/gsd-core/bin/lib/phase.cjs +1307 -0
  143. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  144. package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
  145. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  146. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  147. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  148. package/gsd-core/bin/lib/project-root.cjs +119 -0
  149. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  150. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  151. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  152. package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
  153. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  154. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
  155. package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
  156. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  157. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  158. package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
  159. package/gsd-core/bin/lib/secrets.cjs +34 -0
  160. package/gsd-core/bin/lib/security.cjs +407 -0
  161. package/gsd-core/bin/lib/semver-compare.cjs +42 -0
  162. package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
  163. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  164. package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -82
  165. package/gsd-core/bin/lib/state.cjs +2010 -0
  166. package/gsd-core/bin/lib/surface.cjs +406 -0
  167. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  168. package/gsd-core/bin/lib/template.cjs +237 -0
  169. package/gsd-core/bin/lib/uat.cjs +297 -0
  170. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  171. package/gsd-core/bin/lib/update-context.cjs +218 -0
  172. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  173. package/gsd-core/bin/lib/validate.cjs +112 -0
  174. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  175. package/gsd-core/bin/lib/verify.cjs +1451 -0
  176. package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
  177. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  178. package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
  179. package/gsd-core/bin/lib/workstream.cjs +380 -0
  180. package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
  181. package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +1 -0
  182. package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +17 -1
  183. package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +27 -0
  184. package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
  185. package/{get-shit-done → gsd-core}/references/checkpoints.md +1 -1
  186. package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
  187. package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
  188. package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
  189. package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
  190. package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
  191. package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +1 -1
  192. package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
  193. package/{get-shit-done → gsd-core}/references/ui-brand.md +4 -2
  194. package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
  195. package/gsd-core/references/worktree-branch-check.md +38 -0
  196. package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
  197. package/{get-shit-done → gsd-core}/templates/README.md +2 -2
  198. package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
  199. package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
  200. package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
  201. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  202. package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
  203. package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
  204. package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
  205. package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
  206. package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
  207. package/{get-shit-done → gsd-core}/workflows/audit-fix.md +2 -2
  208. package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +3 -1
  209. package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
  210. package/{get-shit-done → gsd-core}/workflows/autonomous.md +10 -8
  211. package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
  212. package/{get-shit-done → gsd-core}/workflows/cleanup.md +44 -4
  213. package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +4 -4
  214. package/{get-shit-done → gsd-core}/workflows/code-review.md +6 -4
  215. package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
  216. package/{get-shit-done → gsd-core}/workflows/debug.md +7 -2
  217. package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +6 -2
  218. package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
  219. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +5 -5
  220. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
  221. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
  222. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
  223. package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +4 -4
  224. package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
  225. package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
  226. package/{get-shit-done → gsd-core}/workflows/docs-update.md +19 -5
  227. package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
  228. package/{get-shit-done → gsd-core}/workflows/eval-review.md +3 -3
  229. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +16 -3
  230. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  231. package/{get-shit-done → gsd-core}/workflows/execute-phase.md +89 -57
  232. package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
  233. package/{get-shit-done → gsd-core}/workflows/explore.md +5 -3
  234. package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
  235. package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
  236. package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
  237. package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
  238. package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +3 -3
  239. package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +6 -6
  240. package/{get-shit-done → gsd-core}/workflows/import.md +3 -1
  241. package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +5 -5
  242. package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
  243. package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
  244. package/{get-shit-done → gsd-core}/workflows/manager.md +3 -3
  245. package/{get-shit-done → gsd-core}/workflows/map-codebase.md +3 -1
  246. package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
  247. package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
  248. package/{get-shit-done → gsd-core}/workflows/new-milestone.md +5 -5
  249. package/{get-shit-done → gsd-core}/workflows/new-project.md +8 -8
  250. package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
  251. package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
  252. package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
  253. package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
  254. package/{get-shit-done → gsd-core}/workflows/plan-phase.md +29 -28
  255. package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +10 -10
  256. package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
  257. package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
  258. package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
  259. package/{get-shit-done → gsd-core}/workflows/quick.md +7 -29
  260. package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
  261. package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
  262. package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
  263. package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
  264. package/{get-shit-done → gsd-core}/workflows/review.md +110 -2
  265. package/{get-shit-done → gsd-core}/workflows/scan.md +3 -1
  266. package/{get-shit-done → gsd-core}/workflows/secure-phase.md +5 -3
  267. package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +196 -6
  268. package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
  269. package/{get-shit-done → gsd-core}/workflows/settings.md +16 -2
  270. package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
  271. package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
  272. package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
  273. package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
  274. package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
  275. package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
  276. package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
  277. package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
  278. package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
  279. package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
  280. package/{get-shit-done → gsd-core}/workflows/ui-phase.md +5 -5
  281. package/{get-shit-done → gsd-core}/workflows/ui-review.md +3 -3
  282. package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
  283. package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
  284. package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
  285. package/{get-shit-done → gsd-core}/workflows/validate-phase.md +5 -3
  286. package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
  287. package/{get-shit-done → gsd-core}/workflows/verify-work.md +7 -7
  288. package/hooks/dist/gsd-check-update-worker.js +16 -3
  289. package/hooks/dist/gsd-check-update.js +7 -5
  290. package/hooks/dist/gsd-context-monitor.js +2 -2
  291. package/hooks/dist/gsd-statusline.js +39 -21
  292. package/hooks/dist/gsd-update-banner.js +6 -2
  293. package/hooks/dist/gsd-worktree-path-guard.js +169 -0
  294. package/hooks/dist/managed-hooks-registry.cjs +35 -0
  295. package/hooks/gsd-check-update-worker.js +16 -3
  296. package/hooks/gsd-check-update.js +7 -5
  297. package/hooks/gsd-context-monitor.js +2 -2
  298. package/hooks/gsd-statusline.js +39 -21
  299. package/hooks/gsd-update-banner.js +6 -2
  300. package/hooks/gsd-worktree-path-guard.js +169 -0
  301. package/hooks/managed-hooks-registry.cjs +1 -0
  302. package/package.json +17 -11
  303. package/scripts/affected-tests-lib.cjs +1 -1
  304. package/scripts/base64-scan.sh +12 -0
  305. package/scripts/build-hooks.js +5 -1
  306. package/scripts/changeset/cli.cjs +2 -2
  307. package/scripts/changeset/github-release-notes.cjs +1 -1
  308. package/scripts/changeset/lint.cjs +1 -1
  309. package/scripts/check-alias-drift.cjs +8 -8
  310. package/scripts/check-env.cjs +5 -1
  311. package/scripts/ci-test-scope.cjs +34 -9
  312. package/scripts/command-contract-helpers.cjs +1 -1
  313. package/scripts/fix-slash-commands.cjs +5 -5
  314. package/scripts/gen-inventory-manifest.cjs +3 -3
  315. package/scripts/generate-package-identity.cjs +28 -7
  316. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  317. package/scripts/lint-command-contract.cjs +1 -1
  318. package/scripts/lint-legacy-dir-name.cjs +156 -0
  319. package/scripts/lint-package-identity-drift.cjs +8 -8
  320. package/scripts/lint-pr-check-project-dir.cjs +0 -1
  321. package/scripts/lint-shell-command-projection-drift.cjs +1 -1
  322. package/scripts/lint-skill-deps.cjs +1 -1
  323. package/scripts/lint-test-file-count.allowlist.json +129 -32
  324. package/scripts/lint-test-file-count.cjs +85 -30
  325. package/scripts/mutation-matrix.cjs +219 -0
  326. package/scripts/prompt-injection-scan.sh +5 -1
  327. package/scripts/release-notes/format-github-release-notes.cjs +256 -0
  328. package/scripts/release-tarball-smoke.cjs +9 -9
  329. package/scripts/run-tests.cjs +34 -2
  330. package/scripts/strip-prose-atrefs.cjs +2 -2
  331. package/scripts/sync-runtime-launcher.cjs +2 -2
  332. package/scripts/verify-npm-publish.cjs +252 -0
  333. package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
  334. package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
  335. package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
  336. package/get-shit-done/bin/lib/artifacts.cjs +0 -53
  337. package/get-shit-done/bin/lib/audit.cjs +0 -755
  338. package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
  339. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
  340. package/get-shit-done/bin/lib/clock.cjs +0 -96
  341. package/get-shit-done/bin/lib/clusters.cjs +0 -135
  342. package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
  343. package/get-shit-done/bin/lib/command-aliases.cjs +0 -815
  344. package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
  345. package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
  346. package/get-shit-done/bin/lib/commands.cjs +0 -1188
  347. package/get-shit-done/bin/lib/config-schema.cjs +0 -31
  348. package/get-shit-done/bin/lib/config.cjs +0 -728
  349. package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
  350. package/get-shit-done/bin/lib/core.cjs +0 -2121
  351. package/get-shit-done/bin/lib/docs.cjs +0 -270
  352. package/get-shit-done/bin/lib/drift.cjs +0 -388
  353. package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
  354. package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
  355. package/get-shit-done/bin/lib/gap-checker.cjs +0 -205
  356. package/get-shit-done/bin/lib/graphify.cjs +0 -592
  357. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
  358. package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
  359. package/get-shit-done/bin/lib/init.cjs +0 -2112
  360. package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
  361. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
  362. package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -354
  363. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
  364. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
  365. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
  366. package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
  367. package/get-shit-done/bin/lib/intel.cjs +0 -708
  368. package/get-shit-done/bin/lib/learnings.cjs +0 -421
  369. package/get-shit-done/bin/lib/milestone.cjs +0 -314
  370. package/get-shit-done/bin/lib/model-catalog.cjs +0 -212
  371. package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
  372. package/get-shit-done/bin/lib/observability/event.cjs +0 -82
  373. package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
  374. package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
  375. package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -80
  376. package/get-shit-done/bin/lib/phase.cjs +0 -1607
  377. package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
  378. package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
  379. package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
  380. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  381. package/get-shit-done/bin/lib/project-root.cjs +0 -112
  382. package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
  383. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -125
  384. package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -28
  385. package/get-shit-done/bin/lib/roadmap.cjs +0 -650
  386. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
  387. package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
  388. package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
  389. package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
  390. package/get-shit-done/bin/lib/secrets.cjs +0 -32
  391. package/get-shit-done/bin/lib/security.cjs +0 -600
  392. package/get-shit-done/bin/lib/semver-compare.cjs +0 -35
  393. package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -500
  394. package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
  395. package/get-shit-done/bin/lib/state.cjs +0 -2038
  396. package/get-shit-done/bin/lib/surface.cjs +0 -470
  397. package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
  398. package/get-shit-done/bin/lib/template.cjs +0 -228
  399. package/get-shit-done/bin/lib/uat.cjs +0 -289
  400. package/get-shit-done/bin/lib/update-context.cjs +0 -209
  401. package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
  402. package/get-shit-done/bin/lib/validate.cjs +0 -92
  403. package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
  404. package/get-shit-done/bin/lib/verify.cjs +0 -1511
  405. package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
  406. package/get-shit-done/bin/lib/workstream.cjs +0 -389
  407. package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
  408. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
  409. package/scripts/lint-no-source-grep-extras.cjs +0 -81
  410. package/scripts/lint-no-source-grep.cjs +0 -174
  411. package/scripts/lint-shared-module-handsync.cjs +0 -388
  412. package/scripts/shared-module-handsync-allowlist.json +0 -183
  413. /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
  414. /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
  415. /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
  416. /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
  417. /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
  418. /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
  419. /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
  420. /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
  421. /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
  422. /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
  423. /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
  424. /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
  425. /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
  426. /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
  427. /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
  428. /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
  429. /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
  430. /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
  431. /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
  432. /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
  433. /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
  434. /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
  435. /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
  436. /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
  437. /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
  438. /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
  439. /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
  440. /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
  441. /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
  442. /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
  443. /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
  444. /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
  445. /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
  446. /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
  447. /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
  448. /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
  449. /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
  450. /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
  451. /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
  452. /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
  453. /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
  454. /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
  455. /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
  456. /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
  457. /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
  458. /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
  459. /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
  460. /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
  461. /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
  462. /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
  463. /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
  464. /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
  465. /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
  466. /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
  467. /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
  468. /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
  469. /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
  470. /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
  471. /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
  472. /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
  473. /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
  474. /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
  475. /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
  476. /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
  477. /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
  478. /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
  479. /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
  480. /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
  481. /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
  482. /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
  483. /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
  484. /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
  485. /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
  486. /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
  487. /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
  488. /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
  489. /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
  490. /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
  491. /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
  492. /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
  493. /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
  494. /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
  495. /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
  496. /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
  497. /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
  498. /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
  499. /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
  500. /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
  501. /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
  502. /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
  503. /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
  504. /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
  505. /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
  506. /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
  507. /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
  508. /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
  509. /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
  510. /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
  511. /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
  512. /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
  513. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
  514. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
  515. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
  516. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
  517. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
  518. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
  519. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
  520. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
  521. /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
  522. /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
  523. /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
  524. /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
  525. /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
  526. /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
  527. /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
  528. /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
  529. /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
  530. /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
  531. /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
  532. /package/{get-shit-done → gsd-core}/workflows/session-report.md +0 -0
@@ -0,0 +1,524 @@
1
+ "use strict";
2
+ /**
3
+ * Shell Command Projection Module
4
+ *
5
+ * Tracer-bullet seam for runtime-aware projection of serialized command text
6
+ * that GSD writes into runtime config or prints for copy/paste. This module
7
+ * does NOT execute commands; it only renders command text for external shells
8
+ * and runtimes.
9
+ *
10
+ * ADR-457 build-at-publish: the hand-written bin/lib/shell-command-projection.cjs
11
+ * collapsed to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
12
+ * from the prior hand-written .cjs; only types are added.
13
+ */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.hookCommandNeedsPowerShellCallOperator = hookCommandNeedsPowerShellCallOperator;
19
+ exports.formatHookCommandForRuntime = formatHookCommandForRuntime;
20
+ exports.shellHookOmitsBashRunner = shellHookOmitsBashRunner;
21
+ exports.buildLocalShellHookCommand = buildLocalShellHookCommand;
22
+ exports.formatManagedHookScriptToken = formatManagedHookScriptToken;
23
+ exports.projectLocalHookPrefix = projectLocalHookPrefix;
24
+ exports.projectPortableHookBaseDir = projectPortableHookBaseDir;
25
+ exports.projectShellCommandText = projectShellCommandText;
26
+ exports.projectManagedHookCommand = projectManagedHookCommand;
27
+ exports.isManagedHookBasename = isManagedHookBasename;
28
+ exports.isManagedHookCommand = isManagedHookCommand;
29
+ exports.projectLegacySettingsHookCommand = projectLegacySettingsHookCommand;
30
+ exports.escapeTomlDoubleQuotedString = escapeTomlDoubleQuotedString;
31
+ exports.projectCodexHookTomlCommand = projectCodexHookTomlCommand;
32
+ exports.escapePowerShellSingleQuoted = escapePowerShellSingleQuoted;
33
+ exports.escapePosixDoubleQuoted = escapePosixDoubleQuoted;
34
+ exports.escapeSingleQuotedShellLiteral = escapeSingleQuotedShellLiteral;
35
+ exports.renderShellActionLines = renderShellActionLines;
36
+ exports.projectPathActionProjection = projectPathActionProjection;
37
+ exports.projectPersistentPathExportActions = projectPersistentPathExportActions;
38
+ exports.execGit = execGit;
39
+ exports.execNpm = execNpm;
40
+ exports.execTool = execTool;
41
+ exports.probeTty = probeTty;
42
+ exports.normalizeContent = normalizeContent;
43
+ exports.platformWriteSync = platformWriteSync;
44
+ exports.platformReadSync = platformReadSync;
45
+ exports.platformEnsureDir = platformEnsureDir;
46
+ const node_path_1 = __importDefault(require("node:path"));
47
+ const node_fs_1 = __importDefault(require("node:fs"));
48
+ // Use non-destructured namespace import so test-time mock.method(childProcess, 'spawnSync')
49
+ // can intercept calls from this seam — destructured imports capture references
50
+ // at load time and become un-mockable.
51
+ const node_child_process_1 = __importDefault(require("node:child_process"));
52
+ /**
53
+ * Return true when a managed hook command must be prefixed with PowerShell's
54
+ * call operator so a quoted executable token is invokable by the target
55
+ * runtime/shell combination.
56
+ *
57
+ * Current evidence-backed policy:
58
+ * - Gemini on Windows requires `& ` for quoted node/bash runners.
59
+ * - Claude Code on Windows does NOT: its hook commands execute under bash/Git
60
+ * Bash and `& ` breaks there (#3413).
61
+ *
62
+ * Keep the policy conservative until another runtime has a verified need.
63
+ */
64
+ function hookCommandNeedsPowerShellCallOperator(opts = {}) {
65
+ const platform = opts.platform || process.platform;
66
+ const runtime = opts.runtime || 'generic';
67
+ return platform === 'win32' && runtime === 'gemini';
68
+ }
69
+ /**
70
+ * Project a fully-assembled hook command string for the target runtime.
71
+ */
72
+ function formatHookCommandForRuntime(command, opts = {}) {
73
+ return hookCommandNeedsPowerShellCallOperator(opts) ? `& ${command}` : command;
74
+ }
75
+ // #166/#580: Claude Code on Windows executes hook command strings inside Git
76
+ // Bash. A `.sh` hook wrapped with an explicit bash.exe path makes bash try to
77
+ // exec bash itself ("C:/.../bash.exe: cannot execute binary file"). Both install
78
+ // paths — global (buildHookCommand) and local (buildLocalShellHookCommand) — must
79
+ // drop the bash runner in this case and emit only the anchored script path.
80
+ // Centralized here so the two paths cannot silently drift apart again: the local
81
+ // path missed this guard and reintroduced the #166/#377 failure (#580).
82
+ function shellHookOmitsBashRunner({ platform, runtime = 'generic', isShellHook = false } = {}) {
83
+ const p = platform ?? process.platform;
84
+ return p === 'win32' && runtime === 'claude' && isShellHook;
85
+ }
86
+ // Builds the command string for a local-install managed `.sh` hook. Mirrors the
87
+ // global buildHookCommand path but uses the $CLAUDE_PROJECT_DIR-anchored prefix
88
+ // instead of an absolute configDir. On Claude/Windows the bash runner is dropped
89
+ // (see shellHookOmitsBashRunner) and the anchored script path is emitted alone —
90
+ // matching the global path. Elsewhere the resolved bash runner is required; a
91
+ // null runner yields null so callers skip registration instead of emitting a
92
+ // broken hook (#3393).
93
+ function buildLocalShellHookCommand({ localPrefix, hookFile, bashRunner, runtime = 'generic', platform = process.platform }) {
94
+ if (!localPrefix || !hookFile)
95
+ return null;
96
+ const scriptPath = `${localPrefix}/hooks/${hookFile}`;
97
+ if (shellHookOmitsBashRunner({ platform, runtime, isShellHook: true })) {
98
+ return formatHookCommandForRuntime(scriptPath, { platform, runtime });
99
+ }
100
+ if (!bashRunner)
101
+ return null;
102
+ return projectShellCommandText({
103
+ runnerToken: bashRunner,
104
+ argTokens: [scriptPath],
105
+ runtime,
106
+ platform,
107
+ });
108
+ }
109
+ /**
110
+ * Project a managed hook script path token for serialized shell commands.
111
+ * Windows managed hook commands normalize to forward slashes so the same path
112
+ * survives JSON/TOML/config surfaces consistently.
113
+ */
114
+ function formatManagedHookScriptToken(scriptPath, opts = {}) {
115
+ const platform = opts.platform || process.platform;
116
+ if (platform !== 'win32')
117
+ return null;
118
+ return JSON.stringify(scriptPath.replace(/\\/g, '/'));
119
+ }
120
+ function projectLocalHookPrefix({ runtime = 'claude', dirName }) {
121
+ if (!dirName)
122
+ return dirName;
123
+ return (runtime === 'gemini' || runtime === 'antigravity')
124
+ ? dirName
125
+ : `"$CLAUDE_PROJECT_DIR"/${dirName}`;
126
+ }
127
+ function projectPortableHookBaseDir({ configDir, homeDir }) {
128
+ const normalizedConfigDir = String(configDir || '').replace(/\\/g, '/');
129
+ const normalizedHome = String(homeDir || '').replace(/\\/g, '/');
130
+ if (!normalizedConfigDir || !normalizedHome)
131
+ return normalizedConfigDir;
132
+ return normalizedConfigDir.startsWith(normalizedHome)
133
+ ? '$HOME' + normalizedConfigDir.slice(normalizedHome.length)
134
+ : normalizedConfigDir;
135
+ }
136
+ function projectShellCommandText({ runnerToken, argTokens = [], runtime = 'generic', platform = process.platform, }) {
137
+ if (!runnerToken)
138
+ return null;
139
+ const parts = [runnerToken, ...argTokens.filter(Boolean)];
140
+ return formatHookCommandForRuntime(parts.join(' '), { platform, runtime });
141
+ }
142
+ function projectManagedHookCommand({ absoluteRunner, scriptPath, runtime = 'generic', platform = process.platform }) {
143
+ if (!absoluteRunner || !scriptPath)
144
+ return null;
145
+ const normalizedScriptPath = platform === 'win32' ? scriptPath.replace(/\\/g, '/') : scriptPath;
146
+ return projectShellCommandText({
147
+ runnerToken: absoluteRunner,
148
+ argTokens: [JSON.stringify(normalizedScriptPath)],
149
+ runtime,
150
+ platform,
151
+ });
152
+ }
153
+ const MANAGED_HOOK_BASENAMES_BY_SURFACE = {
154
+ 'settings-json': new Set([
155
+ 'gsd-check-update.js',
156
+ 'gsd-statusline.js',
157
+ 'gsd-context-monitor.js',
158
+ 'gsd-prompt-guard.js',
159
+ 'gsd-read-guard.js',
160
+ 'gsd-read-injection-scanner.js',
161
+ 'gsd-update-banner.js',
162
+ 'gsd-workflow-guard.js',
163
+ ]),
164
+ 'codex-toml': new Set([
165
+ 'gsd-check-update.js',
166
+ ]),
167
+ };
168
+ const MANAGED_HOOK_COMMAND_BASENAMES_BY_SURFACE = {
169
+ 'settings-json': new Set([
170
+ 'gsd-check-update.js',
171
+ 'gsd-statusline.js',
172
+ 'gsd-context-monitor.js',
173
+ 'gsd-prompt-guard.js',
174
+ 'gsd-read-guard.js',
175
+ 'gsd-read-injection-scanner.js',
176
+ 'gsd-update-banner.js',
177
+ 'gsd-workflow-guard.js',
178
+ 'gsd-session-state.sh',
179
+ 'gsd-validate-commit.sh',
180
+ 'gsd-phase-boundary.sh',
181
+ ]),
182
+ 'codex-toml': new Set([
183
+ 'gsd-check-update.js',
184
+ ]),
185
+ 'codex-hooks-json': new Set([
186
+ 'gsd-check-update.js',
187
+ // #3426: Windows .cmd shim for Codex hook — must be treated as managed so
188
+ // reconcileCodexHooksJsonSessionStart can replace stale node-runner commands
189
+ // with the .cmd shim on reinstall (and vice-versa on cross-platform moves).
190
+ 'gsd-check-update.cmd',
191
+ ]),
192
+ };
193
+ const LEGACY_MANAGED_HOOK_ALIASES_BY_SURFACE = {
194
+ 'codex-toml': new Set([
195
+ 'gsd-update-check.js',
196
+ ]),
197
+ 'codex-hooks-json': new Set([
198
+ 'gsd-update-check.js',
199
+ ]),
200
+ };
201
+ function managedHookSurfaceSet(surface = 'settings-json') {
202
+ return MANAGED_HOOK_BASENAMES_BY_SURFACE[surface] || MANAGED_HOOK_BASENAMES_BY_SURFACE['settings-json'];
203
+ }
204
+ function isManagedHookBasename(scriptPathOrBasename, opts = {}) {
205
+ if (!scriptPathOrBasename)
206
+ return false;
207
+ const surface = opts.surface || 'settings-json';
208
+ const basename = String(scriptPathOrBasename).split(/[\\/]/).pop() || '';
209
+ return managedHookSurfaceSet(surface).has(basename);
210
+ }
211
+ function managedHookCommandSurfaceSet(surface = 'settings-json', includeLegacyAliases = false) {
212
+ const base = MANAGED_HOOK_COMMAND_BASENAMES_BY_SURFACE[surface]
213
+ || MANAGED_HOOK_COMMAND_BASENAMES_BY_SURFACE['settings-json'];
214
+ if (!includeLegacyAliases)
215
+ return base;
216
+ const aliases = LEGACY_MANAGED_HOOK_ALIASES_BY_SURFACE[surface];
217
+ if (!aliases || aliases.size === 0)
218
+ return base;
219
+ return new Set([...base, ...aliases]);
220
+ }
221
+ function isManagedHookCommand(commandText, opts = {}) {
222
+ if (typeof commandText !== 'string')
223
+ return false;
224
+ const surface = opts.surface || 'settings-json';
225
+ const includeLegacyAliases = opts.includeLegacyAliases === true;
226
+ const managedBasenames = managedHookCommandSurfaceSet(surface, includeLegacyAliases);
227
+ if (!managedBasenames || managedBasenames.size === 0)
228
+ return false;
229
+ const normalizedCommand = commandText.replace(/\\/g, '/');
230
+ if (typeof opts.configDir === 'string' && opts.configDir.length > 0) {
231
+ const normalizedHooksDir = `${node_path_1.default.join(opts.configDir, 'hooks').replace(/\\/g, '/')}/`;
232
+ if (!normalizedCommand.includes(normalizedHooksDir))
233
+ return false;
234
+ }
235
+ for (const basename of managedBasenames) {
236
+ const escapedBasename = basename.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
237
+ const pattern = new RegExp(`(^|[\\\\/\\s"'` + '`' + `])${escapedBasename}(?=$|[\\s"'` + '`' + `])`);
238
+ if (pattern.test(normalizedCommand))
239
+ return true;
240
+ }
241
+ return false;
242
+ }
243
+ /**
244
+ * Projection helper for legacy settings.json hook rewrites.
245
+ *
246
+ * Non-Windows keeps the original script token shape when provided (single
247
+ * quote / bareword / quoted), while Windows normalizes to double-quoted
248
+ * forward-slash path tokens for stable cross-shell behavior.
249
+ */
250
+ function projectLegacySettingsHookCommand({ absoluteRunner, scriptPath, scriptToken, runtime = 'generic', platform = process.platform, }) {
251
+ if (!absoluteRunner || !scriptPath)
252
+ return null;
253
+ const normalizedScriptPath = platform === 'win32' ? scriptPath.replace(/\\/g, '/') : scriptPath;
254
+ const commandScriptToken = platform === 'win32'
255
+ ? JSON.stringify(normalizedScriptPath)
256
+ : (scriptToken || JSON.stringify(normalizedScriptPath));
257
+ return projectShellCommandText({
258
+ runnerToken: absoluteRunner,
259
+ argTokens: [commandScriptToken],
260
+ runtime,
261
+ platform,
262
+ });
263
+ }
264
+ function escapeTomlDoubleQuotedString(value) {
265
+ return String(value).replace(/\\/g, '\\\\').replace(/"/g, '\\"');
266
+ }
267
+ function projectCodexHookTomlCommand({ absoluteRunner, scriptPath, platform = process.platform }) {
268
+ const command = projectManagedHookCommand({
269
+ absoluteRunner,
270
+ scriptPath,
271
+ runtime: 'codex',
272
+ platform,
273
+ });
274
+ return command === null ? null : escapeTomlDoubleQuotedString(command);
275
+ }
276
+ function escapePowerShellSingleQuoted(value) {
277
+ return String(value).replace(/'/g, "''");
278
+ }
279
+ function escapePosixDoubleQuoted(value) {
280
+ return String(value).replace(/[\\$"`]/g, '\\$&');
281
+ }
282
+ function escapeSingleQuotedShellLiteral(value) {
283
+ return String(value).replace(/'/g, "'\\''");
284
+ }
285
+ function renderShellActionLines(shellActions = []) {
286
+ return shellActions.map((action) => {
287
+ if (!action || !action.command)
288
+ return '';
289
+ return action.label ? `${action.label}: ${action.command}` : action.command;
290
+ }).filter(Boolean);
291
+ }
292
+ function projectPathActionProjection({ mode = 'repair', targetDir, platform = process.platform, }) {
293
+ if (!targetDir)
294
+ return { shellActions: [], actionLines: [] };
295
+ const isWin32 = platform === 'win32';
296
+ let shellActions;
297
+ if (isWin32) {
298
+ const psTargetDir = escapePowerShellSingleQuoted(targetDir);
299
+ const bashTargetDir = escapeSingleQuotedShellLiteral(String(targetDir).replace(/\\/g, '/'));
300
+ shellActions = [
301
+ {
302
+ label: 'PowerShell',
303
+ shell: 'powershell',
304
+ command: `[Environment]::SetEnvironmentVariable('PATH', '${psTargetDir};' + [Environment]::GetEnvironmentVariable('PATH', 'User'), 'User')`,
305
+ },
306
+ {
307
+ label: 'cmd.exe',
308
+ shell: 'cmd',
309
+ command: `powershell -Command "[Environment]::SetEnvironmentVariable('PATH', '${psTargetDir};' + [Environment]::GetEnvironmentVariable('PATH', 'User'), 'User')"`,
310
+ },
311
+ {
312
+ label: 'Git Bash',
313
+ shell: 'bash',
314
+ command: `echo 'export PATH="${bashTargetDir}:$PATH"' >> ~/.bashrc`,
315
+ },
316
+ ];
317
+ }
318
+ else if (mode === 'persist') {
319
+ const bashTargetDir = escapeSingleQuotedShellLiteral(String(targetDir));
320
+ shellActions = [
321
+ {
322
+ label: 'zsh',
323
+ shell: 'zsh',
324
+ command: `echo 'export PATH="${bashTargetDir}:$PATH"' >> ~/.zshrc`,
325
+ },
326
+ {
327
+ label: 'bash',
328
+ shell: 'bash',
329
+ command: `echo 'export PATH="${bashTargetDir}:$PATH"' >> ~/.bashrc`,
330
+ },
331
+ ];
332
+ }
333
+ else {
334
+ const posixTargetDir = escapePosixDoubleQuoted(targetDir);
335
+ shellActions = [
336
+ {
337
+ label: null,
338
+ shell: 'posix',
339
+ command: `export PATH="${posixTargetDir}:$PATH"`,
340
+ },
341
+ ];
342
+ }
343
+ return {
344
+ shellActions,
345
+ actionLines: renderShellActionLines(shellActions),
346
+ };
347
+ }
348
+ function projectPersistentPathExportActions({ targetDir, platform = process.platform }) {
349
+ const projected = projectPathActionProjection({
350
+ mode: 'persist',
351
+ targetDir,
352
+ platform,
353
+ });
354
+ return { shellActions: projected.shellActions };
355
+ }
356
+ function _spawnResult(result, program) {
357
+ if (result.error && result.error.code === 'ENOENT') {
358
+ return { exitCode: 127, stdout: '', stderr: `${program}: not found`, signal: null, error: result.error };
359
+ }
360
+ return {
361
+ exitCode: result.status ?? 1,
362
+ stdout: (result.stdout ?? '').toString().trim(),
363
+ stderr: (result.stderr ?? '').toString().trim(),
364
+ signal: result.signal ?? null,
365
+ error: result.error ?? null,
366
+ };
367
+ }
368
+ function execGit(args, opts = {}) {
369
+ // Non-interactive defaults: a hung credential prompt or terminal-input
370
+ // probe must surface as a timeout, not block the tool forever. Callers
371
+ // can override via opts.env.
372
+ const env = {
373
+ ...process.env,
374
+ GIT_TERMINAL_PROMPT: '0',
375
+ GCM_INTERACTIVE: 'never',
376
+ ...(opts.env || {}),
377
+ };
378
+ const result = node_child_process_1.default.spawnSync('git', args, {
379
+ cwd: opts.cwd,
380
+ env,
381
+ encoding: 'utf-8',
382
+ stdio: 'pipe',
383
+ timeout: opts.timeout ?? 10_000,
384
+ });
385
+ return _spawnResult(result, 'git');
386
+ }
387
+ function execNpm(args, opts = {}) {
388
+ const result = node_child_process_1.default.spawnSync('npm', args, {
389
+ cwd: opts.cwd,
390
+ shell: process.platform === 'win32',
391
+ encoding: 'utf-8',
392
+ stdio: ['ignore', 'pipe', 'pipe'],
393
+ timeout: opts.timeout ?? 15_000,
394
+ });
395
+ return _spawnResult(result, 'npm');
396
+ }
397
+ function execTool(program, args, opts = {}) {
398
+ const result = node_child_process_1.default.spawnSync(program, args, {
399
+ cwd: opts.cwd,
400
+ env: opts.env ? { ...process.env, ...opts.env } : undefined,
401
+ encoding: 'utf-8',
402
+ stdio: 'pipe',
403
+ timeout: opts.timeout ?? 30_000,
404
+ });
405
+ return _spawnResult(result, program);
406
+ }
407
+ function probeTty(opts = {}) {
408
+ const platform = opts.platform ?? process.platform;
409
+ if (platform === 'win32')
410
+ return null;
411
+ try {
412
+ const ttyPath = node_child_process_1.default.execFileSync('tty', [], {
413
+ encoding: 'utf-8',
414
+ stdio: ['inherit', 'pipe', 'ignore'],
415
+ }).trim();
416
+ if (!ttyPath || ttyPath === 'not a tty')
417
+ return null;
418
+ return ttyPath;
419
+ }
420
+ catch {
421
+ return null;
422
+ }
423
+ }
424
+ // ─── Platform file I/O ────────────────────────────────────────────────────────
425
+ function _normalizeMd(content) {
426
+ if (!content || typeof content !== 'string')
427
+ return content;
428
+ let text = content.replace(/\r\n/g, '\n');
429
+ const lines = text.split('\n');
430
+ const result = [];
431
+ const fenceRegex = /^```/;
432
+ const insideFence = new Array(lines.length);
433
+ let fenceOpen = false;
434
+ for (let i = 0; i < lines.length; i++) {
435
+ if (fenceRegex.test(lines[i].trimEnd())) {
436
+ if (fenceOpen) {
437
+ insideFence[i] = false;
438
+ fenceOpen = false;
439
+ }
440
+ else {
441
+ insideFence[i] = false;
442
+ fenceOpen = true;
443
+ }
444
+ }
445
+ else {
446
+ insideFence[i] = fenceOpen;
447
+ }
448
+ }
449
+ for (let i = 0; i < lines.length; i++) {
450
+ const line = lines[i];
451
+ const prev = i > 0 ? lines[i - 1] : '';
452
+ const prevTrimmed = prev.trimEnd();
453
+ const trimmed = line.trimEnd();
454
+ const isFenceLine = fenceRegex.test(trimmed);
455
+ if (/^#{1,6}\s/.test(trimmed) && i > 0 && prevTrimmed !== '' && prevTrimmed !== '---')
456
+ result.push('');
457
+ if (isFenceLine && i > 0 && prevTrimmed !== '' && !insideFence[i] && (i === 0 || !insideFence[i - 1] || isFenceLine)) {
458
+ if (i === 0 || !insideFence[i - 1])
459
+ result.push('');
460
+ }
461
+ if (/^(\s*[-*+]\s|\s*\d+\.\s)/.test(line) && i > 0 && prevTrimmed !== '' && !/^(\s*[-*+]\s|\s*\d+\.\s)/.test(prev) && prevTrimmed !== '---')
462
+ result.push('');
463
+ result.push(line);
464
+ if (/^#{1,6}\s/.test(trimmed) && i < lines.length - 1 && (lines[i + 1] ?? '').trimEnd() !== '')
465
+ result.push('');
466
+ if (/^```\s*$/.test(trimmed) && i > 0 && insideFence[i - 1] && i < lines.length - 1 && (lines[i + 1] ?? '').trimEnd() !== '')
467
+ result.push('');
468
+ if (/^(\s*[-*+]\s|\s*\d+\.\s)/.test(line) && i < lines.length - 1) {
469
+ const next = lines[i + 1];
470
+ if (next !== undefined && next.trimEnd() !== '' && !/^(\s*[-*+]\s|\s*\d+\.\s)/.test(next) && !/^\s/.test(next))
471
+ result.push('');
472
+ }
473
+ }
474
+ text = result.join('\n');
475
+ text = text.replace(/\n{3,}/g, '\n\n');
476
+ text = text.replace(/\n*$/, '\n');
477
+ return text;
478
+ }
479
+ function normalizeContent(filePath, content, opts = {}) {
480
+ const encoding = opts.encoding ?? 'utf-8';
481
+ const isMd = node_path_1.default.extname(filePath).toLowerCase() === '.md';
482
+ let normalized;
483
+ if (isMd) {
484
+ normalized = _normalizeMd(content);
485
+ }
486
+ else {
487
+ normalized = (content ?? '').replace(/\r\n/g, '\n').replace(/\n*$/, '\n');
488
+ }
489
+ return { content: normalized, encoding };
490
+ }
491
+ function platformWriteSync(filePath, content, opts = {}) {
492
+ const { content: normalized, encoding } = normalizeContent(filePath, content, opts);
493
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(filePath), { recursive: true });
494
+ const tmpPath = filePath + '.tmp.' + process.pid;
495
+ try {
496
+ node_fs_1.default.writeFileSync(tmpPath, normalized, encoding);
497
+ node_fs_1.default.renameSync(tmpPath, filePath);
498
+ }
499
+ catch {
500
+ try {
501
+ node_fs_1.default.unlinkSync(tmpPath);
502
+ }
503
+ catch { /* already gone */ }
504
+ node_fs_1.default.writeFileSync(filePath, normalized, encoding);
505
+ }
506
+ }
507
+ function platformReadSync(filePath, opts = {}) {
508
+ const encoding = opts.encoding ?? 'utf-8';
509
+ try {
510
+ return node_fs_1.default.readFileSync(filePath, encoding);
511
+ }
512
+ catch (err) {
513
+ const e = err;
514
+ if (e.code === 'ENOENT') {
515
+ if (opts.required)
516
+ throw err;
517
+ return null;
518
+ }
519
+ throw err;
520
+ }
521
+ }
522
+ function platformEnsureDir(dirPath) {
523
+ node_fs_1.default.mkdirSync(dirPath, { recursive: true });
524
+ }
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ /**
3
+ * Manifest-backed state subcommand router.
4
+ * Keeps gsd-tools.cjs thin while preserving existing command semantics.
5
+ *
6
+ * Phase 5.1: handlers that have SDK equivalents are dispatched via
7
+ * executeForCjs (the sync bridge). CJS fallback is retained for:
8
+ * - complete-phase: no SDK counterpart.
9
+ * - Any command when GSD_WORKSTREAM is active (GSDTransport forces subprocess
10
+ * for workstream requests; subprocess is disabled in the sync bridge worker).
11
+ * - Any command when the SDK is not available (build not present).
12
+ *
13
+ * ADR-457 build-at-publish: the hand-written bin/lib/state-command-router.cjs
14
+ * collapsed to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
15
+ * from the prior hand-written .cjs; only types are added.
16
+ */
17
+ const command_aliases_cjs_1 = require("./command-aliases.cjs");
18
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
19
+ const cjsCommandRouterAdapter = require("./cjs-command-router-adapter.cjs");
20
+ const { routeHubCommandFamily } = cjsCommandRouterAdapter;
21
+ const command_arg_projection_cjs_1 = require("./command-arg-projection.cjs");
22
+ // ─── Types ────────────────────────────────────────────────────────────────────
23
+ // Helper: extract string-only named arg value (value flags never return boolean).
24
+ function strArg(opts, key) {
25
+ const v = opts[key];
26
+ if (typeof v === 'boolean')
27
+ return undefined;
28
+ return v;
29
+ }
30
+ // ─── Implementation ───────────────────────────────────────────────────────────
31
+ function routeStateCommand({ state, args, cwd, raw, error }) {
32
+ const parsePlans = (plans) => {
33
+ const parsedPlans = plans == null ? null : Number.parseInt(plans, 10);
34
+ if (plans != null && Number.isNaN(parsedPlans)) {
35
+ error('Invalid --plans value. Expected an integer.');
36
+ return null;
37
+ }
38
+ return parsedPlans;
39
+ };
40
+ routeHubCommandFamily({
41
+ family: 'state',
42
+ args,
43
+ subcommands: ['load', 'complete-phase', ...command_aliases_cjs_1.STATE_SUBCOMMANDS.filter((s) => s !== 'load')],
44
+ defaultSubcommand: 'load',
45
+ unsupported: {
46
+ 'add-roadmap-evolution': 'state add-roadmap-evolution is SDK-only. Use: gsd-tools query state.add-roadmap-evolution ...',
47
+ },
48
+ error,
49
+ cwd,
50
+ raw,
51
+ unknownMessage: (subcommand, available) => `Unknown state subcommand: "${subcommand}". Available: ${available.join(', ')}`,
52
+ handlers: {
53
+ load: () => state.cmdStateLoad(cwd, raw),
54
+ json: () => state.cmdStateJson(cwd, raw),
55
+ get: () => state.cmdStateGet(cwd, args[2], raw),
56
+ update: () => state.cmdStateUpdate(cwd, args[2], args[3]),
57
+ patch: () => {
58
+ const patches = {};
59
+ if (args.length === 3 && typeof args[2] === 'string' && args[2].trim().startsWith('{')) {
60
+ let parsed;
61
+ try {
62
+ parsed = JSON.parse(args[2]);
63
+ }
64
+ catch (err) {
65
+ error(`state patch: invalid JSON object: ${err.message}`);
66
+ return;
67
+ }
68
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
69
+ error('state patch: JSON input must be an object of field/value pairs.');
70
+ return;
71
+ }
72
+ for (const [key, value] of Object.entries(parsed)) {
73
+ if (key && value !== undefined) {
74
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
75
+ patches[key] = String(value);
76
+ }
77
+ }
78
+ }
79
+ else {
80
+ for (let i = 2; i < args.length; i += 2) {
81
+ const key = args[i].replace(/^--/, '');
82
+ const value = args[i + 1];
83
+ if (key && value !== undefined) {
84
+ patches[key] = value;
85
+ }
86
+ }
87
+ }
88
+ state.cmdStatePatch(cwd, patches, raw);
89
+ },
90
+ 'advance-plan': () => state.cmdStateAdvancePlan(cwd, raw),
91
+ 'record-metric': () => {
92
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase', 'plan', 'duration', 'tasks', 'files']);
93
+ state.cmdStateRecordMetric(cwd, {
94
+ phase: strArg(a, 'phase'),
95
+ plan: strArg(a, 'plan'),
96
+ duration: strArg(a, 'duration'),
97
+ tasks: strArg(a, 'tasks'),
98
+ files: strArg(a, 'files'),
99
+ }, raw);
100
+ },
101
+ 'update-progress': () => state.cmdStateUpdateProgress(cwd, raw),
102
+ 'add-decision': () => {
103
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase', 'summary', 'summary-file', 'rationale', 'rationale-file']);
104
+ state.cmdStateAddDecision(cwd, {
105
+ phase: strArg(a, 'phase'),
106
+ summary: strArg(a, 'summary'),
107
+ summary_file: strArg(a, 'summary-file'),
108
+ rationale: strArg(a, 'rationale') || '',
109
+ rationale_file: strArg(a, 'rationale-file'),
110
+ }, raw);
111
+ },
112
+ 'add-blocker': () => {
113
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['text', 'text-file']);
114
+ state.cmdStateAddBlocker(cwd, { text: strArg(a, 'text'), text_file: strArg(a, 'text-file') }, raw);
115
+ },
116
+ 'resolve-blocker': () => state.cmdStateResolveBlocker(cwd, strArg((0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['text']), 'text'), raw),
117
+ 'record-session': () => {
118
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['stopped-at', 'resume-file']);
119
+ // Pass resume_file as-is (undefined when --resume-file was not provided) so
120
+ // cmdStateRecordSession can distinguish "caller explicitly passed a value" from
121
+ // "option was not supplied" and apply the template-default-only replacement guard.
122
+ state.cmdStateRecordSession(cwd, { stopped_at: strArg(a, 'stopped-at'), resume_file: strArg(a, 'resume-file') }, raw);
123
+ },
124
+ 'begin-phase': () => {
125
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase', 'name', 'plans']);
126
+ state.cmdStateBeginPhase(cwd, strArg(a, 'phase'), strArg(a, 'name'), parsePlans(strArg(a, 'plans')), raw);
127
+ },
128
+ 'signal-waiting': () => {
129
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['type', 'question', 'options', 'phase']);
130
+ state.cmdSignalWaiting(cwd, strArg(a, 'type'), strArg(a, 'question'), strArg(a, 'options'), strArg(a, 'phase'), raw);
131
+ },
132
+ 'signal-resume': () => state.cmdSignalResume(cwd, raw),
133
+ 'planned-phase': () => {
134
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase', 'name', 'plans']);
135
+ state.cmdStatePlannedPhase(cwd, strArg(a, 'phase'), parsePlans(strArg(a, 'plans')), raw);
136
+ },
137
+ validate: () => state.cmdStateValidate(cwd, raw),
138
+ sync: () => {
139
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, [], ['verify']);
140
+ state.cmdStateSync(cwd, { verify: a['verify'] }, raw);
141
+ },
142
+ prune: () => {
143
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['keep-recent'], ['dry-run']);
144
+ state.cmdStatePrune(cwd, { keepRecent: strArg(a, 'keep-recent') || '3', dryRun: a['dry-run'] === true }, raw);
145
+ },
146
+ // complete-phase: CJS-only — no SDK counterpart.
147
+ 'complete-phase': () => {
148
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase']);
149
+ state.cmdStateCompletePhase(cwd, raw, strArg(a, 'phase') || args[2]);
150
+ },
151
+ 'milestone-switch': () => {
152
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['milestone', 'name']);
153
+ state.cmdStateMilestoneSwitch(cwd, strArg(a, 'milestone'), strArg(a, 'name'), raw);
154
+ },
155
+ },
156
+ });
157
+ }
158
+ module.exports = {
159
+ routeStateCommand,
160
+ };