@opengsd/gsd-core 1.3.0-rc.1 → 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 (521) hide show
  1. package/README.ja-JP.md +44 -790
  2. package/README.ko-KR.md +41 -778
  3. package/README.md +39 -180
  4. package/README.pt-BR.md +45 -413
  5. package/README.zh-CN.md +43 -761
  6. package/agents/gsd-ai-researcher.md +1 -1
  7. package/agents/gsd-debugger.md +8 -8
  8. package/agents/gsd-domain-researcher.md +14 -1
  9. package/agents/gsd-eval-auditor.md +1 -1
  10. package/agents/gsd-eval-planner.md +1 -1
  11. package/agents/gsd-executor.md +21 -8
  12. package/agents/gsd-framework-selector.md +1 -1
  13. package/agents/gsd-intel-updater.md +4 -4
  14. package/agents/gsd-phase-researcher.md +18 -5
  15. package/agents/gsd-plan-checker.md +3 -3
  16. package/agents/gsd-planner.md +36 -23
  17. package/agents/gsd-project-researcher.md +13 -0
  18. package/agents/gsd-research-synthesizer.md +6 -2
  19. package/agents/gsd-roadmapper.md +6 -6
  20. package/agents/gsd-ui-researcher.md +15 -2
  21. package/agents/gsd-user-profiler.md +2 -2
  22. package/agents/gsd-verifier.md +7 -7
  23. package/bin/install.js +169 -59
  24. package/commands/gsd/add-tests.md +1 -1
  25. package/commands/gsd/ai-integration-phase.md +3 -3
  26. package/commands/gsd/audit-fix.md +1 -1
  27. package/commands/gsd/audit-milestone.md +1 -1
  28. package/commands/gsd/audit-uat.md +1 -1
  29. package/commands/gsd/autonomous.md +2 -2
  30. package/commands/gsd/capture.md +6 -6
  31. package/commands/gsd/cleanup.md +1 -1
  32. package/commands/gsd/code-review.md +1 -1
  33. package/commands/gsd/complete-milestone.md +2 -2
  34. package/commands/gsd/config.md +3 -3
  35. package/commands/gsd/debug.md +1 -1
  36. package/commands/gsd/discuss-phase.md +5 -4
  37. package/commands/gsd/docs-update.md +1 -1
  38. package/commands/gsd/eval-review.md +2 -2
  39. package/commands/gsd/execute-phase.md +2 -2
  40. package/commands/gsd/explore.md +1 -1
  41. package/commands/gsd/extract-learnings.md +2 -2
  42. package/commands/gsd/fast.md +1 -1
  43. package/commands/gsd/forensics.md +1 -1
  44. package/commands/gsd/graphify.md +9 -9
  45. package/commands/gsd/health.md +1 -1
  46. package/commands/gsd/help.md +2 -2
  47. package/commands/gsd/import.md +5 -5
  48. package/commands/gsd/inbox.md +1 -1
  49. package/commands/gsd/ingest-docs.md +4 -4
  50. package/commands/gsd/manager.md +3 -3
  51. package/commands/gsd/map-codebase.md +1 -1
  52. package/commands/gsd/milestone-summary.md +1 -1
  53. package/commands/gsd/mvp-phase.md +4 -4
  54. package/commands/gsd/new-milestone.md +5 -5
  55. package/commands/gsd/new-project.md +5 -5
  56. package/commands/gsd/pause-work.md +2 -2
  57. package/commands/gsd/phase.md +4 -4
  58. package/commands/gsd/plan-phase.md +2 -2
  59. package/commands/gsd/plan-review-convergence.md +4 -4
  60. package/commands/gsd/pr-branch.md +1 -1
  61. package/commands/gsd/profile-user.md +2 -2
  62. package/commands/gsd/progress.md +4 -4
  63. package/commands/gsd/quick.md +1 -1
  64. package/commands/gsd/resume-work.md +1 -1
  65. package/commands/gsd/review.md +1 -1
  66. package/commands/gsd/secure-phase.md +1 -1
  67. package/commands/gsd/settings.md +1 -1
  68. package/commands/gsd/ship.md +2 -2
  69. package/commands/gsd/sketch.md +7 -7
  70. package/commands/gsd/spec-phase.md +2 -2
  71. package/commands/gsd/spike.md +3 -3
  72. package/commands/gsd/stats.md +1 -1
  73. package/commands/gsd/surface.md +4 -4
  74. package/commands/gsd/thread.md +1 -1
  75. package/commands/gsd/ui-phase.md +2 -2
  76. package/commands/gsd/ui-review.md +2 -2
  77. package/commands/gsd/ultraplan-phase.md +2 -2
  78. package/commands/gsd/undo.md +3 -3
  79. package/commands/gsd/update.md +3 -3
  80. package/commands/gsd/validate-phase.md +1 -1
  81. package/commands/gsd/verify-work.md +2 -2
  82. package/commands/gsd/workspace.md +4 -4
  83. package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
  84. package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +13 -3
  85. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  86. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  87. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  88. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  89. package/gsd-core/bin/lib/audit.cjs +743 -0
  90. package/gsd-core/bin/lib/check-command-router.cjs +342 -0
  91. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  92. package/gsd-core/bin/lib/clock.cjs +95 -0
  93. package/gsd-core/bin/lib/clusters.cjs +128 -0
  94. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  95. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  96. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  97. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  98. package/gsd-core/bin/lib/commands.cjs +1202 -0
  99. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  100. package/{get-shit-done → gsd-core}/bin/lib/config-types.cjs +1 -1
  101. package/gsd-core/bin/lib/config.cjs +714 -0
  102. package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
  103. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  104. package/gsd-core/bin/lib/core.cjs +2007 -0
  105. package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
  106. package/gsd-core/bin/lib/docs.cjs +252 -0
  107. package/gsd-core/bin/lib/drift.cjs +364 -0
  108. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  109. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  110. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  111. package/gsd-core/bin/lib/graphify.cjs +496 -0
  112. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  113. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  114. package/gsd-core/bin/lib/init.cjs +1799 -0
  115. package/gsd-core/bin/lib/install-profiles.cjs +526 -0
  116. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  117. package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
  118. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  119. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  120. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  121. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  122. package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
  123. package/gsd-core/bin/lib/intel.cjs +607 -0
  124. package/gsd-core/bin/lib/learnings.cjs +270 -0
  125. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  126. package/gsd-core/bin/lib/milestone.cjs +373 -0
  127. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  128. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  129. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  130. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  131. package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
  132. package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
  133. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  134. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  135. package/gsd-core/bin/lib/phase.cjs +1307 -0
  136. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  137. package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
  138. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  139. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  140. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  141. package/gsd-core/bin/lib/project-root.cjs +119 -0
  142. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  143. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  144. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  145. package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
  146. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  147. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
  148. package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
  149. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  150. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  151. package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
  152. package/gsd-core/bin/lib/secrets.cjs +34 -0
  153. package/gsd-core/bin/lib/security.cjs +407 -0
  154. package/{get-shit-done → gsd-core}/bin/lib/semver-compare.cjs +1 -1
  155. package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
  156. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  157. package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -78
  158. package/gsd-core/bin/lib/state.cjs +2010 -0
  159. package/gsd-core/bin/lib/surface.cjs +406 -0
  160. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  161. package/gsd-core/bin/lib/template.cjs +237 -0
  162. package/gsd-core/bin/lib/uat.cjs +297 -0
  163. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  164. package/gsd-core/bin/lib/update-context.cjs +218 -0
  165. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  166. package/gsd-core/bin/lib/validate.cjs +112 -0
  167. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  168. package/gsd-core/bin/lib/verify.cjs +1451 -0
  169. package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
  170. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  171. package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
  172. package/gsd-core/bin/lib/workstream.cjs +380 -0
  173. package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
  174. package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +5 -0
  175. package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
  176. package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
  177. package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
  178. package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
  179. package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
  180. package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
  181. package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
  182. package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
  183. package/gsd-core/references/worktree-branch-check.md +38 -0
  184. package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
  185. package/{get-shit-done → gsd-core}/templates/README.md +2 -2
  186. package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
  187. package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
  188. package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
  189. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  190. package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
  191. package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
  192. package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
  193. package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
  194. package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
  195. package/{get-shit-done → gsd-core}/workflows/audit-fix.md +1 -1
  196. package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +1 -1
  197. package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
  198. package/{get-shit-done → gsd-core}/workflows/autonomous.md +4 -4
  199. package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
  200. package/{get-shit-done → gsd-core}/workflows/cleanup.md +1 -1
  201. package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +1 -1
  202. package/{get-shit-done → gsd-core}/workflows/code-review.md +4 -4
  203. package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
  204. package/{get-shit-done → gsd-core}/workflows/debug.md +1 -1
  205. package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +4 -2
  206. package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
  207. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +4 -4
  208. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
  209. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
  210. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
  211. package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +2 -2
  212. package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
  213. package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
  214. package/{get-shit-done → gsd-core}/workflows/docs-update.md +1 -1
  215. package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
  216. package/{get-shit-done → gsd-core}/workflows/eval-review.md +2 -2
  217. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +15 -2
  218. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  219. package/{get-shit-done → gsd-core}/workflows/execute-phase.md +68 -46
  220. package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
  221. package/{get-shit-done → gsd-core}/workflows/explore.md +3 -3
  222. package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
  223. package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
  224. package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
  225. package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
  226. package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +1 -1
  227. package/{get-shit-done → gsd-core}/workflows/import.md +1 -1
  228. package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +3 -3
  229. package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
  230. package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
  231. package/{get-shit-done → gsd-core}/workflows/manager.md +1 -1
  232. package/{get-shit-done → gsd-core}/workflows/map-codebase.md +1 -1
  233. package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
  234. package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
  235. package/{get-shit-done → gsd-core}/workflows/new-milestone.md +3 -3
  236. package/{get-shit-done → gsd-core}/workflows/new-project.md +6 -6
  237. package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
  238. package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
  239. package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
  240. package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
  241. package/{get-shit-done → gsd-core}/workflows/plan-phase.md +15 -15
  242. package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +7 -7
  243. package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
  244. package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
  245. package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
  246. package/{get-shit-done → gsd-core}/workflows/quick.md +2 -26
  247. package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
  248. package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
  249. package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
  250. package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
  251. package/{get-shit-done → gsd-core}/workflows/review.md +1 -1
  252. package/{get-shit-done → gsd-core}/workflows/scan.md +1 -1
  253. package/{get-shit-done → gsd-core}/workflows/secure-phase.md +3 -3
  254. package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +1 -1
  255. package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
  256. package/{get-shit-done → gsd-core}/workflows/settings.md +1 -1
  257. package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
  258. package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
  259. package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
  260. package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
  261. package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
  262. package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
  263. package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
  264. package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
  265. package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
  266. package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
  267. package/{get-shit-done → gsd-core}/workflows/ui-phase.md +3 -3
  268. package/{get-shit-done → gsd-core}/workflows/ui-review.md +2 -2
  269. package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
  270. package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
  271. package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
  272. package/{get-shit-done → gsd-core}/workflows/validate-phase.md +3 -3
  273. package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
  274. package/{get-shit-done → gsd-core}/workflows/verify-work.md +5 -5
  275. package/hooks/dist/gsd-check-update-worker.js +16 -3
  276. package/hooks/dist/gsd-check-update.js +7 -5
  277. package/hooks/dist/gsd-context-monitor.js +2 -2
  278. package/hooks/dist/gsd-statusline.js +39 -21
  279. package/hooks/dist/gsd-update-banner.js +6 -2
  280. package/hooks/dist/managed-hooks-registry.cjs +35 -0
  281. package/hooks/gsd-check-update-worker.js +16 -3
  282. package/hooks/gsd-check-update.js +7 -5
  283. package/hooks/gsd-context-monitor.js +2 -2
  284. package/hooks/gsd-statusline.js +39 -21
  285. package/hooks/gsd-update-banner.js +6 -2
  286. package/package.json +9 -6
  287. package/scripts/affected-tests-lib.cjs +1 -1
  288. package/scripts/base64-scan.sh +12 -0
  289. package/scripts/build-hooks.js +4 -1
  290. package/scripts/changeset/cli.cjs +2 -2
  291. package/scripts/changeset/github-release-notes.cjs +1 -1
  292. package/scripts/changeset/lint.cjs +1 -1
  293. package/scripts/check-alias-drift.cjs +8 -8
  294. package/scripts/check-env.cjs +5 -1
  295. package/scripts/ci-test-scope.cjs +25 -10
  296. package/scripts/command-contract-helpers.cjs +1 -1
  297. package/scripts/fix-slash-commands.cjs +5 -5
  298. package/scripts/gen-inventory-manifest.cjs +3 -3
  299. package/scripts/generate-package-identity.cjs +28 -7
  300. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  301. package/scripts/lint-command-contract.cjs +1 -1
  302. package/scripts/lint-legacy-dir-name.cjs +156 -0
  303. package/scripts/lint-package-identity-drift.cjs +8 -8
  304. package/scripts/lint-pr-check-project-dir.cjs +0 -1
  305. package/scripts/lint-shell-command-projection-drift.cjs +1 -1
  306. package/scripts/lint-skill-deps.cjs +1 -1
  307. package/scripts/lint-test-file-count.allowlist.json +129 -32
  308. package/scripts/lint-test-file-count.cjs +85 -30
  309. package/scripts/mutation-matrix.cjs +219 -0
  310. package/scripts/prompt-injection-scan.sh +5 -1
  311. package/scripts/release-notes/format-github-release-notes.cjs +256 -0
  312. package/scripts/release-tarball-smoke.cjs +9 -9
  313. package/scripts/run-tests.cjs +11 -3
  314. package/scripts/strip-prose-atrefs.cjs +2 -2
  315. package/scripts/sync-runtime-launcher.cjs +2 -2
  316. package/scripts/verify-npm-publish.cjs +252 -0
  317. package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
  318. package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
  319. package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
  320. package/get-shit-done/bin/lib/artifacts.cjs +0 -53
  321. package/get-shit-done/bin/lib/audit.cjs +0 -755
  322. package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
  323. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
  324. package/get-shit-done/bin/lib/clock.cjs +0 -96
  325. package/get-shit-done/bin/lib/clusters.cjs +0 -135
  326. package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
  327. package/get-shit-done/bin/lib/command-aliases.cjs +0 -831
  328. package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
  329. package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
  330. package/get-shit-done/bin/lib/commands.cjs +0 -1292
  331. package/get-shit-done/bin/lib/config-schema.cjs +0 -31
  332. package/get-shit-done/bin/lib/config.cjs +0 -728
  333. package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
  334. package/get-shit-done/bin/lib/core.cjs +0 -2513
  335. package/get-shit-done/bin/lib/docs.cjs +0 -270
  336. package/get-shit-done/bin/lib/drift.cjs +0 -388
  337. package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
  338. package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
  339. package/get-shit-done/bin/lib/gap-checker.cjs +0 -254
  340. package/get-shit-done/bin/lib/graphify.cjs +0 -592
  341. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
  342. package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
  343. package/get-shit-done/bin/lib/init.cjs +0 -2112
  344. package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
  345. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
  346. package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -355
  347. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
  348. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
  349. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
  350. package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
  351. package/get-shit-done/bin/lib/intel.cjs +0 -708
  352. package/get-shit-done/bin/lib/learnings.cjs +0 -421
  353. package/get-shit-done/bin/lib/milestone.cjs +0 -372
  354. package/get-shit-done/bin/lib/model-catalog.cjs +0 -229
  355. package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
  356. package/get-shit-done/bin/lib/observability/event.cjs +0 -82
  357. package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
  358. package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
  359. package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -79
  360. package/get-shit-done/bin/lib/phase.cjs +0 -1607
  361. package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
  362. package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
  363. package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
  364. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  365. package/get-shit-done/bin/lib/project-root.cjs +0 -112
  366. package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
  367. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -126
  368. package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -162
  369. package/get-shit-done/bin/lib/roadmap-upgrade.cjs +0 -569
  370. package/get-shit-done/bin/lib/roadmap.cjs +0 -651
  371. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
  372. package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
  373. package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
  374. package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
  375. package/get-shit-done/bin/lib/secrets.cjs +0 -32
  376. package/get-shit-done/bin/lib/security.cjs +0 -600
  377. package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -535
  378. package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
  379. package/get-shit-done/bin/lib/state.cjs +0 -2073
  380. package/get-shit-done/bin/lib/surface.cjs +0 -470
  381. package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
  382. package/get-shit-done/bin/lib/template.cjs +0 -228
  383. package/get-shit-done/bin/lib/uat.cjs +0 -289
  384. package/get-shit-done/bin/lib/ui-safety-gate.cjs +0 -111
  385. package/get-shit-done/bin/lib/update-context.cjs +0 -209
  386. package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
  387. package/get-shit-done/bin/lib/validate.cjs +0 -118
  388. package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
  389. package/get-shit-done/bin/lib/verify.cjs +0 -1614
  390. package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
  391. package/get-shit-done/bin/lib/workstream.cjs +0 -389
  392. package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
  393. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
  394. package/scripts/lint-no-source-grep-extras.cjs +0 -81
  395. package/scripts/lint-no-source-grep.cjs +0 -174
  396. /package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +0 -0
  397. /package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +0 -0
  398. /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
  399. /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
  400. /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
  401. /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
  402. /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
  403. /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
  404. /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
  405. /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
  406. /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
  407. /package/{get-shit-done → gsd-core}/references/checkpoints.md +0 -0
  408. /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
  409. /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
  410. /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
  411. /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
  412. /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
  413. /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
  414. /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
  415. /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
  416. /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
  417. /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
  418. /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
  419. /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
  420. /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
  421. /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
  422. /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
  423. /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
  424. /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
  425. /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
  426. /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
  427. /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
  428. /package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +0 -0
  429. /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
  430. /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
  431. /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
  432. /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
  433. /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
  434. /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
  435. /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
  436. /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
  437. /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
  438. /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
  439. /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
  440. /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
  441. /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
  442. /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
  443. /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
  444. /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
  445. /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
  446. /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
  447. /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
  448. /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
  449. /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
  450. /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
  451. /package/{get-shit-done → gsd-core}/references/ui-brand.md +0 -0
  452. /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
  453. /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
  454. /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
  455. /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
  456. /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
  457. /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
  458. /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
  459. /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
  460. /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
  461. /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
  462. /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
  463. /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
  464. /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
  465. /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
  466. /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
  467. /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
  468. /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
  469. /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
  470. /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
  471. /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
  472. /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
  473. /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
  474. /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
  475. /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
  476. /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
  477. /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
  478. /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
  479. /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
  480. /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
  481. /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
  482. /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
  483. /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
  484. /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
  485. /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
  486. /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
  487. /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
  488. /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
  489. /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
  490. /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
  491. /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
  492. /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
  493. /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
  494. /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
  495. /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
  496. /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
  497. /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
  498. /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
  499. /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
  500. /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
  501. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
  502. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
  503. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
  504. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
  505. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
  506. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
  507. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
  508. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
  509. /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
  510. /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
  511. /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
  512. /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
  513. /package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +0 -0
  514. /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
  515. /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
  516. /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
  517. /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
  518. /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
  519. /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
  520. /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
  521. /package/{get-shit-done → gsd-core}/workflows/session-report.md +0 -0
