@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
package/bin/install.js CHANGED
@@ -16,7 +16,9 @@ const {
16
16
  projectPersistentPathExportActions,
17
17
  projectShellCommandText,
18
18
  projectCodexHookTomlCommand,
19
- } = require('../get-shit-done/bin/lib/shell-command-projection.cjs');
19
+ shellHookOmitsBashRunner,
20
+ buildLocalShellHookCommand,
21
+ } = require('../gsd-core/bin/lib/shell-command-projection.cjs');
20
22
 
21
23
  // Bidirectional GSD slash-command namespace transformer (#3583).
22
24
  // Required at module scope so the command list can be computed once per install
@@ -28,7 +30,7 @@ const {
28
30
  } = require(path.join(__dirname, '..', 'scripts', 'fix-slash-commands.cjs'));
29
31
  const {
30
32
  resolveAntigravityGlobalDir,
31
- } = require('../get-shit-done/bin/lib/runtime-homes.cjs');
33
+ } = require('../gsd-core/bin/lib/runtime-homes.cjs');
32
34
 
33
35
  /**
34
36
  * Runtimes that register hyphen-form `name:` per #2808 AND copy agent bodies
@@ -73,7 +75,7 @@ const dim = '\x1b[2m';
73
75
  const reset = '\x1b[0m';
74
76
 
75
77
  // Codex config.toml constants
76
- const GSD_CODEX_MARKER = '# GSD Agent Configuration \u2014 managed by get-shit-done installer';
78
+ const GSD_CODEX_MARKER = '# GSD Agent Configuration \u2014 managed by gsd-core installer';
77
79
  const GSD_CODEX_HOOKS_OWNERSHIP_PREFIX = '# GSD codex_hooks ownership: ';
78
80
  // Codex's hook-enabling feature flag (issue #3566). Codex itself marks
79
81
  // `codex_hooks` as a `legacy_key` in codex-rs/features/src/legacy.rs; the
@@ -90,7 +92,7 @@ function isCodexHooksFeatureKey(key) {
90
92
  }
91
93
 
92
94
  // Copilot instructions marker constants
93
- const GSD_COPILOT_INSTRUCTIONS_MARKER = '<!-- GSD Configuration \u2014 managed by get-shit-done installer -->';
95
+ const GSD_COPILOT_INSTRUCTIONS_MARKER = '<!-- GSD Configuration \u2014 managed by gsd-core installer -->';
94
96
  const GSD_COPILOT_INSTRUCTIONS_CLOSE_MARKER = '<!-- /GSD Configuration -->';
95
97
 
96
98
  // GSD-managed files under hooks/lib/ (helpers required by gsd-*.sh hooks).
@@ -134,11 +136,11 @@ const pkg = require('../package.json');
134
136
  // #2517 — runtime-aware tier resolution shared with core.cjs.
135
137
  // Hoisted to top with absolute __dirname-based paths so `gsd install codex` works
136
138
  // when invoked via npm global install (cwd is the user's project, not the gsd repo
137
- // root). Inline `require('../get-shit-done/...')` from inside install functions
139
+ // root). Inline `require('../gsd-core/...')` from inside install functions
138
140
  // works only because Node resolves it relative to the install.js file regardless
139
141
  // of cwd, but keeping the require at the top makes the dependency explicit and
140
142
  // surfaces resolution failures at process start instead of at first install call.
141
- const _gsdLibDir = path.join(__dirname, '..', 'get-shit-done', 'bin', 'lib');
143
+ const _gsdLibDir = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib');
142
144
  const { MODEL_PROFILES: GSD_MODEL_PROFILES } = require(path.join(_gsdLibDir, 'model-profiles.cjs'));
143
145
  const {
144
146
  RUNTIME_PROFILE_MAP: GSD_RUNTIME_PROFILE_MAP,
@@ -161,7 +163,7 @@ function _getGsdEffortCatalog() {
161
163
  const manifestPath = path.join(
162
164
  __dirname,
163
165
  '..',
164
- 'get-shit-done',
166
+ 'gsd-core',
165
167
  'bin',
166
168
  'shared',
167
169
  'config-defaults.manifest.json'
@@ -225,6 +227,13 @@ const {
225
227
  const {
226
228
  resolveRuntimeArtifactLayout,
227
229
  } = require(path.join(_gsdLibDir, 'runtime-artifact-layout.cjs'));
230
+ const {
231
+ planLegacyCleanup,
232
+ applyLegacyCleanup,
233
+ } = require(path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'legacy-cleanup.cjs'));
234
+ const {
235
+ updateCacheFileName,
236
+ } = require(path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'package-identity.cjs'));
228
237
 
229
238
  // Parse args
230
239
  const args = process.argv.slice(2);
@@ -251,6 +260,7 @@ const hasUninstall = args.includes('--uninstall') || args.includes('-u');
251
260
  const hasSkillsRoot = args.includes('--skills-root');
252
261
  const hasPortableHooks = args.includes('--portable-hooks') || process.env.GSD_PORTABLE_HOOKS === '1';
253
262
  const hasMinimal = args.includes('--minimal') || args.includes('--core-only');
263
+ const hasDryRun = args.includes('--dry-run');
254
264
  // --profile=<name> or --profile=<n1>,<n2> (composable); mutually exclusive with --minimal
255
265
  const _profileArgRaw = (() => {
256
266
  for (const arg of args) {
@@ -613,9 +623,10 @@ const banner = '\n' +
613
623
  ' ╚██████╔╝███████║██████╔╝\n' +
614
624
  ' ╚═════╝ ╚══════╝╚═════╝' + reset + '\n' +
615
625
  '\n' +
616
- ' Get Shit Done ' + dim + 'v' + pkg.version + reset + '\n' +
626
+ ' GSD Core ' + dim + 'v' + pkg.version + reset + '\n' +
627
+ ' Git. Ship. Done.\n' +
617
628
  ' A meta-prompting, context engineering and spec-driven\n' +
618
- ' development system for Claude Code, OpenCode, Gemini, Kilo, Codex, Copilot, Antigravity, Cursor, Windsurf, Augment, Trae, Qwen Code, Hermes Agent, Cline and CodeBuddy by TÂCHES.\n';
629
+ ' development workflows for Claude Code, OpenCode, Gemini, Kilo, Codex, Copilot, Antigravity, Cursor, Windsurf, Augment, Trae, Qwen Code, Hermes Agent, Cline and CodeBuddy.\n';
619
630
 
620
631
  // Pure seam: parse --config-dir / -c from an arbitrary args array.
621
632
  // Returns the path string, '' for an empty equals-form value, or null when the
@@ -1216,7 +1227,7 @@ function buildHookCommand(configDir, hookName, opts) {
1216
1227
  // Windows, so wrapping `.sh` hooks with an explicit `bash.exe` path can
1217
1228
  // trigger `bash.exe: ... cannot execute binary file`. Emit only the quoted
1218
1229
  // script path for Claude on Windows.
1219
- if (platform === 'win32' && runtime === 'claude' && isShellHook) {
1230
+ if (shellHookOmitsBashRunner({ platform, runtime, isShellHook })) {
1220
1231
  if (opts.portableHooks) {
1221
1232
  const portableBaseDir = projectPortableHookBaseDir({
1222
1233
  configDir,
@@ -2811,6 +2822,9 @@ function convertClaudeToCodexMarkdown(content) {
2811
2822
  converted = converted.replace(/\$HOME\/\.claude\//g, '$HOME/.codex/');
2812
2823
  converted = converted.replace(/~\/\.claude\//g, '~/.codex/');
2813
2824
  converted = converted.replace(/\.\/\.claude\//g, './.codex/');
2825
+ // Bare ~/.claude without trailing slash (e.g. configDir = ~/.claude)
2826
+ converted = converted.replace(/\$HOME\/\.claude\b/g, '$HOME/.codex');
2827
+ converted = converted.replace(/~\/\.claude\b/g, '~/.codex');
2814
2828
  // Bare/project-relative .claude/... references (#2639). Covers strings like
2815
2829
  // "check `.claude/skills/`" where there is no ~/, $HOME/, or ./ anchor.
2816
2830
  // Negative lookbehind prevents double-replacing already-anchored forms and
@@ -5220,14 +5234,14 @@ function installCodexConfig(targetDir, agentsSrc) {
5220
5234
  const agents = [];
5221
5235
 
5222
5236
  // Compute the Codex GSD install path (absolute, so subagents with empty $HOME work — #820)
5223
- const codexGsdPath = `${path.resolve(targetDir, 'get-shit-done').replace(/\\/g, '/')}/`;
5237
+ const codexGsdPath = `${path.resolve(targetDir, 'gsd-core').replace(/\\/g, '/')}/`;
5224
5238
 
5225
5239
  for (const file of agentEntries) {
5226
5240
  let content = fs.readFileSync(path.join(agentsSrc, file), 'utf8');
5227
- // Replace full .claude/get-shit-done prefix so path resolves to the Codex
5241
+ // Replace full .claude/gsd-core prefix so path resolves to the Codex
5228
5242
  // GSD install before generic .claude → .codex conversion rewrites it.
5229
- content = content.replace(/~\/\.claude\/get-shit-done\//g, codexGsdPath);
5230
- content = content.replace(/\$HOME\/\.claude\/get-shit-done\//g, codexGsdPath);
5243
+ content = content.replace(/~\/\.claude\/gsd-core\//g, codexGsdPath);
5244
+ content = content.replace(/\$HOME\/\.claude\/gsd-core\//g, codexGsdPath);
5231
5245
  // Route TOML emit through the same full Claude→Codex conversion pipeline
5232
5246
  // used on the `.md` emit path (#2639). Covers: slash-command rewrites,
5233
5247
  // $ARGUMENTS → {{GSD_ARGS}}, /clear removal, anchored and bare .claude/
@@ -6001,10 +6015,10 @@ function writeHermesCategoryDescription(categoryDir) {
6001
6015
  '---',
6002
6016
  'name: gsd',
6003
6017
  `version: ${pkg.version}`,
6004
- 'description: Get Shit Done — disciplined planning, execution, and shipping workflows. Use any gsd-* skill in this category to drive a project through new-project → discuss-phase → plan-phase → execute-phase → ship.',
6018
+ 'description: GSD Core — Git. Ship. Done. Disciplined planning, execution, and shipping workflows. Use any gsd-* skill in this category to drive a project through new-project → discuss-phase → plan-phase → execute-phase → ship.',
6005
6019
  '---',
6006
6020
  '',
6007
- '# Get Shit Done (GSD)',
6021
+ '# GSD Core',
6008
6022
  '',
6009
6023
  'GSD is a structured development workflow. Skills in this category cover',
6010
6024
  'project initialization, phase planning, execution, code review, and shipping.',
@@ -6026,7 +6040,7 @@ function writeHermesCategoryDescription(categoryDir) {
6026
6040
  */
