@opengsd/gsd-core 1.2.0-rc.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 (503) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja-JP.md +870 -0
  3. package/README.ko-KR.md +861 -0
  4. package/README.md +301 -0
  5. package/README.pt-BR.md +492 -0
  6. package/README.zh-CN.md +842 -0
  7. package/agents/gsd-advisor-researcher.md +127 -0
  8. package/agents/gsd-ai-researcher.md +133 -0
  9. package/agents/gsd-assumptions-analyzer.md +105 -0
  10. package/agents/gsd-code-fixer.md +668 -0
  11. package/agents/gsd-code-reviewer.md +387 -0
  12. package/agents/gsd-codebase-mapper.md +853 -0
  13. package/agents/gsd-debug-session-manager.md +314 -0
  14. package/agents/gsd-debugger.md +1452 -0
  15. package/agents/gsd-doc-classifier.md +168 -0
  16. package/agents/gsd-doc-synthesizer.md +204 -0
  17. package/agents/gsd-doc-verifier.md +217 -0
  18. package/agents/gsd-doc-writer.md +615 -0
  19. package/agents/gsd-domain-researcher.md +153 -0
  20. package/agents/gsd-eval-auditor.md +191 -0
  21. package/agents/gsd-eval-planner.md +154 -0
  22. package/agents/gsd-executor.md +772 -0
  23. package/agents/gsd-framework-selector.md +160 -0
  24. package/agents/gsd-integration-checker.md +470 -0
  25. package/agents/gsd-intel-updater.md +342 -0
  26. package/agents/gsd-nyquist-auditor.md +203 -0
  27. package/agents/gsd-pattern-mapper.md +335 -0
  28. package/agents/gsd-phase-researcher.md +928 -0
  29. package/agents/gsd-plan-checker.md +978 -0
  30. package/agents/gsd-planner.md +1218 -0
  31. package/agents/gsd-project-researcher.md +677 -0
  32. package/agents/gsd-research-synthesizer.md +255 -0
  33. package/agents/gsd-roadmapper.md +688 -0
  34. package/agents/gsd-security-auditor.md +155 -0
  35. package/agents/gsd-ui-auditor.md +495 -0
  36. package/agents/gsd-ui-checker.md +309 -0
  37. package/agents/gsd-ui-researcher.md +380 -0
  38. package/agents/gsd-user-profiler.md +171 -0
  39. package/agents/gsd-verifier.md +917 -0
  40. package/bin/install.js +10936 -0
  41. package/bin/lib/ui-safety-gate.cjs +107 -0
  42. package/commands/gsd/add-tests.md +42 -0
  43. package/commands/gsd/ai-integration-phase.md +37 -0
  44. package/commands/gsd/audit-fix.md +34 -0
  45. package/commands/gsd/audit-milestone.md +37 -0
  46. package/commands/gsd/audit-uat.md +24 -0
  47. package/commands/gsd/autonomous.md +46 -0
  48. package/commands/gsd/capture.md +62 -0
  49. package/commands/gsd/cleanup.md +24 -0
  50. package/commands/gsd/code-review.md +59 -0
  51. package/commands/gsd/complete-milestone.md +143 -0
  52. package/commands/gsd/config.md +56 -0
  53. package/commands/gsd/debug.md +52 -0
  54. package/commands/gsd/discuss-phase.md +76 -0
  55. package/commands/gsd/docs-update.md +49 -0
  56. package/commands/gsd/eval-review.md +33 -0
  57. package/commands/gsd/execute-phase.md +64 -0
  58. package/commands/gsd/explore.md +27 -0
  59. package/commands/gsd/extract-learnings.md +23 -0
  60. package/commands/gsd/fast.md +31 -0
  61. package/commands/gsd/forensics.md +57 -0
  62. package/commands/gsd/graphify.md +199 -0
  63. package/commands/gsd/health.md +31 -0
  64. package/commands/gsd/help.md +28 -0
  65. package/commands/gsd/import.md +41 -0
  66. package/commands/gsd/inbox.md +39 -0
  67. package/commands/gsd/ingest-docs.md +42 -0
  68. package/commands/gsd/manager.md +45 -0
  69. package/commands/gsd/map-codebase.md +83 -0
  70. package/commands/gsd/milestone-summary.md +51 -0
  71. package/commands/gsd/mvp-phase.md +45 -0
  72. package/commands/gsd/new-milestone.md +45 -0
  73. package/commands/gsd/new-project.md +47 -0
  74. package/commands/gsd/ns-context.md +23 -0
  75. package/commands/gsd/ns-ideate.md +24 -0
  76. package/commands/gsd/ns-manage.md +29 -0
  77. package/commands/gsd/ns-project.md +22 -0
  78. package/commands/gsd/ns-review.md +26 -0
  79. package/commands/gsd/ns-workflow.md +28 -0
  80. package/commands/gsd/pause-work.md +43 -0
  81. package/commands/gsd/phase.md +56 -0
  82. package/commands/gsd/plan-phase.md +62 -0
  83. package/commands/gsd/plan-review-convergence.md +59 -0
  84. package/commands/gsd/pr-branch.md +26 -0
  85. package/commands/gsd/profile-user.md +46 -0
  86. package/commands/gsd/progress.md +47 -0
  87. package/commands/gsd/quick.md +174 -0
  88. package/commands/gsd/resume-work.md +30 -0
  89. package/commands/gsd/review-backlog.md +63 -0
  90. package/commands/gsd/review.md +41 -0
  91. package/commands/gsd/secure-phase.md +36 -0
  92. package/commands/gsd/settings.md +29 -0
  93. package/commands/gsd/ship.md +24 -0
  94. package/commands/gsd/sketch.md +60 -0
  95. package/commands/gsd/spec-phase.md +63 -0
  96. package/commands/gsd/spike.md +57 -0
  97. package/commands/gsd/stats.md +19 -0
  98. package/commands/gsd/surface.md +155 -0
  99. package/commands/gsd/thread.md +24 -0
  100. package/commands/gsd/ui-phase.md +35 -0
  101. package/commands/gsd/ui-review.md +33 -0
  102. package/commands/gsd/ultraplan-phase.md +34 -0
  103. package/commands/gsd/undo.md +35 -0
  104. package/commands/gsd/update.md +48 -0
  105. package/commands/gsd/validate-phase.md +36 -0
  106. package/commands/gsd/verify-work.md +39 -0
  107. package/commands/gsd/workspace.md +52 -0
  108. package/commands/gsd/workstreams.md +70 -0
  109. package/get-shit-done/bin/check-latest-version.cjs +106 -0
  110. package/get-shit-done/bin/gsd-tools.cjs +1676 -0
  111. package/get-shit-done/bin/lib/active-workstream-store.cjs +302 -0
  112. package/get-shit-done/bin/lib/adr-parser.cjs +394 -0
  113. package/get-shit-done/bin/lib/agent-command-router.cjs +65 -0
  114. package/get-shit-done/bin/lib/artifacts.cjs +53 -0
  115. package/get-shit-done/bin/lib/audit.cjs +755 -0
  116. package/get-shit-done/bin/lib/check-command-router.cjs +333 -0
  117. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +118 -0
  118. package/get-shit-done/bin/lib/clock.cjs +96 -0
  119. package/get-shit-done/bin/lib/clusters.cjs +135 -0
  120. package/get-shit-done/bin/lib/code-review-flags.cjs +74 -0
  121. package/get-shit-done/bin/lib/command-aliases.cjs +815 -0
  122. package/get-shit-done/bin/lib/command-arg-projection.cjs +62 -0
  123. package/get-shit-done/bin/lib/command-routing-hub.cjs +388 -0
  124. package/get-shit-done/bin/lib/commands.cjs +1188 -0
  125. package/get-shit-done/bin/lib/config-schema.cjs +31 -0
  126. package/get-shit-done/bin/lib/config.cjs +728 -0
  127. package/get-shit-done/bin/lib/configuration.cjs +248 -0
  128. package/get-shit-done/bin/lib/context-utilization.cjs +47 -0
  129. package/get-shit-done/bin/lib/core.cjs +2121 -0
  130. package/get-shit-done/bin/lib/decisions.cjs +116 -0
  131. package/get-shit-done/bin/lib/docs.cjs +270 -0
  132. package/get-shit-done/bin/lib/drift.cjs +388 -0
  133. package/get-shit-done/bin/lib/fallow-runner.cjs +109 -0
  134. package/get-shit-done/bin/lib/frontmatter.cjs +389 -0
  135. package/get-shit-done/bin/lib/gap-checker.cjs +205 -0
  136. package/get-shit-done/bin/lib/graphify.cjs +592 -0
  137. package/get-shit-done/bin/lib/gsd2-import.cjs +514 -0
  138. package/get-shit-done/bin/lib/init-command-router.cjs +58 -0
  139. package/get-shit-done/bin/lib/init.cjs +2112 -0
  140. package/get-shit-done/bin/lib/install-profiles.cjs +603 -0
  141. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +117 -0
  142. package/get-shit-done/bin/lib/installer-migration-report.cjs +354 -0
  143. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
  144. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
  145. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
  146. package/get-shit-done/bin/lib/installer-migrations.cjs +778 -0
  147. package/get-shit-done/bin/lib/intel.cjs +708 -0
  148. package/get-shit-done/bin/lib/learnings.cjs +421 -0
  149. package/get-shit-done/bin/lib/milestone.cjs +314 -0
  150. package/get-shit-done/bin/lib/model-catalog.cjs +212 -0
  151. package/get-shit-done/bin/lib/model-profiles.cjs +31 -0
  152. package/get-shit-done/bin/lib/observability/event.cjs +82 -0
  153. package/get-shit-done/bin/lib/observability/logger.cjs +174 -0
  154. package/get-shit-done/bin/lib/observability/redaction.cjs +50 -0
  155. package/get-shit-done/bin/lib/package-identity.cjs +31 -0
  156. package/get-shit-done/bin/lib/phase-command-router.cjs +191 -0
  157. package/get-shit-done/bin/lib/phase-lifecycle.cjs +80 -0
  158. package/get-shit-done/bin/lib/phase.cjs +1607 -0
  159. package/get-shit-done/bin/lib/phases-command-router.cjs +39 -0
  160. package/get-shit-done/bin/lib/plan-scan.cjs +97 -0
  161. package/get-shit-done/bin/lib/planning-workspace.cjs +238 -0
  162. package/get-shit-done/bin/lib/profile-output.cjs +1141 -0
  163. package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
  164. package/get-shit-done/bin/lib/project-root.cjs +112 -0
  165. package/get-shit-done/bin/lib/prompt-budget.cjs +399 -0
  166. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +125 -0
  167. package/get-shit-done/bin/lib/roadmap-command-router.cjs +28 -0
  168. package/get-shit-done/bin/lib/roadmap.cjs +650 -0
  169. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +301 -0
  170. package/get-shit-done/bin/lib/runtime-homes.cjs +222 -0
  171. package/get-shit-done/bin/lib/runtime-name-policy.cjs +83 -0
  172. package/get-shit-done/bin/lib/runtime-slash.cjs +112 -0
  173. package/get-shit-done/bin/lib/schema-detect.cjs +165 -0
  174. package/get-shit-done/bin/lib/secrets.cjs +32 -0
  175. package/get-shit-done/bin/lib/security.cjs +600 -0
  176. package/get-shit-done/bin/lib/semver-compare.cjs +35 -0
  177. package/get-shit-done/bin/lib/shell-command-projection.cjs +500 -0
  178. package/get-shit-done/bin/lib/state-command-router.cjs +252 -0
  179. package/get-shit-done/bin/lib/state-document.cjs +263 -0
  180. package/get-shit-done/bin/lib/state.cjs +2038 -0
  181. package/get-shit-done/bin/lib/surface.cjs +470 -0
  182. package/get-shit-done/bin/lib/task-command-router.cjs +81 -0
  183. package/get-shit-done/bin/lib/template.cjs +228 -0
  184. package/get-shit-done/bin/lib/uat.cjs +289 -0
  185. package/get-shit-done/bin/lib/update-context.cjs +209 -0
  186. package/get-shit-done/bin/lib/validate-command-router.cjs +83 -0
  187. package/get-shit-done/bin/lib/validate.cjs +92 -0
  188. package/get-shit-done/bin/lib/verify-command-router.cjs +40 -0
  189. package/get-shit-done/bin/lib/verify.cjs +1511 -0
  190. package/get-shit-done/bin/lib/workstream-inventory-builder.cjs +74 -0
  191. package/get-shit-done/bin/lib/workstream-inventory.cjs +146 -0
  192. package/get-shit-done/bin/lib/workstream-name-policy.cjs +94 -0
  193. package/get-shit-done/bin/lib/workstream.cjs +389 -0
  194. package/get-shit-done/bin/lib/worktree-safety.cjs +985 -0
  195. package/get-shit-done/bin/shared/config-defaults.manifest.json +97 -0
  196. package/get-shit-done/bin/shared/config-schema.manifest.json +175 -0
  197. package/get-shit-done/bin/shared/model-catalog.json +122 -0
  198. package/get-shit-done/bin/shared/runtime-aliases.manifest.json +75 -0
  199. package/get-shit-done/bin/verify-reapply-patches.cjs +352 -0
  200. package/get-shit-done/contexts/dev.md +21 -0
  201. package/get-shit-done/contexts/research.md +22 -0
  202. package/get-shit-done/contexts/review.md +23 -0
  203. package/get-shit-done/references/agent-contracts.md +79 -0
  204. package/get-shit-done/references/ai-evals.md +156 -0
  205. package/get-shit-done/references/ai-frameworks.md +186 -0
  206. package/get-shit-done/references/artifact-types.md +131 -0
  207. package/get-shit-done/references/autonomous-smart-discuss.md +277 -0
  208. package/get-shit-done/references/checkpoints.md +814 -0
  209. package/get-shit-done/references/common-bug-patterns.md +114 -0
  210. package/get-shit-done/references/context-budget.md +85 -0
  211. package/get-shit-done/references/continuation-format.md +253 -0
  212. package/get-shit-done/references/debugger-philosophy.md +76 -0
  213. package/get-shit-done/references/decimal-phase-calculation.md +64 -0
  214. package/get-shit-done/references/doc-conflict-engine.md +91 -0
  215. package/get-shit-done/references/domain-probes.md +125 -0
  216. package/get-shit-done/references/execute-mvp-tdd.md +81 -0
  217. package/get-shit-done/references/executor-examples.md +110 -0
  218. package/get-shit-done/references/few-shot-examples/plan-checker.md +73 -0
  219. package/get-shit-done/references/few-shot-examples/verifier.md +109 -0
  220. package/get-shit-done/references/gate-prompts.md +100 -0
  221. package/get-shit-done/references/gates.md +70 -0
  222. package/get-shit-done/references/git-integration.md +298 -0
  223. package/get-shit-done/references/git-planning-commit.md +40 -0
  224. package/get-shit-done/references/ios-scaffold.md +123 -0
  225. package/get-shit-done/references/mandatory-initial-read.md +2 -0
  226. package/get-shit-done/references/model-profile-resolution.md +38 -0
  227. package/get-shit-done/references/model-profiles.md +245 -0
  228. package/get-shit-done/references/mvp-concepts.md +49 -0
  229. package/get-shit-done/references/phase-argument-parsing.md +61 -0
  230. package/get-shit-done/references/planner-antipatterns.md +89 -0
  231. package/get-shit-done/references/planner-chunked.md +49 -0
  232. package/get-shit-done/references/planner-gap-closure.md +62 -0
  233. package/get-shit-done/references/planner-graphify-auto-update.md +67 -0
  234. package/get-shit-done/references/planner-human-verify-mode.md +57 -0
  235. package/get-shit-done/references/planner-interface-context.md +62 -0
  236. package/get-shit-done/references/planner-mvp-mode.md +53 -0
  237. package/get-shit-done/references/planner-reviews.md +39 -0
  238. package/get-shit-done/references/planner-revision.md +87 -0
  239. package/get-shit-done/references/planner-source-audit.md +73 -0
  240. package/get-shit-done/references/planning-config.md +471 -0
  241. package/get-shit-done/references/project-skills-discovery.md +19 -0
  242. package/get-shit-done/references/questioning.md +162 -0
  243. package/get-shit-done/references/revision-loop.md +97 -0
  244. package/get-shit-done/references/scout-codebase.md +51 -0
  245. package/get-shit-done/references/skeleton-template.md +48 -0
  246. package/get-shit-done/references/sketch-interactivity.md +41 -0
  247. package/get-shit-done/references/sketch-theme-system.md +94 -0
  248. package/get-shit-done/references/sketch-tooling.md +45 -0
  249. package/get-shit-done/references/sketch-variant-patterns.md +81 -0
  250. package/get-shit-done/references/spidr-splitting.md +69 -0
  251. package/get-shit-done/references/tdd.md +330 -0
  252. package/get-shit-done/references/thinking-models-debug.md +44 -0
  253. package/get-shit-done/references/thinking-models-execution.md +50 -0
  254. package/get-shit-done/references/thinking-models-planning.md +62 -0
  255. package/get-shit-done/references/thinking-models-research.md +50 -0
  256. package/get-shit-done/references/thinking-models-verification.md +55 -0
  257. package/get-shit-done/references/thinking-partner.md +96 -0
  258. package/get-shit-done/references/ui-brand.md +160 -0
  259. package/get-shit-done/references/universal-anti-patterns.md +63 -0
  260. package/get-shit-done/references/user-profiling.md +681 -0
  261. package/get-shit-done/references/user-story-template.md +58 -0
  262. package/get-shit-done/references/verification-overrides.md +227 -0
  263. package/get-shit-done/references/verification-patterns.md +612 -0
  264. package/get-shit-done/references/verify-mvp-mode.md +85 -0
  265. package/get-shit-done/references/workstream-flag.md +111 -0
  266. package/get-shit-done/references/worktree-path-safety.md +89 -0
  267. package/get-shit-done/templates/AI-SPEC.md +246 -0
  268. package/get-shit-done/templates/DEBUG.md +169 -0
  269. package/get-shit-done/templates/README.md +77 -0
  270. package/get-shit-done/templates/SECURITY.md +61 -0
  271. package/get-shit-done/templates/UAT.md +265 -0
  272. package/get-shit-done/templates/UI-SPEC.md +100 -0
  273. package/get-shit-done/templates/VALIDATION.md +76 -0
  274. package/get-shit-done/templates/claude-md.md +145 -0
  275. package/get-shit-done/templates/codebase/architecture.md +255 -0
  276. package/get-shit-done/templates/codebase/concerns.md +310 -0
  277. package/get-shit-done/templates/codebase/conventions.md +307 -0
  278. package/get-shit-done/templates/codebase/integrations.md +280 -0
  279. package/get-shit-done/templates/codebase/stack.md +186 -0
  280. package/get-shit-done/templates/codebase/structure.md +285 -0
  281. package/get-shit-done/templates/codebase/testing.md +480 -0
  282. package/get-shit-done/templates/config.json +62 -0
  283. package/get-shit-done/templates/context.md +352 -0
  284. package/get-shit-done/templates/continue-here.md +78 -0
  285. package/get-shit-done/templates/copilot-instructions.md +7 -0
  286. package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
  287. package/get-shit-done/templates/dev-preferences.md +21 -0
  288. package/get-shit-done/templates/discovery.md +146 -0
  289. package/get-shit-done/templates/discussion-log.md +63 -0
  290. package/get-shit-done/templates/milestone-archive.md +123 -0
  291. package/get-shit-done/templates/milestone.md +115 -0
  292. package/get-shit-done/templates/phase-prompt.md +610 -0
  293. package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
  294. package/get-shit-done/templates/project.md +186 -0
  295. package/get-shit-done/templates/requirements.md +231 -0
  296. package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
  297. package/get-shit-done/templates/research-project/FEATURES.md +147 -0
  298. package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
  299. package/get-shit-done/templates/research-project/STACK.md +120 -0
  300. package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
  301. package/get-shit-done/templates/research.md +592 -0
  302. package/get-shit-done/templates/retrospective.md +54 -0
  303. package/get-shit-done/templates/roadmap.md +202 -0
  304. package/get-shit-done/templates/spec.md +307 -0
  305. package/get-shit-done/templates/state.md +195 -0
  306. package/get-shit-done/templates/summary-complex.md +59 -0
  307. package/get-shit-done/templates/summary-minimal.md +41 -0
  308. package/get-shit-done/templates/summary-standard.md +48 -0
  309. package/get-shit-done/templates/summary.md +248 -0
  310. package/get-shit-done/templates/user-profile.md +146 -0
  311. package/get-shit-done/templates/user-setup.md +311 -0
  312. package/get-shit-done/templates/verification-report.md +322 -0
  313. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +1 -0
  314. package/get-shit-done/workflows/add-backlog.md +91 -0
  315. package/get-shit-done/workflows/add-phase.md +113 -0
  316. package/get-shit-done/workflows/add-tests.md +355 -0
  317. package/get-shit-done/workflows/add-todo.md +161 -0
  318. package/get-shit-done/workflows/ai-integration-phase.md +295 -0
  319. package/get-shit-done/workflows/analyze-dependencies.md +96 -0
  320. package/get-shit-done/workflows/audit-fix.md +178 -0
  321. package/get-shit-done/workflows/audit-milestone.md +358 -0
  322. package/get-shit-done/workflows/audit-uat.md +110 -0
  323. package/get-shit-done/workflows/autonomous.md +795 -0
  324. package/get-shit-done/workflows/check-todos.md +180 -0
  325. package/get-shit-done/workflows/cleanup.md +155 -0
  326. package/get-shit-done/workflows/code-review-fix.md +502 -0
  327. package/get-shit-done/workflows/code-review.md +656 -0
  328. package/get-shit-done/workflows/complete-milestone.md +855 -0
  329. package/get-shit-done/workflows/debug.md +232 -0
  330. package/get-shit-done/workflows/diagnose-issues.md +241 -0
  331. package/get-shit-done/workflows/discovery-phase.md +291 -0
  332. package/get-shit-done/workflows/discuss-phase/modes/advisor.md +176 -0
  333. package/get-shit-done/workflows/discuss-phase/modes/all.md +28 -0
  334. package/get-shit-done/workflows/discuss-phase/modes/analyze.md +44 -0
  335. package/get-shit-done/workflows/discuss-phase/modes/auto.md +57 -0
  336. package/get-shit-done/workflows/discuss-phase/modes/batch.md +52 -0
  337. package/get-shit-done/workflows/discuss-phase/modes/chain.md +98 -0
  338. package/get-shit-done/workflows/discuss-phase/modes/default.md +141 -0
  339. package/get-shit-done/workflows/discuss-phase/modes/power.md +44 -0
  340. package/get-shit-done/workflows/discuss-phase/modes/text.md +55 -0
  341. package/get-shit-done/workflows/discuss-phase/templates/checkpoint.json +18 -0
  342. package/get-shit-done/workflows/discuss-phase/templates/context.md +136 -0
  343. package/get-shit-done/workflows/discuss-phase/templates/discussion-log.md +50 -0
  344. package/get-shit-done/workflows/discuss-phase-assumptions.md +675 -0
  345. package/get-shit-done/workflows/discuss-phase-power.md +291 -0
  346. package/get-shit-done/workflows/discuss-phase.md +499 -0
  347. package/get-shit-done/workflows/do.md +111 -0
  348. package/get-shit-done/workflows/docs-update.md +1162 -0
  349. package/get-shit-done/workflows/edit-phase.md +295 -0
  350. package/get-shit-done/workflows/eval-review.md +156 -0
  351. package/get-shit-done/workflows/execute-phase/steps/codebase-drift-gate.md +82 -0
  352. package/get-shit-done/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  353. package/get-shit-done/workflows/execute-phase/steps/post-merge-gate.md +117 -0
  354. package/get-shit-done/workflows/execute-phase.md +1709 -0
  355. package/get-shit-done/workflows/execute-plan.md +526 -0
  356. package/get-shit-done/workflows/explore.md +144 -0
  357. package/get-shit-done/workflows/extract-learnings.md +243 -0
  358. package/get-shit-done/workflows/fast.md +124 -0
  359. package/get-shit-done/workflows/forensics.md +279 -0
  360. package/get-shit-done/workflows/graduation.md +196 -0
  361. package/get-shit-done/workflows/health.md +224 -0
  362. package/get-shit-done/workflows/help/modes/brief.md +22 -0
  363. package/get-shit-done/workflows/help/modes/default.md +50 -0
  364. package/get-shit-done/workflows/help/modes/full.md +784 -0
  365. package/get-shit-done/workflows/help/modes/topic.md +74 -0
  366. package/get-shit-done/workflows/help.md +24 -0
  367. package/get-shit-done/workflows/import.md +254 -0
  368. package/get-shit-done/workflows/inbox.md +387 -0
  369. package/get-shit-done/workflows/ingest-docs.md +339 -0
  370. package/get-shit-done/workflows/insert-phase.md +152 -0
  371. package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
  372. package/get-shit-done/workflows/list-workspaces.md +57 -0
  373. package/get-shit-done/workflows/manager.md +393 -0
  374. package/get-shit-done/workflows/map-codebase.md +444 -0
  375. package/get-shit-done/workflows/milestone-summary.md +224 -0
  376. package/get-shit-done/workflows/mvp-phase.md +222 -0
  377. package/get-shit-done/workflows/new-milestone.md +635 -0
  378. package/get-shit-done/workflows/new-project.md +1555 -0
  379. package/get-shit-done/workflows/new-workspace.md +240 -0
  380. package/get-shit-done/workflows/next.md +299 -0
  381. package/get-shit-done/workflows/node-repair.md +92 -0
  382. package/get-shit-done/workflows/note.md +158 -0
  383. package/get-shit-done/workflows/pause-work.md +244 -0
  384. package/get-shit-done/workflows/plan-milestone-gaps.md +281 -0
  385. package/get-shit-done/workflows/plan-phase.md +1809 -0
  386. package/get-shit-done/workflows/plan-review-convergence.md +346 -0
  387. package/get-shit-done/workflows/plant-seed.md +230 -0
  388. package/get-shit-done/workflows/pr-branch.md +157 -0
  389. package/get-shit-done/workflows/profile-user.md +453 -0
  390. package/get-shit-done/workflows/progress.md +699 -0
  391. package/get-shit-done/workflows/quick.md +1039 -0
  392. package/get-shit-done/workflows/reapply-patches.md +426 -0
  393. package/get-shit-done/workflows/remove-phase.md +156 -0
  394. package/get-shit-done/workflows/remove-workspace.md +108 -0
  395. package/get-shit-done/workflows/resume-project.md +332 -0
  396. package/get-shit-done/workflows/review.md +623 -0
  397. package/get-shit-done/workflows/scan.md +105 -0
  398. package/get-shit-done/workflows/secure-phase.md +180 -0
  399. package/get-shit-done/workflows/session-report.md +146 -0
  400. package/get-shit-done/workflows/settings-advanced.md +620 -0
  401. package/get-shit-done/workflows/settings-integrations.md +312 -0
  402. package/get-shit-done/workflows/settings.md +552 -0
  403. package/get-shit-done/workflows/ship.md +356 -0
  404. package/get-shit-done/workflows/sketch-wrap-up.md +286 -0
  405. package/get-shit-done/workflows/sketch.md +361 -0
  406. package/get-shit-done/workflows/spec-phase.md +262 -0
  407. package/get-shit-done/workflows/spike-wrap-up.md +307 -0
  408. package/get-shit-done/workflows/spike.md +453 -0
  409. package/get-shit-done/workflows/stats.md +80 -0
  410. package/get-shit-done/workflows/sync-skills.md +182 -0
  411. package/get-shit-done/workflows/thread.md +222 -0
  412. package/get-shit-done/workflows/transition.md +694 -0
  413. package/get-shit-done/workflows/ui-phase.md +328 -0
  414. package/get-shit-done/workflows/ui-review.md +193 -0
  415. package/get-shit-done/workflows/ultraplan-phase.md +199 -0
  416. package/get-shit-done/workflows/undo.md +314 -0
  417. package/get-shit-done/workflows/update.md +443 -0
  418. package/get-shit-done/workflows/validate-phase.md +179 -0
  419. package/get-shit-done/workflows/verify-phase.md +544 -0
  420. package/get-shit-done/workflows/verify-work.md +781 -0
  421. package/hooks/dist/gsd-check-update-worker.js +95 -0
  422. package/hooks/dist/gsd-check-update.js +64 -0
  423. package/hooks/dist/gsd-context-monitor.js +195 -0
  424. package/hooks/dist/gsd-graphify-update.sh +158 -0
  425. package/hooks/dist/gsd-phase-boundary.sh +47 -0
  426. package/hooks/dist/gsd-prompt-guard.js +97 -0
  427. package/hooks/dist/gsd-read-guard.js +101 -0
  428. package/hooks/dist/gsd-read-injection-scanner.js +203 -0
  429. package/hooks/dist/gsd-session-state.sh +59 -0
  430. package/hooks/dist/gsd-statusline.js +548 -0
  431. package/hooks/dist/gsd-update-banner.js +134 -0
  432. package/hooks/dist/gsd-validate-commit.sh +57 -0
  433. package/hooks/dist/gsd-workflow-guard.js +166 -0
  434. package/hooks/dist/lib/git-cmd.js +150 -0
  435. package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
  436. package/hooks/gsd-check-update-worker.js +95 -0
  437. package/hooks/gsd-check-update.js +64 -0
  438. package/hooks/gsd-context-monitor.js +195 -0
  439. package/hooks/gsd-graphify-update.sh +158 -0
  440. package/hooks/gsd-phase-boundary.sh +47 -0
  441. package/hooks/gsd-prompt-guard.js +97 -0
  442. package/hooks/gsd-read-guard.js +101 -0
  443. package/hooks/gsd-read-injection-scanner.js +203 -0
  444. package/hooks/gsd-session-state.sh +59 -0
  445. package/hooks/gsd-statusline.js +548 -0
  446. package/hooks/gsd-update-banner.js +134 -0
  447. package/hooks/gsd-validate-commit.sh +57 -0
  448. package/hooks/gsd-workflow-guard.js +166 -0
  449. package/hooks/lib/git-cmd.js +150 -0
  450. package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
  451. package/hooks/managed-hooks-registry.cjs +34 -0
  452. package/package.json +102 -0
  453. package/scripts/affected-tests-lib.cjs +541 -0
  454. package/scripts/audit-workflow-script-paths.cjs +73 -0
  455. package/scripts/base64-scan.sh +339 -0
  456. package/scripts/build-hooks.js +236 -0
  457. package/scripts/changeset/README.md +129 -0
  458. package/scripts/changeset/cli.cjs +392 -0
  459. package/scripts/changeset/github-release-notes.cjs +199 -0
  460. package/scripts/changeset/lint.cjs +110 -0
  461. package/scripts/changeset/new.cjs +137 -0
  462. package/scripts/changeset/parse.cjs +114 -0
  463. package/scripts/changeset/render.cjs +34 -0
  464. package/scripts/changeset/serialize.cjs +130 -0
  465. package/scripts/check-alias-drift.cjs +108 -0
  466. package/scripts/check-env.cjs +302 -0
  467. package/scripts/check-npm-integrity.cjs +209 -0
  468. package/scripts/ci-guard-runner.cjs +16 -0
  469. package/scripts/ci-prepare-test-scope.cjs +46 -0
  470. package/scripts/ci-rebase-check.cjs +85 -0
  471. package/scripts/ci-test-scope.cjs +302 -0
  472. package/scripts/command-contract-helpers.cjs +64 -0
  473. package/scripts/diff-touches-shipped-paths.cjs +147 -0
  474. package/scripts/fix-slash-commands.cjs +147 -0
  475. package/scripts/gen-inventory-manifest.cjs +109 -0
  476. package/scripts/generate-package-identity.cjs +104 -0
  477. package/scripts/lint-command-contract.cjs +108 -0
  478. package/scripts/lint-descriptions.cjs +83 -0
  479. package/scripts/lint-docs-required.cjs +222 -0
  480. package/scripts/lint-no-source-grep-extras.cjs +81 -0
  481. package/scripts/lint-no-source-grep.cjs +174 -0
  482. package/scripts/lint-package-identity-drift.cjs +141 -0
  483. package/scripts/lint-pr-check-project-dir.cjs +98 -0
  484. package/scripts/lint-shared-module-handsync.cjs +388 -0
  485. package/scripts/lint-shell-command-projection-drift.cjs +57 -0
  486. package/scripts/lint-skill-deps.cjs +180 -0
  487. package/scripts/lint-test-file-count.allowlist.json +36 -0
  488. package/scripts/lint-test-file-count.cjs +190 -0
  489. package/scripts/pr-template-policy.cjs +268 -0
  490. package/scripts/prompt-injection-scan.sh +203 -0
  491. package/scripts/release-tarball-smoke.cjs +627 -0
  492. package/scripts/run-affected-tests.cjs +6 -0
  493. package/scripts/run-cross-platform-tests.cjs +63 -0
  494. package/scripts/run-tests.cjs +282 -0
  495. package/scripts/secret-scan-lint.sh +231 -0
  496. package/scripts/secret-scan.sh +358 -0
  497. package/scripts/setup-branch-protection.sh +236 -0
  498. package/scripts/shared-module-handsync-allowlist.json +183 -0
  499. package/scripts/strip-prose-atrefs.cjs +106 -0
  500. package/scripts/sync-rulesets.sh +34 -0
  501. package/scripts/sync-runtime-launcher.cjs +402 -0
  502. package/scripts/test-failure-reasons.cjs +34 -0
  503. package/scripts/workflow-policy.cjs +450 -0