@@ -4,7 +4,7 @@ const fs = require('node:fs');
4
4
  const path = require('node:path');
5
5
 
6
6
  const ROOT = path.resolve(__dirname, '..');
7
- const aliasesPath = path.join(ROOT, 'get-shit-done', 'bin', 'lib', 'command-aliases.cjs');
7
+ const aliasesPath = path.join(ROOT, 'gsd-core', 'bin', 'lib', 'command-aliases.cjs');
8
8
 
9
9
  function fail(message) {
10
10
  process.stderr.write(`${message}\n`);
@@ -37,37 +37,37 @@ const families = [
37
37
  {
38
38
  commandAliases: 'STATE_COMMAND_ALIASES',
39
39
  subcommands: 'STATE_SUBCOMMANDS',
40
- routerPath: path.join(ROOT, 'get-shit-done', 'bin', 'lib', 'state-command-router.cjs'),
40
+ routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'state-command-router.cjs'),
41
41
  },
42
42
  {
43
43
  commandAliases: 'VERIFY_COMMAND_ALIASES',
44
44
  subcommands: 'VERIFY_SUBCOMMANDS',
45
- routerPath: path.join(ROOT, 'get-shit-done', 'bin', 'lib', 'verify-command-router.cjs'),
45
+ routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'verify-command-router.cjs'),
46
46
  },
