@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,122 @@
1
+ "use strict";
2
+ /**
3
+ * Installer Migration Authoring — validation helpers for installer migration records and actions.
4
+ *
5
+ * ADR-457 build-at-publish: the hand-written
6
+ * bin/lib/installer-migration-authoring.cjs collapsed to a TypeScript source
7
+ * of truth. Behaviour is preserved byte-for-behaviour from the prior
8
+ * hand-written .cjs; only types are added.
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.validateInstallerMigrationRecord = validateInstallerMigrationRecord;
15
+ exports.validateInstallerMigrationActions = validateInstallerMigrationActions;
16
+ const node_path_1 = __importDefault(require("node:path"));
17
+ function getStr(record, field) {
18
+ const v = record[field];
19
+ return typeof v === 'string' ? v : '';
20
+ }
21
+ function requireNonEmptyString(record, field, source) {
22
+ const v = record[field];
23
+ if (typeof v !== 'string' || v.trim() === '') {
24
+ throw new Error(`migration record must include a non-empty ${field}: ${source}`);
25
+ }
26
+ }
27
+ function isNonEmptyStringArray(arr) {
28
+ return Array.isArray(arr) && arr.length > 0 && arr.every((v) => typeof v === 'string' && v.trim() !== '');
29
+ }
30
+ function validateStringArray(record, field, source) {
31
+ if (record[field] === undefined)
32
+ return;
33
+ if (!isNonEmptyStringArray(record[field])) {
34
+ throw new Error(`migration record ${field} must be a non-empty string array when provided: ${source}`);
35
+ }
36
+ }
37
+ function requireStringArray(record, field, source) {
38
+ if (!isNonEmptyStringArray(record[field])) {
39
+ throw new Error(`migration record ${field} must be a non-empty string array: ${source}`);
40
+ }
41
+ }
42
+ function recordSource(record, fallback) {
43
+ const id = getStr(record, 'id');
44
+ return fallback ?? (id.trim() ? id : '<unknown>');
45
+ }
46
+ function actionSource(migration, action) {
47
+ const migrationId = getStr(migration, 'id') || '<unknown>';
48
+ const relPath = getStr(action, 'relPath') || '<unknown>';
49
+ return `${migrationId} ${relPath}`;
50
+ }
51
+ function requireActionEvidence(action, field, migration) {
52
+ const v = action[field];
53
+ if (typeof v !== 'string' || v.trim() === '') {
54
+ throw new Error(`migration action ${getStr(action, 'type')} must include ${field}: ${actionSource(migration, action)}`);
55
+ }
56
+ }
57
+ function validateSafeRelPath(relPath, migration, actionType) {
58
+ const source = actionSource(migration, { relPath });
59
+ const normalized = relPath.replace(/\\/g, '/');
60
+ if (node_path_1.default.isAbsolute(normalized) || node_path_1.default.win32.isAbsolute(normalized)) {
61
+ throw new Error(`migration action ${actionType} relPath must stay inside configDir: ${source}`);
62
+ }
63
+ const segments = normalized.split('/');
64
+ if (segments.some((segment) => segment === '' || segment === '.' || segment === '..')) {
65
+ throw new Error(`migration action ${actionType} relPath must stay inside configDir: ${source}`);
66
+ }
67
+ }
68
+ function validateInstallerMigrationRecord(record, source) {
69
+ const rec = record;
70
+ const displaySource = recordSource(rec, source);
71
+ if (!record || typeof record !== 'object') {
72
+ throw new Error(`migration record must export an object: ${displaySource}`);
73
+ }
74
+ // Authoring contract follows docs/installer-migrations.md#authoring-workflow
75
+ // and docs/adr/0008-installer-migration-module.md#decision.
76
+ requireNonEmptyString(rec, 'id', displaySource);
77
+ requireNonEmptyString(rec, 'title', displaySource);
78
+ requireNonEmptyString(rec, 'description', displaySource);
79
+ requireNonEmptyString(rec, 'introducedIn', displaySource);
80
+ if (typeof rec['destructive'] !== 'boolean') {
81
+ throw new Error(`migration record must declare destructive as a boolean: ${displaySource}`);
82
+ }
83
+ validateStringArray(rec, 'runtimes', displaySource);
84
+ requireStringArray(rec, 'scopes', displaySource);
85
+ if (typeof rec['plan'] !== 'function') {
86
+ throw new Error(`migration record must include a plan function: ${displaySource}`);
87
+ }
88
+ return rec;
89
+ }
90
+ function validateInstallerMigrationActions(actions, migration) {
91
+ if (!Array.isArray(actions)) {
92
+ throw new Error(`migration ${getStr(migration, 'id')} plan must return an array`);
93
+ }
94
+ for (const action of actions) {
95
+ if (!action || typeof action !== 'object') {
96
+ throw new Error(`migration action must be an object: ${getStr(migration, 'id')}`);
97
+ }
98
+ const act = action;
99
+ const actType = getStr(act, 'type');
100
+ const actRelPath = getStr(act, 'relPath');
101
+ if (!actType || actType.trim() === '') {
102
+ throw new Error(`migration action must include a non-empty type: ${getStr(migration, 'id')}`);
103
+ }
104
+ if (!actRelPath || actRelPath.trim() === '') {
105
+ throw new Error(`migration action ${actType} must include a non-empty relPath: ${getStr(migration, 'id')}`);
106
+ }
107
+ validateSafeRelPath(actRelPath, migration, actType);
108
+ // Ownership and runtime-contract evidence are required by
109
+ // docs/installer-migrations.md#action-types and
110
+ // docs/adr/0008-installer-migration-module.md#runtime-contract-decision.
111
+ if (actType === 'remove-managed' || actType === 'rewrite-json') {
112
+ requireActionEvidence(act, 'ownershipEvidence', migration);
113
+ }
114
+ if (actType === 'rewrite-json') {
115
+ const rc = getStr(migration, 'runtimeContract');
116
+ if (!rc || rc.trim() === '') {
117
+ throw new Error(`migration action rewrite-json requires migration runtimeContract: ${actionSource(migration, act)}`);
118
+ }
119
+ }
120
+ }
121
+ return actions;
122
+ }
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ /**
3
+ * Installer migration report utilities (ADR-457 build-at-publish: the
4
+ * hand-written bin/lib/installer-migration-report.cjs collapsed to a TypeScript
5
+ * source of truth). Behaviour is preserved byte-for-behaviour from the prior
6
+ * hand-written .cjs; only types are added.
7
+ *
8
+ * Resolution environment variable surface for #3541 — when the installer
9
+ * runs without a TTY (typical /gsd:update path via Claude Code or any
10
+ * scripted update), prompt-user migration actions cannot be answered
11
+ * interactively. Classification-based defaults apply; anything else falls
12
+ * through to the hard assertion with a grouped, actionable error message.
13
+ *
14
+ * docs/installer-migrations.md#prompt-user-resolution for the spec.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.BUNDLED_GSD_HOOK_FILES = exports.RESOLUTION_ENV_VAR = void 0;
18
+ exports.summarizeInstallerMigrationResult = summarizeInstallerMigrationResult;
19
+ exports.classifyPromptUserAction = classifyPromptUserAction;
20
+ exports.resolveInstallerMigrationPromptsForNonTty = resolveInstallerMigrationPromptsForNonTty;
21
+ exports.assertInstallerMigrationsUnblocked = assertInstallerMigrationsUnblocked;
22
+ exports.RESOLUTION_ENV_VAR = 'GSD_INSTALLER_MIGRATION_RESOLVE';
23
+ const VALID_CHOICES = ['keep', 'remove'];
24
+ // #3628: explicit whitelist of bundled hook files shipped in the npm
25
+ // distribution under `hooks/`. The classifier-based auto-removal of these
26
+ // files at first-time-baseline scan (added in #3610) is restricted to this
27
+ // set — a shape regex like `^hooks/gsd-[^/]+\.(?:js|sh|cjs|mjs)$` also
28
+ // matches user-authored custom hooks and retired bundled hooks from prior
29
+ // versions, and auto-removing those is silent data loss.
30
+ //
31
+ // The bug-3628 regression guard asserts this Set stays aligned with the
32
+ // on-disk `hooks/` directory in both directions: whitelist-but-missing
33
+ // AND shipped-but-not-whitelisted both fail CI.
34
+ exports.BUNDLED_GSD_HOOK_FILES = Object.freeze(new Set([
35
+ 'hooks/gsd-check-update-worker.js',
36
+ 'hooks/gsd-check-update.js',
37
+ 'hooks/gsd-config-reload.js',
38
+ 'hooks/gsd-context-monitor.js',
39
+ 'hooks/gsd-cursor-post-tool.js',
40
+ 'hooks/gsd-cursor-session-start.js',
41
+ 'hooks/gsd-graphify-update.sh',
42
+ 'hooks/gsd-phase-boundary.sh',
43
+ 'hooks/gsd-prompt-guard.js',
44
+ 'hooks/gsd-read-guard.js',
45
+ 'hooks/gsd-read-injection-scanner.js',
46
+ 'hooks/gsd-session-state.sh',
47
+ 'hooks/gsd-statusline.js',
48
+ 'hooks/gsd-update-banner.js',
49
+ 'hooks/gsd-validate-commit.sh',
50
+ 'hooks/gsd-workflow-guard.js',
51
+ 'hooks/gsd-worktree-path-guard.js',
52
+ ]));
53
+ // ── Internal helpers ──────────────────────────────────────────────────────────
54
+ function installerMigrationActionLabel(action) {
55
+ if (!action || !action.type)
56
+ return 'skipped';
57
+ if (action.type === 'backup-and-remove')
58
+ return 'backed up and removed';
59
+ if (action.type === 'remove-managed')
60
+ return 'removed';
61
+ if (action.type === 'rewrite-json')
62
+ return action.deleteIfEmpty ? 'rewrote or removed' : 'rewrote';
63
+ if (action.type === 'record-baseline')
64
+ return 'recorded';
65
+ if (action.type === 'baseline-preserve-user')
66
+ return 'preserved';
67
+ if (action.type === 'preserve-user')
68
+ return 'preserved';
69
+ if (action.type === 'prompt-user')
70
+ return 'blocked';
71
+ return 'skipped';
72
+ }
73
+ function blockedInstallerMigrationActions(result) {
74
+ if (result && Array.isArray(result.blocked))
75
+ return result.blocked;
76
+ const plan = result && result.plan;
77
+ if (plan && Array.isArray(plan.blocked))
78
+ return plan.blocked;
79
+ return [];
80
+ }
81
+ function baselineSummaryLabel(count, noun) {
82
+ return `${count} ${noun}${count === 1 ? '' : 's'}`;
83
+ }
84
+ function baselineSummaryRow(type, actions) {
85
+ const count = actions.length;
86
+ if (type === 'record-baseline') {
87
+ return {
88
+ label: 'recorded',
89
+ relPath: baselineSummaryLabel(count, 'managed baseline file'),
90
+ reason: 'first-time baseline scan',
91
+ action: { type: 'record-baseline-summary', count, actions },
92
+ };
93
+ }
94
+ return {
95
+ label: 'preserved',
96
+ relPath: baselineSummaryLabel(count, 'user baseline file'),
97
+ reason: 'first-time baseline scan',
98
+ action: { type: 'baseline-preserve-user-summary', count, actions },
99
+ };
100
+ }
101
+ function summarizeInstallerMigrationResult(result) {
102
+ const plan = result && result.plan;
103
+ const actions = plan && Array.isArray(plan.actions) ? plan.actions : [];
104
+ const blocked = blockedInstallerMigrationActions(result);
105
+ const blockedSet = new Set(blocked);
106
+ const rows = [];
107
+ const baselineIndexes = new Map();
108
+ const baselineActions = new Map();
109
+ for (const action of actions) {
110
+ const type = action && action.type;
111
+ if (type === 'record-baseline' || type === 'baseline-preserve-user') {
112
+ if (!baselineActions.has(type)) {
113
+ baselineActions.set(type, []);
114
+ baselineIndexes.set(type, rows.length);
115
+ rows.push(null);
116
+ }
117
+ baselineActions.get(type).push(action);
118
+ continue;
119
+ }
120
+ rows.push({
121
+ label: blockedSet.has(action) ? 'blocked' : installerMigrationActionLabel(action),
122
+ relPath: action.relPath ?? '',
123
+ reason: action.reason || '',
124
+ action,
125
+ });
126
+ }
127
+ // Phase 4 requires action reporting without flooding first-time baseline installs:
128
+ // docs/installer-migrations.md#phase-4-installupdate-integration.
129
+ for (const [type, baselineRows] of baselineActions) {
130
+ rows[baselineIndexes.get(type)] = baselineSummaryRow(type, baselineRows);
131
+ }
132
+ return {
133
+ hasReportableActions: actions.length > 0 || blocked.length > 0,
134
+ blocked,
135
+ rows,
136
+ };
137
+ }
138
+ // Classify a blocked prompt-user action into one of the safe-default
139
+ // categories. Returns null when no safe default applies — caller must
140
+ // fall back to the hard assertion / interactive prompt for those.
141
+ //
142
+ // Stale SDK build artifacts live under gsd-core/sdk/{dist,src}/
143
+ // and are regenerated on every install, so removing them is lossless.
144
+ // User-facing skill anchors are the .md files that surface as commands
145
+ // to the user — these are user-owned and must be kept.
146
+ function classifyPromptUserAction(action) {
147
+ const relPath = action && action.relPath;
148
+ if (typeof relPath !== 'string' || !relPath)
149
+ return null;
150
+ if (/^gsd-core\/sdk\/(dist|src)\//.test(relPath)) {
151
+ return { category: 'stale-sdk-build-artifact', choice: 'remove' };
152
+ }
153
+ if (/^skills\/gsd-[^/]+\/SKILL\.md$/.test(relPath)) {
154
+ return { category: 'user-facing-skill', choice: 'keep' };
155
+ }
156
+ // #3610 / #3628: bundled GSD hooks shipped under `hooks/`. The whitelist
157
+ // is the explicit set of filenames in the npm distribution — files that
158
+ // match the shape but are NOT in the whitelist (user-authored hooks,
159
+ // retired hooks from prior versions) fall through to the block-or-prompt
160
+ // flow so the user retains control. On a first-time-baseline scan the
161
+ // installer can safely remove whitelisted hooks because it is about to
162
+ // write the fresh bundled versions in their place.
163
+ if (exports.BUNDLED_GSD_HOOK_FILES.has(relPath)) {
164
+ return { category: 'bundled-gsd-hook', choice: 'remove' };
165
+ }
166
+ return null;
167
+ }
168
+ // Convert a blocked prompt-user action into a concrete plan action.
169
+ // `keep` → baseline-preserve-user (idempotent — already on disk).
170
+ // `remove` → backup-and-remove (safe: keeps a rollback copy in the
171
+ // migration journal under gsd-migration-journal/<runId>-backups/).
172
+ function materializeResolution(action, choice) {
173
+ const base = {
174
+ type: '', // overridden in each return branch below
175
+ migrationId: action.migrationId,
176
+ migrationChecksum: action.migrationChecksum,
177
+ relPath: action.relPath,
178
+ reason: action.reason,
179
+ classification: action.classification,
180
+ originalHash: action.originalHash || null,
181
+ currentHash: action.currentHash || null,
182
+ requestedType: 'prompt-user',
183
+ };
184
+ if (choice === 'keep') {
185
+ return { ...base, type: 'baseline-preserve-user' };
186
+ }
187
+ // 'remove'
188
+ return { ...base, type: 'backup-and-remove', backupRelPath: null };
189
+ }
190
+ function normalizeResolutionChoice(rawValue) {
191
+ if (typeof rawValue !== 'string')
192
+ return null;
193
+ const normalized = rawValue.trim().toLowerCase();
194
+ return VALID_CHOICES.includes(normalized) ? normalized : null;
195
+ }
196
+ function actionSupportsChoice(action, choice) {
197
+ if (!action || !choice)
198
+ return false;
199
+ if (!Array.isArray(action.choices) || action.choices.length === 0) {
200
+ return VALID_CHOICES.includes(choice);
201
+ }
202
+ return action.choices.includes(choice);
203
+ }
204
+ // Resolve prompt-user actions when stdin is not a TTY. Mutates the
205
+ // passed result so:
206
+ // - resolved actions are appended to plan.actions in their concrete
207
+ // form (baseline-preserve-user / backup-and-remove);
208
+ // - result.blocked and plan.blocked are filtered to actions that
209
+ // could NOT be safely defaulted (caller must still handle those).
210
+ // Returns { result, resolutions } where `resolutions` is the structured
211
+ // log of every defaulted resolution.
212
+ function resolveInstallerMigrationPromptsForNonTty(result, options = {}) {
213
+ if (!result || typeof result !== 'object') {
214
+ return { result, resolutions: [] };
215
+ }
216
+ const blocked = blockedInstallerMigrationActions(result);
217
+ if (blocked.length === 0) {
218
+ return { result, resolutions: [] };
219
+ }
220
+ const isTty = options.isTty === true;
221
+ if (isTty) {
222
+ // Honour interactive prompting paths (not implemented yet — the
223
+ // hard throw is still the right behaviour for TTY runs); resolver
224
+ // only fires when the installer cannot interactively ask.
225
+ return { result, resolutions: [] };
226
+ }
227
+ const env = options && options.env && typeof options.env === 'object'
228
+ ? options.env
229
+ : process.env;
230
+ const envChoice = normalizeResolutionChoice(env && env[exports.RESOLUTION_ENV_VAR]);
231
+ const resolutions = [];
232
+ const unresolved = [];
233
+ for (const action of blocked) {
234
+ if (action && action.type === 'prompt-user') {
235
+ let category = null;
236
+ let choice = null;
237
+ let source = null;
238
+ if (envChoice && actionSupportsChoice(action, envChoice)) {
239
+ category = 'operator-override';
240
+ choice = envChoice;
241
+ source = exports.RESOLUTION_ENV_VAR;
242
+ }
243
+ else {
244
+ const classification = classifyPromptUserAction(action);
245
+ if (classification) {
246
+ category = classification.category;
247
+ choice = classification.choice;
248
+ source = 'non-tty-default';
249
+ }
250
+ }
251
+ if (choice) {
252
+ const resolved = materializeResolution(action, choice);
253
+ // Replace the original prompt-user action in-place when present so
254
+ // applyInstallerMigrationPlan never sees an unsupported action type.
255
+ // Fallback to append only when the blocked action did not originate
256
+ // from plan.actions (defensive).
257
+ if (result.plan && Array.isArray(result.plan.actions)) {
258
+ const idx = result.plan.actions.indexOf(action);
259
+ if (idx >= 0) {
260
+ result.plan.actions[idx] = resolved;
261
+ }
262
+ else {
263
+ result.plan.actions.push(resolved);
264
+ }
265
+ }
266
+ resolutions.push({
267
+ relPath: action.relPath,
268
+ category: category ?? '',
269
+ choice: choice ?? '',
270
+ reason: action.reason,
271
+ resolvedActionType: resolved.type,
272
+ source: source ?? '',
273
+ });
274
+ continue;
275
+ }
276
+ }
277
+ unresolved.push(action);
278
+ }
279
+ // Mutate both the top-level and plan.blocked surfaces so downstream
280
+ // callers (assertInstallerMigrationsUnblocked, summarizers) see the
281
+ // post-resolution state.
282
+ if (Array.isArray(result.blocked)) {
283
+ result.blocked = unresolved;
284
+ }
285
+ if (result.plan && Array.isArray(result.plan.blocked)) {
286
+ result.plan.blocked = unresolved;
287
+ }
288
+ return { result, resolutions };
289
+ }
290
+ // Group blocked prompt-user actions by their `reason` so the operator
291
+ // sees one summary line per cause instead of N path lines for the
292
+ // same underlying issue.
293
+ function groupBlockedByReason(blocked) {
294
+ const byReason = new Map();
295
+ for (const action of blocked) {
296
+ const reason = (action && action.reason) || 'no reason given';
297
+ if (!byReason.has(reason))
298
+ byReason.set(reason, []);
299
+ byReason.get(reason).push(action);
300
+ }
301
+ return byReason;
302
+ }
303
+ function describeChoicesForActions(blocked) {
304
+ const choiceSet = new Set();
305
+ for (const action of blocked) {
306
+ if (action && Array.isArray(action.choices)) {
307
+ for (const choice of action.choices)
308
+ choiceSet.add(choice);
309
+ }
310
+ }
311
+ if (choiceSet.size === 0) {
312
+ for (const fallback of VALID_CHOICES)
313
+ choiceSet.add(fallback);
314
+ }
315
+ return [...choiceSet];
316
+ }
317
+ function buildBlockedErrorMessage(blocked) {
318
+ const byReason = groupBlockedByReason(blocked);
319
+ const totalFiles = blocked.length;
320
+ const choices = describeChoicesForActions(blocked);
321
+ const lines = [
322
+ `installer migration blocked pending user choice: ${totalFiles} file${totalFiles === 1 ? '' : 's'} need a decision`,
323
+ ` choices: [${choices.join(', ')}]`,
324
+ ];
325
+ for (const [reason, actions] of byReason) {
326
+ lines.push(` - ${actions.length} file${actions.length === 1 ? '' : 's'}: ${reason}`);
327
+ // Show up to 3 sample paths so operators can spot which files are
328
+ // affected without dumping a thousand-line wall when SDK build
329
+ // artifacts leak.
330
+ const sample = actions.slice(0, 3).map((a) => a.relPath);
331
+ if (sample.length > 0) {
332
+ lines.push(` e.g. ${sample.join(', ')}${actions.length > sample.length ? `, ... (+${actions.length - sample.length} more)` : ''}`);
333
+ }
334
+ }
335
+ lines.push(` resolve non-interactively by setting ${exports.RESOLUTION_ENV_VAR}=<choice> ` +
336
+ `(or run the installer in a TTY to be prompted per file).`);
337
+ return lines.join('\n');
338
+ }
339
+ function assertInstallerMigrationsUnblocked(result) {
340
+ const blocked = blockedInstallerMigrationActions(result);
341
+ if (blocked.length === 0)
342
+ return;
343
+ const message = buildBlockedErrorMessage(blocked);
344
+ const error = Object.assign(new Error(message), {
345
+ blocked,
346
+ blockedByReason: Object.fromEntries(groupBlockedByReason(blocked)),
347
+ resolutionEnvVar: exports.RESOLUTION_ENV_VAR,
348
+ });
349
+ throw error;
350
+ }