@opengsd/gsd-core 1.2.0-rc.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 (503) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja-JP.md +870 -0
  3. package/README.ko-KR.md +861 -0
  4. package/README.md +301 -0
  5. package/README.pt-BR.md +492 -0
  6. package/README.zh-CN.md +842 -0
  7. package/agents/gsd-advisor-researcher.md +127 -0
  8. package/agents/gsd-ai-researcher.md +133 -0
  9. package/agents/gsd-assumptions-analyzer.md +105 -0
  10. package/agents/gsd-code-fixer.md +668 -0
  11. package/agents/gsd-code-reviewer.md +387 -0
  12. package/agents/gsd-codebase-mapper.md +853 -0
  13. package/agents/gsd-debug-session-manager.md +314 -0
  14. package/agents/gsd-debugger.md +1452 -0
  15. package/agents/gsd-doc-classifier.md +168 -0
  16. package/agents/gsd-doc-synthesizer.md +204 -0
  17. package/agents/gsd-doc-verifier.md +217 -0
  18. package/agents/gsd-doc-writer.md +615 -0
  19. package/agents/gsd-domain-researcher.md +153 -0
  20. package/agents/gsd-eval-auditor.md +191 -0
  21. package/agents/gsd-eval-planner.md +154 -0
  22. package/agents/gsd-executor.md +772 -0
  23. package/agents/gsd-framework-selector.md +160 -0
  24. package/agents/gsd-integration-checker.md +470 -0
  25. package/agents/gsd-intel-updater.md +342 -0
  26. package/agents/gsd-nyquist-auditor.md +203 -0
  27. package/agents/gsd-pattern-mapper.md +335 -0
  28. package/agents/gsd-phase-researcher.md +928 -0
  29. package/agents/gsd-plan-checker.md +978 -0
  30. package/agents/gsd-planner.md +1218 -0
  31. package/agents/gsd-project-researcher.md +677 -0
  32. package/agents/gsd-research-synthesizer.md +255 -0
  33. package/agents/gsd-roadmapper.md +688 -0
  34. package/agents/gsd-security-auditor.md +155 -0
  35. package/agents/gsd-ui-auditor.md +495 -0
  36. package/agents/gsd-ui-checker.md +309 -0
  37. package/agents/gsd-ui-researcher.md +380 -0
  38. package/agents/gsd-user-profiler.md +171 -0
  39. package/agents/gsd-verifier.md +917 -0
  40. package/bin/install.js +10936 -0
  41. package/bin/lib/ui-safety-gate.cjs +107 -0
  42. package/commands/gsd/add-tests.md +42 -0
  43. package/commands/gsd/ai-integration-phase.md +37 -0
  44. package/commands/gsd/audit-fix.md +34 -0
  45. package/commands/gsd/audit-milestone.md +37 -0
  46. package/commands/gsd/audit-uat.md +24 -0
  47. package/commands/gsd/autonomous.md +46 -0
  48. package/commands/gsd/capture.md +62 -0
  49. package/commands/gsd/cleanup.md +24 -0
  50. package/commands/gsd/code-review.md +59 -0
  51. package/commands/gsd/complete-milestone.md +143 -0
  52. package/commands/gsd/config.md +56 -0
  53. package/commands/gsd/debug.md +52 -0
  54. package/commands/gsd/discuss-phase.md +76 -0
  55. package/commands/gsd/docs-update.md +49 -0
  56. package/commands/gsd/eval-review.md +33 -0
  57. package/commands/gsd/execute-phase.md +64 -0
  58. package/commands/gsd/explore.md +27 -0
  59. package/commands/gsd/extract-learnings.md +23 -0
  60. package/commands/gsd/fast.md +31 -0
  61. package/commands/gsd/forensics.md +57 -0
  62. package/commands/gsd/graphify.md +199 -0
  63. package/commands/gsd/health.md +31 -0
  64. package/commands/gsd/help.md +28 -0
  65. package/commands/gsd/import.md +41 -0
  66. package/commands/gsd/inbox.md +39 -0
  67. package/commands/gsd/ingest-docs.md +42 -0
  68. package/commands/gsd/manager.md +45 -0
  69. package/commands/gsd/map-codebase.md +83 -0
  70. package/commands/gsd/milestone-summary.md +51 -0
  71. package/commands/gsd/mvp-phase.md +45 -0
  72. package/commands/gsd/new-milestone.md +45 -0
  73. package/commands/gsd/new-project.md +47 -0
  74. package/commands/gsd/ns-context.md +23 -0
  75. package/commands/gsd/ns-ideate.md +24 -0
  76. package/commands/gsd/ns-manage.md +29 -0
  77. package/commands/gsd/ns-project.md +22 -0
  78. package/commands/gsd/ns-review.md +26 -0
  79. package/commands/gsd/ns-workflow.md +28 -0
  80. package/commands/gsd/pause-work.md +43 -0
  81. package/commands/gsd/phase.md +56 -0
  82. package/commands/gsd/plan-phase.md +62 -0
  83. package/commands/gsd/plan-review-convergence.md +59 -0
  84. package/commands/gsd/pr-branch.md +26 -0
  85. package/commands/gsd/profile-user.md +46 -0
  86. package/commands/gsd/progress.md +47 -0
  87. package/commands/gsd/quick.md +174 -0
  88. package/commands/gsd/resume-work.md +30 -0
  89. package/commands/gsd/review-backlog.md +63 -0
  90. package/commands/gsd/review.md +41 -0
  91. package/commands/gsd/secure-phase.md +36 -0
  92. package/commands/gsd/settings.md +29 -0
  93. package/commands/gsd/ship.md +24 -0
  94. package/commands/gsd/sketch.md +60 -0
  95. package/commands/gsd/spec-phase.md +63 -0
  96. package/commands/gsd/spike.md +57 -0
  97. package/commands/gsd/stats.md +19 -0
  98. package/commands/gsd/surface.md +155 -0
  99. package/commands/gsd/thread.md +24 -0
  100. package/commands/gsd/ui-phase.md +35 -0
  101. package/commands/gsd/ui-review.md +33 -0
  102. package/commands/gsd/ultraplan-phase.md +34 -0
  103. package/commands/gsd/undo.md +35 -0
  104. package/commands/gsd/update.md +48 -0
  105. package/commands/gsd/validate-phase.md +36 -0
  106. package/commands/gsd/verify-work.md +39 -0
  107. package/commands/gsd/workspace.md +52 -0
  108. package/commands/gsd/workstreams.md +70 -0
  109. package/get-shit-done/bin/check-latest-version.cjs +106 -0
  110. package/get-shit-done/bin/gsd-tools.cjs +1676 -0
  111. package/get-shit-done/bin/lib/active-workstream-store.cjs +302 -0
  112. package/get-shit-done/bin/lib/adr-parser.cjs +394 -0
  113. package/get-shit-done/bin/lib/agent-command-router.cjs +65 -0
  114. package/get-shit-done/bin/lib/artifacts.cjs +53 -0
  115. package/get-shit-done/bin/lib/audit.cjs +755 -0
  116. package/get-shit-done/bin/lib/check-command-router.cjs +333 -0
  117. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +118 -0
  118. package/get-shit-done/bin/lib/clock.cjs +96 -0
  119. package/get-shit-done/bin/lib/clusters.cjs +135 -0
  120. package/get-shit-done/bin/lib/code-review-flags.cjs +74 -0
  121. package/get-shit-done/bin/lib/command-aliases.cjs +815 -0
  122. package/get-shit-done/bin/lib/command-arg-projection.cjs +62 -0
  123. package/get-shit-done/bin/lib/command-routing-hub.cjs +388 -0
  124. package/get-shit-done/bin/lib/commands.cjs +1188 -0
  125. package/get-shit-done/bin/lib/config-schema.cjs +31 -0
  126. package/get-shit-done/bin/lib/config.cjs +728 -0
  127. package/get-shit-done/bin/lib/configuration.cjs +248 -0
  128. package/get-shit-done/bin/lib/context-utilization.cjs +47 -0
  129. package/get-shit-done/bin/lib/core.cjs +2121 -0
  130. package/get-shit-done/bin/lib/decisions.cjs +116 -0
  131. package/get-shit-done/bin/lib/docs.cjs +270 -0
  132. package/get-shit-done/bin/lib/drift.cjs +388 -0
  133. package/get-shit-done/bin/lib/fallow-runner.cjs +109 -0
  134. package/get-shit-done/bin/lib/frontmatter.cjs +389 -0
  135. package/get-shit-done/bin/lib/gap-checker.cjs +205 -0
  136. package/get-shit-done/bin/lib/graphify.cjs +592 -0
  137. package/get-shit-done/bin/lib/gsd2-import.cjs +514 -0
  138. package/get-shit-done/bin/lib/init-command-router.cjs +58 -0
  139. package/get-shit-done/bin/lib/init.cjs +2112 -0
  140. package/get-shit-done/bin/lib/install-profiles.cjs +603 -0
  141. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +117 -0
  142. package/get-shit-done/bin/lib/installer-migration-report.cjs +354 -0
  143. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
  144. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
  145. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
  146. package/get-shit-done/bin/lib/installer-migrations.cjs +778 -0
  147. package/get-shit-done/bin/lib/intel.cjs +708 -0
  148. package/get-shit-done/bin/lib/learnings.cjs +421 -0
  149. package/get-shit-done/bin/lib/milestone.cjs +314 -0
  150. package/get-shit-done/bin/lib/model-catalog.cjs +212 -0
  151. package/get-shit-done/bin/lib/model-profiles.cjs +31 -0
  152. package/get-shit-done/bin/lib/observability/event.cjs +82 -0
  153. package/get-shit-done/bin/lib/observability/logger.cjs +174 -0
  154. package/get-shit-done/bin/lib/observability/redaction.cjs +50 -0
  155. package/get-shit-done/bin/lib/package-identity.cjs +31 -0
  156. package/get-shit-done/bin/lib/phase-command-router.cjs +191 -0
  157. package/get-shit-done/bin/lib/phase-lifecycle.cjs +80 -0
  158. package/get-shit-done/bin/lib/phase.cjs +1607 -0
  159. package/get-shit-done/bin/lib/phases-command-router.cjs +39 -0
  160. package/get-shit-done/bin/lib/plan-scan.cjs +97 -0
  161. package/get-shit-done/bin/lib/planning-workspace.cjs +238 -0
  162. package/get-shit-done/bin/lib/profile-output.cjs +1141 -0
  163. package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
  164. package/get-shit-done/bin/lib/project-root.cjs +112 -0
  165. package/get-shit-done/bin/lib/prompt-budget.cjs +399 -0
  166. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +125 -0
  167. package/get-shit-done/bin/lib/roadmap-command-router.cjs +28 -0
  168. package/get-shit-done/bin/lib/roadmap.cjs +650 -0
  169. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +301 -0
  170. package/get-shit-done/bin/lib/runtime-homes.cjs +222 -0
  171. package/get-shit-done/bin/lib/runtime-name-policy.cjs +83 -0
  172. package/get-shit-done/bin/lib/runtime-slash.cjs +112 -0
  173. package/get-shit-done/bin/lib/schema-detect.cjs +165 -0
  174. package/get-shit-done/bin/lib/secrets.cjs +32 -0
  175. package/get-shit-done/bin/lib/security.cjs +600 -0
  176. package/get-shit-done/bin/lib/semver-compare.cjs +35 -0
  177. package/get-shit-done/bin/lib/shell-command-projection.cjs +500 -0
  178. package/get-shit-done/bin/lib/state-command-router.cjs +252 -0
  179. package/get-shit-done/bin/lib/state-document.cjs +263 -0
  180. package/get-shit-done/bin/lib/state.cjs +2038 -0
  181. package/get-shit-done/bin/lib/surface.cjs +470 -0
  182. package/get-shit-done/bin/lib/task-command-router.cjs +81 -0
  183. package/get-shit-done/bin/lib/template.cjs +228 -0
  184. package/get-shit-done/bin/lib/uat.cjs +289 -0
  185. package/get-shit-done/bin/lib/update-context.cjs +209 -0
  186. package/get-shit-done/bin/lib/validate-command-router.cjs +83 -0
  187. package/get-shit-done/bin/lib/validate.cjs +92 -0
  188. package/get-shit-done/bin/lib/verify-command-router.cjs +40 -0
  189. package/get-shit-done/bin/lib/verify.cjs +1511 -0
  190. package/get-shit-done/bin/lib/workstream-inventory-builder.cjs +74 -0
  191. package/get-shit-done/bin/lib/workstream-inventory.cjs +146 -0
  192. package/get-shit-done/bin/lib/workstream-name-policy.cjs +94 -0
  193. package/get-shit-done/bin/lib/workstream.cjs +389 -0
  194. package/get-shit-done/bin/lib/worktree-safety.cjs +985 -0
  195. package/get-shit-done/bin/shared/config-defaults.manifest.json +97 -0
  196. package/get-shit-done/bin/shared/config-schema.manifest.json +175 -0
  197. package/get-shit-done/bin/shared/model-catalog.json +122 -0
  198. package/get-shit-done/bin/shared/runtime-aliases.manifest.json +75 -0
  199. package/get-shit-done/bin/verify-reapply-patches.cjs +352 -0
  200. package/get-shit-done/contexts/dev.md +21 -0
  201. package/get-shit-done/contexts/research.md +22 -0
  202. package/get-shit-done/contexts/review.md +23 -0
  203. package/get-shit-done/references/agent-contracts.md +79 -0
  204. package/get-shit-done/references/ai-evals.md +156 -0
  205. package/get-shit-done/references/ai-frameworks.md +186 -0
  206. package/get-shit-done/references/artifact-types.md +131 -0
  207. package/get-shit-done/references/autonomous-smart-discuss.md +277 -0
  208. package/get-shit-done/references/checkpoints.md +814 -0
  209. package/get-shit-done/references/common-bug-patterns.md +114 -0
  210. package/get-shit-done/references/context-budget.md +85 -0
  211. package/get-shit-done/references/continuation-format.md +253 -0
  212. package/get-shit-done/references/debugger-philosophy.md +76 -0
  213. package/get-shit-done/references/decimal-phase-calculation.md +64 -0
  214. package/get-shit-done/references/doc-conflict-engine.md +91 -0
  215. package/get-shit-done/references/domain-probes.md +125 -0
  216. package/get-shit-done/references/execute-mvp-tdd.md +81 -0
  217. package/get-shit-done/references/executor-examples.md +110 -0
  218. package/get-shit-done/references/few-shot-examples/plan-checker.md +73 -0
  219. package/get-shit-done/references/few-shot-examples/verifier.md +109 -0
  220. package/get-shit-done/references/gate-prompts.md +100 -0
  221. package/get-shit-done/references/gates.md +70 -0
  222. package/get-shit-done/references/git-integration.md +298 -0
  223. package/get-shit-done/references/git-planning-commit.md +40 -0
  224. package/get-shit-done/references/ios-scaffold.md +123 -0
  225. package/get-shit-done/references/mandatory-initial-read.md +2 -0
  226. package/get-shit-done/references/model-profile-resolution.md +38 -0
  227. package/get-shit-done/references/model-profiles.md +245 -0
  228. package/get-shit-done/references/mvp-concepts.md +49 -0
  229. package/get-shit-done/references/phase-argument-parsing.md +61 -0
  230. package/get-shit-done/references/planner-antipatterns.md +89 -0
  231. package/get-shit-done/references/planner-chunked.md +49 -0
  232. package/get-shit-done/references/planner-gap-closure.md +62 -0
  233. package/get-shit-done/references/planner-graphify-auto-update.md +67 -0
  234. package/get-shit-done/references/planner-human-verify-mode.md +57 -0
  235. package/get-shit-done/references/planner-interface-context.md +62 -0
  236. package/get-shit-done/references/planner-mvp-mode.md +53 -0
  237. package/get-shit-done/references/planner-reviews.md +39 -0
  238. package/get-shit-done/references/planner-revision.md +87 -0
  239. package/get-shit-done/references/planner-source-audit.md +73 -0
  240. package/get-shit-done/references/planning-config.md +471 -0
  241. package/get-shit-done/references/project-skills-discovery.md +19 -0
  242. package/get-shit-done/references/questioning.md +162 -0
  243. package/get-shit-done/references/revision-loop.md +97 -0
  244. package/get-shit-done/references/scout-codebase.md +51 -0
  245. package/get-shit-done/references/skeleton-template.md +48 -0
  246. package/get-shit-done/references/sketch-interactivity.md +41 -0
  247. package/get-shit-done/references/sketch-theme-system.md +94 -0
  248. package/get-shit-done/references/sketch-tooling.md +45 -0
  249. package/get-shit-done/references/sketch-variant-patterns.md +81 -0
  250. package/get-shit-done/references/spidr-splitting.md +69 -0
  251. package/get-shit-done/references/tdd.md +330 -0
  252. package/get-shit-done/references/thinking-models-debug.md +44 -0
  253. package/get-shit-done/references/thinking-models-execution.md +50 -0
  254. package/get-shit-done/references/thinking-models-planning.md +62 -0
  255. package/get-shit-done/references/thinking-models-research.md +50 -0
  256. package/get-shit-done/references/thinking-models-verification.md +55 -0
  257. package/get-shit-done/references/thinking-partner.md +96 -0
  258. package/get-shit-done/references/ui-brand.md +160 -0
  259. package/get-shit-done/references/universal-anti-patterns.md +63 -0
  260. package/get-shit-done/references/user-profiling.md +681 -0
  261. package/get-shit-done/references/user-story-template.md +58 -0
  262. package/get-shit-done/references/verification-overrides.md +227 -0
  263. package/get-shit-done/references/verification-patterns.md +612 -0
  264. package/get-shit-done/references/verify-mvp-mode.md +85 -0
  265. package/get-shit-done/references/workstream-flag.md +111 -0
  266. package/get-shit-done/references/worktree-path-safety.md +89 -0
  267. package/get-shit-done/templates/AI-SPEC.md +246 -0
  268. package/get-shit-done/templates/DEBUG.md +169 -0
  269. package/get-shit-done/templates/README.md +77 -0
  270. package/get-shit-done/templates/SECURITY.md +61 -0
  271. package/get-shit-done/templates/UAT.md +265 -0
  272. package/get-shit-done/templates/UI-SPEC.md +100 -0
  273. package/get-shit-done/templates/VALIDATION.md +76 -0
  274. package/get-shit-done/templates/claude-md.md +145 -0
  275. package/get-shit-done/templates/codebase/architecture.md +255 -0
  276. package/get-shit-done/templates/codebase/concerns.md +310 -0
  277. package/get-shit-done/templates/codebase/conventions.md +307 -0
  278. package/get-shit-done/templates/codebase/integrations.md +280 -0
  279. package/get-shit-done/templates/codebase/stack.md +186 -0
  280. package/get-shit-done/templates/codebase/structure.md +285 -0
  281. package/get-shit-done/templates/codebase/testing.md +480 -0
  282. package/get-shit-done/templates/config.json +62 -0
  283. package/get-shit-done/templates/context.md +352 -0
  284. package/get-shit-done/templates/continue-here.md +78 -0
  285. package/get-shit-done/templates/copilot-instructions.md +7 -0
  286. package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
  287. package/get-shit-done/templates/dev-preferences.md +21 -0
  288. package/get-shit-done/templates/discovery.md +146 -0
  289. package/get-shit-done/templates/discussion-log.md +63 -0
  290. package/get-shit-done/templates/milestone-archive.md +123 -0
  291. package/get-shit-done/templates/milestone.md +115 -0
  292. package/get-shit-done/templates/phase-prompt.md +610 -0
  293. package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
  294. package/get-shit-done/templates/project.md +186 -0
  295. package/get-shit-done/templates/requirements.md +231 -0
  296. package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
  297. package/get-shit-done/templates/research-project/FEATURES.md +147 -0
  298. package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
  299. package/get-shit-done/templates/research-project/STACK.md +120 -0
  300. package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
  301. package/get-shit-done/templates/research.md +592 -0
  302. package/get-shit-done/templates/retrospective.md +54 -0
  303. package/get-shit-done/templates/roadmap.md +202 -0
  304. package/get-shit-done/templates/spec.md +307 -0
  305. package/get-shit-done/templates/state.md +195 -0
  306. package/get-shit-done/templates/summary-complex.md +59 -0
  307. package/get-shit-done/templates/summary-minimal.md +41 -0
  308. package/get-shit-done/templates/summary-standard.md +48 -0
  309. package/get-shit-done/templates/summary.md +248 -0
  310. package/get-shit-done/templates/user-profile.md +146 -0
  311. package/get-shit-done/templates/user-setup.md +311 -0
  312. package/get-shit-done/templates/verification-report.md +322 -0
  313. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +1 -0
  314. package/get-shit-done/workflows/add-backlog.md +91 -0
  315. package/get-shit-done/workflows/add-phase.md +113 -0
  316. package/get-shit-done/workflows/add-tests.md +355 -0
  317. package/get-shit-done/workflows/add-todo.md +161 -0
  318. package/get-shit-done/workflows/ai-integration-phase.md +295 -0
  319. package/get-shit-done/workflows/analyze-dependencies.md +96 -0
  320. package/get-shit-done/workflows/audit-fix.md +178 -0
  321. package/get-shit-done/workflows/audit-milestone.md +358 -0
  322. package/get-shit-done/workflows/audit-uat.md +110 -0
  323. package/get-shit-done/workflows/autonomous.md +795 -0
  324. package/get-shit-done/workflows/check-todos.md +180 -0
  325. package/get-shit-done/workflows/cleanup.md +155 -0
  326. package/get-shit-done/workflows/code-review-fix.md +502 -0
  327. package/get-shit-done/workflows/code-review.md +656 -0
  328. package/get-shit-done/workflows/complete-milestone.md +855 -0
  329. package/get-shit-done/workflows/debug.md +232 -0
  330. package/get-shit-done/workflows/diagnose-issues.md +241 -0
  331. package/get-shit-done/workflows/discovery-phase.md +291 -0
  332. package/get-shit-done/workflows/discuss-phase/modes/advisor.md +176 -0
  333. package/get-shit-done/workflows/discuss-phase/modes/all.md +28 -0
  334. package/get-shit-done/workflows/discuss-phase/modes/analyze.md +44 -0
  335. package/get-shit-done/workflows/discuss-phase/modes/auto.md +57 -0
  336. package/get-shit-done/workflows/discuss-phase/modes/batch.md +52 -0
  337. package/get-shit-done/workflows/discuss-phase/modes/chain.md +98 -0
  338. package/get-shit-done/workflows/discuss-phase/modes/default.md +141 -0
  339. package/get-shit-done/workflows/discuss-phase/modes/power.md +44 -0
  340. package/get-shit-done/workflows/discuss-phase/modes/text.md +55 -0
  341. package/get-shit-done/workflows/discuss-phase/templates/checkpoint.json +18 -0
  342. package/get-shit-done/workflows/discuss-phase/templates/context.md +136 -0
  343. package/get-shit-done/workflows/discuss-phase/templates/discussion-log.md +50 -0
  344. package/get-shit-done/workflows/discuss-phase-assumptions.md +675 -0
  345. package/get-shit-done/workflows/discuss-phase-power.md +291 -0
  346. package/get-shit-done/workflows/discuss-phase.md +499 -0
  347. package/get-shit-done/workflows/do.md +111 -0
  348. package/get-shit-done/workflows/docs-update.md +1162 -0
  349. package/get-shit-done/workflows/edit-phase.md +295 -0
  350. package/get-shit-done/workflows/eval-review.md +156 -0
  351. package/get-shit-done/workflows/execute-phase/steps/codebase-drift-gate.md +82 -0
  352. package/get-shit-done/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  353. package/get-shit-done/workflows/execute-phase/steps/post-merge-gate.md +117 -0
  354. package/get-shit-done/workflows/execute-phase.md +1709 -0
  355. package/get-shit-done/workflows/execute-plan.md +526 -0
  356. package/get-shit-done/workflows/explore.md +144 -0
  357. package/get-shit-done/workflows/extract-learnings.md +243 -0
  358. package/get-shit-done/workflows/fast.md +124 -0
  359. package/get-shit-done/workflows/forensics.md +279 -0
  360. package/get-shit-done/workflows/graduation.md +196 -0
  361. package/get-shit-done/workflows/health.md +224 -0
  362. package/get-shit-done/workflows/help/modes/brief.md +22 -0
  363. package/get-shit-done/workflows/help/modes/default.md +50 -0
  364. package/get-shit-done/workflows/help/modes/full.md +784 -0
  365. package/get-shit-done/workflows/help/modes/topic.md +74 -0
  366. package/get-shit-done/workflows/help.md +24 -0
  367. package/get-shit-done/workflows/import.md +254 -0
  368. package/get-shit-done/workflows/inbox.md +387 -0
  369. package/get-shit-done/workflows/ingest-docs.md +339 -0
  370. package/get-shit-done/workflows/insert-phase.md +152 -0
  371. package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
  372. package/get-shit-done/workflows/list-workspaces.md +57 -0
  373. package/get-shit-done/workflows/manager.md +393 -0
  374. package/get-shit-done/workflows/map-codebase.md +444 -0
  375. package/get-shit-done/workflows/milestone-summary.md +224 -0
  376. package/get-shit-done/workflows/mvp-phase.md +222 -0
  377. package/get-shit-done/workflows/new-milestone.md +635 -0
  378. package/get-shit-done/workflows/new-project.md +1555 -0
  379. package/get-shit-done/workflows/new-workspace.md +240 -0
  380. package/get-shit-done/workflows/next.md +299 -0
  381. package/get-shit-done/workflows/node-repair.md +92 -0
  382. package/get-shit-done/workflows/note.md +158 -0
  383. package/get-shit-done/workflows/pause-work.md +244 -0
  384. package/get-shit-done/workflows/plan-milestone-gaps.md +281 -0
  385. package/get-shit-done/workflows/plan-phase.md +1809 -0
  386. package/get-shit-done/workflows/plan-review-convergence.md +346 -0
  387. package/get-shit-done/workflows/plant-seed.md +230 -0
  388. package/get-shit-done/workflows/pr-branch.md +157 -0
  389. package/get-shit-done/workflows/profile-user.md +453 -0
  390. package/get-shit-done/workflows/progress.md +699 -0
  391. package/get-shit-done/workflows/quick.md +1039 -0
  392. package/get-shit-done/workflows/reapply-patches.md +426 -0
  393. package/get-shit-done/workflows/remove-phase.md +156 -0
  394. package/get-shit-done/workflows/remove-workspace.md +108 -0
  395. package/get-shit-done/workflows/resume-project.md +332 -0
  396. package/get-shit-done/workflows/review.md +623 -0
  397. package/get-shit-done/workflows/scan.md +105 -0
  398. package/get-shit-done/workflows/secure-phase.md +180 -0
  399. package/get-shit-done/workflows/session-report.md +146 -0
  400. package/get-shit-done/workflows/settings-advanced.md +620 -0
  401. package/get-shit-done/workflows/settings-integrations.md +312 -0
  402. package/get-shit-done/workflows/settings.md +552 -0
  403. package/get-shit-done/workflows/ship.md +356 -0
  404. package/get-shit-done/workflows/sketch-wrap-up.md +286 -0
  405. package/get-shit-done/workflows/sketch.md +361 -0
  406. package/get-shit-done/workflows/spec-phase.md +262 -0
  407. package/get-shit-done/workflows/spike-wrap-up.md +307 -0
  408. package/get-shit-done/workflows/spike.md +453 -0
  409. package/get-shit-done/workflows/stats.md +80 -0
  410. package/get-shit-done/workflows/sync-skills.md +182 -0
  411. package/get-shit-done/workflows/thread.md +222 -0
  412. package/get-shit-done/workflows/transition.md +694 -0
  413. package/get-shit-done/workflows/ui-phase.md +328 -0
  414. package/get-shit-done/workflows/ui-review.md +193 -0
  415. package/get-shit-done/workflows/ultraplan-phase.md +199 -0
  416. package/get-shit-done/workflows/undo.md +314 -0
  417. package/get-shit-done/workflows/update.md +443 -0
  418. package/get-shit-done/workflows/validate-phase.md +179 -0
  419. package/get-shit-done/workflows/verify-phase.md +544 -0
  420. package/get-shit-done/workflows/verify-work.md +781 -0
  421. package/hooks/dist/gsd-check-update-worker.js +95 -0
  422. package/hooks/dist/gsd-check-update.js +64 -0
  423. package/hooks/dist/gsd-context-monitor.js +195 -0
  424. package/hooks/dist/gsd-graphify-update.sh +158 -0
  425. package/hooks/dist/gsd-phase-boundary.sh +47 -0
  426. package/hooks/dist/gsd-prompt-guard.js +97 -0
  427. package/hooks/dist/gsd-read-guard.js +101 -0
  428. package/hooks/dist/gsd-read-injection-scanner.js +203 -0
  429. package/hooks/dist/gsd-session-state.sh +59 -0
  430. package/hooks/dist/gsd-statusline.js +548 -0
  431. package/hooks/dist/gsd-update-banner.js +134 -0
  432. package/hooks/dist/gsd-validate-commit.sh +57 -0
  433. package/hooks/dist/gsd-workflow-guard.js +166 -0
  434. package/hooks/dist/lib/git-cmd.js +150 -0
  435. package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
  436. package/hooks/gsd-check-update-worker.js +95 -0
  437. package/hooks/gsd-check-update.js +64 -0
  438. package/hooks/gsd-context-monitor.js +195 -0
  439. package/hooks/gsd-graphify-update.sh +158 -0
  440. package/hooks/gsd-phase-boundary.sh +47 -0
  441. package/hooks/gsd-prompt-guard.js +97 -0
  442. package/hooks/gsd-read-guard.js +101 -0
  443. package/hooks/gsd-read-injection-scanner.js +203 -0
  444. package/hooks/gsd-session-state.sh +59 -0
  445. package/hooks/gsd-statusline.js +548 -0
  446. package/hooks/gsd-update-banner.js +134 -0
  447. package/hooks/gsd-validate-commit.sh +57 -0
  448. package/hooks/gsd-workflow-guard.js +166 -0
  449. package/hooks/lib/git-cmd.js +150 -0
  450. package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
  451. package/hooks/managed-hooks-registry.cjs +34 -0
  452. package/package.json +102 -0
  453. package/scripts/affected-tests-lib.cjs +541 -0
  454. package/scripts/audit-workflow-script-paths.cjs +73 -0
  455. package/scripts/base64-scan.sh +339 -0
  456. package/scripts/build-hooks.js +236 -0
  457. package/scripts/changeset/README.md +129 -0
  458. package/scripts/changeset/cli.cjs +392 -0
  459. package/scripts/changeset/github-release-notes.cjs +199 -0
  460. package/scripts/changeset/lint.cjs +110 -0
  461. package/scripts/changeset/new.cjs +137 -0
  462. package/scripts/changeset/parse.cjs +114 -0
  463. package/scripts/changeset/render.cjs +34 -0
  464. package/scripts/changeset/serialize.cjs +130 -0
  465. package/scripts/check-alias-drift.cjs +108 -0
  466. package/scripts/check-env.cjs +302 -0
  467. package/scripts/check-npm-integrity.cjs +209 -0
  468. package/scripts/ci-guard-runner.cjs +16 -0
  469. package/scripts/ci-prepare-test-scope.cjs +46 -0
  470. package/scripts/ci-rebase-check.cjs +85 -0
  471. package/scripts/ci-test-scope.cjs +302 -0
  472. package/scripts/command-contract-helpers.cjs +64 -0
  473. package/scripts/diff-touches-shipped-paths.cjs +147 -0
  474. package/scripts/fix-slash-commands.cjs +147 -0
  475. package/scripts/gen-inventory-manifest.cjs +109 -0
  476. package/scripts/generate-package-identity.cjs +104 -0
  477. package/scripts/lint-command-contract.cjs +108 -0
  478. package/scripts/lint-descriptions.cjs +83 -0
  479. package/scripts/lint-docs-required.cjs +222 -0
  480. package/scripts/lint-no-source-grep-extras.cjs +81 -0
  481. package/scripts/lint-no-source-grep.cjs +174 -0
  482. package/scripts/lint-package-identity-drift.cjs +141 -0
  483. package/scripts/lint-pr-check-project-dir.cjs +98 -0
  484. package/scripts/lint-shared-module-handsync.cjs +388 -0
  485. package/scripts/lint-shell-command-projection-drift.cjs +57 -0
  486. package/scripts/lint-skill-deps.cjs +180 -0
  487. package/scripts/lint-test-file-count.allowlist.json +36 -0
  488. package/scripts/lint-test-file-count.cjs +190 -0
  489. package/scripts/pr-template-policy.cjs +268 -0
  490. package/scripts/prompt-injection-scan.sh +203 -0
  491. package/scripts/release-tarball-smoke.cjs +627 -0
  492. package/scripts/run-affected-tests.cjs +6 -0
  493. package/scripts/run-cross-platform-tests.cjs +63 -0
  494. package/scripts/run-tests.cjs +282 -0
  495. package/scripts/secret-scan-lint.sh +231 -0
  496. package/scripts/secret-scan.sh +358 -0
  497. package/scripts/setup-branch-protection.sh +236 -0
  498. package/scripts/shared-module-handsync-allowlist.json +183 -0
  499. package/scripts/strip-prose-atrefs.cjs +106 -0
  500. package/scripts/sync-rulesets.sh +34 -0
  501. package/scripts/sync-runtime-launcher.cjs +402 -0
  502. package/scripts/test-failure-reasons.cjs +34 -0
  503. package/scripts/workflow-policy.cjs +450 -0
