@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
@@ -0,0 +1,136 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @file allowlist-ratchet.cjs
5
+ *
6
+ * Reusable "better than a count ratchet" primitives for CI guards.
7
+ *
8
+ * ## Motivation (issue #597)
9
+ *
10
+ * A count ratchet (`assert(offenders.length <= N)`) has a masking blind spot:
11
+ * fixing one offender and introducing a new one keeps the count constant, so a
12
+ * novel defect slips through green. These helpers enforce on IDENTITY instead,
13
+ * making every individual offender visible and requiring monotonic progress
14
+ * toward zero.
15
+ *
16
+ * ## Design
17
+ *
18
+ * Both functions are pure (no I/O, no global state). The `fail` callback is
19
+ * injected by the caller so the same logic can be used with `node:assert.fail`,
20
+ * a custom throw, or a message-collector in unit tests.
21
+ */
22
+
23
+ /**
24
+ * Assert that `current` offenders are all within the known allowlist, and that
25
+ * every entry in the allowlist still offends (forcing the allowlist to shrink
26
+ * as defects are fixed).
27
+ *
28
+ * Fails when:
29
+ * - Any id in `current` is NOT in `known` → novel offender introduced.
30
+ * - Any id in `known` is NOT in `current` → stale allowlist entry must be
31
+ * pruned so the guard ratchets toward zero (the ratchet-DOWN direction).
32
+ *
33
+ * ## Masking blind spot this prevents (issue #597)
34
+ *
35
+ * A count ratchet (`assert(count <= N)`) allows one offender to be silently
36
+ * replaced by another while the count stays at N. By asserting on identity
37
+ * instead, every new offender is caught by name, and every fixed offender
38
+ * forces the allowlist to shrink.
39
+ *
40
+ * @param {object} opts
41
+ * @param {string} opts.label - Human-readable name for the guard (used
42
+ * in failure messages).
43
+ * @param {Iterable<string>} opts.current - The offending ids found in the
44
+ * current run.
45
+ * @param {Iterable<string>} opts.known - The allowlisted ids (baseline).
46
+ * @param {function(string): void} opts.fail - Callback invoked with a
47
+ * descriptive message on any violation.
48
+ * Pass `require('node:assert').fail`, a
49
+ * custom thrower, or a collector. The
50
+ * function is NOT imported here so callers
51
+ * control the failure mode.
52
+ * @param {string} [opts.pruneHint] - Optional hint appended to the stale-
53
+ * entry failure message (e.g. the name of
54
+ * the allowlist file to edit).
55
+ * @returns {{ novel: string[], stale: string[] }} Sorted arrays of novel ids
56
+ * (in current but not known) and stale ids (in known but not current).
57
+ */
58
+ function assertWithinAllowlist({ label, current, known, fail, pruneHint }) {
59
+ const currentSet = new Set(current);
60
+ const knownSet = new Set(known);
61
+
62
+ const novel = [...currentSet].filter((id) => !knownSet.has(id)).sort();
63
+ const stale = [...knownSet].filter((id) => !currentSet.has(id)).sort();
64
+
65
+ if (novel.length > 0) {
66
+ const list = novel.map((id) => ` - ${id}`).join('\n');
67
+ fail(
68
+ `[${label}] ${novel.length} NEW offender(s) introduced — fix at the source; do not just add to the allowlist.\n${list}`
69
+ );
70
+ }
71
+
72
+ if (stale.length > 0) {
73
+ const list = stale.map((id) => ` - ${id}`).join('\n');
74
+ const hint = pruneHint ? `\n(${pruneHint})` : '';
75
+ fail(
76
+ `[${label}] ${stale.length} allowlisted id(s) no longer offend and MUST be pruned so the guard ratchets toward zero.${hint}\n${list}`
77
+ );
78
+ }
79
+
80
+ return { novel, stale };
81
+ }
82
+
83
+ /**
84
+ * Assert that an artifact's measured maximum stays within a declared ceiling,
85
+ * and that the ceiling itself does not creep above the high-water mark (budgets
86
+ * may only decrease, not increase over time).
87
+ *
88
+ * Fails when:
89
+ * - `actualMax > ceiling` → regression: artifact exceeds budget.
90
+ * - `ceiling - actualMax > grace` → ceiling sits too far above the measured
91
+ * value; tighten it toward `actualMax`.
92
+ *
93
+ * ## Masking blind spot this prevents (issue #597)
94
+ *
95
+ * A plain `assert(size <= ceiling)` with a ceiling set generously high allows
96
+ * the artifact to grow unchecked as long as it stays under the ceiling. The
97
+ * `grace` band forces the ceiling to stay close to the high-water mark,
98
+ * ensuring that any upward creep is immediately visible.
99
+ *
100
+ * @param {object} opts
101
+ * @param {string} opts.label - Human-readable name for the guard (used
102
+ * in failure messages).
103
+ * @param {number} opts.actualMax - The measured value (e.g. bundle size in
104
+ * bytes, line count).
105
+ * @param {number} opts.ceiling - The declared budget ceiling.
106
+ * @param {number} opts.grace - Maximum allowed slack (`ceiling -
107
+ * actualMax`) before the ceiling is
108
+ * considered too loose.
109
+ * @param {function(string): void} opts.fail - Callback invoked with a
110
+ * descriptive message on any violation.
111
+ * @returns {{ ok: boolean, slack: number }} Whether both checks passed and the
112
+ * current slack value.
113
+ */
114
+ function assertTightCeiling({ label, actualMax, ceiling, grace, fail }) {
115
+ const slack = ceiling - actualMax;
116
+ let ok = true;
117
+
118
+ if (actualMax > ceiling) {
119
+ ok = false;
120
+ fail(
121
+ `[${label}] Regression: artifact value ${actualMax} exceeds budget ceiling ${ceiling}. ` +
122
+ `Raise the ceiling to at most ${actualMax} only if the increase is justified.`
123
+ );
124
+ } else if (slack > grace) {
125
+ ok = false;
126
+ fail(
127
+ `[${label}] Ceiling ${ceiling} sits too far above the high-water mark ${actualMax} ` +
128
+ `(slack ${slack} > grace ${grace}). Tighten the ceiling toward ${actualMax}. ` +
129
+ `Budgets may only decrease.`
130
+ );
131
+ }
132
+
133
+ return { ok, slack };
134
+ }
135
+
136
+ module.exports = { assertWithinAllowlist, assertTightCeiling };
@@ -20,7 +20,7 @@ const path = require('path');
20
20
 