47
47
  {
48
48
  commandAliases: 'INIT_COMMAND_ALIASES',
49
49
  subcommands: 'INIT_SUBCOMMANDS',
50
- routerPath: path.join(ROOT, 'get-shit-done', 'bin', 'lib', 'init-command-router.cjs'),
50
+ routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'init-command-router.cjs'),
51
51
  },
52
52
  {
53
53
  commandAliases: 'PHASE_COMMAND_ALIASES',
54
54
  subcommands: 'PHASE_SUBCOMMANDS',
55
- routerPath: path.join(ROOT, 'get-shit-done', 'bin', 'lib', 'phase-command-router.cjs'),
55
+ routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'phase-command-router.cjs'),
56
56
  },
57
57
  {
58
58
  commandAliases: 'PHASES_COMMAND_ALIASES',
59
59
  subcommands: 'PHASES_SUBCOMMANDS',
60
- routerPath: path.join(ROOT, 'get-shit-done', 'bin', 'lib', 'phases-command-router.cjs'),
60
+ routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'phases-command-router.cjs'),
61
61
  },
62
62
  {
63
63
  commandAliases: 'VALIDATE_COMMAND_ALIASES',
64
64
  subcommands: 'VALIDATE_SUBCOMMANDS',
65
- routerPath: path.join(ROOT, 'get-shit-done', 'bin', 'lib', 'validate-command-router.cjs'),
65
+ routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'validate-command-router.cjs'),
66
66
  },
