@opengsd/gsd-core 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/README.ja-JP.md +46 -791
  2. package/README.ko-KR.md +44 -780
  3. package/README.md +42 -218
  4. package/README.pt-BR.md +47 -414
  5. package/README.zh-CN.md +46 -763
  6. package/agents/gsd-ai-researcher.md +2 -2
  7. package/agents/gsd-debug-session-manager.md +1 -1
  8. package/agents/gsd-debugger.md +8 -8
  9. package/agents/gsd-doc-writer.md +7 -6
  10. package/agents/gsd-domain-researcher.md +15 -2
  11. package/agents/gsd-eval-auditor.md +1 -1
  12. package/agents/gsd-eval-planner.md +2 -2
  13. package/agents/gsd-executor.md +21 -8
  14. package/agents/gsd-framework-selector.md +1 -1
  15. package/agents/gsd-intel-updater.md +4 -4
  16. package/agents/gsd-phase-researcher.md +19 -6
  17. package/agents/gsd-plan-checker.md +3 -3
  18. package/agents/gsd-planner.md +36 -23
  19. package/agents/gsd-project-researcher.md +13 -0
  20. package/agents/gsd-research-synthesizer.md +6 -2
  21. package/agents/gsd-roadmapper.md +6 -6
  22. package/agents/gsd-ui-researcher.md +16 -3
  23. package/agents/gsd-user-profiler.md +2 -2
  24. package/agents/gsd-verifier.md +8 -8
  25. package/assets/gsd-logo-2000-transparent.png +0 -0
  26. package/assets/gsd-logo-2000-transparent.svg +17 -0
  27. package/assets/gsd-logo-2000.png +0 -0
  28. package/assets/gsd-logo-2000.svg +21 -0
  29. package/assets/terminal.svg +68 -0
  30. package/bin/install.js +255 -103
  31. package/commands/gsd/add-tests.md +1 -1
  32. package/commands/gsd/ai-integration-phase.md +3 -3
  33. package/commands/gsd/audit-fix.md +1 -1
  34. package/commands/gsd/audit-milestone.md +1 -1
  35. package/commands/gsd/audit-uat.md +1 -1
  36. package/commands/gsd/autonomous.md +2 -2
  37. package/commands/gsd/capture.md +6 -6
  38. package/commands/gsd/cleanup.md +1 -1
  39. package/commands/gsd/code-review.md +1 -1
  40. package/commands/gsd/complete-milestone.md +2 -2
  41. package/commands/gsd/config.md +3 -3
  42. package/commands/gsd/debug.md +1 -1
  43. package/commands/gsd/discuss-phase.md +5 -4
  44. package/commands/gsd/docs-update.md +1 -1
  45. package/commands/gsd/eval-review.md +2 -2
  46. package/commands/gsd/execute-phase.md +2 -2
  47. package/commands/gsd/explore.md +1 -1
  48. package/commands/gsd/extract-learnings.md +2 -2
  49. package/commands/gsd/fast.md +1 -1
  50. package/commands/gsd/forensics.md +1 -1
  51. package/commands/gsd/graphify.md +9 -9
  52. package/commands/gsd/health.md +1 -1
  53. package/commands/gsd/help.md +2 -2
  54. package/commands/gsd/import.md +5 -5
  55. package/commands/gsd/inbox.md +1 -1
  56. package/commands/gsd/ingest-docs.md +4 -4
  57. package/commands/gsd/manager.md +3 -3
  58. package/commands/gsd/map-codebase.md +1 -1
  59. package/commands/gsd/milestone-summary.md +1 -1
  60. package/commands/gsd/mvp-phase.md +4 -4
  61. package/commands/gsd/new-milestone.md +5 -5
  62. package/commands/gsd/new-project.md +5 -5
  63. package/commands/gsd/pause-work.md +2 -2
  64. package/commands/gsd/phase.md +4 -4
  65. package/commands/gsd/plan-phase.md +2 -2
  66. package/commands/gsd/plan-review-convergence.md +4 -4
  67. package/commands/gsd/pr-branch.md +1 -1
  68. package/commands/gsd/profile-user.md +2 -2
  69. package/commands/gsd/progress.md +4 -4
  70. package/commands/gsd/quick.md +1 -1
  71. package/commands/gsd/resume-work.md +1 -1
  72. package/commands/gsd/review.md +3 -2
  73. package/commands/gsd/secure-phase.md +1 -1
  74. package/commands/gsd/settings.md +1 -1
  75. package/commands/gsd/ship.md +2 -2
  76. package/commands/gsd/sketch.md +7 -7
  77. package/commands/gsd/spec-phase.md +2 -2
  78. package/commands/gsd/spike.md +3 -3
  79. package/commands/gsd/stats.md +1 -1
  80. package/commands/gsd/surface.md +4 -4
  81. package/commands/gsd/thread.md +1 -1
  82. package/commands/gsd/ui-phase.md +2 -2
  83. package/commands/gsd/ui-review.md +2 -2
  84. package/commands/gsd/ultraplan-phase.md +2 -2
  85. package/commands/gsd/undo.md +3 -3
  86. package/commands/gsd/update.md +3 -3
  87. package/commands/gsd/validate-phase.md +1 -1
  88. package/commands/gsd/verify-work.md +2 -2
  89. package/commands/gsd/workspace.md +4 -4
  90. package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
  91. package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +50 -4
  92. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  93. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  94. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  95. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  96. package/gsd-core/bin/lib/audit.cjs +743 -0
  97. package/gsd-core/bin/lib/check-command-router.cjs +342 -0
  98. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  99. package/gsd-core/bin/lib/clock.cjs +95 -0
  100. package/gsd-core/bin/lib/clusters.cjs +128 -0
  101. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  102. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  103. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  104. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  105. package/gsd-core/bin/lib/commands.cjs +1202 -0
  106. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  107. package/gsd-core/bin/lib/config-types.cjs +19 -0
  108. package/gsd-core/bin/lib/config.cjs +714 -0
  109. package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
  110. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  111. package/gsd-core/bin/lib/core.cjs +2007 -0
  112. package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
  113. package/gsd-core/bin/lib/docs.cjs +252 -0
  114. package/gsd-core/bin/lib/drift.cjs +364 -0
  115. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  116. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  117. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  118. package/gsd-core/bin/lib/graphify.cjs +496 -0
  119. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  120. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  121. package/gsd-core/bin/lib/init.cjs +1799 -0
  122. package/gsd-core/bin/lib/install-profiles.cjs +526 -0
  123. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  124. package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
  125. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  126. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  127. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  128. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  129. package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
  130. package/gsd-core/bin/lib/intel.cjs +607 -0
  131. package/gsd-core/bin/lib/learnings.cjs +270 -0
  132. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  133. package/gsd-core/bin/lib/milestone.cjs +373 -0
  134. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  135. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  136. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  137. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  138. package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
  139. package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
  140. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  141. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  142. package/gsd-core/bin/lib/phase.cjs +1307 -0
  143. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  144. package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
  145. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  146. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  147. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  148. package/gsd-core/bin/lib/project-root.cjs +119 -0
  149. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  150. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  151. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  152. package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
  153. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  154. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
  155. package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
  156. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  157. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  158. package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
  159. package/gsd-core/bin/lib/secrets.cjs +34 -0
  160. package/gsd-core/bin/lib/security.cjs +407 -0
  161. package/gsd-core/bin/lib/semver-compare.cjs +42 -0
  162. package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
  163. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  164. package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -82
  165. package/gsd-core/bin/lib/state.cjs +2010 -0
  166. package/gsd-core/bin/lib/surface.cjs +406 -0
  167. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  168. package/gsd-core/bin/lib/template.cjs +237 -0
  169. package/gsd-core/bin/lib/uat.cjs +297 -0
  170. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  171. package/gsd-core/bin/lib/update-context.cjs +218 -0
  172. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  173. package/gsd-core/bin/lib/validate.cjs +112 -0
  174. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  175. package/gsd-core/bin/lib/verify.cjs +1451 -0
  176. package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
  177. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  178. package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
  179. package/gsd-core/bin/lib/workstream.cjs +380 -0
  180. package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
  181. package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +1 -0
  182. package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +17 -1
  183. package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +27 -0
  184. package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
  185. package/{get-shit-done → gsd-core}/references/checkpoints.md +1 -1
  186. package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
  187. package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
  188. package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
  189. package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
  190. package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
  191. package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +1 -1
  192. package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
  193. package/{get-shit-done → gsd-core}/references/ui-brand.md +4 -2
  194. package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
  195. package/gsd-core/references/worktree-branch-check.md +38 -0
  196. package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
  197. package/{get-shit-done → gsd-core}/templates/README.md +2 -2
  198. package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
  199. package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
  200. package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
  201. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  202. package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
  203. package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
  204. package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
  205. package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
  206. package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
  207. package/{get-shit-done → gsd-core}/workflows/audit-fix.md +2 -2
  208. package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +3 -1
  209. package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
  210. package/{get-shit-done → gsd-core}/workflows/autonomous.md +10 -8
  211. package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
  212. package/{get-shit-done → gsd-core}/workflows/cleanup.md +44 -4
  213. package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +4 -4
  214. package/{get-shit-done → gsd-core}/workflows/code-review.md +6 -4
  215. package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
  216. package/{get-shit-done → gsd-core}/workflows/debug.md +7 -2
  217. package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +6 -2
  218. package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
  219. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +5 -5
  220. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
  221. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
  222. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
  223. package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +4 -4
  224. package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
  225. package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
  226. package/{get-shit-done → gsd-core}/workflows/docs-update.md +19 -5
  227. package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
  228. package/{get-shit-done → gsd-core}/workflows/eval-review.md +3 -3
  229. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +16 -3
  230. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  231. package/{get-shit-done → gsd-core}/workflows/execute-phase.md +89 -57
  232. package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
  233. package/{get-shit-done → gsd-core}/workflows/explore.md +5 -3
  234. package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
  235. package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
  236. package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
  237. package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
  238. package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +3 -3
  239. package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +6 -6
  240. package/{get-shit-done → gsd-core}/workflows/import.md +3 -1
  241. package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +5 -5
  242. package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
  243. package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
  244. package/{get-shit-done → gsd-core}/workflows/manager.md +3 -3
  245. package/{get-shit-done → gsd-core}/workflows/map-codebase.md +3 -1
  246. package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
  247. package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
  248. package/{get-shit-done → gsd-core}/workflows/new-milestone.md +5 -5
  249. package/{get-shit-done → gsd-core}/workflows/new-project.md +8 -8
  250. package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
  251. package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
  252. package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
  253. package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
  254. package/{get-shit-done → gsd-core}/workflows/plan-phase.md +29 -28
  255. package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +10 -10
  256. package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
  257. package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
  258. package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
  259. package/{get-shit-done → gsd-core}/workflows/quick.md +7 -29
  260. package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
  261. package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
  262. package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
  263. package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
  264. package/{get-shit-done → gsd-core}/workflows/review.md +110 -2
  265. package/{get-shit-done → gsd-core}/workflows/scan.md +3 -1
  266. package/{get-shit-done → gsd-core}/workflows/secure-phase.md +5 -3
  267. package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +196 -6
  268. package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
  269. package/{get-shit-done → gsd-core}/workflows/settings.md +16 -2
  270. package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
  271. package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
  272. package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
  273. package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
  274. package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
  275. package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
  276. package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
  277. package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
  278. package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
  279. package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
  280. package/{get-shit-done → gsd-core}/workflows/ui-phase.md +5 -5
  281. package/{get-shit-done → gsd-core}/workflows/ui-review.md +3 -3
  282. package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
  283. package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
  284. package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
  285. package/{get-shit-done → gsd-core}/workflows/validate-phase.md +5 -3
  286. package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
  287. package/{get-shit-done → gsd-core}/workflows/verify-work.md +7 -7
  288. package/hooks/dist/gsd-check-update-worker.js +16 -3
  289. package/hooks/dist/gsd-check-update.js +7 -5
  290. package/hooks/dist/gsd-context-monitor.js +2 -2
  291. package/hooks/dist/gsd-statusline.js +39 -21
  292. package/hooks/dist/gsd-update-banner.js +6 -2
  293. package/hooks/dist/gsd-worktree-path-guard.js +169 -0
  294. package/hooks/dist/managed-hooks-registry.cjs +35 -0
  295. package/hooks/gsd-check-update-worker.js +16 -3
  296. package/hooks/gsd-check-update.js +7 -5
  297. package/hooks/gsd-context-monitor.js +2 -2
  298. package/hooks/gsd-statusline.js +39 -21
  299. package/hooks/gsd-update-banner.js +6 -2
  300. package/hooks/gsd-worktree-path-guard.js +169 -0
  301. package/hooks/managed-hooks-registry.cjs +1 -0
  302. package/package.json +17 -11
  303. package/scripts/affected-tests-lib.cjs +1 -1
  304. package/scripts/base64-scan.sh +12 -0
  305. package/scripts/build-hooks.js +5 -1
  306. package/scripts/changeset/cli.cjs +2 -2
  307. package/scripts/changeset/github-release-notes.cjs +1 -1
  308. package/scripts/changeset/lint.cjs +1 -1
  309. package/scripts/check-alias-drift.cjs +8 -8
  310. package/scripts/check-env.cjs +5 -1
  311. package/scripts/ci-test-scope.cjs +34 -9
  312. package/scripts/command-contract-helpers.cjs +1 -1
  313. package/scripts/fix-slash-commands.cjs +5 -5
  314. package/scripts/gen-inventory-manifest.cjs +3 -3
  315. package/scripts/generate-package-identity.cjs +28 -7
  316. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  317. package/scripts/lint-command-contract.cjs +1 -1
  318. package/scripts/lint-legacy-dir-name.cjs +156 -0
  319. package/scripts/lint-package-identity-drift.cjs +8 -8
  320. package/scripts/lint-pr-check-project-dir.cjs +0 -1
  321. package/scripts/lint-shell-command-projection-drift.cjs +1 -1
  322. package/scripts/lint-skill-deps.cjs +1 -1
  323. package/scripts/lint-test-file-count.allowlist.json +129 -32
  324. package/scripts/lint-test-file-count.cjs +85 -30
  325. package/scripts/mutation-matrix.cjs +219 -0
  326. package/scripts/prompt-injection-scan.sh +5 -1
  327. package/scripts/release-notes/format-github-release-notes.cjs +256 -0
  328. package/scripts/release-tarball-smoke.cjs +9 -9
  329. package/scripts/run-tests.cjs +34 -2
  330. package/scripts/strip-prose-atrefs.cjs +2 -2
  331. package/scripts/sync-runtime-launcher.cjs +2 -2
  332. package/scripts/verify-npm-publish.cjs +252 -0
  333. package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
  334. package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
  335. package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
  336. package/get-shit-done/bin/lib/artifacts.cjs +0 -53
  337. package/get-shit-done/bin/lib/audit.cjs +0 -755
  338. package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
  339. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
  340. package/get-shit-done/bin/lib/clock.cjs +0 -96
  341. package/get-shit-done/bin/lib/clusters.cjs +0 -135
  342. package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
  343. package/get-shit-done/bin/lib/command-aliases.cjs +0 -815
  344. package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
  345. package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
  346. package/get-shit-done/bin/lib/commands.cjs +0 -1188
  347. package/get-shit-done/bin/lib/config-schema.cjs +0 -31
  348. package/get-shit-done/bin/lib/config.cjs +0 -728
  349. package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
  350. package/get-shit-done/bin/lib/core.cjs +0 -2121
  351. package/get-shit-done/bin/lib/docs.cjs +0 -270
  352. package/get-shit-done/bin/lib/drift.cjs +0 -388
  353. package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
  354. package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
  355. package/get-shit-done/bin/lib/gap-checker.cjs +0 -205
  356. package/get-shit-done/bin/lib/graphify.cjs +0 -592
  357. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
  358. package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
  359. package/get-shit-done/bin/lib/init.cjs +0 -2112
  360. package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
  361. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
  362. package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -354
  363. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
  364. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
  365. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
  366. package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
  367. package/get-shit-done/bin/lib/intel.cjs +0 -708
  368. package/get-shit-done/bin/lib/learnings.cjs +0 -421
  369. package/get-shit-done/bin/lib/milestone.cjs +0 -314
  370. package/get-shit-done/bin/lib/model-catalog.cjs +0 -212
  371. package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
  372. package/get-shit-done/bin/lib/observability/event.cjs +0 -82
  373. package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
  374. package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
  375. package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -80
  376. package/get-shit-done/bin/lib/phase.cjs +0 -1607
  377. package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
  378. package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
  379. package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
  380. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  381. package/get-shit-done/bin/lib/project-root.cjs +0 -112
  382. package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
  383. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -125
  384. package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -28
  385. package/get-shit-done/bin/lib/roadmap.cjs +0 -650
  386. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
  387. package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
  388. package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
  389. package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
  390. package/get-shit-done/bin/lib/secrets.cjs +0 -32
  391. package/get-shit-done/bin/lib/security.cjs +0 -600
  392. package/get-shit-done/bin/lib/semver-compare.cjs +0 -35
  393. package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -500
  394. package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
  395. package/get-shit-done/bin/lib/state.cjs +0 -2038
  396. package/get-shit-done/bin/lib/surface.cjs +0 -470
  397. package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
  398. package/get-shit-done/bin/lib/template.cjs +0 -228
  399. package/get-shit-done/bin/lib/uat.cjs +0 -289
  400. package/get-shit-done/bin/lib/update-context.cjs +0 -209
  401. package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
  402. package/get-shit-done/bin/lib/validate.cjs +0 -92
  403. package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
  404. package/get-shit-done/bin/lib/verify.cjs +0 -1511
  405. package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
  406. package/get-shit-done/bin/lib/workstream.cjs +0 -389
  407. package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
  408. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
  409. package/scripts/lint-no-source-grep-extras.cjs +0 -81
  410. package/scripts/lint-no-source-grep.cjs +0 -174
  411. package/scripts/lint-shared-module-handsync.cjs +0 -388
  412. package/scripts/shared-module-handsync-allowlist.json +0 -183
  413. /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
  414. /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
  415. /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
  416. /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
  417. /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
  418. /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
  419. /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
  420. /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
  421. /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
  422. /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
  423. /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
  424. /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
  425. /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
  426. /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
  427. /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
  428. /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
  429. /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
  430. /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
  431. /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
  432. /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
  433. /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
  434. /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
  435. /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
  436. /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
  437. /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
  438. /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
  439. /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
  440. /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
  441. /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
  442. /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
  443. /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
  444. /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
  445. /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
  446. /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
  447. /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
  448. /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
  449. /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
  450. /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
  451. /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
  452. /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
  453. /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
  454. /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
  455. /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
  456. /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
  457. /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
  458. /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
  459. /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
  460. /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
  461. /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
  462. /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
  463. /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
  464. /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
  465. /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
  466. /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
  467. /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
  468. /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
  469. /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
  470. /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
  471. /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
  472. /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
  473. /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
  474. /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
  475. /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
  476. /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
  477. /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
  478. /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
  479. /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
  480. /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
  481. /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
  482. /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
  483. /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
  484. /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
  485. /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
  486. /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
  487. /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
  488. /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
  489. /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
  490. /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
  491. /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
  492. /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
  493. /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
  494. /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
  495. /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
  496. /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
  497. /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
  498. /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
  499. /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
  500. /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
  501. /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
  502. /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
  503. /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
  504. /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
  505. /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
  506. /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
  507. /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
  508. /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
  509. /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
  510. /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
  511. /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
  512. /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
  513. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
  514. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
  515. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
  516. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
  517. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
  518. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
  519. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
  520. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
  521. /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
  522. /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
  523. /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
  524. /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
  525. /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
  526. /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
  527. /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
  528. /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
  529. /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
  530. /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
  531. /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
  532. /package/{get-shit-done → gsd-core}/workflows/session-report.md +0 -0
