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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/README.ja-JP.md +44 -790
  2. package/README.ko-KR.md +41 -778
  3. package/README.md +39 -180
  4. package/README.pt-BR.md +45 -413
  5. package/README.zh-CN.md +43 -761
  6. package/agents/gsd-ai-researcher.md +1 -1
  7. package/agents/gsd-debugger.md +8 -8
  8. package/agents/gsd-domain-researcher.md +14 -1
  9. package/agents/gsd-eval-auditor.md +1 -1
  10. package/agents/gsd-eval-planner.md +1 -1
  11. package/agents/gsd-executor.md +21 -8
  12. package/agents/gsd-framework-selector.md +1 -1
  13. package/agents/gsd-intel-updater.md +4 -4
  14. package/agents/gsd-phase-researcher.md +18 -5
  15. package/agents/gsd-plan-checker.md +3 -3
  16. package/agents/gsd-planner.md +36 -23
  17. package/agents/gsd-project-researcher.md +13 -0
  18. package/agents/gsd-research-synthesizer.md +6 -2
  19. package/agents/gsd-roadmapper.md +6 -6
  20. package/agents/gsd-ui-researcher.md +15 -2
  21. package/agents/gsd-user-profiler.md +2 -2
  22. package/agents/gsd-verifier.md +7 -7
  23. package/bin/install.js +169 -59
  24. package/commands/gsd/add-tests.md +1 -1
  25. package/commands/gsd/ai-integration-phase.md +3 -3
  26. package/commands/gsd/audit-fix.md +1 -1
  27. package/commands/gsd/audit-milestone.md +1 -1
  28. package/commands/gsd/audit-uat.md +1 -1
  29. package/commands/gsd/autonomous.md +2 -2
  30. package/commands/gsd/capture.md +6 -6
  31. package/commands/gsd/cleanup.md +1 -1
  32. package/commands/gsd/code-review.md +1 -1
  33. package/commands/gsd/complete-milestone.md +2 -2
  34. package/commands/gsd/config.md +3 -3
  35. package/commands/gsd/debug.md +1 -1
  36. package/commands/gsd/discuss-phase.md +5 -4
  37. package/commands/gsd/docs-update.md +1 -1
  38. package/commands/gsd/eval-review.md +2 -2
  39. package/commands/gsd/execute-phase.md +2 -2
  40. package/commands/gsd/explore.md +1 -1
  41. package/commands/gsd/extract-learnings.md +2 -2
  42. package/commands/gsd/fast.md +1 -1
  43. package/commands/gsd/forensics.md +1 -1
  44. package/commands/gsd/graphify.md +9 -9
  45. package/commands/gsd/health.md +1 -1
  46. package/commands/gsd/help.md +2 -2
  47. package/commands/gsd/import.md +5 -5
  48. package/commands/gsd/inbox.md +1 -1
  49. package/commands/gsd/ingest-docs.md +4 -4
  50. package/commands/gsd/manager.md +3 -3
  51. package/commands/gsd/map-codebase.md +1 -1
  52. package/commands/gsd/milestone-summary.md +1 -1
  53. package/commands/gsd/mvp-phase.md +4 -4
  54. package/commands/gsd/new-milestone.md +5 -5
  55. package/commands/gsd/new-project.md +5 -5
  56. package/commands/gsd/pause-work.md +2 -2
  57. package/commands/gsd/phase.md +4 -4
  58. package/commands/gsd/plan-phase.md +2 -2
  59. package/commands/gsd/plan-review-convergence.md +4 -4
  60. package/commands/gsd/pr-branch.md +1 -1
  61. package/commands/gsd/profile-user.md +2 -2
  62. package/commands/gsd/progress.md +4 -4
  63. package/commands/gsd/quick.md +1 -1
  64. package/commands/gsd/resume-work.md +1 -1
  65. package/commands/gsd/review.md +1 -1
  66. package/commands/gsd/secure-phase.md +1 -1
  67. package/commands/gsd/settings.md +1 -1
  68. package/commands/gsd/ship.md +2 -2
  69. package/commands/gsd/sketch.md +7 -7
  70. package/commands/gsd/spec-phase.md +2 -2
  71. package/commands/gsd/spike.md +3 -3
  72. package/commands/gsd/stats.md +1 -1
  73. package/commands/gsd/surface.md +4 -4
  74. package/commands/gsd/thread.md +1 -1
  75. package/commands/gsd/ui-phase.md +2 -2
  76. package/commands/gsd/ui-review.md +2 -2
  77. package/commands/gsd/ultraplan-phase.md +2 -2
  78. package/commands/gsd/undo.md +3 -3
  79. package/commands/gsd/update.md +3 -3
  80. package/commands/gsd/validate-phase.md +1 -1
  81. package/commands/gsd/verify-work.md +2 -2
  82. package/commands/gsd/workspace.md +4 -4
  83. package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
  84. package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +13 -3
  85. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  86. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  87. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  88. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  89. package/gsd-core/bin/lib/audit.cjs +743 -0
  90. package/gsd-core/bin/lib/check-command-router.cjs +342 -0
  91. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  92. package/gsd-core/bin/lib/clock.cjs +95 -0
  93. package/gsd-core/bin/lib/clusters.cjs +128 -0
  94. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  95. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  96. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  97. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  98. package/gsd-core/bin/lib/commands.cjs +1202 -0
  99. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  100. package/{get-shit-done → gsd-core}/bin/lib/config-types.cjs +1 -1
  101. package/gsd-core/bin/lib/config.cjs +714 -0
  102. package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
  103. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  104. package/gsd-core/bin/lib/core.cjs +2007 -0
  105. package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
  106. package/gsd-core/bin/lib/docs.cjs +252 -0
  107. package/gsd-core/bin/lib/drift.cjs +364 -0
  108. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  109. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  110. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  111. package/gsd-core/bin/lib/graphify.cjs +496 -0
  112. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  113. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  114. package/gsd-core/bin/lib/init.cjs +1799 -0
  115. package/gsd-core/bin/lib/install-profiles.cjs +526 -0
  116. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  117. package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
  118. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  119. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  120. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  121. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  122. package/gsd-core/bin/lib/installer-migrations.cjs +823 -0
  123. package/gsd-core/bin/lib/intel.cjs +607 -0
  124. package/gsd-core/bin/lib/learnings.cjs +270 -0
  125. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  126. package/gsd-core/bin/lib/milestone.cjs +373 -0
  127. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  128. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  129. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  130. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  131. package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
  132. package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
  133. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  134. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  135. package/gsd-core/bin/lib/phase.cjs +1307 -0
  136. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  137. package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
  138. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  139. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  140. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  141. package/gsd-core/bin/lib/project-root.cjs +119 -0
  142. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  143. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  144. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  145. package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
  146. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  147. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
  148. package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
  149. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  150. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  151. package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
  152. package/gsd-core/bin/lib/secrets.cjs +34 -0
  153. package/gsd-core/bin/lib/security.cjs +407 -0
  154. package/{get-shit-done → gsd-core}/bin/lib/semver-compare.cjs +1 -1
  155. package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
  156. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  157. package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -78
  158. package/gsd-core/bin/lib/state.cjs +2010 -0
  159. package/gsd-core/bin/lib/surface.cjs +406 -0
  160. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  161. package/gsd-core/bin/lib/template.cjs +237 -0
  162. package/gsd-core/bin/lib/uat.cjs +297 -0
  163. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  164. package/gsd-core/bin/lib/update-context.cjs +218 -0
  165. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  166. package/gsd-core/bin/lib/validate.cjs +112 -0
  167. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  168. package/gsd-core/bin/lib/verify.cjs +1451 -0
  169. package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
  170. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  171. package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
  172. package/gsd-core/bin/lib/workstream.cjs +380 -0
  173. package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
  174. package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +5 -0
  175. package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
  176. package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
  177. package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
  178. package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
  179. package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
  180. package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
  181. package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
  182. package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
  183. package/gsd-core/references/worktree-branch-check.md +38 -0
  184. package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
  185. package/{get-shit-done → gsd-core}/templates/README.md +2 -2
  186. package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
  187. package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
  188. package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
  189. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  190. package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
  191. package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
  192. package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
  193. package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
  194. package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
  195. package/{get-shit-done → gsd-core}/workflows/audit-fix.md +1 -1
  196. package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +1 -1
  197. package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
  198. package/{get-shit-done → gsd-core}/workflows/autonomous.md +4 -4
  199. package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
  200. package/{get-shit-done → gsd-core}/workflows/cleanup.md +1 -1
  201. package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +1 -1
  202. package/{get-shit-done → gsd-core}/workflows/code-review.md +4 -4
  203. package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
  204. package/{get-shit-done → gsd-core}/workflows/debug.md +1 -1
  205. package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +4 -2
  206. package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
  207. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +4 -4
  208. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
  209. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
  210. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
  211. package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +2 -2
  212. package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
  213. package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
  214. package/{get-shit-done → gsd-core}/workflows/docs-update.md +1 -1
  215. package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
  216. package/{get-shit-done → gsd-core}/workflows/eval-review.md +2 -2
  217. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +15 -2
  218. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  219. package/{get-shit-done → gsd-core}/workflows/execute-phase.md +68 -46
  220. package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
  221. package/{get-shit-done → gsd-core}/workflows/explore.md +3 -3
  222. package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
  223. package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
  224. package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
  225. package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
  226. package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +1 -1
  227. package/{get-shit-done → gsd-core}/workflows/import.md +1 -1
  228. package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +3 -3
  229. package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
  230. package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
  231. package/{get-shit-done → gsd-core}/workflows/manager.md +1 -1
  232. package/{get-shit-done → gsd-core}/workflows/map-codebase.md +1 -1
  233. package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
  234. package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
  235. package/{get-shit-done → gsd-core}/workflows/new-milestone.md +3 -3
  236. package/{get-shit-done → gsd-core}/workflows/new-project.md +6 -6
  237. package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
  238. package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
  239. package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
  240. package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
  241. package/{get-shit-done → gsd-core}/workflows/plan-phase.md +15 -15
  242. package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +7 -7
  243. package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
  244. package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
  245. package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
  246. package/{get-shit-done → gsd-core}/workflows/quick.md +2 -26
  247. package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
  248. package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
  249. package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
  250. package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
  251. package/{get-shit-done → gsd-core}/workflows/review.md +1 -1
  252. package/{get-shit-done → gsd-core}/workflows/scan.md +1 -1
  253. package/{get-shit-done → gsd-core}/workflows/secure-phase.md +3 -3
  254. package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +1 -1
  255. package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
  256. package/{get-shit-done → gsd-core}/workflows/settings.md +1 -1
  257. package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
  258. package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
  259. package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
  260. package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
  261. package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
  262. package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
  263. package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
  264. package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
  265. package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
  266. package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
  267. package/{get-shit-done → gsd-core}/workflows/ui-phase.md +3 -3
  268. package/{get-shit-done → gsd-core}/workflows/ui-review.md +2 -2
  269. package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
  270. package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
  271. package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
  272. package/{get-shit-done → gsd-core}/workflows/validate-phase.md +3 -3
  273. package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
  274. package/{get-shit-done → gsd-core}/workflows/verify-work.md +5 -5
  275. package/hooks/dist/gsd-check-update-worker.js +16 -3
  276. package/hooks/dist/gsd-check-update.js +7 -5
  277. package/hooks/dist/gsd-context-monitor.js +2 -2
  278. package/hooks/dist/gsd-statusline.js +39 -21
  279. package/hooks/dist/gsd-update-banner.js +6 -2
  280. package/hooks/dist/managed-hooks-registry.cjs +35 -0
  281. package/hooks/gsd-check-update-worker.js +16 -3
  282. package/hooks/gsd-check-update.js +7 -5
  283. package/hooks/gsd-context-monitor.js +2 -2
  284. package/hooks/gsd-statusline.js +39 -21
  285. package/hooks/gsd-update-banner.js +6 -2
  286. package/package.json +9 -6
  287. package/scripts/affected-tests-lib.cjs +1 -1
  288. package/scripts/base64-scan.sh +12 -0
  289. package/scripts/build-hooks.js +4 -1
  290. package/scripts/changeset/cli.cjs +2 -2
  291. package/scripts/changeset/github-release-notes.cjs +1 -1
  292. package/scripts/changeset/lint.cjs +1 -1
  293. package/scripts/check-alias-drift.cjs +8 -8
  294. package/scripts/check-env.cjs +5 -1
  295. package/scripts/ci-test-scope.cjs +25 -10
  296. package/scripts/command-contract-helpers.cjs +1 -1
  297. package/scripts/fix-slash-commands.cjs +5 -5
  298. package/scripts/gen-inventory-manifest.cjs +3 -3
  299. package/scripts/generate-package-identity.cjs +28 -7
  300. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  301. package/scripts/lint-command-contract.cjs +1 -1
  302. package/scripts/lint-legacy-dir-name.cjs +156 -0
  303. package/scripts/lint-package-identity-drift.cjs +8 -8
  304. package/scripts/lint-pr-check-project-dir.cjs +0 -1
  305. package/scripts/lint-shell-command-projection-drift.cjs +1 -1
  306. package/scripts/lint-skill-deps.cjs +1 -1
  307. package/scripts/lint-test-file-count.allowlist.json +129 -32
  308. package/scripts/lint-test-file-count.cjs +85 -30
  309. package/scripts/mutation-matrix.cjs +219 -0
  310. package/scripts/prompt-injection-scan.sh +5 -1
  311. package/scripts/release-notes/format-github-release-notes.cjs +256 -0
  312. package/scripts/release-tarball-smoke.cjs +9 -9
  313. package/scripts/run-tests.cjs +11 -3
  314. package/scripts/strip-prose-atrefs.cjs +2 -2
  315. package/scripts/sync-runtime-launcher.cjs +2 -2
  316. package/scripts/verify-npm-publish.cjs +252 -0
  317. package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
  318. package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
  319. package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
  320. package/get-shit-done/bin/lib/artifacts.cjs +0 -53
  321. package/get-shit-done/bin/lib/audit.cjs +0 -755
  322. package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
  323. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
  324. package/get-shit-done/bin/lib/clock.cjs +0 -96
  325. package/get-shit-done/bin/lib/clusters.cjs +0 -135
  326. package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
  327. package/get-shit-done/bin/lib/command-aliases.cjs +0 -831
  328. package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
  329. package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
  330. package/get-shit-done/bin/lib/commands.cjs +0 -1292
  331. package/get-shit-done/bin/lib/config-schema.cjs +0 -31
  332. package/get-shit-done/bin/lib/config.cjs +0 -728
  333. package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
  334. package/get-shit-done/bin/lib/core.cjs +0 -2513
  335. package/get-shit-done/bin/lib/docs.cjs +0 -270
  336. package/get-shit-done/bin/lib/drift.cjs +0 -388
  337. package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
  338. package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
  339. package/get-shit-done/bin/lib/gap-checker.cjs +0 -254
  340. package/get-shit-done/bin/lib/graphify.cjs +0 -592
  341. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
  342. package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
  343. package/get-shit-done/bin/lib/init.cjs +0 -2112
  344. package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
  345. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
  346. package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -355
  347. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
  348. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
  349. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
  350. package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
  351. package/get-shit-done/bin/lib/intel.cjs +0 -708
  352. package/get-shit-done/bin/lib/learnings.cjs +0 -421
  353. package/get-shit-done/bin/lib/milestone.cjs +0 -372
  354. package/get-shit-done/bin/lib/model-catalog.cjs +0 -229
  355. package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
  356. package/get-shit-done/bin/lib/observability/event.cjs +0 -82
  357. package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
  358. package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
  359. package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -79
  360. package/get-shit-done/bin/lib/phase.cjs +0 -1607
  361. package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
  362. package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
  363. package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
  364. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  365. package/get-shit-done/bin/lib/project-root.cjs +0 -112
  366. package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
  367. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -126
  368. package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -162
  369. package/get-shit-done/bin/lib/roadmap-upgrade.cjs +0 -569
  370. package/get-shit-done/bin/lib/roadmap.cjs +0 -651
  371. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
  372. package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
  373. package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
  374. package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
  375. package/get-shit-done/bin/lib/secrets.cjs +0 -32
  376. package/get-shit-done/bin/lib/security.cjs +0 -600
  377. package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -535
  378. package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
  379. package/get-shit-done/bin/lib/state.cjs +0 -2073
  380. package/get-shit-done/bin/lib/surface.cjs +0 -470
  381. package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
  382. package/get-shit-done/bin/lib/template.cjs +0 -228
  383. package/get-shit-done/bin/lib/uat.cjs +0 -289
  384. package/get-shit-done/bin/lib/ui-safety-gate.cjs +0 -111
  385. package/get-shit-done/bin/lib/update-context.cjs +0 -209
  386. package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
  387. package/get-shit-done/bin/lib/validate.cjs +0 -118
  388. package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
  389. package/get-shit-done/bin/lib/verify.cjs +0 -1614
  390. package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
  391. package/get-shit-done/bin/lib/workstream.cjs +0 -389
  392. package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
  393. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
  394. package/scripts/lint-no-source-grep-extras.cjs +0 -81
  395. package/scripts/lint-no-source-grep.cjs +0 -174
  396. /package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +0 -0
  397. /package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +0 -0
  398. /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
  399. /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
  400. /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
  401. /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
  402. /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
  403. /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
  404. /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
  405. /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
  406. /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
  407. /package/{get-shit-done → gsd-core}/references/checkpoints.md +0 -0
  408. /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
  409. /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
  410. /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
  411. /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
  412. /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
  413. /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
  414. /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
  415. /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
  416. /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
  417. /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
  418. /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
  419. /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
  420. /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
  421. /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
  422. /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
  423. /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
  424. /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
  425. /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
  426. /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
  427. /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
  428. /package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +0 -0
  429. /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
  430. /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
  431. /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
  432. /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
  433. /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
  434. /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
  435. /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
  436. /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
  437. /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
  438. /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
  439. /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
  440. /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
  441. /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
  442. /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
  443. /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
  444. /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
  445. /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
  446. /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
  447. /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
  448. /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
  449. /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
  450. /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
  451. /package/{get-shit-done → gsd-core}/references/ui-brand.md +0 -0
  452. /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
  453. /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
  454. /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
  455. /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
  456. /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
  457. /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
  458. /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
  459. /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
  460. /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
  461. /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
  462. /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
  463. /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
  464. /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
  465. /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
  466. /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
  467. /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
  468. /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
  469. /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
  470. /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
  471. /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
  472. /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
  473. /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
  474. /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
  475. /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
  476. /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
  477. /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
  478. /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
  479. /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
  480. /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
  481. /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
  482. /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
  483. /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
  484. /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
  485. /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
  486. /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
  487. /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
  488. /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
  489. /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
  490. /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
  491. /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
  492. /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
  493. /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
  494. /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
  495. /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
  496. /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
  497. /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
  498. /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
  499. /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
  500. /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
  501. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
  502. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
  503. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
  504. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
  505. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
  506. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
  507. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
  508. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
  509. /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
  510. /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
  511. /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
  512. /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
  513. /package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +0 -0
  514. /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
  515. /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
  516. /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
  517. /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
  518. /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
  519. /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
  520. /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
  521. /package/{get-shit-done → gsd-core}/workflows/session-report.md +0 -0