21
21
  const ROOT = path.join(__dirname, '..');
22
22
  const COMMANDS_DIR = path.join(ROOT, 'commands', 'gsd');
23
- const GSD_ROOT = path.join(ROOT, 'get-shit-done');
23
+ const GSD_ROOT = path.join(ROOT, 'gsd-core');
24
24
 
25
25
  const {
26
26
  CANONICAL_TOOLS,
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * lint-legacy-dir-name.cjs
4
+ *
5
+ * Prevents accidental re-introduction of the bare legacy directory token
6
+ * `get-shit-done` now that the package has been renamed to `gsd-core` (#604).
7
+ *
8
+ * The forbidden token is constructed by splitting across the concat operator
9
+ * so this guard script cannot flag itself:
10
+ * const FORBIDDEN = 'get-shit' + '-done';
11
+ *
12
+ * Regex: FORBIDDEN + '(?!-\\w)' — allows any hyphenated slug variant
13
+ * (get-shit-done-OLD, get-shit-done-classic, get-shit-done-cli, etc.)
14
+ * while forbidding the bare word boundary that would indicate a stale
15
+ * directory reference. This is the exact pattern that would appear in a
16
+ * path like `~/.claude/get-shit-done/` or `'get-shit-done'` in code.
17
+ *
18
+ * Allowlist:
19
+ * - CHANGELOG.md (historical record; reviewed manually)
20
+ * - .changeset/ (ephemeral release-note fragments; consumed into CHANGELOG on
21
+ * release — like CHANGELOG, not swept by rename PRs)
22
+ * - Translated READMEs: README.ja-JP.md, README.ko-KR.md, README.pt-BR.md, README.zh-CN.md
23
+ * - Locale-specific docs dirs: docs/ja-JP/, docs/ko-KR/, docs/pt-BR/, docs/zh-CN/
24
+ * - Lines containing the marker `gsd-allow-legacy-name` (intentional uses)
25
+ * - Binary files (detected by NUL byte scan)
26
+ * - This guard script itself (by path)
27
+ *
28
+ * Exit 0 if no violations; exit 1 if any are found (with stderr diagnostics).
29
+ */
30
+
31
+ 'use strict';
32
+
33
+ const { execFileSync } = require('child_process');
34
+ const fs = require('fs');
35
+ const path = require('path');
36
+
37
+ // Constructed with split to avoid self-match when this script is scanned.
38
+ const FORBIDDEN = 'get-shit' + '-done';
39
+ const FORBIDDEN_RE = new RegExp(FORBIDDEN + '(?!-\\w)', 'gi');
40
+
41
+ const ALLOW_MARKER = 'gsd-allow-legacy-name';
42
+ const SELF_PATH = path.resolve(__filename);
43
+ // GSD_LINT_LEGACY_REPO_ROOT is used by tests to redirect the guard to a
44
+ // temporary fixture git repo without touching the real working tree.
45
+ const REPO_ROOT = process.env.GSD_LINT_LEGACY_REPO_ROOT
46
+ ? path.resolve(process.env.GSD_LINT_LEGACY_REPO_ROOT)
47
+ : path.resolve(__dirname, '..');
48
+
49
+ const ALLOWLIST_FILES = new Set([
50
+ 'CHANGELOG.md',
51
+ 'README.ja-JP.md',
52
+ 'README.ko-KR.md',
53
+ 'README.pt-BR.md',
54
+ 'README.zh-CN.md',
55
+ ]);
56
+
57
+ const ALLOWLIST_DIR_PREFIXES = [
58
+ // Pending changeset fragments are ephemeral release-note stubs consumed into
59
+ // CHANGELOG on release — like CHANGELOG itself, they should not be swept by
60
+ // rename PRs and may legitimately contain the legacy token in historical prose.
61
+ '.changeset/',
62
+ 'docs/ja-JP/',
63
+ 'docs/ko-KR/',
64
+ 'docs/pt-BR/',
65
+ 'docs/zh-CN/',
66
+ ];
67
+
68
+ function isAllowlisted(relPath) {
69
+ if (ALLOWLIST_FILES.has(relPath)) return true;
70
+ for (const prefix of ALLOWLIST_DIR_PREFIXES) {
71
+ if (relPath.startsWith(prefix)) return true;
72
+ }
73
+ return false;
74
+ }
75
+
76
+ function isBinary(fullPath) {
77
+ // Read a small chunk and check for NUL bytes.
78
+ let fd;
79
+ try {
80
+ fd = fs.openSync(fullPath, 'r');
81
+ const buf = Buffer.allocUnsafe(512);
82
+ const bytesRead = fs.readSync(fd, buf, 0, 512, 0);
83
+ return buf.subarray(0, bytesRead).includes(0);
84
+ } catch {
85
+ return false;
86
+ } finally {
87
+ if (fd != null) {
88
+ try { fs.closeSync(fd); } catch { /* best-effort */ }
89
+ }
90
+ }
91
+ }
92
+
93
+ // Enumerate tracked files via git ls-files so only committed/staged source is checked.
94
+ let trackedFiles;
95
+ try {
96
+ trackedFiles = execFileSync('git', ['ls-files'], { cwd: REPO_ROOT, encoding: 'utf8' })
97
+ .split('\n')
98
+ .map((f) => f.trim())
99
+ .filter(Boolean);
100
+ } catch (err) {
101
+ process.stderr.write('ERROR lint-legacy-dir-name: git ls-files failed: ' + err.message + '\n');
102
+ process.exit(1);
103
+ }
104
+
105
+ const violations = [];
106
+
107
+ for (const relPath of trackedFiles) {
108
+ if (isAllowlisted(relPath)) continue;
109
+
110
+ const fullPath = path.join(REPO_ROOT, relPath);
111
+
112
+ // Skip this guard script itself.
113
+ if (path.resolve(fullPath) === SELF_PATH) continue;
114
+
115
+ if (isBinary(fullPath)) continue;
116
+
117
+ let content;
118
+ try {
119
+ content = fs.readFileSync(fullPath, 'utf8');
120
+ } catch {
121
+ // Unreadable files (permissions, etc.) — skip silently.
122
+ continue;
123
+ }
124
+
125
+ const lines = content.split('\n');
126
+ for (let i = 0; i < lines.length; i++) {
127
+ const line = lines[i];
128
+ // Skip lines that carry the explicit allow marker.
129
+ if (line.includes(ALLOW_MARKER)) continue;
130
+
131
+ FORBIDDEN_RE.lastIndex = 0;
132
+ let match;
133
+ while ((match = FORBIDDEN_RE.exec(line)) !== null) {
134
+ violations.push({
135
+ file: relPath,
136
+ line: i + 1,
137
+ col: match.index + 1,
138
+ text: match[0],
139
+ });
140
+ }
141
+ }
142
+ }
143
+
144
+ if (violations.length === 0) {
145
+ process.stdout.write('ok lint-legacy-dir-name: ' + trackedFiles.length + ' tracked file(s) checked, 0 violations\n');
146
+ process.exit(0);
147
+ }
148
+
149
+ process.stderr.write('\nERROR lint-legacy-dir-name: ' + violations.length + ' violation(s) found\n\n');
150
+ for (const v of violations) {
151
+ process.stderr.write(' ' + v.file + ':' + v.line + ':' + v.col + ' — ' + JSON.stringify(v.text) + '\n');
152
+ }
153
+ process.stderr.write('\n');
154
+ process.stderr.write('Fix: rename to gsd-core, or add `gsd-allow-legacy-name` marker on the line if the\n');
155
+ process.stderr.write(' use is intentional (migration modules, tests, guard, changeset).\n\n');
156
+ process.exit(1);
@@ -4,7 +4,7 @@
4
4
  /**
5
5
  * Drift-guard lint for the Package Identity seam (issue #498).
6
6
  *
7
- * The seam (`get-shit-done/bin/lib/package-identity.cjs`, derived from
7
+ * The seam (`get-shit-done/bin/lib/package-identity.cjs`, derived from // gsd-allow-legacy-name
8
8
  * package.json) is the single source of GSD's published coordinates. Many
9
9
  * runtime surfaces still carry a literal copy of those coordinates because
10
10
  * they cannot `require()` the seam at runtime: the bash launcher snippet (and
@@ -19,7 +19,7 @@
19
19
  * literal is reported until updated. That is what turns a repoint into a
20
20
  * one-line change with mechanical enforcement.
21
21
  *
22
- * Scope: the runtime/code surface (bin/, hooks/, scripts/, get-shit-done/).
22
+ * Scope: the runtime/code surface (bin/, hooks/, scripts/, get-shit-done/). // gsd-allow-legacy-name
23
23
  * Pure-prose docs and localized READMEs are intentionally out of scope.
24
24
  */
25
25
 
@@ -27,11 +27,11 @@ const fs = require('node:fs');
27
27
  const path = require('node:path');
28
28
 
29
29
  // A GSD package coordinate: a scoped npm name whose package part contains
30
- // "get-shit-done" (so @opengsd/gsd-sdk and unrelated scopes never match).
31
- const PACKAGE_RE = /@[A-Za-z0-9._-]+\/[A-Za-z0-9._-]*get-shit-done[A-Za-z0-9._-]*/g;
30
+ // "get-shit-done" (so @opengsd/gsd-sdk and unrelated scopes never match). // gsd-allow-legacy-name
31
+ const PACKAGE_RE = /@[A-Za-z0-9._-]+\/[A-Za-z0-9._-]*get-shit-done[A-Za-z0-9._-]*/g; // gsd-allow-legacy-name
32
32
  // A GSD repo slug, only inside a GitHub URL context so it never overlaps the
33
33
  // scoped package literal above. The `.git` suffix is trimmed before compare.
34
- const SLUG_RE = /(?:github\.com[/:]|raw\.githubusercontent\.com\/)([A-Za-z0-9._-]+\/[A-Za-z0-9._-]*get-shit-done[A-Za-z0-9._-]*)/g;
34
+ const SLUG_RE = /(?:github\.com[/:]|raw\.githubusercontent\.com\/)([A-Za-z0-9._-]+\/[A-Za-z0-9._-]*get-shit-done[A-Za-z0-9._-]*)/g; // gsd-allow-legacy-name
35
35
 
36
36
  function lineOf(text, index) {
37
37
  let line = 1;
@@ -62,14 +62,14 @@ function findCoordinateDrift(text, { packageName, repoSlug }) {
62
62
  }
63
63
 
64
64
  // Directories scanned, relative to repo root.
65
- const SCAN_DIRS = ['bin', 'hooks', 'scripts', 'get-shit-done'];
65
+ const SCAN_DIRS = ['bin', 'hooks', 'scripts', 'gsd-core'];
66
66
  const SCAN_EXT = new Set(['.js', '.cjs', '.sh', '.md']);
67
67
  // Files exempt because they ARE the source of truth / the tooling that defines
68
68
  // the coordinate patterns. The generated seam holds the correct value by
69
69
  // construction; the generator and this lint carry regex/templates, not stray
70
70
  // literals.
71
71
  const EXEMPT = new Set([
72
- path.join('get-shit-done', 'bin', 'lib', 'package-identity.cjs'),
72
+ path.join('gsd-core', 'bin', 'lib', 'package-identity.cjs'),
73
73
  path.join('scripts', 'generate-package-identity.cjs'),
74
74
  path.join('scripts', 'lint-package-identity-drift.cjs'),
75
75
  ]);
@@ -98,7 +98,7 @@ function walk(dir, acc) {
98
98
  * annotated with the repo-relative file path.
99
99
  */
100
100
  function scanRepo(root) {
101
- const seam = require(path.join(root, 'get-shit-done', 'bin', 'lib', 'package-identity.cjs'));
101
+ const seam = require(path.join(root, 'gsd-core', 'bin', 'lib', 'package-identity.cjs'));
102
102
  const expected = { packageName: seam.packageName, repoSlug: seam.repoSlug };
103
103
  const violations = [];
104
104
  for (const dir of SCAN_DIRS) {
@@ -10,7 +10,6 @@ const DEFAULT_RELATIVE_FILES = [
10
10
  '.github/workflows/test.yml',
11
11
  '.github/workflows/pr-template-format.yml',
12
12
  '.github/workflows/changeset-required.yml',
13
- 'scripts/lint-no-source-grep.cjs',
14
13
  'scripts/lint-command-contract.cjs',
15
14
  'scripts/lint-skill-deps.cjs',
16
15
  'scripts/lint-descriptions.cjs',
@@ -52,6 +52,6 @@ process.stderr.write(`ERROR shell-projection-drift: inline serialized shim build
52
52
  for (const match of matches) {
53
53
  process.stderr.write(` - ${match.label}\n`);
54
54
  }
55
- process.stderr.write('Route shim/wrapper rendering through get-shit-done/bin/lib/shell-command-projection.cjs\n');
55
+ process.stderr.write('Route shim/wrapper rendering through gsd-core/bin/lib/shell-command-projection.cjs\n');
56
56
  process.stderr.write('Safe subprocess execution via spawnSync/execFileSync is intentionally allowed.\n');
57
57
  process.exit(1);
@@ -26,7 +26,7 @@
26
26
  const fs = require('fs');
27
27
  const path = require('path');
28
28
 
29
- const PROFILES_MODULE = path.join(__dirname, '..', 'get-shit-done', 'bin', 'lib', 'install-profiles.cjs');
29
+ const PROFILES_MODULE = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'install-profiles.cjs');
30
30
  const { PROFILES, loadSkillsManifest, resolveProfile } = require(PROFILES_MODULE);
31
31
 
32
32
  // ---------------------------------------------------------------------------
@@ -1,36 +1,133 @@
1
1
  {
2
- "_doc": "Baseline of modules currently exceeding the 2-test-file limit. Each entry locks in TODAY's count as the ceiling. Reductions are ratcheted automatically — when a cluster drops to ≤ 2, remove its entry. New entries require justification in PR description.",
2
+ "_doc": "Baseline of modules currently exceeding the 2-test-file limit. Each entry locks in TODAY's exact test filenames as the allowlisted set (identity ratchet). Adding a NEW test file to a capped module fails (novel). Removing one requires pruning this list (stale, ratchet-down). When a cluster drops to ≤ 2, remove its entry entirely. New entries require justification in PR description.",
3
3
  "modules": {
4
- "phase": { "current": 5, "issue": "3788" },
5
- "worktree": { "current": 13, "issue": "TBD" },
6
- "milestone": { "current": 10, "issue": "TBD" },
7
- "roadmap": { "current": 9, "issue": "TBD" },
8
- "verify": { "current": 10, "issue": "3767" },
9
- "install": { "current": 9, "issue": "TBD" },
10
- "init": { "current": 8, "issue": "TBD" },
11
- "state": { "current": 11, "issue": "180" },
12
- "config": { "current": 8, "issue": "TBD" },
13
- "graphify": { "current": 7, "issue": "TBD" },
14
- "progress": { "current": 6, "issue": "14" },
15
- "cli": { "current": 5, "issue": "TBD" },
16
- "surface": { "current": 5, "issue": "TBD" },
17
- "commit": { "current": 4, "issue": "TBD" },
18
- "frontmatter": { "current": 4, "issue": "TBD" },
19
- "index": { "current": 5, "issue": "180" },
20
- "intel": { "current": 4, "issue": "TBD" },
21
- "mvp": { "current": 4, "issue": "TBD" },
22
- "install-profiles": { "current": 4, "issue": "TBD" },
23
- "audit": { "current": 4, "issue": "192" },
24
- "audit-open": { "current": 3, "issue": "TBD" },
25
- "config-schema": { "current": 3, "issue": "TBD" },
26
- "profile": { "current": 3, "issue": "TBD" },
27
- "prompt-budget": { "current": 3, "issue": "TBD" },
28
- "uat": { "current": 3, "issue": "TBD" },
29
- "validate": { "current": 3, "issue": "TBD" },
30
- "workstream": { "current": 3, "issue": "TBD" },
31
- "gsd-tools": { "current": 3, "issue": "TBD" },
32
- "runtime-artifact-layout":{ "current": 3, "issue": "TBD" },
33
- "security": { "current": 3, "issue": "TBD" },
34
- "gsd-sdk": { "current": 3, "issue": "TBD" }
4
+ "audit": {
5
+ "files": [
6
+ "audit-fix-command.test.cjs",
7
+ "bug-2659-audit-open-crash.test.cjs",
8
+ "bug-2836-audit-open-summary-uat-drift.test.cjs",
9
+ "bug-2911-audit-open-output-shape.test.cjs"
10
+ ],
11
+ "issue": "192"
12
+ },
13
+ "config": {
14
+ "files": [
15
+ "bug-2943-config-get-context-window-default.test.cjs",
16
+ "bug-321-config-defaults-clone-strategy.test.cjs",
17
+ "bug-3227-config-set-model-overrides.test.cjs",
18
+ "bug-442-config-dir-equals-in-path.test.cjs",
19
+ "config-field-docs.test.cjs",
20
+ "config-get-default.test.cjs",
21
+ "config-schema.property.test.cjs",
22
+ "config.test.cjs"
23
+ ],
24
+ "issue": "TBD"
25
+ },
26
+ "graphify": {
27
+ "files": [
28
+ "bug-622-graphify-optional-graph-html.test.cjs",
29
+ "graphify-auto-update.test.cjs",
30
+ "graphify-query.test.cjs",
31
+ "graphify-visualization.test.cjs",
32
+ "graphify.test.cjs"
33
+ ],
34
+ "issue": "622"
35
+ },
36
+ "intel": {
37
+ "files": [
38
+ "bug-2351-intel-kilo-layout.test.cjs",
39
+ "bug-3290-intel-updater-layout-block.test.cjs",
40
+ "intel.test.cjs"
41
+ ],
42
+ "issue": "TBD"
43
+ },
44
+ "milestone": {
45
+ "files": [
46
+ "milestone-archive.test.cjs",
47
+ "milestone-helper.test.cjs",
48
+ "milestone-prefixed-convention.test.cjs",
49
+ "milestone-summary.test.cjs",
50
+ "milestone.test.cjs"
51
+ ],
52
+ "issue": "TBD"
53
+ },
54
+ "phase": {
55
+ "files": [
56
+ "bug-214-phase-researcher-write-truncation-contract.test.cjs",
57
+ "phase-dependency-levels.test.cjs",
58
+ "phase.test.cjs"
59
+ ],
60
+ "issue": "597"
61
+ },
62
+ "roadmap": {
63
+ "files": [
64
+ "bug-2661-roadmap-sync-parallel.test.cjs",
65
+ "bug-3128-roadmap-plan-count-slug-layout.test.cjs",
66
+ "bug-3599-roadmap-get-phase-project-code-prefix.test.cjs",
67
+ "enh-2447-roadmap-wave-deps.test.cjs",
68
+ "roadmap-mode-field.test.cjs",
69
+ "roadmap-phase-fallback.test.cjs",
70
+ "roadmap.test.cjs"
71
+ ],
72
+ "issue": "TBD"
73
+ },
74
+ "runtime-artifact-layout": {
75
+ "files": [
76
+ "runtime-artifact-layout-install-profiles.test.cjs",
77
+ "runtime-artifact-layout-surface.test.cjs",
78
+ "runtime-artifact-layout.test.cjs"
79
+ ],
80
+ "issue": "TBD"
81
+ },
82
+ "security": {
83
+ "files": [
84
+ "security-prompt-injection.test.cjs",
85
+ "security-scan.test.cjs",
86
+ "security.test.cjs"
87
+ ],
88
+ "issue": "TBD"
89
+ },
90
+ "state": {
91
+ "files": [
92
+ "bug-21-state-md-template-frontmatter.test.cjs",
93
+ "bug-2630-state-frontmatter-milestone-switch.test.cjs",
94
+ "bug-3127-state-begin-phase-idempotent.test.cjs",
95
+ "bug-3242-state-update-progress-trample.test.cjs",
96
+ "bug-3286-state-write-routing.test.cjs",
97
+ "bug-3454-state-dollar-backreference-growth.test.cjs",
98
+ "bug-397-state-preserve-executor-authored.test.cjs",
99
+ "state-acquirestatelock-non-eexist.test.cjs",
100
+ "state-prune.test.cjs",
101
+ "state.test.cjs"
102
+ ],
103
+ "issue": "180"
104
+ },
105
+ "verify": {
106
+ "files": [
107
+ "bug-2969-verify-reapply-patches.test.cjs",
108
+ "bug-2994-verify-reapply-patches-installed-path.test.cjs",
109
+ "bug-3381-verify-work-workstream.test.cjs",
110
+ "bug-3657-verify-reapply-patches-pristine-drift.test.cjs",
111
+ "verify-health.test.cjs",
112
+ "verify-mvp-uat.test.cjs",
113
+ "verify-npm-publish.test.cjs",
114
+ "verify-test-quality.test.cjs",
115
+ "verify-work-auto-transition.test.cjs",
116
+ "verify.test.cjs"
117
+ ],
118
+ "issue": "3767"
119
+ },
120
+ "install": {
121
+ "files": [
122
+ "bug-410-install-defaults-test-mode-guard.test.cjs",
123
+ "install-minimal-hooks.test.cjs",
124
+ "install-path-detection.test.cjs",
125
+ "install-regressions.test.cjs",
126
+ "install-runtime-artifacts.test.cjs",
127
+ "install-update-marker.test.cjs",
128
+ "install.test.cjs"
129
+ ],
130
+ "issue": "TBD"
131
+ }
35
132
  }
36
133
  }