67
67
  {
68
68
  commandAliases: 'ROADMAP_COMMAND_ALIASES',
69
69
  subcommands: 'ROADMAP_SUBCOMMANDS',
70
- routerPath: path.join(ROOT, 'get-shit-done', 'bin', 'lib', 'roadmap-command-router.cjs'),
70
+ routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'roadmap-command-router.cjs'),
71
71
  },
72
72
  ];
73
73
 
@@ -212,7 +212,11 @@ if (fs.existsSync(LOCKFILE)) {
212
212
  // ---------------------------------------------------------------------------
213
213
  if (fs.existsSync(LOCKFILE)) {
214
214
  try {
215
- const res = spawnSync(npmCmd, ['ci', '--dry-run'], {
215
+ // --ignore-scripts: this is a lockfile-vs-package.json sync check, not a
216
+ // build. Without it, npm would run the `prepare` lifecycle (build:lib via
217
+ // tsc) — which fails when check:env runs before deps are installed (tsc
218
+ // absent), misreporting an out-of-sync lockfile. ADR-457 build-at-publish.
219
+ const res = spawnSync(npmCmd, ['ci', '--dry-run', '--ignore-scripts'], {
216
220
  cwd: PROJECT_ROOT,
217
221
  encoding: 'utf8',
218
222
  shell: process.platform === 'win32',
@@ -44,7 +44,7 @@ const RULES = [
44
44
  },
45
45
  {
46
46
  name: 'TS runtime sources (ADR-457 build-at-publish)',
47
- // src/*.cts compiles into get-shit-done/bin/lib/*.cjs; a source-only edit must
47
+ // src/*.cts compiles into gsd-core/bin/lib/*.cjs; a source-only edit must
48
48
  // still trigger the migrated module's tests (otherwise CI silently skips them).
49
49
  match: path => path.startsWith('src/') || path === 'tsconfig.build.json',
50
50
  tests: [
@@ -55,7 +55,7 @@ const RULES = [
55
55
  {
56
56
  name: 'installer and package layout',
57
57
  match: path => path.startsWith('bin/') ||
58
- path.startsWith('get-shit-done/bin/') ||
58
+ path.startsWith('gsd-core/bin/') ||
59
59
  path.includes('install') ||
60
60
  path.includes('release-tarball-smoke'),
61
61
  fullMatrix: true,
@@ -122,7 +122,7 @@ const RULES = [
122
122
  },
123
123
  {
124
124
  name: 'workflow prompts',
125
- match: path => path.startsWith('get-shit-done/workflows/'),
125
+ match: path => path.startsWith('gsd-core/workflows/'),
126
126
  tests: [
127
127
  'tests/workflow-compat.test.cjs',
128
128
  'tests/workflow-size-budget.test.cjs',
@@ -153,7 +153,7 @@ const RULES = [
153
153
  },
154
154
  {
155
155
  name: 'configuration',
156
- match: path => /config|configuration|model-catalog|model-profile/.test(path),
156
+ match: path => ['config', 'configuration', 'model-catalog', 'model-profile'].some(k => path.includes(k)),
157
157
  tests: [
158
158
  'tests/config.test.cjs',
159
159
  'tests/config-get-default.test.cjs',
@@ -208,7 +208,19 @@ function parseArgs(argv) {
208
208
 
209
209
  function splitFiles(value) {
210
210
  if (!value) return [];
211
- return value.split(/[,\s]+/).map(v => v.trim()).filter(Boolean);
211
+ const SEPARATORS = new Set([',', ' ', '\t', '\n', '\r', '\f', '\v']);
212
+ const tokens = [];
213
+ let current = '';
214
+ for (const ch of value) {
215
+ if (SEPARATORS.has(ch)) {
216
+ if (current) tokens.push(current);
217
+ current = '';
218
+ } else {
219
+ current += ch;
220
+ }
221
+ }
222
+ if (current) tokens.push(current);
223
+ return tokens.map(v => v.trim()).filter(Boolean);
212
224
  }
213
225
 
214
226
  function changedFiles(args) {
@@ -231,6 +243,9 @@ function addAll(set, values) {
231
243
  for (const value of values) set.add(value);
232
244
  }
233
245
 
246
+ const WINDOWS_HINTS = ['windows', 'path', 'shell', 'workflow', 'install', 'hook'];
247
+ const isWindowsHint = s => WINDOWS_HINTS.some(k => s.toLowerCase().includes(k));
248
+
234
249
  function classify(files) {
235
250
  const targeted = new Set();
236
251
  const windows = new Set();
@@ -239,9 +254,9 @@ function classify(files) {
239
254
  let fullMatrix = false;
240
255
 
241
256
  for (const file of files) {
242
- if (/^(bin|get-shit-done|agents|commands|docs|hooks|tests|scripts)\//.test(file) ||
243
- /^package(-lock)?\.json$/.test(file) ||
244
- /^tsconfig.*\.json$/.test(file) ||
257
+ if (['bin/', 'gsd-core/', 'agents/', 'commands/', 'docs/', 'hooks/', 'tests/', 'scripts/'].some(p => file.startsWith(p)) ||
258
+ file === 'package.json' || file === 'package-lock.json' ||
259
+ (file.startsWith('tsconfig') && file.endsWith('.json')) ||
245
260
  file.startsWith('.github/workflows/') ||
246
261
  file.startsWith('.github/rulesets/')) {
247
262
  codeChanged = true;
@@ -250,7 +265,7 @@ function classify(files) {
250
265
  if (file.startsWith('tests/') && file.endsWith('.test.cjs')) {
251
266
  targeted.add(file);
252
267
  fullMatrix = true;
253
- if (/windows|path|shell|workflow|install|hook/i.test(file)) {
268
+ if (isWindowsHint(file)) {
254
269
  windows.add(file);
255
270
  }
256
271
  }
@@ -272,7 +287,7 @@ function classify(files) {
272
287
  targetedTests.push('unit');
273
288
  }
274
289
 
275
- const windowsTests = existingTests([...new Set([...windows, ...targetedTests.filter(t => /windows|path|shell|workflow|install|hook/i.test(t))])].sort());
290
+ const windowsTests = existingTests([...new Set([...windows, ...targetedTests.filter(isWindowsHint)])].sort());
276
291
 
277
292
  return {
278
293
  code_changed: codeChanged,
@@ -54,7 +54,7 @@ function executionContextRefs(content) {
54
54
  const trailingProse = line.length > token.length;
55
55
  const normalized = token
56
56
  .replace(/^@(?:~|\$HOME)\//, '')
57
- .replace(/^(?:\.claude\/)?(?:get-shit-done\/)?/, '');
57
+ .replace(/^(?:\.claude\/)?(?:gsd-core\/)?/, '');
58
58
  refs.push({ token, normalized, trailingProse });
59
59
  }
60
60
  }
@@ -20,11 +20,11 @@ const path = require('node:path');
20
20
 
21
21
  const COMMANDS_DIR = path.join(__dirname, '..', 'commands', 'gsd');
22
22
  const SEARCH_DIRS = [
23
- path.join(__dirname, '..', 'get-shit-done', 'bin', 'lib'),
24
- path.join(__dirname, '..', 'get-shit-done', 'workflows'),
25
- path.join(__dirname, '..', 'get-shit-done', 'references'),
26
- path.join(__dirname, '..', 'get-shit-done', 'templates'),
27
- path.join(__dirname, '..', 'get-shit-done', 'contexts'),
23
+ path.join(__dirname, '..', 'gsd-core', 'bin', 'lib'),
24
+ path.join(__dirname, '..', 'gsd-core', 'workflows'),
25
+ path.join(__dirname, '..', 'gsd-core', 'references'),
26
+ path.join(__dirname, '..', 'gsd-core', 'templates'),
27
+ path.join(__dirname, '..', 'gsd-core', 'contexts'),
28
28
  path.join(__dirname, '..', 'commands', 'gsd'),
29
29
  path.join(__dirname, '..', 'agents'),
30
30
  path.join(__dirname, '..', 'hooks'),
@@ -34,19 +34,19 @@ const FAMILIES = [
34
34
  },
35
35
  {
36
36
  name: 'workflows',
37
- dir: path.join(ROOT, 'get-shit-done', 'workflows'),
37
+ dir: path.join(ROOT, 'gsd-core', 'workflows'),
38
38
  filter: (f) => f.endsWith('.md'),
39
39
  toName: (f) => f,
40
40
  },
41
41
  {
42
42
  name: 'references',
43
- dir: path.join(ROOT, 'get-shit-done', 'references'),
43
+ dir: path.join(ROOT, 'gsd-core', 'references'),
44
44
  filter: (f) => f.endsWith('.md'),
45
45
  toName: (f) => f,
46
46
  },
47
47
  {
48
48
  name: 'cli_modules',
49
- dir: path.join(ROOT, 'get-shit-done', 'bin', 'lib'),
49
+ dir: path.join(ROOT, 'gsd-core', 'bin', 'lib'),
50
50
  filter: (f) => f.endsWith('.cjs'),
51
51
  toName: (f) => f,
52
52
  },
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * `deriveIdentity(pkg)` is the pure core: it turns a parsed package.json into
8
8
  * the coordinate record every consumer needs. The generated runtime module
9
- * `get-shit-done/bin/lib/package-identity.cjs` bakes those values at build
9
+ * `gsd-core/bin/lib/package-identity.cjs` bakes those values at build
10
10
  * time, because the installed tree carries only a synthetic
11
11
  * `{"type":"commonjs"}` package.json (no `.name`) — so a runtime
12
12
  * `require('package.json').name` resolves to `undefined` (the #378 bug this
@@ -24,6 +24,21 @@ function parseRepoSlug(repository) {
24
24
  return m ? m[1] : '';
25
25
  }
26
26
 
27
+ /**
28
+ * Pure: turn an npm package name into a filesystem-safe slug for cache filenames.
29
+ * Strips a leading `@`, replaces `/` with `-`, then collapses any run of
30
+ * characters that are NOT `[a-z0-9]` to a single `-`, and trims leading/trailing `-`.
31
+ */
32
+ function slugifyPackageName(name) {
33
+ if (!name) return '';
34
+ return name
35
+ .replace(/^@/, '')
36
+ .replace(/\//g, '-')
37
+ .toLowerCase()
38
+ .replace(/[^a-z0-9]+/g, '-')
39
+ .replace(/^-+|-+$/g, '');
40
+ }
41
+
27
42
  /**
28
43
  * Pure: package.json object -> the package identity coordinates.
29
44
  */
@@ -35,7 +50,9 @@ function deriveIdentity(pkg = {}) {
35
50
  const changelogRawUrl = repoSlug
36
51
  ? `https://raw.githubusercontent.com/${repoSlug}/main/CHANGELOG.md`
37
52
  : '';
38
- return { packageName, binName, repoSlug, repoUrl, changelogRawUrl };
53
+ const cacheSlug = slugifyPackageName(packageName);
54
+ const updateCacheFileName = cacheSlug ? `gsd-update-check-${cacheSlug}.json` : 'gsd-update-check.json';
55
+ return { packageName, binName, repoSlug, repoUrl, changelogRawUrl, cacheSlug, updateCacheFileName };
39
56
  }
40
57
 
41
58
  /**
@@ -62,7 +79,7 @@ const GENERATED_HEADER =
62
79
  * runtime command builder is byte-identical to the tested source above.
63
80
  */
64
81
  function render(identity) {
65
- const { packageName, binName, repoSlug, repoUrl, changelogRawUrl } = identity;
82
+ const { packageName, binName, repoSlug, repoUrl, changelogRawUrl, cacheSlug, updateCacheFileName } = identity;
66
83
  const j = (v) => JSON.stringify(v);
67
84
  return (
68
85
  GENERATED_HEADER +
@@ -71,7 +88,9 @@ function render(identity) {
71
88
  `const binName = ${j(binName)};\n` +
72
89
  `const repoSlug = ${j(repoSlug)};\n` +
73
90
  `const repoUrl = ${j(repoUrl)};\n` +
74
- `const changelogRawUrl = ${j(changelogRawUrl)};\n\n` +
91
+ `const changelogRawUrl = ${j(changelogRawUrl)};\n` +
92
+ `const cacheSlug = ${j(cacheSlug)};\n` +
93
+ `const updateCacheFileName = ${j(updateCacheFileName)};\n\n` +
75
94
  `${formatManualInstall.toString()}\n\n` +
76
95
  'function manualInstallCommand(opts = {}) {\n' +
77
96
  ' return formatManualInstall({ packageName, binName, scope: opts.scope, runtime: opts.runtime });\n' +
@@ -79,12 +98,14 @@ function render(identity) {
79
98
  'module.exports = Object.freeze({\n' +
80
99
  ' packageName,\n' +
81
100
  ' // PACKAGE_NAME: back-compat alias for #516-era consumers. Baked here, so it\n' +
82
- ' // survives the installed tree’s synthetic package.json (fixes the #378 undefined).\n' +
101
+ " // survives the installed tree's synthetic package.json (fixes the #378 undefined).\n" +
83
102
  ' PACKAGE_NAME: packageName,\n' +
84
103
  ' binName,\n' +
85
104
  ' repoSlug,\n' +
86
105
  ' repoUrl,\n' +
87
106
  ' changelogRawUrl,\n' +
107
+ ' cacheSlug,\n' +
108
+ ' updateCacheFileName,\n' +
88
109
  ' manualInstallCommand,\n' +
89
110
  '});\n'
90
111
  );
@@ -94,11 +115,11 @@ function main() {
94
115
  const fs = require('node:fs');
95
116
  const path = require('node:path');
96
117
  const pkg = require(path.join(__dirname, '..', 'package.json'));
97
- const out = path.join(__dirname, '..', 'get-shit-done', 'bin', 'lib', 'package-identity.cjs');
118
+ const out = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'package-identity.cjs');
98
119
  fs.writeFileSync(out, render(deriveIdentity(pkg)));
99
120
  process.stdout.write(`wrote ${path.relative(path.join(__dirname, '..'), out)}\n`);
100
121
  }
101
122
 
102
123
  if (require.main === module) main();
103
124
 
104
- module.exports = { deriveIdentity, parseRepoSlug, formatManualInstall, render, main };
125
+ module.exports = { deriveIdentity, parseRepoSlug, slugifyPackageName, formatManualInstall, render, main };
@@ -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) {