@opengsd/gsd-core 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/README.ja-JP.md +46 -791
  2. package/README.ko-KR.md +44 -780
  3. package/README.md +42 -218
  4. package/README.pt-BR.md +47 -414
  5. package/README.zh-CN.md +46 -763
  6. package/agents/gsd-ai-researcher.md +2 -2
  7. package/agents/gsd-debug-session-manager.md +1 -1
  8. package/agents/gsd-debugger.md +8 -8
  9. package/agents/gsd-doc-writer.md +7 -6
  10. package/agents/gsd-domain-researcher.md +15 -2
  11. package/agents/gsd-eval-auditor.md +1 -1
  12. package/agents/gsd-eval-planner.md +2 -2
  13. package/agents/gsd-executor.md +21 -8
  14. package/agents/gsd-framework-selector.md +1 -1
  15. package/agents/gsd-intel-updater.md +4 -4
  16. package/agents/gsd-phase-researcher.md +19 -6
  17. package/agents/gsd-plan-checker.md +3 -3
  18. package/agents/gsd-planner.md +36 -23
  19. package/agents/gsd-project-researcher.md +13 -0
  20. package/agents/gsd-research-synthesizer.md +6 -2
  21. package/agents/gsd-roadmapper.md +6 -6
  22. package/agents/gsd-ui-researcher.md +16 -3
  23. package/agents/gsd-user-profiler.md +2 -2
  24. package/agents/gsd-verifier.md +8 -8
  25. package/assets/gsd-logo-2000-transparent.png +0 -0
  26. package/assets/gsd-logo-2000-transparent.svg +17 -0
  27. package/assets/gsd-logo-2000.png +0 -0
  28. package/assets/gsd-logo-2000.svg +21 -0
  29. package/assets/terminal.svg +68 -0
  30. package/bin/install.js +255 -103
  31. package/commands/gsd/add-tests.md +1 -1
  32. package/commands/gsd/ai-integration-phase.md +3 -3
  33. package/commands/gsd/audit-fix.md +1 -1
  34. package/commands/gsd/audit-milestone.md +1 -1
  35. package/commands/gsd/audit-uat.md +1 -1
  36. package/commands/gsd/autonomous.md +2 -2
  37. package/commands/gsd/capture.md +6 -6
  38. package/commands/gsd/cleanup.md +1 -1
  39. package/commands/gsd/code-review.md +1 -1
  40. package/commands/gsd/complete-milestone.md +2 -2
  41. package/commands/gsd/config.md +3 -3
  42. package/commands/gsd/debug.md +1 -1
  43. package/commands/gsd/discuss-phase.md +5 -4
  44. package/commands/gsd/docs-update.md +1 -1
  45. package/commands/gsd/eval-review.md +2 -2
  46. package/commands/gsd/execute-phase.md +2 -2
  47. package/commands/gsd/explore.md +1 -1
  48. package/commands/gsd/extract-learnings.md +2 -2
  49. package/commands/gsd/fast.md +1 -1
  50. package/commands/gsd/forensics.md +1 -1
  51. package/commands/gsd/graphify.md +9 -9
  52. package/commands/gsd/health.md +1 -1
  53. package/commands/gsd/help.md +2 -2
  54. package/commands/gsd/import.md +5 -5
  55. package/commands/gsd/inbox.md +1 -1
  56. package/commands/gsd/ingest-docs.md +4 -4
  57. package/commands/gsd/manager.md +3 -3
  58. package/commands/gsd/map-codebase.md +1 -1
  59. package/commands/gsd/milestone-summary.md +1 -1
  60. package/commands/gsd/mvp-phase.md +4 -4
  61. package/commands/gsd/new-milestone.md +5 -5
  62. package/commands/gsd/new-project.md +5 -5
  63. package/commands/gsd/pause-work.md +2 -2
  64. package/commands/gsd/phase.md +4 -4
  65. package/commands/gsd/plan-phase.md +2 -2
  66. package/commands/gsd/plan-review-convergence.md +4 -4
  67. package/commands/gsd/pr-branch.md +1 -1
  68. package/commands/gsd/profile-user.md +2 -2
  69. package/commands/gsd/progress.md +4 -4
  70. package/commands/gsd/quick.md +1 -1
  71. package/commands/gsd/resume-work.md +1 -1
  72. package/commands/gsd/review.md +3 -2
  73. package/commands/gsd/secure-phase.md +1 -1
  74. package/commands/gsd/settings.md +1 -1
  75. package/commands/gsd/ship.md +2 -2
  76. package/commands/gsd/sketch.md +7 -7
  77. package/commands/gsd/spec-phase.md +2 -2
  78. package/commands/gsd/spike.md +3 -3
  79. package/commands/gsd/stats.md +1 -1
  80. package/commands/gsd/surface.md +4 -4
  81. package/commands/gsd/thread.md +1 -1
  82. package/commands/gsd/ui-phase.md +2 -2
  83. package/commands/gsd/ui-review.md +2 -2
  84. package/commands/gsd/ultraplan-phase.md +2 -2
  85. package/commands/gsd/undo.md +3 -3
  86. package/commands/gsd/update.md +3 -3
  87. package/commands/gsd/validate-phase.md +1 -1
  88. package/commands/gsd/verify-work.md +2 -2
  89. package/commands/gsd/workspace.md +4 -4
  90. package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
  91. package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +50 -4
  92. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  93. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  94. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  95. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  96. package/gsd-core/bin/lib/audit.cjs +743 -0
  97. package/gsd-core/bin/lib/check-command-router.cjs +342 -0
  98. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  99. package/gsd-core/bin/lib/clock.cjs +95 -0
  100. package/gsd-core/bin/lib/clusters.cjs +128 -0
  101. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  102. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  103. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  104. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  105. package/gsd-core/bin/lib/commands.cjs +1202 -0
  106. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  107. package/gsd-core/bin/lib/config-types.cjs +19 -0
  108. package/gsd-core/bin/lib/config.cjs +714 -0
  109. package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
  110. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  111. package/gsd-core/bin/lib/core.cjs +2007 -0
  112. package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
  113. package/gsd-core/bin/lib/docs.cjs +252 -0
  114. package/gsd-core/bin/lib/drift.cjs +364 -0
  115. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  116. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  117. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  118. package/gsd-core/bin/lib/graphify.cjs +496 -0
  119. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  120. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  121. package/gsd-core/bin/lib/init.cjs +1799 -0
  122. package/gsd-core/bin/lib/install-profiles.cjs +526 -0
  123. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  124. package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
  125. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  126. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  127. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  128. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  129. package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
  130. package/gsd-core/bin/lib/intel.cjs +607 -0
  131. package/gsd-core/bin/lib/learnings.cjs +270 -0
  132. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  133. package/gsd-core/bin/lib/milestone.cjs +373 -0
  134. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  135. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  136. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  137. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  138. package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
  139. package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
  140. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  141. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  142. package/gsd-core/bin/lib/phase.cjs +1307 -0
  143. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  144. package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
  145. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  146. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  147. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  148. package/gsd-core/bin/lib/project-root.cjs +119 -0
  149. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  150. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  151. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  152. package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
  153. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  154. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
  155. package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
  156. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  157. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  158. package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
  159. package/gsd-core/bin/lib/secrets.cjs +34 -0
  160. package/gsd-core/bin/lib/security.cjs +407 -0
  161. package/gsd-core/bin/lib/semver-compare.cjs +42 -0
  162. package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
  163. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  164. package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -82
  165. package/gsd-core/bin/lib/state.cjs +2010 -0
  166. package/gsd-core/bin/lib/surface.cjs +406 -0
  167. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  168. package/gsd-core/bin/lib/template.cjs +237 -0
  169. package/gsd-core/bin/lib/uat.cjs +297 -0
  170. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  171. package/gsd-core/bin/lib/update-context.cjs +218 -0
  172. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  173. package/gsd-core/bin/lib/validate.cjs +112 -0
  174. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  175. package/gsd-core/bin/lib/verify.cjs +1451 -0
  176. package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
  177. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  178. package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
  179. package/gsd-core/bin/lib/workstream.cjs +380 -0
  180. package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
  181. package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +1 -0
  182. package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +17 -1
  183. package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +27 -0
  184. package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
  185. package/{get-shit-done → gsd-core}/references/checkpoints.md +1 -1
  186. package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
  187. package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
  188. package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
  189. package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
  190. package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
  191. package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +1 -1
  192. package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
  193. package/{get-shit-done → gsd-core}/references/ui-brand.md +4 -2
  194. package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
  195. package/gsd-core/references/worktree-branch-check.md +38 -0
  196. package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
  197. package/{get-shit-done → gsd-core}/templates/README.md +2 -2
  198. package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
  199. package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
  200. package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
  201. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  202. package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
  203. package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
  204. package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
  205. package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
  206. package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
  207. package/{get-shit-done → gsd-core}/workflows/audit-fix.md +2 -2
  208. package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +3 -1
  209. package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
  210. package/{get-shit-done → gsd-core}/workflows/autonomous.md +10 -8
  211. package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
  212. package/{get-shit-done → gsd-core}/workflows/cleanup.md +44 -4
  213. package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +4 -4
  214. package/{get-shit-done → gsd-core}/workflows/code-review.md +6 -4
  215. package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
  216. package/{get-shit-done → gsd-core}/workflows/debug.md +7 -2
  217. package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +6 -2
  218. package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
  219. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +5 -5
  220. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
  221. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
  222. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
  223. package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +4 -4
  224. package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
  225. package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
  226. package/{get-shit-done → gsd-core}/workflows/docs-update.md +19 -5
  227. package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
  228. package/{get-shit-done → gsd-core}/workflows/eval-review.md +3 -3
  229. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +16 -3
  230. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  231. package/{get-shit-done → gsd-core}/workflows/execute-phase.md +89 -57
  232. package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
  233. package/{get-shit-done → gsd-core}/workflows/explore.md +5 -3
  234. package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
  235. package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
  236. package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
  237. package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
  238. package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +3 -3
  239. package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +6 -6
  240. package/{get-shit-done → gsd-core}/workflows/import.md +3 -1
  241. package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +5 -5
  242. package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
  243. package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
  244. package/{get-shit-done → gsd-core}/workflows/manager.md +3 -3
  245. package/{get-shit-done → gsd-core}/workflows/map-codebase.md +3 -1
  246. package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
  247. package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
  248. package/{get-shit-done → gsd-core}/workflows/new-milestone.md +5 -5
  249. package/{get-shit-done → gsd-core}/workflows/new-project.md +8 -8
  250. package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
  251. package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
  252. package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
  253. package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
  254. package/{get-shit-done → gsd-core}/workflows/plan-phase.md +29 -28
  255. package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +10 -10
  256. package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
  257. package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
  258. package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
  259. package/{get-shit-done → gsd-core}/workflows/quick.md +7 -29
  260. package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
  261. package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
  262. package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
  263. package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
  264. package/{get-shit-done → gsd-core}/workflows/review.md +110 -2
  265. package/{get-shit-done → gsd-core}/workflows/scan.md +3 -1
  266. package/{get-shit-done → gsd-core}/workflows/secure-phase.md +5 -3
  267. package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +196 -6
  268. package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
  269. package/{get-shit-done → gsd-core}/workflows/settings.md +16 -2
  270. package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
  271. package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
  272. package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
  273. package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
  274. package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
  275. package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
  276. package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
  277. package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
  278. package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
  279. package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
  280. package/{get-shit-done → gsd-core}/workflows/ui-phase.md +5 -5
  281. package/{get-shit-done → gsd-core}/workflows/ui-review.md +3 -3
  282. package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
  283. package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
  284. package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
  285. package/{get-shit-done → gsd-core}/workflows/validate-phase.md +5 -3
  286. package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
  287. package/{get-shit-done → gsd-core}/workflows/verify-work.md +7 -7
  288. package/hooks/dist/gsd-check-update-worker.js +16 -3
  289. package/hooks/dist/gsd-check-update.js +7 -5
  290. package/hooks/dist/gsd-context-monitor.js +2 -2
  291. package/hooks/dist/gsd-statusline.js +39 -21
  292. package/hooks/dist/gsd-update-banner.js +6 -2
  293. package/hooks/dist/gsd-worktree-path-guard.js +169 -0
  294. package/hooks/dist/managed-hooks-registry.cjs +35 -0
  295. package/hooks/gsd-check-update-worker.js +16 -3
  296. package/hooks/gsd-check-update.js +7 -5
  297. package/hooks/gsd-context-monitor.js +2 -2
  298. package/hooks/gsd-statusline.js +39 -21
  299. package/hooks/gsd-update-banner.js +6 -2
  300. package/hooks/gsd-worktree-path-guard.js +169 -0
  301. package/hooks/managed-hooks-registry.cjs +1 -0
  302. package/package.json +17 -11
  303. package/scripts/affected-tests-lib.cjs +1 -1
  304. package/scripts/base64-scan.sh +12 -0
  305. package/scripts/build-hooks.js +5 -1
  306. package/scripts/changeset/cli.cjs +2 -2
  307. package/scripts/changeset/github-release-notes.cjs +1 -1
  308. package/scripts/changeset/lint.cjs +1 -1
  309. package/scripts/check-alias-drift.cjs +8 -8
  310. package/scripts/check-env.cjs +5 -1
  311. package/scripts/ci-test-scope.cjs +34 -9
  312. package/scripts/command-contract-helpers.cjs +1 -1
  313. package/scripts/fix-slash-commands.cjs +5 -5
  314. package/scripts/gen-inventory-manifest.cjs +3 -3
  315. package/scripts/generate-package-identity.cjs +28 -7
  316. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  317. package/scripts/lint-command-contract.cjs +1 -1
  318. package/scripts/lint-legacy-dir-name.cjs +156 -0
  319. package/scripts/lint-package-identity-drift.cjs +8 -8
  320. package/scripts/lint-pr-check-project-dir.cjs +0 -1
  321. package/scripts/lint-shell-command-projection-drift.cjs +1 -1
  322. package/scripts/lint-skill-deps.cjs +1 -1
  323. package/scripts/lint-test-file-count.allowlist.json +129 -32
  324. package/scripts/lint-test-file-count.cjs +85 -30
  325. package/scripts/mutation-matrix.cjs +219 -0
  326. package/scripts/prompt-injection-scan.sh +5 -1
  327. package/scripts/release-notes/format-github-release-notes.cjs +256 -0
  328. package/scripts/release-tarball-smoke.cjs +9 -9
  329. package/scripts/run-tests.cjs +34 -2
  330. package/scripts/strip-prose-atrefs.cjs +2 -2
  331. package/scripts/sync-runtime-launcher.cjs +2 -2
  332. package/scripts/verify-npm-publish.cjs +252 -0
  333. package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
  334. package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
  335. package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
  336. package/get-shit-done/bin/lib/artifacts.cjs +0 -53
  337. package/get-shit-done/bin/lib/audit.cjs +0 -755
  338. package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
  339. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
  340. package/get-shit-done/bin/lib/clock.cjs +0 -96
  341. package/get-shit-done/bin/lib/clusters.cjs +0 -135
  342. package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
  343. package/get-shit-done/bin/lib/command-aliases.cjs +0 -815
  344. package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
  345. package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
  346. package/get-shit-done/bin/lib/commands.cjs +0 -1188
  347. package/get-shit-done/bin/lib/config-schema.cjs +0 -31
  348. package/get-shit-done/bin/lib/config.cjs +0 -728
  349. package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
  350. package/get-shit-done/bin/lib/core.cjs +0 -2121
  351. package/get-shit-done/bin/lib/docs.cjs +0 -270
  352. package/get-shit-done/bin/lib/drift.cjs +0 -388
  353. package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
  354. package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
  355. package/get-shit-done/bin/lib/gap-checker.cjs +0 -205
  356. package/get-shit-done/bin/lib/graphify.cjs +0 -592
  357. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
  358. package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
  359. package/get-shit-done/bin/lib/init.cjs +0 -2112
  360. package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
  361. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
  362. package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -354
  363. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
  364. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
  365. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
  366. package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
  367. package/get-shit-done/bin/lib/intel.cjs +0 -708
  368. package/get-shit-done/bin/lib/learnings.cjs +0 -421
  369. package/get-shit-done/bin/lib/milestone.cjs +0 -314
  370. package/get-shit-done/bin/lib/model-catalog.cjs +0 -212
  371. package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
  372. package/get-shit-done/bin/lib/observability/event.cjs +0 -82
  373. package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
  374. package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
  375. package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -80
  376. package/get-shit-done/bin/lib/phase.cjs +0 -1607
  377. package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
  378. package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
  379. package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
  380. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  381. package/get-shit-done/bin/lib/project-root.cjs +0 -112
  382. package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
  383. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -125
  384. package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -28
  385. package/get-shit-done/bin/lib/roadmap.cjs +0 -650
  386. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
  387. package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
  388. package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
  389. package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
  390. package/get-shit-done/bin/lib/secrets.cjs +0 -32
  391. package/get-shit-done/bin/lib/security.cjs +0 -600
  392. package/get-shit-done/bin/lib/semver-compare.cjs +0 -35
  393. package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -500
  394. package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
  395. package/get-shit-done/bin/lib/state.cjs +0 -2038
  396. package/get-shit-done/bin/lib/surface.cjs +0 -470
  397. package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
  398. package/get-shit-done/bin/lib/template.cjs +0 -228
  399. package/get-shit-done/bin/lib/uat.cjs +0 -289
  400. package/get-shit-done/bin/lib/update-context.cjs +0 -209
  401. package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
  402. package/get-shit-done/bin/lib/validate.cjs +0 -92
  403. package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
  404. package/get-shit-done/bin/lib/verify.cjs +0 -1511
  405. package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
  406. package/get-shit-done/bin/lib/workstream.cjs +0 -389
  407. package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
  408. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
  409. package/scripts/lint-no-source-grep-extras.cjs +0 -81
  410. package/scripts/lint-no-source-grep.cjs +0 -174
  411. package/scripts/lint-shared-module-handsync.cjs +0 -388
  412. package/scripts/shared-module-handsync-allowlist.json +0 -183
  413. /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
  414. /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
  415. /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
  416. /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
  417. /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
  418. /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
  419. /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
  420. /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
  421. /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
  422. /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
  423. /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
  424. /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
  425. /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
  426. /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
  427. /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
  428. /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
  429. /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
  430. /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
  431. /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
  432. /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
  433. /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
  434. /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
  435. /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
  436. /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
  437. /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
  438. /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
  439. /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
  440. /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
  441. /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
  442. /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
  443. /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
  444. /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
  445. /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
  446. /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
  447. /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
  448. /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
  449. /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
  450. /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
  451. /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
  452. /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
  453. /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
  454. /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
  455. /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
  456. /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
  457. /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
  458. /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
  459. /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
  460. /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
  461. /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
  462. /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
  463. /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
  464. /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
  465. /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
  466. /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
  467. /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
  468. /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
  469. /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
  470. /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
  471. /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
  472. /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
  473. /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
  474. /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
  475. /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
  476. /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
  477. /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
  478. /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
  479. /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
  480. /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
  481. /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
  482. /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
  483. /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
  484. /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
  485. /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
  486. /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
  487. /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
  488. /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
  489. /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
  490. /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
  491. /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
  492. /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
  493. /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
  494. /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
  495. /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
  496. /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
  497. /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
  498. /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
  499. /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
  500. /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
  501. /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
  502. /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
  503. /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
  504. /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
  505. /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
  506. /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
  507. /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
  508. /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
  509. /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
  510. /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
  511. /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
  512. /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
  513. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
  514. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
  515. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
  516. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
  517. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
  518. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
  519. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
  520. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
  521. /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
  522. /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
  523. /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
  524. /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
  525. /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
  526. /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
  527. /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
  528. /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
  529. /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
  530. /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
  531. /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
  532. /package/{get-shit-done → gsd-core}/workflows/session-report.md +0 -0
