@opengsd/gsd-core 1.2.0 → 1.3.0

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