@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,443 @@
1
+ <purpose>
2
+ Check for GSD updates via npm, display changelog for versions between installed and latest, obtain user confirmation, and execute clean installation with cache clearing.
3
+ </purpose>
4
+
5
+ <required_reading>
6
+ Read all files referenced by the invoking prompt's execution_context before starting.
7
+ </required_reading>
8
+
9
+ <process>
10
+
11
+ <step name="get_installed_version">
12
+ Detect the installed GSD version, scope, runtime, and config dir.
13
+
14
+ First, derive `PREFERRED_CONFIG_DIR` and `PREFERRED_RUNTIME` from the invoking prompt's `execution_context` path — this is the one input only the workflow knows:
15
+ - If the path contains `/get-shit-done/workflows/update.md`, strip that suffix and store the remainder as `PREFERRED_CONFIG_DIR`.
16
+ - Infer `PREFERRED_RUNTIME` from the path: `/.codex/` -> `codex`; `/.gemini/antigravity-ide/`, `/.gemini/antigravity-cli/`, `/.gemini/antigravity/`, `/.agent/` -> `antigravity` (`.agent` is the local Antigravity install dir; see bin/install.js `getDirName('antigravity')`, #503); `/.gemini/` -> `gemini`; `/.config/kilo/` or `/.kilo/` -> `kilo`; `/.config/opencode/` or `/.opencode/` -> `opencode`; otherwise `claude`.
17
+
18
+ Then resolve the install context via the deterministic projection (#498). **Do NOT re-derive scope, runtime, or version by hand** — `update-context` owns that cascade in tested code (`get-shit-done/bin/lib/update-context.cjs`), the same way `check-latest-version` owns the package name (#2992):
19
+
20
+ ```bash
21
+ # Resolve gsd-tools.cjs WITHOUT yet knowing GSD_DIR. The running workflow lives
22
+ # at <PREFERRED_CONFIG_DIR>/get-shit-done/workflows/update.md, so its sibling
23
+ # bin/gsd-tools.cjs is the authoritative tool for THIS install. Fall back to a
24
+ # global copy, then to gsd-tools on PATH.
25
+ GSD_TOOLS=""
26
+ for cand in \
27
+ "$PREFERRED_CONFIG_DIR/get-shit-done/bin/gsd-tools.cjs" \
28
+ "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs"; do
29
+ if [ -n "$cand" ] && [ -f "$cand" ]; then GSD_TOOLS="$cand"; break; fi
30
+ done
31
+ # Last resort: the gsd-tools shim on PATH — resolved to its absolute path and
32
+ # invoked via the variable (never a bare `gsd-tools` command; see #2851).
33
+ if [ -z "$GSD_TOOLS" ] && command -v gsd-tools >/dev/null 2>&1; then
34
+ GSD_TOOLS="$(command -v gsd-tools)"
35
+ fi
36
+
37
+ UC=""
38
+ if [ -n "$GSD_TOOLS" ]; then
39
+ case "$GSD_TOOLS" in
40
+ *.cjs) UC="$(node "$GSD_TOOLS" update-context --config-dir "$PREFERRED_CONFIG_DIR" --runtime "$PREFERRED_RUNTIME" --json 2>/dev/null)" ;;
41
+ *) UC="$("$GSD_TOOLS" update-context --config-dir "$PREFERRED_CONFIG_DIR" --runtime "$PREFERRED_RUNTIME" --json 2>/dev/null)" ;;
42
+ esac
43
+ fi
44
+
45
+ if [ -n "$UC" ]; then
46
+ INSTALLED_VERSION="$(printf '%s' "$UC" | jq -r '.installedVersion')"
47
+ INSTALL_SCOPE="$(printf '%s' "$UC" | jq -r '.scope')"
48
+ TARGET_RUNTIME="$(printf '%s' "$UC" | jq -r '.runtime')"
49
+ GSD_DIR="$(printf '%s' "$UC" | jq -r '.gsdDir')"
50
+ else
51
+ # No tool resolvable / projection failed -> treat as a fresh install.
52
+ INSTALLED_VERSION="0.0.0"
53
+ INSTALL_SCOPE="UNKNOWN"
54
+ TARGET_RUNTIME="claude"
55
+ GSD_DIR=""
56
+ fi
57
+
58
+ echo "$INSTALLED_VERSION"
59
+ echo "$INSTALL_SCOPE"
60
+ echo "$TARGET_RUNTIME"
61
+ echo "$GSD_DIR"
62
+ ```
63
+
64
+ Parse output:
65
+ - Line 1 = installed version (`0.0.0` means unknown version)
66
+ - Line 2 = install scope (`LOCAL`, `GLOBAL`, or `UNKNOWN`)
67
+ - Line 3 = target runtime (`claude`, `opencode`, `gemini`, `kilo`, `codex`, `antigravity`)
68
+ - Line 4 = resolved GSD config dir (e.g. `/Users/me/.claude`, `/Users/me/.gemini`); empty if scope is `UNKNOWN`. Capture this as `GSD_DIR` and pass it to subsequent steps so they don't re-derive the runtime path.
69
+ - If scope is `UNKNOWN`, proceed to install using the `--claude --global` fallback.
70
+
71
+ `update-context` reproduces the previous detection cascade — preferred-config-dir fast path, local-over-global with same-path dedup (so `CWD=$HOME` does not misdetect as LOCAL), env-var overrides (`CLAUDE_CONFIG_DIR`, `OPENCODE_CONFIG_DIR`, `KILO_CONFIG`, `XDG_CONFIG_HOME`, `CODEX_HOME`, …), and semver validation — but as a tested projection rather than ~280 lines of inline bash. Branch coverage lives in `tests/issue-498-update-context.test.cjs`.
72
+
73
+ If multiple runtime installs are detected and the invoking runtime cannot be determined from execution_context, ask the user which runtime to update before running install.
74
+
75
+ **If VERSION file missing (version resolves to `0.0.0`):** report the installed version as Unknown and proceed to install (treated as `0.0.0` for comparison).
76
+ </step>
77
+
78
+ <step name="check_latest_version">
79
+ Check npm for latest version via the deterministic script. **Do NOT run `npm view` or `npm search` directly** — the package name must come from the script, not from a free choice at execution time. (#2992: LLM-driven prescriptions of npm package names produced wrong-package queries; moving the package name into a script constant closes that gap.)
80
+
81
+ The `GSD_DIR` value emitted by `get_installed_version` (line 4) resolves to the runtime-specific config dir (`~/.claude/`, `~/.gemini/`, `~/.codex/`, etc.), so the script invocation works for every runtime — not just Claude. If `GSD_DIR` is empty (scope `UNKNOWN`), skip this step and go directly to install.
82
+
83
+ `LATEST_RESULT` is a JSON document with the documented shape `{ ok: bool, version: string, reason: string, detail?: string }`. Parse via `jq` ONLY when the script actually ran. When `GSD_DIR` is empty (scope `UNKNOWN`), skip the check entirely and seed the parsed fields with their no-op values so downstream logic does not mistake an unset `LATEST_RESULT` for a failed network check (#2993 CR feedback):
84
+
85
+ ```bash
86
+ if [ -z "$GSD_DIR" ]; then
87
+ # No install detected — fall through to install step; version-check is skipped.
88
+ LATEST_RESULT=""
89
+ LATEST_STATUS=0
90
+ LATEST_OK=false
91
+ LATEST_VERSION=""
92
+ LATEST_REASON="no_install_detected"
93
+ else
94
+ LATEST_RESULT="$(node "$GSD_DIR/get-shit-done/bin/check-latest-version.cjs" --json 2>/dev/null)"
95
+ LATEST_STATUS=$?
96
+ # #2993 CR: when node is missing or the script doesn't exist, LATEST_RESULT
97
+ # is empty and piping it to `jq` produces a parse error on stderr while
98
+ # leaving LATEST_OK / LATEST_REASON as empty strings. Fail the check with a
99
+ # meaningful reason instead of a blank diagnostic.
100
+ if [ -n "$LATEST_RESULT" ]; then
101
+ LATEST_OK="$(printf '%s' "$LATEST_RESULT" | jq -r '.ok // false')"
102
+ LATEST_VERSION="$(printf '%s' "$LATEST_RESULT" | jq -r '.version // empty')"
103
+ LATEST_REASON="$(printf '%s' "$LATEST_RESULT" | jq -r '.reason // empty')"
104
+ else
105
+ LATEST_OK=false
106
+ LATEST_VERSION=""
107
+ LATEST_REASON="script_not_found_or_node_unavailable"
108
+ fi
109
+ fi
110
+ ```
111
+
112
+ **If `LATEST_OK` is not `true`** (or `LATEST_STATUS` is non-zero):
113
+
114
+ ```text
115
+ Couldn't check for updates (reason: {LATEST_REASON}, exit: {LATEST_STATUS}).
116
+
117
+ To update manually: `npx -y --package=@opengsd/gsd-core@latest -- gsd-core --global`
118
+ ```
119
+
120
+ Exit.
121
+ </step>
122
+
123
+ <step name="compare_versions">
124
+ Compare installed vs latest:
125
+
126
+ **If installed == latest:**
127
+ ```
128
+ ## GSD Update
129
+
130
+ **Installed:** X.Y.Z
131
+ **Latest:** X.Y.Z
132
+
133
+ You're already on the latest version.
134
+ ```
135
+
136
+ Exit.
137
+
138
+ **If installed > latest:**
139
+ ```
140
+ ## GSD Update
141
+
142
+ **Installed:** X.Y.Z
143
+ **Latest:** A.B.C
144
+
145
+ You're ahead of the latest release — this looks like a dev install.
146
+
147
+ If you see a "⚠ dev install — re-run installer to sync hooks" warning in
148
+ your statusline, your hook files are older than your VERSION file. Fix it
149
+ by re-running the local installer from your dev branch:
150
+
151
+ node bin/install.js --global --claude
152
+
153
+ Running /gsd:update would install the npm release (A.B.C) and downgrade
154
+ your dev version — do NOT use it to resolve this warning.
155
+ ```
156
+
157
+ Exit.
158
+ </step>
159
+
160
+ <step name="show_changes_and_confirm">
161
+ **If update available**, fetch and show what's new BEFORE updating:
162
+
163
+ 1. Fetch changelog from GitHub raw URL and save to a temp file, e.g. `/tmp/gsd-changelog-$$.md`.
164
+ 2. Extract entries between installed and latest versions using the deterministic range helper (fix for #3496 — do NOT use ad-hoc grep/awk extraction which silently skips intermediate versions):
165
+
166
+ ```bash
167
+ CHANGELOG_TMP="/tmp/gsd-changelog-$$.md"
168
+ curl -fsSL "https://raw.githubusercontent.com/open-gsd/gsd-core/main/CHANGELOG.md" -o "$CHANGELOG_TMP" 2>/dev/null \
169
+ || wget -qO "$CHANGELOG_TMP" "https://raw.githubusercontent.com/open-gsd/gsd-core/main/CHANGELOG.md" 2>/dev/null
170
+
171
+ EXTRACT_JSON=$(node "$GSD_DIR/get-shit-done/scripts/changeset/cli.cjs" extract \
172
+ --from "$INSTALLED_VERSION" \
173
+ --to "$LATEST_VERSION" \
174
+ --changelog "$CHANGELOG_TMP" \
175
+ --json 2>/dev/null)
176
+ EXTRACT_EXIT=$?
177
+ rm -f "$CHANGELOG_TMP"
178
+
179
+ if [ "$EXTRACT_EXIT" -eq 2 ]; then
180
+ # Exit 2 = no releases in range (e.g. versions are equal or changelog is sparse)
181
+ CHANGELOG_PREVIEW="No changelog updates between v${INSTALLED_VERSION} and v${LATEST_VERSION}."
182
+ elif [ "$EXTRACT_EXIT" -ne 0 ] || [ -z "$EXTRACT_JSON" ]; then
183
+ CHANGELOG_PREVIEW="(Could not extract changelog — update will still proceed)"
184
+ else
185
+ # Re-run without --json to get the human-readable markdown for display
186
+ CHANGELOG_PREVIEW=$(node "$GSD_DIR/get-shit-done/scripts/changeset/cli.cjs" extract \
187
+ --from "$INSTALLED_VERSION" \
188
+ --to "$LATEST_VERSION" \
189
+ --changelog "$CHANGELOG_TMP" 2>/dev/null || echo "(changelog unavailable)")
190
+ fi
191
+ ```
192
+
193
+ 3. Display preview and ask for confirmation, using `$CHANGELOG_PREVIEW` from the extract step above:
194
+
195
+ ```
196
+ ## GSD Update Available
197
+
198
+ **Installed:** {INSTALLED_VERSION}
199
+ **Latest:** {LATEST_VERSION}
200
+
201
+ ### What's New
202
+ ────────────────────────────────────────────────────────────
203
+
204
+ {CHANGELOG_PREVIEW}
205
+
206
+ ────────────────────────────────────────────────────────────
207
+
208
+ ⚠️ **Note:** The installer performs a clean install of GSD folders:
209
+ - `commands/gsd/` will be wiped and replaced
210
+ - `get-shit-done/` will be wiped and replaced
211
+ - `agents/gsd-*` files will be replaced
212
+
213
+ (Paths are relative to detected runtime install location:
214
+ global: `~/.claude/`, `~/.config/opencode/`, `~/.opencode/`, `~/.gemini/`, `~/.config/kilo/`, or `~/.codex/`
215
+ local: `./.claude/`, `./.config/opencode/`, `./.opencode/`, `./.gemini/`, `./.kilo/`, or `./.codex/`)
216
+
217
+ Your custom files in other locations are preserved:
218
+ - Custom commands not in `commands/gsd/` ✓
219
+ - Custom agents not prefixed with `gsd-` ✓
220
+ - Custom hooks ✓
221
+ - Your CLAUDE.md files ✓
222
+
223
+ If you've modified any GSD files directly, they'll be automatically backed up to `gsd-local-patches/` and can be reapplied with `/gsd:update --reapply` after the update.
224
+ ```
225
+
226
+
227
+ **Text mode (`workflow.text_mode: true` in config or `--text` flag):** Set `TEXT_MODE=true` if `--text` is present in `$ARGUMENTS` OR `text_mode` from init JSON is `true`. When TEXT_MODE is active, replace every `AskUserQuestion` call with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where `AskUserQuestion` is not available.
228
+ Use AskUserQuestion:
229
+ - Question: "Proceed with update?"
230
+ - Options:
231
+ - "Yes, update now"
232
+ - "No, cancel"
233
+
234
+ **If user cancels:** Exit.
235
+ </step>
236
+
237
+ <step name="backup_custom_files">
238
+ Before running the installer, detect and back up any user-added files inside
239
+ GSD-managed directories. These are files that exist on disk but are NOT listed
240
+ in `gsd-file-manifest.json` — i.e., files the user added themselves that the
241
+ installer does not know about and will delete during the wipe.
242
+
243
+ **Do not use bash path-stripping (`${filepath#$RUNTIME_DIR/}`) or `node -e require()`
244
+ inline** — those patterns fail when `$RUNTIME_DIR` is unset and the stripped
245
+ relative path may not match manifest key format, which causes CUSTOM_COUNT=0
246
+ even when custom files exist (bug #1997). Use `gsd-tools.cjs query detect-custom-files`
247
+ or the bundled `gsd-tools.cjs detect-custom-files` path — both resolve paths
248
+ reliably with Node.js `path.relative()`.
249
+
250
+ First, resolve the config directory (`RUNTIME_DIR`) from the install scope
251
+ detected in `get_installed_version`:
252
+
253
+ ```bash
254
+ # RUNTIME_DIR is the resolved config directory (e.g. ~/.config/opencode, ~/.gemini).
255
+ # get_installed_version emits it as GSD_DIR (LOCAL or GLOBAL install dir, or empty
256
+ # when scope is UNKNOWN). Empty RUNTIME_DIR skips the backup below.
257
+ RUNTIME_DIR="$GSD_DIR"
258
+ ```
259
+
260
+ If `RUNTIME_DIR` is empty or does not exist, skip this step (no config dir to
261
+ inspect).
262
+
263
+ Otherwise run `detect-custom-files`:
264
+
265
+ ```bash
266
+ CUSTOM_JSON=''
267
+ if [ -f "$GSD_TOOLS" ] && [ -n "$RUNTIME_DIR" ]; then
268
+ CUSTOM_JSON=$(node "$GSD_TOOLS" detect-custom-files --config-dir "$RUNTIME_DIR" 2>/dev/null)
269
+ fi
270
+ if [ -z "$CUSTOM_JSON" ]; then
271
+ CUSTOM_JSON='{"custom_files":[],"custom_count":0}'
272
+ fi
273
+ CUSTOM_COUNT=$(echo "$CUSTOM_JSON" | node -e "process.stdin.resume();let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{console.log(JSON.parse(d).custom_count);}catch{console.log(0);}})" 2>/dev/null || echo "0")
274
+ ```
275
+
276
+ **If `CUSTOM_COUNT` > 0:**
277
+
278
+ Back up each custom file to `$RUNTIME_DIR/gsd-user-files-backup/` before the
279
+ installer wipes the directories:
280
+
281
+ ```bash
282
+ BACKUP_DIR="$RUNTIME_DIR/gsd-user-files-backup"
283
+ mkdir -p "$BACKUP_DIR"
284
+
285
+ # Parse custom_files array from CUSTOM_JSON and copy each file
286
+ node - "$RUNTIME_DIR" "$BACKUP_DIR" "$CUSTOM_JSON" <<'JSEOF'
287
+ const [,, runtimeDir, backupDir, customJson] = process.argv;
288
+ const { custom_files } = JSON.parse(customJson);
289
+ const fs = require('fs');
290
+ const path = require('path');
291
+ for (const relPath of custom_files) {
292
+ const src = path.join(runtimeDir, relPath);
293
+ const dst = path.join(backupDir, relPath);
294
+ if (!fs.existsSync(src)) continue;
295
+
296
+ try {
297
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
298
+ fs.copyFileSync(src, dst);
299
+ console.log(' Backed up: ' + relPath);
300
+ } catch (err) {
301
+ const code = err && err.code ? String(err.code) : 'ERROR';
302
+ console.log(' Skipped (non-fatal): ' + relPath + ' [' + code + ']');
303
+ }
304
+ }
305
+ JSEOF
306
+ ```
307
+
308
+ Then inform the user:
309
+
310
+ ```
311
+ ⚠️ Found N custom file(s) inside GSD-managed directories.
312
+ These have been backed up to gsd-user-files-backup/ before the update.
313
+ Restore them after the update if needed.
314
+ ```
315
+
316
+ **If `CUSTOM_COUNT` == 0:** No user-added files detected. Continue to install.
317
+ </step>
318
+
319
+ <step name="run_update">
320
+ Run the update using the install type detected in step 1:
321
+
322
+ Build runtime flag from step 1:
323
+ ```bash
324
+ RUNTIME_FLAG="--$TARGET_RUNTIME"
325
+ ```
326
+
327
+ **If LOCAL install:**
328
+ ```bash
329
+ npx -y --package=@opengsd/gsd-core@latest -- gsd-core "$RUNTIME_FLAG" --local
330
+ ```
331
+
332
+ **If GLOBAL install:**
333
+ ```bash
334
+ npx -y --package=@opengsd/gsd-core@latest -- gsd-core "$RUNTIME_FLAG" --global
335
+ ```
336
+
337
+ **If UNKNOWN install:**
338
+ ```bash
339
+ npx -y --package=@opengsd/gsd-core@latest -- gsd-core --claude --global
340
+ ```
341
+
342
+ Capture output. If install fails, show error and exit.
343
+
344
+ Clear the update cache so statusline indicator disappears:
345
+
346
+ ```bash
347
+ expand_home() {
348
+ case "$1" in
349
+ "~/"*) printf '%s/%s\n' "$HOME" "${1#~/}" ;;
350
+ *) printf '%s\n' "$1" ;;
351
+ esac
352
+ }
353
+
354
+ # Clear update cache across preferred, env-derived, and default runtime directories
355
+ CACHE_DIRS=()
356
+ if [ -n "$PREFERRED_CONFIG_DIR" ]; then
357
+ CACHE_DIRS+=( "$(expand_home "$PREFERRED_CONFIG_DIR")" )
358
+ fi
359
+ if [ -n "$CLAUDE_CONFIG_DIR" ]; then
360
+ CACHE_DIRS+=( "$(expand_home "$CLAUDE_CONFIG_DIR")" )
361
+ fi
362
+ if [ -n "$GEMINI_CONFIG_DIR" ]; then
363
+ CACHE_DIRS+=( "$(expand_home "$GEMINI_CONFIG_DIR")" )
364
+ fi
365
+ if [ -n "$KILO_CONFIG_DIR" ]; then
366
+ CACHE_DIRS+=( "$(expand_home "$KILO_CONFIG_DIR")" )
367
+ elif [ -n "$KILO_CONFIG" ]; then
368
+ CACHE_DIRS+=( "$(dirname "$(expand_home "$KILO_CONFIG")")" )
369
+ elif [ -n "$XDG_CONFIG_HOME" ]; then
370
+ CACHE_DIRS+=( "$(expand_home "$XDG_CONFIG_HOME")/kilo" )
371
+ fi
372
+ if [ -n "$OPENCODE_CONFIG_DIR" ]; then
373
+ CACHE_DIRS+=( "$(expand_home "$OPENCODE_CONFIG_DIR")" )
374
+ elif [ -n "$OPENCODE_CONFIG" ]; then
375
+ CACHE_DIRS+=( "$(dirname "$(expand_home "$OPENCODE_CONFIG")")" )
376
+ elif [ -n "$XDG_CONFIG_HOME" ]; then
377
+ CACHE_DIRS+=( "$(expand_home "$XDG_CONFIG_HOME")/opencode" )
378
+ fi
379
+ if [ -n "$CODEX_HOME" ]; then
380
+ CACHE_DIRS+=( "$(expand_home "$CODEX_HOME")" )
381
+ fi
382
+
383
+ for dir in "${CACHE_DIRS[@]}"; do
384
+ if [ -n "$dir" ]; then
385
+ rm -f "$dir/cache/gsd-update-check.json"
386
+ fi
387
+ done
388
+
389
+ for dir in .claude .config/opencode .opencode .gemini/antigravity-ide .gemini/antigravity-cli .gemini/antigravity .agent .gemini .config/kilo .kilo .codex; do
390
+ rm -f "./$dir/cache/gsd-update-check.json"
391
+ rm -f "$HOME/$dir/cache/gsd-update-check.json"
392
+ done
393
+
394
+ # Clear the shared tool-agnostic cache written by gsd-check-update.js hook (#2784).
395
+ # The hook uses ~/.cache/gsd/gsd-update-check.json regardless of runtime; clear it
396
+ # so the statusline stops showing the stale "⬆ /gsd:update" indicator after update.
397
+ rm -f "$HOME/.cache/gsd/gsd-update-check.json"
398
+ ```
399
+
400
+ The SessionStart hook (`gsd-check-update.js`) writes to the detected runtime's cache directory, so preferred/env-derived paths and default paths must all be cleared to prevent stale update indicators.
401
+ </step>
402
+
403
+ <step name="display_result">
404
+ Format completion message (changelog was already shown in confirmation step):
405
+
406
+ ```
407
+ ╔═══════════════════════════════════════════════════════════╗
408
+ ║ GSD Updated: v1.5.10 → v1.5.15 ║
409
+ ╚═══════════════════════════════════════════════════════════╝
410
+
411
+ ⚠️ Restart your runtime to pick up the new commands.
412
+
413
+ [View full changelog](https://github.com/open-gsd/gsd-core/blob/main/CHANGELOG.md)
414
+ ```
415
+ </step>
416
+
417
+
418
+ <step name="check_local_patches">
419
+ After update completes, check if the installer detected and backed up any locally modified files:
420
+
421
+ Check for gsd-local-patches/backup-meta.json in the config directory.
422
+
423
+ **If patches found:**
424
+
425
+ ```
426
+ Local patches were backed up before the update.
427
+ Run `/gsd:update --reapply` to merge your modifications into the new version.
428
+ ```
429
+
430
+ **If no patches:** Continue normally.
431
+ </step>
432
+ </process>
433
+
434
+ <success_criteria>
435
+ - [ ] Installed version read correctly
436
+ - [ ] Latest version checked via npm
437
+ - [ ] Update skipped if already current
438
+ - [ ] Changelog fetched and displayed BEFORE update
439
+ - [ ] Clean install warning shown
440
+ - [ ] User confirmation obtained
441
+ - [ ] Update executed successfully
442
+ - [ ] Restart reminder shown
443
+ </success_criteria>
@@ -0,0 +1,179 @@
1
+ <purpose>
2
+ Audit Nyquist validation gaps for a completed phase. Generate missing tests. Update VALIDATION.md.
3
+ </purpose>
4
+
5
+ <required_reading>
6
+ @~/.claude/get-shit-done/references/ui-brand.md
7
+ </required_reading>
8
+
9
+ <available_agent_types>
10
+ Valid GSD subagent types (use exact names — do not fall back to 'general-purpose'):
11
+ - gsd-nyquist-auditor — Validates verification coverage
12
+ </available_agent_types>
13
+
14
+ <process>
15
+
16
+ ## 0. Initialize
17
+
18
+ ```bash
19
+ _GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/get-shit-done/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/get-shit-done/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/get-shit-done/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/get-shit-done/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/get-shit-done/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi
20
+ INIT=$(gsd_run query init.phase-op "${PHASE_ARG}")
21
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
22
+ AGENT_SKILLS_AUDITOR=$(gsd_run query agent-skills gsd-nyquist-auditor)
23
+ ```
24
+
25
+ Parse: `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `padded_phase`.
26
+
27
+ ```bash
28
+ AUDITOR_MODEL=$(gsd_run query resolve-model gsd-nyquist-auditor --raw)
29
+ NYQUIST_CFG=$(gsd_run query config-get workflow.nyquist_validation --raw --default true)
30
+ ```
31
+
32
+ If `NYQUIST_CFG` is `false`: exit with "Nyquist validation is disabled. Enable via /gsd:settings."
33
+
34
+ Display banner: `GSD > VALIDATE PHASE {N}: {name}`
35
+
36
+ ## 1. Detect Input State
37
+
38
+ ```bash
39
+ VALIDATION_FILE=$(ls "${PHASE_DIR}"/*-VALIDATION.md 2>/dev/null | head -1)
40
+ SUMMARY_FILES=$(ls "${PHASE_DIR}"/*-SUMMARY.md 2>/dev/null)
41
+ ```
42
+
43
+ - **State A** (`VALIDATION_FILE` non-empty): Audit existing
44
+ - **State B** (`VALIDATION_FILE` empty, `SUMMARY_FILES` non-empty): Reconstruct from artifacts
45
+ - **State C** (`SUMMARY_FILES` empty): Exit — "Phase {N} not executed. Run /gsd:execute-phase {N} ${GSD_WS} first."
46
+
47
+ ## 2. Discovery
48
+
49
+ ### 2a. Read Phase Artifacts
50
+
51
+ Read all PLAN and SUMMARY files. Extract: task lists, requirement IDs, key-files changed, verify blocks.
52
+
53
+ ### 2b. Build Requirement-to-Task Map
54
+
55
+ Per task: `{ task_id, plan_id, wave, requirement_ids, has_automated_command }`
56
+
57
+ ### 2c. Detect Test Infrastructure
58
+
59
+ State A: Parse from existing VALIDATION.md Test Infrastructure table.
60
+ State B: Filesystem scan:
61
+
62
+ ```bash
63
+ find . -name "pytest.ini" -o -name "jest.config.*" -o -name "vitest.config.*" -o -name "pyproject.toml" 2>/dev/null | head -10
64
+ find . \( -name "*.test.*" -o -name "*.spec.*" -o -name "test_*" \) -not -path "*/node_modules/*" 2>/dev/null | head -40
65
+ ```
66
+
67
+ ### 2d. Cross-Reference
68
+
69
+ Match each requirement to existing tests by filename, imports, test descriptions. Record: requirement → test_file → status.
70
+
71
+ ## 3. Gap Analysis
72
+
73
+ Classify each requirement:
74
+
75
+ | Status | Criteria |
76
+ |--------|----------|
77
+ | COVERED | Test exists, targets behavior, runs green |
78
+ | PARTIAL | Test exists, failing or incomplete |
79
+ | MISSING | No test found |
80
+
81
+ Build: `{ task_id, requirement, gap_type, suggested_test_path, suggested_command }`
82
+
83
+ No gaps → skip to Step 6, set `nyquist_compliant: true`.
84
+
85
+ ## 4. Present Gap Plan
86
+
87
+
88
+ **Text mode (`workflow.text_mode: true` in config or `--text` flag):** Set `TEXT_MODE=true` if `--text` is present in `$ARGUMENTS` OR `text_mode` from init JSON is `true`. When TEXT_MODE is active, replace every `AskUserQuestion` call with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where `AskUserQuestion` is not available.
89
+ Call AskUserQuestion with gap table and options:
90
+ 1. "Fix all gaps" → Step 5
91
+ 2. "Skip — mark manual-only" → add to Manual-Only, Step 6
92
+ 3. "Cancel" → exit
93
+
94
+ ## 5. Spawn gsd-nyquist-auditor
95
+
96
+ ```
97
+ Agent(
98
+ prompt="Read ~/.claude/agents/gsd-nyquist-auditor.md for instructions.\n\n" +
99
+ "<files_to_read>{PLAN, SUMMARY, impl files, VALIDATION.md}</files_to_read>" +
100
+ "<gaps>{gap list}</gaps>" +
101
+ "<test_infrastructure>{framework, config, commands}</test_infrastructure>" +
102
+ "<constraints>Never modify impl files. Max 3 debug iterations. Escalate impl bugs.</constraints>" +
103
+ "${AGENT_SKILLS_AUDITOR}",
104
+ subagent_type="gsd-nyquist-auditor",
105
+ model="{AUDITOR_MODEL}",
106
+ description="Fill validation gaps for Phase {N}"
107
+ )
108
+ ```
109
+
110
+ > **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
111
+
112
+ Handle return:
113
+ - `## GAPS FILLED` → record tests + map updates, Step 6
114
+ - `## PARTIAL` → record resolved, move escalated to manual-only, Step 6
115
+ - `## ESCALATE` → move all to manual-only, Step 6
116
+
117
+ ## 6. Generate/Update VALIDATION.md
118
+
119
+ **State B (create):**
120
+ 1. Read template from `~/.claude/get-shit-done/templates/VALIDATION.md`
121
+ 2. Fill: frontmatter, Test Infrastructure, Per-Task Map, Manual-Only, Sign-Off
122
+ 3. Write to `${PHASE_DIR}/${PADDED_PHASE}-VALIDATION.md`
123
+
124
+ **State A (update):**
125
+ 1. Update Per-Task Map statuses, add escalated to Manual-Only, update frontmatter
126
+ 2. Append audit trail:
127
+
128
+ ```markdown
129
+ ## Validation Audit {date}
130
+ | Metric | Count |
131
+ |--------|-------|
132
+ | Gaps found | {N} |
133
+ | Resolved | {M} |
134
+ | Escalated | {K} |
135
+ ```
136
+
137
+ ## 7. Commit
138
+
139
+ ```bash
140
+ git add {test_files}
141
+ git commit -m "test(phase-${PHASE}): add Nyquist validation tests"
142
+
143
+ gsd_run query commit "docs(phase-${PHASE}): add/update validation strategy"
144
+ ```
145
+
146
+ ## 8. Results + Routing
147
+
148
+ **Compliant:**
149
+ ```
150
+ GSD > PHASE {N} IS NYQUIST-COMPLIANT
151
+ All requirements have automated verification.
152
+ ▶ Next: /gsd:audit-milestone ${GSD_WS}
153
+ ```
154
+
155
+ **Partial:**
156
+ ```
157
+ GSD > PHASE {N} VALIDATED (PARTIAL)
158
+ {M} automated, {K} manual-only.
159
+ ▶ Retry: /gsd:validate-phase {N} ${GSD_WS}
160
+ ```
161
+
162
+ Display `/clear` reminder.
163
+
164
+ </process>
165
+
166
+ <success_criteria>
167
+ - [ ] Nyquist config checked (exit if disabled)
168
+ - [ ] Input state detected (A/B/C)
169
+ - [ ] State C exits cleanly
170
+ - [ ] PLAN/SUMMARY files read, requirement map built
171
+ - [ ] Test infrastructure detected
172
+ - [ ] Gaps classified (COVERED/PARTIAL/MISSING)
173
+ - [ ] User gate with gap table
174
+ - [ ] Auditor spawned with complete context
175
+ - [ ] All three return formats handled
176
+ - [ ] VALIDATION.md created or updated
177
+ - [ ] Test files committed separately
178
+ - [ ] Results with routing presented
179
+ </success_criteria>