@opengsd/gsd-core 1.3.0-rc.1 → 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 (521) hide show
  1. package/README.ja-JP.md +44 -790
  2. package/README.ko-KR.md +41 -778
  3. package/README.md +39 -180
  4. package/README.pt-BR.md +45 -413
  5. package/README.zh-CN.md +43 -761
  6. package/agents/gsd-ai-researcher.md +1 -1
  7. package/agents/gsd-debugger.md +8 -8
  8. package/agents/gsd-domain-researcher.md +14 -1
  9. package/agents/gsd-eval-auditor.md +1 -1
  10. package/agents/gsd-eval-planner.md +1 -1
  11. package/agents/gsd-executor.md +21 -8
  12. package/agents/gsd-framework-selector.md +1 -1
  13. package/agents/gsd-intel-updater.md +4 -4
  14. package/agents/gsd-phase-researcher.md +18 -5
  15. package/agents/gsd-plan-checker.md +3 -3
  16. package/agents/gsd-planner.md +36 -23
  17. package/agents/gsd-project-researcher.md +13 -0
  18. package/agents/gsd-research-synthesizer.md +6 -2
  19. package/agents/gsd-roadmapper.md +6 -6
  20. package/agents/gsd-ui-researcher.md +15 -2
  21. package/agents/gsd-user-profiler.md +2 -2
  22. package/agents/gsd-verifier.md +7 -7
  23. package/bin/install.js +169 -59
  24. package/commands/gsd/add-tests.md +1 -1
  25. package/commands/gsd/ai-integration-phase.md +3 -3
  26. package/commands/gsd/audit-fix.md +1 -1
  27. package/commands/gsd/audit-milestone.md +1 -1
  28. package/commands/gsd/audit-uat.md +1 -1
  29. package/commands/gsd/autonomous.md +2 -2
  30. package/commands/gsd/capture.md +6 -6
  31. package/commands/gsd/cleanup.md +1 -1
  32. package/commands/gsd/code-review.md +1 -1
  33. package/commands/gsd/complete-milestone.md +2 -2
  34. package/commands/gsd/config.md +3 -3
  35. package/commands/gsd/debug.md +1 -1
  36. package/commands/gsd/discuss-phase.md +5 -4
  37. package/commands/gsd/docs-update.md +1 -1
  38. package/commands/gsd/eval-review.md +2 -2
  39. package/commands/gsd/execute-phase.md +2 -2
  40. package/commands/gsd/explore.md +1 -1
  41. package/commands/gsd/extract-learnings.md +2 -2
  42. package/commands/gsd/fast.md +1 -1
  43. package/commands/gsd/forensics.md +1 -1
  44. package/commands/gsd/graphify.md +9 -9
  45. package/commands/gsd/health.md +1 -1
  46. package/commands/gsd/help.md +2 -2
  47. package/commands/gsd/import.md +5 -5
  48. package/commands/gsd/inbox.md +1 -1
  49. package/commands/gsd/ingest-docs.md +4 -4
  50. package/commands/gsd/manager.md +3 -3
  51. package/commands/gsd/map-codebase.md +1 -1
  52. package/commands/gsd/milestone-summary.md +1 -1
  53. package/commands/gsd/mvp-phase.md +4 -4
  54. package/commands/gsd/new-milestone.md +5 -5
  55. package/commands/gsd/new-project.md +5 -5
  56. package/commands/gsd/pause-work.md +2 -2
  57. package/commands/gsd/phase.md +4 -4
  58. package/commands/gsd/plan-phase.md +2 -2
  59. package/commands/gsd/plan-review-convergence.md +4 -4
  60. package/commands/gsd/pr-branch.md +1 -1
  61. package/commands/gsd/profile-user.md +2 -2
  62. package/commands/gsd/progress.md +4 -4
  63. package/commands/gsd/quick.md +1 -1
  64. package/commands/gsd/resume-work.md +1 -1
  65. package/commands/gsd/review.md +1 -1
  66. package/commands/gsd/secure-phase.md +1 -1
  67. package/commands/gsd/settings.md +1 -1
  68. package/commands/gsd/ship.md +2 -2
  69. package/commands/gsd/sketch.md +7 -7
  70. package/commands/gsd/spec-phase.md +2 -2
  71. package/commands/gsd/spike.md +3 -3
  72. package/commands/gsd/stats.md +1 -1
  73. package/commands/gsd/surface.md +4 -4
  74. package/commands/gsd/thread.md +1 -1
  75. package/commands/gsd/ui-phase.md +2 -2
  76. package/commands/gsd/ui-review.md +2 -2
  77. package/commands/gsd/ultraplan-phase.md +2 -2
  78. package/commands/gsd/undo.md +3 -3
  79. package/commands/gsd/update.md +3 -3
  80. package/commands/gsd/validate-phase.md +1 -1
  81. package/commands/gsd/verify-work.md +2 -2
  82. package/commands/gsd/workspace.md +4 -4
  83. package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
  84. package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +13 -3
  85. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  86. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  87. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  88. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  89. package/gsd-core/bin/lib/audit.cjs +743 -0
  90. package/gsd-core/bin/lib/check-command-router.cjs +342 -0
  91. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  92. package/gsd-core/bin/lib/clock.cjs +95 -0
  93. package/gsd-core/bin/lib/clusters.cjs +128 -0
  94. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  95. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  96. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  97. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  98. package/gsd-core/bin/lib/commands.cjs +1202 -0
  99. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  100. package/{get-shit-done → gsd-core}/bin/lib/config-types.cjs +1 -1
  101. package/gsd-core/bin/lib/config.cjs +714 -0
  102. package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
  103. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  104. package/gsd-core/bin/lib/core.cjs +2007 -0
  105. package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
  106. package/gsd-core/bin/lib/docs.cjs +252 -0
  107. package/gsd-core/bin/lib/drift.cjs +364 -0
  108. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  109. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  110. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  111. package/gsd-core/bin/lib/graphify.cjs +496 -0
  112. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  113. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  114. package/gsd-core/bin/lib/init.cjs +1799 -0
  115. package/gsd-core/bin/lib/install-profiles.cjs +526 -0
  116. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  117. package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
  118. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  119. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  120. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  121. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  122. package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
  123. package/gsd-core/bin/lib/intel.cjs +607 -0
  124. package/gsd-core/bin/lib/learnings.cjs +270 -0
  125. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  126. package/gsd-core/bin/lib/milestone.cjs +373 -0
  127. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  128. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  129. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  130. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  131. package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
  132. package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
  133. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  134. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  135. package/gsd-core/bin/lib/phase.cjs +1307 -0
  136. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  137. package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
  138. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  139. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  140. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  141. package/gsd-core/bin/lib/project-root.cjs +119 -0
  142. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  143. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  144. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  145. package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
  146. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  147. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
  148. package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
  149. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  150. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  151. package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
  152. package/gsd-core/bin/lib/secrets.cjs +34 -0
  153. package/gsd-core/bin/lib/security.cjs +407 -0
  154. package/{get-shit-done → gsd-core}/bin/lib/semver-compare.cjs +1 -1
  155. package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
  156. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  157. package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -78
  158. package/gsd-core/bin/lib/state.cjs +2010 -0
  159. package/gsd-core/bin/lib/surface.cjs +406 -0
  160. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  161. package/gsd-core/bin/lib/template.cjs +237 -0
  162. package/gsd-core/bin/lib/uat.cjs +297 -0
  163. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  164. package/gsd-core/bin/lib/update-context.cjs +218 -0
  165. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  166. package/gsd-core/bin/lib/validate.cjs +112 -0
  167. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  168. package/gsd-core/bin/lib/verify.cjs +1451 -0
  169. package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
  170. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  171. package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
  172. package/gsd-core/bin/lib/workstream.cjs +380 -0
  173. package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
  174. package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +5 -0
  175. package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
  176. package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
  177. package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
  178. package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
  179. package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
  180. package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
  181. package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
  182. package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
  183. package/gsd-core/references/worktree-branch-check.md +38 -0
  184. package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
  185. package/{get-shit-done → gsd-core}/templates/README.md +2 -2
  186. package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
  187. package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
  188. package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
  189. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  190. package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
  191. package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
  192. package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
  193. package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
  194. package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
  195. package/{get-shit-done → gsd-core}/workflows/audit-fix.md +1 -1
  196. package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +1 -1
  197. package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
  198. package/{get-shit-done → gsd-core}/workflows/autonomous.md +4 -4
  199. package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
  200. package/{get-shit-done → gsd-core}/workflows/cleanup.md +1 -1
  201. package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +1 -1
  202. package/{get-shit-done → gsd-core}/workflows/code-review.md +4 -4
  203. package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
  204. package/{get-shit-done → gsd-core}/workflows/debug.md +1 -1
  205. package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +4 -2
  206. package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
  207. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +4 -4
  208. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
  209. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
  210. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
  211. package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +2 -2
  212. package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
  213. package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
  214. package/{get-shit-done → gsd-core}/workflows/docs-update.md +1 -1
  215. package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
  216. package/{get-shit-done → gsd-core}/workflows/eval-review.md +2 -2
  217. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +15 -2
  218. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  219. package/{get-shit-done → gsd-core}/workflows/execute-phase.md +68 -46
  220. package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
  221. package/{get-shit-done → gsd-core}/workflows/explore.md +3 -3
  222. package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
  223. package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
  224. package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
  225. package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
  226. package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +1 -1
  227. package/{get-shit-done → gsd-core}/workflows/import.md +1 -1
  228. package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +3 -3
  229. package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
  230. package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
  231. package/{get-shit-done → gsd-core}/workflows/manager.md +1 -1
  232. package/{get-shit-done → gsd-core}/workflows/map-codebase.md +1 -1
  233. package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
  234. package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
  235. package/{get-shit-done → gsd-core}/workflows/new-milestone.md +3 -3
  236. package/{get-shit-done → gsd-core}/workflows/new-project.md +6 -6
  237. package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
  238. package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
  239. package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
  240. package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
  241. package/{get-shit-done → gsd-core}/workflows/plan-phase.md +15 -15
  242. package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +7 -7
  243. package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
  244. package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
  245. package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
  246. package/{get-shit-done → gsd-core}/workflows/quick.md +2 -26
  247. package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
  248. package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
  249. package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
  250. package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
  251. package/{get-shit-done → gsd-core}/workflows/review.md +1 -1
  252. package/{get-shit-done → gsd-core}/workflows/scan.md +1 -1
  253. package/{get-shit-done → gsd-core}/workflows/secure-phase.md +3 -3
  254. package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +1 -1
  255. package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
  256. package/{get-shit-done → gsd-core}/workflows/settings.md +1 -1
  257. package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
  258. package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
  259. package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
  260. package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
  261. package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
  262. package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
  263. package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
  264. package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
  265. package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
  266. package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
  267. package/{get-shit-done → gsd-core}/workflows/ui-phase.md +3 -3
  268. package/{get-shit-done → gsd-core}/workflows/ui-review.md +2 -2
  269. package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
  270. package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
  271. package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
  272. package/{get-shit-done → gsd-core}/workflows/validate-phase.md +3 -3
  273. package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
  274. package/{get-shit-done → gsd-core}/workflows/verify-work.md +5 -5
  275. package/hooks/dist/gsd-check-update-worker.js +16 -3
  276. package/hooks/dist/gsd-check-update.js +7 -5
  277. package/hooks/dist/gsd-context-monitor.js +2 -2
  278. package/hooks/dist/gsd-statusline.js +39 -21
  279. package/hooks/dist/gsd-update-banner.js +6 -2
  280. package/hooks/dist/managed-hooks-registry.cjs +35 -0
  281. package/hooks/gsd-check-update-worker.js +16 -3
  282. package/hooks/gsd-check-update.js +7 -5
  283. package/hooks/gsd-context-monitor.js +2 -2
  284. package/hooks/gsd-statusline.js +39 -21
  285. package/hooks/gsd-update-banner.js +6 -2
  286. package/package.json +9 -6
  287. package/scripts/affected-tests-lib.cjs +1 -1
  288. package/scripts/base64-scan.sh +12 -0
  289. package/scripts/build-hooks.js +4 -1
  290. package/scripts/changeset/cli.cjs +2 -2
  291. package/scripts/changeset/github-release-notes.cjs +1 -1
  292. package/scripts/changeset/lint.cjs +1 -1
  293. package/scripts/check-alias-drift.cjs +8 -8
  294. package/scripts/check-env.cjs +5 -1
  295. package/scripts/ci-test-scope.cjs +25 -10
  296. package/scripts/command-contract-helpers.cjs +1 -1
  297. package/scripts/fix-slash-commands.cjs +5 -5
  298. package/scripts/gen-inventory-manifest.cjs +3 -3
  299. package/scripts/generate-package-identity.cjs +28 -7
  300. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  301. package/scripts/lint-command-contract.cjs +1 -1
  302. package/scripts/lint-legacy-dir-name.cjs +156 -0
  303. package/scripts/lint-package-identity-drift.cjs +8 -8
  304. package/scripts/lint-pr-check-project-dir.cjs +0 -1
  305. package/scripts/lint-shell-command-projection-drift.cjs +1 -1
  306. package/scripts/lint-skill-deps.cjs +1 -1
  307. package/scripts/lint-test-file-count.allowlist.json +129 -32
  308. package/scripts/lint-test-file-count.cjs +85 -30
  309. package/scripts/mutation-matrix.cjs +219 -0
  310. package/scripts/prompt-injection-scan.sh +5 -1
  311. package/scripts/release-notes/format-github-release-notes.cjs +256 -0
  312. package/scripts/release-tarball-smoke.cjs +9 -9
  313. package/scripts/run-tests.cjs +11 -3
  314. package/scripts/strip-prose-atrefs.cjs +2 -2
  315. package/scripts/sync-runtime-launcher.cjs +2 -2
  316. package/scripts/verify-npm-publish.cjs +252 -0
  317. package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
  318. package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
  319. package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
  320. package/get-shit-done/bin/lib/artifacts.cjs +0 -53
  321. package/get-shit-done/bin/lib/audit.cjs +0 -755
  322. package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
  323. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
  324. package/get-shit-done/bin/lib/clock.cjs +0 -96
  325. package/get-shit-done/bin/lib/clusters.cjs +0 -135
  326. package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
  327. package/get-shit-done/bin/lib/command-aliases.cjs +0 -831
  328. package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
  329. package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
  330. package/get-shit-done/bin/lib/commands.cjs +0 -1292
  331. package/get-shit-done/bin/lib/config-schema.cjs +0 -31
  332. package/get-shit-done/bin/lib/config.cjs +0 -728
  333. package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
  334. package/get-shit-done/bin/lib/core.cjs +0 -2513
  335. package/get-shit-done/bin/lib/docs.cjs +0 -270
  336. package/get-shit-done/bin/lib/drift.cjs +0 -388
  337. package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
  338. package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
  339. package/get-shit-done/bin/lib/gap-checker.cjs +0 -254
  340. package/get-shit-done/bin/lib/graphify.cjs +0 -592
  341. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
  342. package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
  343. package/get-shit-done/bin/lib/init.cjs +0 -2112
  344. package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
  345. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
  346. package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -355
  347. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
  348. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
  349. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
  350. package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
  351. package/get-shit-done/bin/lib/intel.cjs +0 -708
  352. package/get-shit-done/bin/lib/learnings.cjs +0 -421
  353. package/get-shit-done/bin/lib/milestone.cjs +0 -372
  354. package/get-shit-done/bin/lib/model-catalog.cjs +0 -229
  355. package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
  356. package/get-shit-done/bin/lib/observability/event.cjs +0 -82
  357. package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
  358. package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
  359. package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -79
  360. package/get-shit-done/bin/lib/phase.cjs +0 -1607
  361. package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
  362. package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
  363. package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
  364. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  365. package/get-shit-done/bin/lib/project-root.cjs +0 -112
  366. package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
  367. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -126
  368. package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -162
  369. package/get-shit-done/bin/lib/roadmap-upgrade.cjs +0 -569
  370. package/get-shit-done/bin/lib/roadmap.cjs +0 -651
  371. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
  372. package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
  373. package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
  374. package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
  375. package/get-shit-done/bin/lib/secrets.cjs +0 -32
  376. package/get-shit-done/bin/lib/security.cjs +0 -600
  377. package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -535
  378. package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
  379. package/get-shit-done/bin/lib/state.cjs +0 -2073
  380. package/get-shit-done/bin/lib/surface.cjs +0 -470
  381. package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
  382. package/get-shit-done/bin/lib/template.cjs +0 -228
  383. package/get-shit-done/bin/lib/uat.cjs +0 -289
  384. package/get-shit-done/bin/lib/ui-safety-gate.cjs +0 -111
  385. package/get-shit-done/bin/lib/update-context.cjs +0 -209
  386. package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
  387. package/get-shit-done/bin/lib/validate.cjs +0 -118
  388. package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
  389. package/get-shit-done/bin/lib/verify.cjs +0 -1614
  390. package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
  391. package/get-shit-done/bin/lib/workstream.cjs +0 -389
  392. package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
  393. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
  394. package/scripts/lint-no-source-grep-extras.cjs +0 -81
  395. package/scripts/lint-no-source-grep.cjs +0 -174
  396. /package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +0 -0
  397. /package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +0 -0
  398. /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
  399. /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
  400. /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
  401. /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
  402. /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
  403. /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
  404. /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
  405. /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
  406. /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
  407. /package/{get-shit-done → gsd-core}/references/checkpoints.md +0 -0
  408. /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
  409. /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
  410. /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
  411. /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
  412. /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
  413. /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
  414. /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
  415. /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
  416. /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
  417. /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
  418. /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
  419. /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
  420. /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
  421. /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
  422. /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
  423. /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
  424. /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
  425. /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
  426. /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
  427. /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
  428. /package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +0 -0
  429. /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
  430. /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
  431. /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
  432. /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
  433. /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
  434. /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
  435. /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
  436. /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
  437. /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
  438. /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
  439. /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
  440. /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
  441. /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
  442. /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
  443. /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
  444. /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
  445. /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
  446. /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
  447. /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
  448. /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
  449. /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
  450. /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
  451. /package/{get-shit-done → gsd-core}/references/ui-brand.md +0 -0
  452. /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
  453. /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
  454. /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
  455. /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
  456. /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
  457. /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
  458. /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
  459. /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
  460. /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
  461. /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
  462. /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
  463. /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
  464. /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
  465. /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
  466. /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
  467. /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
  468. /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
  469. /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
  470. /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
  471. /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
  472. /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
  473. /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
  474. /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
  475. /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
  476. /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
  477. /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
  478. /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
  479. /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
  480. /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
  481. /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
  482. /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
  483. /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
  484. /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
  485. /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
  486. /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
  487. /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
  488. /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
  489. /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
  490. /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
  491. /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
  492. /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
  493. /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
  494. /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
  495. /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
  496. /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
  497. /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
  498. /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
  499. /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
  500. /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
  501. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
  502. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
  503. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
  504. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
  505. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
  506. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
  507. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
  508. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
  509. /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
  510. /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
  511. /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
  512. /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
  513. /package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +0 -0
  514. /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
  515. /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
  516. /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
  517. /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
  518. /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
  519. /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
  520. /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
  521. /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;