@@ -0,0 +1,347 @@
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-context-monitor.js',
38
+ 'hooks/gsd-graphify-update.sh',
39
+ 'hooks/gsd-phase-boundary.sh',
40
+ 'hooks/gsd-prompt-guard.js',
41
+ 'hooks/gsd-read-guard.js',
42
+ 'hooks/gsd-read-injection-scanner.js',
43
+ 'hooks/gsd-session-state.sh',
44
+ 'hooks/gsd-statusline.js',
45
+ 'hooks/gsd-update-banner.js',
46
+ 'hooks/gsd-validate-commit.sh',
47
+ 'hooks/gsd-workflow-guard.js',
48
+ 'hooks/gsd-worktree-path-guard.js',
49
+ ]));
50
+ // ── Internal helpers ──────────────────────────────────────────────────────────
51
+ function installerMigrationActionLabel(action) {
52
+ if (!action || !action.type)
53
+ return 'skipped';
54
+ if (action.type === 'backup-and-remove')
55
+ return 'backed up and removed';
56
+ if (action.type === 'remove-managed')
57
+ return 'removed';
58
+ if (action.type === 'rewrite-json')
59
+ return action.deleteIfEmpty ? 'rewrote or removed' : 'rewrote';
60
+ if (action.type === 'record-baseline')
61
+ return 'recorded';
62
+ if (action.type === 'baseline-preserve-user')
63
+ return 'preserved';
64
+ if (action.type === 'preserve-user')
65
+ return 'preserved';
66
+ if (action.type === 'prompt-user')
67
+ return 'blocked';
68
+ return 'skipped';
69
+ }
70
+ function blockedInstallerMigrationActions(result) {
71
+ if (result && Array.isArray(result.blocked))
72
+ return result.blocked;
73
+ const plan = result && result.plan;
74
+ if (plan && Array.isArray(plan.blocked))
75
+ return plan.blocked;
76
+ return [];
77
+ }
78
+ function baselineSummaryLabel(count, noun) {
79
+ return `${count} ${noun}${count === 1 ? '' : 's'}`;
80
+ }
81
+ function baselineSummaryRow(type, actions) {
82
+ const count = actions.length;
83
+ if (type === 'record-baseline') {
84
+ return {
85
+ label: 'recorded',
86
+ relPath: baselineSummaryLabel(count, 'managed baseline file'),
87
+ reason: 'first-time baseline scan',
88
+ action: { type: 'record-baseline-summary', count, actions },
89
+ };
90
+ }
91
+ return {
92
+ label: 'preserved',
93
+ relPath: baselineSummaryLabel(count, 'user baseline file'),
94
+ reason: 'first-time baseline scan',
95
+ action: { type: 'baseline-preserve-user-summary', count, actions },
96
+ };
97
+ }
98
+ function summarizeInstallerMigrationResult(result) {
99
+ const plan = result && result.plan;
100
+ const actions = plan && Array.isArray(plan.actions) ? plan.actions : [];
101
+ const blocked = blockedInstallerMigrationActions(result);
102
+ const blockedSet = new Set(blocked);
103
+ const rows = [];
104
+ const baselineIndexes = new Map();
105
+ const baselineActions = new Map();
106
+ for (const action of actions) {
107
+ const type = action && action.type;
108
+ if (type === 'record-baseline' || type === 'baseline-preserve-user') {
109
+ if (!baselineActions.has(type)) {
110
+ baselineActions.set(type, []);
111
+ baselineIndexes.set(type, rows.length);
112
+ rows.push(null);
113
+ }
114
+ baselineActions.get(type).push(action);
115
+ continue;
116
+ }
117
+ rows.push({
118
+ label: blockedSet.has(action) ? 'blocked' : installerMigrationActionLabel(action),
119
+ relPath: action.relPath ?? '',
120
+ reason: action.reason || '',
121
+ action,
122
+ });
123
+ }
124
+ // Phase 4 requires action reporting without flooding first-time baseline installs:
125
+ // docs/installer-migrations.md#phase-4-installupdate-integration.
126
+ for (const [type, baselineRows] of baselineActions) {
127
+ rows[baselineIndexes.get(type)] = baselineSummaryRow(type, baselineRows);
128
+ }
129
+ return {
130
+ hasReportableActions: actions.length > 0 || blocked.length > 0,
131
+ blocked,
132
+ rows,
133
+ };
134
+ }
135
+ // Classify a blocked prompt-user action into one of the safe-default
136
+ // categories. Returns null when no safe default applies — caller must
137
+ // fall back to the hard assertion / interactive prompt for those.
138
+ //
139
+ // Stale SDK build artifacts live under gsd-core/sdk/{dist,src}/
140
+ // and are regenerated on every install, so removing them is lossless.
141
+ // User-facing skill anchors are the .md files that surface as commands
142
+ // to the user — these are user-owned and must be kept.
143
+ function classifyPromptUserAction(action) {
144
+ const relPath = action && action.relPath;
145
+ if (typeof relPath !== 'string' || !relPath)
146
+ return null;
147
+ if (/^gsd-core\/sdk\/(dist|src)\//.test(relPath)) {
148
+ return { category: 'stale-sdk-build-artifact', choice: 'remove' };
149
+ }
150
+ if (/^skills\/gsd-[^/]+\/SKILL\.md$/.test(relPath)) {
151
+ return { category: 'user-facing-skill', choice: 'keep' };
152
+ }
153
+ // #3610 / #3628: bundled GSD hooks shipped under `hooks/`. The whitelist
154
+ // is the explicit set of filenames in the npm distribution — files that
155
+ // match the shape but are NOT in the whitelist (user-authored hooks,
156
+ // retired hooks from prior versions) fall through to the block-or-prompt
157
+ // flow so the user retains control. On a first-time-baseline scan the
158
+ // installer can safely remove whitelisted hooks because it is about to
159
+ // write the fresh bundled versions in their place.
160
+ if (exports.BUNDLED_GSD_HOOK_FILES.has(relPath)) {
161
+ return { category: 'bundled-gsd-hook', choice: 'remove' };
162
+ }
163
+ return null;
164
+ }
165
+ // Convert a blocked prompt-user action into a concrete plan action.
166
+ // `keep` → baseline-preserve-user (idempotent — already on disk).
167
+ // `remove` → backup-and-remove (safe: keeps a rollback copy in the
168
+ // migration journal under gsd-migration-journal/<runId>-backups/).
169
+ function materializeResolution(action, choice) {
170
+ const base = {
171
+ type: '', // overridden in each return branch below
172
+ migrationId: action.migrationId,
173
+ migrationChecksum: action.migrationChecksum,
174
+ relPath: action.relPath,
175
+ reason: action.reason,
176
+ classification: action.classification,
177
+ originalHash: action.originalHash || null,
178
+ currentHash: action.currentHash || null,
179
+ requestedType: 'prompt-user',
180
+ };
181
+ if (choice === 'keep') {
182
+ return { ...base, type: 'baseline-preserve-user' };
183
+ }
184
+ // 'remove'
185
+ return { ...base, type: 'backup-and-remove', backupRelPath: null };
186
+ }
187
+ function normalizeResolutionChoice(rawValue) {
188
+ if (typeof rawValue !== 'string')
189
+ return null;
190
+ const normalized = rawValue.trim().toLowerCase();
191
+ return VALID_CHOICES.includes(normalized) ? normalized : null;
192
+ }
193
+ function actionSupportsChoice(action, choice) {
194
+ if (!action || !choice)
195
+ return false;
196
+ if (!Array.isArray(action.choices) || action.choices.length === 0) {
197
+ return VALID_CHOICES.includes(choice);
198
+ }
199
+ return action.choices.includes(choice);
200
+ }
201
+ // Resolve prompt-user actions when stdin is not a TTY. Mutates the
202
+ // passed result so:
203
+ // - resolved actions are appended to plan.actions in their concrete
204
+ // form (baseline-preserve-user / backup-and-remove);
205
+ // - result.blocked and plan.blocked are filtered to actions that
206
+ // could NOT be safely defaulted (caller must still handle those).
207
+ // Returns { result, resolutions } where `resolutions` is the structured
208
+ // log of every defaulted resolution.
209
+ function resolveInstallerMigrationPromptsForNonTty(result, options = {}) {
210
+ if (!result || typeof result !== 'object') {
211
+ return { result, resolutions: [] };
212
+ }
213
+ const blocked = blockedInstallerMigrationActions(result);
214
+ if (blocked.length === 0) {
215
+ return { result, resolutions: [] };
216
+ }
217
+ const isTty = options.isTty === true;
218
+ if (isTty) {
219
+ // Honour interactive prompting paths (not implemented yet — the
220
+ // hard throw is still the right behaviour for TTY runs); resolver
221
+ // only fires when the installer cannot interactively ask.
222
+ return { result, resolutions: [] };
223
+ }
224
+ const env = options && options.env && typeof options.env === 'object'
225
+ ? options.env
226
+ : process.env;
227
+ const envChoice = normalizeResolutionChoice(env && env[exports.RESOLUTION_ENV_VAR]);
228
+ const resolutions = [];
229
+ const unresolved = [];
230
+ for (const action of blocked) {
231
+ if (action && action.type === 'prompt-user') {
232
+ let category = null;
233
+ let choice = null;
234
+ let source = null;
235
+ if (envChoice && actionSupportsChoice(action, envChoice)) {
236
+ category = 'operator-override';
237
+ choice = envChoice;
238
+ source = exports.RESOLUTION_ENV_VAR;
239
+ }
240
+ else {
241
+ const classification = classifyPromptUserAction(action);
242
+ if (classification) {
243
+ category = classification.category;
244
+ choice = classification.choice;
245
+ source = 'non-tty-default';
246
+ }
247
+ }
248
+ if (choice) {
249
+ const resolved = materializeResolution(action, choice);
250
+ // Replace the original prompt-user action in-place when present so
251
+ // applyInstallerMigrationPlan never sees an unsupported action type.
252
+ // Fallback to append only when the blocked action did not originate
253
+ // from plan.actions (defensive).
254
+ if (result.plan && Array.isArray(result.plan.actions)) {
255
+ const idx = result.plan.actions.indexOf(action);
256
+ if (idx >= 0) {
257
+ result.plan.actions[idx] = resolved;
258
+ }
259
+ else {
260
+ result.plan.actions.push(resolved);
261
+ }
262
+ }
263
+ resolutions.push({
264
+ relPath: action.relPath,
265
+ category: category ?? '',
266
+ choice: choice ?? '',
267
+ reason: action.reason,
268
+ resolvedActionType: resolved.type,
269
+ source: source ?? '',
270
+ });
271
+ continue;
272
+ }
273
+ }
274
+ unresolved.push(action);
275
+ }
276
+ // Mutate both the top-level and plan.blocked surfaces so downstream
277
+ // callers (assertInstallerMigrationsUnblocked, summarizers) see the
278
+ // post-resolution state.
279
+ if (Array.isArray(result.blocked)) {
280
+ result.blocked = unresolved;
281
+ }
282
+ if (result.plan && Array.isArray(result.plan.blocked)) {
283
+ result.plan.blocked = unresolved;
284
+ }
285
+ return { result, resolutions };
286
+ }
287
+ // Group blocked prompt-user actions by their `reason` so the operator
288
+ // sees one summary line per cause instead of N path lines for the
289
+ // same underlying issue.
290
+ function groupBlockedByReason(blocked) {
291
+ const byReason = new Map();
292
+ for (const action of blocked) {
293
+ const reason = (action && action.reason) || 'no reason given';
294
+ if (!byReason.has(reason))
295
+ byReason.set(reason, []);
296
+ byReason.get(reason).push(action);
297
+ }
298
+ return byReason;
299
+ }
300
+ function describeChoicesForActions(blocked) {
301
+ const choiceSet = new Set();
302
+ for (const action of blocked) {
303
+ if (action && Array.isArray(action.choices)) {
304
+ for (const choice of action.choices)
305
+ choiceSet.add(choice);
306
+ }
307
+ }
308
+ if (choiceSet.size === 0) {
309
+ for (const fallback of VALID_CHOICES)
310
+ choiceSet.add(fallback);
311
+ }
312
+ return [...choiceSet];
313
+ }
314
+ function buildBlockedErrorMessage(blocked) {
315
+ const byReason = groupBlockedByReason(blocked);
316
+ const totalFiles = blocked.length;
317
+ const choices = describeChoicesForActions(blocked);
318
+ const lines = [
319
+ `installer migration blocked pending user choice: ${totalFiles} file${totalFiles === 1 ? '' : 's'} need a decision`,
320
+ ` choices: [${choices.join(', ')}]`,
321
+ ];
322
+ for (const [reason, actions] of byReason) {
323
+ lines.push(` - ${actions.length} file${actions.length === 1 ? '' : 's'}: ${reason}`);
324
+ // Show up to 3 sample paths so operators can spot which files are
325
+ // affected without dumping a thousand-line wall when SDK build
326
+ // artifacts leak.
327
+ const sample = actions.slice(0, 3).map((a) => a.relPath);
328
+ if (sample.length > 0) {
329
+ lines.push(` e.g. ${sample.join(', ')}${actions.length > sample.length ? `, ... (+${actions.length - sample.length} more)` : ''}`);
330
+ }
331
+ }
332
+ lines.push(` resolve non-interactively by setting ${exports.RESOLUTION_ENV_VAR}=<choice> ` +
333
+ `(or run the installer in a TTY to be prompted per file).`);
334
+ return lines.join('\n');
335
+ }
336
+ function assertInstallerMigrationsUnblocked(result) {
337
+ const blocked = blockedInstallerMigrationActions(result);
338
+ if (blocked.length === 0)
339
+ return;
340
+ const message = buildBlockedErrorMessage(blocked);
341
+ const error = Object.assign(new Error(message), {
342
+ blocked,
343
+ blockedByReason: Object.fromEntries(groupBlockedByReason(blocked)),
344
+ resolutionEnvVar: exports.RESOLUTION_ENV_VAR,
345
+ });
346
+ throw error;
347
+ }
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ /**
3
+ * Installer migration: record first-time installer migration baseline.
4
+ *
5
+ * ADR-457 build-at-publish: the hand-written
6
+ * bin/lib/installer-migrations/000-first-time-baseline.cjs collapsed to a
7
+ * TypeScript source of truth. Behaviour is preserved byte-for-behaviour from
8
+ * the prior 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
+ const node_fs_1 = __importDefault(require("node:fs"));
14
+ const node_path_1 = __importDefault(require("node:path"));
15
+ const BASELINE_MIGRATION_ID = '2026-05-11-first-time-baseline-scan';
16
+ // Runtime install surfaces must stay aligned with:
17
+ // - docs/installer-migrations.md#runtime-configuration-contract-registry
18
+ // - docs/ARCHITECTURE.md#runtime-install-contract-matrix
19
+ const RUNTIME_SURFACES = {
20
+ claude: ['gsd-core', 'commands/gsd', 'skills', 'agents', 'hooks', 'settings.json'],
21
+ codex: ['gsd-core', 'skills', 'agents', 'hooks', 'config.toml', 'hooks.json'],
22
+ gemini: ['gsd-core', 'commands/gsd', 'hooks'],
23
+ opencode: ['gsd-core', 'command', 'skills', 'agents'],
24
+ kilo: ['gsd-core', 'command', 'skills', 'agents'],
25
+ copilot: ['gsd-core', 'skills', 'agents'],
26
+ antigravity: ['gsd-core', 'skills', 'agents'],
27
+ cursor: ['gsd-core', 'skills', 'agents'],
28
+ windsurf: ['gsd-core', 'skills', 'agents', 'rules'],
29
+ augment: ['gsd-core', 'skills', 'agents'],
30
+ trae: ['gsd-core', 'skills', 'agents', 'rules'],
31
+ qwen: ['gsd-core', 'skills', 'agents'],
32
+ hermes: ['gsd-core', 'skills/gsd', 'agents'],
33
+ cline: ['gsd-core', 'skills', 'agents'],
34
+ codebuddy: ['gsd-core', 'skills', 'agents'],
35
+ };
36
+ const COMMON_SURFACES = ['gsd-core', 'skills', 'agents', 'hooks'];
37
+ const INTERNAL_TOP_LEVEL_NAMES = new Set([
38
+ 'gsd-file-manifest.json',
39
+ 'gsd-install-state.json',
40
+ 'gsd-migration-backups',
41
+ 'gsd-migration-journal',
42
+ ]);
43
+ const USER_OWNED_PATHS = new Set([
44
+ 'gsd-core/USER-PROFILE.md',
45
+ 'commands/gsd/dev-preferences.md',
46
+ 'skills/gsd-dev-preferences/SKILL.md',
47
+ ]);
48
+ let knownGeneratedAgentNames = null;
49
+ function normalizeRelPath(relPath) {
50
+ return relPath.replace(/\\/g, '/').replace(/^\/+/, '');
51
+ }
52
+ function baselineInstallSurfaces(runtime) {
53
+ if (runtime && RUNTIME_SURFACES[runtime])
54
+ return RUNTIME_SURFACES[runtime];
55
+ return COMMON_SURFACES;
56
+ }
57
+ function walkFiles(root, relDir, files) {
58
+ const dir = node_path_1.default.join(root, relDir);
59
+ if (!node_fs_1.default.existsSync(dir))
60
+ return;
61
+ const entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
62
+ for (const entry of entries) {
63
+ const relPath = node_path_1.default.posix.join(relDir, entry.name);
64
+ if (relDir === '' && INTERNAL_TOP_LEVEL_NAMES.has(entry.name))
65
+ continue;
66
+ if (entry.isDirectory()) {
67
+ walkFiles(root, relPath, files);
68
+ }
69
+ else if (entry.isFile()) {
70
+ files.add(normalizeRelPath(relPath));
71
+ }
72
+ }
73
+ }
74
+ function scanBaselineFiles(configDir, runtime) {
75
+ const relPaths = new Set();
76
+ for (const surface of baselineInstallSurfaces(runtime)) {
77
+ const normalized = normalizeRelPath(surface);
78
+ const fullPath = node_path_1.default.join(configDir, normalized);
79
+ if (!node_fs_1.default.existsSync(fullPath))
80
+ continue;
81
+ const stat = node_fs_1.default.statSync(fullPath);
82
+ if (stat.isDirectory()) {
83
+ walkFiles(configDir, normalized, relPaths);
84
+ }
85
+ else if (stat.isFile() && !INTERNAL_TOP_LEVEL_NAMES.has(normalized)) {
86
+ relPaths.add(normalized);
87
+ }
88
+ }
89
+ return [...relPaths];
90
+ }
91
+ function isUserOwnedBaselinePath(relPath) {
92
+ if (USER_OWNED_PATHS.has(relPath))
93
+ return true;
94
+ const parts = relPath.split('/');
95
+ if (parts[0] === 'skills' && parts[1] && !parts[1].startsWith('gsd-'))
96
+ return true;
97
+ if (parts[0] === 'agents' && parts[1] && !parts[1].startsWith('gsd-'))
98
+ return true;
99
+ return false;
100
+ }
101
+ function listKnownGeneratedAgentNames() {
102
+ if (knownGeneratedAgentNames)
103
+ return knownGeneratedAgentNames;
104
+ knownGeneratedAgentNames = new Set();
105
+ const agentsDir = node_path_1.default.resolve(__dirname, '..', '..', '..', '..', 'agents');
106
+ try {
107
+ for (const entry of node_fs_1.default.readdirSync(agentsDir, { withFileTypes: true })) {
108
+ if (entry.isFile() && entry.name.startsWith('gsd-') && entry.name.endsWith('.md')) {
109
+ knownGeneratedAgentNames.add(entry.name.replace(/\.md$/, ''));
110
+ }
111
+ }
112
+ }
113
+ catch {
114
+ // If the source agent directory is unavailable, fail closed and treat
115
+ // GSD-looking agent files as user-choice artifacts.
116
+ }
117
+ return knownGeneratedAgentNames;
118
+ }
119
+ function isKnownGeneratedAgentPath(relPath, runtime) {
120
+ const parts = relPath.split('/');
121
+ if (parts.length !== 2 || parts[0] !== 'agents')
122
+ return false;
123
+ const fileName = parts[1];
124
+ const extension = node_path_1.default.posix.extname(fileName);
125
+ if (extension !== '.md' && !(runtime === 'codex' && extension === '.toml'))
126
+ return false;
127
+ const agentName = fileName.slice(0, -extension.length);
128
+ return listKnownGeneratedAgentNames().has(agentName);
129
+ }
130
+ function isStaleGsdLookingPath(relPath) {
131
+ const baseName = node_path_1.default.posix.basename(relPath);
132
+ if (/^gsd[-_]/.test(baseName))
133
+ return true;
134
+ const parts = relPath.split('/');
135
+ if ((parts[0] === 'skills' || parts[0] === 'agents') && parts[1] && parts[1].startsWith('gsd-')) {
136
+ return true;
137
+ }
138
+ return false;
139
+ }
140
+ function baselineActionRank(action) {
141
+ if (action.type === 'record-baseline')
142
+ return 0;
143
+ if (action.type === 'baseline-preserve-user')
144
+ return 1;
145
+ return 2;
146
+ }
147
+ const migration = {
148
+ id: BASELINE_MIGRATION_ID,
149
+ title: 'Record first-time installer migration baseline',
150
+ description: 'Classify existing install surfaces before destructive installer migrations run.',
151
+ introducedIn: '1.50.0',
152
+ scopes: ['global', 'local'],
153
+ destructive: false,
154
+ plan: ({ configDir, runtime, baselineScan, classifyArtifact }) => {
155
+ if (!baselineScan)
156
+ return [];
157
+ const actions = [];
158
+ for (const relPath of scanBaselineFiles(configDir, runtime)) {
159
+ // docs/installer-migrations.md#baseline-preserve-user keeps user-owned
160
+ // artifacts out of destructive migration flow.
161
+ if (isUserOwnedBaselinePath(relPath)) {
162
+ actions.push({
163
+ type: 'baseline-preserve-user',
164
+ relPath,
165
+ reason: 'known user-owned artifact preserved by first-time migration baseline',
166
+ classification: 'user-owned',
167
+ originalHash: null,
168
+ currentHash: null,
169
+ });
170
+ continue;
171
+ }
172
+ const artifact = classifyArtifact(relPath);
173
+ if (artifact.classification === 'managed-pristine' || artifact.classification === 'managed-modified') {
174
+ actions.push({
175
+ type: 'record-baseline',
176
+ relPath,
177
+ reason: 'existing manifest-managed file included in first-time migration baseline',
178
+ });
179
+ continue;
180
+ }
181
+ const currentHash = artifact.currentHash ?? null;
182
+ if (isKnownGeneratedAgentPath(relPath, runtime)) {
183
+ actions.push({
184
+ type: 'record-baseline',
185
+ relPath,
186
+ reason: 'known installer-generated agent included in first-time migration baseline',
187
+ classification: artifact.classification,
188
+ originalHash: artifact.originalHash ?? null,
189
+ currentHash,
190
+ });
191
+ continue;
192
+ }
193
+ if (isStaleGsdLookingPath(relPath)) {
194
+ actions.push({
195
+ type: 'prompt-user',
196
+ relPath,
197
+ reason: 'GSD-looking file is not proven manifest-managed and needs explicit user choice',
198
+ classification: 'stale-gsd-looking',
199
+ originalHash: artifact.originalHash ?? null,
200
+ currentHash,
201
+ prompt: 'Choose whether to remove this stale-looking GSD artifact or keep it as user-owned.',
202
+ choices: ['keep', 'remove'],
203
+ });
204
+ continue;
205
+ }
206
+ actions.push({
207
+ type: 'baseline-preserve-user',
208
+ relPath,
209
+ reason: 'unknown install-surface file preserved by first-time migration baseline',
210
+ classification: artifact.classification,
211
+ originalHash: artifact.originalHash ?? null,
212
+ currentHash,
213
+ });
214
+ }
215
+ return actions.sort((left, right) => baselineActionRank(left) - baselineActionRank(right) || left.relPath.localeCompare(right.relPath));
216
+ },
217
+ };
218
+ module.exports = migration;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * Installer migration: remove manifest-managed legacy orphan hook files
4
+ * (ADR-457 build-at-publish: the hand-written
5
+ * bin/lib/installer-migrations/001-legacy-orphan-files.cjs collapsed to a
6
+ * TypeScript source of truth). Behaviour is preserved byte-for-behaviour from
7
+ * the prior hand-written .cjs; only types are added.
8
+ */
9
+ const LEGACY_ORPHAN_FILES = [
10
+ 'hooks/gsd-notify.sh',
11
+ 'hooks/statusline.js',
12
+ ];
13
+ const migration = {
14
+ id: '2026-05-11-legacy-orphan-files',
15
+ title: 'Remove manifest-managed legacy orphan hook files',
16
+ description: 'Remove legacy orphan hook files that are still manifest-managed.',
17
+ introducedIn: '1.50.0',
18
+ scopes: ['global', 'local'],
19
+ destructive: true,
20
+ // Retired generated hook files are removed only with manifest-managed
21
+ // evidence. This follows docs/installer-migrations.md#ownership and avoids
22
+ // relying on whether a runtime currently registers host hook config in the
23
+ // runtime contract registry.
24
+ plan: (ctx) => {
25
+ const actions = [];
26
+ for (const relPath of LEGACY_ORPHAN_FILES) {
27
+ const artifact = ctx.classifyArtifact(relPath);
28
+ if (artifact.classification === 'managed-pristine') {
29
+ actions.push({
30
+ type: 'remove-managed',
31
+ relPath,
32
+ reason: 'legacy orphan hook file retired by installer migration',
33
+ ownershipEvidence: 'legacy hook path is manifest-managed in gsd-file-manifest.json',
34
+ });
35
+ }
36
+ else if (artifact.classification === 'managed-modified') {
37
+ actions.push({
38
+ type: 'backup-and-remove',
39
+ relPath,
40
+ reason: 'legacy orphan hook file retired by installer migration',
41
+ ownershipEvidence: 'legacy hook path is manifest-managed in gsd-file-manifest.json',
42
+ });
43
+ }
44
+ }
45
+ return actions;
46
+ },
47
+ };
48
+ module.exports = migration;