@@ -0,0 +1,333 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { execFileSync } = require('child_process');
6
+ const { output, error, ERROR_REASON } = require('./core.cjs');
7
+ const { parseDecisions } = require('./decisions.cjs');
8
+
9
+ function normalizePhrase(text) {
10
+ return String(text || '')
11
+ .toLowerCase()
12
+ .replace(/[^a-z0-9\s]/g, ' ')
13
+ .replace(/\s+/g, ' ')
14
+ .trim();
15
+ }
16
+
17
+ const SOFT_PHRASE_MIN_WORDS = 6;
18
+
19
+ function softPhrase(text) {
20
+ const words = normalizePhrase(text).split(' ').filter(Boolean);
21
+ if (words.length < SOFT_PHRASE_MIN_WORDS) return '';
22
+ return words.slice(0, SOFT_PHRASE_MIN_WORDS).join(' ');
23
+ }
24
+
25
+ function decisionMentioned(haystack, decision) {
26
+ if (!haystack) return false;
27
+ if (new RegExp(`\\b${decision.id}\\b`).test(haystack)) return true;
28
+ const phrase = softPhrase(decision.text);
29
+ return phrase ? normalizePhrase(haystack).includes(phrase) : false;
30
+ }
31
+
32
+ function readIfExists(filePath) {
33
+ try {
34
+ return fs.readFileSync(filePath, 'utf-8');
35
+ } catch {
36
+ return '';
37
+ }
38
+ }
39
+
40
+ function resolvePath(inputPath, projectDir) {
41
+ return path.isAbsolute(inputPath) ? inputPath : path.join(projectDir, inputPath);
42
+ }
43
+
44
+ function readWorkflowConfig(projectDir) {
45
+ const configPath = path.join(projectDir, '.planning', 'config.json');
46
+ try {
47
+ const parsed = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
48
+ return {
49
+ ...(parsed.workflow || {}),
50
+ auto_advance: parsed.workflow?.auto_advance ?? parsed.auto_advance,
51
+ _auto_chain_active: parsed.workflow?._auto_chain_active ?? parsed._auto_chain_active,
52
+ context_coverage_gate: parsed.workflow?.context_coverage_gate ?? parsed.context_coverage_gate,
53
+ };
54
+ } catch {
55
+ return {};
56
+ }
57
+ }
58
+
59
+ function cmdAutoMode(projectDir, raw) {
60
+ const workflow = readWorkflowConfig(projectDir);
61
+ const autoAdvance = Boolean(workflow.auto_advance ?? false);
62
+ const autoChainActive = Boolean(workflow._auto_chain_active ?? false);
63
+ let source = 'none';
64
+ if (autoChainActive && autoAdvance) source = 'both';
65
+ else if (autoChainActive) source = 'auto_chain';
66
+ else if (autoAdvance) source = 'auto_advance';
67
+
68
+ output({
69
+ active: autoChainActive || autoAdvance,
70
+ source,
71
+ auto_chain_active: autoChainActive,
72
+ auto_advance: autoAdvance,
73
+ }, raw);
74
+ }
75
+
76
+ function gateEnabled(projectDir) {
77
+ const value = readWorkflowConfig(projectDir).context_coverage_gate;
78
+ if (typeof value === 'boolean') return value;
79
+ if (typeof value === 'string') {
80
+ const lower = value.toLowerCase();
81
+ if (lower === 'false' || lower === 'true') return lower !== 'false';
82
+ }
83
+ return true;
84
+ }
85
+
86
+ function loadPlanContents(phaseDir) {
87
+ if (!fs.existsSync(phaseDir)) return [];
88
+ try {
89
+ return fs.readdirSync(phaseDir)
90
+ .filter((entry) => /-PLAN\.md$/.test(entry))
91
+ .map((entry) => readIfExists(path.join(phaseDir, entry)));
92
+ } catch {
93
+ return [];
94
+ }
95
+ }
96
+
97
+ const DESIGNATED_HEADINGS_RE = /^#{1,6}\s+(?:must[_ ]haves?|truths?|tasks?|objective)\b/i;
98
+ const XML_DECISION_TAGS_RE = /<(?:objective|tasks?|action)(?:\s[^>]*)?>([\s\S]*?)<\/(?:objective|tasks?|action)>/gi;
99
+
100
+ function stripCommentsAndFences(text) {
101
+ return text
102
+ .replace(/<!--[\s\S]*?-->/g, ' ')
103
+ .replace(/```[\s\S]*?```/g, ' ')
104
+ .replace(/~~~[\s\S]*?~~~/g, ' ');
105
+ }
106
+
107
+ function extractYamlBlock(frontmatter, key) {
108
+ const match = frontmatter.match(new RegExp(`^${key}\\s*:(.*)$`, 'm'));
109
+ if (!match) return '';
110
+ const startIdx = (match.index || 0) + match[0].length;
111
+ const rest = frontmatter.slice(startIdx + 1).split(/\r?\n/);
112
+ const block = [match[1] || ''];
113
+ for (const line of rest) {
114
+ if (line === '' || /^\s/.test(line)) block.push(line);
115
+ else break;
116
+ }
117
+ return block.join('\n');
118
+ }
119
+
120
+ function extractXmlTagBodies(text) {
121
+ const parts = [];
122
+ for (const match of text.matchAll(XML_DECISION_TAGS_RE)) {
123
+ if (match[1]) parts.push(match[1]);
124
+ }
125
+ return parts.join('\n');
126
+ }
127
+
128
+ function extractPlanDesignatedSections(planContent) {
129
+ if (!planContent) return '';
130
+ const cleaned = stripCommentsAndFences(planContent);
131
+ const fmMatch = cleaned.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
132
+ const frontmatter = fmMatch ? fmMatch[1] : '';
133
+ const body = fmMatch ? fmMatch[2] : cleaned;
134
+
135
+ const parts = [];
136
+ for (const key of ['must_haves', 'truths', 'objective']) {
137
+ const block = extractYamlBlock(frontmatter, key);
138
+ if (block) parts.push(block);
139
+ }
140
+
141
+ const bodyParts = [];
142
+ let inDesignated = false;
143
+ for (const line of body.split(/\r?\n/)) {
144
+ const heading = /^#{1,6}\s+/.test(line);
145
+ if (heading) {
146
+ inDesignated = DESIGNATED_HEADINGS_RE.test(line);
147
+ if (inDesignated) bodyParts.push(line);
148
+ continue;
149
+ }
150
+ if (inDesignated) bodyParts.push(line);
151
+ }
152
+ parts.push(bodyParts.join('\n'));
153
+ parts.push(extractXmlTagBodies(cleaned));
154
+ return parts.join('\n\n');
155
+ }
156
+
157
+ function buildPlanMessage(uncovered) {
158
+ if (uncovered.length === 0) return 'All trackable CONTEXT.md decisions are covered by plans.';
159
+ return [
160
+ '## Decision Coverage Gap',
161
+ '',
162
+ `${uncovered.length} CONTEXT.md decision(s) are not covered by any plan:`,
163
+ '',
164
+ ...uncovered.map((item) => `- **${item.id}** (${item.category || 'uncategorized'}): ${item.text}`),
165
+ '',
166
+ 'Resolve by citing `D-NN:` in a relevant plan\'s `must_haves`/`truths` (or body),',
167
+ 'OR move the decision to `### Claude\'s Discretion` / tag it `[informational]` if it should not be tracked.',
168
+ ].join('\n');
169
+ }
170
+
171
+ function buildVerifyMessage(notHonored) {
172
+ if (notHonored.length === 0) return 'All trackable CONTEXT.md decisions are honored by shipped artifacts.';
173
+ return [
174
+ '### Decision Coverage (warning)',
175
+ '',
176
+ `${notHonored.length} decision(s) not found in shipped artifacts:`,
177
+ '',
178
+ ...notHonored.map((item) => `- **${item.id}** (${item.category || 'uncategorized'}): ${item.text}`),
179
+ '',
180
+ 'This is a soft warning - verification status is unchanged.',
181
+ ].join('\n');
182
+ }
183
+
184
+ function loadTrackableDecisions(contextPath) {
185
+ return parseDecisions(readIfExists(contextPath)).filter((decision) => decision.trackable);
186
+ }
187
+
188
+ function cmdDecisionCoveragePlan(projectDir, args, raw) {
189
+ const phaseDir = args[2] ? resolvePath(args[2], projectDir) : '';
190
+ const contextPath = args[3] ? resolvePath(args[3], projectDir) : '';
191
+
192
+ if (!gateEnabled(projectDir)) {
193
+ output({ passed: true, skipped: true, reason: 'workflow.context_coverage_gate is false', total: 0, covered: 0, uncovered: [], message: 'Decision coverage gate disabled by config.' }, raw);
194
+ return;
195
+ }
196
+ if (!contextPath || !fs.existsSync(contextPath)) {
197
+ output({ passed: true, skipped: true, reason: 'CONTEXT.md missing', total: 0, covered: 0, uncovered: [], message: 'No CONTEXT.md - nothing to check.' }, raw);
198
+ return;
199
+ }
200
+
201
+ const decisions = loadTrackableDecisions(contextPath);
202
+ if (decisions.length === 0) {
203
+ output({ passed: true, skipped: true, reason: 'no trackable decisions', total: 0, covered: 0, uncovered: [], message: 'No trackable decisions in CONTEXT.md.' }, raw);
204
+ return;
205
+ }
206
+
207
+ const sections = loadPlanContents(phaseDir).map(extractPlanDesignatedSections);
208
+ const uncovered = [];
209
+ let covered = 0;
210
+ for (const decision of decisions) {
211
+ if (sections.some((section) => decisionMentioned(section, decision))) covered++;
212
+ else uncovered.push({ id: decision.id, text: decision.text, category: decision.category });
213
+ }
214
+
215
+ output({
216
+ passed: uncovered.length === 0,
217
+ skipped: false,
218
+ total: decisions.length,
219
+ covered,
220
+ uncovered,
221
+ message: buildPlanMessage(uncovered),
222
+ }, raw);
223
+ }
224
+
225
+ function recentCommitMessages(projectDir) {
226
+ try {
227
+ return execFileSync('git', ['log', '-n', '200', '--pretty=%s%n%b'], {
228
+ cwd: projectDir,
229
+ encoding: 'utf-8',
230
+ maxBuffer: 4 * 1024 * 1024,
231
+ });
232
+ } catch {
233
+ return '';
234
+ }
235
+ }
236
+
237
+ function isInsideRoot(candidatePath, rootDir) {
238
+ const root = path.resolve(rootDir);
239
+ const target = path.resolve(root, candidatePath);
240
+ return target === root || target.startsWith(`${root}${path.sep}`);
241
+ }
242
+
243
+ function readModifiedFilesContent(projectDir, summaries) {
244
+ const out = [];
245
+ let total = 0;
246
+ for (const summary of summaries) {
247
+ if (!summary) continue;
248
+ for (const blockMatch of summary.matchAll(/files_modified:\s*\n((?:[ \t]*-\s+.+\n?)+)/g)) {
249
+ const files = [...(blockMatch[1] || '').matchAll(/-\s+(.+)/g)]
250
+ .map((match) => match[1].trim().replace(/^["']|["']$/g, ''));
251
+ for (const file of files) {
252
+ if (total >= 50) break;
253
+ if (!file || !isInsideRoot(file, projectDir)) continue;
254
+ const raw = readIfExists(resolvePath(file, projectDir));
255
+ out.push(raw.length > 256 * 1024 ? raw.slice(0, 256 * 1024) : raw);
256
+ total++;
257
+ }
258
+ if (total >= 50) break;
259
+ }
260
+ if (total >= 50) break;
261
+ }
262
+ return out.join('\n\n');
263
+ }
264
+
265
+ function cmdDecisionCoverageVerify(projectDir, args, raw) {
266
+ const phaseDir = args[2] ? resolvePath(args[2], projectDir) : '';
267
+ const contextPath = args[3] ? resolvePath(args[3], projectDir) : '';
268
+
269
+ if (!gateEnabled(projectDir)) {
270
+ output({ skipped: true, blocking: false, reason: 'workflow.context_coverage_gate is false', total: 0, honored: 0, not_honored: [], message: 'Decision coverage gate disabled by config.' }, raw);
271
+ return;
272
+ }
273
+ if (!contextPath || !fs.existsSync(contextPath)) {
274
+ output({ skipped: true, blocking: false, reason: 'CONTEXT.md missing', total: 0, honored: 0, not_honored: [], message: 'No CONTEXT.md - nothing to check.' }, raw);
275
+ return;
276
+ }
277
+
278
+ const decisions = loadTrackableDecisions(contextPath);
279
+ if (decisions.length === 0) {
280
+ output({ skipped: true, blocking: false, reason: 'no trackable decisions', total: 0, honored: 0, not_honored: [], message: 'No trackable decisions in CONTEXT.md.' }, raw);
281
+ return;
282
+ }
283
+
284
+ const planContents = loadPlanContents(phaseDir);
285
+ const summaryParts = fs.existsSync(phaseDir)
286
+ ? fs.readdirSync(phaseDir).filter((entry) => /-SUMMARY\.md$/.test(entry)).map((entry) => readIfExists(path.join(phaseDir, entry)))
287
+ : [];
288
+ const haystack = [
289
+ planContents.join('\n\n'),
290
+ summaryParts.join('\n\n'),
291
+ readModifiedFilesContent(projectDir, summaryParts),
292
+ recentCommitMessages(projectDir),
293
+ ].join('\n\n');
294
+
295
+ const notHonored = [];
296
+ let honored = 0;
297
+ for (const decision of decisions) {
298
+ if (decisionMentioned(haystack, decision)) honored++;
299
+ else notHonored.push({ id: decision.id, text: decision.text, category: decision.category });
300
+ }
301
+
302
+ output({
303
+ skipped: false,
304
+ blocking: false,
305
+ total: decisions.length,
306
+ honored,
307
+ not_honored: notHonored,
308
+ message: buildVerifyMessage(notHonored),
309
+ }, raw);
310
+ }
311
+
312
+ function routeCheckCommand({ args, cwd, raw }) {
313
+ const subcommand = args[1];
314
+ if (subcommand === 'auto-mode') {
315
+ cmdAutoMode(cwd, raw);
316
+ return;
317
+ }
318
+ if (subcommand === 'decision-coverage-plan') {
319
+ cmdDecisionCoveragePlan(cwd, args, raw);
320
+ return;
321
+ }
322
+ if (subcommand === 'decision-coverage-verify') {
323
+ cmdDecisionCoverageVerify(cwd, args, raw);
324
+ return;
325
+ }
326
+ error('Unknown check subcommand. Available: auto-mode, decision-coverage-plan, decision-coverage-verify', ERROR_REASON.SDK_UNKNOWN_COMMAND);
327
+ }
328
+
329
+ module.exports = {
330
+ routeCheckCommand,
331
+ decisionMentioned,
332
+ extractPlanDesignatedSections,
333
+ };
@@ -0,0 +1,118 @@
1
+ 'use strict';
2
+
3
+ const { createHub, ERROR_KINDS } = require('./command-routing-hub.cjs');
4
+
5
+ /**
6
+ * CJS Command Router Adapter Module
7
+ *
8
+ * Compatibility routing for gsd-tools.cjs command families. Uses generated
9
+ * command metadata for availability and small family-local argument shapers for
10
+ * CJS handler calls.
11
+ */
12
+
13
+ function routeCjsCommandFamily({
14
+ args,
15
+ subcommands,
16
+ handlers,
17
+ defaultSubcommand,
18
+ unsupported = {},
19
+ unknownMessage,
20
+ error,
21
+ cwd,
22
+ raw,
23
+ }) {
24
+ routeHubCommandFamily({
25
+ family: '__legacy_cjs_family__',
26
+ args,
27
+ subcommands,
28
+ handlers,
29
+ defaultSubcommand,
30
+ unsupported,
31
+ unknownMessage,
32
+ error,
33
+ cwd,
34
+ raw,
35
+ });
36
+ }
37
+
38
+ /**
39
+ * Hub-backed family router adapter.
40
+ *
41
+ * Deepens the command-topology seam by routing family handlers through
42
+ * CommandRoutingHub's typed Result contract instead of ad-hoc per-router
43
+ * lookup + error handling branches.
44
+ */
45
+ function routeHubCommandFamily({
46
+ family,
47
+ args,
48
+ subcommands,
49
+ handlers,
50
+ defaultSubcommand,
51
+ unsupported = {},
52
+ unknownMessage,
53
+ error,
54
+ cwd,
55
+ raw,
56
+ }) {
57
+ const subcommand = args[1] || defaultSubcommand;
58
+
59
+ if (subcommand && unsupported[subcommand]) {
60
+ error(unsupported[subcommand]);
61
+ return;
62
+ }
63
+
64
+ const available = subcommands.filter((s) => !unsupported[s]);
65
+ const registryHandlers = Object.fromEntries(
66
+ Object.entries(handlers).map(([name, handler]) => [
67
+ name,
68
+ () => {
69
+ const result = handler();
70
+ if (result && typeof result === 'object' && Object.prototype.hasOwnProperty.call(result, 'ok')) {
71
+ return result;
72
+ }
73
+ return { ok: true, data: null };
74
+ },
75
+ ]),
76
+ );
77
+
78
+ const hub = createHub({
79
+ cjsRegistry: { [family]: registryHandlers },
80
+ manifest: { [family]: available },
81
+ });
82
+
83
+ const result = hub.dispatch({
84
+ family,
85
+ subcommand,
86
+ args: args.slice(2),
87
+ cwd,
88
+ raw,
89
+ });
90
+
91
+ if (result.ok) return;
92
+ if (result.kind === ERROR_KINDS.UnknownCommand) {
93
+ error(unknownMessage(subcommand, available));
94
+ return;
95
+ }
96
+ if (result.kind === ERROR_KINDS.InvalidArgs || result.kind === ERROR_KINDS.HandlerRefusal) {
97
+ error(result.reason);
98
+ return;
99
+ }
100
+ error(result.message);
101
+ }
102
+
103
+ /**
104
+ * Projection helper for family routers that still declare SDK registry metadata
105
+ * but execute the CJS fallback path at this seam.
106
+ *
107
+ * Accepts variable argument shapes so routers can pass legacy projection tuples
108
+ * (`registryCommand`, `registryArgs`, `legacyArgs`, optional `rawFormatter`, `cjsFallback`).
109
+ */
110
+ function cjsFallbackHandler(...projectionArgs) {
111
+ return projectionArgs[projectionArgs.length - 1];
112
+ }
113
+
114
+ module.exports = {
115
+ routeCjsCommandFamily,
116
+ routeHubCommandFamily,
117
+ cjsFallbackHandler,
118
+ };
@@ -0,0 +1,96 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Deterministic clock seam for lock modules (issue #453).
5
+ *
6
+ * Production code uses `realClock` (the default). Test code passes in a
7
+ * `makeFakeClock()` instance to drive lock timing without real wall-clock
8
+ * waits or Atomics.wait calls.
9
+ *
10
+ * Both methods in realClock use exactly the same system primitives that
11
+ * acquireStateLock and withPlanningLock used inline before the seam was
12
+ * introduced:
13
+ * - now() → Date.now()
14
+ * - sleep() → Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)
15
+ */
16
+
17
+ // Module-level Atomics.wait buffer reused across every realClock.sleep() call.
18
+ // The buffer value is always 0 (never written), so reuse is semantically
19
+ // identical to allocating a fresh buffer each time.
20
+ const _realSleepBuf = new Int32Array(new SharedArrayBuffer(4));
21
+
22
+ /**
23
+ * Parse GSD_NOW_MS to a valid pinned epoch millisecond value, or return null.
24
+ *
25
+ * Accepts ONLY strict decimal integer strings within JS Date bounds
26
+ * (abs(ms) <= 8.64e15). Rejects empty strings, whitespace-only, floats
27
+ * ('12.5'), scientific notation ('1e30'), and out-of-range values.
28
+ *
29
+ * Returns null (fall back to Date.now()) for any invalid or absent input.
30
+ * Returns null when GSD_TEST_MODE is not set.
31
+ *
32
+ * @returns {number|null}
33
+ */
34
+ function _pinnedNowMs() {
35
+ if (!process.env.GSD_TEST_MODE) return null;
36
+ const raw = process.env.GSD_NOW_MS;
37
+ if (typeof raw !== 'string') return null;
38
+ const t = raw.trim();
39
+ if (!/^-?\d+$/.test(t)) return null; // reject '', 'abc', '1e30', '12.5'
40
+ const ms = Number(t);
41
+ if (!Number.isFinite(ms) || Math.abs(ms) > 8.64e15) return null; // Date-valid bounds
42
+ return ms;
43
+ }
44
+
45
+ const realClock = {
46
+ /**
47
+ * Return current epoch milliseconds.
48
+ *
49
+ * When both GSD_TEST_MODE and GSD_NOW_MS are set (subprocess time-pin adapter,
50
+ * issue #474), returns the pinned millisecond value so all date-stamping in the
51
+ * subprocess SUT is deterministic. In production, falls back to Date.now().
52
+ *
53
+ * Only strict decimal integer strings within JS Date bounds are accepted as pins.
54
+ * Any other value (empty string, float, scientific notation, out-of-range) falls
55
+ * back to Date.now() to prevent RangeError from new Date(ms).toISOString().
56
+ */
57
+ now() {
58
+ const pinned = _pinnedNowMs();
59
+ if (pinned !== null) return pinned;
60
+ return Date.now();
61
+ },
62
+
63
+ /**
64
+ * Return the current instant as an ISO 8601 string (UTC).
65
+ * Uses this.now() so the subprocess time-pin adapter is honoured.
66
+ *
67
+ * @returns {string} e.g. "2020-06-15T12:00:00.000Z"
68
+ */
69
+ nowIso() {
70
+ return new Date(this.now()).toISOString();
71
+ },
72
+
73
+ /**
74
+ * Return today's date as a YYYY-MM-DD string (UTC calendar day).
75
+ * Uses this.now() so the subprocess time-pin adapter is honoured.
76
+ *
77
+ * @returns {string} e.g. "2020-06-15"
78
+ */
79
+ today() {
80
+ return this.nowIso().split('T')[0];
81
+ },
82
+
83
+ /**
84
+ * Synchronous sleep via Atomics.wait.
85
+ * This is the identical primitive acquireStateLock and withPlanningLock used
86
+ * inline before the seam. Atomics.wait on a shared buffer that is never
87
+ * notified times out after exactly `ms` milliseconds without spinning the CPU.
88
+ *
89
+ * @param {number} ms - milliseconds to sleep
90
+ */
91
+ sleep(ms) {
92
+ Atomics.wait(_realSleepBuf, 0, 0, ms);
93
+ },
94
+ };
95
+
96
+ module.exports = { realClock };
@@ -0,0 +1,135 @@
1
+ 'use strict';
2
+ /**
3
+ * Skill cluster definitions for the runtime surface module (ADR-0011 Phase 2).
4
+ *
5
+ * Each cluster is a named group of skill stems. Clusters are used by /gsd:surface
6
+ * to enable/disable a cohesive group of skills without reinstall.
7
+ *
8
+ * Cluster membership may overlap (a skill can live in two clusters). The union
9
+ * of all clusters should cover every installed skill stem; uncategorized stems
10
+ * are flagged by surface-clusters.test.cjs.
11
+ *
12
+ * Source: docs/research/2026-05-12-skill-surface-budget.md §3.2 (verified
13
+ * against commands/gsd/ listing in surface-clusters.test.cjs).
14
+ */
15
+
16
+ const CLUSTERS = Object.freeze({
17
+ core_loop: Object.freeze([
18
+ 'new-project',
19
+ 'discuss-phase',
20
+ 'plan-phase',
21
+ 'execute-phase',
22
+ 'help',
23
+ 'update',
24
+ ]),
25
+
26
+ audit_review: Object.freeze([
27
+ 'code-review',
28
+ 'review',
29
+ 'audit-fix',
30
+ 'audit-milestone',
31
+ 'audit-uat',
32
+ 'verify-work',
33
+ 'validate-phase',
34
+ 'plan-review-convergence',
35
+ 'eval-review',
36
+ 'add-tests',
37
+ 'secure-phase',
38
+ ]),
39
+
40
+ milestone: Object.freeze([
41
+ 'new-milestone',
42
+ 'complete-milestone',
43
+ 'milestone-summary',
44
+ 'health',
45
+ ]),
46
+
47
+ research_ideate: Object.freeze([
48
+ 'sketch',
49
+ 'spike',
50
+ 'forensics',
51
+ 'explore',
52
+ 'graphify',
53
+ 'ns-ideate',
54
+ ]),
55
+
56
+ workspace_state: Object.freeze([
57
+ 'pause-work',
58
+ 'resume-work',
59
+ 'workspace',
60
+ 'workstreams',
61
+ 'thread',
62
+ 'capture',
63
+ 'inbox',
64
+ ]),
65
+
66
+ docs: Object.freeze([
67
+ 'docs-update',
68
+ 'ingest-docs',
69
+ ]),
70
+
71
+ ui: Object.freeze([
72
+ 'ui-phase',
73
+ 'ui-review',
74
+ ]),
75
+
76
+ ai_eval: Object.freeze([
77
+ 'ai-integration-phase',
78
+ 'eval-review',
79
+ ]),
80
+
81
+ ns_meta: Object.freeze([
82
+ 'ns-context',
83
+ 'ns-ideate',
84
+ 'ns-manage',
85
+ 'ns-project',
86
+ 'ns-review',
87
+ 'ns-workflow',
88
+ ]),
89
+
90
+ utility: Object.freeze([
91
+ 'health',
92
+ 'stats',
93
+ 'settings',
94
+ 'cleanup',
95
+ 'pr-branch',
96
+ 'ship',
97
+ 'undo',
98
+ 'fast',
99
+ 'quick',
100
+ 'autonomous',
101
+ 'config',
102
+ 'progress',
103
+ 'phase',
104
+ 'review',
105
+ 'update',
106
+ 'help',
107
+ 'code-review',
108
+ 'import',
109
+ 'manager',
110
+ 'map-codebase',
111
+ 'profile-user',
112
+ 'spec-phase',
113
+ 'ultraplan-phase',
114
+ 'mvp-phase',
115
+ 'execute-phase',
116
+ 'review-backlog',
117
+ 'debug',
118
+ 'extract-learnings',
119
+ 'surface',
120
+ ]),
121
+ });
122
+
123
+ /**
124
+ * Build a Set of all skill stems covered by at least one cluster.
125
+ * @returns {Set<string>}
126
+ */
127
+ function allClusteredSkills() {
128
+ const result = new Set();
129
+ for (const skills of Object.values(CLUSTERS)) {
130
+ for (const s of skills) result.add(s);
131
+ }
132
+ return result;
133
+ }
134
+
135
+ module.exports = { CLUSTERS, allClusteredSkills };