@therocketcode/gsd-core 1.4.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 (568) hide show
  1. package/.claude-plugin/plugin.json +23 -0
  2. package/GEMINI.md +53 -0
  3. package/LICENSE +21 -0
  4. package/README.ja-JP.md +125 -0
  5. package/README.ko-KR.md +125 -0
  6. package/README.md +144 -0
  7. package/README.pt-BR.md +125 -0
  8. package/README.zh-CN.md +125 -0
  9. package/agents/gsd-advisor-researcher.md +108 -0
  10. package/agents/gsd-ai-researcher.md +114 -0
  11. package/agents/gsd-assumptions-analyzer.md +105 -0
  12. package/agents/gsd-code-fixer.md +668 -0
  13. package/agents/gsd-code-reviewer.md +387 -0
  14. package/agents/gsd-codebase-mapper.md +853 -0
  15. package/agents/gsd-debug-session-manager.md +314 -0
  16. package/agents/gsd-debugger.md +1452 -0
  17. package/agents/gsd-doc-classifier.md +168 -0
  18. package/agents/gsd-doc-synthesizer.md +204 -0
  19. package/agents/gsd-doc-verifier.md +217 -0
  20. package/agents/gsd-doc-writer.md +616 -0
  21. package/agents/gsd-domain-researcher.md +147 -0
  22. package/agents/gsd-eval-auditor.md +191 -0
  23. package/agents/gsd-eval-planner.md +154 -0
  24. package/agents/gsd-executor.md +785 -0
  25. package/agents/gsd-framework-selector.md +160 -0
  26. package/agents/gsd-integration-checker.md +470 -0
  27. package/agents/gsd-intel-updater.md +342 -0
  28. package/agents/gsd-nyquist-auditor.md +203 -0
  29. package/agents/gsd-pattern-mapper.md +335 -0
  30. package/agents/gsd-phase-researcher.md +867 -0
  31. package/agents/gsd-plan-checker.md +978 -0
  32. package/agents/gsd-planner.md +1204 -0
  33. package/agents/gsd-project-researcher.md +611 -0
  34. package/agents/gsd-research-synthesizer.md +259 -0
  35. package/agents/gsd-roadmapper.md +688 -0
  36. package/agents/gsd-security-auditor.md +155 -0
  37. package/agents/gsd-ui-auditor.md +495 -0
  38. package/agents/gsd-ui-checker.md +309 -0
  39. package/agents/gsd-ui-researcher.md +374 -0
  40. package/agents/gsd-user-profiler.md +171 -0
  41. package/agents/gsd-verifier.md +923 -0
  42. package/assets/gsd-logo-2000-transparent.png +0 -0
  43. package/assets/gsd-logo-2000-transparent.svg +17 -0
  44. package/assets/gsd-logo-2000.png +0 -0
  45. package/assets/gsd-logo-2000.svg +21 -0
  46. package/assets/terminal.svg +68 -0
  47. package/bin/install.js +12726 -0
  48. package/bin/lib/ui-safety-gate.cjs +107 -0
  49. package/commands/gsd/add-tests.md +42 -0
  50. package/commands/gsd/ai-integration-phase.md +37 -0
  51. package/commands/gsd/audit-fix.md +34 -0
  52. package/commands/gsd/audit-milestone.md +37 -0
  53. package/commands/gsd/audit-uat.md +24 -0
  54. package/commands/gsd/autonomous.md +48 -0
  55. package/commands/gsd/capture.md +62 -0
  56. package/commands/gsd/cleanup.md +24 -0
  57. package/commands/gsd/code-review.md +59 -0
  58. package/commands/gsd/complete-milestone.md +143 -0
  59. package/commands/gsd/config.md +56 -0
  60. package/commands/gsd/debug.md +52 -0
  61. package/commands/gsd/discover-product.md +65 -0
  62. package/commands/gsd/discuss-phase.md +77 -0
  63. package/commands/gsd/docs-update.md +49 -0
  64. package/commands/gsd/eval-review.md +33 -0
  65. package/commands/gsd/execute-phase.md +66 -0
  66. package/commands/gsd/explore.md +27 -0
  67. package/commands/gsd/extract-learnings.md +23 -0
  68. package/commands/gsd/fast.md +31 -0
  69. package/commands/gsd/forensics.md +57 -0
  70. package/commands/gsd/graphify.md +204 -0
  71. package/commands/gsd/health.md +31 -0
  72. package/commands/gsd/help.md +28 -0
  73. package/commands/gsd/import.md +45 -0
  74. package/commands/gsd/inbox.md +39 -0
  75. package/commands/gsd/ingest-docs.md +42 -0
  76. package/commands/gsd/manager.md +45 -0
  77. package/commands/gsd/map-codebase.md +83 -0
  78. package/commands/gsd/milestone-summary.md +51 -0
  79. package/commands/gsd/model-domain.md +65 -0
  80. package/commands/gsd/mvp-phase.md +45 -0
  81. package/commands/gsd/new-milestone.md +45 -0
  82. package/commands/gsd/new-project.md +47 -0
  83. package/commands/gsd/ns-context.md +23 -0
  84. package/commands/gsd/ns-ideate.md +24 -0
  85. package/commands/gsd/ns-manage.md +29 -0
  86. package/commands/gsd/ns-project.md +22 -0
  87. package/commands/gsd/ns-review.md +26 -0
  88. package/commands/gsd/ns-workflow.md +28 -0
  89. package/commands/gsd/pause-work.md +43 -0
  90. package/commands/gsd/phase.md +56 -0
  91. package/commands/gsd/plan-phase.md +64 -0
  92. package/commands/gsd/plan-review-convergence.md +59 -0
  93. package/commands/gsd/pr-branch.md +26 -0
  94. package/commands/gsd/profile-user.md +46 -0
  95. package/commands/gsd/progress.md +48 -0
  96. package/commands/gsd/quick.md +174 -0
  97. package/commands/gsd/recommend-architecture.md +64 -0
  98. package/commands/gsd/resume-work.md +30 -0
  99. package/commands/gsd/review-backlog.md +63 -0
  100. package/commands/gsd/review.md +42 -0
  101. package/commands/gsd/secure-phase.md +36 -0
  102. package/commands/gsd/settings.md +29 -0
  103. package/commands/gsd/ship.md +24 -0
  104. package/commands/gsd/sketch.md +60 -0
  105. package/commands/gsd/spec-phase.md +63 -0
  106. package/commands/gsd/spike.md +57 -0
  107. package/commands/gsd/stats.md +20 -0
  108. package/commands/gsd/surface.md +155 -0
  109. package/commands/gsd/testing-strategy.md +65 -0
  110. package/commands/gsd/thread.md +24 -0
  111. package/commands/gsd/ui-phase.md +35 -0
  112. package/commands/gsd/ui-review.md +33 -0
  113. package/commands/gsd/ultraplan-phase.md +34 -0
  114. package/commands/gsd/undo.md +35 -0
  115. package/commands/gsd/update.md +49 -0
  116. package/commands/gsd/validate-phase.md +36 -0
  117. package/commands/gsd/verify-work.md +39 -0
  118. package/commands/gsd/workspace.md +52 -0
  119. package/commands/gsd/workstreams.md +70 -0
  120. package/gemini-extension.json +6 -0
  121. package/gsd-core/bin/check-latest-version.cjs +161 -0
  122. package/gsd-core/bin/gsd-tools.cjs +1928 -0
  123. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  124. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  125. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  126. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  127. package/gsd-core/bin/lib/audit.cjs +743 -0
  128. package/gsd-core/bin/lib/check-command-router.cjs +343 -0
  129. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  130. package/gsd-core/bin/lib/cli-exit.cjs +42 -0
  131. package/gsd-core/bin/lib/clock.cjs +95 -0
  132. package/gsd-core/bin/lib/clusters.cjs +132 -0
  133. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  134. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  135. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  136. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  137. package/gsd-core/bin/lib/commands.cjs +1203 -0
  138. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  139. package/gsd-core/bin/lib/config-types.cjs +19 -0
  140. package/gsd-core/bin/lib/config.cjs +738 -0
  141. package/gsd-core/bin/lib/configuration.cjs +239 -0
  142. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  143. package/gsd-core/bin/lib/core.cjs +2051 -0
  144. package/gsd-core/bin/lib/decisions.cjs +118 -0
  145. package/gsd-core/bin/lib/docs.cjs +252 -0
  146. package/gsd-core/bin/lib/drift.cjs +364 -0
  147. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  148. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  149. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  150. package/gsd-core/bin/lib/graphify.cjs +496 -0
  151. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  152. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  153. package/gsd-core/bin/lib/init.cjs +1815 -0
  154. package/gsd-core/bin/lib/install-profiles.cjs +584 -0
  155. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  156. package/gsd-core/bin/lib/installer-migration-report.cjs +350 -0
  157. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  158. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  159. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  160. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  161. package/gsd-core/bin/lib/installer-migrations.cjs +823 -0
  162. package/gsd-core/bin/lib/intel.cjs +590 -0
  163. package/gsd-core/bin/lib/learnings.cjs +270 -0
  164. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  165. package/gsd-core/bin/lib/milestone.cjs +373 -0
  166. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  167. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  168. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  169. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  170. package/gsd-core/bin/lib/observability/redaction.cjs +48 -0
  171. package/gsd-core/bin/lib/package-identity.cjs +35 -0
  172. package/gsd-core/bin/lib/package-legitimacy.cjs +368 -0
  173. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  174. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  175. package/gsd-core/bin/lib/phase.cjs +1307 -0
  176. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  177. package/gsd-core/bin/lib/plan-scan.cjs +91 -0
  178. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  179. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  180. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  181. package/gsd-core/bin/lib/project-root.cjs +119 -0
  182. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  183. package/gsd-core/bin/lib/research-provider.cjs +137 -0
  184. package/gsd-core/bin/lib/research-store.cjs +167 -0
  185. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  186. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  187. package/gsd-core/bin/lib/roadmap-upgrade.cjs +476 -0
  188. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  189. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +312 -0
  190. package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +56 -0
  191. package/gsd-core/bin/lib/runtime-homes.cjs +190 -0
  192. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  193. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  194. package/gsd-core/bin/lib/schema-detect.cjs +159 -0
  195. package/gsd-core/bin/lib/secrets.cjs +34 -0
  196. package/gsd-core/bin/lib/security.cjs +480 -0
  197. package/gsd-core/bin/lib/semver-compare.cjs +42 -0
  198. package/gsd-core/bin/lib/shell-command-projection.cjs +533 -0
  199. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  200. package/gsd-core/bin/lib/state-document.cjs +259 -0
  201. package/gsd-core/bin/lib/state.cjs +2010 -0
  202. package/gsd-core/bin/lib/surface.cjs +449 -0
  203. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  204. package/gsd-core/bin/lib/template.cjs +237 -0
  205. package/gsd-core/bin/lib/uat.cjs +297 -0
  206. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  207. package/gsd-core/bin/lib/update-context.cjs +218 -0
  208. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  209. package/gsd-core/bin/lib/validate.cjs +112 -0
  210. package/gsd-core/bin/lib/verification-command-router.cjs +31 -0
  211. package/gsd-core/bin/lib/verification.cjs +193 -0
  212. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  213. package/gsd-core/bin/lib/verify.cjs +1451 -0
  214. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +81 -0
  215. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  216. package/gsd-core/bin/lib/workstream-name-policy.cjs +91 -0
  217. package/gsd-core/bin/lib/workstream.cjs +380 -0
  218. package/gsd-core/bin/lib/worktree-base-ref.cjs +325 -0
  219. package/gsd-core/bin/lib/worktree-safety.cjs +943 -0
  220. package/gsd-core/bin/shared/config-defaults.manifest.json +98 -0
  221. package/gsd-core/bin/shared/config-schema.manifest.json +192 -0
  222. package/gsd-core/bin/shared/model-catalog.json +149 -0
  223. package/gsd-core/bin/shared/runtime-aliases.manifest.json +75 -0
  224. package/gsd-core/bin/verify-reapply-patches.cjs +349 -0
  225. package/gsd-core/contexts/dev.md +21 -0
  226. package/gsd-core/contexts/research.md +22 -0
  227. package/gsd-core/contexts/review.md +23 -0
  228. package/gsd-core/references/agent-contracts.md +79 -0
  229. package/gsd-core/references/ai-evals.md +156 -0
  230. package/gsd-core/references/ai-frameworks.md +186 -0
  231. package/gsd-core/references/architecture-decision.md +74 -0
  232. package/gsd-core/references/artifact-types.md +131 -0
  233. package/gsd-core/references/auth-in-tests.md +91 -0
  234. package/gsd-core/references/autonomous-smart-discuss.md +277 -0
  235. package/gsd-core/references/checkpoints.md +814 -0
  236. package/gsd-core/references/common-bug-patterns.md +114 -0
  237. package/gsd-core/references/context-budget.md +85 -0
  238. package/gsd-core/references/continuation-format.md +253 -0
  239. package/gsd-core/references/db-test-isolation.md +54 -0
  240. package/gsd-core/references/debugger-philosophy.md +76 -0
  241. package/gsd-core/references/decimal-phase-calculation.md +64 -0
  242. package/gsd-core/references/doc-conflict-engine.md +91 -0
  243. package/gsd-core/references/domain-modeling.md +80 -0
  244. package/gsd-core/references/domain-probes.md +125 -0
  245. package/gsd-core/references/e2e-tiering.md +35 -0
  246. package/gsd-core/references/execute-mvp-tdd.md +81 -0
  247. package/gsd-core/references/executor-examples.md +110 -0
  248. package/gsd-core/references/few-shot-examples/plan-checker.md +73 -0
  249. package/gsd-core/references/few-shot-examples/verifier.md +109 -0
  250. package/gsd-core/references/flaky-test-checklist.md +22 -0
  251. package/gsd-core/references/gate-prompts.md +100 -0
  252. package/gsd-core/references/gates.md +70 -0
  253. package/gsd-core/references/git-integration.md +298 -0
  254. package/gsd-core/references/git-planning-commit.md +40 -0
  255. package/gsd-core/references/ios-scaffold.md +123 -0
  256. package/gsd-core/references/mandatory-initial-read.md +2 -0
  257. package/gsd-core/references/model-profile-resolution.md +38 -0
  258. package/gsd-core/references/model-profiles.md +245 -0
  259. package/gsd-core/references/mvp-concepts.md +49 -0
  260. package/gsd-core/references/phase-argument-parsing.md +61 -0
  261. package/gsd-core/references/planner-antipatterns.md +89 -0
  262. package/gsd-core/references/planner-chunked.md +49 -0
  263. package/gsd-core/references/planner-gap-closure.md +62 -0
  264. package/gsd-core/references/planner-graphify-auto-update.md +67 -0
  265. package/gsd-core/references/planner-human-verify-mode.md +57 -0
  266. package/gsd-core/references/planner-interface-context.md +62 -0
  267. package/gsd-core/references/planner-load-graph-context.md +36 -0
  268. package/gsd-core/references/planner-mvp-mode.md +53 -0
  269. package/gsd-core/references/planner-reviews.md +39 -0
  270. package/gsd-core/references/planner-revision.md +87 -0
  271. package/gsd-core/references/planner-source-audit.md +73 -0
  272. package/gsd-core/references/planning-config.md +473 -0
  273. package/gsd-core/references/product-discovery.md +49 -0
  274. package/gsd-core/references/project-skills-discovery.md +19 -0
  275. package/gsd-core/references/questioning.md +162 -0
  276. package/gsd-core/references/realistic-test-data.md +44 -0
  277. package/gsd-core/references/research-documentation-lookup.md +29 -0
  278. package/gsd-core/references/research-philosophy.md +29 -0
  279. package/gsd-core/references/research-verification-protocol.md +27 -0
  280. package/gsd-core/references/revision-loop.md +97 -0
  281. package/gsd-core/references/scout-codebase.md +51 -0
  282. package/gsd-core/references/skeleton-template.md +48 -0
  283. package/gsd-core/references/sketch-interactivity.md +41 -0
  284. package/gsd-core/references/sketch-theme-system.md +94 -0
  285. package/gsd-core/references/sketch-tooling.md +45 -0
  286. package/gsd-core/references/sketch-variant-patterns.md +81 -0
  287. package/gsd-core/references/spidr-splitting.md +69 -0
  288. package/gsd-core/references/tdd.md +330 -0
  289. package/gsd-core/references/test-containers.md +55 -0
  290. package/gsd-core/references/test-strategy.md +75 -0
  291. package/gsd-core/references/thinking-models-debug.md +44 -0
  292. package/gsd-core/references/thinking-models-execution.md +50 -0
  293. package/gsd-core/references/thinking-models-planning.md +62 -0
  294. package/gsd-core/references/thinking-models-research.md +50 -0
  295. package/gsd-core/references/thinking-models-verification.md +55 -0
  296. package/gsd-core/references/thinking-partner.md +96 -0
  297. package/gsd-core/references/ui-brand.md +162 -0
  298. package/gsd-core/references/universal-anti-patterns.md +63 -0
  299. package/gsd-core/references/user-profiling.md +681 -0
  300. package/gsd-core/references/user-story-template.md +58 -0
  301. package/gsd-core/references/verification-overrides.md +227 -0
  302. package/gsd-core/references/verification-patterns.md +612 -0
  303. package/gsd-core/references/verify-mvp-mode.md +85 -0
  304. package/gsd-core/references/workstream-flag.md +111 -0
  305. package/gsd-core/references/worktree-branch-check.md +38 -0
  306. package/gsd-core/references/worktree-path-safety.md +67 -0
  307. package/gsd-core/templates/AI-SPEC.md +246 -0
  308. package/gsd-core/templates/DEBUG.md +169 -0
  309. package/gsd-core/templates/README.md +77 -0
  310. package/gsd-core/templates/SECURITY.md +61 -0
  311. package/gsd-core/templates/UAT.md +265 -0
  312. package/gsd-core/templates/UI-SPEC.md +100 -0
  313. package/gsd-core/templates/VALIDATION.md +76 -0
  314. package/gsd-core/templates/adr.md +58 -0
  315. package/gsd-core/templates/claude-md.md +145 -0
  316. package/gsd-core/templates/codebase/architecture.md +255 -0
  317. package/gsd-core/templates/codebase/concerns.md +310 -0
  318. package/gsd-core/templates/codebase/conventions.md +307 -0
  319. package/gsd-core/templates/codebase/integrations.md +280 -0
  320. package/gsd-core/templates/codebase/stack.md +186 -0
  321. package/gsd-core/templates/codebase/structure.md +285 -0
  322. package/gsd-core/templates/codebase/testing.md +480 -0
  323. package/gsd-core/templates/config.json +62 -0
  324. package/gsd-core/templates/context.md +352 -0
  325. package/gsd-core/templates/continue-here.md +78 -0
  326. package/gsd-core/templates/copilot-instructions.md +7 -0
  327. package/gsd-core/templates/debug-subagent-prompt.md +91 -0
  328. package/gsd-core/templates/dev-preferences.md +21 -0
  329. package/gsd-core/templates/discovery.md +146 -0
  330. package/gsd-core/templates/discussion-log.md +63 -0
  331. package/gsd-core/templates/domain-model.md +54 -0
  332. package/gsd-core/templates/milestone-archive.md +123 -0
  333. package/gsd-core/templates/milestone.md +115 -0
  334. package/gsd-core/templates/phase-prompt.md +610 -0
  335. package/gsd-core/templates/planner-subagent-prompt.md +117 -0
  336. package/gsd-core/templates/product-brief.md +55 -0
  337. package/gsd-core/templates/project.md +186 -0
  338. package/gsd-core/templates/requirements.md +231 -0
  339. package/gsd-core/templates/research-project/ARCHITECTURE.md +204 -0
  340. package/gsd-core/templates/research-project/FEATURES.md +147 -0
  341. package/gsd-core/templates/research-project/PITFALLS.md +200 -0
  342. package/gsd-core/templates/research-project/STACK.md +120 -0
  343. package/gsd-core/templates/research-project/SUMMARY.md +170 -0
  344. package/gsd-core/templates/research.md +592 -0
  345. package/gsd-core/templates/retrospective.md +54 -0
  346. package/gsd-core/templates/roadmap.md +202 -0
  347. package/gsd-core/templates/spec.md +307 -0
  348. package/gsd-core/templates/state.md +195 -0
  349. package/gsd-core/templates/summary-complex.md +59 -0
  350. package/gsd-core/templates/summary-minimal.md +41 -0
  351. package/gsd-core/templates/summary-standard.md +48 -0
  352. package/gsd-core/templates/summary.md +248 -0
  353. package/gsd-core/templates/test-strategy.md +50 -0
  354. package/gsd-core/templates/user-profile.md +146 -0
  355. package/gsd-core/templates/user-setup.md +311 -0
  356. package/gsd-core/templates/verification-report.md +322 -0
  357. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  358. package/gsd-core/workflows/add-backlog.md +91 -0
  359. package/gsd-core/workflows/add-phase.md +113 -0
  360. package/gsd-core/workflows/add-tests.md +355 -0
  361. package/gsd-core/workflows/add-todo.md +161 -0
  362. package/gsd-core/workflows/ai-integration-phase.md +295 -0
  363. package/gsd-core/workflows/analyze-dependencies.md +96 -0
  364. package/gsd-core/workflows/audit-fix.md +178 -0
  365. package/gsd-core/workflows/audit-milestone.md +360 -0
  366. package/gsd-core/workflows/audit-uat.md +110 -0
  367. package/gsd-core/workflows/autonomous.md +797 -0
  368. package/gsd-core/workflows/check-todos.md +180 -0
  369. package/gsd-core/workflows/cleanup.md +195 -0
  370. package/gsd-core/workflows/code-review-fix.md +502 -0
  371. package/gsd-core/workflows/code-review.md +658 -0
  372. package/gsd-core/workflows/complete-milestone.md +855 -0
  373. package/gsd-core/workflows/debug.md +237 -0
  374. package/gsd-core/workflows/diagnose-issues.md +245 -0
  375. package/gsd-core/workflows/discover-product.md +112 -0
  376. package/gsd-core/workflows/discovery-phase.md +291 -0
  377. package/gsd-core/workflows/discuss-phase/modes/advisor.md +176 -0
  378. package/gsd-core/workflows/discuss-phase/modes/all.md +28 -0
  379. package/gsd-core/workflows/discuss-phase/modes/analyze.md +44 -0
  380. package/gsd-core/workflows/discuss-phase/modes/auto.md +57 -0
  381. package/gsd-core/workflows/discuss-phase/modes/batch.md +52 -0
  382. package/gsd-core/workflows/discuss-phase/modes/chain.md +98 -0
  383. package/gsd-core/workflows/discuss-phase/modes/default.md +141 -0
  384. package/gsd-core/workflows/discuss-phase/modes/power.md +44 -0
  385. package/gsd-core/workflows/discuss-phase/modes/text.md +55 -0
  386. package/gsd-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
  387. package/gsd-core/workflows/discuss-phase/templates/context.md +136 -0
  388. package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
  389. package/gsd-core/workflows/discuss-phase-assumptions.md +675 -0
  390. package/gsd-core/workflows/discuss-phase-power.md +291 -0
  391. package/gsd-core/workflows/discuss-phase.md +499 -0
  392. package/gsd-core/workflows/do.md +111 -0
  393. package/gsd-core/workflows/docs-update.md +1176 -0
  394. package/gsd-core/workflows/edit-phase.md +295 -0
  395. package/gsd-core/workflows/eval-review.md +156 -0
  396. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
  397. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  398. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
  399. package/gsd-core/workflows/execute-phase.md +1752 -0
  400. package/gsd-core/workflows/execute-plan.md +526 -0
  401. package/gsd-core/workflows/explore.md +146 -0
  402. package/gsd-core/workflows/extract-learnings.md +243 -0
  403. package/gsd-core/workflows/fast.md +124 -0
  404. package/gsd-core/workflows/forensics.md +279 -0
  405. package/gsd-core/workflows/graduation.md +196 -0
  406. package/gsd-core/workflows/health.md +224 -0
  407. package/gsd-core/workflows/help/modes/brief.md +22 -0
  408. package/gsd-core/workflows/help/modes/default.md +50 -0
  409. package/gsd-core/workflows/help/modes/full.md +789 -0
  410. package/gsd-core/workflows/help/modes/topic.md +74 -0
  411. package/gsd-core/workflows/help.md +24 -0
  412. package/gsd-core/workflows/import.md +256 -0
  413. package/gsd-core/workflows/inbox.md +387 -0
  414. package/gsd-core/workflows/ingest-docs.md +340 -0
  415. package/gsd-core/workflows/insert-phase.md +152 -0
  416. package/gsd-core/workflows/list-phase-assumptions.md +178 -0
  417. package/gsd-core/workflows/list-workspaces.md +57 -0
  418. package/gsd-core/workflows/manager.md +393 -0
  419. package/gsd-core/workflows/map-codebase.md +446 -0
  420. package/gsd-core/workflows/milestone-summary.md +224 -0
  421. package/gsd-core/workflows/model-domain.md +162 -0
  422. package/gsd-core/workflows/mvp-phase.md +222 -0
  423. package/gsd-core/workflows/new-milestone.md +635 -0
  424. package/gsd-core/workflows/new-project.md +1555 -0
  425. package/gsd-core/workflows/new-workspace.md +240 -0
  426. package/gsd-core/workflows/next.md +299 -0
  427. package/gsd-core/workflows/node-repair.md +92 -0
  428. package/gsd-core/workflows/note.md +158 -0
  429. package/gsd-core/workflows/pause-work.md +244 -0
  430. package/gsd-core/workflows/plan-milestone-gaps.md +281 -0
  431. package/gsd-core/workflows/plan-phase.md +1814 -0
  432. package/gsd-core/workflows/plan-review-convergence.md +346 -0
  433. package/gsd-core/workflows/plant-seed.md +230 -0
  434. package/gsd-core/workflows/pr-branch.md +157 -0
  435. package/gsd-core/workflows/profile-user.md +453 -0
  436. package/gsd-core/workflows/progress.md +699 -0
  437. package/gsd-core/workflows/quick.md +1017 -0
  438. package/gsd-core/workflows/reapply-patches.md +426 -0
  439. package/gsd-core/workflows/recommend-architecture.md +135 -0
  440. package/gsd-core/workflows/remove-phase.md +156 -0
  441. package/gsd-core/workflows/remove-workspace.md +108 -0
  442. package/gsd-core/workflows/resume-project.md +332 -0
  443. package/gsd-core/workflows/review.md +748 -0
  444. package/gsd-core/workflows/scan.md +107 -0
  445. package/gsd-core/workflows/secure-phase.md +182 -0
  446. package/gsd-core/workflows/session-report.md +146 -0
  447. package/gsd-core/workflows/settings-advanced.md +810 -0
  448. package/gsd-core/workflows/settings-integrations.md +312 -0
  449. package/gsd-core/workflows/settings.md +566 -0
  450. package/gsd-core/workflows/ship.md +405 -0
  451. package/gsd-core/workflows/sketch-wrap-up.md +286 -0
  452. package/gsd-core/workflows/sketch.md +361 -0
  453. package/gsd-core/workflows/spec-phase.md +263 -0
  454. package/gsd-core/workflows/spike-wrap-up.md +307 -0
  455. package/gsd-core/workflows/spike.md +453 -0
  456. package/gsd-core/workflows/stats.md +80 -0
  457. package/gsd-core/workflows/sync-skills.md +182 -0
  458. package/gsd-core/workflows/testing-strategy.md +122 -0
  459. package/gsd-core/workflows/thread.md +222 -0
  460. package/gsd-core/workflows/transition.md +694 -0
  461. package/gsd-core/workflows/ui-phase.md +328 -0
  462. package/gsd-core/workflows/ui-review.md +193 -0
  463. package/gsd-core/workflows/ultraplan-phase.md +199 -0
  464. package/gsd-core/workflows/undo.md +314 -0
  465. package/gsd-core/workflows/update.md +496 -0
  466. package/gsd-core/workflows/validate-phase.md +181 -0
  467. package/gsd-core/workflows/verify-phase.md +544 -0
  468. package/gsd-core/workflows/verify-work.md +781 -0
  469. package/hooks/dist/gsd-check-update-worker.js +108 -0
  470. package/hooks/dist/gsd-check-update.js +66 -0
  471. package/hooks/dist/gsd-config-reload.js +133 -0
  472. package/hooks/dist/gsd-context-monitor.js +195 -0
  473. package/hooks/dist/gsd-cursor-post-tool.js +75 -0
  474. package/hooks/dist/gsd-cursor-session-start.js +52 -0
  475. package/hooks/dist/gsd-graphify-update.sh +158 -0
  476. package/hooks/dist/gsd-phase-boundary.sh +47 -0
  477. package/hooks/dist/gsd-prompt-guard.js +97 -0
  478. package/hooks/dist/gsd-read-guard.js +101 -0
  479. package/hooks/dist/gsd-read-injection-scanner.js +203 -0
  480. package/hooks/dist/gsd-session-state.sh +59 -0
  481. package/hooks/dist/gsd-statusline.js +566 -0
  482. package/hooks/dist/gsd-update-banner.js +138 -0
  483. package/hooks/dist/gsd-validate-commit.sh +57 -0
  484. package/hooks/dist/gsd-workflow-guard.js +167 -0
  485. package/hooks/dist/gsd-worktree-path-guard.js +169 -0
  486. package/hooks/dist/lib/git-cmd.js +150 -0
  487. package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
  488. package/hooks/dist/managed-hooks-registry.cjs +38 -0
  489. package/hooks/gsd-check-update-worker.js +108 -0
  490. package/hooks/gsd-check-update.js +66 -0
  491. package/hooks/gsd-config-reload.js +133 -0
  492. package/hooks/gsd-context-monitor.js +195 -0
  493. package/hooks/gsd-cursor-post-tool.js +75 -0
  494. package/hooks/gsd-cursor-session-start.js +52 -0
  495. package/hooks/gsd-graphify-update.sh +158 -0
  496. package/hooks/gsd-phase-boundary.sh +47 -0
  497. package/hooks/gsd-prompt-guard.js +97 -0
  498. package/hooks/gsd-read-guard.js +101 -0
  499. package/hooks/gsd-read-injection-scanner.js +203 -0
  500. package/hooks/gsd-session-state.sh +59 -0
  501. package/hooks/gsd-statusline.js +566 -0
  502. package/hooks/gsd-update-banner.js +138 -0
  503. package/hooks/gsd-validate-commit.sh +57 -0
  504. package/hooks/gsd-workflow-guard.js +167 -0
  505. package/hooks/gsd-worktree-path-guard.js +169 -0
  506. package/hooks/hooks.json +69 -0
  507. package/hooks/lib/git-cmd.js +150 -0
  508. package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
  509. package/hooks/managed-hooks-registry.cjs +38 -0
  510. package/package.json +115 -0
  511. package/scripts/affected-tests-lib.cjs +542 -0
  512. package/scripts/audit-workflow-script-paths.cjs +73 -0
  513. package/scripts/base64-scan.sh +351 -0
  514. package/scripts/build-hooks.js +247 -0
  515. package/scripts/changeset/README.md +129 -0
  516. package/scripts/changeset/cli.cjs +590 -0
  517. package/scripts/changeset/github-release-notes.cjs +199 -0
  518. package/scripts/changeset/lint.cjs +111 -0
  519. package/scripts/changeset/new.cjs +137 -0
  520. package/scripts/changeset/parse.cjs +114 -0
  521. package/scripts/changeset/render.cjs +34 -0
  522. package/scripts/changeset/serialize.cjs +130 -0
  523. package/scripts/check-alias-drift.cjs +114 -0
  524. package/scripts/check-env.cjs +312 -0
  525. package/scripts/check-npm-integrity.cjs +215 -0
  526. package/scripts/ci-guard-runner.cjs +22 -0
  527. package/scripts/ci-prepare-test-scope.cjs +51 -0
  528. package/scripts/ci-rebase-check.cjs +86 -0
  529. package/scripts/ci-test-scope.cjs +431 -0
  530. package/scripts/command-contract-helpers.cjs +64 -0
  531. package/scripts/diff-touches-shipped-paths.cjs +155 -0
  532. package/scripts/fix-slash-commands.cjs +147 -0
  533. package/scripts/gen-inventory-manifest.cjs +115 -0
  534. package/scripts/gen-research-agents.cjs +276 -0
  535. package/scripts/generate-package-identity.cjs +125 -0
  536. package/scripts/issue-dedupe.cjs +278 -0
  537. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  538. package/scripts/lib/cli-exit.cjs +56 -0
  539. package/scripts/lint-command-contract.cjs +114 -0
  540. package/scripts/lint-descriptions.cjs +87 -0
  541. package/scripts/lint-docs-required.cjs +222 -0
  542. package/scripts/lint-legacy-dir-name.cjs +160 -0
  543. package/scripts/lint-package-identity-drift.cjs +141 -0
  544. package/scripts/lint-pr-check-project-dir.cjs +99 -0
  545. package/scripts/lint-shell-command-projection-drift.cjs +62 -0
  546. package/scripts/lint-skill-deps.cjs +185 -0
  547. package/scripts/lint-test-file-count.allowlist.json +135 -0
  548. package/scripts/lint-test-file-count.cjs +246 -0
  549. package/scripts/mutation-matrix.cjs +222 -0
  550. package/scripts/pr-template-policy.cjs +268 -0
  551. package/scripts/prompt-injection-scan.sh +207 -0
  552. package/scripts/release-notes/discord-release-summary.cjs +373 -0
  553. package/scripts/release-notes/format-github-release-notes.cjs +261 -0
  554. package/scripts/release-tarball-smoke.cjs +629 -0
  555. package/scripts/research-profiles.cjs +149 -0
  556. package/scripts/run-affected-tests.cjs +7 -0
  557. package/scripts/run-cross-platform-tests.cjs +67 -0
  558. package/scripts/run-tests.cjs +315 -0
  559. package/scripts/secret-scan-lint.sh +231 -0
  560. package/scripts/secret-scan.sh +358 -0
  561. package/scripts/setup-branch-protection.sh +236 -0
  562. package/scripts/strip-prose-atrefs.cjs +106 -0
  563. package/scripts/sync-manifest-versions.cjs +119 -0
  564. package/scripts/sync-rulesets.sh +34 -0
  565. package/scripts/sync-runtime-launcher.cjs +399 -0
  566. package/scripts/test-failure-reasons.cjs +34 -0
  567. package/scripts/verify-npm-publish.cjs +240 -0
  568. package/scripts/workflow-policy.cjs +450 -0