@@ -0,0 +1,402 @@
1
+ 'use strict';
2
+ /**
3
+ * sync-runtime-launcher.cjs
4
+ *
5
+ * Idempotent transform: for every get-shit-done/workflows/*.md (and subdirs),
6
+ * rewrite all bash/sh/shell fenced blocks to:
7
+ * 1. Strip ALL old resolver forms from every bash block (GSD_TOOLS=,
8
+ * GSD_SDK=, the if/elif/else/fi resolver, _GSD_SHIM_NAME=, and any
9
+ * previously-inserted gsd_run preamble).
10
+ * 2. Replace $GSD_SDK tokens with gsd_run (idempotent).
11
+ * 3. Insert the canonical preamble at the TOP of ONLY the FIRST bash block
12
+ * (document order) that contains a gsd_run call. All other bash blocks
13
+ * keep their gsd_run calls with NO preamble. (Define once per file,
14
+ * use across blocks — original footprint.)
15
+ *
16
+ * Run: node scripts/sync-runtime-launcher.cjs
17
+ */
18
+
19
+ const fs = require('node:fs');
20
+ const path = require('node:path');
21
+
22
+ const WORKFLOWS_DIR = path.join(__dirname, '..', 'get-shit-done', 'workflows');
23
+ const SNIPPET_FILE = path.join(WORKFLOWS_DIR, '_runtime-launcher.snippet.sh');
24
+
25
+ // Read canonical preamble (full content of snippet file)
26
+ function loadPreamble() {
27
+ const raw = fs.readFileSync(SNIPPET_FILE, 'utf8');
28
+ const lines = raw.split('\n');
29
+ // Strip trailing empty line (trailing newline produces an empty last element)
30
+ const content = lines[lines.length - 1] === '' ? lines.slice(0, -1) : lines;
31
+ if (content.length < 1) {
32
+ throw new Error(`_runtime-launcher.snippet.sh is empty`);
33
+ }
34
+ return content;
35
+ }
36
+
37
+ /**
38
+ * Collect all .md files recursively.
39
+ */
40
+ function collectFiles(dir) {
41
+ const results = [];
42
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
43
+ const full = path.join(dir, entry.name);
44
+ if (entry.isDirectory()) {
45
+ results.push(...collectFiles(full));
46
+ } else if (entry.isFile() && entry.name.endsWith('.md')) {
47
+ results.push(full);
48
+ }
49
+ }
50
+ return results;
51
+ }
52
+
53
+ /**
54
+ * Given the lines of a bash block (without fence markers), strip all resolver
55
+ * boilerplate (old and new preamble forms) and replace $GSD_SDK tokens.
56
+ * Does NOT insert preamble — that is done by the file-level transform.
57
+ *
58
+ * Returns the stripped lines array.
59
+ */
60
+ function stripAndReplace(lines, preamble) {
61
+ let result = lines.slice();
62
+
63
+ // Step 1: Remove ALL resolver boilerplate lines (including existing preamble).
64
+ result = removeResolverLines(result, preamble);
65
+
66
+ // Step 2: Replace $GSD_SDK tokens with gsd_run
67
+ result = result.map((line) => replaceGsdSdk(line));
68
+
69
+ return result;
70
+ }
71
+
72
+ /**
73
+ * Remove resolver boilerplate lines from a block.
74
+ *
75
+ * Patterns to remove:
76
+ * A) Multi-line if block:
77
+ * GSD_TOOLS="...gsd-tools.cjs" (or ...${_GSD_SHIM_NAME})
78
+ * if [ -f "$GSD_TOOLS" ]; then
79
+ * ...
80
+ * fi
81
+ *
82
+ * B) One-liner form:
83
+ * GSD_TOOLS=...; if [ -f "$GSD_TOOLS" ]; then GSD_SDK=...; elif ...; else ...; fi
84
+ *
85
+ * C) _GSD_SHIM_NAME= line
86
+ *
87
+ * D) Bare GSD_SDK= line
88
+ *
89
+ * E) The canonical preamble comment line (so we strip old inserted preambles too)
90
+ *
91
+ * F) The gsd_run() function definitions that are part of the preamble
92
+ * (so previously-inserted preambles are stripped and will be re-inserted
93
+ * exactly once at the right location)
94
+ */
95
+ function removeResolverLines(lines, preamble) {
96
+ const result = [];
97
+ let i = 0;
98
+
99
+ // Build a set of preamble lines for fast lookup (to strip previously-inserted preambles)
100
+ const preambleLineSet = new Set(preamble);
101
+
102
+ while (i < lines.length) {
103
+ const line = lines[i];
104
+ const trimmed = line.trim();
105
+
106
+ // B) One-liner form: GSD_TOOLS=... ; if ... GSD_SDK=... fi
107
+ if (
108
+ /^GSD_TOOLS=.*gsd-tools\.cjs.*;\s*if\s+\[/.test(trimmed) ||
109
+ /^GSD_TOOLS=.*\/\$\{_GSD_SHIM_NAME\}.*;\s*if\s+\[/.test(trimmed)
110
+ ) {
111
+ // Skip the whole one-liner, and any adjacent SDK comment above it
112
+ const lastIdx = result.length - 1;
113
+ if (lastIdx >= 0 && isSdkComment(result[lastIdx])) {
114
+ result.pop();
115
+ }
116
+ i++;
117
+ continue;
118
+ }
119
+
120
+ // C) _GSD_SHIM_NAME= line
121
+ if (/^_GSD_SHIM_NAME=/.test(trimmed)) {
122
+ // Check if there's a canonical preamble comment just before it
123
+ const lastIdx = result.length - 1;
124
+ if (lastIdx >= 0 && isCanonicalPreambleComment(result[lastIdx])) {
125
+ result.pop();
126
+ } else if (lastIdx >= 0 && isSdkComment(result[lastIdx])) {
127
+ result.pop();
128
+ }
129
+ i++;
130
+ continue;
131
+ }
132
+
133
+ // A) Multi-line form: starts with GSD_TOOLS=...gsd-tools.cjs or GSD_TOOLS=...${_GSD_SHIM_NAME}
134
+ if (
135
+ /^GSD_TOOLS=.*gsd-tools\.cjs"$/.test(trimmed) ||
136
+ /^GSD_TOOLS=.*\/\$\{_GSD_SHIM_NAME\}"$/.test(trimmed)
137
+ ) {
138
+ // Check if there's a canonical preamble comment just before it (preamble already installed)
139
+ // or an old SDK comment — either way, remove the whole block
140
+ const lastIdx = result.length - 1;
141
+ if (lastIdx >= 0 && (isCanonicalPreambleComment(result[lastIdx]) || isSdkComment(result[lastIdx]))) {
142
+ result.pop();
143
+ }
144
+
145
+ // Consume the if block that follows (if it exists)
146
+ const ahead = lines[i + 1] ? lines[i + 1].trim() : '';
147
+ if (/^if\s+\[\s+-f\s+"\$GSD_TOOLS"\s*\]/.test(ahead)) {
148
+ // Consume until matching `fi`
149
+ i += 2; // skip GSD_TOOLS= and `if [...]`
150
+ let depth = 1;
151
+ while (i < lines.length && depth > 0) {
152
+ const t = lines[i].trim();
153
+ if (/^if\s+/.test(t)) depth++;
154
+ if (/^fi(\s|$)/.test(t)) {
155
+ depth--;
156
+ if (depth === 0) {
157
+ i++;
158
+ break;
159
+ }
160
+ }
161
+ i++;
162
+ }
163
+ // After fi, skip a blank line if present
164
+ if (i < lines.length && lines[i].trim() === '') {
165
+ i++;
166
+ }
167
+ continue;
168
+ } else {
169
+ // Just skip the GSD_TOOLS= line
170
+ i++;
171
+ continue;
172
+ }
173
+ }
174
+
175
+ // D) Bare GSD_SDK= line (not inside an if block, defensive)
176
+ if (/^GSD_SDK=/.test(trimmed) && !/gsd_run/.test(trimmed)) {
177
+ i++;
178
+ continue;
179
+ }
180
+
181
+ // E+F) Strip lines that are part of the canonical preamble (to remove previously-inserted preambles).
182
+ // We match the canonical preamble comment, _GSD_SHIM_NAME (handled above at C),
183
+ // and gsd_run() function definition lines.
184
+ if (isCanonicalPreambleComment(trimmed.startsWith('#') ? line : '')) {
185
+ // Start of a previously-inserted canonical preamble — skip preamble lines
186
+ // by consuming lines that match the preamble array in order.
187
+ // Check how many consecutive lines match the preamble.
188
+ let matchLen = 0;
189
+ for (let p = 0; p < preamble.length; p++) {
190
+ if (lines[i + p] === preamble[p]) {
191
+ matchLen++;
192
+ } else {
193
+ break;
194
+ }
195
+ }
196
+ if (matchLen === preamble.length) {
197
+ // Exact preamble match — skip all preamble lines
198
+ i += matchLen;
199
+ // Skip trailing blank line if present
200
+ if (i < lines.length && lines[i].trim() === '') {
201
+ i++;
202
+ }
203
+ continue;
204
+ }
205
+ // Partial match or just the comment — still remove the comment line
206
+ i++;
207
+ continue;
208
+ }
209
+
210
+ result.push(line);
211
+ i++;
212
+ }
213
+
214
+ return result;
215
+ }
216
+
217
+ /**
218
+ * Returns true if the line looks like an old SDK resolver comment (to be removed).
219
+ * Must NOT match the new canonical preamble comment.
220
+ */
221
+ function isSdkComment(line) {
222
+ // The new canonical preamble comment starts with "# Runtime launcher:" — preserve it.
223
+ if (isCanonicalPreambleComment(line)) return false;
224
+ return /^\s*#\s*SDK resolution/.test(line) || /^\s*#.*prefer local.*gsd-tools/.test(line);
225
+ }
226
+
227
+ /**
228
+ * Returns true if the line is the new canonical preamble comment.
229
+ * This identifies the start of the new multi-line canonical preamble.
230
+ */
231
+ function isCanonicalPreambleComment(line) {
232
+ return /^\s*#\s*Runtime launcher:.*prefer local gsd-tools\.cjs.*installed gsd-tools on PATH/.test(line);
233
+ }
234
+
235
+ /**
236
+ * Replace all $GSD_SDK tokens with gsd_run in a line.
237
+ * Handles: $GSD_SDK, ${GSD_SDK} forms.
238
+ */
239
+ function replaceGsdSdk(line) {
240
+ return line.replace(/\$\{?GSD_SDK\}?(?=\s|$|;|"|'|\))/g, 'gsd_run');
241
+ }
242
+
243
+ /**
244
+ * Ensure the canonical preamble appears at the top of the block.
245
+ * Rules:
246
+ * - Skip leading blank lines
247
+ * - Check if preamble lines 0..N-1 already match at the scan position
248
+ * - If not, insert preamble at the top (after leading blanks)
249
+ * - Idempotent: if preamble already present, do nothing
250
+ */
251
+ function insertPreamble(lines, preamble) {
252
+ // Find insertion point: skip blanks only
253
+ let scanIdx = 0;
254
+ while (scanIdx < lines.length && lines[scanIdx].trim() === '') scanIdx++;
255
+
256
+ // Check if preamble already present at scanIdx
257
+ let alreadyPresent = preamble.length > 0;
258
+ for (let p = 0; p < preamble.length; p++) {
259
+ if (lines[scanIdx + p] !== preamble[p]) {
260
+ alreadyPresent = false;
261
+ break;
262
+ }
263
+ }
264
+
265
+ if (alreadyPresent) return lines; // idempotent
266
+
267
+ // Insert preamble at scanIdx (after leading blanks)
268
+ const insertAt = scanIdx;
269
+ const before = lines.slice(0, insertAt);
270
+ const after = lines.slice(insertAt);
271
+
272
+ return [...before, ...preamble, ...after];
273
+ }
274
+
275
+ /**
276
+ * Transform a single markdown file's content.
277
+ * Returns new content string, or null if no changes needed.
278
+ *
279
+ * Strategy:
280
+ * 1. Parse all shell blocks, strip resolver boilerplate from each.
281
+ * 2. Find the FIRST block (document order) that has a gsd_run call.
282
+ * 3. Insert preamble into that block only.
283
+ * 4. Reconstruct the file.
284
+ *
285
+ * Handles both column-0 fences (```bash) and indented fences ( ```bash).
286
+ */
287
+ function transformFile(content, preamble) {
288
+ const allLines = content.split('\n');
289
+
290
+ // --- Pass 1: identify all shell blocks and their positions ---
291
+ // Each entry: { openIdx, closeIdx, blockLines, isShell }
292
+ // We'll reconstruct by replacing block lines in-place.
293
+
294
+ const shellBlockRanges = []; // { openLineIdx, contentStart, contentEnd, closingLineIdx }
295
+ let i = 0;
296
+
297
+ while (i < allLines.length) {
298
+ const line = allLines[i];
299
+ const fenceOpen = line.match(/^(\s*)```(\w+)?\s*$/);
300
+ if (!fenceOpen) { i++; continue; }
301
+
302
+ const indent = fenceOpen[1];
303
+ const lang = (fenceOpen[2] || '').toLowerCase();
304
+ const isShellBlock = ['bash', 'sh', 'shell', 'zsh', ''].includes(lang);
305
+ const closingPattern = new RegExp('^' + escapeRegExp(indent) + '```\\s*$');
306
+
307
+ const openLineIdx = i;
308
+ i++;
309
+ const contentStart = i;
310
+
311
+ while (i < allLines.length && !closingPattern.test(allLines[i])) {
312
+ i++;
313
+ }
314
+ const contentEnd = i; // exclusive
315
+ const closingLineIdx = i < allLines.length ? i : -1;
316
+ if (i < allLines.length) i++;
317
+
318
+ if (isShellBlock) {
319
+ shellBlockRanges.push({ openLineIdx, contentStart, contentEnd, closingLineIdx });
320
+ }
321
+ }
322
+
323
+ if (shellBlockRanges.length === 0) return null;
324
+
325
+ // --- Pass 2: transform each block ---
326
+ // Build a new lines array by splicing in transformed block contents.
327
+ // Process ranges in reverse order so indices stay valid.
328
+
329
+ const outputLines = allLines.slice();
330
+ let changed = false;
331
+ let firstGsdRunBlockIdx = -1; // index into shellBlockRanges of the first gsd_run block (after strip)
332
+
333
+ // First: strip + replace in all blocks, find first gsd_run block
334
+ const strippedBlocks = shellBlockRanges.map((range) => {
335
+ const blockLines = outputLines.slice(range.contentStart, range.contentEnd);
336
+ const stripped = stripAndReplace(blockLines, preamble);
337
+ return stripped;
338
+ });
339
+
340
+ // Find the first block that has a gsd_run call (after stripping)
341
+ for (let bi = 0; bi < strippedBlocks.length; bi++) {
342
+ if (strippedBlocks[bi].some((l) => /\bgsd_run\b/.test(l))) {
343
+ firstGsdRunBlockIdx = bi;
344
+ break;
345
+ }
346
+ }
347
+
348
+ // Insert preamble into the first gsd_run block only
349
+ const finalBlocks = strippedBlocks.map((stripped, bi) => {
350
+ if (bi === firstGsdRunBlockIdx) {
351
+ return insertPreamble(stripped, preamble);
352
+ }
353
+ return stripped;
354
+ });
355
+
356
+ // --- Pass 3: splice back into output (reverse order to preserve indices) ---
357
+ for (let bi = shellBlockRanges.length - 1; bi >= 0; bi--) {
358
+ const range = shellBlockRanges[bi];
359
+ const originalBlock = allLines.slice(range.contentStart, range.contentEnd);
360
+ const newBlock = finalBlocks[bi];
361
+
362
+ if (originalBlock.join('\n') !== newBlock.join('\n')) {
363
+ changed = true;
364
+ }
365
+
366
+ // Replace contentStart..contentEnd with newBlock
367
+ outputLines.splice(range.contentStart, range.contentEnd - range.contentStart, ...newBlock);
368
+ }
369
+
370
+ if (!changed) return null;
371
+
372
+ return outputLines.join('\n');
373
+ }
374
+
375
+ function escapeRegExp(str) {
376
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
377
+ }
378
+
379
+ // Main
380
+ function main() {
381
+ const preamble = loadPreamble();
382
+ const files = collectFiles(WORKFLOWS_DIR);
383
+
384
+ let transformedCount = 0;
385
+ let unchangedCount = 0;
386
+
387
+ for (const f of files) {
388
+ const content = fs.readFileSync(f, 'utf8');
389
+ const result = transformFile(content, preamble);
390
+ if (result !== null) {
391
+ fs.writeFileSync(f, result, 'utf8');
392
+ transformedCount++;
393
+ console.log(`transformed: ${path.relative(WORKFLOWS_DIR, f)}`);
394
+ } else {
395
+ unchangedCount++;
396
+ }
397
+ }
398
+
399
+ console.log(`\nDone. ${transformedCount} files transformed, ${unchangedCount} unchanged.`);
400
+ }
401
+
402
+ main();
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ const TEST_GATE_REASON = Object.freeze({
4
+ PASS: 'pass',
5
+ TEST_FAILURE: 'test_failure',
6
+ INFRA_FAILURE: 'infra_failure',
7
+ UNKNOWN_FAILURE: 'unknown_failure',
8
+ });
9
+
10
+ /**
11
+ * Classify gsd-test style output + exit code into a typed reason.
12
+ * @param {{exitCode:number, output?:string}} input
13
+ * @returns {{ok:boolean, reason:string}}
14
+ */
15
+ function classifyTestGateResult(input) {
16
+ const exitCode = Number(input?.exitCode ?? 0);
17
+ const output = String(input?.output ?? '');
18
+
19
+ if (exitCode === 0) return { ok: true, reason: TEST_GATE_REASON.PASS };
20
+
21
+ // gsd-test/gsd-test-summary infrastructure class (exit 2)
22
+ if (exitCode === 2 || /infrastructure failure|worktree\.Construct/i.test(output)) {
23
+ return { ok: false, reason: TEST_GATE_REASON.INFRA_FAILURE };
24
+ }
25
+
26
+ // test failures (non-zero plus explicit FAIL lines)
27
+ if (/\bFAIL\b|\d+\s+failures?\)|failed\)/i.test(output)) {
28
+ return { ok: false, reason: TEST_GATE_REASON.TEST_FAILURE };
29
+ }
30
+
31
+ return { ok: false, reason: TEST_GATE_REASON.UNKNOWN_FAILURE };
32
+ }
33
+
34
+ module.exports = { TEST_GATE_REASON, classifyTestGateResult };