6027
6041
 
6028
6042
  /**
6029
- * Single source of truth for user-owned artifacts inside get-shit-done/.
6043
+ * Single source of truth for user-owned artifacts inside gsd-core/.
6030
6044
  *
6031
6045
  * These files are created/refreshed by user-facing workflows (e.g.
6032
6046
  * /gsd-profile-user) and must be preserved across reinstalls. Critically, they
@@ -6039,7 +6053,7 @@ function writeHermesCategoryDescription(categoryDir) {
6039
6053
  * both. Both preserveUserArtifacts call sites and writeManifest must agree on
6040
6054
  * this list, which is why it lives here as a single constant.
6041
6055
  *
6042
- * Paths are relative to the get-shit-done/ directory.
6056
+ * Paths are relative to the gsd-core/ directory.
6043
6057
  */
6044
6058
  const USER_OWNED_ARTIFACTS = ['USER-PROFILE.md'];
6045
6059
 
@@ -7172,8 +7186,8 @@ function uninstall(isGlobal, runtime = 'claude') {
7172
7186
  }
7173
7187
  }
7174
7188
 
7175
- // 2. Remove get-shit-done directory
7176
- const gsdDir = path.join(targetDir, 'get-shit-done');
7189
+ // 2. Remove gsd-core directory
7190
+ const gsdDir = path.join(targetDir, 'gsd-core');
7177
7191
  if (fs.existsSync(gsdDir)) {
7178
7192
  // Preserve user-generated files before wipe (#1423)
7179
7193
  const userProfilePath = path.join(gsdDir, 'USER-PROFILE.md');
@@ -7181,14 +7195,14 @@ function uninstall(isGlobal, runtime = 'claude') {
7181
7195
 
7182
7196
  fs.rmSync(gsdDir, { recursive: true });
7183
7197
  removedCount++;
7184
- console.log(` ${green}✓${reset} Removed get-shit-done/`);
7198
+ console.log(` ${green}✓${reset} Removed gsd-core/`);
7185
7199
 
7186
7200
  // Restore user-generated files
7187
7201
  if (preservedProfile) {
7188
7202
  try {
7189
7203
  fs.mkdirSync(gsdDir, { recursive: true });
7190
7204
  fs.writeFileSync(userProfilePath, preservedProfile);
7191
- console.log(` ${green}✓${reset} Preserved get-shit-done/USER-PROFILE.md`);
7205
+ console.log(` ${green}✓${reset} Preserved gsd-core/USER-PROFILE.md`);
7192
7206
  } catch (err) {
7193
7207
  console.error(` ${red}✗${reset} Failed to restore USER-PROFILE.md: ${err.message}`);
7194
7208
  }
@@ -7345,7 +7359,7 @@ function uninstall(isGlobal, runtime = 'claude') {
7345
7359
  if (config.permission[permType]) {
7346
7360
  const keys = Object.keys(config.permission[permType]);
7347
7361
  for (const key of keys) {
7348
- if (key.includes('get-shit-done')) {
7362
+ if (key.includes('gsd-core')) {
7349
7363
  delete config.permission[permType][key];
7350
7364
  modified = true;
7351
7365
  }
@@ -7386,7 +7400,7 @@ function uninstall(isGlobal, runtime = 'claude') {
7386
7400
  if (config.permission[permType]) {
7387
7401
  const keys = Object.keys(config.permission[permType]);
7388
7402
  for (const key of keys) {
7389
- if (key.includes('get-shit-done')) {
7403
+ if (key.includes('gsd-core')) {
7390
7404
  delete config.permission[permType][key];
7391
7405
  modified = true;
7392
7406
  }
@@ -7495,7 +7509,7 @@ function parseJsonc(content) {
7495
7509
 
7496
7510
  /**
7497
7511
  * Configure OpenCode permissions to allow reading GSD reference docs
7498
- * This prevents permission prompts when GSD accesses the get-shit-done directory
7512
+ * This prevents permission prompts when GSD accesses the gsd-core directory
7499
7513
  * @param {boolean} isGlobal - Whether this is a global or local install
7500
7514
  * @param {string|null} configDir - Resolved config directory when already known
7501
7515
  */
@@ -7541,8 +7555,8 @@ function configureOpencodePermissions(isGlobal = true, configDir = null) {
7541
7555
  // Use ~ shorthand if it's in the default location, otherwise use full path
7542
7556
  const defaultConfigDir = path.join(os.homedir(), '.config', 'opencode');
7543
7557
  const gsdPath = opencodeConfigDir === defaultConfigDir
7544
- ? '~/.config/opencode/get-shit-done/*'
7545
- : `${opencodeConfigDir.replace(/\\/g, '/')}/get-shit-done/*`;
7558
+ ? '~/.config/opencode/gsd-core/*'
7559
+ : `${opencodeConfigDir.replace(/\\/g, '/')}/gsd-core/*`;
7546
7560
 
7547
7561
  let modified = false;
7548
7562
 
@@ -7575,7 +7589,7 @@ function configureOpencodePermissions(isGlobal = true, configDir = null) {
7575
7589
 
7576
7590
  /**
7577
7591
  * Configure Kilo permissions to allow reading GSD reference docs
7578
- * This prevents permission prompts when GSD accesses the get-shit-done directory
7592
+ * This prevents permission prompts when GSD accesses the gsd-core directory
7579
7593
  * @param {boolean} isGlobal - Whether this is a global or local install
7580
7594
  * @param {string|null} configDir - Resolved config directory when already known
7581
7595
  */
@@ -7615,8 +7629,8 @@ function configureKiloPermissions(isGlobal = true, configDir = null) {
7615
7629
  // Use ~ shorthand if it's in the default location, otherwise use full path
7616
7630
  const defaultConfigDir = path.join(os.homedir(), '.config', 'kilo');
7617
7631
  const gsdPath = kiloConfigDir === defaultConfigDir
7618
- ? '~/.config/kilo/get-shit-done/*'
7619
- : `${kiloConfigDir.replace(/\\/g, '/')}/get-shit-done/*`;
7632
+ ? '~/.config/kilo/gsd-core/*'
7633
+ : `${kiloConfigDir.replace(/\\/g, '/')}/gsd-core/*`;
7620
7634
 
7621
7635
  let modified = false;
7622
7636
 
@@ -7787,7 +7801,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
7787
7801
  const isTrae = runtime === 'trae';
7788
7802
  const isCline = runtime === 'cline';
7789
7803
  const isHermes = runtime === 'hermes';
7790
- const gsdDir = path.join(configDir, 'get-shit-done');
7804
+ const gsdDir = path.join(configDir, 'gsd-core');
7791
7805
  const commandsDir = path.join(configDir, 'commands', 'gsd');
7792
7806
  const opencodeCommandDir = path.join(configDir, 'command');
7793
7807
  // Hermes nests GSD skills under skills/gsd/ as a single category (#2841).
@@ -7812,7 +7826,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
7812
7826
  // as a "local patch" (bug #2771). Single source of truth:
7813
7827
  // USER_OWNED_ARTIFACTS at top of file.
7814
7828
  if (USER_OWNED_ARTIFACTS.includes(rel)) continue;
7815
- manifest.files['get-shit-done/' + rel] = hash;
7829
+ manifest.files['gsd-core/' + rel] = hash;
7816
7830
  }
7817
7831
  // Record commands/gsd/ for any runtime that emits it (Gemini globally,
7818
7832
  // Claude Code locally — see #2923). Manifest must reflect everything on
@@ -7852,7 +7866,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
7852
7866
  }
7853
7867
  if (fs.existsSync(agentsDir)) {
7854
7868
  for (const file of fs.readdirSync(agentsDir)) {
7855
- if (file.startsWith('gsd-') && file.endsWith('.md')) {
7869
+ if (file.startsWith('gsd-') && (file.endsWith('.md') || file.endsWith('.toml'))) {
7856
7870
  manifest.files['agents/' + file] = fileHash(path.join(agentsDir, file));
7857
7871
  }
7858
7872
  }
@@ -7917,7 +7931,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
7917
7931
  function populatePristineDir({ packageSrc, pristineDir, modified, runtime, pathPrefix, isGlobal }) {
7918
7932
  if (!modified || modified.length === 0) return 0;
7919
7933
  // Modified paths come from manifest.files which can live under several
7920
- // install roots: get-shit-done/, commands/gsd/, command/, skills/, agents/,
7934
+ // install roots: gsd-core/, commands/gsd/, command/, skills/, agents/,
7921
7935
  // hooks/, plus runtime-specific root files (#3004 CR). Stage every
7922
7936
  // top-level dir that actually contains a modified path; root-level files
7923
7937
  // are copied directly without the transform pipeline (they don't need
@@ -7999,7 +8013,7 @@ function saveLocalPatches(configDir, pristineCtx) {
7999
8013
  // that were incorrectly recorded so refreshes don't surface false patches warnings.
8000
8014
  if (manifest.files) {
8001
8015
  for (const artifact of USER_OWNED_ARTIFACTS) {
8002
- delete manifest.files[`get-shit-done/${artifact}`];
8016
+ delete manifest.files[`gsd-core/${artifact}`];
8003
8017
  }
8004
8018
  }
8005
8019
 
@@ -8273,7 +8287,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
8273
8287
  : targetDir.replace(process.cwd(), '.');
8274
8288
 
8275
8289
  // Path prefix for file references in markdown content (e.g. gsd-tools.cjs).
8276
- // Replaces $HOME/.claude/ or ~/.claude/ so the result is <pathPrefix>get-shit-done/bin/...
8290
+ // Replaces $HOME/.claude/ or ~/.claude/ so the result is <pathPrefix>gsd-core/bin/...
8277
8291
  // For global installs: use $HOME/ so paths expand correctly inside double-quoted
8278
8292
  // shell commands (~ does NOT expand inside double quotes, causing MODULE_NOT_FOUND).
8279
8293
  // For local installs: use resolved absolute path (may be outside $HOME).
@@ -8400,7 +8414,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
8400
8414
  // codexPreInstallAgentFiles — Set of gsd-*.{md,toml} filenames in agents/
8401
8415
  // codexPreInstallAgentContents — Map<filename, Buffer> of pre-existing agent
8402
8416
  // file bytes, enabling full content restore (not just deletion) on rollback.
8403
- // codexPreInstallVersionBytes — Buffer (or null) of get-shit-done/VERSION
8417
+ // codexPreInstallVersionBytes — Buffer (or null) of gsd-core/VERSION
8404
8418
  //
8405
8419
  // These are referenced by restoreCodexSnapshot(), defined below inside the
8406
8420
  // config block. Defining the variables here (outer scope) makes them
@@ -8452,7 +8466,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
8452
8466
  }
8453
8467
  }
8454
8468
  }
8455
- const _preVersionPath = path.join(targetDir, 'get-shit-done', 'VERSION');
8469
+ const _preVersionPath = path.join(targetDir, 'gsd-core', 'VERSION');
8456
8470
  if (fs.existsSync(_preVersionPath)) {
8457
8471
  try { codexPreInstallVersionBytes = fs.readFileSync(_preVersionPath); } catch (_) { /* best-effort */ }
8458
8472
  }
@@ -8464,7 +8478,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
8464
8478
  // must also trigger rollback so the caller is never left in a partially-installed state.
8465
8479
  //
8466
8480
  // _codexPreConfigRollback covers the four surfaces that can be mutated before
8467
- // config.toml is touched: skills/, agents/, get-shit-done/VERSION, and orphaned
8481
+ // config.toml is touched: skills/, agents/, gsd-core/VERSION, and orphaned
8468
8482
  // atomic-write temp files. It is safe to call before any writes have happened.
8469
8483
  // The full restoreCodexSnapshot() (defined inside the config block) additionally
8470
8484
  // handles config.toml, which is not yet touched at this point in the pipeline.
@@ -8521,8 +8535,8 @@ function install(isGlobal, runtime = 'claude', options = {}) {
8521
8535
  }
8522
8536
  } catch (_) { /* best-effort */ }
8523
8537
  }
8524
- // get-shit-done/VERSION
8525
- const _earlyVersionPath = path.join(targetDir, 'get-shit-done', 'VERSION');
8538
+ // gsd-core/VERSION
8539
+ const _earlyVersionPath = path.join(targetDir, 'gsd-core', 'VERSION');
8526
8540
  if (codexPreInstallVersionBytes !== null) {
8527
8541
  try { fs.writeFileSync(_earlyVersionPath, codexPreInstallVersionBytes); } catch (_) { /* best-effort */ }
8528
8542
  } else if (fs.existsSync(_earlyVersionPath)) {
@@ -8777,24 +8791,24 @@ function install(isGlobal, runtime = 'claude', options = {}) {
8777
8791
  }
8778
8792
  }
8779
8793
 
8780
- // Copy get-shit-done skill with path replacement
8794
+ // Copy gsd-core skill with path replacement
8781
8795
  // Preserve user-generated files before the wipe-and-copy so they survive re-install
8782
- const skillSrc = path.join(src, 'get-shit-done');
8783
- const skillDest = path.join(targetDir, 'get-shit-done');
8796
+ const skillSrc = path.join(src, 'gsd-core');
8797
+ const skillDest = path.join(targetDir, 'gsd-core');
8784
8798
  const savedGsdArtifacts = preserveUserArtifacts(skillDest, USER_OWNED_ARTIFACTS);
8785
8799
  copyWithPathReplacement(skillSrc, skillDest, pathPrefix, runtime, false, isGlobal);
8786
8800
  restoreUserArtifacts(skillDest, savedGsdArtifacts);
8787
- if (verifyInstalled(skillDest, 'get-shit-done')) {
8788
- console.log(` ${green}✓${reset} Installed get-shit-done`);
8801
+ if (verifyInstalled(skillDest, 'gsd-core')) {
8802
+ console.log(` ${green}✓${reset} Installed workflow assets`);
8789
8803
  } else {
8790
- failures.push('get-shit-done');
8804
+ failures.push('gsd-core');
8791
8805
  }
8792
8806
 
8793
- // Copy shared manifests into the get-shit-done payload
8807
+ // Copy shared manifests into the gsd-core payload
8794
8808
  // at the co-located path that CJS modules resolve first:
8795
- // get-shit-done/bin/shared/*.json
8809
+ // gsd-core/bin/shared/*.json
8796
8810
  //
8797
- // This source now lives under get-shit-done/bin/shared in-repo.
8811
+ // This source now lives under gsd-core/bin/shared in-repo.
8798
8812
  const sharedPayloadFiles = [
8799
8813
  'model-catalog.json',
8800
8814
  'config-defaults.manifest.json',
@@ -8802,9 +8816,9 @@ function install(isGlobal, runtime = 'claude', options = {}) {
8802
8816
  'runtime-aliases.manifest.json',
8803
8817
  ];
8804
8818
  for (const fileName of sharedPayloadFiles) {
8805
- const sharedSrc = path.join(src, 'get-shit-done', 'bin', 'shared', fileName);
8819
+ const sharedSrc = path.join(src, 'gsd-core', 'bin', 'shared', fileName);
8806
8820
  const sharedDest = path.join(skillDest, 'bin', 'shared', fileName);
8807
- const displayPath = `get-shit-done/bin/shared/${fileName}`;
8821
+ const displayPath = `gsd-core/bin/shared/${fileName}`;
8808
8822
  if (fs.existsSync(sharedSrc)) {
8809
8823
  fs.mkdirSync(path.dirname(sharedDest), { recursive: true });
8810
8824
  fs.copyFileSync(sharedSrc, sharedDest);
@@ -8814,7 +8828,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
8814
8828
  failures.push(displayPath);
8815
8829
  }
8816
8830
  } else {
8817
- failures.push(`get-shit-done/bin/shared/${fileName} (source missing)`);
8831
+ failures.push(`gsd-core/bin/shared/${fileName} (source missing)`);
8818
8832
  }
8819
8833
  }
8820
8834
 
@@ -8966,7 +8980,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
8966
8980
 
8967
8981
  // Copy CHANGELOG.md
8968
8982
  const changelogSrc = path.join(src, 'CHANGELOG.md');
8969
- const changelogDest = path.join(targetDir, 'get-shit-done', 'CHANGELOG.md');
8983
+ const changelogDest = path.join(targetDir, 'gsd-core', 'CHANGELOG.md');
8970
8984
  if (fs.existsSync(changelogSrc)) {
8971
8985
  fs.copyFileSync(changelogSrc, changelogDest);
8972
8986
  if (verifyFileInstalled(changelogDest, 'CHANGELOG.md')) {
@@ -8977,7 +8991,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
8977
8991
  }
8978
8992
 
8979
8993
  // Write VERSION file
8980
- const versionDest = path.join(targetDir, 'get-shit-done', 'VERSION');
8994
+ const versionDest = path.join(targetDir, 'gsd-core', 'VERSION');
8981
8995
  fs.writeFileSync(versionDest, pkg.version);
8982
8996
  if (verifyFileInstalled(versionDest, 'VERSION')) {
8983
8997
  console.log(` ${green}✓${reset} Wrote VERSION (${pkg.version})`);
@@ -9086,10 +9100,17 @@ function install(isGlobal, runtime = 'claude', options = {}) {
9086
9100
  console.log(` ${green}✓${reset} Installed hooks/lib/ helpers (git-cmd, graphify-rebuild, ...)`);
9087
9101
  }
9088
9102
 
9089
- // Clear stale update cache so next session re-evaluates hook versions
9090
- // Cache lives at ~/.cache/gsd/ (see hooks/gsd-check-update.js line 35-36)
9091
- const updateCacheFile = path.join(os.homedir(), '.cache', 'gsd', 'gsd-update-check.json');
9092
- try { fs.unlinkSync(updateCacheFile); } catch (e) { /* cache may not exist yet */ }
9103
+ // Remove legacy get-shit-done-cc artifacts and stale update caches (#607).
9104
+ // cleanupLegacyGsdCc handles both the legacy shared cache and the per-package
9105
+ // cache (formerly an inline unlinkSync here). A cleanup failure must never
9106
+ // abort a successful install — log a warning and continue.
9107
+ // install() is never reached in --dry-run mode (the early-exit at the CLI
9108
+ // dispatch handles preview), so cleanup here always applies for real.
9109
+ try {
9110
+ cleanupLegacyGsdCc({ dryRun: false });
9111
+ } catch (cleanupErr) {
9112
+ console.warn(` ${yellow}Warning: legacy cleanup failed: ${cleanupErr.message}${reset}`);
9113
+ }
9093
9114
 
9094
9115
  if (failures.length > 0) {
9095
9116
  console.error(`\n ${yellow}Installation incomplete!${reset} Failed: ${failures.join(', ')}`);
@@ -9103,42 +9124,48 @@ function install(isGlobal, runtime = 'claude', options = {}) {
9103
9124
  // Report any backed-up local patches
9104
9125
  reportLocalPatches(targetDir, runtime);
9105
9126
 
9106
- // Verify no leaked .claude paths in non-Claude runtimes
9127
+ // Verify no leaked .claude paths in non-Claude runtimes (manifest-scoped)
9107
9128
  if (runtime !== 'claude') {
9108
9129
  const leakedPaths = [];
9109
- function scanForLeakedPaths(dir) {
9110
- if (!fs.existsSync(dir)) return;
9111
- let entries;
9112
- try {
9113
- entries = fs.readdirSync(dir, { withFileTypes: true });
9114
- } catch (err) {
9115
- if (err.code === 'EPERM' || err.code === 'EACCES') {
9116
- return; // skip inaccessible directories
9130
+ // Only scan files that were written by this install (manifest-tracked).
9131
+ // Scanning the entire targetDir can match user-authored content that
9132
+ // legitimately references ~/.claude (e.g. personal notes), producing
9133
+ // false-positive warnings. Restricting to the manifest avoids that.
9134
+ let manifestFiles = null;
9135
+ try {
9136
+ const manifestPath = path.join(targetDir, MANIFEST_NAME);
9137
+ if (fs.existsSync(manifestPath)) {
9138
+ const manifestData = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
9139
+ if (manifestData && typeof manifestData.files === 'object') {
9140
+ manifestFiles = Object.keys(manifestData.files);
9117
9141
  }
9118
- throw err;
9119
9142
  }
9120
- for (const entry of entries) {
9121
- const fullPath = path.join(dir, entry.name);
9122
- if (entry.isDirectory()) {
9123
- scanForLeakedPaths(fullPath);
9124
- } else if ((entry.name.endsWith('.md') || entry.name.endsWith('.toml')) && entry.name !== 'CHANGELOG.md') {
9125
- let content;
9126
- try {
9127
- content = fs.readFileSync(fullPath, 'utf8');
9128
- } catch (err) {
9129
- if (err.code === 'EPERM' || err.code === 'EACCES') {
9130
- continue; // skip inaccessible files
9131
- }
9132
- throw err;
9133
- }
9134
- const matches = content.match(/(?:~|\$HOME)\/\.claude\b/g);
9135
- if (matches) {
9136
- leakedPaths.push({ file: fullPath.replace(targetDir + '/', ''), count: matches.length });
9143
+ } catch (_manifestParseErr) {
9144
+ // If we cannot read/parse the manifest, skip the scan entirely to
9145
+ // avoid false positives rather than falling back to a full directory walk.
9146
+ manifestFiles = null;
9147
+ }
9148
+ if (manifestFiles !== null) {
9149
+ for (const relPath of manifestFiles) {
9150
+ const fileName = path.basename(relPath);
9151
+ if (!(fileName.endsWith('.md') || fileName.endsWith('.toml'))) continue;
9152
+ if (fileName === 'CHANGELOG.md') continue;
9153
+ const fullPath = path.join(targetDir, relPath);
9154
+ let content;
9155
+ try {
9156
+ content = fs.readFileSync(fullPath, 'utf8');
9157
+ } catch (err) {
9158
+ if (err.code === 'EPERM' || err.code === 'EACCES' || err.code === 'ENOENT') {
9159
+ continue; // skip inaccessible or missing files
9137
9160
  }
9161
+ throw err;
9162
+ }
9163
+ const matches = content.match(/(?:~|\$HOME)\/\.claude\b/g);
9164
+ if (matches) {
9165
+ leakedPaths.push({ file: relPath, count: matches.length });
9138
9166
  }
9139
9167
  }
9140
9168
  }
9141
- scanForLeakedPaths(targetDir);
9142
9169
  if (leakedPaths.length > 0) {
9143
9170
  const totalLeaks = leakedPaths.reduce((sum, l) => sum + l.count, 0);
9144
9171
  console.warn(`\n ${yellow}⚠${reset} Found ${totalLeaks} unreplaced .claude path reference(s) in ${leakedPaths.length} file(s):`);
@@ -9198,7 +9225,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
9198
9225
  // newly-created dirs (i.e. those not in the pre-install Set)
9199
9226
  // agents/gsd-* — restore pre-existing files from content snapshot; remove
9200
9227
  // newly-created files
9201
- // get-shit-done/VERSION — restore or remove
9228
+ // gsd-core/VERSION — restore or remove
9202
9229
  // *.tmp-* — best-effort cleanup of installer-owned atomic-write temps
9203
9230
  //
9204
9231
  // Safe to call multiple times (idempotent): each remove/write is guarded by
@@ -9297,8 +9324,8 @@ function install(isGlobal, runtime = 'claude', options = {}) {
9297
9324
  } catch (_) { /* best-effort */ }
9298
9325
  }
9299
9326
 
9300
- // 4. get-shit-done/VERSION
9301
- const _rollbackVersionPath = path.join(targetDir, 'get-shit-done', 'VERSION');
9327
+ // 4. gsd-core/VERSION
9328
+ const _rollbackVersionPath = path.join(targetDir, 'gsd-core', 'VERSION');
9302
9329
  if (codexPreInstallVersionBytes !== null) {
9303
9330
  try { fs.writeFileSync(_rollbackVersionPath, codexPreInstallVersionBytes); }
9304
9331
  catch (_) { /* best-effort */ }
@@ -9342,6 +9369,10 @@ function install(isGlobal, runtime = 'claude', options = {}) {
9342
9369
  }
9343
9370
  console.log(` ${green}✓${reset} Generated config.toml with ${agentCount} agent roles`);
9344
9371
  console.log(` ${green}✓${reset} Generated ${agentCount} agent .toml config files`);
9372
+ // Re-write the manifest now that .toml agent files exist on disk.
9373
+ // The initial writeManifest call (before Codex config generation) could
9374
+ // not include agents/gsd-*.toml because those files did not yet exist.
9375
+ writeManifest(targetDir, runtime, { mode: _effectiveInstallMode });
9345
9376
  } else {
9346
9377
  console.log(` ${dim}↳${reset} Skipping Codex agent config generation (minimal install)`);
9347
9378
  }
@@ -9513,7 +9544,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
9513
9544
 
9514
9545
  if (isCopilot) {
9515
9546
  // Generate copilot-instructions.md
9516
- const templatePath = path.join(targetDir, 'get-shit-done', 'templates', 'copilot-instructions.md');
9547
+ const templatePath = path.join(targetDir, 'gsd-core', 'templates', 'copilot-instructions.md');
9517
9548
  const instructionsPath = path.join(targetDir, 'copilot-instructions.md');
9518
9549
  if (fs.existsSync(templatePath)) {
9519
9550
  const template = fs.readFileSync(templatePath, 'utf8');
@@ -9547,12 +9578,12 @@ function install(isGlobal, runtime = 'claude', options = {}) {
9547
9578
  // Cline uses .clinerules — generate a rules file with GSD system instructions
9548
9579
  const clinerulesDest = path.join(targetDir, '.clinerules');
9549
9580
  const clinerules = [
9550
- '# GSD — Get Shit Done',
9581
+ '# GSD Core — Git. Ship. Done.',
9551
9582
  '',
9552
- '- GSD workflows live in `get-shit-done/workflows/`. Load the relevant workflow when',
9583
+ '- GSD workflows live in `gsd-core/workflows/`. Load the relevant workflow when',
9553
9584
  ' the user runs a `/gsd-*` command.',
9554
9585
  '- GSD agents live in `agents/`. Use the matching agent when spawning subagents.',
9555
- '- GSD tools are at `get-shit-done/bin/gsd-tools.cjs`. Run with `node`.',
9586
+ '- GSD tools are at `gsd-core/bin/gsd-tools.cjs`. Run with `node`.',
9556
9587
  '- Planning artifacts live in `.planning/`. Never edit them outside a GSD workflow.',
9557
9588
  '- Do not apply GSD workflows unless the user explicitly asks for them.',
9558
9589
  '- When a GSD command triggers a deliverable (feature, fix, docs), offer the next',
@@ -9685,14 +9716,13 @@ function install(isGlobal, runtime = 'claude', options = {}) {
9685
9716
  runtime,
9686
9717
  platform: process.platform,
9687
9718
  });
9688
- const localShellCmd = (hookFile) => localBashRunner === null
9689
- ? null
9690
- : projectShellCommandText({
9691
- runnerToken: localBashRunner,
9692
- argTokens: [`${localPrefix}/hooks/${hookFile}`],
9693
- runtime,
9694
- platform: process.platform,
9695
- });
9719
+ const localShellCmd = (hookFile) => buildLocalShellHookCommand({
9720
+ localPrefix,
9721
+ hookFile,
9722
+ bashRunner: localBashRunner,
9723
+ runtime,
9724
+ platform: process.platform,
9725
+ });
9696
9726
  const statuslineCommand = isGlobal
9697
9727
  ? buildHookCommand(targetDir, 'gsd-statusline.js', hookOpts)
9698
9728
  : localCmd('gsd-statusline.js');
@@ -9930,6 +9960,33 @@ function install(isGlobal, runtime = 'claude', options = {}) {
9930
9960
  console.warn(` ${yellow}⚠${reset} Skipped workflow guard hook — gsd-workflow-guard.js not found at target`);
9931
9961
  }
9932
9962
 
9963
+ // Configure PreToolUse hook for worktree absolute-path safety (#260)
9964
+ // Hard-blocks Edit/Write/MultiEdit tool calls with absolute paths that resolve
9965
+ // outside the current worktree root. Prevents executor agents from
9966
+ // accidentally writing to the main checkout when running in isolation="worktree".
9967
+ const worktreePathGuardCommand = isGlobal
9968
+ ? buildHookCommand(targetDir, 'gsd-worktree-path-guard.js', hookOpts)
9969
+ : localCmd('gsd-worktree-path-guard.js');
9970
+ const hasWorktreePathGuardHook = settings.hooks[preToolEvent].some(entry =>
9971
+ entry.hooks && entry.hooks.some(h => h.command && h.command.includes('gsd-worktree-path-guard'))
9972
+ );
9973
+ const worktreePathGuardFile = path.join(targetDir, 'hooks', 'gsd-worktree-path-guard.js');
9974
+ if (!hasWorktreePathGuardHook && fs.existsSync(worktreePathGuardFile) && worktreePathGuardCommand) {
9975
+ settings.hooks[preToolEvent].push({
9976
+ matcher: 'Write|Edit|MultiEdit',
9977
+ hooks: [
9978
+ {
9979
+ type: 'command',
9980
+ command: worktreePathGuardCommand,
9981
+ timeout: 5
9982
+ }
9983
+ ]
9984
+ });
9985
+ console.log(` ${green}✓${reset} Configured worktree path guard hook`);
9986
+ } else if (!hasWorktreePathGuardHook && !fs.existsSync(worktreePathGuardFile)) {
9987
+ console.warn(` ${yellow}⚠${reset} Skipped worktree path guard hook — gsd-worktree-path-guard.js not found at target`);
9988
+ }
9989
+
9933
9990
  // Configure commit validation hook (Conventional Commits enforcement, opt-in)
9934
9991
  const validateCommitCommand = isGlobal
9935
9992
  ? buildHookCommand(targetDir, 'gsd-validate-commit.sh', hookOpts)
@@ -10655,6 +10712,86 @@ function maybeSuggestPathExport(globalBin, homeDir) {
10655
10712
  console.log('');
10656
10713
  }
10657
10714
 
10715
+ // Runtime subdir names to scan for legacy get-shit-done-cc artifacts (#607).
10716
+ // Covers both local (project-relative) and common global forms.
10717
+ const _LEGACY_SCAN_SUBDIR_NAMES = [
10718
+ '.claude',
10719
+ '.gemini',
10720
+ '.opencode',
10721
+ '.config/opencode',
10722
+ '.kilo',
10723
+ '.config/kilo',
10724
+ '.codex',
10725
+ '.copilot',
10726
+ '.github', // copilot local form
10727
+ '.agent', // antigravity local form
10728
+ '.cursor',
10729
+ '.windsurf',
10730
+ '.codeium/windsurf',
10731
+ '.augment',
10732
+ '.trae',
10733
+ '.qwen',
10734
+ '.hermes',
10735
+ '.codebuddy',
10736
+ '.cline',
10737
+ ];
10738
+
10739
+ /**
10740
+ * Detect and remove leftover get-shit-done-cc artifacts across ALL known
10741
+ * runtime config directories (issue #607).
10742
+ *
10743
+ * Exported so tests can call it directly without spawning a subprocess.
10744
+ *
10745
+ * Scans ONLY subdirs under homeDir — never cwd — to avoid touching the
10746
+ * user's active-project hooks when the installer is run from a project dir.
10747
+ *
10748
+ * @param {object} [opts]
10749
+ * @param {string} [opts.homeDir=os.homedir()] - home directory to scan
10750
+ * @param {boolean} [opts.dryRun=false] - preview only; no mutations
10751
+ * @param {object} [opts.logger=console] - injectable logger
10752
+ * @returns {{ plan: {path:string,reason:string}[], result: object }}
10753
+ */
10754
+ function cleanupLegacyGsdCc({ homeDir = os.homedir(), dryRun = false, logger = console } = {}) {
10755
+ // Build de-duplicated list of candidate config dirs to scan.
10756
+ // Only scan under homeDir — never cwd — to prevent accidental deletion of
10757
+ // the user's active-project hooks when the installer is invoked from a
10758
+ // project directory that has .claude/hooks or similar subdirs.
10759
+ const seen = new Set();
10760
+ const configDirs = [];
10761
+ for (const name of _LEGACY_SCAN_SUBDIR_NAMES) {
10762
+ const candidate = path.join(homeDir, name);
10763
+ if (!seen.has(candidate) && fs.existsSync(candidate)) {
10764
+ seen.add(candidate);
10765
+ configDirs.push(candidate);
10766
+ }
10767
+ }
10768
+
10769
+ // planLegacyCleanup scans each configDir and already includes the legacy
10770
+ // shared cache (gsd-update-check.json) as a plan entry.
10771
+ const plan = planLegacyCleanup(configDirs, { homeDir });
10772
+
10773
+ // Apply the plan (dryRun honors the flag).
10774
+ const result = applyLegacyCleanup(plan, { dryRun, logger });
10775
+
10776
+ // Also clear / preview the per-package cache so next session re-evaluates
10777
+ // hook versions (replaces the former inline unlinkSync on line ~9104).
10778
+ const perPkgCacheFile = path.join(homeDir, '.cache', 'gsd', updateCacheFileName);
10779
+ if (dryRun) {
10780
+ logger.log('[dry-run] would remove: ' + perPkgCacheFile + ' (per-package-update-cache)');
10781
+ } else {
10782
+ try { fs.unlinkSync(perPkgCacheFile); } catch (_e) { /* cache may not exist yet */ }
10783
+ }
10784
+
10785
+ // Concise summary
10786
+ if (plan.length > 0 || !dryRun) {
10787
+ const verb = dryRun ? 'Would remove' : 'Removed';
10788
+ const count = dryRun ? plan.length : result.removed.length;
10789
+ logger.log(`[legacy-cleanup] ${verb} ${count} legacy artifact(s).`);
10790
+ }
10791
+
10792
+ return { plan, result };
10793
+ }
10794
+
10658
10795
  /**
10659
10796
  * Install GSD for all selected runtimes
10660
10797
  */
@@ -10878,11 +11015,26 @@ module.exports = {
10878
11015
  installRuntimeArtifacts,
10879
11016
  uninstallRuntimeArtifacts,
10880
11017
  parseConfigDirFromArgs,
11018
+ cleanupLegacyGsdCc,
10881
11019
  };
10882
11020
 
10883
11021
  // Main logic — only run when not loaded as a module for testing
10884
11022
  if (require.main === module && !process.env.GSD_TEST_MODE) {
10885
- if (hasSkillsRoot) {
11023
+ if (hasDryRun) {
11024
+ // --dry-run: preview legacy cleanup and exit without installing.
11025
+ if (hasUninstall) {
11026
+ console.log('Note: --dry-run previews legacy get-shit-done-cc cleanup only; it does not preview --uninstall.');
11027
+ }
11028
+ console.log('Dry run — no files will be modified.\n');
11029
+ // cleanupLegacyGsdCc with dryRun:true is the single source of truth for
11030
+ // both the legacy artifacts and the per-package cache path — no duplicate
11031
+ // printing here.
11032
+ const { plan } = cleanupLegacyGsdCc({ dryRun: true });
11033
+ if (plan.length === 0) {
11034
+ console.log(' (no legacy get-shit-done-cc artifacts found)');
11035
+ }
11036
+ process.exit(0);
11037
+ } else if (hasSkillsRoot) {
10886
11038
  // Print the skills root directory for a given runtime (used by /gsd-sync-skills).
10887
11039
  // Usage: node install.js --skills-root <runtime>
10888
11040
  const runtimeArg = args[args.indexOf('--skills-root') + 1];