@@ -0,0 +1,312 @@
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, stageCommandsForRuntimeFlat, } = 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
+ * Build a converted-commands kind descriptor for runtimes that use a flat
180
+ * commands directory with per-file conversion (e.g. Cursor 1.6 slash commands).
181
+ *
182
+ * Unlike `commandsKind` (which passes raw source files through), this kind
183
+ * applies `converterName` from bin/install.js exports to each file during
184
+ * staging, writing flat `${prefix}${stem}.md` files to the staged directory.
185
+ *
186
+ * The staged files are then written by `_copyStaged` (commands branch) which
187
+ * handles prefix logic via the existing layout machinery.
188
+ *
189
+ * @param destSubpath destination subpath within configDir (e.g. 'commands')
190
+ * @param prefix filename prefix, e.g. 'gsd-'
191
+ * @param converterName name of converter function in bin/install.js exports
192
+ * @param configDir runtime config dir (for .gsd-source marker resolution)
193
+ */
194
+ function convertedCommandsKind(destSubpath, prefix, converterName, configDir) {
195
+ return {
196
+ kind: 'commands',
197
+ destSubpath,
198
+ prefix,
199
+ stage: (resolved) => {
200
+ const installExports = getInstallExports();
201
+ const converter = installExports[converterName];
202
+ return stageCommandsForRuntimeFlat(findInstallSourceRoot(configDir), resolved, converter, prefix);
203
+ },
204
+ };
205
+ }
206
+ // ---------------------------------------------------------------------------
207
+ // Public API
208
+ // ---------------------------------------------------------------------------
209
+ /**
210
+ * Resolve the artifact layout for a given runtime and config directory.
211
+ */
212
+ function resolveRuntimeArtifactLayout(runtime, configDir, scope = 'global') {
213
+ if (typeof configDir !== 'string' || configDir === '') {
214
+ throw new TypeError('configDir must be a non-empty string');
215
+ }
216
+ if (scope !== 'local' && scope !== 'global') {
217
+ throw new TypeError('scope must be "local" or "global"');
218
+ }
219
+ if (!ALLOWED_RUNTIMES.has(runtime)) {
220
+ throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
221
+ }
222
+ let kinds;
223
+ switch (runtime) {
224
+ case 'claude':
225
+ if (scope === 'local') {
226
+ kinds = [
227
+ commandsKind('commands/gsd', 'gsd-', configDir),
228
+ agentsKind('agents', 'gsd-', configDir),
229
+ ];
230
+ }
231
+ else {
232
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClaudeSkill', 'claude', configDir)];
233
+ }
234
+ break;
235
+ case 'cursor':
236
+ // Cursor 1.6+ supports two artifact surfaces:
237
+ // 1. skills/gsd-<name>/SKILL.md — rich skills with frontmatter + adapter header
238
+ // 2. commands/gsd-<name>.md — plain markdown slash commands (no frontmatter)
239
+ // accessed via '/' in the Agent input (#785)
240
+ kinds = [
241
+ skillsKind('skills', 'gsd-', 'convertClaudeCommandToCursorSkill', 'cursor', configDir),
242
+ convertedCommandsKind('commands', 'gsd-', 'convertClaudeCommandToCursorCommand', configDir),
243
+ ];
244
+ break;
245
+ case 'gemini':
246
+ kinds = [commandsKind('commands/gsd', 'gsd-', configDir)];
247
+ break;
248
+ case 'codex':
249
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCodexSkill', 'codex', configDir)];
250
+ break;
251
+ case 'copilot':
252
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCopilotSkill', 'copilot', configDir)];
253
+ break;
254
+ case 'antigravity':
255
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToAntigravitySkill', 'antigravity', configDir)];
256
+ break;
257
+ case 'windsurf':
258
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToWindsurfSkill', 'windsurf', configDir)];
259
+ break;
260
+ case 'augment':
261
+ kinds = [
262
+ commandsKind('commands', 'gsd-', configDir),
263
+ skillsKind('skills', 'gsd-', 'convertClaudeCommandToAugmentSkill', 'augment', configDir),
264
+ ];
265
+ break;
266
+ case 'trae':
267
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToTraeSkill', 'trae', configDir)];
268
+ break;
269
+ case 'qwen':
270
+ kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClaudeSkill', 'qwen', configDir)];
271
+ break;
272
+ case 'hermes':
273
+ kinds = [skillsKind('skills/gsd', '', 'convertClaudeCommandToClaudeSkill', 'hermes', configDir)];
274
+ break;
275
+ case 'codebuddy':
276
+ // CodeBuddy (Tencent) reads two user-level surfaces (codebuddy.ai/docs/cli):
277
+ // 1. commands/gsd-<name>.md — slash commands shown in the '/' menu (#789)
278
+ // 2. skills/gsd-<name>/SKILL.md — model-invocable skills, emitted with
279
+ // user-invocable:false so they stay OUT of '/' (the commands surface is
280
+ // the sole '/' entry point) — avoids a duplicated /gsd-* per workflow.
281
+ // Subagents (~/.codebuddy/agents/) are already emitted by the generic agents
282
+ // block in bin/install.js; MCP is excluded (gsd ships no MCP server).
283
+ kinds = [
284
+ convertedCommandsKind('commands', 'gsd-', 'convertClaudeCommandToCodebuddyCommand', configDir),
285
+ skillsKind('skills', 'gsd-', 'convertClaudeCommandToCodebuddySkill', 'codebuddy', configDir),
286
+ ];
287
+ break;
288
+ case 'cline':
289
+ kinds = scope === 'global' ? [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClineSkill', 'cline', configDir)] : [];
290
+ break;
291
+ case 'opencode':
292
+ // OpenCode reads flat slash commands from command/ and on-demand skills
293
+ // from skills/<name>/SKILL.md (https://opencode.ai/docs/skills). Emit both.
294
+ kinds = [
295
+ commandsKind('command', 'gsd-', configDir),
296
+ skillsKind('skills', 'gsd-', 'convertClaudeCommandToOpencodeSkill', 'opencode', configDir),
297
+ ];
298
+ break;
299
+ case 'kilo':
300
+ // Kilo derives from OpenCode and shares the skills/<name>/SKILL.md layout
301
+ // (https://kilo.ai/docs/customize/skills). Emit flat commands + skills.
302
+ kinds = [
303
+ commandsKind('command', 'gsd-', configDir),
304
+ skillsKind('skills', 'gsd-', 'convertClaudeCommandToKiloSkill', 'kilo', configDir),
305
+ ];
306
+ break;
307
+ default:
308
+ throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
309
+ }
310
+ return { runtime, configDir, scope, kinds };
311
+ }
312
+ module.exports = { resolveRuntimeArtifactLayout, findInstallSourceRoot, getInstallExports };
@@ -0,0 +1,56 @@
1
+ 'use strict';
2
+ // ---------------------------------------------------------------------------
3
+ // Registry
4
+ // ---------------------------------------------------------------------------
5
+ const REGISTRY = Object.freeze({
6
+ claude: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
7
+ gemini: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
8
+ antigravity: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
9
+ augment: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
10
+ qwen: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
11
+ hermes: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
12
+ codebuddy: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
13
+ opencode: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: 'opencode' }),
14
+ kilo: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: false, finishPermissionWriter: 'kilo' }),
15
+ codex: Object.freeze({ installSurface: 'codex-toml', writesSharedSettings: false, finishPermissionWriter: null }),
16
+ copilot: Object.freeze({ installSurface: 'copilot-instructions', writesSharedSettings: false, finishPermissionWriter: null }),
17
+ cline: Object.freeze({ installSurface: 'cline-rules', writesSharedSettings: false, finishPermissionWriter: null }),
18
+ cursor: Object.freeze({ installSurface: 'cursor-hooks-json', writesSharedSettings: false, finishPermissionWriter: null }),
19
+ windsurf: Object.freeze({ installSurface: 'profile-marker-only', writesSharedSettings: false, finishPermissionWriter: null }),
20
+ trae: Object.freeze({ installSurface: 'profile-marker-only', writesSharedSettings: false, finishPermissionWriter: null }),
21
+ });
22
+ // ---------------------------------------------------------------------------
23
+ // Exports
24
+ // ---------------------------------------------------------------------------
25
+ /** The complete set of 15 supported runtimes for config-adapter dispatch. */
26
+ const ALLOWED_CONFIG_RUNTIMES = new Set(Object.keys(REGISTRY));
27
+ /** All valid installSurface values. */
28
+ const INSTALL_SURFACES = Object.freeze([
29
+ 'settings-json',
30
+ 'codex-toml',
31
+ 'copilot-instructions',
32
+ 'cline-rules',
33
+ 'cursor-hooks-json',
34
+ 'profile-marker-only',
35
+ ]);
36
+ /**
37
+ * Resolve the config adapter intent for a given runtime.
38
+ *
39
+ * Returns a fresh object each call so callers cannot poison the registry by
40
+ * mutating the returned value.
41
+ *
42
+ * @throws {TypeError} if runtime is not a known supported runtime.
43
+ */
44
+ function resolveRuntimeConfigIntent(runtime) {
45
+ if (!Object.hasOwn(REGISTRY, runtime)) {
46
+ throw new TypeError(`Unknown runtime for config adapter: ${runtime}`);
47
+ }
48
+ const entry = REGISTRY[runtime];
49
+ return {
50
+ runtime,
51
+ installSurface: entry.installSurface,
52
+ writesSharedSettings: entry.writesSharedSettings,
53
+ finishPermissionWriter: entry.finishPermissionWriter,
54
+ };
55
+ }
56
+ module.exports = { resolveRuntimeConfigIntent, ALLOWED_CONFIG_RUNTIMES, INSTALL_SURFACES };
@@ -0,0 +1,190 @@
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 — Skills-capable since v3.48.0 (#782). SKILL.md files live at
16
+ * ~/.cline/skills/<skillName>/SKILL.md (same flat layout as cursor/codex).
17
+ * .clinerules is also emitted (rules-based compatibility layer).
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
+ * @param runtime - The runtime identifier (e.g. 'claude', 'opencode').
67
+ * @param explicitDir - If provided and non-empty, returned immediately after
68
+ * tilde-expansion, overriding all env-var and default logic. This matches
69
+ * the behaviour of bin/install.js getGlobalDir(runtime, explicitDir).
70
+ */
71
+ function getGlobalConfigDir(runtime, explicitDir) {
72
+ if (explicitDir)
73
+ return expandTilde(explicitDir);
74
+ const home = node_os_1.default.homedir();
75
+ const env = process.env;
76
+ switch (runtime) {
77
+ // ── Claude Code ──────────────────────────────────────────────────────────
78
+ case 'claude':
79
+ return env['CLAUDE_CONFIG_DIR'] ? expandTilde(env['CLAUDE_CONFIG_DIR']) : node_path_1.default.join(home, '.claude');
80
+ // ── Cursor ───────────────────────────────────────────────────────────────
81
+ case 'cursor':
82
+ return env['CURSOR_CONFIG_DIR'] ? expandTilde(env['CURSOR_CONFIG_DIR']) : node_path_1.default.join(home, '.cursor');
83
+ // ── Gemini CLI ───────────────────────────────────────────────────────────
84
+ case 'gemini':
85
+ return env['GEMINI_CONFIG_DIR'] ? expandTilde(env['GEMINI_CONFIG_DIR']) : node_path_1.default.join(home, '.gemini');
86
+ // ── Codex ────────────────────────────────────────────────────────────────
87
+ case 'codex':
88
+ return env['CODEX_HOME'] ? expandTilde(env['CODEX_HOME']) : node_path_1.default.join(home, '.codex');
89
+ // ── Grok Build ───────────────────────────────────────────────────────────
90
+ case 'grok':
91
+ return env['GROK_AGENTS_HOME'] ? expandTilde(env['GROK_AGENTS_HOME']) : node_path_1.default.join(home, '.agents');
92
+ // ── Copilot (VS Code) ────────────────────────────────────────────────────
93
+ case 'copilot':
94
+ if (env['COPILOT_CONFIG_DIR'])
95
+ return expandTilde(env['COPILOT_CONFIG_DIR']);
96
+ if (env['COPILOT_HOME'])
97
+ return expandTilde(env['COPILOT_HOME']);
98
+ return node_path_1.default.join(home, '.copilot');
99
+ // ── Antigravity ──────────────────────────────────────────────────────────
100
+ case 'antigravity':
101
+ return resolveAntigravityGlobalDir({ env, home });
102
+ // ── Windsurf ─────────────────────────────────────────────────────────────
103
+ case 'windsurf':
104
+ return env['WINDSURF_CONFIG_DIR']
105
+ ? expandTilde(env['WINDSURF_CONFIG_DIR'])
106
+ : node_path_1.default.join(home, '.codeium', 'windsurf');
107
+ // ── Augment ──────────────────────────────────────────────────────────────
108
+ case 'augment':
109
+ return env['AUGMENT_CONFIG_DIR'] ? expandTilde(env['AUGMENT_CONFIG_DIR']) : node_path_1.default.join(home, '.augment');
110
+ // ── Trae ─────────────────────────────────────────────────────────────────
111
+ case 'trae':
112
+ return env['TRAE_CONFIG_DIR'] ? expandTilde(env['TRAE_CONFIG_DIR']) : node_path_1.default.join(home, '.trae');
113
+ // ── Qwen Code ────────────────────────────────────────────────────────────
114
+ case 'qwen':
115
+ return env['QWEN_CONFIG_DIR'] ? expandTilde(env['QWEN_CONFIG_DIR']) : node_path_1.default.join(home, '.qwen');
116
+ // ── Hermes Agent ─────────────────────────────────────────────────────────
117
+ case 'hermes':
118
+ return env['HERMES_HOME'] ? expandTilde(env['HERMES_HOME']) : node_path_1.default.join(home, '.hermes');
119
+ // ── CodeBuddy ────────────────────────────────────────────────────────────
120
+ case 'codebuddy':
121
+ return env['CODEBUDDY_CONFIG_DIR'] ? expandTilde(env['CODEBUDDY_CONFIG_DIR']) : node_path_1.default.join(home, '.codebuddy');
122
+ // ── Cline ────────────────────────────────────────────────────────────────
123
+ case 'cline':
124
+ return env['CLINE_CONFIG_DIR'] ? expandTilde(env['CLINE_CONFIG_DIR']) : node_path_1.default.join(home, '.cline');
125
+ // ── OpenCode (XDG) ───────────────────────────────────────────────────────
126
+ case 'opencode': {
127
+ if (env['OPENCODE_CONFIG_DIR'])
128
+ return expandTilde(env['OPENCODE_CONFIG_DIR']);
129
+ if (env['OPENCODE_CONFIG'])
130
+ return node_path_1.default.dirname(expandTilde(env['OPENCODE_CONFIG']));
131
+ if (env['XDG_CONFIG_HOME'])
132
+ return node_path_1.default.join(expandTilde(env['XDG_CONFIG_HOME']), 'opencode');
133
+ return node_path_1.default.join(home, '.config', 'opencode');
134
+ }
135
+ // ── Kilo (XDG) ───────────────────────────────────────────────────────────
136
+ case 'kilo': {
137
+ if (env['KILO_CONFIG_DIR'])
138
+ return expandTilde(env['KILO_CONFIG_DIR']);
139
+ if (env['KILO_CONFIG'])
140
+ return node_path_1.default.dirname(expandTilde(env['KILO_CONFIG']));
141
+ if (env['XDG_CONFIG_HOME'])
142
+ return node_path_1.default.join(expandTilde(env['XDG_CONFIG_HOME']), 'kilo');
143
+ return node_path_1.default.join(home, '.config', 'kilo');
144
+ }
145
+ // ── Default (Claude fallback) ─────────────────────────────────────────────
146
+ default:
147
+ return env['CLAUDE_CONFIG_DIR'] ? expandTilde(env['CLAUDE_CONFIG_DIR']) : node_path_1.default.join(home, '.claude');
148
+ }
149
+ }
150
+ /**
151
+ * Return the global skills base directory for the given runtime.
152
+ * Most runtimes: <configDir>/skills
153
+ * Hermes: <configDir>/skills/gsd (nested category layout — #2841)
154
+ * Cline ≥ v3.48.0: <configDir>/skills (SKILL.md-based global skills — #782)
155
+ */
156
+ function getGlobalSkillsBase(runtime) {
157
+ if (runtime === 'hermes') {
158
+ const configDir = getGlobalConfigDir(runtime);
159
+ return node_path_1.default.join(configDir, 'skills', 'gsd');
160
+ }
161
+ // Kilo Code discovers global skills from ~/.kilo/skills/ (HOME-relative),
162
+ // independent of the XDG-based config dir (~/.config/kilo) used for commands.
163
+ // See: https://kilo.ai/docs/customize/skills
164
+ // "Global skills are located in the `.kilo` directory within your Home
165
+ // directory: ~/.kilo/skills/"
166
+ if (runtime === 'kilo')
167
+ return node_path_1.default.join(node_os_1.default.homedir(), '.kilo', 'skills');
168
+ const configDir = getGlobalConfigDir(runtime);
169
+ return node_path_1.default.join(configDir, 'skills');
170
+ }
171
+ /**
172
+ * Return the full path to a specific skill's directory for the given runtime.
173
+ */
174
+ function getGlobalSkillDir(runtime, skillName) {
175
+ const base = getGlobalSkillsBase(runtime);
176
+ if (base === null)
177
+ return null;
178
+ return node_path_1.default.join(base, skillName);
179
+ }
180
+ /**
181
+ * Return a human-readable display path for a global skill (for log messages).
182
+ */
183
+ function getGlobalSkillDisplayPath(runtime, skillName) {
184
+ const dir = getGlobalSkillDir(runtime, skillName);
185
+ if (!dir)
186
+ return `(${runtime} does not use a skills directory)`;
187
+ // Replace homedir prefix with ~ for readability
188
+ const home = node_os_1.default.homedir();
189
+ return dir.startsWith(home) ? '~' + dir.slice(home.length) : dir;
190
+ }
@@ -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
+ }