@@ -0,0 +1,305 @@
1
+ "use strict";
2
+ /**
3
+ * prompt-budget.cts
4
+ *
5
+ * Pure functions for assembling and trimming review prompts to fit within
6
+ * a token budget (ADR-457 build-at-publish: the hand-written
7
+ * bin/lib/prompt-budget.cjs collapsed to a TypeScript source of truth).
8
+ * Behaviour is preserved byte-for-behaviour from the prior hand-written .cjs;
9
+ * only types are added.
10
+ *
11
+ * Used by the review pipeline to support small-context models.
12
+ *
13
+ * Trim priority (in order — never violate):
14
+ * 1. Instructions: ALWAYS kept verbatim
15
+ * 2. Reserve note tokens FIRST when any trim is anticipated
16
+ * 3. Roadmap: ALWAYS kept verbatim
17
+ * 4. PROJECT.md: head-shrink to projectMdHeadLines (default 40) if over budget
18
+ * 5. Plans: tail-truncate proportionally; never drop a whole plan
19
+ * 6. Context: DROP first if still over
20
+ * 7. Research: DROP second if still over
21
+ * 8. Requirements: DROP last (last-resort)
22
+ * 9. Hard-fail: if minimum-set exceeds effectiveBudget
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.estimateTokens = estimateTokens;
26
+ exports.applyBudget = applyBudget;
27
+ const NOTE_RESERVE_TOKENS = 80;
28
+ const DEFAULT_NOTE_TEMPLATE = [
29
+ '<note>',
30
+ 'Prompt automatically trimmed to fit a {budget}-token budget.',
31
+ 'Omitted sections: {omittedList}.',
32
+ 'Plan content truncated by approximately {planTruncationPct}%.',
33
+ 'Treat any missing context as out-of-scope rather than a review concern.',
34
+ '</note>',
35
+ ].join('\n');
36
+ /**
37
+ * Estimate tokens for a string. Chars / 4, rounded up.
38
+ */
39
+ function estimateTokens(text) {
40
+ if (!text)
41
+ return 0;
42
+ return Math.ceil(text.length / 4);
43
+ }
44
+ /**
45
+ * Render the trim-disclosure note.
46
+ */
47
+ function renderNote(template, budget, omitted, planTruncationPct) {
48
+ const omittedList = omitted.length > 0 ? omitted.join(', ') : 'none';
49
+ return template
50
+ .replace('{budget}', String(budget))
51
+ .replace('{omittedList}', omittedList)
52
+ .replace('{planTruncationPct}', String(Math.round(planTruncationPct)));
53
+ }
54
+ /**
55
+ * Head-shrink a string to at most `maxLines` lines.
56
+ */
57
+ function headShrink(text, maxLines) {
58
+ if (maxLines <= 0)
59
+ return '';
60
+ let idx = -1;
61
+ let seen = 0;
62
+ while (seen < maxLines) {
63
+ idx = text.indexOf('\n', idx + 1);
64
+ if (idx === -1)
65
+ return text;
66
+ seen += 1;
67
+ }
68
+ return text.slice(0, idx);
69
+ }
70
+ /**
71
+ * Tail-truncate a string to at most `maxChars` characters.
72
+ */
73
+ function tailTruncate(text, maxChars) {
74
+ if (text.length <= maxChars)
75
+ return text;
76
+ return text.slice(0, maxChars);
77
+ }
78
+ /**
79
+ * Assemble the final prompt string from its sections.
80
+ */
81
+ function assemblePrompt(parts) {
82
+ const { instructions, note, roadmap, projectMd, plans, context, research, requirements, } = parts;
83
+ const blocks = [];
84
+ blocks.push(instructions);
85
+ if (note)
86
+ blocks.push(note);
87
+ blocks.push('## Roadmap\n\n' + roadmap);
88
+ if (projectMd)
89
+ blocks.push('## Project\n\n' + projectMd);
90
+ const planBlocks = plans
91
+ .map((p) => '### ' + p.file + '\n\n' + p.content)
92
+ .join('\n\n');
93
+ blocks.push('## Plans\n\n' + planBlocks);
94
+ if (context)
95
+ blocks.push('## Context\n\n' + context);
96
+ if (research)
97
+ blocks.push('## Research\n\n' + research);
98
+ if (requirements)
99
+ blocks.push('## Requirements\n\n' + requirements);
100
+ return blocks.join('\n\n');
101
+ }
102
+ /**
103
+ * Apply a token budget to a set of review prompt sections.
104
+ * Returns the trimmed prompt and structured metadata.
105
+ */
106
+ function applyBudget({ sections, budget, options = {} }) {
107
+ const { safetyMarginPct = 10, noteTemplate = DEFAULT_NOTE_TEMPLATE, projectMdHeadLines = 40, } = options;
108
+ const effectiveBudget = Math.floor(budget * (1 - safetyMarginPct / 100));
109
+ const { instructions, roadmap, plans, projectMd: projectMdRaw = null, context: contextRaw = null, research: researchRaw = null, requirements: requirementsRaw = null, } = sections;
110
+ // Working mutable state
111
+ let projectMd = projectMdRaw;
112
+ let context = contextRaw;
113
+ let research = researchRaw;
114
+ let requirements = requirementsRaw;
115
+ let workingPlans = plans.map((p) => ({ file: p.file, content: p.content }));
116
+ const omitted = [];
117
+ let projectMdShrunk = false;
118
+ let planTruncationPct = 0;
119
+ let noteInjected = false;
120
+ let hardFailed = false;
121
+ // Minimum-set check: instructions + roadmap + 1KB per plan.
122
+ // NOTE_RESERVE_TOKENS is intentionally excluded here: a note is only injected
123
+ // when trimming actually occurs, and a prompt that fits without any trim needs
124
+ // no note at all. Including NOTE_RESERVE_TOKENS here would cause false hard-fails
125
+ // for prompts that genuinely fit the effective budget untrimmed.
126
+ const MIN_PLAN_BYTES = 1024;
127
+ const minPlanTokens = plans.reduce((sum, p) => {
128
+ return sum + estimateTokens(p.content.slice(0, MIN_PLAN_BYTES));
129
+ }, 0);
130
+ const minSet = estimateTokens(instructions) +
131
+ estimateTokens(roadmap) +
132
+ minPlanTokens;
133
+ if (minSet > effectiveBudget) {
134
+ return {
135
+ prompt: '',
136
+ metadata: {
137
+ budget,
138
+ effectiveBudget,
139
+ estimatedTokens: 0,
140
+ omitted: [],
141
+ projectMdShrunk: false,
142
+ planTruncationPct: 0,
143
+ hardFailed: true,
144
+ noteInjected: false,
145
+ },
146
+ };
147
+ }
148
+ // ── Budget accounting ──────────────────────────────────────────────────────
149
+ const TOKENS_ROADMAP_HEADER = estimateTokens('## Roadmap\n\n');
150
+ const TOKENS_PROJECT_HEADER = estimateTokens('## Project\n\n');
151
+ const TOKENS_PLANS_HEADER = estimateTokens('## Plans\n\n');
152
+ const TOKENS_CONTEXT_HEADER = estimateTokens('## Context\n\n');
153
+ const TOKENS_RESEARCH_HEADER = estimateTokens('## Research\n\n');
154
+ const TOKENS_REQUIREMENTS_HEADER = estimateTokens('## Requirements\n\n');
155
+ const TOKENS_PLAN_ITEM_HEADERS = workingPlans.reduce((sum, p) => sum + estimateTokens('### ' + p.file + '\n\n'), 0);
156
+ const staticBaseTokens = estimateTokens(instructions) +
157
+ TOKENS_ROADMAP_HEADER +
158
+ estimateTokens(roadmap) +
159
+ TOKENS_PLANS_HEADER +
160
+ TOKENS_PLAN_ITEM_HEADERS;
161
+ let projectTokens = projectMd
162
+ ? TOKENS_PROJECT_HEADER + estimateTokens(projectMd)
163
+ : 0;
164
+ let contextTokens = context
165
+ ? TOKENS_CONTEXT_HEADER + estimateTokens(context)
166
+ : 0;
167
+ let researchTokens = research
168
+ ? TOKENS_RESEARCH_HEADER + estimateTokens(research)
169
+ : 0;
170
+ let requirementsTokens = requirements
171
+ ? TOKENS_REQUIREMENTS_HEADER + estimateTokens(requirements)
172
+ : 0;
173
+ let planContentTokens = workingPlans.reduce((sum, p) => sum + estimateTokens(p.content), 0);
174
+ const getCurrentBaseTokens = () => staticBaseTokens +
175
+ projectTokens +
176
+ planContentTokens +
177
+ contextTokens +
178
+ researchTokens +
179
+ requirementsTokens;
180
+ let currentBaseTokens = getCurrentBaseTokens();
181
+ // Detect budget pressure: is ANY trim needed?
182
+ // Pressure exists when the current base tokens already exceed the effective
183
+ // budget. Only when pressure is real do we reserve NOTE_RESERVE_TOKENS so
184
+ // the note itself fits after trimming. Checking against
185
+ // effectiveBudget - NOTE_RESERVE_TOKENS (the old threshold) would cause
186
+ // spurious pressure 80 tokens early, dropping sections that fit fine.
187
+ const baseTokens = currentBaseTokens;
188
+ const budgetUnderPressure = baseTokens > effectiveBudget;
189
+ // Available for content (reserve note slot when under pressure)
190
+ const contentBudget = budgetUnderPressure
191
+ ? effectiveBudget - NOTE_RESERVE_TOKENS
192
+ : effectiveBudget;
193
+ // ── Trim step 1: head-shrink PROJECT.md ───────────────────────────────────
194
+ if (currentBaseTokens > contentBudget && projectMd) {
195
+ const shrunk = headShrink(projectMd, projectMdHeadLines);
196
+ if (shrunk !== projectMd) {
197
+ projectMd = shrunk;
198
+ projectMdShrunk = true;
199
+ projectTokens = TOKENS_PROJECT_HEADER + estimateTokens(projectMd);
200
+ currentBaseTokens = getCurrentBaseTokens();
201
+ }
202
+ }
203
+ // ── Trim step 2: proportional plan truncation ─────────────────────────────
204
+ if (currentBaseTokens > contentBudget) {
205
+ // Compute tokens available for plan content only
206
+ const overhead = staticBaseTokens +
207
+ projectTokens +
208
+ contextTokens +
209
+ researchTokens +
210
+ requirementsTokens;
211
+ const planBudgetTokens = contentBudget - overhead;
212
+ const totalPlanTokens = planContentTokens;
213
+ if (planBudgetTokens > 0 && planBudgetTokens < totalPlanTokens) {
214
+ // Proportional share per plan (at least 1KB per plan)
215
+ const totalOriginalChars = plans.reduce((sum, p) => sum + p.content.length, 0);
216
+ const totalPlanCharsBudget = planBudgetTokens * 4;
217
+ workingPlans = workingPlans.map((p) => {
218
+ const proportionalShare = totalOriginalChars > 0
219
+ ? Math.floor((p.content.length / totalOriginalChars) * totalPlanCharsBudget)
220
+ : 0;
221
+ const maxChars = Math.max(proportionalShare, MIN_PLAN_BYTES);
222
+ return { file: p.file, content: tailTruncate(p.content, maxChars) };
223
+ });
224
+ const newTotalChars = workingPlans.reduce((sum, p) => sum + p.content.length, 0);
225
+ if (totalOriginalChars > 0) {
226
+ planTruncationPct =
227
+ ((totalOriginalChars - newTotalChars) / totalOriginalChars) * 100;
228
+ }
229
+ planContentTokens = workingPlans.reduce((sum, p) => sum + estimateTokens(p.content), 0);
230
+ currentBaseTokens = getCurrentBaseTokens();
231
+ }
232
+ }
233
+ // ── Trim step 3: drop context ─────────────────────────────────────────────
234
+ if (currentBaseTokens > contentBudget && context) {
235
+ context = null;
236
+ omitted.push('context');
237
+ contextTokens = 0;
238
+ currentBaseTokens = getCurrentBaseTokens();
239
+ }
240
+ // ── Trim step 4: drop research ────────────────────────────────────────────
241
+ if (currentBaseTokens > contentBudget && research) {
242
+ research = null;
243
+ omitted.push('research');
244
+ researchTokens = 0;
245
+ currentBaseTokens = getCurrentBaseTokens();
246
+ }
247
+ // ── Trim step 5: drop requirements (last resort) ──────────────────────────
248
+ if (currentBaseTokens > contentBudget && requirements) {
249
+ requirements = null;
250
+ omitted.push('requirements');
251
+ requirementsTokens = 0;
252
+ currentBaseTokens = getCurrentBaseTokens();
253
+ }
254
+ // ── Decide whether note is actually needed ────────────────────────────────
255
+ const anyTrimOccurred = omitted.length > 0 || projectMdShrunk || planTruncationPct > 0;
256
+ let note = null;
257
+ if (anyTrimOccurred) {
258
+ note = renderNote(noteTemplate, budget, omitted, planTruncationPct);
259
+ noteInjected = true;
260
+ }
261
+ // Suppress unused variable warning — currentBaseTokens is used via the
262
+ // closure in getCurrentBaseTokens(); the final value is not used directly.
263
+ void currentBaseTokens;
264
+ // ── Assemble ──────────────────────────────────────────────────────────────
265
+ const prompt = assemblePrompt({
266
+ instructions,
267
+ note,
268
+ roadmap,
269
+ projectMd,
270
+ plans: workingPlans,
271
+ context,
272
+ research,
273
+ requirements,
274
+ });
275
+ const estimatedTokens = estimateTokens(prompt);
276
+ if (estimatedTokens > effectiveBudget) {
277
+ hardFailed = true;
278
+ return {
279
+ prompt: '',
280
+ metadata: {
281
+ budget,
282
+ effectiveBudget,
283
+ estimatedTokens,
284
+ omitted,
285
+ projectMdShrunk,
286
+ planTruncationPct,
287
+ hardFailed,
288
+ noteInjected,
289
+ },
290
+ };
291
+ }
292
+ return {
293
+ prompt,
294
+ metadata: {
295
+ budget,
296
+ effectiveBudget,
297
+ estimatedTokens,
298
+ omitted,
299
+ projectMdShrunk,
300
+ planTruncationPct,
301
+ hardFailed,
302
+ noteInjected,
303
+ },
304
+ };
305
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Review Reviewer Selection Module (ADR-457 build-at-publish: the hand-written
4
+ * bin/lib/review-reviewer-selection.cjs collapsed to a TypeScript source of
5
+ * truth). Behaviour is preserved byte-for-behaviour from the prior hand-written
6
+ * .cjs; only types are added.
7
+ *
8
+ * Owns reviewer-selection policy projection for /gsd:review:
9
+ * explicit flags > --all > review.default_reviewers > all detected.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.KNOWN_REVIEWER_SLUGS = void 0;
13
+ exports.normalizeConfiguredDefaultReviewers = normalizeConfiguredDefaultReviewers;
14
+ exports.resolveReviewerSelection = resolveReviewerSelection;
15
+ exports.KNOWN_REVIEWER_SLUGS = [
16
+ 'gemini',
17
+ 'claude',
18
+ 'codex',
19
+ 'coderabbit',
20
+ 'opencode',
21
+ 'qwen',
22
+ 'cursor',
23
+ 'antigravity',
24
+ 'ollama',
25
+ 'lm_studio',
26
+ 'llama_cpp',
27
+ ];
28
+ function normalizeConfiguredDefaultReviewers(rawValue) {
29
+ if (rawValue === undefined || rawValue === null) {
30
+ return { absent: true, values: [], errors: [] };
31
+ }
32
+ if (!Array.isArray(rawValue)) {
33
+ return {
34
+ absent: false,
35
+ values: [],
36
+ errors: ['review.default_reviewers must be a JSON array of reviewer slugs'],
37
+ };
38
+ }
39
+ if (rawValue.length === 0) {
40
+ return {
41
+ absent: false,
42
+ values: [],
43
+ errors: ['review.default_reviewers cannot be empty'],
44
+ };
45
+ }
46
+ const seen = new Set();
47
+ const normalized = [];
48
+ const errors = [];
49
+ for (const item of rawValue) {
50
+ if (typeof item !== 'string') {
51
+ errors.push('review.default_reviewers must contain only string slugs');
52
+ continue;
53
+ }
54
+ if (!/^[a-zA-Z0-9_-]+$/.test(item)) {
55
+ errors.push(`invalid reviewer slug in review.default_reviewers: ${item}`);
56
+ continue;
57
+ }
58
+ const slug = item.toLowerCase();
59
+ if (!seen.has(slug)) {
60
+ seen.add(slug);
61
+ normalized.push(slug);
62
+ }
63
+ }
64
+ return { absent: false, values: normalized, errors };
65
+ }
66
+ function resolveReviewerSelection(input) {
67
+ const detected = new Set((input.detected ?? []).map((v) => String(v).toLowerCase()));
68
+ const explicitFlags = new Set((input.explicitFlags ?? []).map((v) => String(v).toLowerCase()));
69
+ const allFlag = !!input.allFlag;
70
+ const normalizedDefaults = normalizeConfiguredDefaultReviewers(input.configuredDefaultReviewers);
71
+ const warnings = [];
72
+ const infos = [];
73
+ const errors = [...normalizedDefaults.errors];
74
+ let source = 'no_config_all_detected';
75
+ let selected = [];
76
+ if (explicitFlags.size > 0) {
77
+ source = 'explicit_flags';
78
+ selected = [...explicitFlags].filter((slug) => detected.has(slug));
79
+ const missing = [...explicitFlags].filter((slug) => !detected.has(slug));
80
+ if (missing.length > 0) {
81
+ infos.push(`explicit reviewers missing on host: ${missing.join(', ')}`);
82
+ }
83
+ if (selected.length === 0 && errors.length === 0) {
84
+ errors.push('no selected reviewers are available for explicit flags');
85
+ }
86
+ }
87
+ else if (allFlag) {
88
+ source = 'all_flag';
89
+ selected = [...detected];
90
+ }
91
+ else if (!normalizedDefaults.absent) {
92
+ source = 'config_default';
93
+ const knownDefaults = [];
94
+ for (const slug of normalizedDefaults.values) {
95
+ if (!exports.KNOWN_REVIEWER_SLUGS.includes(slug)) {
96
+ warnings.push(`unknown reviewer slug in review.default_reviewers: ${slug}`);
97
+ }
98
+ else {
99
+ knownDefaults.push(slug);
100
+ }
101
+ }
102
+ const undetected = knownDefaults.filter((slug) => !detected.has(slug));
103
+ if (undetected.length > 0) {
104
+ infos.push(`configured reviewers not detected on this host: ${undetected.join(', ')}`);
105
+ }
106
+ selected = knownDefaults.filter((slug) => detected.has(slug));
107
+ if (selected.length === 0 && errors.length === 0) {
108
+ errors.push('all configured default reviewers are unavailable on this host');
109
+ }
110
+ }
111
+ else {
112
+ selected = [...detected];
113
+ }
114
+ return {
115
+ source,
116
+ selected: selected.sort(),
117
+ warnings,
118
+ infos,
119
+ errors,
120
+ };
121
+ }
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ /**
3
+ * Manifest-backed roadmap subcommand router.
4
+ * Keeps gsd-tools.cjs thin while preserving existing command semantics.
5
+ *
6
+ * ADR-457 build-at-publish: the hand-written bin/lib/roadmap-command-router.cjs
7
+ * collapsed to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
8
+ * from the prior hand-written .cjs; only types are added.
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ const node_fs_1 = __importDefault(require("node:fs"));
14
+ const node_path_1 = __importDefault(require("node:path"));
15
+ const command_aliases_cjs_1 = require("./command-aliases.cjs");
16
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
17
+ const cjsCommandRouterAdapter = require("./cjs-command-router-adapter.cjs");
18
+ const { routeCjsCommandFamily } = cjsCommandRouterAdapter;
19
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
20
+ const roadmapUpgrade = require("./roadmap-upgrade.cjs");
21
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
22
+ const planningWorkspace = require("./planning-workspace.cjs");
23
+ const { planningDir } = planningWorkspace;
24
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
25
+ const core = require("./core.cjs");
26
+ const { loadConfig } = core;
27
+ // ─── W021 Implementation ──────────────────────────────────────────────────────
28
+ /**
29
+ * Check each phase entry in a milestone-prefixed ROADMAP.md for W021 violations.
30
+ *
31
+ * W021: a phase whose ID integer prefix does not match its enclosing milestone's
32
+ * major version number.
33
+ *
34
+ * Sentinel milestones (0 = pre-milestone, 999 = backlog) are exempt.
35
+ *
36
+ * @param content - ROADMAP.md content
37
+ * @returns Array of W021 warnings
38
+ */
39
+ function checkW021(content) {
40
+ const warnings = [];
41
+ // Sentinel milestone integers exempt from W021
42
+ const SENTINELS = new Set([0, 999]);
43
+ const MIGRATION_CMD = 'gsd-tools roadmap upgrade --convention milestone-prefixed';
44
+ // Milestone section heading: ## [GSD] v2.0 — Label OR ## v2.0: Label OR ## Roadmap v2.0
45
+ // OR ## ✅ v2.0 OR ## 🚧 v2.0 (emoji-prefixed variants used by roadmap templates)
46
+ // Capture the major integer.
47
+ const MILESTONE_RE = /^#{1,3}\s+(?:\[[^\]]+\]\s+|Roadmap\s+|[✅🚧]\s*)?v(\d+)\.\d+(?:\s|:|\s*—)/iu;
48
+ // Migrated phase heading: ### Phase M-NN: Name (M-NN or unpadded M-N form)
49
+ const PHASE_RE = /^#{2,4}\s*(?:\[[^\]]+\]\s*)?Phase\s+(\d+)-(\d+)(?:-\d+)*\s*:/i;
50
+ // Unprefixed legacy phase heading: ### Phase N: Name (no hyphen sub-index)
51
+ const UNPREFIXED_PHASE_RE = /^#{2,4}\s*(?:\[[^\]]+\]\s*)?Phase\s+(\d+[A-Za-z]?(?:\.\d+)*)\s*:/i;
52
+ let currentMilestoneMajor = null;
53
+ const lines = content.split('\n');
54
+ for (const line of lines) {
55
+ const milestoneMatch = line.match(MILESTONE_RE);
56
+ if (milestoneMatch) {
57
+ currentMilestoneMajor = parseInt(milestoneMatch[1], 10);
58
+ continue;
59
+ }
60
+ const phaseMatch = line.match(PHASE_RE);
61
+ if (phaseMatch) {
62
+ const phaseMajor = parseInt(phaseMatch[1], 10);
63
+ if (SENTINELS.has(phaseMajor))
64
+ continue; // exempt
65
+ if (currentMilestoneMajor !== null && phaseMajor !== currentMilestoneMajor) {
66
+ const phaseId = `${phaseMatch[1]}-${phaseMatch[2]}`;
67
+ warnings.push({
68
+ code: 'W021',
69
+ message: `Phase ID prefix mismatch: phase "${phaseId}" is listed under v${currentMilestoneMajor}.x ` +
70
+ `but its prefix (${phaseMajor}) does not match. ` +
71
+ `Run \`${MIGRATION_CMD}\` to fix.`,
72
+ });
73
+ }
74
+ continue;
75
+ }
76
+ // When the convention is active, an unprefixed heading (### Phase 1:) is itself a W021
77
+ // violation — it is missing the required M-NN prefix entirely.
78
+ const unprefixedMatch = line.match(UNPREFIXED_PHASE_RE);
79
+ if (unprefixedMatch && currentMilestoneMajor !== null) {
80
+ const rawId = unprefixedMatch[1];
81
+ // Skip if it matched PHASE_RE already (it didn't reach here in that case)
82
+ // Also skip if it looks like a bare integer whose prefix matches the section
83
+ // — those pass; only non-matching or non-prefixed forms fire W021.
84
+ const numericMajor = parseInt(rawId, 10);
85
+ if (!SENTINELS.has(numericMajor)) {
86
+ warnings.push({
87
+ code: 'W021',
88
+ message: `Phase ID "${rawId}" is not in M-NN form (milestone-prefixed convention is active). ` +
89
+ `Run \`${MIGRATION_CMD}\` to migrate.`,
90
+ });
91
+ }
92
+ }
93
+ }
94
+ return warnings;
95
+ }
96
+ // ─── Router ───────────────────────────────────────────────────────────────────
97
+ function routeRoadmapCommand({ roadmap, args, cwd, raw, error }) {
98
+ routeCjsCommandFamily({
99
+ args,
100
+ subcommands: command_aliases_cjs_1.ROADMAP_SUBCOMMANDS,
101
+ unsupported: {},
102
+ error,
103
+ unknownMessage: (_subcommand, available) => `Unknown roadmap subcommand. Available: ${available.join(', ')}`,
104
+ handlers: {
105
+ 'get-phase': () => roadmap.cmdRoadmapGetPhase(cwd, args[2], raw),
106
+ analyze: () => roadmap.cmdRoadmapAnalyze(cwd, raw),
107
+ 'update-plan-progress': () => roadmap.cmdRoadmapUpdatePlanProgress(cwd, args[2], raw),
108
+ 'annotate-dependencies': () => roadmap.cmdRoadmapAnnotateDependencies(cwd, args[2], raw),
109
+ 'validate': () => {
110
+ const roadmapPath = node_path_1.default.join(planningDir(cwd), 'ROADMAP.md');
111
+ let roadmapContent = '';
112
+ try {
113
+ roadmapContent = node_fs_1.default.readFileSync(roadmapPath, 'utf8');
114
+ }
115
+ catch {
116
+ // ROADMAP.md missing — return empty warnings
117
+ }
118
+ // W021 only fires when phase_id_convention is explicitly 'milestone-prefixed'.
119
+ // Authoritative source: .planning/config.json (set by the upgrade command).
120
+ // Fallback: ROADMAP.md frontmatter (for projects that set the field there directly).
121
+ let convention;
122
+ try {
123
+ const cfg = loadConfig(cwd);
124
+ convention = cfg['phase_id_convention'];
125
+ }
126
+ catch {
127
+ convention = undefined;
128
+ }
129
+ if (convention === undefined || convention === null) {
130
+ // Fallback: read from ROADMAP.md frontmatter
131
+ const fmMatch = roadmapContent.match(/^---\r?\n([\s\S]+?)\r?\n---/);
132
+ if (fmMatch) {
133
+ const kvMatch = fmMatch[1].match(/^phase_id_convention:\s*(.*)$/m);
134
+ if (kvMatch) {
135
+ const val = kvMatch[1].trim();
136
+ if (val !== 'null' && val !== '') {
137
+ convention = val.replace(/^["']|["']$/g, '');
138
+ }
139
+ }
140
+ }
141
+ }
142
+ const warnings = (convention === 'milestone-prefixed')
143
+ ? checkW021(roadmapContent)
144
+ : [];
145
+ const result = { warnings };
146
+ if (raw)
147
+ process.stdout.write(JSON.stringify(result));
148
+ else
149
+ process.stdout.write(JSON.stringify(result, null, 2));
150
+ },
151
+ 'upgrade': () => {
152
+ const dryRun = !args.includes('--apply');
153
+ const convention = args.find((_a, i) => args[i - 1] === '--convention') || 'milestone-prefixed';
154
+ if (convention !== 'milestone-prefixed') {
155
+ process.stderr.write('Only --convention milestone-prefixed is supported\n');
156
+ process.exit(1);
157
+ }
158
+ const plan = roadmapUpgrade.computeMigrationPlan(cwd);
159
+ roadmapUpgrade.applyMigration(cwd, plan, { dryRun });
160
+ },
161
+ },
162
+ });
163
+ }
164
+ module.exports = {
165
+ routeRoadmapCommand,
166
+ };