@opengsd/gsd-core 1.3.0-rc.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +823 -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
@@ -1,535 +0,0 @@
1
- 'use strict';
2
-
3
- const path = require('path');
4
- const fs = require('fs');
5
- // Use non-destructured access so test-time mock.method(childProcess, 'spawnSync')
6
- // can intercept calls from this seam — destructured imports capture references
7
- // at load time and become un-mockable.
8
- const childProcess = require('child_process');
9
-
10
- /**
11
- * Shell Command Projection Module
12
- *
13
- * Tracer-bullet seam for runtime-aware projection of serialized command text
14
- * that GSD writes into runtime config or prints for copy/paste. This module
15
- * does NOT execute commands; it only renders command text for external shells
16
- * and runtimes.
17
- */
18
-
19
- /**
20
- * Return true when a managed hook command must be prefixed with PowerShell's
21
- * call operator so a quoted executable token is invokable by the target
22
- * runtime/shell combination.
23
- *
24
- * Current evidence-backed policy:
25
- * - Gemini on Windows requires `& ` for quoted node/bash runners.
26
- * - Claude Code on Windows does NOT: its hook commands execute under bash/Git
27
- * Bash and `& ` breaks there (#3413).
28
- *
29
- * Keep the policy conservative until another runtime has a verified need.
30
- */
31
- function hookCommandNeedsPowerShellCallOperator(opts = {}) {
32
- const platform = opts.platform || process.platform;
33
- const runtime = opts.runtime || 'generic';
34
- return platform === 'win32' && runtime === 'gemini';
35
- }
36
-
37
- /**
38
- * Project a fully-assembled hook command string for the target runtime.
39
- */
40
- function formatHookCommandForRuntime(command, opts = {}) {
41
- return hookCommandNeedsPowerShellCallOperator(opts) ? `& ${command}` : command;
42
- }
43
-
44
- // #166/#580: Claude Code on Windows executes hook command strings inside Git
45
- // Bash. A `.sh` hook wrapped with an explicit bash.exe path makes bash try to
46
- // exec bash itself ("C:/.../bash.exe: cannot execute binary file"). Both install
47
- // paths — global (buildHookCommand) and local (buildLocalShellHookCommand) — must
48
- // drop the bash runner in this case and emit only the anchored script path.
49
- // Centralized here so the two paths cannot silently drift apart again: the local
50
- // path missed this guard and reintroduced the #166/#377 failure (#580).
51
- function shellHookOmitsBashRunner({ platform = process.platform, runtime = 'generic', isShellHook = false } = {}) {
52
- return platform === 'win32' && runtime === 'claude' && isShellHook;
53
- }
54
-
55
- // Builds the command string for a local-install managed `.sh` hook. Mirrors the
56
- // global buildHookCommand path but uses the $CLAUDE_PROJECT_DIR-anchored prefix
57
- // instead of an absolute configDir. On Claude/Windows the bash runner is dropped
58
- // (see shellHookOmitsBashRunner) and the anchored script path is emitted alone —
59
- // matching the global path. Elsewhere the resolved bash runner is required; a
60
- // null runner yields null so callers skip registration instead of emitting a
61
- // broken hook (#3393).
62
- function buildLocalShellHookCommand({ localPrefix, hookFile, bashRunner, runtime = 'generic', platform = process.platform }) {
63
- if (!localPrefix || !hookFile) return null;
64
- const scriptPath = `${localPrefix}/hooks/${hookFile}`;
65
- if (shellHookOmitsBashRunner({ platform, runtime, isShellHook: true })) {
66
- return formatHookCommandForRuntime(scriptPath, { platform, runtime });
67
- }
68
- if (!bashRunner) return null;
69
- return projectShellCommandText({
70
- runnerToken: bashRunner,
71
- argTokens: [scriptPath],
72
- runtime,
73
- platform,
74
- });
75
- }
76
-
77
- /**
78
- * Project a managed hook script path token for serialized shell commands.
79
- * Windows managed hook commands normalize to forward slashes so the same path
80
- * survives JSON/TOML/config surfaces consistently.
81
- */
82
- function formatManagedHookScriptToken(scriptPath, opts = {}) {
83
- const platform = opts.platform || process.platform;
84
- if (platform !== 'win32') return null;
85
- return JSON.stringify(scriptPath.replace(/\\/g, '/'));
86
- }
87
-
88
- function projectLocalHookPrefix({ runtime = 'claude', dirName }) {
89
- if (!dirName) return dirName;
90
- return (runtime === 'gemini' || runtime === 'antigravity')
91
- ? dirName
92
- : `"$CLAUDE_PROJECT_DIR"/${dirName}`;
93
- }
94
-
95
- function projectPortableHookBaseDir({ configDir, homeDir }) {
96
- const normalizedConfigDir = String(configDir || '').replace(/\\/g, '/');
97
- const normalizedHome = String(homeDir || '').replace(/\\/g, '/');
98
- if (!normalizedConfigDir || !normalizedHome) return normalizedConfigDir;
99
- return normalizedConfigDir.startsWith(normalizedHome)
100
- ? '$HOME' + normalizedConfigDir.slice(normalizedHome.length)
101
- : normalizedConfigDir;
102
- }
103
-
104
- function projectShellCommandText({
105
- runnerToken,
106
- argTokens = [],
107
- runtime = 'generic',
108
- platform = process.platform,
109
- }) {
110
- if (!runnerToken) return null;
111
- const parts = [runnerToken, ...argTokens.filter(Boolean)];
112
- return formatHookCommandForRuntime(parts.join(' '), { platform, runtime });
113
- }
114
-
115
- function projectManagedHookCommand({ absoluteRunner, scriptPath, runtime = 'generic', platform = process.platform }) {
116
- if (!absoluteRunner || !scriptPath) return null;
117
- const normalizedScriptPath = platform === 'win32' ? scriptPath.replace(/\\/g, '/') : scriptPath;
118
- return projectShellCommandText({
119
- runnerToken: absoluteRunner,
120
- argTokens: [JSON.stringify(normalizedScriptPath)],
121
- runtime,
122
- platform,
123
- });
124
- }
125
-
126
- const MANAGED_HOOK_BASENAMES_BY_SURFACE = {
127
- 'settings-json': new Set([
128
- 'gsd-check-update.js',
129
- 'gsd-statusline.js',
130
- 'gsd-context-monitor.js',
131
- 'gsd-prompt-guard.js',
132
- 'gsd-read-guard.js',
133
- 'gsd-read-injection-scanner.js',
134
- 'gsd-update-banner.js',
135
- 'gsd-workflow-guard.js',
136
- ]),
137
- 'codex-toml': new Set([
138
- 'gsd-check-update.js',
139
- ]),
140
- };
141
-
142
- const MANAGED_HOOK_COMMAND_BASENAMES_BY_SURFACE = {
143
- 'settings-json': new Set([
144
- 'gsd-check-update.js',
145
- 'gsd-statusline.js',
146
- 'gsd-context-monitor.js',
147
- 'gsd-prompt-guard.js',
148
- 'gsd-read-guard.js',
149
- 'gsd-read-injection-scanner.js',
150
- 'gsd-update-banner.js',
151
- 'gsd-workflow-guard.js',
152
- 'gsd-session-state.sh',
153
- 'gsd-validate-commit.sh',
154
- 'gsd-phase-boundary.sh',
155
- ]),
156
- 'codex-toml': new Set([
157
- 'gsd-check-update.js',
158
- ]),
159
- 'codex-hooks-json': new Set([
160
- 'gsd-check-update.js',
161
- // #3426: Windows .cmd shim for Codex hook — must be treated as managed so
162
- // reconcileCodexHooksJsonSessionStart can replace stale node-runner commands
163
- // with the .cmd shim on reinstall (and vice-versa on cross-platform moves).
164
- 'gsd-check-update.cmd',
165
- ]),
166
- };
167
-
168
- const LEGACY_MANAGED_HOOK_ALIASES_BY_SURFACE = {
169
- 'codex-toml': new Set([
170
- 'gsd-update-check.js',
171
- ]),
172
- 'codex-hooks-json': new Set([
173
- 'gsd-update-check.js',
174
- ]),
175
- };
176
-
177
- function managedHookSurfaceSet(surface = 'settings-json') {
178
- return MANAGED_HOOK_BASENAMES_BY_SURFACE[surface] || MANAGED_HOOK_BASENAMES_BY_SURFACE['settings-json'];
179
- }
180
-
181
- function isManagedHookBasename(scriptPathOrBasename, opts = {}) {
182
- if (!scriptPathOrBasename) return false;
183
- const surface = opts.surface || 'settings-json';
184
- const basename = String(scriptPathOrBasename).split(/[\\/]/).pop() || '';
185
- return managedHookSurfaceSet(surface).has(basename);
186
- }
187
-
188
- function managedHookCommandSurfaceSet(surface = 'settings-json', includeLegacyAliases = false) {
189
- const base = MANAGED_HOOK_COMMAND_BASENAMES_BY_SURFACE[surface]
190
- || MANAGED_HOOK_COMMAND_BASENAMES_BY_SURFACE['settings-json'];
191
- if (!includeLegacyAliases) return base;
192
- const aliases = LEGACY_MANAGED_HOOK_ALIASES_BY_SURFACE[surface];
193
- if (!aliases || aliases.size === 0) return base;
194
- return new Set([...base, ...aliases]);
195
- }
196
-
197
- function isManagedHookCommand(commandText, opts = {}) {
198
- if (typeof commandText !== 'string') return false;
199
- const surface = opts.surface || 'settings-json';
200
- const includeLegacyAliases = opts.includeLegacyAliases === true;
201
- const managedBasenames = managedHookCommandSurfaceSet(surface, includeLegacyAliases);
202
- if (!managedBasenames || managedBasenames.size === 0) return false;
203
- const normalizedCommand = commandText.replace(/\\/g, '/');
204
-
205
- if (typeof opts.configDir === 'string' && opts.configDir.length > 0) {
206
- const normalizedHooksDir = `${path.join(opts.configDir, 'hooks').replace(/\\/g, '/')}/`;
207
- if (!normalizedCommand.includes(normalizedHooksDir)) return false;
208
- }
209
-
210
- for (const basename of managedBasenames) {
211
- const escapedBasename = basename.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
212
- const pattern = new RegExp(`(^|[\\\\/\\s"'` + '`' + `])${escapedBasename}(?=$|[\\s"'` + '`' + `])`);
213
- if (pattern.test(normalizedCommand)) return true;
214
- }
215
- return false;
216
- }
217
-
218
- /**
219
- * Projection helper for legacy settings.json hook rewrites.
220
- *
221
- * Non-Windows keeps the original script token shape when provided (single
222
- * quote / bareword / quoted), while Windows normalizes to double-quoted
223
- * forward-slash path tokens for stable cross-shell behavior.
224
- */
225
- function projectLegacySettingsHookCommand({
226
- absoluteRunner,
227
- scriptPath,
228
- scriptToken,
229
- runtime = 'generic',
230
- platform = process.platform,
231
- }) {
232
- if (!absoluteRunner || !scriptPath) return null;
233
- const normalizedScriptPath = platform === 'win32' ? scriptPath.replace(/\\/g, '/') : scriptPath;
234
- const commandScriptToken = platform === 'win32'
235
- ? JSON.stringify(normalizedScriptPath)
236
- : (scriptToken || JSON.stringify(normalizedScriptPath));
237
- return projectShellCommandText({
238
- runnerToken: absoluteRunner,
239
- argTokens: [commandScriptToken],
240
- runtime,
241
- platform,
242
- });
243
- }
244
-
245
- function escapeTomlDoubleQuotedString(value) {
246
- return String(value).replace(/\\/g, '\\\\').replace(/"/g, '\\"');
247
- }
248
-
249
- function projectCodexHookTomlCommand({ absoluteRunner, scriptPath, platform = process.platform }) {
250
- const command = projectManagedHookCommand({
251
- absoluteRunner,
252
- scriptPath,
253
- runtime: 'codex',
254
- platform,
255
- });
256
- return command === null ? null : escapeTomlDoubleQuotedString(command);
257
- }
258
-
259
- function escapePowerShellSingleQuoted(value) {
260
- return String(value).replace(/'/g, "''");
261
- }
262
-
263
- function escapePosixDoubleQuoted(value) {
264
- return String(value).replace(/[\\$"`]/g, '\\$&');
265
- }
266
- function escapeSingleQuotedShellLiteral(value) {
267
- return String(value).replace(/'/g, "'\\''");
268
- }
269
- function renderShellActionLines(shellActions = []) {
270
- return shellActions.map((action) => {
271
- if (!action || !action.command) return '';
272
- return action.label ? `${action.label}: ${action.command}` : action.command;
273
- }).filter(Boolean);
274
- }
275
-
276
- function projectPathActionProjection({
277
- mode = 'repair',
278
- targetDir,
279
- platform = process.platform,
280
- }) {
281
- if (!targetDir) return { shellActions: [], actionLines: [] };
282
-
283
- const isWin32 = platform === 'win32';
284
-
285
- let shellActions;
286
- if (isWin32) {
287
- const psTargetDir = escapePowerShellSingleQuoted(targetDir);
288
- const bashTargetDir = escapeSingleQuotedShellLiteral(String(targetDir).replace(/\\/g, '/'));
289
- shellActions = [
290
- {
291
- label: 'PowerShell',
292
- shell: 'powershell',
293
- command: `[Environment]::SetEnvironmentVariable('PATH', '${psTargetDir};' + [Environment]::GetEnvironmentVariable('PATH', 'User'), 'User')`,
294
- },
295
- {
296
- label: 'cmd.exe',
297
- shell: 'cmd',
298
- command: `powershell -Command "[Environment]::SetEnvironmentVariable('PATH', '${psTargetDir};' + [Environment]::GetEnvironmentVariable('PATH', 'User'), 'User')"`,
299
- },
300
- {
301
- label: 'Git Bash',
302
- shell: 'bash',
303
- command: `echo 'export PATH="${bashTargetDir}:$PATH"' >> ~/.bashrc`,
304
- },
305
- ];
306
- } else if (mode === 'persist') {
307
- const bashTargetDir = escapeSingleQuotedShellLiteral(String(targetDir));
308
- shellActions = [
309
- {
310
- label: 'zsh',
311
- shell: 'zsh',
312
- command: `echo 'export PATH="${bashTargetDir}:$PATH"' >> ~/.zshrc`,
313
- },
314
- {
315
- label: 'bash',
316
- shell: 'bash',
317
- command: `echo 'export PATH="${bashTargetDir}:$PATH"' >> ~/.bashrc`,
318
- },
319
- ];
320
- } else {
321
- const posixTargetDir = escapePosixDoubleQuoted(targetDir);
322
- shellActions = [
323
- {
324
- label: null,
325
- shell: 'posix',
326
- command: `export PATH="${posixTargetDir}:$PATH"`,
327
- },
328
- ];
329
- }
330
-
331
- return {
332
- shellActions,
333
- actionLines: renderShellActionLines(shellActions),
334
- };
335
- }
336
-
337
- function projectPersistentPathExportActions({ targetDir, platform = process.platform }) {
338
- const projected = projectPathActionProjection({
339
- mode: 'persist',
340
- targetDir,
341
- platform,
342
- });
343
- return { shellActions: projected.shellActions };
344
- }
345
-
346
-
347
- // ─── Subprocess dispatch ──────────────────────────────────────────────────────
348
-
349
- function _spawnResult(result, program) {
350
- if (result.error && result.error.code === 'ENOENT') {
351
- return { exitCode: 127, stdout: '', stderr: `${program}: not found`, signal: null, error: result.error };
352
- }
353
- return {
354
- exitCode: result.status ?? 1,
355
- stdout: (result.stdout ?? '').toString().trim(),
356
- stderr: (result.stderr ?? '').toString().trim(),
357
- signal: result.signal ?? null,
358
- error: result.error ?? null,
359
- };
360
- }
361
-
362
- function execGit(args, opts = {}) {
363
- // Non-interactive defaults: a hung credential prompt or terminal-input
364
- // probe must surface as a timeout, not block the tool forever. Callers
365
- // can override via opts.env.
366
- const env = {
367
- ...process.env,
368
- GIT_TERMINAL_PROMPT: '0',
369
- GCM_INTERACTIVE: 'never',
370
- ...(opts.env || {}),
371
- };
372
- const result = childProcess.spawnSync('git', args, {
373
- cwd: opts.cwd,
374
- env,
375
- encoding: 'utf-8',
376
- stdio: 'pipe',
377
- timeout: opts.timeout ?? 10_000,
378
- });
379
- return _spawnResult(result, 'git');
380
- }
381
-
382
- function execNpm(args, opts = {}) {
383
- const result = childProcess.spawnSync('npm', args, {
384
- cwd: opts.cwd,
385
- shell: process.platform === 'win32',
386
- encoding: 'utf-8',
387
- stdio: ['ignore', 'pipe', 'pipe'],
388
- timeout: opts.timeout ?? 15_000,
389
- });
390
- return _spawnResult(result, 'npm');
391
- }
392
-
393
- function execTool(program, args, opts = {}) {
394
- const result = childProcess.spawnSync(program, args, {
395
- cwd: opts.cwd,
396
- env: opts.env ? { ...process.env, ...opts.env } : undefined,
397
- encoding: 'utf-8',
398
- stdio: 'pipe',
399
- timeout: opts.timeout ?? 30_000,
400
- });
401
- return _spawnResult(result, program);
402
- }
403
-
404
- function probeTty(opts = {}) {
405
- const platform = opts.platform ?? process.platform;
406
- if (platform === 'win32') return null;
407
- try {
408
- const ttyPath = childProcess.execFileSync('tty', [], {
409
- encoding: 'utf-8',
410
- stdio: ['inherit', 'pipe', 'ignore'],
411
- }).trim();
412
- if (!ttyPath || ttyPath === 'not a tty') return null;
413
- return ttyPath;
414
- } catch {
415
- return null;
416
- }
417
- }
418
-
419
- // ─── Platform file I/O ────────────────────────────────────────────────────────
420
-
421
- function _normalizeMd(content) {
422
- if (!content || typeof content !== 'string') return content;
423
- let text = content.replace(/\r\n/g, '\n');
424
- const lines = text.split('\n');
425
- const result = [];
426
- const fenceRegex = /^```/;
427
- const insideFence = new Array(lines.length);
428
- let fenceOpen = false;
429
- for (let i = 0; i < lines.length; i++) {
430
- if (fenceRegex.test(lines[i].trimEnd())) {
431
- if (fenceOpen) {
432
- insideFence[i] = false;
433
- fenceOpen = false;
434
- } else {
435
- insideFence[i] = false;
436
- fenceOpen = true;
437
- }
438
- } else {
439
- insideFence[i] = fenceOpen;
440
- }
441
- }
442
- for (let i = 0; i < lines.length; i++) {
443
- const line = lines[i];
444
- const prev = i > 0 ? lines[i - 1] : '';
445
- const prevTrimmed = prev.trimEnd();
446
- const trimmed = line.trimEnd();
447
- const isFenceLine = fenceRegex.test(trimmed);
448
- if (/^#{1,6}\s/.test(trimmed) && i > 0 && prevTrimmed !== '' && prevTrimmed !== '---') result.push('');
449
- if (isFenceLine && i > 0 && prevTrimmed !== '' && !insideFence[i] && (i === 0 || !insideFence[i - 1] || isFenceLine)) {
450
- if (i === 0 || !insideFence[i - 1]) result.push('');
451
- }
452
- if (/^(\s*[-*+]\s|\s*\d+\.\s)/.test(line) && i > 0 && prevTrimmed !== '' && !/^(\s*[-*+]\s|\s*\d+\.\s)/.test(prev) && prevTrimmed !== '---') result.push('');
453
- result.push(line);
454
- if (/^#{1,6}\s/.test(trimmed) && i < lines.length - 1 && (lines[i + 1] ?? '').trimEnd() !== '') result.push('');
455
- if (/^```\s*$/.test(trimmed) && i > 0 && insideFence[i - 1] && i < lines.length - 1 && (lines[i + 1] ?? '').trimEnd() !== '') result.push('');
456
- if (/^(\s*[-*+]\s|\s*\d+\.\s)/.test(line) && i < lines.length - 1) {
457
- const next = lines[i + 1];
458
- if (next !== undefined && next.trimEnd() !== '' && !/^(\s*[-*+]\s|\s*\d+\.\s)/.test(next) && !/^\s/.test(next)) result.push('');
459
- }
460
- }
461
- text = result.join('\n');
462
- text = text.replace(/\n{3,}/g, '\n\n');
463
- text = text.replace(/\n*$/, '\n');
464
- return text;
465
- }
466
-
467
- function normalizeContent(filePath, content, opts = {}) {
468
- const encoding = opts.encoding ?? 'utf-8';
469
- const isMd = path.extname(filePath).toLowerCase() === '.md';
470
- let normalized;
471
- if (isMd) {
472
- normalized = _normalizeMd(content);
473
- } else {
474
- normalized = (content ?? '').replace(/\r\n/g, '\n').replace(/\n*$/, '\n');
475
- }
476
- return { content: normalized, encoding };
477
- }
478
-
479
- function platformWriteSync(filePath, content, opts = {}) {
480
- const { content: normalized, encoding } = normalizeContent(filePath, content, opts);
481
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
482
- const tmpPath = filePath + '.tmp.' + process.pid;
483
- try {
484
- fs.writeFileSync(tmpPath, normalized, encoding);
485
- fs.renameSync(tmpPath, filePath);
486
- } catch {
487
- try { fs.unlinkSync(tmpPath); } catch { /* already gone */ }
488
- fs.writeFileSync(filePath, normalized, encoding);
489
- }
490
- }
491
-
492
- function platformReadSync(filePath, opts = {}) {
493
- const encoding = opts.encoding ?? 'utf-8';
494
- try {
495
- return fs.readFileSync(filePath, encoding);
496
- } catch (err) {
497
- if (err.code === 'ENOENT') {
498
- if (opts.required) throw err;
499
- return null;
500
- }
501
- throw err;
502
- }
503
- }
504
-
505
- function platformEnsureDir(dirPath) {
506
- fs.mkdirSync(dirPath, { recursive: true });
507
- }
508
-
509
- module.exports = {
510
- hookCommandNeedsPowerShellCallOperator,
511
- formatHookCommandForRuntime,
512
- shellHookOmitsBashRunner,
513
- buildLocalShellHookCommand,
514
- formatManagedHookScriptToken,
515
- projectLocalHookPrefix,
516
- projectPortableHookBaseDir,
517
- projectShellCommandText,
518
- projectManagedHookCommand,
519
- isManagedHookBasename,
520
- isManagedHookCommand,
521
- projectLegacySettingsHookCommand,
522
- escapeTomlDoubleQuotedString,
523
- projectCodexHookTomlCommand,
524
- projectPathActionProjection,
525
- renderShellActionLines,
526
- projectPersistentPathExportActions,
527
- execGit,
528
- execNpm,
529
- execTool,
530
- probeTty,
531
- normalizeContent,
532
- platformWriteSync,
533
- platformReadSync,
534
- platformEnsureDir,
535
- };