@@ -0,0 +1,254 @@
1
+ 'use strict';
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ /**
6
+ * Runtime artifact layout module — resolves the artifact directory shapes
7
+ * (commands, agents, skills) for each supported runtime.
8
+ *
9
+ * grok is intentionally absent: it is in runtime-homes.cjs but not wired
10
+ * here. The TypeError on unknown runtime is the loud-fail signal that a
11
+ * runtime was added to the homes list without a layout entry.
12
+ *
13
+ * ADR-457 build-at-publish: the hand-written bin/lib/runtime-artifact-layout.cjs
14
+ * collapsed to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
15
+ * from the prior hand-written .cjs; only types are added.
16
+ */
17
+ const node_path_1 = __importDefault(require("node:path"));
18
+ const node_fs_1 = __importDefault(require("node:fs"));
19
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
20
+ const installProfiles = require("./install-profiles.cjs");
21
+ const { stageSkillsForProfile, stageAgentsForProfile, stageSkillsForRuntimeAsSkills, } = installProfiles;
22
+ // In .cts (CommonJS output) files, `require` is available as a global.
23
+ const _require = require;
24
+ /**
25
+ * Load bin/install.js exports in a test-safe way.
26
+ * Sets GSD_TEST_MODE only for the duration of the require() call and only if
27
+ * it was not already set, restoring the original value in a finally block so
28
+ * the module-level environment is never permanently mutated.
29
+ */
30
+ function loadInstallExports() {
31
+ const savedTestMode = process.env['GSD_TEST_MODE'];
32
+ if (savedTestMode === undefined)
33
+ process.env['GSD_TEST_MODE'] = '1';
34
+ try {
35
+ return _require('../../../bin/install.js');
36
+ }
37
+ finally {
38
+ if (savedTestMode === undefined)
39
+ delete process.env['GSD_TEST_MODE'];
40
+ else
41
+ process.env['GSD_TEST_MODE'] = savedTestMode;
42
+ }
43
+ }
44
+ /** Cache after first successful load. */
45
+ let _installExports = null;
46
+ function getInstallExports() {
47
+ if (!_installExports)
48
+ _installExports = loadInstallExports();
49
+ return _installExports;
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Source root finders
53
+ // ---------------------------------------------------------------------------
54
+ /**
55
+ * Locate the GSD commands/gsd source directory.
56
+ *
57
+ * Resolution order:
58
+ * 1. If runtimeConfigDir provided, check <runtimeConfigDir>/.gsd-source marker.
59
+ * 2. Walk up from __dirname using path.dirname (no literal .. segments).
60
+ * 3. Throw a descriptive error if neither succeeds.
61
+ */
62
+ function findInstallSourceRoot(runtimeConfigDir) {
63
+ // Step 1: marker check
64
+ if (runtimeConfigDir) {
65
+ const markerPath = node_path_1.default.join(runtimeConfigDir, '.gsd-source');
66
+ if (node_fs_1.default.existsSync(markerPath)) {
67
+ try {
68
+ const src = node_fs_1.default.readFileSync(markerPath, 'utf8').trim();
69
+ if (src && node_fs_1.default.existsSync(src))
70
+ return src;
71
+ }
72
+ catch { /* fall through */ }
73
+ }
74
+ }
75
+ // Step 2: walk up from __dirname
76
+ let dir = __dirname;
77
+ for (let i = 0; i < 6; i++) {
78
+ const candidate = node_path_1.default.join(dir, 'commands', 'gsd');
79
+ if (node_fs_1.default.existsSync(candidate))
80
+ return candidate;
81
+ const parent = node_path_1.default.dirname(dir);
82
+ if (parent === dir)
83
+ break;
84
+ dir = parent;
85
+ }
86
+ throw new Error(`findInstallSourceRoot: could not locate commands/gsd from ${__dirname}`);
87
+ }
88
+ /**
89
+ * Locate the GSD agents source directory.
90
+ *
91
+ * Resolution order:
92
+ * 1. If runtimeConfigDir provided, check <runtimeConfigDir>/.gsd-source marker.
93
+ * 2. Walk up from __dirname using path.dirname (no literal .. segments).
94
+ * 3. Throw a descriptive error if neither succeeds.
95
+ */
96
+ function findAgentsSourceRoot(runtimeConfigDir) {
97
+ // Step 1: marker check
98
+ if (runtimeConfigDir) {
99
+ const markerPath = node_path_1.default.join(runtimeConfigDir, '.gsd-source');
100
+ if (node_fs_1.default.existsSync(markerPath)) {
101
+ try {
102
+ const src = node_fs_1.default.readFileSync(markerPath, 'utf8').trim();
103
+ if (src && node_fs_1.default.existsSync(src)) {
104
+ // Marker points to commands/gsd; agents/ is a sibling of commands/
105
+ const agentsCandidate = node_path_1.default.resolve(node_path_1.default.dirname(src), '..', 'agents');
106
+ if (node_fs_1.default.existsSync(agentsCandidate))
107
+ return agentsCandidate;
108
+ }
109
+ }
110
+ catch { /* fall through */ }
111
+ }
112
+ }
113
+ // Step 2: walk up from __dirname
114
+ let dir = __dirname;
115
+ for (let i = 0; i < 6; i++) {
116
+ const candidate = node_path_1.default.join(dir, 'agents');
117
+ if (node_fs_1.default.existsSync(candidate))
118
+ return candidate;
119
+ const parent = node_path_1.default.dirname(dir);
120
+ if (parent === dir)
121
+ break;
122
+ dir = parent;
123
+ }
124
+ throw new Error(`findAgentsSourceRoot: could not locate agents/ from ${__dirname}`);
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Allowlisted runtimes
128
+ // ---------------------------------------------------------------------------
129
+ const ALLOWED_RUNTIMES = new Set([
130
+ 'claude', 'cursor', 'gemini', 'codex', 'copilot', 'antigravity',
131
+ 'windsurf', 'augment', 'trae', 'qwen', 'hermes', 'codebuddy',
132
+ 'cline', 'opencode', 'kilo',
133
+ ]);
134
+ // ---------------------------------------------------------------------------
135
+ // Layout table builders
136
+ // ---------------------------------------------------------------------------
137
+ function commandsKind(destSubpath, prefix, configDir) {
138
+ return {
139
+ kind: 'commands',
140
+ destSubpath,
141
+ prefix,
142
+ stage: (resolved) => stageSkillsForProfile(findInstallSourceRoot(configDir), resolved),
143
+ };
144
+ }
145
+ function agentsKind(destSubpath, prefix, configDir) {
146
+ return {
147
+ kind: 'agents',
148
+ destSubpath,
149
+ prefix,
150
+ stage: (resolved) => stageAgentsForProfile(findAgentsSourceRoot(configDir), resolved),
151
+ };
152
+ }
153
+ /**
154
+ * Build a skills kind descriptor.
155
+ *
156
+ * @param destSubpath
157
+ * @param prefix
158
+ * @param converterName name of converter function in bin/install.js exports
159
+ * @param runtime canonical runtime ID (gates Hermes/Qwen branding in converter)
160
+ * @param configDir runtime config dir (for .gsd-source marker resolution)
161
+ */
162
+ function skillsKind(destSubpath, prefix, converterName, runtime, configDir) {
163
+ return {
164
+ kind: 'skills',
165
+ destSubpath,
166
+ prefix,
167
+ stage: (resolved) => {
168
+ const installExports = getInstallExports();
169
+ const realConverter = installExports[converterName];
170
+ // Compute cmdNames once per stage call for performance (#3583).
171
+ // Extra args are ignored by converters that don't need runtime/cmdNames.
172
+ const cmdNames = installExports.readGsdCommandNames();
173
+ const wrappedConverter = (content, skillName) => realConverter(content, skillName, runtime, cmdNames);
174
+ return stageSkillsForRuntimeAsSkills(findInstallSourceRoot(configDir), resolved, wrappedConverter, prefix);
175
+ },
176
+ };
177
+ }
178
+ // ---------------------------------------------------------------------------
179
+ // Public API
180
+ // ---------------------------------------------------------------------------
181
+ /**
182
+ * Resolve the artifact layout for a given runtime and config directory.
183
+ */
184
+ function resolveRuntimeArtifactLayout(runtime, configDir, scope = 'global') {
185
+ if (typeof configDir !== 'string' || configDir === '') {
186
+ throw new TypeError('configDir must be a non-empty string');
187
+ }
188
+ if (scope !== 'local' && scope !== 'global') {
189
+ throw new TypeError('scope must be "local" or "global"');
190
+ }
191
+ if (!ALLOWED_RUNTIMES.has(runtime)) {
192
+ throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
193
+ }
194
+ let kinds;
195
+ switch (runtime) {
196
+ case 'claude':
197
+ if (scope === 'local') {
198
+ kinds = [
199
+ commandsKind('commands/gsd', 'gsd-', configDir),
200
+ agentsKind('agents', 'gsd-', configDir),
201
+ ];
202
+ }
203
+ else {
204
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClaudeSkill', 'claude', configDir)];
205
+ }
206
+ break;
207
+ case 'cursor':
208
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCursorSkill', 'cursor', configDir)];
209
+ break;
210
+ case 'gemini':
211
+ kinds = [commandsKind('commands/gsd', 'gsd-', configDir)];
212
+ break;
213
+ case 'codex':
214
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCodexSkill', 'codex', configDir)];
215
+ break;
216
+ case 'copilot':
217
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCopilotSkill', 'copilot', configDir)];
218
+ break;
219
+ case 'antigravity':
220
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToAntigravitySkill', 'antigravity', configDir)];
221
+ break;
222
+ case 'windsurf':
223
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToWindsurfSkill', 'windsurf', configDir)];
224
+ break;
225
+ case 'augment':
226
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToAugmentSkill', 'augment', configDir)];
227
+ break;
228
+ case 'trae':
229
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToTraeSkill', 'trae', configDir)];
230
+ break;
231
+ case 'qwen':
232
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClaudeSkill', 'qwen', configDir)];
233
+ break;
234
+ case 'hermes':
235
+ kinds = [skillsKind('skills/gsd', '', 'convertClaudeCommandToClaudeSkill', 'hermes', configDir)];
236
+ break;
237
+ case 'codebuddy':
238
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCodebuddySkill', 'codebuddy', configDir)];
239
+ break;
240
+ case 'cline':
241
+ kinds = [];
242
+ break;
243
+ case 'opencode':
244
+ kinds = [commandsKind('command', 'gsd-', configDir)];
245
+ break;
246
+ case 'kilo':
247
+ kinds = [commandsKind('command', 'gsd-', configDir)];
248
+ break;
249
+ default:
250
+ throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
251
+ }
252
+ return { runtime, configDir, kinds };
253
+ }
254
+ module.exports = { resolveRuntimeArtifactLayout, findInstallSourceRoot };
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ /**
3
+ * runtime-homes.cts — canonical runtime → global config/skills directory mapping.
4
+ *
5
+ * Single source of truth for resolving the global config base directory and
6
+ * the correct global skills directory for every GSD-supported runtime.
7
+ *
8
+ * ADR-457 build-at-publish: the hand-written bin/lib/runtime-homes.cjs
9
+ * collapsed to a TypeScript source of truth. Behaviour is preserved
10
+ * byte-for-behaviour from the prior hand-written .cjs; only types are added.
11
+ *
12
+ * Runtime-specific notes:
13
+ * hermes — GSD skills nest under skills/gsd/<skillName>/ (not the flat
14
+ * skills/<skillName>/ layout used by all other runtimes).
15
+ * cline — Rules-based; commands are embedded in .clinerules. Cline does
16
+ * not use a skills/ directory. getGlobalSkillDir() returns null
17
+ * for cline so the caller can emit an appropriate warning.
18
+ */
19
+ var __importDefault = (this && this.__importDefault) || function (mod) {
20
+ return (mod && mod.__esModule) ? mod : { "default": mod };
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.resolveAntigravityGlobalDir = resolveAntigravityGlobalDir;
24
+ exports.getGlobalConfigDir = getGlobalConfigDir;
25
+ exports.getGlobalSkillsBase = getGlobalSkillsBase;
26
+ exports.getGlobalSkillDir = getGlobalSkillDir;
27
+ exports.getGlobalSkillDisplayPath = getGlobalSkillDisplayPath;
28
+ const node_os_1 = __importDefault(require("node:os"));
29
+ const node_path_1 = __importDefault(require("node:path"));
30
+ const node_fs_1 = __importDefault(require("node:fs"));
31
+ /**
32
+ * Expand a leading ~ to os.homedir().
33
+ */
34
+ function expandTilde(p) {
35
+ if (!p)
36
+ return p;
37
+ if (p.startsWith('~/') || p === '~')
38
+ return node_path_1.default.join(node_os_1.default.homedir(), p.slice(1));
39
+ return p;
40
+ }
41
+ /**
42
+ * Resolve Antigravity global config dir across 1.x and 2.x layouts.
43
+ */
44
+ function resolveAntigravityGlobalDir(opts = {}) {
45
+ const env = opts.env ?? process.env;
46
+ const home = opts.home ?? node_os_1.default.homedir();
47
+ const existsSyncFn = opts.existsSync ?? node_fs_1.default.existsSync;
48
+ if (env['ANTIGRAVITY_CONFIG_DIR'])
49
+ return expandTilde(env['ANTIGRAVITY_CONFIG_DIR']);
50
+ const base = node_path_1.default.join(home, '.gemini');
51
+ const candidates = [
52
+ node_path_1.default.join(base, 'antigravity'),
53
+ node_path_1.default.join(base, 'antigravity-ide'),
54
+ node_path_1.default.join(base, 'antigravity-cli'),
55
+ ];
56
+ for (const candidate of candidates) {
57
+ if (existsSyncFn(candidate))
58
+ return candidate;
59
+ }
60
+ return node_path_1.default.join(base, 'antigravity');
61
+ }
62
+ /**
63
+ * Return the global config base directory for the given runtime.
64
+ * Respects the same env-var overrides as bin/install.js getGlobalDir().
65
+ */
66
+ function getGlobalConfigDir(runtime) {
67
+ const home = node_os_1.default.homedir();
68
+ const env = process.env;
69
+ switch (runtime) {
70
+ // ── Claude Code ──────────────────────────────────────────────────────────
71
+ case 'claude':
72
+ return env['CLAUDE_CONFIG_DIR'] ? expandTilde(env['CLAUDE_CONFIG_DIR']) : node_path_1.default.join(home, '.claude');
73
+ // ── Cursor ───────────────────────────────────────────────────────────────
74
+ case 'cursor':
75
+ return env['CURSOR_CONFIG_DIR'] ? expandTilde(env['CURSOR_CONFIG_DIR']) : node_path_1.default.join(home, '.cursor');
76
+ // ── Gemini CLI ───────────────────────────────────────────────────────────
77
+ case 'gemini':
78
+ return env['GEMINI_CONFIG_DIR'] ? expandTilde(env['GEMINI_CONFIG_DIR']) : node_path_1.default.join(home, '.gemini');
79
+ // ── Codex ────────────────────────────────────────────────────────────────
80
+ case 'codex':
81
+ return env['CODEX_HOME'] ? expandTilde(env['CODEX_HOME']) : node_path_1.default.join(home, '.codex');
82
+ // ── Grok Build ───────────────────────────────────────────────────────────
83
+ case 'grok':
84
+ return env['GROK_AGENTS_HOME'] ? expandTilde(env['GROK_AGENTS_HOME']) : node_path_1.default.join(home, '.agents');
85
+ // ── Copilot (VS Code) ────────────────────────────────────────────────────
86
+ case 'copilot':
87
+ return env['COPILOT_CONFIG_DIR'] ? expandTilde(env['COPILOT_CONFIG_DIR']) : node_path_1.default.join(home, '.copilot');
88
+ // ── Antigravity ──────────────────────────────────────────────────────────
89
+ case 'antigravity':
90
+ return resolveAntigravityGlobalDir({ env, home });
91
+ // ── Windsurf ─────────────────────────────────────────────────────────────
92
+ case 'windsurf':
93
+ return env['WINDSURF_CONFIG_DIR']
94
+ ? expandTilde(env['WINDSURF_CONFIG_DIR'])
95
+ : node_path_1.default.join(home, '.codeium', 'windsurf');
96
+ // ── Augment ──────────────────────────────────────────────────────────────
97
+ case 'augment':
98
+ return env['AUGMENT_CONFIG_DIR'] ? expandTilde(env['AUGMENT_CONFIG_DIR']) : node_path_1.default.join(home, '.augment');
99
+ // ── Trae ─────────────────────────────────────────────────────────────────
100
+ case 'trae':
101
+ return env['TRAE_CONFIG_DIR'] ? expandTilde(env['TRAE_CONFIG_DIR']) : node_path_1.default.join(home, '.trae');
102
+ // ── Qwen Code ────────────────────────────────────────────────────────────
103
+ case 'qwen':
104
+ return env['QWEN_CONFIG_DIR'] ? expandTilde(env['QWEN_CONFIG_DIR']) : node_path_1.default.join(home, '.qwen');
105
+ // ── Hermes Agent ─────────────────────────────────────────────────────────
106
+ case 'hermes':
107
+ return env['HERMES_HOME'] ? expandTilde(env['HERMES_HOME']) : node_path_1.default.join(home, '.hermes');
108
+ // ── CodeBuddy ────────────────────────────────────────────────────────────
109
+ case 'codebuddy':
110
+ return env['CODEBUDDY_CONFIG_DIR'] ? expandTilde(env['CODEBUDDY_CONFIG_DIR']) : node_path_1.default.join(home, '.codebuddy');
111
+ // ── Cline ────────────────────────────────────────────────────────────────
112
+ case 'cline':
113
+ return env['CLINE_CONFIG_DIR'] ? expandTilde(env['CLINE_CONFIG_DIR']) : node_path_1.default.join(home, '.cline');
114
+ // ── OpenCode (XDG) ───────────────────────────────────────────────────────
115
+ case 'opencode': {
116
+ if (env['OPENCODE_CONFIG_DIR'])
117
+ return expandTilde(env['OPENCODE_CONFIG_DIR']);
118
+ if (env['XDG_CONFIG_HOME'])
119
+ return node_path_1.default.join(expandTilde(env['XDG_CONFIG_HOME']), 'opencode');
120
+ return node_path_1.default.join(home, '.config', 'opencode');
121
+ }
122
+ // ── Kilo (XDG) ───────────────────────────────────────────────────────────
123
+ case 'kilo': {
124
+ if (env['KILO_CONFIG_DIR'])
125
+ return expandTilde(env['KILO_CONFIG_DIR']);
126
+ if (env['XDG_CONFIG_HOME'])
127
+ return node_path_1.default.join(expandTilde(env['XDG_CONFIG_HOME']), 'kilo');
128
+ return node_path_1.default.join(home, '.config', 'kilo');
129
+ }
130
+ // ── Default (Claude fallback) ─────────────────────────────────────────────
131
+ default:
132
+ return env['CLAUDE_CONFIG_DIR'] ? expandTilde(env['CLAUDE_CONFIG_DIR']) : node_path_1.default.join(home, '.claude');
133
+ }
134
+ }
135
+ /**
136
+ * Return the global skills base directory for the given runtime.
137
+ * Most runtimes: <configDir>/skills
138
+ * Hermes: <configDir>/skills/gsd (nested category layout — #2841)
139
+ * Cline: null (rules-based, no skills directory)
140
+ */
141
+ function getGlobalSkillsBase(runtime) {
142
+ if (runtime === 'cline')
143
+ return null;
144
+ const configDir = getGlobalConfigDir(runtime);
145
+ if (runtime === 'hermes')
146
+ return node_path_1.default.join(configDir, 'skills', 'gsd');
147
+ return node_path_1.default.join(configDir, 'skills');
148
+ }
149
+ /**
150
+ * Return the full path to a specific skill's directory for the given runtime.
151
+ * Returns null for runtimes that don't use a skills directory (cline).
152
+ */
153
+ function getGlobalSkillDir(runtime, skillName) {
154
+ const base = getGlobalSkillsBase(runtime);
155
+ if (base === null)
156
+ return null;
157
+ return node_path_1.default.join(base, skillName);
158
+ }
159
+ /**
160
+ * Return a human-readable display path for a global skill (for log messages).
161
+ */
162
+ function getGlobalSkillDisplayPath(runtime, skillName) {
163
+ const dir = getGlobalSkillDir(runtime, skillName);
164
+ if (!dir)
165
+ return `(${runtime} does not use a skills directory)`;
166
+ // Replace homedir prefix with ~ for readability
167
+ const home = node_os_1.default.homedir();
168
+ return dir.startsWith(home) ? '~' + dir.slice(home.length) : dir;
169
+ }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ /**
3
+ * Runtime name policy — alias resolution and canonicalization for GSD runtime
4
+ * identifiers (ADR-457 build-at-publish: the hand-written
5
+ * bin/lib/runtime-name-policy.cjs collapsed to a TypeScript source of truth).
6
+ * Behaviour is preserved byte-for-behaviour from the prior hand-written .cjs;
7
+ * only types are added.
8
+ *
9
+ * Group C cross-import candidate: no bin/lib sibling dependencies; only
10
+ * node:fs and node:path. Once this module is migrated, runtime-slash.cjs
11
+ * (which imports runtime-name-policy.cjs) becomes the first true cross-import
12
+ * proof candidate.
13
+ */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.canonicalizeRuntimeName = canonicalizeRuntimeName;
19
+ exports.resolveRuntimeNameFromCandidates = resolveRuntimeNameFromCandidates;
20
+ const node_fs_1 = __importDefault(require("node:fs"));
21
+ const node_path_1 = __importDefault(require("node:path"));
22
+ const FALLBACK_ALIASES = {
23
+ claude: ['claude', 'claude-code', 'claude-cli'],
24
+ opencode: ['opencode', 'open-code', 'opencode-cli'],
25
+ kilo: ['kilo', 'kilo-cli'],
26
+ gemini: ['gemini', 'gemini-cli', 'gemini-code'],
27
+ codex: ['codex', 'codex-app', 'codex-cli', 'codex_desktop', 'codex-desktop'],
28
+ copilot: ['copilot', 'copilot-cli', 'github-copilot'],
29
+ antigravity: ['antigravity', 'antigravity-cli', 'antigravity-agent'],
30
+ cursor: ['cursor', 'cursor-cli', 'cursor-nightly'],
31
+ windsurf: ['windsurf', 'windsurf-cli', 'windsurf-next'],
32
+ augment: ['augment', 'augment-code', 'augment-cli'],
33
+ trae: ['trae', 'trae-cli'],
34
+ qwen: ['qwen', 'qwen-code', 'qwen-cli'],
35
+ hermes: ['hermes', 'hermes-agent', 'hermes-cli'],
36
+ codebuddy: ['codebuddy', 'codebuddy-cli'],
37
+ cline: ['cline', 'cline-cli'],
38
+ };
39
+ function normalizeRuntimeToken(value) {
40
+ return String(value).trim().toLowerCase().replace(/[_\s]+/g, '-');
41
+ }
42
+ function loadAliasManifest() {
43
+ const manifestCandidates = [
44
+ node_path_1.default.resolve(__dirname, '..', 'shared', 'runtime-aliases.manifest.json'),
45
+ node_path_1.default.resolve(__dirname, '../../../sdk/shared/runtime-aliases.manifest.json'),
46
+ ];
47
+ for (const manifestPath of manifestCandidates) {
48
+ try {
49
+ const parsed = JSON.parse(node_fs_1.default.readFileSync(manifestPath, 'utf8'));
50
+ if (parsed && typeof parsed === 'object')
51
+ return parsed;
52
+ }
53
+ catch {
54
+ // Try next candidate.
55
+ }
56
+ }
57
+ return { ...FALLBACK_ALIASES };
58
+ }
59
+ const aliasManifest = loadAliasManifest();
60
+ const aliasToCanonical = new Map();
61
+ for (const [canonical, aliases] of Object.entries(aliasManifest)) {
62
+ if (typeof canonical !== 'string' || !Array.isArray(aliases))
63
+ continue;
64
+ aliasToCanonical.set(normalizeRuntimeToken(canonical), normalizeRuntimeToken(canonical));
65
+ for (const alias of aliases) {
66
+ if (typeof alias !== 'string')
67
+ continue;
68
+ aliasToCanonical.set(normalizeRuntimeToken(alias), normalizeRuntimeToken(canonical));
69
+ }
70
+ }
71
+ function canonicalizeRuntimeName(value) {
72
+ if (typeof value !== 'string')
73
+ return null;
74
+ return aliasToCanonical.get(normalizeRuntimeToken(value)) || null;
75
+ }
76
+ /**
77
+ * Resolve runtime from a precedence list of candidate values.
78
+ *
79
+ * - First non-empty string candidate wins.
80
+ * - Known aliases are canonicalized (codex-cli -> codex).
81
+ * - Unknown values are normalized and returned (future-runtime tolerance).
82
+ *
83
+ * @param candidates - string candidates in precedence order
84
+ * @returns the resolved runtime name, or null if no valid candidate
85
+ */
86
+ function resolveRuntimeNameFromCandidates(...candidates) {
87
+ for (const candidate of candidates) {
88
+ if (typeof candidate !== 'string')
89
+ continue;
90
+ const normalized = normalizeRuntimeToken(candidate);
91
+ if (!normalized)
92
+ continue;
93
+ return canonicalizeRuntimeName(normalized) || normalized;
94
+ }
95
+ return null;
96
+ }
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * runtime-slash.cts — single source of truth for emitting GSD slash-command
4
+ * references in user-facing runtime output (recommended-actions JSON, persisted
5
+ * ROADMAP.md entries, verify/validate fix hints, error messages, etc.).
6
+ *
7
+ * ADR-457 build-at-publish: the hand-written bin/lib/runtime-slash.cjs collapsed
8
+ * to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour from
9
+ * the prior hand-written .cjs; only types are added.
10
+ *
11
+ * Background: #2808 unified all GSD skill installs to register under the hyphen
12
+ * form (`name: gsd-<cmd>`). The legacy colon form `/gsd:<cmd>` is no longer
13
+ * routable by Claude Code skill installs, but ~50 runtime emissions in
14
+ * bin/lib/*.cjs still hardcoded it (#3584). Codex installs need the shell-var
15
+ * `$gsd-<cmd>` form. This module is the only place the runtime should decide
16
+ * which shape to emit.
17
+ *
18
+ * - codex: $gsd-<cmd> (shell-var syntax)
19
+ * - claude, cursor, opencode, kilo, etc.: /gsd-<cmd>
20
+ *
21
+ * The colon form is never emitted.
22
+ *
23
+ * Cross-import proof candidate (ADR-457): this is the first TS source that
24
+ * imports a sibling TS-migrated module. The import specifier uses the .cjs
25
+ * extension per nodenext convention; tsc resolves it to src/runtime-name-policy.cts.
26
+ */
27
+ var __importDefault = (this && this.__importDefault) || function (mod) {
28
+ return (mod && mod.__esModule) ? mod : { "default": mod };
29
+ };
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.formatGsdSlash = formatGsdSlash;
32
+ exports.resolveRuntime = resolveRuntime;
33
+ exports.formatGsdSlashFor = formatGsdSlashFor;
34
+ const node_fs_1 = __importDefault(require("node:fs"));
35
+ const node_path_1 = __importDefault(require("node:path"));
36
+ const runtime_name_policy_cjs_1 = require("./runtime-name-policy.cjs");
37
+ function formatGsdSlash(commandName, runtime) {
38
+ if (typeof commandName !== 'string')
39
+ return commandName;
40
+ if (commandName === '')
41
+ return commandName;
42
+ // Strip any existing leading prefix so the helper is idempotent and accepts
43
+ // both legacy `/gsd:<name>` and canonical hyphen-form input (plus the bare
44
+ // `gsd:<name>` shorthand and codex `$gsd-<name>` shell-var input).
45
+ const stripped = commandName.replace(/^[/$]?gsd[-:]/i, '');
46
+ // If the regex matched nothing (no prefix), the input is already a bare name.
47
+ const bare = stripped === commandName ? commandName : stripped;
48
+ // Defensive: a degenerate input like `/gsd:`, `gsd-`, or whitespace-only
49
+ // normalizes to empty. Returning the original colon-form would re-emit the
50
+ // deprecated shape that this module exists to suppress (#3584). Return an
51
+ // empty string so callers see "no command" rather than the broken input.
52
+ if (bare === '' || bare.trim() === '')
53
+ return '';
54
+ // Split on the first whitespace so only the command token is rewritten —
55
+ // anything after the first space is caller-supplied arguments (phase
56
+ // numbers, --flags, --paths C:\\Users\\Me, etc.) that must round-trip
57
+ // untouched. Codex lowercases only the command token; preserving the
58
+ // argument tail prevents path/flag corruption on case-sensitive systems.
59
+ const wsMatch = bare.match(/^(\S+)(\s[\s\S]*)?$/);
60
+ const token = wsMatch ? wsMatch[1] : bare;
61
+ const tail = wsMatch && wsMatch[2] ? wsMatch[2] : '';
62
+ const runtimeText = (typeof runtime === 'string' && runtime ? runtime : 'claude').toLowerCase();
63
+ const rt = (0, runtime_name_policy_cjs_1.canonicalizeRuntimeName)(runtimeText) || runtimeText;
64
+ if (rt === 'codex') {
65
+ // Codex skills are invoked as $gsd-<cmd> (shell-var syntax). The command
66
+ // token is lowercased because shell-var identifiers are conventionally
67
+ // lowercase; matches the convertCodexSlash() projection in bin/install.js.
68
+ return `$gsd-${token.toLowerCase()}${tail}`;
69
+ }
70
+ return `/gsd-${token}${tail}`;
71
+ }
72
+ /**
73
+ * Resolve the effective runtime for a project directory.
74
+ *
75
+ * process.env.GSD_RUNTIME > config.runtime > 'claude'
76
+ *
77
+ * Mirrors the precedence already used by profile-output.cjs and the rest of
78
+ * the runtime resolution chain. Returns a lowercased string so downstream
79
+ * comparisons can be case-blind.
80
+ *
81
+ * @param projectDir - path to the project directory, or null/undefined
82
+ * @returns the resolved runtime name
83
+ */
84
+ function resolveRuntime(projectDir) {
85
+ const envRuntime = (0, runtime_name_policy_cjs_1.resolveRuntimeNameFromCandidates)(process.env['GSD_RUNTIME']);
86
+ if (envRuntime)
87
+ return envRuntime;
88
+ if (projectDir) {
89
+ try {
90
+ // Read config.json directly (not via loadConfig). loadConfig has a side
91
+ // effect of normalizing and re-writing legacy keys back to disk, which
92
+ // would mutate the project file just to read the runtime name. We only
93
+ // need the literal `runtime:` value, so a plain JSON read is sufficient
94
+ // and side-effect-free.
95
+ const configPath = node_path_1.default.join(projectDir, '.planning', 'config.json');
96
+ if (node_fs_1.default.existsSync(configPath)) {
97
+ const raw = node_fs_1.default.readFileSync(configPath, 'utf-8');
98
+ const parsed = JSON.parse(raw);
99
+ if (parsed && typeof parsed === 'object' && 'runtime' in parsed) {
100
+ const configRuntime = (0, runtime_name_policy_cjs_1.resolveRuntimeNameFromCandidates)(parsed['runtime']);
101
+ if (configRuntime)
102
+ return configRuntime;
103
+ }
104
+ }
105
+ }
106
+ catch {
107
+ // Fall through to default — a missing/broken config must not crash
108
+ // runtime output formatting.
109
+ }
110
+ }
111
+ return 'claude';
112
+ }
113
+ /**
114
+ * Convenience: format using the runtime resolved from a project directory.
115
+ * Equivalent to `formatGsdSlash(name, resolveRuntime(projectDir))`.
116
+ */
117
+ function formatGsdSlashFor(projectDir, commandName) {
118
+ return formatGsdSlash(commandName, resolveRuntime(projectDir));
119
+ }