@opengsd/gsd-core 1.2.0-rc.1

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 (503) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja-JP.md +870 -0
  3. package/README.ko-KR.md +861 -0
  4. package/README.md +301 -0
  5. package/README.pt-BR.md +492 -0
  6. package/README.zh-CN.md +842 -0
  7. package/agents/gsd-advisor-researcher.md +127 -0
  8. package/agents/gsd-ai-researcher.md +133 -0
  9. package/agents/gsd-assumptions-analyzer.md +105 -0
  10. package/agents/gsd-code-fixer.md +668 -0
  11. package/agents/gsd-code-reviewer.md +387 -0
  12. package/agents/gsd-codebase-mapper.md +853 -0
  13. package/agents/gsd-debug-session-manager.md +314 -0
  14. package/agents/gsd-debugger.md +1452 -0
  15. package/agents/gsd-doc-classifier.md +168 -0
  16. package/agents/gsd-doc-synthesizer.md +204 -0
  17. package/agents/gsd-doc-verifier.md +217 -0
  18. package/agents/gsd-doc-writer.md +615 -0
  19. package/agents/gsd-domain-researcher.md +153 -0
  20. package/agents/gsd-eval-auditor.md +191 -0
  21. package/agents/gsd-eval-planner.md +154 -0
  22. package/agents/gsd-executor.md +772 -0
  23. package/agents/gsd-framework-selector.md +160 -0
  24. package/agents/gsd-integration-checker.md +470 -0
  25. package/agents/gsd-intel-updater.md +342 -0
  26. package/agents/gsd-nyquist-auditor.md +203 -0
  27. package/agents/gsd-pattern-mapper.md +335 -0
  28. package/agents/gsd-phase-researcher.md +928 -0
  29. package/agents/gsd-plan-checker.md +978 -0
  30. package/agents/gsd-planner.md +1218 -0
  31. package/agents/gsd-project-researcher.md +677 -0
  32. package/agents/gsd-research-synthesizer.md +255 -0
  33. package/agents/gsd-roadmapper.md +688 -0
  34. package/agents/gsd-security-auditor.md +155 -0
  35. package/agents/gsd-ui-auditor.md +495 -0
  36. package/agents/gsd-ui-checker.md +309 -0
  37. package/agents/gsd-ui-researcher.md +380 -0
  38. package/agents/gsd-user-profiler.md +171 -0
  39. package/agents/gsd-verifier.md +917 -0
  40. package/bin/install.js +10936 -0
  41. package/bin/lib/ui-safety-gate.cjs +107 -0
  42. package/commands/gsd/add-tests.md +42 -0
  43. package/commands/gsd/ai-integration-phase.md +37 -0
  44. package/commands/gsd/audit-fix.md +34 -0
  45. package/commands/gsd/audit-milestone.md +37 -0
  46. package/commands/gsd/audit-uat.md +24 -0
  47. package/commands/gsd/autonomous.md +46 -0
  48. package/commands/gsd/capture.md +62 -0
  49. package/commands/gsd/cleanup.md +24 -0
  50. package/commands/gsd/code-review.md +59 -0
  51. package/commands/gsd/complete-milestone.md +143 -0
  52. package/commands/gsd/config.md +56 -0
  53. package/commands/gsd/debug.md +52 -0
  54. package/commands/gsd/discuss-phase.md +76 -0
  55. package/commands/gsd/docs-update.md +49 -0
  56. package/commands/gsd/eval-review.md +33 -0
  57. package/commands/gsd/execute-phase.md +64 -0
  58. package/commands/gsd/explore.md +27 -0
  59. package/commands/gsd/extract-learnings.md +23 -0
  60. package/commands/gsd/fast.md +31 -0
  61. package/commands/gsd/forensics.md +57 -0
  62. package/commands/gsd/graphify.md +199 -0
  63. package/commands/gsd/health.md +31 -0
  64. package/commands/gsd/help.md +28 -0
  65. package/commands/gsd/import.md +41 -0
  66. package/commands/gsd/inbox.md +39 -0
  67. package/commands/gsd/ingest-docs.md +42 -0
  68. package/commands/gsd/manager.md +45 -0
  69. package/commands/gsd/map-codebase.md +83 -0
  70. package/commands/gsd/milestone-summary.md +51 -0
  71. package/commands/gsd/mvp-phase.md +45 -0
  72. package/commands/gsd/new-milestone.md +45 -0
  73. package/commands/gsd/new-project.md +47 -0
  74. package/commands/gsd/ns-context.md +23 -0
  75. package/commands/gsd/ns-ideate.md +24 -0
  76. package/commands/gsd/ns-manage.md +29 -0
  77. package/commands/gsd/ns-project.md +22 -0
  78. package/commands/gsd/ns-review.md +26 -0
  79. package/commands/gsd/ns-workflow.md +28 -0
  80. package/commands/gsd/pause-work.md +43 -0
  81. package/commands/gsd/phase.md +56 -0
  82. package/commands/gsd/plan-phase.md +62 -0
  83. package/commands/gsd/plan-review-convergence.md +59 -0
  84. package/commands/gsd/pr-branch.md +26 -0
  85. package/commands/gsd/profile-user.md +46 -0
  86. package/commands/gsd/progress.md +47 -0
  87. package/commands/gsd/quick.md +174 -0
  88. package/commands/gsd/resume-work.md +30 -0
  89. package/commands/gsd/review-backlog.md +63 -0
  90. package/commands/gsd/review.md +41 -0
  91. package/commands/gsd/secure-phase.md +36 -0
  92. package/commands/gsd/settings.md +29 -0
  93. package/commands/gsd/ship.md +24 -0
  94. package/commands/gsd/sketch.md +60 -0
  95. package/commands/gsd/spec-phase.md +63 -0
  96. package/commands/gsd/spike.md +57 -0
  97. package/commands/gsd/stats.md +19 -0
  98. package/commands/gsd/surface.md +155 -0
  99. package/commands/gsd/thread.md +24 -0
  100. package/commands/gsd/ui-phase.md +35 -0
  101. package/commands/gsd/ui-review.md +33 -0
  102. package/commands/gsd/ultraplan-phase.md +34 -0
  103. package/commands/gsd/undo.md +35 -0
  104. package/commands/gsd/update.md +48 -0
  105. package/commands/gsd/validate-phase.md +36 -0
  106. package/commands/gsd/verify-work.md +39 -0
  107. package/commands/gsd/workspace.md +52 -0
  108. package/commands/gsd/workstreams.md +70 -0
  109. package/get-shit-done/bin/check-latest-version.cjs +106 -0
  110. package/get-shit-done/bin/gsd-tools.cjs +1676 -0
  111. package/get-shit-done/bin/lib/active-workstream-store.cjs +302 -0
  112. package/get-shit-done/bin/lib/adr-parser.cjs +394 -0
  113. package/get-shit-done/bin/lib/agent-command-router.cjs +65 -0
  114. package/get-shit-done/bin/lib/artifacts.cjs +53 -0
  115. package/get-shit-done/bin/lib/audit.cjs +755 -0
  116. package/get-shit-done/bin/lib/check-command-router.cjs +333 -0
  117. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +118 -0
  118. package/get-shit-done/bin/lib/clock.cjs +96 -0
  119. package/get-shit-done/bin/lib/clusters.cjs +135 -0
  120. package/get-shit-done/bin/lib/code-review-flags.cjs +74 -0
  121. package/get-shit-done/bin/lib/command-aliases.cjs +815 -0
  122. package/get-shit-done/bin/lib/command-arg-projection.cjs +62 -0
  123. package/get-shit-done/bin/lib/command-routing-hub.cjs +388 -0
  124. package/get-shit-done/bin/lib/commands.cjs +1188 -0
  125. package/get-shit-done/bin/lib/config-schema.cjs +31 -0
  126. package/get-shit-done/bin/lib/config.cjs +728 -0
  127. package/get-shit-done/bin/lib/configuration.cjs +248 -0
  128. package/get-shit-done/bin/lib/context-utilization.cjs +47 -0
  129. package/get-shit-done/bin/lib/core.cjs +2121 -0
  130. package/get-shit-done/bin/lib/decisions.cjs +116 -0
  131. package/get-shit-done/bin/lib/docs.cjs +270 -0
  132. package/get-shit-done/bin/lib/drift.cjs +388 -0
  133. package/get-shit-done/bin/lib/fallow-runner.cjs +109 -0
  134. package/get-shit-done/bin/lib/frontmatter.cjs +389 -0
  135. package/get-shit-done/bin/lib/gap-checker.cjs +205 -0
  136. package/get-shit-done/bin/lib/graphify.cjs +592 -0
  137. package/get-shit-done/bin/lib/gsd2-import.cjs +514 -0
  138. package/get-shit-done/bin/lib/init-command-router.cjs +58 -0
  139. package/get-shit-done/bin/lib/init.cjs +2112 -0
  140. package/get-shit-done/bin/lib/install-profiles.cjs +603 -0
  141. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +117 -0
  142. package/get-shit-done/bin/lib/installer-migration-report.cjs +354 -0
  143. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
  144. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
  145. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
  146. package/get-shit-done/bin/lib/installer-migrations.cjs +778 -0
  147. package/get-shit-done/bin/lib/intel.cjs +708 -0
  148. package/get-shit-done/bin/lib/learnings.cjs +421 -0
  149. package/get-shit-done/bin/lib/milestone.cjs +314 -0
  150. package/get-shit-done/bin/lib/model-catalog.cjs +212 -0
  151. package/get-shit-done/bin/lib/model-profiles.cjs +31 -0
  152. package/get-shit-done/bin/lib/observability/event.cjs +82 -0
  153. package/get-shit-done/bin/lib/observability/logger.cjs +174 -0
  154. package/get-shit-done/bin/lib/observability/redaction.cjs +50 -0
  155. package/get-shit-done/bin/lib/package-identity.cjs +31 -0
  156. package/get-shit-done/bin/lib/phase-command-router.cjs +191 -0
  157. package/get-shit-done/bin/lib/phase-lifecycle.cjs +80 -0
  158. package/get-shit-done/bin/lib/phase.cjs +1607 -0
  159. package/get-shit-done/bin/lib/phases-command-router.cjs +39 -0
  160. package/get-shit-done/bin/lib/plan-scan.cjs +97 -0
  161. package/get-shit-done/bin/lib/planning-workspace.cjs +238 -0
  162. package/get-shit-done/bin/lib/profile-output.cjs +1141 -0
  163. package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
  164. package/get-shit-done/bin/lib/project-root.cjs +112 -0
  165. package/get-shit-done/bin/lib/prompt-budget.cjs +399 -0
  166. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +125 -0
  167. package/get-shit-done/bin/lib/roadmap-command-router.cjs +28 -0
  168. package/get-shit-done/bin/lib/roadmap.cjs +650 -0
  169. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +301 -0
  170. package/get-shit-done/bin/lib/runtime-homes.cjs +222 -0
  171. package/get-shit-done/bin/lib/runtime-name-policy.cjs +83 -0
  172. package/get-shit-done/bin/lib/runtime-slash.cjs +112 -0
  173. package/get-shit-done/bin/lib/schema-detect.cjs +165 -0
  174. package/get-shit-done/bin/lib/secrets.cjs +32 -0
  175. package/get-shit-done/bin/lib/security.cjs +600 -0
  176. package/get-shit-done/bin/lib/semver-compare.cjs +35 -0
  177. package/get-shit-done/bin/lib/shell-command-projection.cjs +500 -0
  178. package/get-shit-done/bin/lib/state-command-router.cjs +252 -0
  179. package/get-shit-done/bin/lib/state-document.cjs +263 -0
  180. package/get-shit-done/bin/lib/state.cjs +2038 -0
  181. package/get-shit-done/bin/lib/surface.cjs +470 -0
  182. package/get-shit-done/bin/lib/task-command-router.cjs +81 -0
  183. package/get-shit-done/bin/lib/template.cjs +228 -0
  184. package/get-shit-done/bin/lib/uat.cjs +289 -0
  185. package/get-shit-done/bin/lib/update-context.cjs +209 -0
  186. package/get-shit-done/bin/lib/validate-command-router.cjs +83 -0
  187. package/get-shit-done/bin/lib/validate.cjs +92 -0
  188. package/get-shit-done/bin/lib/verify-command-router.cjs +40 -0
  189. package/get-shit-done/bin/lib/verify.cjs +1511 -0
  190. package/get-shit-done/bin/lib/workstream-inventory-builder.cjs +74 -0
  191. package/get-shit-done/bin/lib/workstream-inventory.cjs +146 -0
  192. package/get-shit-done/bin/lib/workstream-name-policy.cjs +94 -0
  193. package/get-shit-done/bin/lib/workstream.cjs +389 -0
  194. package/get-shit-done/bin/lib/worktree-safety.cjs +985 -0
  195. package/get-shit-done/bin/shared/config-defaults.manifest.json +97 -0
  196. package/get-shit-done/bin/shared/config-schema.manifest.json +175 -0
  197. package/get-shit-done/bin/shared/model-catalog.json +122 -0
  198. package/get-shit-done/bin/shared/runtime-aliases.manifest.json +75 -0
  199. package/get-shit-done/bin/verify-reapply-patches.cjs +352 -0
  200. package/get-shit-done/contexts/dev.md +21 -0
  201. package/get-shit-done/contexts/research.md +22 -0
  202. package/get-shit-done/contexts/review.md +23 -0
  203. package/get-shit-done/references/agent-contracts.md +79 -0
  204. package/get-shit-done/references/ai-evals.md +156 -0
  205. package/get-shit-done/references/ai-frameworks.md +186 -0
  206. package/get-shit-done/references/artifact-types.md +131 -0
  207. package/get-shit-done/references/autonomous-smart-discuss.md +277 -0
  208. package/get-shit-done/references/checkpoints.md +814 -0
  209. package/get-shit-done/references/common-bug-patterns.md +114 -0
  210. package/get-shit-done/references/context-budget.md +85 -0
  211. package/get-shit-done/references/continuation-format.md +253 -0
  212. package/get-shit-done/references/debugger-philosophy.md +76 -0
  213. package/get-shit-done/references/decimal-phase-calculation.md +64 -0
  214. package/get-shit-done/references/doc-conflict-engine.md +91 -0
  215. package/get-shit-done/references/domain-probes.md +125 -0
  216. package/get-shit-done/references/execute-mvp-tdd.md +81 -0
  217. package/get-shit-done/references/executor-examples.md +110 -0
  218. package/get-shit-done/references/few-shot-examples/plan-checker.md +73 -0
  219. package/get-shit-done/references/few-shot-examples/verifier.md +109 -0
  220. package/get-shit-done/references/gate-prompts.md +100 -0
  221. package/get-shit-done/references/gates.md +70 -0
  222. package/get-shit-done/references/git-integration.md +298 -0
  223. package/get-shit-done/references/git-planning-commit.md +40 -0
  224. package/get-shit-done/references/ios-scaffold.md +123 -0
  225. package/get-shit-done/references/mandatory-initial-read.md +2 -0
  226. package/get-shit-done/references/model-profile-resolution.md +38 -0
  227. package/get-shit-done/references/model-profiles.md +245 -0
  228. package/get-shit-done/references/mvp-concepts.md +49 -0
  229. package/get-shit-done/references/phase-argument-parsing.md +61 -0
  230. package/get-shit-done/references/planner-antipatterns.md +89 -0
  231. package/get-shit-done/references/planner-chunked.md +49 -0
  232. package/get-shit-done/references/planner-gap-closure.md +62 -0
  233. package/get-shit-done/references/planner-graphify-auto-update.md +67 -0
  234. package/get-shit-done/references/planner-human-verify-mode.md +57 -0
  235. package/get-shit-done/references/planner-interface-context.md +62 -0
  236. package/get-shit-done/references/planner-mvp-mode.md +53 -0
  237. package/get-shit-done/references/planner-reviews.md +39 -0
  238. package/get-shit-done/references/planner-revision.md +87 -0
  239. package/get-shit-done/references/planner-source-audit.md +73 -0
  240. package/get-shit-done/references/planning-config.md +471 -0
  241. package/get-shit-done/references/project-skills-discovery.md +19 -0
  242. package/get-shit-done/references/questioning.md +162 -0
  243. package/get-shit-done/references/revision-loop.md +97 -0
  244. package/get-shit-done/references/scout-codebase.md +51 -0
  245. package/get-shit-done/references/skeleton-template.md +48 -0
  246. package/get-shit-done/references/sketch-interactivity.md +41 -0
  247. package/get-shit-done/references/sketch-theme-system.md +94 -0
  248. package/get-shit-done/references/sketch-tooling.md +45 -0
  249. package/get-shit-done/references/sketch-variant-patterns.md +81 -0
  250. package/get-shit-done/references/spidr-splitting.md +69 -0
  251. package/get-shit-done/references/tdd.md +330 -0
  252. package/get-shit-done/references/thinking-models-debug.md +44 -0
  253. package/get-shit-done/references/thinking-models-execution.md +50 -0
  254. package/get-shit-done/references/thinking-models-planning.md +62 -0
  255. package/get-shit-done/references/thinking-models-research.md +50 -0
  256. package/get-shit-done/references/thinking-models-verification.md +55 -0
  257. package/get-shit-done/references/thinking-partner.md +96 -0
  258. package/get-shit-done/references/ui-brand.md +160 -0
  259. package/get-shit-done/references/universal-anti-patterns.md +63 -0
  260. package/get-shit-done/references/user-profiling.md +681 -0
  261. package/get-shit-done/references/user-story-template.md +58 -0
  262. package/get-shit-done/references/verification-overrides.md +227 -0
  263. package/get-shit-done/references/verification-patterns.md +612 -0
  264. package/get-shit-done/references/verify-mvp-mode.md +85 -0
  265. package/get-shit-done/references/workstream-flag.md +111 -0
  266. package/get-shit-done/references/worktree-path-safety.md +89 -0
  267. package/get-shit-done/templates/AI-SPEC.md +246 -0
  268. package/get-shit-done/templates/DEBUG.md +169 -0
  269. package/get-shit-done/templates/README.md +77 -0
  270. package/get-shit-done/templates/SECURITY.md +61 -0
  271. package/get-shit-done/templates/UAT.md +265 -0
  272. package/get-shit-done/templates/UI-SPEC.md +100 -0
  273. package/get-shit-done/templates/VALIDATION.md +76 -0
  274. package/get-shit-done/templates/claude-md.md +145 -0
  275. package/get-shit-done/templates/codebase/architecture.md +255 -0
  276. package/get-shit-done/templates/codebase/concerns.md +310 -0
  277. package/get-shit-done/templates/codebase/conventions.md +307 -0
  278. package/get-shit-done/templates/codebase/integrations.md +280 -0
  279. package/get-shit-done/templates/codebase/stack.md +186 -0
  280. package/get-shit-done/templates/codebase/structure.md +285 -0
  281. package/get-shit-done/templates/codebase/testing.md +480 -0
  282. package/get-shit-done/templates/config.json +62 -0
  283. package/get-shit-done/templates/context.md +352 -0
  284. package/get-shit-done/templates/continue-here.md +78 -0
  285. package/get-shit-done/templates/copilot-instructions.md +7 -0
  286. package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
  287. package/get-shit-done/templates/dev-preferences.md +21 -0
  288. package/get-shit-done/templates/discovery.md +146 -0
  289. package/get-shit-done/templates/discussion-log.md +63 -0
  290. package/get-shit-done/templates/milestone-archive.md +123 -0
  291. package/get-shit-done/templates/milestone.md +115 -0
  292. package/get-shit-done/templates/phase-prompt.md +610 -0
  293. package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
  294. package/get-shit-done/templates/project.md +186 -0
  295. package/get-shit-done/templates/requirements.md +231 -0
  296. package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
  297. package/get-shit-done/templates/research-project/FEATURES.md +147 -0
  298. package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
  299. package/get-shit-done/templates/research-project/STACK.md +120 -0
  300. package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
  301. package/get-shit-done/templates/research.md +592 -0
  302. package/get-shit-done/templates/retrospective.md +54 -0
  303. package/get-shit-done/templates/roadmap.md +202 -0
  304. package/get-shit-done/templates/spec.md +307 -0
  305. package/get-shit-done/templates/state.md +195 -0
  306. package/get-shit-done/templates/summary-complex.md +59 -0
  307. package/get-shit-done/templates/summary-minimal.md +41 -0
  308. package/get-shit-done/templates/summary-standard.md +48 -0
  309. package/get-shit-done/templates/summary.md +248 -0
  310. package/get-shit-done/templates/user-profile.md +146 -0
  311. package/get-shit-done/templates/user-setup.md +311 -0
  312. package/get-shit-done/templates/verification-report.md +322 -0
  313. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +1 -0
  314. package/get-shit-done/workflows/add-backlog.md +91 -0
  315. package/get-shit-done/workflows/add-phase.md +113 -0
  316. package/get-shit-done/workflows/add-tests.md +355 -0
  317. package/get-shit-done/workflows/add-todo.md +161 -0
  318. package/get-shit-done/workflows/ai-integration-phase.md +295 -0
  319. package/get-shit-done/workflows/analyze-dependencies.md +96 -0
  320. package/get-shit-done/workflows/audit-fix.md +178 -0
  321. package/get-shit-done/workflows/audit-milestone.md +358 -0
  322. package/get-shit-done/workflows/audit-uat.md +110 -0
  323. package/get-shit-done/workflows/autonomous.md +795 -0
  324. package/get-shit-done/workflows/check-todos.md +180 -0
  325. package/get-shit-done/workflows/cleanup.md +155 -0
  326. package/get-shit-done/workflows/code-review-fix.md +502 -0
  327. package/get-shit-done/workflows/code-review.md +656 -0
  328. package/get-shit-done/workflows/complete-milestone.md +855 -0
  329. package/get-shit-done/workflows/debug.md +232 -0
  330. package/get-shit-done/workflows/diagnose-issues.md +241 -0
  331. package/get-shit-done/workflows/discovery-phase.md +291 -0
  332. package/get-shit-done/workflows/discuss-phase/modes/advisor.md +176 -0
  333. package/get-shit-done/workflows/discuss-phase/modes/all.md +28 -0
  334. package/get-shit-done/workflows/discuss-phase/modes/analyze.md +44 -0
  335. package/get-shit-done/workflows/discuss-phase/modes/auto.md +57 -0
  336. package/get-shit-done/workflows/discuss-phase/modes/batch.md +52 -0
  337. package/get-shit-done/workflows/discuss-phase/modes/chain.md +98 -0
  338. package/get-shit-done/workflows/discuss-phase/modes/default.md +141 -0
  339. package/get-shit-done/workflows/discuss-phase/modes/power.md +44 -0
  340. package/get-shit-done/workflows/discuss-phase/modes/text.md +55 -0
  341. package/get-shit-done/workflows/discuss-phase/templates/checkpoint.json +18 -0
  342. package/get-shit-done/workflows/discuss-phase/templates/context.md +136 -0
  343. package/get-shit-done/workflows/discuss-phase/templates/discussion-log.md +50 -0
  344. package/get-shit-done/workflows/discuss-phase-assumptions.md +675 -0
  345. package/get-shit-done/workflows/discuss-phase-power.md +291 -0
  346. package/get-shit-done/workflows/discuss-phase.md +499 -0
  347. package/get-shit-done/workflows/do.md +111 -0
  348. package/get-shit-done/workflows/docs-update.md +1162 -0
  349. package/get-shit-done/workflows/edit-phase.md +295 -0
  350. package/get-shit-done/workflows/eval-review.md +156 -0
  351. package/get-shit-done/workflows/execute-phase/steps/codebase-drift-gate.md +82 -0
  352. package/get-shit-done/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  353. package/get-shit-done/workflows/execute-phase/steps/post-merge-gate.md +117 -0
  354. package/get-shit-done/workflows/execute-phase.md +1709 -0
  355. package/get-shit-done/workflows/execute-plan.md +526 -0
  356. package/get-shit-done/workflows/explore.md +144 -0
  357. package/get-shit-done/workflows/extract-learnings.md +243 -0
  358. package/get-shit-done/workflows/fast.md +124 -0
  359. package/get-shit-done/workflows/forensics.md +279 -0
  360. package/get-shit-done/workflows/graduation.md +196 -0
  361. package/get-shit-done/workflows/health.md +224 -0
  362. package/get-shit-done/workflows/help/modes/brief.md +22 -0
  363. package/get-shit-done/workflows/help/modes/default.md +50 -0
  364. package/get-shit-done/workflows/help/modes/full.md +784 -0
  365. package/get-shit-done/workflows/help/modes/topic.md +74 -0
  366. package/get-shit-done/workflows/help.md +24 -0
  367. package/get-shit-done/workflows/import.md +254 -0
  368. package/get-shit-done/workflows/inbox.md +387 -0
  369. package/get-shit-done/workflows/ingest-docs.md +339 -0
  370. package/get-shit-done/workflows/insert-phase.md +152 -0
  371. package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
  372. package/get-shit-done/workflows/list-workspaces.md +57 -0
  373. package/get-shit-done/workflows/manager.md +393 -0
  374. package/get-shit-done/workflows/map-codebase.md +444 -0
  375. package/get-shit-done/workflows/milestone-summary.md +224 -0
  376. package/get-shit-done/workflows/mvp-phase.md +222 -0
  377. package/get-shit-done/workflows/new-milestone.md +635 -0
  378. package/get-shit-done/workflows/new-project.md +1555 -0
  379. package/get-shit-done/workflows/new-workspace.md +240 -0
  380. package/get-shit-done/workflows/next.md +299 -0
  381. package/get-shit-done/workflows/node-repair.md +92 -0
  382. package/get-shit-done/workflows/note.md +158 -0
  383. package/get-shit-done/workflows/pause-work.md +244 -0
  384. package/get-shit-done/workflows/plan-milestone-gaps.md +281 -0
  385. package/get-shit-done/workflows/plan-phase.md +1809 -0
  386. package/get-shit-done/workflows/plan-review-convergence.md +346 -0
  387. package/get-shit-done/workflows/plant-seed.md +230 -0
  388. package/get-shit-done/workflows/pr-branch.md +157 -0
  389. package/get-shit-done/workflows/profile-user.md +453 -0
  390. package/get-shit-done/workflows/progress.md +699 -0
  391. package/get-shit-done/workflows/quick.md +1039 -0
  392. package/get-shit-done/workflows/reapply-patches.md +426 -0
  393. package/get-shit-done/workflows/remove-phase.md +156 -0
  394. package/get-shit-done/workflows/remove-workspace.md +108 -0
  395. package/get-shit-done/workflows/resume-project.md +332 -0
  396. package/get-shit-done/workflows/review.md +623 -0
  397. package/get-shit-done/workflows/scan.md +105 -0
  398. package/get-shit-done/workflows/secure-phase.md +180 -0
  399. package/get-shit-done/workflows/session-report.md +146 -0
  400. package/get-shit-done/workflows/settings-advanced.md +620 -0
  401. package/get-shit-done/workflows/settings-integrations.md +312 -0
  402. package/get-shit-done/workflows/settings.md +552 -0
  403. package/get-shit-done/workflows/ship.md +356 -0
  404. package/get-shit-done/workflows/sketch-wrap-up.md +286 -0
  405. package/get-shit-done/workflows/sketch.md +361 -0
  406. package/get-shit-done/workflows/spec-phase.md +262 -0
  407. package/get-shit-done/workflows/spike-wrap-up.md +307 -0
  408. package/get-shit-done/workflows/spike.md +453 -0
  409. package/get-shit-done/workflows/stats.md +80 -0
  410. package/get-shit-done/workflows/sync-skills.md +182 -0
  411. package/get-shit-done/workflows/thread.md +222 -0
  412. package/get-shit-done/workflows/transition.md +694 -0
  413. package/get-shit-done/workflows/ui-phase.md +328 -0
  414. package/get-shit-done/workflows/ui-review.md +193 -0
  415. package/get-shit-done/workflows/ultraplan-phase.md +199 -0
  416. package/get-shit-done/workflows/undo.md +314 -0
  417. package/get-shit-done/workflows/update.md +443 -0
  418. package/get-shit-done/workflows/validate-phase.md +179 -0
  419. package/get-shit-done/workflows/verify-phase.md +544 -0
  420. package/get-shit-done/workflows/verify-work.md +781 -0
  421. package/hooks/dist/gsd-check-update-worker.js +95 -0
  422. package/hooks/dist/gsd-check-update.js +64 -0
  423. package/hooks/dist/gsd-context-monitor.js +195 -0
  424. package/hooks/dist/gsd-graphify-update.sh +158 -0
  425. package/hooks/dist/gsd-phase-boundary.sh +47 -0
  426. package/hooks/dist/gsd-prompt-guard.js +97 -0
  427. package/hooks/dist/gsd-read-guard.js +101 -0
  428. package/hooks/dist/gsd-read-injection-scanner.js +203 -0
  429. package/hooks/dist/gsd-session-state.sh +59 -0
  430. package/hooks/dist/gsd-statusline.js +548 -0
  431. package/hooks/dist/gsd-update-banner.js +134 -0
  432. package/hooks/dist/gsd-validate-commit.sh +57 -0
  433. package/hooks/dist/gsd-workflow-guard.js +166 -0
  434. package/hooks/dist/lib/git-cmd.js +150 -0
  435. package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
  436. package/hooks/gsd-check-update-worker.js +95 -0
  437. package/hooks/gsd-check-update.js +64 -0
  438. package/hooks/gsd-context-monitor.js +195 -0
  439. package/hooks/gsd-graphify-update.sh +158 -0
  440. package/hooks/gsd-phase-boundary.sh +47 -0
  441. package/hooks/gsd-prompt-guard.js +97 -0
  442. package/hooks/gsd-read-guard.js +101 -0
  443. package/hooks/gsd-read-injection-scanner.js +203 -0
  444. package/hooks/gsd-session-state.sh +59 -0
  445. package/hooks/gsd-statusline.js +548 -0
  446. package/hooks/gsd-update-banner.js +134 -0
  447. package/hooks/gsd-validate-commit.sh +57 -0
  448. package/hooks/gsd-workflow-guard.js +166 -0
  449. package/hooks/lib/git-cmd.js +150 -0
  450. package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
  451. package/hooks/managed-hooks-registry.cjs +34 -0
  452. package/package.json +102 -0
  453. package/scripts/affected-tests-lib.cjs +541 -0
  454. package/scripts/audit-workflow-script-paths.cjs +73 -0
  455. package/scripts/base64-scan.sh +339 -0
  456. package/scripts/build-hooks.js +236 -0
  457. package/scripts/changeset/README.md +129 -0
  458. package/scripts/changeset/cli.cjs +392 -0
  459. package/scripts/changeset/github-release-notes.cjs +199 -0
  460. package/scripts/changeset/lint.cjs +110 -0
  461. package/scripts/changeset/new.cjs +137 -0
  462. package/scripts/changeset/parse.cjs +114 -0
  463. package/scripts/changeset/render.cjs +34 -0
  464. package/scripts/changeset/serialize.cjs +130 -0
  465. package/scripts/check-alias-drift.cjs +108 -0
  466. package/scripts/check-env.cjs +302 -0
  467. package/scripts/check-npm-integrity.cjs +209 -0
  468. package/scripts/ci-guard-runner.cjs +16 -0
  469. package/scripts/ci-prepare-test-scope.cjs +46 -0
  470. package/scripts/ci-rebase-check.cjs +85 -0
  471. package/scripts/ci-test-scope.cjs +302 -0
  472. package/scripts/command-contract-helpers.cjs +64 -0
  473. package/scripts/diff-touches-shipped-paths.cjs +147 -0
  474. package/scripts/fix-slash-commands.cjs +147 -0
  475. package/scripts/gen-inventory-manifest.cjs +109 -0
  476. package/scripts/generate-package-identity.cjs +104 -0
  477. package/scripts/lint-command-contract.cjs +108 -0
  478. package/scripts/lint-descriptions.cjs +83 -0
  479. package/scripts/lint-docs-required.cjs +222 -0
  480. package/scripts/lint-no-source-grep-extras.cjs +81 -0
  481. package/scripts/lint-no-source-grep.cjs +174 -0
  482. package/scripts/lint-package-identity-drift.cjs +141 -0
  483. package/scripts/lint-pr-check-project-dir.cjs +98 -0
  484. package/scripts/lint-shared-module-handsync.cjs +388 -0
  485. package/scripts/lint-shell-command-projection-drift.cjs +57 -0
  486. package/scripts/lint-skill-deps.cjs +180 -0
  487. package/scripts/lint-test-file-count.allowlist.json +36 -0
  488. package/scripts/lint-test-file-count.cjs +190 -0
  489. package/scripts/pr-template-policy.cjs +268 -0
  490. package/scripts/prompt-injection-scan.sh +203 -0
  491. package/scripts/release-tarball-smoke.cjs +627 -0
  492. package/scripts/run-affected-tests.cjs +6 -0
  493. package/scripts/run-cross-platform-tests.cjs +63 -0
  494. package/scripts/run-tests.cjs +282 -0
  495. package/scripts/secret-scan-lint.sh +231 -0
  496. package/scripts/secret-scan.sh +358 -0
  497. package/scripts/setup-branch-protection.sh +236 -0
  498. package/scripts/shared-module-handsync-allowlist.json +183 -0
  499. package/scripts/strip-prose-atrefs.cjs +106 -0
  500. package/scripts/sync-rulesets.sh +34 -0
  501. package/scripts/sync-runtime-launcher.cjs +402 -0
  502. package/scripts/test-failure-reasons.cjs +34 -0
  503. package/scripts/workflow-policy.cjs +450 -0
