@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,302 @@
1
+ /**
2
+ * Active Workstream Pointer Store Module
3
+ *
4
+ * Owns active workstream source precedence, session identity, and pointer IO:
5
+ * CLI --ws > GSD_WORKSTREAM env > stored active workstream pointer.
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const os = require('os');
10
+ const path = require('path');
11
+ const crypto = require('crypto');
12
+ const { probeTty, platformWriteSync, platformReadSync, platformEnsureDir } = require('./shell-command-projection.cjs');
13
+ const { isValidActiveWorkstreamName } = require('./workstream-name-policy.cjs');
14
+
15
+ const WORKSTREAM_SESSION_ENV_KEYS = [
16
+ 'GSD_SESSION_KEY',
17
+ 'CODEX_THREAD_ID',
18
+ 'CLAUDE_SESSION_ID',
19
+ 'CLAUDE_CODE_SSE_PORT',
20
+ 'OPENCODE_SESSION_ID',
21
+ 'GEMINI_SESSION_ID',
22
+ 'CURSOR_SESSION_ID',
23
+ 'WINDSURF_SESSION_ID',
24
+ 'TERM_SESSION_ID',
25
+ 'WT_SESSION',
26
+ 'TMUX_PANE',
27
+ 'ZELLIJ_SESSION_NAME',
28
+ ];
29
+
30
+ let cachedControllingTtyToken = null;
31
+ let didProbeControllingTtyToken = false;
32
+
33
+ function planningRoot(cwd) {
34
+ return path.join(cwd, '.planning');
35
+ }
36
+
37
+ function validateWorkstreamName(name) {
38
+ return isValidActiveWorkstreamName(name);
39
+ }
40
+
41
+ function sanitizeWorkstreamSessionToken(value) {
42
+ if (value === null || value === undefined) return null;
43
+ const token = String(value).trim().replace(/[^a-zA-Z0-9._-]+/g, '_').replace(/^_+|_+$/g, '');
44
+ return token ? token.slice(0, 160) : null;
45
+ }
46
+
47
+ function probeControllingTtyToken() {
48
+ if (didProbeControllingTtyToken) return cachedControllingTtyToken;
49
+ didProbeControllingTtyToken = true;
50
+
51
+ if (!(process.stdin && process.stdin.isTTY)) {
52
+ return cachedControllingTtyToken;
53
+ }
54
+
55
+ const ttyPath = probeTty();
56
+ if (ttyPath) {
57
+ const token = sanitizeWorkstreamSessionToken(ttyPath.replace(/^\/dev\//, ''));
58
+ if (token) cachedControllingTtyToken = `tty-${token}`;
59
+ }
60
+
61
+ return cachedControllingTtyToken;
62
+ }
63
+
64
+ function getControllingTtyToken() {
65
+ for (const envKey of ['TTY', 'SSH_TTY']) {
66
+ const token = sanitizeWorkstreamSessionToken(process.env[envKey]);
67
+ if (token) return `tty-${token.replace(/^dev_/, '')}`;
68
+ }
69
+
70
+ return probeControllingTtyToken();
71
+ }
72
+
73
+ function getWorkstreamSessionKey() {
74
+ for (const envKey of WORKSTREAM_SESSION_ENV_KEYS) {
75
+ const raw = process.env[envKey];
76
+ const token = sanitizeWorkstreamSessionToken(raw);
77
+ if (token) return `${envKey.toLowerCase().replace(/[^a-z0-9]+/g, '-')}-${token}`;
78
+ }
79
+
80
+ return getControllingTtyToken();
81
+ }
82
+
83
+ function getSessionScopedWorkstreamFile(cwd, fixedSessionKey) {
84
+ const sessionKey = fixedSessionKey || getWorkstreamSessionKey();
85
+ if (!sessionKey) return null;
86
+
87
+ let planningAbs;
88
+ try {
89
+ planningAbs = fs.realpathSync.native(planningRoot(cwd));
90
+ } catch {
91
+ planningAbs = path.resolve(planningRoot(cwd));
92
+ }
93
+ const projectId = crypto
94
+ .createHash('sha1')
95
+ .update(planningAbs)
96
+ .digest('hex')
97
+ .slice(0, 16);
98
+
99
+ const dirPath = path.join(os.tmpdir(), 'gsd-workstream-sessions', projectId);
100
+ return {
101
+ sessionKey,
102
+ dirPath,
103
+ filePath: path.join(dirPath, sessionKey),
104
+ };
105
+ }
106
+
107
+ function createSharedPointerAdapter(cwd) {
108
+ const filePath = path.join(planningRoot(cwd), 'active-workstream');
109
+ return {
110
+ read() {
111
+ const raw = platformReadSync(filePath);
112
+ return raw ? raw.trim() || null : null;
113
+ },
114
+ write(name) {
115
+ platformWriteSync(filePath, name + '\n');
116
+ },
117
+ clear() {
118
+ try { fs.unlinkSync(filePath); } catch {}
119
+ },
120
+ };
121
+ }
122
+
123
+ function createSessionScopedPointerAdapter(cwd, fixedSessionKey) {
124
+ const scoped = getSessionScopedWorkstreamFile(cwd, fixedSessionKey);
125
+ if (!scoped) return null;
126
+
127
+ return {
128
+ read() {
129
+ const raw = platformReadSync(scoped.filePath);
130
+ return raw ? raw.trim() || null : null;
131
+ },
132
+ write(name) {
133
+ platformEnsureDir(scoped.dirPath);
134
+ platformWriteSync(scoped.filePath, name + '\n');
135
+ },
136
+ clear() {
137
+ try { fs.unlinkSync(scoped.filePath); } catch {}
138
+ try {
139
+ const remaining = fs.readdirSync(scoped.dirPath);
140
+ if (remaining.length === 0) {
141
+ fs.rmdirSync(scoped.dirPath);
142
+ }
143
+ } catch {}
144
+ },
145
+ };
146
+ }
147
+
148
+ function createMemoryPointerAdapter(initialName = null) {
149
+ let value = initialName;
150
+ return {
151
+ read() {
152
+ return value;
153
+ },
154
+ write(name) {
155
+ value = name;
156
+ },
157
+ clear() {
158
+ value = null;
159
+ },
160
+ };
161
+ }
162
+
163
+ function pickActiveWorkstreamAdapter(cwd, opts = {}) {
164
+ if (opts.activeWorkstreamAdapter) {
165
+ return opts.activeWorkstreamAdapter;
166
+ }
167
+
168
+ const sessionKey = getWorkstreamSessionKey();
169
+ if (sessionKey) {
170
+ if (opts.activeWorkstreamAdapters && opts.activeWorkstreamAdapters.session) {
171
+ return opts.activeWorkstreamAdapters.session;
172
+ }
173
+ return createSessionScopedPointerAdapter(cwd, sessionKey);
174
+ }
175
+
176
+ if (opts.activeWorkstreamAdapters && opts.activeWorkstreamAdapters.shared) {
177
+ return opts.activeWorkstreamAdapters.shared;
178
+ }
179
+ return createSharedPointerAdapter(cwd);
180
+ }
181
+
182
+ function getActiveWorkstream(cwd, opts = {}) {
183
+ const adapter = pickActiveWorkstreamAdapter(cwd, opts);
184
+ if (!adapter) return null;
185
+
186
+ const name = adapter.read();
187
+ if (!name || !validateWorkstreamName(name)) {
188
+ adapter.clear();
189
+ return null;
190
+ }
191
+
192
+ const wsDir = path.join(planningRoot(cwd), 'workstreams', name);
193
+ if (!fs.existsSync(wsDir)) {
194
+ adapter.clear();
195
+ return null;
196
+ }
197
+
198
+ return name;
199
+ }
200
+
201
+ function setActiveWorkstream(cwd, name, opts = {}) {
202
+ const adapter = pickActiveWorkstreamAdapter(cwd, opts);
203
+ if (!adapter) return;
204
+
205
+ if (!name) {
206
+ adapter.clear();
207
+ return;
208
+ }
209
+ if (!validateWorkstreamName(name)) {
210
+ throw new Error('Invalid workstream name: must be alphanumeric, hyphens, underscores, or dots');
211
+ }
212
+
213
+ const wsDir = path.join(planningRoot(cwd), 'workstreams', name);
214
+ platformEnsureDir(wsDir);
215
+ adapter.write(name);
216
+ }
217
+
218
+ function clearActiveWorkstream(cwd, opts = {}) {
219
+ const adapter = pickActiveWorkstreamAdapter(cwd, opts);
220
+ if (!adapter) return;
221
+ adapter.clear();
222
+ }
223
+
224
+ function parseCliWorkstream(args) {
225
+ const wsEqArg = args.find(arg => arg.startsWith('--ws='));
226
+ const wsIdx = args.indexOf('--ws');
227
+
228
+ if (wsEqArg) {
229
+ const value = wsEqArg.slice('--ws='.length).trim();
230
+ if (!value) throw new Error('Missing value for --ws');
231
+ return {
232
+ value,
233
+ source: 'cli',
234
+ args: args.filter(arg => arg !== wsEqArg),
235
+ };
236
+ }
237
+
238
+ if (wsIdx !== -1) {
239
+ const value = args[wsIdx + 1];
240
+ if (!value || value.startsWith('--')) throw new Error('Missing value for --ws');
241
+ return {
242
+ value,
243
+ source: 'cli',
244
+ args: args.filter((_, idx) => idx !== wsIdx && idx !== wsIdx + 1),
245
+ };
246
+ }
247
+
248
+ return {
249
+ value: null,
250
+ source: null,
251
+ args: args.slice(),
252
+ };
253
+ }
254
+
255
+ function resolveActiveWorkstream(cwd, args, env = process.env, deps = {}) {
256
+ const parsed = parseCliWorkstream(args);
257
+ const getStored = deps.getStored || ((dir) => getActiveWorkstream(dir, deps));
258
+
259
+ let ws = null;
260
+ let source = 'none';
261
+
262
+ if (parsed.value) {
263
+ ws = parsed.value;
264
+ source = parsed.source;
265
+ } else if (env && typeof env.GSD_WORKSTREAM === 'string' && env.GSD_WORKSTREAM.trim()) {
266
+ ws = env.GSD_WORKSTREAM.trim();
267
+ source = 'env';
268
+ } else {
269
+ ws = getStored(cwd) || null;
270
+ source = ws ? 'store' : 'none';
271
+ }
272
+
273
+ if (ws && !validateWorkstreamName(ws)) {
274
+ throw new Error('Invalid workstream name: must be alphanumeric, hyphens, underscores, or dots');
275
+ }
276
+
277
+ return {
278
+ ws,
279
+ source,
280
+ args: parsed.args,
281
+ };
282
+ }
283
+
284
+ function applyResolvedWorkstreamEnv(resolution, env = process.env) {
285
+ if (!resolution || !resolution.ws) return;
286
+ env.GSD_WORKSTREAM = resolution.ws;
287
+ }
288
+
289
+ module.exports = {
290
+ validateWorkstreamName,
291
+ getWorkstreamSessionKey,
292
+ createSharedPointerAdapter,
293
+ createSessionScopedPointerAdapter,
294
+ createMemoryPointerAdapter,
295
+ pickActiveWorkstreamAdapter,
296
+ getActiveWorkstream,
297
+ setActiveWorkstream,
298
+ clearActiveWorkstream,
299
+ parseCliWorkstream,
300
+ resolveActiveWorkstream,
301
+ applyResolvedWorkstreamEnv,
302
+ };
@@ -0,0 +1,394 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { requireSafePath } = require('./security.cjs');
6
+
7
+ const STATUS_REJECT_SET = new Set(['superseded', 'rejected', 'deprecated']);
8
+
9
+ const CANONICAL_HEADERS = {
10
+ status: ['status', 'state', 'lifecycle', 'stage'],
11
+ goal: [
12
+ 'context',
13
+ 'background',
14
+ 'problem statement',
15
+ 'problem',
16
+ 'situation',
17
+ 'forces',
18
+ 'motivation',
19
+ 'issue',
20
+ 'drivers',
21
+ 'pain points',
22
+ 'story',
23
+ 'setting',
24
+ 'premise',
25
+ 'status quo',
26
+ 'context and problem statement',
27
+ ],
28
+ decisions: [
29
+ 'decision',
30
+ 'decisions',
31
+ 'resolution',
32
+ 'conclusion',
33
+ 'choice',
34
+ 'we decided',
35
+ 'direction',
36
+ 'approach',
37
+ 'solution',
38
+ 'outcome',
39
+ 'selected option',
40
+ 'recommendation',
41
+ 'strategy',
42
+ 'decision outcome',
43
+ ],
44
+ considered_options: [
45
+ 'considered options',
46
+ 'alternatives',
47
+ 'options',
48
+ 'choices',
49
+ 'candidates',
50
+ 'approaches considered',
51
+ 'variants',
52
+ 'trade-offs',
53
+ 'pros and cons of the options',
54
+ 'discussion',
55
+ ],
56
+ risks: [
57
+ 'risks',
58
+ 'trade-offs',
59
+ 'drawbacks',
60
+ 'cost',
61
+ 'tensions',
62
+ 'liabilities',
63
+ 'negative consequences',
64
+ 'side effects',
65
+ ],
66
+ success_criteria: [
67
+ 'success criteria',
68
+ 'acceptance criteria',
69
+ 'validation',
70
+ "how we'll know",
71
+ 'metrics',
72
+ 'kpis',
73
+ 'verification',
74
+ 'test strategy',
75
+ 'compliance',
76
+ 'definition of done',
77
+ 'exit criteria',
78
+ 'positive consequences',
79
+ ],
80
+ plan_sequence: [
81
+ 'implementation plan',
82
+ 'implementation notes',
83
+ 'steps',
84
+ 'tasks',
85
+ 'roadmap',
86
+ 'sequence',
87
+ 'migration plan',
88
+ 'plan',
89
+ 'action items',
90
+ 'work breakdown',
91
+ 'phases',
92
+ 'milestones',
93
+ 'stages',
94
+ ],
95
+ key_files: [
96
+ 'affected files',
97
+ 'files touched',
98
+ 'surface area',
99
+ 'modules affected',
100
+ 'code locations',
101
+ 'file changes',
102
+ 'diff summary',
103
+ 'touched code',
104
+ ],
105
+ out_of_scope: [
106
+ 'out of scope',
107
+ 'non-goals',
108
+ 'excluded',
109
+ 'not in this adr',
110
+ 'out of bounds',
111
+ "won't do",
112
+ "won't have",
113
+ 'beyond scope',
114
+ 'anti-goals',
115
+ ],
116
+ deferred: [
117
+ 'future work',
118
+ 'deferred',
119
+ 'future',
120
+ 'later',
121
+ 'follow-up',
122
+ 'next steps',
123
+ ],
124
+ dependencies: [
125
+ 'dependencies',
126
+ 'depends on',
127
+ 'prerequisites',
128
+ 'sequencing',
129
+ 'order',
130
+ 'blocked by',
131
+ 'cross-cuts',
132
+ 'related adrs',
133
+ 'links',
134
+ 'references',
135
+ 'see also',
136
+ 'upstream',
137
+ 'inbound',
138
+ ],
139
+ update: [
140
+ 'update',
141
+ 'revision',
142
+ 'amendment',
143
+ 'locked design',
144
+ 'final decision',
145
+ 'post-grilling',
146
+ 'addendum',
147
+ ],
148
+ consequences: [
149
+ 'consequences',
150
+ 'implications',
151
+ 'impact',
152
+ 'what this means',
153
+ 'result',
154
+ ],
155
+ };
156
+
157
+ const CONSEQUENCE_NEGATIVE_HINTS = [
158
+ 'negative',
159
+ 'drawback',
160
+ 'risk',
161
+ 'cost',
162
+ 'liability',
163
+ 'trade-off',
164
+ 'tension',
165
+ 'side effect',
166
+ ];
167
+
168
+ const CONSEQUENCE_POSITIVE_HINTS = [
169
+ 'positive',
170
+ 'success',
171
+ 'metric',
172
+ 'kpi',
173
+ 'verification',
174
+ 'acceptance',
175
+ 'benefit',
176
+ ];
177
+
178
+ function normalizeAdrHeader(raw) {
179
+ return String(raw || '')
180
+ .trim()
181
+ .toLowerCase()
182
+ .replace(/[\s:._-]+/g, ' ')
183
+ .replace(/[^\w\s]/g, '')
184
+ .trim();
185
+ }
186
+
187
+ function classifyHeader(normalizedHeader) {
188
+ for (const [canonical, synonyms] of Object.entries(CANONICAL_HEADERS)) {
189
+ for (const synonym of synonyms) {
190
+ if (normalizedHeader === synonym) return canonical;
191
+ if (normalizedHeader.startsWith(`${synonym} `)) return canonical;
192
+ }
193
+ }
194
+ return null;
195
+ }
196
+
197
+ function splitEntries(blockText) {
198
+ return String(blockText || '')
199
+ .split(/\r?\n/)
200
+ .map((line) => line.trim())
201
+ .filter(Boolean)
202
+ .map((line) => line.replace(/^[-*+]\s+/, '').trim())
203
+ .filter(Boolean);
204
+ }
205
+
206
+ function parseSections(markdown) {
207
+ const lines = String(markdown || '').split(/\r?\n/);
208
+ const sections = [];
209
+ let current = { heading: null, body: [] };
210
+
211
+ for (const line of lines) {
212
+ const m = line.match(/^#{1,6}\s+(.*)$/);
213
+ if (m) {
214
+ if (current.heading || current.body.length) sections.push(current);
215
+ current = { heading: m[1].trim(), body: [] };
216
+ } else {
217
+ current.body.push(line);
218
+ }
219
+ }
220
+
221
+ if (current.heading || current.body.length) sections.push(current);
222
+ return sections;
223
+ }
224
+
225
+ function parseStatusFromSections(sections) {
226
+ for (const section of sections) {
227
+ const canonical = classifyHeader(normalizeAdrHeader(section.heading));
228
+ if (canonical !== 'status') continue;
229
+ const line = splitEntries(section.body.join('\n'))[0] || '';
230
+ const norm = normalizeAdrHeader(line);
231
+ if (!norm) return '';
232
+ if (norm.includes('accepted')) return 'accepted';
233
+ if (norm.includes('proposed')) return 'proposed';
234
+ if (norm.includes('superseded')) return 'superseded';
235
+ if (norm.includes('rejected')) return 'rejected';
236
+ if (norm.includes('deprecated')) return 'deprecated';
237
+ return norm;
238
+ }
239
+ return '';
240
+ }
241
+
242
+ function pushUnique(target, values) {
243
+ const seen = new Set(target);
244
+ for (const value of values) {
245
+ if (!seen.has(value)) {
246
+ target.push(value);
247
+ seen.add(value);
248
+ }
249
+ }
250
+ }
251
+
252
+ function parseConsequences(lines, out) {
253
+ for (const entry of lines) {
254
+ const lower = entry.toLowerCase();
255
+ if (CONSEQUENCE_NEGATIVE_HINTS.some((hint) => lower.includes(hint))) {
256
+ out.consequences_negative.push(entry);
257
+ continue;
258
+ }
259
+ if (CONSEQUENCE_POSITIVE_HINTS.some((hint) => lower.includes(hint))) {
260
+ out.consequences_positive.push(entry);
261
+ continue;
262
+ }
263
+ out.consequences_positive.push(entry);
264
+ }
265
+ }
266
+
267
+ function parseAdrMarkdown(markdown, { sourcePath = '', format = 'auto' } = {}) {
268
+ const sections = parseSections(markdown);
269
+ const titleLine = String(markdown || '').split(/\r?\n/).find((line) => /^#\s+/.test(line)) || '';
270
+ const title = titleLine.replace(/^#\s+/, '').trim();
271
+
272
+ const out = {
273
+ title,
274
+ status: parseStatusFromSections(sections) || 'accepted',
275
+ context: '',
276
+ decisions: [],
277
+ options_considered: [],
278
+ consequences_positive: [],
279
+ consequences_negative: [],
280
+ out_of_scope: [],
281
+ deferred: [],
282
+ dependencies: [],
283
+ updates: [],
284
+ source_path: sourcePath,
285
+ key_files: [],
286
+ plan_sequence: [],
287
+ format,
288
+ unmapped_headers: [],
289
+ };
290
+
291
+ for (const section of sections) {
292
+ const heading = section.heading || '';
293
+ if (!heading) continue;
294
+ const canonical = classifyHeader(normalizeAdrHeader(heading));
295
+ const entries = splitEntries(section.body.join('\n'));
296
+ const prose = section.body.join('\n').trim();
297
+
298
+ if (!canonical) {
299
+ out.unmapped_headers.push(heading);
300
+ continue;
301
+ }
302
+
303
+ switch (canonical) {
304
+ case 'goal':
305
+ if (!out.context && prose) out.context = prose;
306
+ break;
307
+ case 'decisions':
308
+ pushUnique(out.decisions, entries);
309
+ break;
310
+ case 'considered_options':
311
+ pushUnique(out.options_considered, entries);
312
+ break;
313
+ case 'risks':
314
+ pushUnique(out.consequences_negative, entries);
315
+ break;
316
+ case 'success_criteria':
317
+ pushUnique(out.consequences_positive, entries);
318
+ break;
319
+ case 'plan_sequence':
320
+ pushUnique(out.plan_sequence, entries);
321
+ break;
322
+ case 'key_files':
323
+ pushUnique(out.key_files, entries);
324
+ break;
325
+ case 'out_of_scope':
326
+ pushUnique(out.out_of_scope, entries);
327
+ break;
328
+ case 'deferred':
329
+ pushUnique(out.deferred, entries);
330
+ break;
331
+ case 'dependencies':
332
+ pushUnique(out.dependencies, entries);
333
+ break;
334
+ case 'update':
335
+ out.updates.push({ heading, entries });
336
+ break;
337
+ case 'consequences':
338
+ parseConsequences(entries, out);
339
+ break;
340
+ default:
341
+ break;
342
+ }
343
+ }
344
+
345
+ return out;
346
+ }
347
+
348
+ function shouldRejectAdrStatus(status) {
349
+ return STATUS_REJECT_SET.has(normalizeAdrHeader(status));
350
+ }
351
+
352
+ function parseCliArgs(argv) {
353
+ const opts = { input: null, format: 'auto', projectDir: process.cwd() };
354
+ for (let i = 0; i < argv.length; i++) {
355
+ const arg = argv[i];
356
+ if (arg === '--input') {
357
+ opts.input = argv[++i] || null;
358
+ } else if (arg === '--format') {
359
+ opts.format = argv[++i] || 'auto';
360
+ } else if (arg === '--project-dir') {
361
+ opts.projectDir = argv[++i] || process.cwd();
362
+ } else {
363
+ throw new Error(`Unknown argument: ${arg}`);
364
+ }
365
+ }
366
+ if (!opts.input) {
367
+ throw new Error('Missing required --input <path>');
368
+ }
369
+ return opts;
370
+ }
371
+
372
+ function main(argv) {
373
+ const opts = parseCliArgs(argv);
374
+ const safePath = requireSafePath(opts.input, path.resolve(opts.projectDir), 'ADR input path', { allowAbsolute: true });
375
+ const content = fs.readFileSync(safePath, 'utf8');
376
+ const parsed = parseAdrMarkdown(content, { sourcePath: opts.input, format: opts.format });
377
+ process.stdout.write(JSON.stringify(parsed, null, 2));
378
+ }
379
+
380
+ if (require.main === module) {
381
+ try {
382
+ main(process.argv.slice(2));
383
+ } catch (error) {
384
+ process.stderr.write(`Error: ${error.message}\n`);
385
+ process.exit(1);
386
+ }
387
+ }
388
+
389
+ module.exports = {
390
+ CANONICAL_HEADERS,
391
+ normalizeAdrHeader,
392
+ parseAdrMarkdown,
393
+ shouldRejectAdrStatus,
394
+ };