@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,129 @@
1
+ # changeset/ — release-notes tooling
2
+
3
+ This directory holds the scripts that turn per-PR fragments in [`.changeset/`](../../.changeset/README.md)
4
+ and git history into the project's `CHANGELOG.md` and GitHub release notes.
5
+
6
+ The entry point is `cli.cjs`. It exposes three subcommands:
7
+
8
+ | Subcommand | Purpose |
9
+ |---|---|
10
+ | `render` | Render a single version's changelog section from consolidated data. |
11
+ | `github-release-notes` | Build GitHub release-notes body for a ref range. |
12
+ | `extract` | Pull existing `CHANGELOG.md` entries that fall in a version range. |
13
+
14
+ The rest of this document specifies the **`extract`** contract, because it is the
15
+ surface most likely to be called by external tooling (CI workflows, npm scripts,
16
+ release automation) that needs a stable exit-code and output guarantee to code
17
+ against.
18
+
19
+ ---
20
+
21
+ ## `cli.cjs extract`
22
+
23
+ Extract the changelog entries for every release in a version range, reading from
24
+ an existing `CHANGELOG.md`. The range is **`--from` exclusive, `--to` inclusive**.
25
+
26
+ ```bash
27
+ node scripts/changeset/cli.cjs extract --from VERSION --to VERSION \
28
+ [--changelog FILE] [--repo <dir>] [--json]
29
+ ```
30
+
31
+ ### Flags
32
+
33
+ | Flag | Required | Description |
34
+ |---|---|---|
35
+ | `--from VERSION` | Yes | Lower bound, **exclusive** — entries equal to `--from` are not returned. |
36
+ | `--to VERSION` | Yes | Upper bound, **inclusive** — entries equal to `--to` are returned. |
37
+ | `--changelog FILE` | No | Path to the changelog to read. Defaults to `<repo>/CHANGELOG.md`. |
38
+ | `--repo <dir>` | No | Repo root used to locate `CHANGELOG.md` when `--changelog` is omitted. Defaults to the current working directory. |
39
+ | `--json` | No | Emit the structured report as JSON instead of rendered markdown. |
40
+
41
+ ### Version validation
42
+
43
+ Both `--from` and `--to` must be **stable triplet semver** — `MAJOR.MINOR.PATCH`,
44
+ digits only.
45
+
46
+ - A leading `v` is accepted and stripped: `v1.42.0` is treated as `1.42.0`.
47
+ - Pre-release and build suffixes are **rejected**: `1.42.0-rc.1`, `1.42.0+build`,
48
+ and partial versions like `1.42.x` all fail validation and exit `1`.
49
+
50
+ Strict validation is deliberate. Coercing a malformed bound such as `1.42.x` to
51
+ `1.42.0` would silently change which releases the range selects, so a malformed
52
+ bound is rejected early with a structured error rather than guessed at.
53
+
54
+ Changelog entries that are themselves pre-release or non-semver (and the
55
+ `Unreleased` section) are skipped during matching; a notice for each skipped
56
+ entry is written to stderr.
57
+
58
+ ### Exit codes
59
+
60
+ `extract` resolves to one of three exit codes. The output shape depends on
61
+ whether `--json` is passed.
62
+
63
+ | Exit | Meaning | Default stdout | `--json` stdout |
64
+ |---|---|---|---|
65
+ | `0` | One or more releases fall in the range. | Rendered markdown for the matched releases. | `{ "releases": [ ... ], "from": "...", "to": "..." }` |
66
+ | `1` | Bad input: `--from`/`--to` is not stable semver, a required flag is missing, or the changelog file was not found. | Nothing (a missing-flag error and usage go to stderr). | `{ "error": "<message>", "releases": [] }` |
67
+ | `2` | Bounds are valid but no release falls in the range. | A `no releases found in range` notice on stderr. | `{ "releases": [], "from": "...", "to": "..." }` |
68
+
69
+ Notes for callers:
70
+
71
+ - **Treat exit `2` as "empty range", not "failure".** For a well-formed
72
+ invocation it means the request was understood and simply matched nothing — do
73
+ not surface it as an error. (At the argument-parsing layer, malformed argv such
74
+ as an unknown flag also exits `2`; pass well-formed arguments and this overlap
75
+ does not arise.)
76
+ - **In default (text) mode, a failure is signalled by the exit code alone** —
77
+ exit `1` from invalid semver or a missing changelog writes nothing to stdout.
78
+ Machine consumers should pass `--json` to receive the `error` field.
79
+
80
+ ### Output shape
81
+
82
+ With `--json`, the report is pretty-printed JSON. The `releases` array contains
83
+ one object per matched release (version, date, and parsed sections); `from` and
84
+ `to` echo the normalized bounds. On exit `1`, `releases` is empty and an `error`
85
+ string describes the failure.
86
+
87
+ Without `--json`, exit `0` prints the matched releases as markdown, ready to
88
+ paste into release notes:
89
+
90
+ ```text
91
+ ## [1.42.0] - 2026-01-15
92
+
93
+ ### Added
94
+
95
+ - New `--json` flag on the extract command (#3796)
96
+
97
+ ### Fixed
98
+
99
+ - Trailing-slash handling in config paths (#3651)
100
+ ```
101
+
102
+ ### Examples
103
+
104
+ Extract everything released after `1.41.0` up to and including `1.42.0`:
105
+
106
+ ```bash
107
+ node scripts/changeset/cli.cjs extract --from 1.41.0 --to 1.42.0
108
+ ```
109
+
110
+ The same range as structured JSON, reading an explicit changelog file:
111
+
112
+ ```bash
113
+ node scripts/changeset/cli.cjs extract \
114
+ --from v1.41.0 --to v1.42.0 \
115
+ --changelog ./CHANGELOG.md --json
116
+ ```
117
+
118
+ Handle the three outcomes in a shell consumer:
119
+
120
+ ```bash
121
+ if out=$(node scripts/changeset/cli.cjs extract --from "$FROM" --to "$TO" --json); then
122
+ echo "$out" # exit 0 — releases found
123
+ else
124
+ case $? in
125
+ 2) echo "no releases in range — nothing to publish" ;; # not an error
126
+ *) echo "extract failed: $out" >&2; exit 1 ;; # exit 1 — bad input
127
+ esac
128
+ fi
129
+ ```
@@ -0,0 +1,392 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * CLI wrapper for the changeset-fragment workflow (#2975).
6
+ *
7
+ * Subcommands:
8
+ * render --repo <dir> --version V --date D [--json] Fold .changeset/*.md
9
+ * into CHANGELOG.md;
10
+ * delete consumed fragments.
11
+ *
12
+ * `--json` emits a structured report on stdout — the only contract tests
13
+ * assert against. Per CONTRIBUTING.md "Prohibited: Raw Text Matching on
14
+ * Test Outputs", the human formatter is operator-only.
15
+ */
16
+
17
+ const fs = require('node:fs');
18
+ const path = require('node:path');
19
+
20
+ const { parseFragment, FRAGMENT_ERROR } = require('./parse.cjs');
21
+ const { renderChangelog } = require('./render.cjs');
22
+ const { serializeChangelog, parseChangelog } = require('./serialize.cjs');
23
+ const { renderGithubReleaseNotes } = require('./github-release-notes.cjs');
24
+ const {
25
+ compareSemverCore,
26
+ isStableTripletSemver,
27
+ } = require('../../get-shit-done/bin/lib/semver-compare.cjs');
28
+ const { packageName, repoSlug: defaultRepoSlug } = require('../../get-shit-done/bin/lib/package-identity.cjs');
29
+
30
+ function parseArgs(argv) {
31
+ const opts = {
32
+ cmd: null,
33
+ repo: process.cwd(),
34
+ version: null,
35
+ date: null,
36
+ fromRef: null,
37
+ toRef: null,
38
+ changelog: null,
39
+ output: null,
40
+ repoSlug: defaultRepoSlug,
41
+ installCommand: `npx ${packageName}@latest`,
42
+ json: false,
43
+ };
44
+ if (argv.length === 0) return { ok: true, opts };
45
+ opts.cmd = argv[0];
46
+
47
+ // Pull a value for a value-taking flag, validating that the next token
48
+ // exists and is not itself another flag (which is the silently-misparsed
49
+ // case CR called out: e.g. `--repo --json` would consume `--json` as the
50
+ // repo path).
51
+ const requireValue = (flag, i) => {
52
+ const v = argv[i + 1];
53
+ if (v === undefined || v.startsWith('--')) {
54
+ return { ok: false, error: `missing value for ${flag}` };
55
+ }
56
+ return { ok: true, value: v };
57
+ };
58
+
59
+ for (let i = 1; i < argv.length; i++) {
60
+ const a = argv[i];
61
+ if (a === '--json') { opts.json = true; continue; }
62
+ if (
63
+ a === '--repo' ||
64
+ a === '--version' ||
65
+ a === '--date' ||
66
+ a === '--from' ||
67
+ a === '--to' ||
68
+ a === '--changelog' ||
69
+ a === '--output' ||
70
+ a === '--repo-slug' ||
71
+ a === '--install-command'
72
+ ) {
73
+ const r = requireValue(a, i);
74
+ if (!r.ok) return { ok: false, error: r.error };
75
+ if (a === '--repo') opts.repo = r.value;
76
+ else if (a === '--version') opts.version = r.value;
77
+ else if (a === '--date') opts.date = r.value;
78
+ else if (a === '--from') opts.fromRef = r.value;
79
+ else if (a === '--to') opts.toRef = r.value;
80
+ else if (a === '--changelog') opts.changelog = r.value;
81
+ else if (a === '--output') opts.output = r.value;
82
+ else if (a === '--repo-slug') opts.repoSlug = r.value;
83
+ else if (a === '--install-command') opts.installCommand = r.value;
84
+ i++;
85
+ continue;
86
+ }
87
+ return { ok: false, error: `unknown argument: ${a}` };
88
+ }
89
+ return { ok: true, opts };
90
+ }
91
+
92
+ function listFragmentFiles(changesetDir) {
93
+ if (!fs.existsSync(changesetDir)) return [];
94
+ return fs.readdirSync(changesetDir)
95
+ .filter((f) => f.endsWith('.md') && f !== 'README.md')
96
+ .map((f) => path.join(changesetDir, f));
97
+ }
98
+
99
+ function splitChangelog(text) {
100
+ // Split off the top-level "# Changelog" heading + lead matter (everything
101
+ // before the first "## [version]" block) from the rest. The rest is the
102
+ // priorChangelog passed into renderChangelog. The "## [Unreleased]" block,
103
+ // if present, is dropped (the new release replaces it).
104
+ const lines = text.split(/\r?\n/);
105
+ const firstReleaseIdx = lines.findIndex((l) => /^##\s+\[/.test(l));
106
+ if (firstReleaseIdx === -1) {
107
+ return { lead: text.replace(/\s+$/, ''), prior: '' };
108
+ }
109
+ const lead = lines.slice(0, firstReleaseIdx).join('\n').replace(/\s+$/, '');
110
+ let priorStart = firstReleaseIdx;
111
+ // Skip the [Unreleased] block if present — it's a placeholder, not a release.
112
+ if (/^##\s+\[Unreleased\]/i.test(lines[firstReleaseIdx])) {
113
+ let j = firstReleaseIdx + 1;
114
+ while (j < lines.length && !/^##\s+\[/.test(lines[j])) j++;
115
+ priorStart = j;
116
+ }
117
+ const prior = lines.slice(priorStart).join('\n').trimStart();
118
+ return { lead, prior };
119
+ }
120
+
121
+ function cmdRender(opts) {
122
+ const repo = path.resolve(opts.repo);
123
+ const changesetDir = path.join(repo, '.changeset');
124
+ const changelogPath = path.join(repo, 'CHANGELOG.md');
125
+ const fragmentFiles = listFragmentFiles(changesetDir);
126
+
127
+ const fragments = [];
128
+ const failures = [];
129
+ for (const file of fragmentFiles) {
130
+ const src = fs.readFileSync(file, 'utf8');
131
+ const r = parseFragment(src);
132
+ if (r.ok) fragments.push({ ...r.fragment, file });
133
+ else failures.push({ file: path.relative(repo, file), reason: r.reason, detail: r.detail || null });
134
+ }
135
+
136
+ if (failures.length > 0) {
137
+ return { exitCode: 1, report: { consumed: 0, failures } };
138
+ }
139
+ if (fragments.length === 0) {
140
+ return { exitCode: 0, report: { consumed: 0, failures: [] } };
141
+ }
142
+
143
+ const priorText = fs.existsSync(changelogPath) ? fs.readFileSync(changelogPath, 'utf8') : '';
144
+ const { lead, prior } = splitChangelog(priorText);
145
+
146
+ const ir = renderChangelog({
147
+ fragments,
148
+ version: opts.version,
149
+ date: opts.date,
150
+ priorChangelog: prior || null,
151
+ });
152
+ const releaseBlock = serializeChangelog(ir);
153
+ const out = [
154
+ lead || '# Changelog',
155
+ '',
156
+ '## [Unreleased]',
157
+ '',
158
+ releaseBlock.replace(/\s+$/, ''),
159
+ '',
160
+ ].join('\n');
161
+
162
+ fs.writeFileSync(changelogPath, out);
163
+
164
+ // Delete consumed fragments. If any unlink fails the changelog is written
165
+ // but the fragment is still on disk, so a re-run would double-consume it.
166
+ // Surface the partial-failure as exitCode=1 with structured detail so the
167
+ // operator can manually clean up before retrying.
168
+ const deleteFailures = [];
169
+ for (const f of fragments) {
170
+ try {
171
+ fs.unlinkSync(f.file);
172
+ } catch (e) {
173
+ deleteFailures.push({
174
+ file: path.relative(repo, f.file),
175
+ reason: 'fail_fragment_delete',
176
+ detail: e.code || e.message,
177
+ });
178
+ }
179
+ }
180
+
181
+ return {
182
+ exitCode: deleteFailures.length > 0 ? 1 : 0,
183
+ report: {
184
+ consumed: fragments.length - deleteFailures.length,
185
+ failures: deleteFailures,
186
+ release: { version: opts.version, date: opts.date },
187
+ },
188
+ };
189
+ }
190
+
191
+ /**
192
+ * extract subcommand: extracts all changelog release blocks strictly after
193
+ * `--from` (exclusive) up to and including `--to` (inclusive). Both
194
+ * arguments accept `v`-prefixed semver (e.g. `v1.5.13`).
195
+ *
196
+ * Exit codes:
197
+ * 0 — one or more releases matched, output written.
198
+ * 2 — no releases fall in the specified range (matches nothing).
199
+ * 1 — I/O error or missing required flags.
200
+ *
201
+ * Fix for #3496: provides a deterministic range-aware helper so the
202
+ * `/gsd:update` show_changes_and_confirm step no longer relies on
203
+ * vague/manual extraction that can silently skip intermediate versions.
204
+ */
205
+ function cmdExtract(opts) {
206
+ const stripV = (v) => (typeof v === 'string' ? v.replace(/^v/, '') : v);
207
+ const from = stripV(opts.fromRef);
208
+ const to = stripV(opts.toRef);
209
+
210
+ // Validate that both bounds are strict semver (N.N.N, digits only).
211
+ // Coercing a malformed bound like "1.41.x" to "1.41.0" makes range
212
+ // selection silently wrong; reject early with a structured error.
213
+ if (!isStableTripletSemver(from)) {
214
+ return {
215
+ exitCode: 1,
216
+ report: { error: `invalid semver for --from: "${from}" (expected N.N.N)`, releases: [] },
217
+ textOutput: null,
218
+ };
219
+ }
220
+ if (!isStableTripletSemver(to)) {
221
+ return {
222
+ exitCode: 1,
223
+ report: { error: `invalid semver for --to: "${to}" (expected N.N.N)`, releases: [] },
224
+ textOutput: null,
225
+ };
226
+ }
227
+
228
+ const changelogPath = opts.changelog
229
+ ? path.resolve(opts.changelog)
230
+ : path.join(path.resolve(opts.repo), 'CHANGELOG.md');
231
+
232
+ if (!fs.existsSync(changelogPath)) {
233
+ return {
234
+ exitCode: 1,
235
+ report: { error: `CHANGELOG not found: ${changelogPath}`, releases: [] },
236
+ textOutput: null,
237
+ };
238
+ }
239
+
240
+ const text = fs.readFileSync(changelogPath, 'utf8');
241
+ const { releases } = parseChangelog(text);
242
+
243
+ const matched = releases.filter((rel) => {
244
+ if (rel.version === 'Unreleased') return false;
245
+ // Extract mode intentionally operates on stable releases only.
246
+ if (!isStableTripletSemver(rel.version)) {
247
+ process.stderr.write(`[extract] skipping pre-release/non-semver entry: ${rel.version}\n`);
248
+ return false;
249
+ }
250
+ // from is exclusive: cmp > 0 means rel.version > from
251
+ const afterFrom = compareSemverCore(rel.version, from) > 0;
252
+ // to is inclusive: cmp <= 0 means rel.version <= to
253
+ const upToTo = compareSemverCore(rel.version, to) <= 0;
254
+ return afterFrom && upToTo;
255
+ });
256
+
257
+ if (matched.length === 0) {
258
+ return {
259
+ exitCode: 2,
260
+ report: { releases: [], from, to },
261
+ textOutput: null,
262
+ };
263
+ }
264
+
265
+ return {
266
+ exitCode: 0,
267
+ report: { releases: matched, from, to },
268
+ textOutput: matched
269
+ .map((rel) => {
270
+ const header = `## [${rel.version}]${rel.date ? ` - ${rel.date}` : ''}`;
271
+ const sections = (rel.sections || [])
272
+ .map((s) => {
273
+ const bullets = s.bullets
274
+ .map((b) => (b.pr !== null ? `- ${b.body} (#${b.pr})` : `- ${b.body}`))
275
+ .join('\n');
276
+ return `### ${s.type}\n\n${bullets}`;
277
+ })
278
+ .join('\n\n');
279
+ return sections ? `${header}\n\n${sections}` : header;
280
+ })
281
+ .join('\n\n'),
282
+ };
283
+ }
284
+
285
+ function cmdGithubReleaseNotes(opts) {
286
+ const repo = path.resolve(opts.repo);
287
+ const report = renderGithubReleaseNotes({
288
+ repo,
289
+ fromRef: opts.fromRef,
290
+ toRef: opts.toRef,
291
+ repoSlug: opts.repoSlug,
292
+ installCommand: opts.installCommand,
293
+ });
294
+
295
+ if (!report.ok) {
296
+ return {
297
+ exitCode: 1,
298
+ report: {
299
+ consumed: 0,
300
+ failures: report.failures,
301
+ release: { from: opts.fromRef, to: opts.toRef },
302
+ },
303
+ };
304
+ }
305
+
306
+ if (opts.output) {
307
+ fs.writeFileSync(path.resolve(opts.output), report.body);
308
+ }
309
+
310
+ return {
311
+ exitCode: 0,
312
+ report: {
313
+ consumed: report.fragments.length,
314
+ failures: [],
315
+ release: { from: opts.fromRef, to: opts.toRef },
316
+ output: opts.output || null,
317
+ body: opts.output ? null : report.body,
318
+ },
319
+ };
320
+ }
321
+
322
+ function usage() {
323
+ return [
324
+ 'usage:',
325
+ ' changeset/cli.cjs render --repo <dir> --version V --date D [--json]',
326
+ ' changeset/cli.cjs github-release-notes --repo <dir> --from REF --to REF [--output FILE] [--repo-slug OWNER/REPO] [--install-command CMD] [--json]',
327
+ ' changeset/cli.cjs extract --from VERSION --to VERSION [--changelog FILE] [--repo <dir>] [--json]',
328
+ ' Extracts changelog entries strictly after --from (exclusive) and up to',
329
+ ' and including --to (inclusive). Accepts v-prefixed versions.',
330
+ ' Exit 2 when no releases fall in range.',
331
+ '',
332
+ ].join('\n');
333
+ }
334
+
335
+ function main() {
336
+ const parsed = parseArgs(process.argv.slice(2));
337
+ if (!parsed.ok) {
338
+ process.stderr.write(`${parsed.error}\n`);
339
+ process.stderr.write(usage());
340
+ process.exit(2);
341
+ }
342
+ const { opts } = parsed;
343
+ if (opts.cmd !== 'render' && opts.cmd !== 'github-release-notes' && opts.cmd !== 'extract') {
344
+ process.stderr.write(usage());
345
+ process.exit(1);
346
+ }
347
+ if (opts.cmd === 'render' && (!opts.version || !opts.date)) {
348
+ process.stderr.write('--version and --date are required for render\n');
349
+ process.exit(2);
350
+ }
351
+ if (opts.cmd === 'github-release-notes' && (!opts.fromRef || !opts.toRef)) {
352
+ process.stderr.write('--from and --to are required for github-release-notes\n');
353
+ process.exit(2);
354
+ }
355
+ if (opts.cmd === 'extract' && (!opts.fromRef || !opts.toRef)) {
356
+ process.stderr.write('--from and --to are required for extract\n');
357
+ process.stderr.write(usage());
358
+ process.exit(1);
359
+ }
360
+
361
+ if (opts.cmd === 'extract') {
362
+ const { exitCode, report, textOutput } = cmdExtract(opts);
363
+ if (opts.json) {
364
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
365
+ } else if (textOutput) {
366
+ process.stdout.write(textOutput + '\n');
367
+ } else if (exitCode === 2) {
368
+ process.stderr.write(`no releases found in range (from=${report.from}, to=${report.to})\n`);
369
+ }
370
+ process.exit(exitCode);
371
+ }
372
+
373
+ const { exitCode, report } = opts.cmd === 'render' ? cmdRender(opts) : cmdGithubReleaseNotes(opts);
374
+ if (opts.json) {
375
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
376
+ } else if (opts.cmd === 'github-release-notes' && report.body) {
377
+ process.stdout.write(report.body);
378
+ } else {
379
+ process.stdout.write(`Consumed: ${report.consumed} fragment(s)\n`);
380
+ if (report.failures.length > 0) {
381
+ process.stdout.write(`Failures: ${report.failures.length}\n`);
382
+ for (const f of report.failures) {
383
+ process.stdout.write(` ${f.file}: ${f.reason}${f.detail ? ` (${f.detail})` : ''}\n`);
384
+ }
385
+ }
386
+ }
387
+ process.exit(exitCode);
388
+ }
389
+
390
+ if (require.main === module) main();
391
+
392
+ module.exports = { cmdRender, cmdExtract, cmdGithubReleaseNotes, parseArgs, splitChangelog, listFragmentFiles, usage };