@@ -0,0 +1,301 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Runtime artifact layout module — resolves the artifact directory shapes
5
+ * (commands, agents, skills) for each supported runtime.
6
+ *
7
+ * grok is intentionally absent: it is in runtime-homes.cjs but not wired
8
+ * here. The TypeError on unknown runtime is the loud-fail signal that a
9
+ * runtime was added to the homes list without a layout entry.
10
+ */
11
+
12
+ const path = require('path');
13
+ const fs = require('fs');
14
+
15
+ const {
16
+ stageSkillsForProfile,
17
+ stageAgentsForProfile,
18
+ stageSkillsForRuntimeAsSkills,
19
+ } = require('./install-profiles.cjs');
20
+
21
+ // ---------------------------------------------------------------------------
22
+ // Lazy installer exports (avoids GSD_TEST_MODE env mutation at module load)
23
+ // ---------------------------------------------------------------------------
24
+
25
+ /**
26
+ * Load bin/install.js exports in a test-safe way.
27
+ * Sets GSD_TEST_MODE only for the duration of the require() call and only if
28
+ * it was not already set, restoring the original value in a finally block so
29
+ * the module-level environment is never permanently mutated.
30
+ */
31
+ function loadInstallExports() {
32
+ const savedTestMode = process.env.GSD_TEST_MODE;
33
+ if (savedTestMode === undefined) process.env.GSD_TEST_MODE = '1';
34
+ try {
35
+
36
+ return require('../../../bin/install.js');
37
+ } finally {
38
+ if (savedTestMode === undefined) delete process.env.GSD_TEST_MODE;
39
+ else process.env.GSD_TEST_MODE = savedTestMode;
40
+ }
41
+ }
42
+
43
+ /** Cache after first successful load. */
44
+ let _installExports = null;
45
+ function getInstallExports() {
46
+ if (!_installExports) _installExports = loadInstallExports();
47
+ return _installExports;
48
+ }
49
+
50
+ /**
51
+ * @typedef {'commands'|'agents'|'skills'} ArtifactKindName
52
+ * @typedef {Object} ArtifactKind
53
+ * @property {ArtifactKindName} kind
54
+ * @property {string} destSubpath
55
+ * @property {string} prefix
56
+ * @property {(resolvedProfile: Object) => string} stage
57
+ * @typedef {Object} Layout
58
+ * @property {string} runtime
59
+ * @property {string} configDir
60
+ * @property {ArtifactKind[]} kinds
61
+ */
62
+
63
+ // ---------------------------------------------------------------------------
64
+ // Source root finders
65
+ // ---------------------------------------------------------------------------
66
+
67
+ /**
68
+ * Locate the GSD commands/gsd source directory.
69
+ *
70
+ * Resolution order:
71
+ * 1. If runtimeConfigDir provided, check <runtimeConfigDir>/.gsd-source marker.
72
+ * 2. Walk up from __dirname using path.dirname (no literal .. segments).
73
+ * 3. Throw a descriptive error if neither succeeds.
74
+ *
75
+ * @param {string} [runtimeConfigDir] optional runtime config directory
76
+ * @returns {string}
77
+ */
78
+ function findInstallSourceRoot(runtimeConfigDir) {
79
+ // Step 1: marker check
80
+ if (runtimeConfigDir) {
81
+ const markerPath = path.join(runtimeConfigDir, '.gsd-source');
82
+ if (fs.existsSync(markerPath)) {
83
+ try {
84
+ const src = fs.readFileSync(markerPath, 'utf8').trim();
85
+ if (src && fs.existsSync(src)) return src;
86
+ } catch { /* fall through */ }
87
+ }
88
+ }
89
+
90
+ // Step 2: walk up from __dirname
91
+ let dir = __dirname;
92
+ for (let i = 0; i < 6; i++) {
93
+ const candidate = path.join(dir, 'commands', 'gsd');
94
+ if (fs.existsSync(candidate)) return candidate;
95
+ const parent = path.dirname(dir);
96
+ if (parent === dir) break;
97
+ dir = parent;
98
+ }
99
+
100
+ throw new Error(`findInstallSourceRoot: could not locate commands/gsd from ${__dirname}`);
101
+ }
102
+
103
+ /**
104
+ * Locate the GSD agents source directory.
105
+ *
106
+ * Resolution order:
107
+ * 1. If runtimeConfigDir provided, check <runtimeConfigDir>/.gsd-source marker.
108
+ * 2. Walk up from __dirname using path.dirname (no literal .. segments).
109
+ * 3. Throw a descriptive error if neither succeeds.
110
+ *
111
+ * @param {string} [runtimeConfigDir] optional runtime config directory
112
+ * @returns {string}
113
+ */
114
+ function findAgentsSourceRoot(runtimeConfigDir) {
115
+ // Step 1: marker check
116
+ if (runtimeConfigDir) {
117
+ const markerPath = path.join(runtimeConfigDir, '.gsd-source');
118
+ if (fs.existsSync(markerPath)) {
119
+ try {
120
+ const src = fs.readFileSync(markerPath, 'utf8').trim();
121
+ if (src && fs.existsSync(src)) {
122
+ // Marker points to commands/gsd; agents/ is a sibling of commands/
123
+ const agentsCandidate = path.resolve(path.dirname(src), '..', 'agents');
124
+ if (fs.existsSync(agentsCandidate)) return agentsCandidate;
125
+ }
126
+ } catch { /* fall through */ }
127
+ }
128
+ }
129
+
130
+ // Step 2: walk up from __dirname
131
+ let dir = __dirname;
132
+ for (let i = 0; i < 6; i++) {
133
+ const candidate = path.join(dir, 'agents');
134
+ if (fs.existsSync(candidate)) return candidate;
135
+ const parent = path.dirname(dir);
136
+ if (parent === dir) break;
137
+ dir = parent;
138
+ }
139
+
140
+ throw new Error(`findAgentsSourceRoot: could not locate agents/ from ${__dirname}`);
141
+ }
142
+
143
+ // ---------------------------------------------------------------------------
144
+ // Allowlisted runtimes
145
+ // ---------------------------------------------------------------------------
146
+
147
+ const ALLOWED_RUNTIMES = new Set([
148
+ 'claude', 'cursor', 'gemini', 'codex', 'copilot', 'antigravity',
149
+ 'windsurf', 'augment', 'trae', 'qwen', 'hermes', 'codebuddy',
150
+ 'cline', 'opencode', 'kilo',
151
+ ]);
152
+
153
+ // ---------------------------------------------------------------------------
154
+ // Layout table builders
155
+ // ---------------------------------------------------------------------------
156
+
157
+ function commandsKind(destSubpath, prefix, configDir) {
158
+ return {
159
+ kind: 'commands',
160
+ destSubpath,
161
+ prefix,
162
+ stage: (resolved) => stageSkillsForProfile(findInstallSourceRoot(configDir), resolved),
163
+ };
164
+ }
165
+
166
+ function agentsKind(destSubpath, prefix, configDir) {
167
+ return {
168
+ kind: 'agents',
169
+ destSubpath,
170
+ prefix,
171
+ stage: (resolved) => stageAgentsForProfile(findAgentsSourceRoot(configDir), resolved),
172
+ };
173
+ }
174
+
175
+ /**
176
+ * Build a skills kind descriptor.
177
+ *
178
+ * @param {string} destSubpath
179
+ * @param {string} prefix
180
+ * @param {string} converterName name of converter function in bin/install.js exports
181
+ * @param {string} runtime canonical runtime ID (gates Hermes/Qwen branding in converter)
182
+ * @param {string} configDir runtime config dir (for .gsd-source marker resolution)
183
+ */
184
+ function skillsKind(destSubpath, prefix, converterName, runtime, configDir) {
185
+ return {
186
+ kind: 'skills',
187
+ destSubpath,
188
+ prefix,
189
+ stage: (resolved) => {
190
+ const installExports = getInstallExports();
191
+ const realConverter = installExports[converterName];
192
+ // Compute cmdNames once per stage call for performance (#3583).
193
+ // Extra args are ignored by converters that don't need runtime/cmdNames.
194
+ const cmdNames = installExports.readGsdCommandNames();
195
+ const wrappedConverter = (content, skillName) =>
196
+ realConverter(content, skillName, runtime, cmdNames);
197
+ return stageSkillsForRuntimeAsSkills(findInstallSourceRoot(configDir), resolved, wrappedConverter, prefix);
198
+ },
199
+ };
200
+ }
201
+
202
+ // ---------------------------------------------------------------------------
203
+ // Public API
204
+ // ---------------------------------------------------------------------------
205
+
206
+ /**
207
+ * Resolve the artifact layout for a given runtime and config directory.
208
+ *
209
+ * @param {string} runtime
210
+ * @param {string} configDir
211
+ * @param {'local'|'global'} [scope]
212
+ * @returns {Layout}
213
+ */
214
+ function resolveRuntimeArtifactLayout(runtime, configDir, scope = 'global') {
215
+ if (typeof configDir !== 'string' || configDir === '') {
216
+ throw new TypeError('configDir must be a non-empty string');
217
+ }
218
+ if (scope !== 'local' && scope !== 'global') {
219
+ throw new TypeError('scope must be "local" or "global"');
220
+ }
221
+ if (!ALLOWED_RUNTIMES.has(runtime)) {
222
+ throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
223
+ }
224
+
225
+ let kinds;
226
+ switch (runtime) {
227
+ case 'claude':
228
+ if (scope === 'local') {
229
+ kinds = [
230
+ commandsKind('commands/gsd', 'gsd-', configDir),
231
+ agentsKind('agents', 'gsd-', configDir),
232
+ ];
233
+ } else {
234
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClaudeSkill', 'claude', configDir)];
235
+ }
236
+ break;
237
+
238
+ case 'cursor':
239
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCursorSkill', 'cursor', configDir)];
240
+ break;
241
+
242
+ case 'gemini':
243
+ kinds = [commandsKind('commands/gsd', 'gsd-', configDir)];
244
+ break;
245
+
246
+ case 'codex':
247
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCodexSkill', 'codex', configDir)];
248
+ break;
249
+
250
+ case 'copilot':
251
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCopilotSkill', 'copilot', configDir)];
252
+ break;
253
+
254
+ case 'antigravity':
255
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToAntigravitySkill', 'antigravity', configDir)];
256
+ break;
257
+
258
+ case 'windsurf':
259
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToWindsurfSkill', 'windsurf', configDir)];
260
+ break;
261
+
262
+ case 'augment':
263
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToAugmentSkill', 'augment', configDir)];
264
+ break;
265
+
266
+ case 'trae':
267
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToTraeSkill', 'trae', configDir)];
268
+ break;
269
+
270
+ case 'qwen':
271
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClaudeSkill', 'qwen', configDir)];
272
+ break;
273
+
274
+ case 'hermes':
275
+ kinds = [skillsKind('skills/gsd', '', 'convertClaudeCommandToClaudeSkill', 'hermes', configDir)];
276
+ break;
277
+
278
+ case 'codebuddy':
279
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCodebuddySkill', 'codebuddy', configDir)];
280
+ break;
281
+
282
+ case 'cline':
283
+ kinds = [];
284
+ break;
285
+
286
+ case 'opencode':
287
+ kinds = [commandsKind('command', 'gsd-', configDir)];
288
+ break;
289
+
290
+ case 'kilo':
291
+ kinds = [commandsKind('command', 'gsd-', configDir)];
292
+ break;
293
+
294
+ default:
295
+ throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
296
+ }
297
+
298
+ return { runtime, configDir, kinds };
299
+ }
300
+
301
+ module.exports = { resolveRuntimeArtifactLayout, findInstallSourceRoot };
@@ -0,0 +1,222 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * runtime-homes.cjs — canonical runtime → global config/skills directory mapping.
5
+ *
6
+ * Single source of truth for resolving the global config base directory and
7
+ * the correct global skills directory for every GSD-supported runtime.
8
+ *
9
+ * Mirrors the logic in bin/install.js getGlobalDir() but as a pure,
10
+ * side-effect-free module safe to require() at any point without triggering
11
+ * the installer. bin/install.js is the authoritative source — keep in sync.
12
+ *
13
+ * Runtime-specific notes:
14
+ * hermes — GSD skills nest under skills/gsd/<skillName>/ (not the flat
15
+ * skills/<skillName>/ layout used by all other runtimes). This
16
+ * collapses 86 skill entries into one category in Hermes' system
17
+ * prompt (#2841).
18
+ * cline — Rules-based; commands are embedded in .clinerules. Cline does
19
+ * not use a skills/ directory. getGlobalSkillDir() returns null
20
+ * for cline so the caller can emit an appropriate warning.
21
+ */
22
+
23
+ const os = require('os');
24
+ const path = require('path');
25
+ const fs = require('fs');
26
+
27
+ /**
28
+ * Expand a leading ~ to os.homedir().
29
+ * @param {string} p
30
+ * @returns {string}
31
+ */
32
+ function expandTilde(p) {
33
+ if (!p) return p;
34
+ if (p.startsWith('~/') || p === '~') return path.join(os.homedir(), p.slice(1));
35
+ return p;
36
+ }
37
+
38
+ /**
39
+ * Resolve Antigravity global config dir across 1.x and 2.x layouts.
40
+ *
41
+ * Order:
42
+ * 1) ANTIGRAVITY_CONFIG_DIR override
43
+ * 2) Existing legacy/new runtime directories under ~/.gemini/
44
+ * - antigravity (1.x + documented baseline)
45
+ * - antigravity-ide (2.x IDE split)
46
+ * - antigravity-cli (2.x CLI split)
47
+ * 3) Legacy default (~/.gemini/antigravity) for backward compatibility
48
+ *
49
+ * @param {object} [opts]
50
+ * @param {Record<string, string | undefined>} [opts.env]
51
+ * @param {string} [opts.home]
52
+ * @param {(p: string) => boolean} [opts.existsSync]
53
+ * @returns {string}
54
+ */
55
+ function resolveAntigravityGlobalDir(opts = {}) {
56
+ const env = opts.env || process.env;
57
+ const home = opts.home || os.homedir();
58
+ const existsSyncFn = opts.existsSync || fs.existsSync;
59
+
60
+ if (env.ANTIGRAVITY_CONFIG_DIR) return expandTilde(env.ANTIGRAVITY_CONFIG_DIR);
61
+
62
+ const base = path.join(home, '.gemini');
63
+ const candidates = [
64
+ path.join(base, 'antigravity'),
65
+ path.join(base, 'antigravity-ide'),
66
+ path.join(base, 'antigravity-cli'),
67
+ ];
68
+ for (const candidate of candidates) {
69
+ if (existsSyncFn(candidate)) return candidate;
70
+ }
71
+
72
+ return path.join(base, 'antigravity');
73
+ }
74
+
75
+ /**
76
+ * Return the global config base directory for the given runtime.
77
+ * Respects the same env-var overrides as bin/install.js getGlobalDir().
78
+ *
79
+ * @param {string} runtime
80
+ * @returns {string} Absolute path to the runtime's global config directory
81
+ */
82
+ function getGlobalConfigDir(runtime) {
83
+ const home = os.homedir();
84
+ const env = process.env;
85
+
86
+ switch (runtime) {
87
+ // ── Claude Code ──────────────────────────────────────────────────────────
88
+ case 'claude':
89
+ return env.CLAUDE_CONFIG_DIR ? expandTilde(env.CLAUDE_CONFIG_DIR) : path.join(home, '.claude');
90
+
91
+ // ── Cursor ───────────────────────────────────────────────────────────────
92
+ case 'cursor':
93
+ return env.CURSOR_CONFIG_DIR ? expandTilde(env.CURSOR_CONFIG_DIR) : path.join(home, '.cursor');
94
+
95
+ // ── Gemini CLI ───────────────────────────────────────────────────────────
96
+ case 'gemini':
97
+ return env.GEMINI_CONFIG_DIR ? expandTilde(env.GEMINI_CONFIG_DIR) : path.join(home, '.gemini');
98
+
99
+ // ── Codex ────────────────────────────────────────────────────────────────
100
+ case 'codex':
101
+ return env.CODEX_HOME ? expandTilde(env.CODEX_HOME) : path.join(home, '.codex');
102
+
103
+ // ── Grok Build ───────────────────────────────────────────────────────────
104
+ // Uses the unified ~/.agents layout (skills + agents + engine) shared with
105
+ // Codex-style harnesses. This is the pragmatic primary target for users
106
+ // running GSD inside Grok Build.
107
+ case 'grok':
108
+ return env.GROK_AGENTS_HOME ? expandTilde(env.GROK_AGENTS_HOME) : path.join(home, '.agents');
109
+
110
+ // ── Copilot (VS Code) ────────────────────────────────────────────────────
111
+ case 'copilot':
112
+ return env.COPILOT_CONFIG_DIR ? expandTilde(env.COPILOT_CONFIG_DIR) : path.join(home, '.copilot');
113
+
114
+ // ── Antigravity ──────────────────────────────────────────────────────────
115
+ case 'antigravity':
116
+ return resolveAntigravityGlobalDir({ env, home });
117
+
118
+ // ── Windsurf ─────────────────────────────────────────────────────────────
119
+ case 'windsurf':
120
+ return env.WINDSURF_CONFIG_DIR
121
+ ? expandTilde(env.WINDSURF_CONFIG_DIR)
122
+ : path.join(home, '.codeium', 'windsurf');
123
+
124
+ // ── Augment ──────────────────────────────────────────────────────────────
125
+ case 'augment':
126
+ return env.AUGMENT_CONFIG_DIR ? expandTilde(env.AUGMENT_CONFIG_DIR) : path.join(home, '.augment');
127
+
128
+ // ── Trae ─────────────────────────────────────────────────────────────────
129
+ case 'trae':
130
+ return env.TRAE_CONFIG_DIR ? expandTilde(env.TRAE_CONFIG_DIR) : path.join(home, '.trae');
131
+
132
+ // ── Qwen Code ────────────────────────────────────────────────────────────
133
+ case 'qwen':
134
+ return env.QWEN_CONFIG_DIR ? expandTilde(env.QWEN_CONFIG_DIR) : path.join(home, '.qwen');
135
+
136
+ // ── Hermes Agent ─────────────────────────────────────────────────────────
137
+ // Note: skills use a nested layout (skills/gsd/<skill>/) — see getGlobalSkillDir().
138
+ case 'hermes':
139
+ return env.HERMES_HOME ? expandTilde(env.HERMES_HOME) : path.join(home, '.hermes');
140
+
141
+ // ── CodeBuddy ────────────────────────────────────────────────────────────
142
+ case 'codebuddy':
143
+ return env.CODEBUDDY_CONFIG_DIR ? expandTilde(env.CODEBUDDY_CONFIG_DIR) : path.join(home, '.codebuddy');
144
+
145
+ // ── Cline ────────────────────────────────────────────────────────────────
146
+ // Note: Cline is rules-based (.clinerules) — no skills/ directory.
147
+ // getGlobalSkillDir() returns null for cline.
148
+ case 'cline':
149
+ return env.CLINE_CONFIG_DIR ? expandTilde(env.CLINE_CONFIG_DIR) : path.join(home, '.cline');
150
+
151
+ // ── OpenCode (XDG) ───────────────────────────────────────────────────────
152
+ case 'opencode': {
153
+ if (env.OPENCODE_CONFIG_DIR) return expandTilde(env.OPENCODE_CONFIG_DIR);
154
+ if (env.XDG_CONFIG_HOME) return path.join(expandTilde(env.XDG_CONFIG_HOME), 'opencode');
155
+ return path.join(home, '.config', 'opencode');
156
+ }
157
+
158
+ // ── Kilo (XDG) ───────────────────────────────────────────────────────────
159
+ case 'kilo': {
160
+ if (env.KILO_CONFIG_DIR) return expandTilde(env.KILO_CONFIG_DIR);
161
+ if (env.XDG_CONFIG_HOME) return path.join(expandTilde(env.XDG_CONFIG_HOME), 'kilo');
162
+ return path.join(home, '.config', 'kilo');
163
+ }
164
+
165
+ // ── Default (Claude fallback) ─────────────────────────────────────────────
166
+ default:
167
+ return env.CLAUDE_CONFIG_DIR ? expandTilde(env.CLAUDE_CONFIG_DIR) : path.join(home, '.claude');
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Return the global skills base directory for the given runtime.
173
+ * Most runtimes: <configDir>/skills
174
+ * Hermes: <configDir>/skills/gsd (nested category layout — #2841)
175
+ * Cline: null (rules-based, no skills directory)
176
+ *
177
+ * @param {string} runtime
178
+ * @returns {string|null}
179
+ */
180
+ function getGlobalSkillsBase(runtime) {
181
+ if (runtime === 'cline') return null;
182
+ const configDir = getGlobalConfigDir(runtime);
183
+ if (runtime === 'hermes') return path.join(configDir, 'skills', 'gsd');
184
+ return path.join(configDir, 'skills');
185
+ }
186
+
187
+ /**
188
+ * Return the full path to a specific skill's directory for the given runtime.
189
+ * Returns null for runtimes that don't use a skills directory (cline).
190
+ *
191
+ * @param {string} runtime
192
+ * @param {string} skillName - e.g. 'gsd-executor'
193
+ * @returns {string|null}
194
+ */
195
+ function getGlobalSkillDir(runtime, skillName) {
196
+ const base = getGlobalSkillsBase(runtime);
197
+ if (base === null) return null;
198
+ return path.join(base, skillName);
199
+ }
200
+
201
+ /**
202
+ * Return a human-readable display path for a global skill (for log messages).
203
+ *
204
+ * @param {string} runtime
205
+ * @param {string} skillName
206
+ * @returns {string}
207
+ */
208
+ function getGlobalSkillDisplayPath(runtime, skillName) {
209
+ const dir = getGlobalSkillDir(runtime, skillName);
210
+ if (!dir) return `(${runtime} does not use a skills directory)`;
211
+ // Replace homedir prefix with ~ for readability
212
+ const home = os.homedir();
213
+ return dir.startsWith(home) ? '~' + dir.slice(home.length) : dir;
214
+ }
215
+
216
+ module.exports = {
217
+ getGlobalConfigDir,
218
+ getGlobalSkillsBase,
219
+ getGlobalSkillDir,
220
+ getGlobalSkillDisplayPath,
221
+ resolveAntigravityGlobalDir,
222
+ };
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+
6
+ const FALLBACK_ALIASES = {
7
+ claude: ['claude', 'claude-code', 'claude-cli'],
8
+ opencode: ['opencode', 'open-code', 'opencode-cli'],
9
+ kilo: ['kilo', 'kilo-cli'],
10
+ gemini: ['gemini', 'gemini-cli', 'gemini-code'],
11
+ codex: ['codex', 'codex-app', 'codex-cli', 'codex_desktop', 'codex-desktop'],
12
+ copilot: ['copilot', 'copilot-cli', 'github-copilot'],
13
+ antigravity: ['antigravity', 'antigravity-cli', 'antigravity-agent'],
14
+ cursor: ['cursor', 'cursor-cli', 'cursor-nightly'],
15
+ windsurf: ['windsurf', 'windsurf-cli', 'windsurf-next'],
16
+ augment: ['augment', 'augment-code', 'augment-cli'],
17
+ trae: ['trae', 'trae-cli'],
18
+ qwen: ['qwen', 'qwen-code', 'qwen-cli'],
19
+ hermes: ['hermes', 'hermes-agent', 'hermes-cli'],
20
+ codebuddy: ['codebuddy', 'codebuddy-cli'],
21
+ cline: ['cline', 'cline-cli'],
22
+ };
23
+
24
+ function normalizeRuntimeToken(value) {
25
+ return String(value).trim().toLowerCase().replace(/[_\s]+/g, '-');
26
+ }
27
+
28
+ function loadAliasManifest() {
29
+ const manifestCandidates = [
30
+ path.resolve(__dirname, '..', 'shared', 'runtime-aliases.manifest.json'),
31
+ path.resolve(__dirname, '../../../sdk/shared/runtime-aliases.manifest.json'),
32
+ ];
33
+ for (const manifestPath of manifestCandidates) {
34
+ try {
35
+ const parsed = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
36
+ if (parsed && typeof parsed === 'object') return parsed;
37
+ } catch {
38
+ // Try next candidate.
39
+ }
40
+ }
41
+ return FALLBACK_ALIASES;
42
+ }
43
+
44
+ const aliasManifest = loadAliasManifest();
45
+ const aliasToCanonical = new Map();
46
+ for (const [canonical, aliases] of Object.entries(aliasManifest)) {
47
+ if (typeof canonical !== 'string' || !Array.isArray(aliases)) continue;
48
+ aliasToCanonical.set(normalizeRuntimeToken(canonical), normalizeRuntimeToken(canonical));
49
+ for (const alias of aliases) {
50
+ if (typeof alias !== 'string') continue;
51
+ aliasToCanonical.set(normalizeRuntimeToken(alias), normalizeRuntimeToken(canonical));
52
+ }
53
+ }
54
+
55
+ function canonicalizeRuntimeName(value) {
56
+ if (typeof value !== 'string') return null;
57
+ return aliasToCanonical.get(normalizeRuntimeToken(value)) || null;
58
+ }
59
+
60
+ /**
61
+ * Resolve runtime from a precedence list of candidate values.
62
+ *
63
+ * - First non-empty string candidate wins.
64
+ * - Known aliases are canonicalized (codex-cli -> codex).
65
+ * - Unknown values are normalized and returned (future-runtime tolerance).
66
+ *
67
+ * @param {...string} candidates
68
+ * @returns {string|null}
69
+ */
70
+ function resolveRuntimeNameFromCandidates(...candidates) {
71
+ for (const candidate of candidates) {
72
+ if (typeof candidate !== 'string') continue;
73
+ const normalized = normalizeRuntimeToken(candidate);
74
+ if (!normalized) continue;
75
+ return canonicalizeRuntimeName(normalized) || normalized;
76
+ }
77
+ return null;
78
+ }
79
+
80
+ module.exports = {
81
+ canonicalizeRuntimeName,
82
+ resolveRuntimeNameFromCandidates,
83
+ };