gsd-remix 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +939 -0
  3. package/README.zh-CN.md +876 -0
  4. package/agents/gsd-advisor-researcher.md +127 -0
  5. package/agents/gsd-ai-researcher.md +133 -0
  6. package/agents/gsd-assumptions-analyzer.md +105 -0
  7. package/agents/gsd-code-fixer.md +517 -0
  8. package/agents/gsd-code-reviewer.md +371 -0
  9. package/agents/gsd-codebase-mapper.md +781 -0
  10. package/agents/gsd-debug-session-manager.md +314 -0
  11. package/agents/gsd-debugger.md +1452 -0
  12. package/agents/gsd-doc-classifier.md +168 -0
  13. package/agents/gsd-doc-synthesizer.md +204 -0
  14. package/agents/gsd-doc-verifier.md +217 -0
  15. package/agents/gsd-doc-writer.md +615 -0
  16. package/agents/gsd-domain-researcher.md +153 -0
  17. package/agents/gsd-eval-auditor.md +191 -0
  18. package/agents/gsd-eval-planner.md +154 -0
  19. package/agents/gsd-executor.md +603 -0
  20. package/agents/gsd-framework-selector.md +160 -0
  21. package/agents/gsd-integration-checker.md +470 -0
  22. package/agents/gsd-intel-updater.md +334 -0
  23. package/agents/gsd-nyquist-auditor.md +203 -0
  24. package/agents/gsd-pattern-mapper.md +335 -0
  25. package/agents/gsd-phase-researcher.md +841 -0
  26. package/agents/gsd-plan-checker.md +978 -0
  27. package/agents/gsd-planner.md +1251 -0
  28. package/agents/gsd-project-researcher.md +677 -0
  29. package/agents/gsd-research-synthesizer.md +247 -0
  30. package/agents/gsd-roadmapper.md +688 -0
  31. package/agents/gsd-security-auditor.md +155 -0
  32. package/agents/gsd-ui-auditor.md +495 -0
  33. package/agents/gsd-ui-checker.md +309 -0
  34. package/agents/gsd-ui-researcher.md +380 -0
  35. package/agents/gsd-user-profiler.md +171 -0
  36. package/agents/gsd-verifier.md +830 -0
  37. package/bin/install.js +7062 -0
  38. package/commands/gsd/add-backlog.md +79 -0
  39. package/commands/gsd/add-phase.md +43 -0
  40. package/commands/gsd/add-tests.md +41 -0
  41. package/commands/gsd/add-todo.md +47 -0
  42. package/commands/gsd/ai-integration-phase.md +36 -0
  43. package/commands/gsd/analyze-dependencies.md +34 -0
  44. package/commands/gsd/audit-fix.md +33 -0
  45. package/commands/gsd/audit-milestone.md +36 -0
  46. package/commands/gsd/audit-uat.md +24 -0
  47. package/commands/gsd/autonomous.md +46 -0
  48. package/commands/gsd/check-todos.md +45 -0
  49. package/commands/gsd/cleanup.md +23 -0
  50. package/commands/gsd/code-review-fix.md +52 -0
  51. package/commands/gsd/code-review.md +55 -0
  52. package/commands/gsd/complete-milestone.md +136 -0
  53. package/commands/gsd/debug.md +263 -0
  54. package/commands/gsd/discuss-phase.md +69 -0
  55. package/commands/gsd/do.md +30 -0
  56. package/commands/gsd/docs-update.md +48 -0
  57. package/commands/gsd/eval-review.md +32 -0
  58. package/commands/gsd/execute-phase.md +63 -0
  59. package/commands/gsd/explore.md +27 -0
  60. package/commands/gsd/extract_learnings.md +22 -0
  61. package/commands/gsd/fast.md +30 -0
  62. package/commands/gsd/forensics.md +56 -0
  63. package/commands/gsd/from-gsd2.md +47 -0
  64. package/commands/gsd/graphify.md +201 -0
  65. package/commands/gsd/health.md +22 -0
  66. package/commands/gsd/help.md +24 -0
  67. package/commands/gsd/import.md +37 -0
  68. package/commands/gsd/inbox.md +38 -0
  69. package/commands/gsd/ingest-docs.md +42 -0
  70. package/commands/gsd/insert-phase.md +32 -0
  71. package/commands/gsd/intel.md +179 -0
  72. package/commands/gsd/join-discord.md +19 -0
  73. package/commands/gsd/list-phase-assumptions.md +46 -0
  74. package/commands/gsd/list-workspaces.md +19 -0
  75. package/commands/gsd/manager.md +40 -0
  76. package/commands/gsd/map-codebase.md +71 -0
  77. package/commands/gsd/milestone-summary.md +51 -0
  78. package/commands/gsd/new-milestone.md +44 -0
  79. package/commands/gsd/new-project.md +46 -0
  80. package/commands/gsd/new-workspace.md +44 -0
  81. package/commands/gsd/next.md +28 -0
  82. package/commands/gsd/note.md +34 -0
  83. package/commands/gsd/pause-work.md +38 -0
  84. package/commands/gsd/plan-milestone-gaps.md +34 -0
  85. package/commands/gsd/plan-phase.md +52 -0
  86. package/commands/gsd/plan-review-convergence.md +52 -0
  87. package/commands/gsd/plant-seed.md +28 -0
  88. package/commands/gsd/pr-branch.md +25 -0
  89. package/commands/gsd/profile-user.md +46 -0
  90. package/commands/gsd/progress.md +25 -0
  91. package/commands/gsd/quick.md +173 -0
  92. package/commands/gsd/reapply-patches.md +331 -0
  93. package/commands/gsd/remove-phase.md +31 -0
  94. package/commands/gsd/remove-workspace.md +26 -0
  95. package/commands/gsd/research-phase.md +195 -0
  96. package/commands/gsd/resume-work.md +40 -0
  97. package/commands/gsd/review-backlog.md +62 -0
  98. package/commands/gsd/review.md +40 -0
  99. package/commands/gsd/scan.md +26 -0
  100. package/commands/gsd/secure-phase.md +35 -0
  101. package/commands/gsd/session-report.md +19 -0
  102. package/commands/gsd/set-profile.md +12 -0
  103. package/commands/gsd/settings.md +36 -0
  104. package/commands/gsd/ship.md +23 -0
  105. package/commands/gsd/sketch-wrap-up.md +31 -0
  106. package/commands/gsd/sketch.md +49 -0
  107. package/commands/gsd/spec-phase.md +62 -0
  108. package/commands/gsd/spike-wrap-up.md +31 -0
  109. package/commands/gsd/spike.md +46 -0
  110. package/commands/gsd/stats.md +18 -0
  111. package/commands/gsd/sync-skills.md +19 -0
  112. package/commands/gsd/thread.md +227 -0
  113. package/commands/gsd/ui-phase.md +34 -0
  114. package/commands/gsd/ui-review.md +32 -0
  115. package/commands/gsd/ultraplan-phase.md +33 -0
  116. package/commands/gsd/undo.md +34 -0
  117. package/commands/gsd/update.md +37 -0
  118. package/commands/gsd/validate-phase.md +35 -0
  119. package/commands/gsd/verify-work.md +38 -0
  120. package/commands/gsd/workstreams.md +69 -0
  121. package/get-shit-done/bin/gsd-tools.cjs +1263 -0
  122. package/get-shit-done/bin/lib/artifacts.cjs +52 -0
  123. package/get-shit-done/bin/lib/audit.cjs +757 -0
  124. package/get-shit-done/bin/lib/commands.cjs +1023 -0
  125. package/get-shit-done/bin/lib/config-schema.cjs +79 -0
  126. package/get-shit-done/bin/lib/config.cjs +463 -0
  127. package/get-shit-done/bin/lib/core.cjs +1794 -0
  128. package/get-shit-done/bin/lib/docs.cjs +267 -0
  129. package/get-shit-done/bin/lib/frontmatter.cjs +379 -0
  130. package/get-shit-done/bin/lib/graphify.cjs +494 -0
  131. package/get-shit-done/bin/lib/gsd2-import.cjs +511 -0
  132. package/get-shit-done/bin/lib/init.cjs +1878 -0
  133. package/get-shit-done/bin/lib/intel.cjs +639 -0
  134. package/get-shit-done/bin/lib/learnings.cjs +378 -0
  135. package/get-shit-done/bin/lib/milestone.cjs +283 -0
  136. package/get-shit-done/bin/lib/model-profiles.cjs +71 -0
  137. package/get-shit-done/bin/lib/phase.cjs +1058 -0
  138. package/get-shit-done/bin/lib/profile-output.cjs +1080 -0
  139. package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
  140. package/get-shit-done/bin/lib/roadmap.cjs +523 -0
  141. package/get-shit-done/bin/lib/schema-detect.cjs +238 -0
  142. package/get-shit-done/bin/lib/security.cjs +504 -0
  143. package/get-shit-done/bin/lib/state.cjs +1649 -0
  144. package/get-shit-done/bin/lib/template.cjs +226 -0
  145. package/get-shit-done/bin/lib/uat.cjs +288 -0
  146. package/get-shit-done/bin/lib/verify.cjs +1184 -0
  147. package/get-shit-done/bin/lib/workstream.cjs +495 -0
  148. package/get-shit-done/bin/repair-sdk.cjs +177 -0
  149. package/get-shit-done/contexts/dev.md +21 -0
  150. package/get-shit-done/contexts/research.md +22 -0
  151. package/get-shit-done/contexts/review.md +22 -0
  152. package/get-shit-done/references/agent-contracts.md +79 -0
  153. package/get-shit-done/references/ai-evals.md +156 -0
  154. package/get-shit-done/references/ai-frameworks.md +186 -0
  155. package/get-shit-done/references/artifact-types.md +131 -0
  156. package/get-shit-done/references/autonomous-smart-discuss.md +277 -0
  157. package/get-shit-done/references/checkpoints.md +808 -0
  158. package/get-shit-done/references/common-bug-patterns.md +114 -0
  159. package/get-shit-done/references/context-budget.md +49 -0
  160. package/get-shit-done/references/continuation-format.md +253 -0
  161. package/get-shit-done/references/debugger-philosophy.md +76 -0
  162. package/get-shit-done/references/decimal-phase-calculation.md +64 -0
  163. package/get-shit-done/references/doc-conflict-engine.md +91 -0
  164. package/get-shit-done/references/domain-probes.md +125 -0
  165. package/get-shit-done/references/executor-examples.md +110 -0
  166. package/get-shit-done/references/few-shot-examples/plan-checker.md +73 -0
  167. package/get-shit-done/references/few-shot-examples/verifier.md +109 -0
  168. package/get-shit-done/references/gate-prompts.md +100 -0
  169. package/get-shit-done/references/gates.md +70 -0
  170. package/get-shit-done/references/git-integration.md +295 -0
  171. package/get-shit-done/references/git-planning-commit.md +40 -0
  172. package/get-shit-done/references/ios-scaffold.md +123 -0
  173. package/get-shit-done/references/mandatory-initial-read.md +2 -0
  174. package/get-shit-done/references/model-profile-resolution.md +38 -0
  175. package/get-shit-done/references/model-profiles.md +145 -0
  176. package/get-shit-done/references/phase-argument-parsing.md +61 -0
  177. package/get-shit-done/references/planner-antipatterns.md +89 -0
  178. package/get-shit-done/references/planner-gap-closure.md +62 -0
  179. package/get-shit-done/references/planner-reviews.md +39 -0
  180. package/get-shit-done/references/planner-revision.md +87 -0
  181. package/get-shit-done/references/planner-source-audit.md +73 -0
  182. package/get-shit-done/references/planning-config.md +460 -0
  183. package/get-shit-done/references/project-skills-discovery.md +19 -0
  184. package/get-shit-done/references/questioning.md +162 -0
  185. package/get-shit-done/references/revision-loop.md +97 -0
  186. package/get-shit-done/references/sketch-interactivity.md +41 -0
  187. package/get-shit-done/references/sketch-theme-system.md +94 -0
  188. package/get-shit-done/references/sketch-tooling.md +45 -0
  189. package/get-shit-done/references/sketch-variant-patterns.md +81 -0
  190. package/get-shit-done/references/tdd.md +330 -0
  191. package/get-shit-done/references/thinking-models-debug.md +44 -0
  192. package/get-shit-done/references/thinking-models-execution.md +50 -0
  193. package/get-shit-done/references/thinking-models-planning.md +62 -0
  194. package/get-shit-done/references/thinking-models-research.md +50 -0
  195. package/get-shit-done/references/thinking-models-verification.md +55 -0
  196. package/get-shit-done/references/thinking-partner.md +96 -0
  197. package/get-shit-done/references/ui-brand.md +160 -0
  198. package/get-shit-done/references/universal-anti-patterns.md +63 -0
  199. package/get-shit-done/references/user-profiling.md +681 -0
  200. package/get-shit-done/references/verification-overrides.md +227 -0
  201. package/get-shit-done/references/verification-patterns.md +612 -0
  202. package/get-shit-done/references/workstream-flag.md +111 -0
  203. package/get-shit-done/templates/AI-SPEC.md +246 -0
  204. package/get-shit-done/templates/DEBUG.md +169 -0
  205. package/get-shit-done/templates/README.md +76 -0
  206. package/get-shit-done/templates/SECURITY.md +61 -0
  207. package/get-shit-done/templates/UAT.md +265 -0
  208. package/get-shit-done/templates/UI-SPEC.md +100 -0
  209. package/get-shit-done/templates/VALIDATION.md +76 -0
  210. package/get-shit-done/templates/claude-md.md +145 -0
  211. package/get-shit-done/templates/codebase/architecture.md +255 -0
  212. package/get-shit-done/templates/codebase/concerns.md +310 -0
  213. package/get-shit-done/templates/codebase/conventions.md +307 -0
  214. package/get-shit-done/templates/codebase/integrations.md +280 -0
  215. package/get-shit-done/templates/codebase/stack.md +186 -0
  216. package/get-shit-done/templates/codebase/structure.md +285 -0
  217. package/get-shit-done/templates/codebase/testing.md +480 -0
  218. package/get-shit-done/templates/config.json +56 -0
  219. package/get-shit-done/templates/context.md +352 -0
  220. package/get-shit-done/templates/continue-here.md +78 -0
  221. package/get-shit-done/templates/copilot-instructions.md +7 -0
  222. package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
  223. package/get-shit-done/templates/dev-preferences.md +21 -0
  224. package/get-shit-done/templates/discovery.md +146 -0
  225. package/get-shit-done/templates/discussion-log.md +63 -0
  226. package/get-shit-done/templates/milestone-archive.md +123 -0
  227. package/get-shit-done/templates/milestone.md +115 -0
  228. package/get-shit-done/templates/phase-prompt.md +610 -0
  229. package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
  230. package/get-shit-done/templates/project.md +186 -0
  231. package/get-shit-done/templates/requirements.md +231 -0
  232. package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
  233. package/get-shit-done/templates/research-project/FEATURES.md +147 -0
  234. package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
  235. package/get-shit-done/templates/research-project/STACK.md +120 -0
  236. package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
  237. package/get-shit-done/templates/research.md +592 -0
  238. package/get-shit-done/templates/retrospective.md +54 -0
  239. package/get-shit-done/templates/roadmap.md +202 -0
  240. package/get-shit-done/templates/spec.md +307 -0
  241. package/get-shit-done/templates/state.md +184 -0
  242. package/get-shit-done/templates/summary-complex.md +59 -0
  243. package/get-shit-done/templates/summary-minimal.md +41 -0
  244. package/get-shit-done/templates/summary-standard.md +48 -0
  245. package/get-shit-done/templates/summary.md +248 -0
  246. package/get-shit-done/templates/user-profile.md +146 -0
  247. package/get-shit-done/templates/user-setup.md +311 -0
  248. package/get-shit-done/templates/verification-report.md +322 -0
  249. package/get-shit-done/workflows/add-phase.md +112 -0
  250. package/get-shit-done/workflows/add-tests.md +354 -0
  251. package/get-shit-done/workflows/add-todo.md +160 -0
  252. package/get-shit-done/workflows/ai-integration-phase.md +284 -0
  253. package/get-shit-done/workflows/analyze-dependencies.md +96 -0
  254. package/get-shit-done/workflows/audit-fix.md +175 -0
  255. package/get-shit-done/workflows/audit-milestone.md +340 -0
  256. package/get-shit-done/workflows/audit-uat.md +109 -0
  257. package/get-shit-done/workflows/autonomous.md +789 -0
  258. package/get-shit-done/workflows/check-todos.md +179 -0
  259. package/get-shit-done/workflows/cleanup.md +154 -0
  260. package/get-shit-done/workflows/code-review-fix.md +497 -0
  261. package/get-shit-done/workflows/code-review.md +515 -0
  262. package/get-shit-done/workflows/complete-milestone.md +847 -0
  263. package/get-shit-done/workflows/diagnose-issues.md +238 -0
  264. package/get-shit-done/workflows/discovery-phase.md +291 -0
  265. package/get-shit-done/workflows/discuss-phase-assumptions.md +670 -0
  266. package/get-shit-done/workflows/discuss-phase-power.md +308 -0
  267. package/get-shit-done/workflows/discuss-phase.md +1378 -0
  268. package/get-shit-done/workflows/do.md +110 -0
  269. package/get-shit-done/workflows/docs-update.md +1155 -0
  270. package/get-shit-done/workflows/eval-review.md +155 -0
  271. package/get-shit-done/workflows/execute-phase.md +1677 -0
  272. package/get-shit-done/workflows/execute-plan.md +533 -0
  273. package/get-shit-done/workflows/explore.md +141 -0
  274. package/get-shit-done/workflows/extract_learnings.md +242 -0
  275. package/get-shit-done/workflows/fast.md +105 -0
  276. package/get-shit-done/workflows/forensics.md +265 -0
  277. package/get-shit-done/workflows/graduation.md +195 -0
  278. package/get-shit-done/workflows/health.md +314 -0
  279. package/get-shit-done/workflows/help.md +667 -0
  280. package/get-shit-done/workflows/import.md +246 -0
  281. package/get-shit-done/workflows/inbox.md +387 -0
  282. package/get-shit-done/workflows/ingest-docs.md +328 -0
  283. package/get-shit-done/workflows/insert-phase.md +130 -0
  284. package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
  285. package/get-shit-done/workflows/list-workspaces.md +56 -0
  286. package/get-shit-done/workflows/manager.md +365 -0
  287. package/get-shit-done/workflows/map-codebase.md +393 -0
  288. package/get-shit-done/workflows/milestone-summary.md +223 -0
  289. package/get-shit-done/workflows/new-milestone.md +611 -0
  290. package/get-shit-done/workflows/new-project.md +1391 -0
  291. package/get-shit-done/workflows/new-workspace.md +239 -0
  292. package/get-shit-done/workflows/next.md +220 -0
  293. package/get-shit-done/workflows/node-repair.md +92 -0
  294. package/get-shit-done/workflows/note.md +158 -0
  295. package/get-shit-done/workflows/pause-work.md +243 -0
  296. package/get-shit-done/workflows/plan-milestone-gaps.md +273 -0
  297. package/get-shit-done/workflows/plan-phase.md +1349 -0
  298. package/get-shit-done/workflows/plan-review-convergence.md +254 -0
  299. package/get-shit-done/workflows/plant-seed.md +172 -0
  300. package/get-shit-done/workflows/pr-branch.md +157 -0
  301. package/get-shit-done/workflows/profile-user.md +452 -0
  302. package/get-shit-done/workflows/progress.md +619 -0
  303. package/get-shit-done/workflows/quick.md +970 -0
  304. package/get-shit-done/workflows/remove-phase.md +155 -0
  305. package/get-shit-done/workflows/remove-workspace.md +92 -0
  306. package/get-shit-done/workflows/research-phase.md +89 -0
  307. package/get-shit-done/workflows/resume-project.md +326 -0
  308. package/get-shit-done/workflows/review.md +344 -0
  309. package/get-shit-done/workflows/scan.md +102 -0
  310. package/get-shit-done/workflows/secure-phase.md +166 -0
  311. package/get-shit-done/workflows/session-report.md +146 -0
  312. package/get-shit-done/workflows/settings.md +319 -0
  313. package/get-shit-done/workflows/ship.md +302 -0
  314. package/get-shit-done/workflows/sketch-wrap-up.md +283 -0
  315. package/get-shit-done/workflows/sketch.md +286 -0
  316. package/get-shit-done/workflows/spec-phase.md +262 -0
  317. package/get-shit-done/workflows/spike-wrap-up.md +281 -0
  318. package/get-shit-done/workflows/spike.md +362 -0
  319. package/get-shit-done/workflows/stats.md +60 -0
  320. package/get-shit-done/workflows/sync-skills.md +182 -0
  321. package/get-shit-done/workflows/transition.md +693 -0
  322. package/get-shit-done/workflows/ui-phase.md +323 -0
  323. package/get-shit-done/workflows/ui-review.md +190 -0
  324. package/get-shit-done/workflows/ultraplan-phase.md +189 -0
  325. package/get-shit-done/workflows/undo.md +314 -0
  326. package/get-shit-done/workflows/update.md +587 -0
  327. package/get-shit-done/workflows/validate-phase.md +176 -0
  328. package/get-shit-done/workflows/verify-phase.md +465 -0
  329. package/get-shit-done/workflows/verify-work.md +740 -0
  330. package/hooks/dist/gsd-check-update-worker.js +108 -0
  331. package/hooks/dist/gsd-check-update.js +64 -0
  332. package/hooks/dist/gsd-context-monitor.js +192 -0
  333. package/hooks/dist/gsd-phase-boundary.sh +28 -0
  334. package/hooks/dist/gsd-prompt-guard.js +97 -0
  335. package/hooks/dist/gsd-read-guard.js +82 -0
  336. package/hooks/dist/gsd-read-injection-scanner.js +152 -0
  337. package/hooks/dist/gsd-session-state.sh +34 -0
  338. package/hooks/dist/gsd-statusline.js +293 -0
  339. package/hooks/dist/gsd-validate-commit.sh +48 -0
  340. package/hooks/dist/gsd-workflow-guard.js +94 -0
  341. package/hooks/gsd-check-update-worker.js +108 -0
  342. package/hooks/gsd-check-update.js +64 -0
  343. package/hooks/gsd-context-monitor.js +192 -0
  344. package/hooks/gsd-phase-boundary.sh +28 -0
  345. package/hooks/gsd-prompt-guard.js +97 -0
  346. package/hooks/gsd-read-guard.js +82 -0
  347. package/hooks/gsd-read-injection-scanner.js +152 -0
  348. package/hooks/gsd-session-state.sh +34 -0
  349. package/hooks/gsd-statusline.js +293 -0
  350. package/hooks/gsd-validate-commit.sh +48 -0
  351. package/hooks/gsd-workflow-guard.js +94 -0
  352. package/package.json +59 -0
  353. package/scripts/base64-scan.sh +262 -0
  354. package/scripts/build-hooks.js +95 -0
  355. package/scripts/gen-inventory-manifest.cjs +109 -0
  356. package/scripts/prompt-injection-scan.sh +201 -0
  357. package/scripts/run-tests.cjs +33 -0
  358. package/scripts/secret-scan.sh +227 -0
  359. package/sdk/package-lock.json +1998 -0
  360. package/sdk/package.json +52 -0
  361. package/sdk/prompts/agents/gsd-executor.md +110 -0
  362. package/sdk/prompts/agents/gsd-phase-researcher.md +158 -0
  363. package/sdk/prompts/agents/gsd-plan-checker.md +160 -0
  364. package/sdk/prompts/agents/gsd-planner.md +214 -0
  365. package/sdk/prompts/agents/gsd-project-researcher.md +323 -0
  366. package/sdk/prompts/agents/gsd-research-synthesizer.md +237 -0
  367. package/sdk/prompts/agents/gsd-roadmapper.md +670 -0
  368. package/sdk/prompts/agents/gsd-verifier.md +159 -0
  369. package/sdk/prompts/templates/project.md +186 -0
  370. package/sdk/prompts/templates/requirements.md +231 -0
  371. package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
  372. package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
  373. package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
  374. package/sdk/prompts/templates/research-project/STACK.md +120 -0
  375. package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
  376. package/sdk/prompts/templates/roadmap.md +202 -0
  377. package/sdk/prompts/templates/state.md +175 -0
  378. package/sdk/prompts/workflows/discuss-phase.md +126 -0
  379. package/sdk/prompts/workflows/execute-plan.md +106 -0
  380. package/sdk/prompts/workflows/plan-phase.md +84 -0
  381. package/sdk/prompts/workflows/research-phase.md +45 -0
  382. package/sdk/prompts/workflows/verify-phase.md +142 -0
  383. package/sdk/src/assembled-prompts.test.ts +349 -0
  384. package/sdk/src/cli-transport.test.ts +388 -0
  385. package/sdk/src/cli-transport.ts +130 -0
  386. package/sdk/src/cli.test.ts +383 -0
  387. package/sdk/src/cli.ts +670 -0
  388. package/sdk/src/config.test.ts +168 -0
  389. package/sdk/src/config.ts +177 -0
  390. package/sdk/src/context-engine.test.ts +295 -0
  391. package/sdk/src/context-engine.ts +170 -0
  392. package/sdk/src/context-truncation.test.ts +163 -0
  393. package/sdk/src/context-truncation.ts +233 -0
  394. package/sdk/src/e2e.integration.test.ts +178 -0
  395. package/sdk/src/errors.ts +72 -0
  396. package/sdk/src/event-stream.test.ts +661 -0
  397. package/sdk/src/event-stream.ts +441 -0
  398. package/sdk/src/failure-memory.test.ts +457 -0
  399. package/sdk/src/failure-memory.ts +1324 -0
  400. package/sdk/src/golden/capture.ts +95 -0
  401. package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
  402. package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
  403. package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
  404. package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
  405. package/sdk/src/golden/golden-integration-covered.ts +30 -0
  406. package/sdk/src/golden/golden-mutation-covered.ts +7 -0
  407. package/sdk/src/golden/golden-policy.test.ts +8 -0
  408. package/sdk/src/golden/golden-policy.ts +112 -0
  409. package/sdk/src/golden/golden.integration.test.ts +373 -0
  410. package/sdk/src/golden/init-golden-normalize.ts +15 -0
  411. package/sdk/src/golden/read-only-golden-rows.ts +77 -0
  412. package/sdk/src/golden/read-only-parity.integration.test.ts +125 -0
  413. package/sdk/src/golden/registry-canonical-commands.ts +31 -0
  414. package/sdk/src/gsd-tools.test.ts +409 -0
  415. package/sdk/src/gsd-tools.ts +595 -0
  416. package/sdk/src/headless-prompts.test.ts +159 -0
  417. package/sdk/src/index.ts +333 -0
  418. package/sdk/src/init-e2e.integration.test.ts +136 -0
  419. package/sdk/src/init-runner.test.ts +783 -0
  420. package/sdk/src/init-runner.ts +735 -0
  421. package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
  422. package/sdk/src/logger.test.ts +149 -0
  423. package/sdk/src/logger.ts +113 -0
  424. package/sdk/src/milestone-runner.test.ts +421 -0
  425. package/sdk/src/phase-prompt.test.ts +538 -0
  426. package/sdk/src/phase-prompt.ts +264 -0
  427. package/sdk/src/phase-runner-types.test.ts +421 -0
  428. package/sdk/src/phase-runner.integration.test.ts +377 -0
  429. package/sdk/src/phase-runner.test.ts +2333 -0
  430. package/sdk/src/phase-runner.ts +1203 -0
  431. package/sdk/src/plan-parser.test.ts +528 -0
  432. package/sdk/src/plan-parser.ts +427 -0
  433. package/sdk/src/prompt-builder.test.ts +306 -0
  434. package/sdk/src/prompt-builder.ts +193 -0
  435. package/sdk/src/prompt-sanitizer.test.ts +260 -0
  436. package/sdk/src/prompt-sanitizer.ts +71 -0
  437. package/sdk/src/query/QUERY-HANDLERS.md +317 -0
  438. package/sdk/src/query/audit-open.ts +722 -0
  439. package/sdk/src/query/check-auto-mode.test.ts +77 -0
  440. package/sdk/src/query/check-auto-mode.ts +50 -0
  441. package/sdk/src/query/check-completion.test.ts +113 -0
  442. package/sdk/src/query/check-completion.ts +182 -0
  443. package/sdk/src/query/check-gates.test.ts +103 -0
  444. package/sdk/src/query/check-gates.ts +112 -0
  445. package/sdk/src/query/check-ship-ready.test.ts +77 -0
  446. package/sdk/src/query/check-ship-ready.ts +103 -0
  447. package/sdk/src/query/check-verification-status.test.ts +143 -0
  448. package/sdk/src/query/check-verification-status.ts +160 -0
  449. package/sdk/src/query/commit.test.ts +202 -0
  450. package/sdk/src/query/commit.ts +301 -0
  451. package/sdk/src/query/config-gates.test.ts +89 -0
  452. package/sdk/src/query/config-gates.ts +69 -0
  453. package/sdk/src/query/config-mutation.test.ts +365 -0
  454. package/sdk/src/query/config-mutation.ts +497 -0
  455. package/sdk/src/query/config-query.test.ts +161 -0
  456. package/sdk/src/query/config-query.ts +190 -0
  457. package/sdk/src/query/context-history.test.ts +165 -0
  458. package/sdk/src/query/context-history.ts +467 -0
  459. package/sdk/src/query/decomposed-handlers.test.ts +365 -0
  460. package/sdk/src/query/detect-custom-files.ts +97 -0
  461. package/sdk/src/query/detect-phase-type.test.ts +105 -0
  462. package/sdk/src/query/detect-phase-type.ts +141 -0
  463. package/sdk/src/query/docs-init.ts +257 -0
  464. package/sdk/src/query/failure-capture.ts +58 -0
  465. package/sdk/src/query/frontmatter-array.test.ts +14 -0
  466. package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
  467. package/sdk/src/query/frontmatter-mutation.ts +343 -0
  468. package/sdk/src/query/frontmatter.test.ts +281 -0
  469. package/sdk/src/query/frontmatter.ts +397 -0
  470. package/sdk/src/query/helpers.test.ts +426 -0
  471. package/sdk/src/query/helpers.ts +482 -0
  472. package/sdk/src/query/index.ts +586 -0
  473. package/sdk/src/query/init-complex.test.ts +232 -0
  474. package/sdk/src/query/init-complex.ts +578 -0
  475. package/sdk/src/query/init.test.ts +522 -0
  476. package/sdk/src/query/init.ts +1046 -0
  477. package/sdk/src/query/intel.test.ts +90 -0
  478. package/sdk/src/query/intel.ts +404 -0
  479. package/sdk/src/query/normalize-query-command.test.ts +50 -0
  480. package/sdk/src/query/normalize-query-command.ts +56 -0
  481. package/sdk/src/query/phase-lifecycle.test.ts +1126 -0
  482. package/sdk/src/query/phase-lifecycle.ts +1799 -0
  483. package/sdk/src/query/phase-list-queries.test.ts +88 -0
  484. package/sdk/src/query/phase-list-queries.ts +152 -0
  485. package/sdk/src/query/phase-ready.test.ts +65 -0
  486. package/sdk/src/query/phase-ready.ts +158 -0
  487. package/sdk/src/query/phase.test.ts +307 -0
  488. package/sdk/src/query/phase.ts +340 -0
  489. package/sdk/src/query/pipeline.test.ts +169 -0
  490. package/sdk/src/query/pipeline.ts +243 -0
  491. package/sdk/src/query/plan-execution-route.test.ts +166 -0
  492. package/sdk/src/query/plan-execution-route.ts +209 -0
  493. package/sdk/src/query/plan-task-structure.test.ts +65 -0
  494. package/sdk/src/query/plan-task-structure.ts +63 -0
  495. package/sdk/src/query/profile-extract-messages.ts +247 -0
  496. package/sdk/src/query/profile-output.ts +908 -0
  497. package/sdk/src/query/profile-questionnaire-data.ts +181 -0
  498. package/sdk/src/query/profile-sample.ts +184 -0
  499. package/sdk/src/query/profile-scan-sessions.ts +174 -0
  500. package/sdk/src/query/profile.test.ts +74 -0
  501. package/sdk/src/query/profile.ts +337 -0
  502. package/sdk/src/query/progress.test.ts +156 -0
  503. package/sdk/src/query/progress.ts +566 -0
  504. package/sdk/src/query/registry.test.ts +216 -0
  505. package/sdk/src/query/registry.ts +174 -0
  506. package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
  507. package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
  508. package/sdk/src/query/roadmap-update-plan-progress.ts +132 -0
  509. package/sdk/src/query/roadmap.test.ts +359 -0
  510. package/sdk/src/query/roadmap.ts +591 -0
  511. package/sdk/src/query/route-next-action.test.ts +61 -0
  512. package/sdk/src/query/route-next-action.ts +345 -0
  513. package/sdk/src/query/runtime-health.ts +7 -0
  514. package/sdk/src/query/schema-detect.ts +189 -0
  515. package/sdk/src/query/skill-manifest.ts +214 -0
  516. package/sdk/src/query/skills.test.ts +80 -0
  517. package/sdk/src/query/skills.ts +62 -0
  518. package/sdk/src/query/state-mutation.test.ts +450 -0
  519. package/sdk/src/query/state-mutation.ts +1444 -0
  520. package/sdk/src/query/state-project-load.ts +109 -0
  521. package/sdk/src/query/state.test.ts +347 -0
  522. package/sdk/src/query/state.ts +397 -0
  523. package/sdk/src/query/summary.test.ts +95 -0
  524. package/sdk/src/query/summary.ts +296 -0
  525. package/sdk/src/query/template.test.ts +180 -0
  526. package/sdk/src/query/template.ts +242 -0
  527. package/sdk/src/query/uat.test.ts +77 -0
  528. package/sdk/src/query/uat.ts +314 -0
  529. package/sdk/src/query/utils.test.ts +82 -0
  530. package/sdk/src/query/utils.ts +92 -0
  531. package/sdk/src/query/validate.test.ts +656 -0
  532. package/sdk/src/query/validate.ts +807 -0
  533. package/sdk/src/query/verify.test.ts +414 -0
  534. package/sdk/src/query/verify.ts +645 -0
  535. package/sdk/src/query/websearch.test.ts +31 -0
  536. package/sdk/src/query/websearch.ts +82 -0
  537. package/sdk/src/query/workspace.test.ts +119 -0
  538. package/sdk/src/query/workspace.ts +131 -0
  539. package/sdk/src/query/workstream.test.ts +51 -0
  540. package/sdk/src/query/workstream.ts +434 -0
  541. package/sdk/src/research-gate.test.ts +190 -0
  542. package/sdk/src/research-gate.ts +94 -0
  543. package/sdk/src/runtime-health.test.ts +176 -0
  544. package/sdk/src/runtime-health.ts +387 -0
  545. package/sdk/src/session-runner.test.ts +98 -0
  546. package/sdk/src/session-runner.ts +299 -0
  547. package/sdk/src/tool-scoping.test.ts +160 -0
  548. package/sdk/src/tool-scoping.ts +61 -0
  549. package/sdk/src/types.ts +917 -0
  550. package/sdk/src/workstream-utils.ts +33 -0
  551. package/sdk/src/ws-flag.test.ts +285 -0
  552. package/sdk/src/ws-transport.test.ts +161 -0
  553. package/sdk/src/ws-transport.ts +93 -0
  554. package/sdk/tsconfig.json +20 -0
@@ -0,0 +1,587 @@
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 whether GSD is installed locally or globally by checking both locations and validating install integrity.
13
+
14
+ First, derive `PREFERRED_CONFIG_DIR` and `PREFERRED_RUNTIME` from the invoking prompt's `execution_context` path:
15
+ - If the path contains `/get-shit-done/workflows/update.md`, strip that suffix and store the remainder as `PREFERRED_CONFIG_DIR`
16
+ - Path contains `/.codex/` -> `codex`
17
+ - Path contains `/.gemini/` -> `gemini`
18
+ - Path contains `/.config/kilo/` or `/.kilo/`, or `PREFERRED_CONFIG_DIR` contains `kilo.json` / `kilo.jsonc` -> `kilo`
19
+ - Path contains `/.config/opencode/` or `/.opencode/`, or `PREFERRED_CONFIG_DIR` contains `opencode.json` / `opencode.jsonc` -> `opencode`
20
+ - Otherwise -> `claude`
21
+
22
+ Use `PREFERRED_CONFIG_DIR` when available so custom `--config-dir` installs are checked before default locations.
23
+ Use `PREFERRED_RUNTIME` as the first runtime checked so `/gsd-update` targets the runtime that invoked it.
24
+
25
+ Kilo config precedence must match the installer: `KILO_CONFIG_DIR` -> `dirname(KILO_CONFIG)` -> `XDG_CONFIG_HOME/kilo` -> `~/.config/kilo`.
26
+
27
+ ```bash
28
+ expand_home() {
29
+ case "$1" in
30
+ "~/"*) printf '%s/%s\n' "$HOME" "${1#~/}" ;;
31
+ *) printf '%s\n' "$1" ;;
32
+ esac
33
+ }
34
+
35
+ # Runtime candidates: "<runtime>:<config-dir>" stored as an array.
36
+ # Using an array instead of a space-separated string ensures correct
37
+ # iteration in both bash and zsh (zsh does not word-split unquoted
38
+ # variables by default). Fixes #1173.
39
+ RUNTIME_DIRS=( "claude:.claude" "opencode:.config/opencode" "opencode:.opencode" "gemini:.gemini" "kilo:.config/kilo" "kilo:.kilo" "codex:.codex" )
40
+ ENV_RUNTIME_DIRS=()
41
+
42
+ # PREFERRED_CONFIG_DIR / PREFERRED_RUNTIME should be set from execution_context
43
+ # before running this block.
44
+ if [ -n "$PREFERRED_CONFIG_DIR" ]; then
45
+ PREFERRED_CONFIG_DIR="$(expand_home "$PREFERRED_CONFIG_DIR")"
46
+ if [ -z "$PREFERRED_RUNTIME" ]; then
47
+ if [ -f "$PREFERRED_CONFIG_DIR/kilo.json" ] || [ -f "$PREFERRED_CONFIG_DIR/kilo.jsonc" ]; then
48
+ PREFERRED_RUNTIME="kilo"
49
+ elif [ -f "$PREFERRED_CONFIG_DIR/opencode.json" ] || [ -f "$PREFERRED_CONFIG_DIR/opencode.jsonc" ]; then
50
+ PREFERRED_RUNTIME="opencode"
51
+ elif [ -f "$PREFERRED_CONFIG_DIR/config.toml" ]; then
52
+ PREFERRED_RUNTIME="codex"
53
+ fi
54
+ fi
55
+ fi
56
+
57
+ # If runtime is still unknown, infer from runtime env vars; fallback to claude.
58
+ if [ -z "$PREFERRED_RUNTIME" ]; then
59
+ if [ -n "$CODEX_HOME" ]; then
60
+ PREFERRED_RUNTIME="codex"
61
+ elif [ -n "$GEMINI_CONFIG_DIR" ]; then
62
+ PREFERRED_RUNTIME="gemini"
63
+ elif [ -n "$KILO_CONFIG_DIR" ]; then
64
+ PREFERRED_RUNTIME="kilo"
65
+ elif [ -n "$KILO_CONFIG" ]; then
66
+ PREFERRED_RUNTIME="kilo"
67
+ elif [ -n "$OPENCODE_CONFIG_DIR" ] || [ -n "$OPENCODE_CONFIG" ]; then
68
+ PREFERRED_RUNTIME="opencode"
69
+ elif [ -n "$CLAUDE_CONFIG_DIR" ]; then
70
+ PREFERRED_RUNTIME="claude"
71
+ else
72
+ PREFERRED_RUNTIME="claude"
73
+ fi
74
+ fi
75
+
76
+ # If execution_context already points at an installed config dir, trust it first.
77
+ # This covers custom --config-dir installs that do not live under the default
78
+ # runtime directories.
79
+ if [ -n "$PREFERRED_CONFIG_DIR" ] && { [ -f "$PREFERRED_CONFIG_DIR/get-shit-done/VERSION" ] || [ -f "$PREFERRED_CONFIG_DIR/get-shit-done/workflows/update.md" ]; }; then
80
+ INSTALL_SCOPE="GLOBAL"
81
+ # Normalize a path for comparison: on Windows with Git Bash, pwd returns
82
+ # POSIX-style /c/Users/... but PREFERRED_CONFIG_DIR may carry C:/Users/...
83
+ # Convert Windows drive-letter paths to POSIX form so the comparison works
84
+ # on both Windows (Git Bash) and POSIX systems.
85
+ normalize_path() {
86
+ local p="$1"
87
+ case "$p" in
88
+ [A-Za-z]:/*)
89
+ local drive rest
90
+ drive="${p%%:*}"
91
+ rest="${p#?:}"
92
+ p="/$(printf '%s' "$drive" | tr '[:upper:]' '[:lower:]')$rest"
93
+ ;;
94
+ esac
95
+ printf '%s' "$p"
96
+ }
97
+ normalized_preferred="$(normalize_path "$PREFERRED_CONFIG_DIR")"
98
+ for dir in .claude .config/opencode .opencode .gemini .config/kilo .kilo .codex; do
99
+ resolved_local="$(cd "./$dir" 2>/dev/null && pwd)"
100
+ normalized_local="$(normalize_path "$resolved_local")"
101
+ if [ -n "$normalized_local" ] && [ "$normalized_local" = "$normalized_preferred" ]; then
102
+ INSTALL_SCOPE="LOCAL"
103
+ break
104
+ fi
105
+ done
106
+
107
+ if [ -f "$PREFERRED_CONFIG_DIR/get-shit-done/VERSION" ] && grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+' "$PREFERRED_CONFIG_DIR/get-shit-done/VERSION"; then
108
+ INSTALLED_VERSION="$(cat "$PREFERRED_CONFIG_DIR/get-shit-done/VERSION")"
109
+ else
110
+ INSTALLED_VERSION="0.0.0"
111
+ fi
112
+
113
+ echo "$INSTALLED_VERSION"
114
+ echo "$INSTALL_SCOPE"
115
+ echo "${PREFERRED_RUNTIME:-claude}"
116
+ exit 0
117
+ fi
118
+
119
+ # Absolute global candidates from env overrides (covers custom config dirs).
120
+ if [ -n "$CLAUDE_CONFIG_DIR" ]; then
121
+ ENV_RUNTIME_DIRS+=( "claude:$(expand_home "$CLAUDE_CONFIG_DIR")" )
122
+ fi
123
+ if [ -n "$GEMINI_CONFIG_DIR" ]; then
124
+ ENV_RUNTIME_DIRS+=( "gemini:$(expand_home "$GEMINI_CONFIG_DIR")" )
125
+ fi
126
+ if [ -n "$KILO_CONFIG_DIR" ]; then
127
+ ENV_RUNTIME_DIRS+=( "kilo:$(expand_home "$KILO_CONFIG_DIR")" )
128
+ elif [ -n "$KILO_CONFIG" ]; then
129
+ ENV_RUNTIME_DIRS+=( "kilo:$(dirname "$(expand_home "$KILO_CONFIG")")" )
130
+ elif [ -n "$XDG_CONFIG_HOME" ]; then
131
+ ENV_RUNTIME_DIRS+=( "kilo:$(expand_home "$XDG_CONFIG_HOME")/kilo" )
132
+ fi
133
+ if [ -n "$OPENCODE_CONFIG_DIR" ]; then
134
+ ENV_RUNTIME_DIRS+=( "opencode:$(expand_home "$OPENCODE_CONFIG_DIR")" )
135
+ elif [ -n "$OPENCODE_CONFIG" ]; then
136
+ ENV_RUNTIME_DIRS+=( "opencode:$(dirname "$(expand_home "$OPENCODE_CONFIG")")" )
137
+ elif [ -n "$XDG_CONFIG_HOME" ]; then
138
+ ENV_RUNTIME_DIRS+=( "opencode:$(expand_home "$XDG_CONFIG_HOME")/opencode" )
139
+ fi
140
+ if [ -n "$CODEX_HOME" ]; then
141
+ ENV_RUNTIME_DIRS+=( "codex:$(expand_home "$CODEX_HOME")" )
142
+ fi
143
+
144
+ # Reorder entries so preferred runtime is checked first.
145
+ ORDERED_RUNTIME_DIRS=()
146
+ for entry in "${RUNTIME_DIRS[@]}"; do
147
+ runtime="${entry%%:*}"
148
+ if [ "$runtime" = "$PREFERRED_RUNTIME" ]; then
149
+ ORDERED_RUNTIME_DIRS+=( "$entry" )
150
+ fi
151
+ done
152
+ ORDERED_ENV_RUNTIME_DIRS=()
153
+ for entry in "${ENV_RUNTIME_DIRS[@]}"; do
154
+ runtime="${entry%%:*}"
155
+ if [ "$runtime" = "$PREFERRED_RUNTIME" ]; then
156
+ ORDERED_ENV_RUNTIME_DIRS+=( "$entry" )
157
+ fi
158
+ done
159
+ for entry in "${ENV_RUNTIME_DIRS[@]}"; do
160
+ runtime="${entry%%:*}"
161
+ if [ "$runtime" != "$PREFERRED_RUNTIME" ]; then
162
+ ORDERED_ENV_RUNTIME_DIRS+=( "$entry" )
163
+ fi
164
+ done
165
+ for entry in "${RUNTIME_DIRS[@]}"; do
166
+ runtime="${entry%%:*}"
167
+ if [ "$runtime" != "$PREFERRED_RUNTIME" ]; then
168
+ ORDERED_RUNTIME_DIRS+=( "$entry" )
169
+ fi
170
+ done
171
+
172
+ # Check local first (takes priority only if valid and distinct from global)
173
+ LOCAL_VERSION_FILE="" LOCAL_MARKER_FILE="" LOCAL_DIR="" LOCAL_RUNTIME=""
174
+ for entry in "${ORDERED_RUNTIME_DIRS[@]}"; do
175
+ runtime="${entry%%:*}"
176
+ dir="${entry#*:}"
177
+ if [ -f "./$dir/get-shit-done/VERSION" ] || [ -f "./$dir/get-shit-done/workflows/update.md" ]; then
178
+ LOCAL_RUNTIME="$runtime"
179
+ LOCAL_VERSION_FILE="./$dir/get-shit-done/VERSION"
180
+ LOCAL_MARKER_FILE="./$dir/get-shit-done/workflows/update.md"
181
+ LOCAL_DIR="$(cd "./$dir" 2>/dev/null && pwd)"
182
+ break
183
+ fi
184
+ done
185
+
186
+ GLOBAL_VERSION_FILE="" GLOBAL_MARKER_FILE="" GLOBAL_DIR="" GLOBAL_RUNTIME=""
187
+ for entry in "${ORDERED_ENV_RUNTIME_DIRS[@]}"; do
188
+ runtime="${entry%%:*}"
189
+ dir="${entry#*:}"
190
+ if [ -f "$dir/get-shit-done/VERSION" ] || [ -f "$dir/get-shit-done/workflows/update.md" ]; then
191
+ GLOBAL_RUNTIME="$runtime"
192
+ GLOBAL_VERSION_FILE="$dir/get-shit-done/VERSION"
193
+ GLOBAL_MARKER_FILE="$dir/get-shit-done/workflows/update.md"
194
+ GLOBAL_DIR="$(cd "$dir" 2>/dev/null && pwd)"
195
+ break
196
+ fi
197
+ done
198
+
199
+ if [ -z "$GLOBAL_RUNTIME" ]; then
200
+ for entry in "${ORDERED_RUNTIME_DIRS[@]}"; do
201
+ runtime="${entry%%:*}"
202
+ dir="${entry#*:}"
203
+ if [ -f "$HOME/$dir/get-shit-done/VERSION" ] || [ -f "$HOME/$dir/get-shit-done/workflows/update.md" ]; then
204
+ GLOBAL_RUNTIME="$runtime"
205
+ GLOBAL_VERSION_FILE="$HOME/$dir/get-shit-done/VERSION"
206
+ GLOBAL_MARKER_FILE="$HOME/$dir/get-shit-done/workflows/update.md"
207
+ GLOBAL_DIR="$(cd "$HOME/$dir" 2>/dev/null && pwd)"
208
+ break
209
+ fi
210
+ done
211
+ fi
212
+
213
+ # Only treat as LOCAL if the resolved paths differ (prevents misdetection when CWD=$HOME)
214
+ IS_LOCAL=false
215
+ if [ -n "$LOCAL_VERSION_FILE" ] && [ -f "$LOCAL_VERSION_FILE" ] && [ -f "$LOCAL_MARKER_FILE" ] && grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+' "$LOCAL_VERSION_FILE"; then
216
+ if [ -z "$GLOBAL_DIR" ] || [ "$LOCAL_DIR" != "$GLOBAL_DIR" ]; then
217
+ IS_LOCAL=true
218
+ fi
219
+ fi
220
+
221
+ if [ "$IS_LOCAL" = true ]; then
222
+ INSTALLED_VERSION="$(cat "$LOCAL_VERSION_FILE")"
223
+ INSTALL_SCOPE="LOCAL"
224
+ TARGET_RUNTIME="$LOCAL_RUNTIME"
225
+ elif [ -n "$GLOBAL_VERSION_FILE" ] && [ -f "$GLOBAL_VERSION_FILE" ] && [ -f "$GLOBAL_MARKER_FILE" ] && grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+' "$GLOBAL_VERSION_FILE"; then
226
+ INSTALLED_VERSION="$(cat "$GLOBAL_VERSION_FILE")"
227
+ INSTALL_SCOPE="GLOBAL"
228
+ TARGET_RUNTIME="$GLOBAL_RUNTIME"
229
+ elif [ -n "$LOCAL_RUNTIME" ] && [ -f "$LOCAL_MARKER_FILE" ]; then
230
+ # Runtime detected but VERSION missing/corrupt: treat as unknown version, keep runtime target
231
+ INSTALLED_VERSION="0.0.0"
232
+ INSTALL_SCOPE="LOCAL"
233
+ TARGET_RUNTIME="$LOCAL_RUNTIME"
234
+ elif [ -n "$GLOBAL_RUNTIME" ] && [ -f "$GLOBAL_MARKER_FILE" ]; then
235
+ INSTALLED_VERSION="0.0.0"
236
+ INSTALL_SCOPE="GLOBAL"
237
+ TARGET_RUNTIME="$GLOBAL_RUNTIME"
238
+ else
239
+ INSTALLED_VERSION="0.0.0"
240
+ INSTALL_SCOPE="UNKNOWN"
241
+ TARGET_RUNTIME="claude"
242
+ fi
243
+
244
+ echo "$INSTALLED_VERSION"
245
+ echo "$INSTALL_SCOPE"
246
+ echo "$TARGET_RUNTIME"
247
+ ```
248
+
249
+ Parse output:
250
+ - Line 1 = installed version (`0.0.0` means unknown version)
251
+ - Line 2 = install scope (`LOCAL`, `GLOBAL`, or `UNKNOWN`)
252
+ - Line 3 = target runtime (`claude`, `opencode`, `gemini`, `kilo`, or `codex`)
253
+ - If scope is `UNKNOWN`, proceed to install step using `--claude --global` fallback.
254
+
255
+ 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.
256
+
257
+ **If VERSION file missing:**
258
+ ```
259
+ ## GSD Update
260
+
261
+ **Installed version:** Unknown
262
+
263
+ Your installation doesn't include version tracking.
264
+
265
+ Running fresh install...
266
+ ```
267
+
268
+ Proceed to install step (treat as version 0.0.0 for comparison).
269
+ </step>
270
+
271
+ <step name="check_latest_version">
272
+ Check npm for latest version:
273
+
274
+ ```bash
275
+ npm view get-shit-done-cc version 2>/dev/null
276
+ ```
277
+
278
+ **If npm check fails:**
279
+ ```
280
+ Couldn't check for updates (offline or npm unavailable).
281
+
282
+ To update manually: `npx get-shit-done-cc --global`
283
+ ```
284
+
285
+ Exit.
286
+ </step>
287
+
288
+ <step name="compare_versions">
289
+ Compare installed vs latest:
290
+
291
+ **If installed == latest:**
292
+ ```
293
+ ## GSD Update
294
+
295
+ **Installed:** X.Y.Z
296
+ **Latest:** X.Y.Z
297
+
298
+ You're already on the latest version.
299
+ ```
300
+
301
+ Exit.
302
+
303
+ **If installed > latest:**
304
+ ```
305
+ ## GSD Update
306
+
307
+ **Installed:** X.Y.Z
308
+ **Latest:** A.B.C
309
+
310
+ You're ahead of the latest release — this looks like a dev install.
311
+
312
+ If you see a "⚠ dev install — re-run installer to sync hooks" warning in
313
+ your statusline, your hook files are older than your VERSION file. Fix it
314
+ by re-running the local installer from your dev branch:
315
+
316
+ node bin/install.js --global --claude
317
+
318
+ Running /gsd-update would install the npm release (A.B.C) and downgrade
319
+ your dev version — do NOT use it to resolve this warning.
320
+ ```
321
+
322
+ Exit.
323
+ </step>
324
+
325
+ <step name="show_changes_and_confirm">
326
+ **If update available**, fetch and show what's new BEFORE updating:
327
+
328
+ 1. Fetch changelog from GitHub raw URL
329
+ 2. Extract entries between installed and latest versions
330
+ 3. Display preview and ask for confirmation:
331
+
332
+ ```
333
+ ## GSD Update Available
334
+
335
+ **Installed:** 1.5.10
336
+ **Latest:** 1.5.15
337
+
338
+ ### What's New
339
+ ────────────────────────────────────────────────────────────
340
+
341
+ ## [1.5.15] - 2026-01-20
342
+
343
+ ### Added
344
+ - Feature X
345
+
346
+ ## [1.5.14] - 2026-01-18
347
+
348
+ ### Fixed
349
+ - Bug fix Y
350
+
351
+ ────────────────────────────────────────────────────────────
352
+
353
+ ⚠️ **Note:** The installer performs a clean install of GSD folders:
354
+ - `commands/gsd/` will be wiped and replaced
355
+ - `get-shit-done/` will be wiped and replaced
356
+ - `agents/gsd-*` files will be replaced
357
+
358
+ (Paths are relative to detected runtime install location:
359
+ global: `~/.claude/`, `~/.config/opencode/`, `~/.opencode/`, `~/.gemini/`, `~/.config/kilo/`, or `~/.codex/`
360
+ local: `./.claude/`, `./.config/opencode/`, `./.opencode/`, `./.gemini/`, `./.kilo/`, or `./.codex/`)
361
+
362
+ Your custom files in other locations are preserved:
363
+ - Custom commands not in `commands/gsd/` ✓
364
+ - Custom agents not prefixed with `gsd-` ✓
365
+ - Custom hooks ✓
366
+ - Your CLAUDE.md files ✓
367
+
368
+ If you've modified any GSD files directly, they'll be automatically backed up to `gsd-local-patches/` and can be reapplied with `/gsd-reapply-patches` after the update.
369
+ ```
370
+
371
+
372
+ **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.
373
+ Use AskUserQuestion:
374
+ - Question: "Proceed with update?"
375
+ - Options:
376
+ - "Yes, update now"
377
+ - "No, cancel"
378
+
379
+ **If user cancels:** Exit.
380
+ </step>
381
+
382
+ <step name="backup_custom_files">
383
+ Before running the installer, detect and back up any user-added files inside
384
+ GSD-managed directories. These are files that exist on disk but are NOT listed
385
+ in `gsd-file-manifest.json` — i.e., files the user added themselves that the
386
+ installer does not know about and will delete during the wipe.
387
+
388
+ **Do not use bash path-stripping (`${filepath#$RUNTIME_DIR/}`) or `node -e require()`
389
+ inline** — those patterns fail when `$RUNTIME_DIR` is unset and the stripped
390
+ relative path may not match manifest key format, which causes CUSTOM_COUNT=0
391
+ even when custom files exist (bug #1997). Use `gsd-remix-sdk query detect-custom-files`
392
+ when `gsd-remix-sdk` is on `PATH`, or the bundled `gsd-tools.cjs detect-custom-files`
393
+ otherwise — both resolve paths reliably with Node.js `path.relative()`.
394
+
395
+ First, resolve the config directory (`RUNTIME_DIR`) from the install scope
396
+ detected in `get_installed_version`:
397
+
398
+ ```bash
399
+ # RUNTIME_DIR is the resolved config directory (e.g. ~/.config/opencode, ~/.gemini)
400
+ # It should already be set from get_installed_version as GLOBAL_DIR or LOCAL_DIR.
401
+ # Use the appropriate variable based on INSTALL_SCOPE.
402
+ if [ "$INSTALL_SCOPE" = "LOCAL" ]; then
403
+ RUNTIME_DIR="$LOCAL_DIR"
404
+ elif [ "$INSTALL_SCOPE" = "GLOBAL" ]; then
405
+ RUNTIME_DIR="$GLOBAL_DIR"
406
+ else
407
+ RUNTIME_DIR=""
408
+ fi
409
+ ```
410
+
411
+ If `RUNTIME_DIR` is empty or does not exist, skip this step (no config dir to
412
+ inspect).
413
+
414
+ Otherwise run `detect-custom-files` (prefer SDK when available):
415
+
416
+ ```bash
417
+ GSD_TOOLS="$RUNTIME_DIR/get-shit-done/bin/gsd-tools.cjs"
418
+ CUSTOM_JSON=''
419
+ if [ -n "$RUNTIME_DIR" ] && command -v gsd-remix-sdk >/dev/null 2>&1; then
420
+ CUSTOM_JSON=$(gsd-remix-sdk query detect-custom-files --config-dir "$RUNTIME_DIR" 2>/dev/null)
421
+ elif [ -f "$GSD_TOOLS" ] && [ -n "$RUNTIME_DIR" ]; then
422
+ CUSTOM_JSON=$(node "$GSD_TOOLS" detect-custom-files --config-dir "$RUNTIME_DIR" 2>/dev/null)
423
+ fi
424
+ if [ -z "$CUSTOM_JSON" ]; then
425
+ CUSTOM_JSON='{"custom_files":[],"custom_count":0}'
426
+ fi
427
+ 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")
428
+ ```
429
+
430
+ **If `CUSTOM_COUNT` > 0:**
431
+
432
+ Back up each custom file to `$RUNTIME_DIR/gsd-user-files-backup/` before the
433
+ installer wipes the directories:
434
+
435
+ ```bash
436
+ BACKUP_DIR="$RUNTIME_DIR/gsd-user-files-backup"
437
+ mkdir -p "$BACKUP_DIR"
438
+
439
+ # Parse custom_files array from CUSTOM_JSON and copy each file
440
+ node - "$RUNTIME_DIR" "$BACKUP_DIR" "$CUSTOM_JSON" <<'JSEOF'
441
+ const [,, runtimeDir, backupDir, customJson] = process.argv;
442
+ const { custom_files } = JSON.parse(customJson);
443
+ const fs = require('fs');
444
+ const path = require('path');
445
+ for (const relPath of custom_files) {
446
+ const src = path.join(runtimeDir, relPath);
447
+ const dst = path.join(backupDir, relPath);
448
+ if (fs.existsSync(src)) {
449
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
450
+ fs.copyFileSync(src, dst);
451
+ console.log(' Backed up: ' + relPath);
452
+ }
453
+ }
454
+ JSEOF
455
+ ```
456
+
457
+ Then inform the user:
458
+
459
+ ```
460
+ ⚠️ Found N custom file(s) inside GSD-managed directories.
461
+ These have been backed up to gsd-user-files-backup/ before the update.
462
+ Restore them after the update if needed.
463
+ ```
464
+
465
+ **If `CUSTOM_COUNT` == 0:** No user-added files detected. Continue to install.
466
+ </step>
467
+
468
+ <step name="run_update">
469
+ Run the update using the install type detected in step 1:
470
+
471
+ Build runtime flag from step 1:
472
+ ```bash
473
+ RUNTIME_FLAG="--$TARGET_RUNTIME"
474
+ ```
475
+
476
+ **If LOCAL install:**
477
+ ```bash
478
+ npx -y get-shit-done-cc@latest "$RUNTIME_FLAG" --local
479
+ ```
480
+
481
+ **If GLOBAL install:**
482
+ ```bash
483
+ npx -y get-shit-done-cc@latest "$RUNTIME_FLAG" --global
484
+ ```
485
+
486
+ **If UNKNOWN install:**
487
+ ```bash
488
+ npx -y get-shit-done-cc@latest --claude --global
489
+ ```
490
+
491
+ Capture output. If install fails, show error and exit.
492
+
493
+ Clear the update cache so statusline indicator disappears:
494
+
495
+ ```bash
496
+ expand_home() {
497
+ case "$1" in
498
+ "~/"*) printf '%s/%s\n' "$HOME" "${1#~/}" ;;
499
+ *) printf '%s\n' "$1" ;;
500
+ esac
501
+ }
502
+
503
+ # Clear update cache across preferred, env-derived, and default runtime directories
504
+ CACHE_DIRS=()
505
+ if [ -n "$PREFERRED_CONFIG_DIR" ]; then
506
+ CACHE_DIRS+=( "$(expand_home "$PREFERRED_CONFIG_DIR")" )
507
+ fi
508
+ if [ -n "$CLAUDE_CONFIG_DIR" ]; then
509
+ CACHE_DIRS+=( "$(expand_home "$CLAUDE_CONFIG_DIR")" )
510
+ fi
511
+ if [ -n "$GEMINI_CONFIG_DIR" ]; then
512
+ CACHE_DIRS+=( "$(expand_home "$GEMINI_CONFIG_DIR")" )
513
+ fi
514
+ if [ -n "$KILO_CONFIG_DIR" ]; then
515
+ CACHE_DIRS+=( "$(expand_home "$KILO_CONFIG_DIR")" )
516
+ elif [ -n "$KILO_CONFIG" ]; then
517
+ CACHE_DIRS+=( "$(dirname "$(expand_home "$KILO_CONFIG")")" )
518
+ elif [ -n "$XDG_CONFIG_HOME" ]; then
519
+ CACHE_DIRS+=( "$(expand_home "$XDG_CONFIG_HOME")/kilo" )
520
+ fi
521
+ if [ -n "$OPENCODE_CONFIG_DIR" ]; then
522
+ CACHE_DIRS+=( "$(expand_home "$OPENCODE_CONFIG_DIR")" )
523
+ elif [ -n "$OPENCODE_CONFIG" ]; then
524
+ CACHE_DIRS+=( "$(dirname "$(expand_home "$OPENCODE_CONFIG")")" )
525
+ elif [ -n "$XDG_CONFIG_HOME" ]; then
526
+ CACHE_DIRS+=( "$(expand_home "$XDG_CONFIG_HOME")/opencode" )
527
+ fi
528
+ if [ -n "$CODEX_HOME" ]; then
529
+ CACHE_DIRS+=( "$(expand_home "$CODEX_HOME")" )
530
+ fi
531
+
532
+ for dir in "${CACHE_DIRS[@]}"; do
533
+ if [ -n "$dir" ]; then
534
+ rm -f "$dir/cache/gsd-update-check.json"
535
+ fi
536
+ done
537
+
538
+ for dir in .claude .config/opencode .opencode .gemini .config/kilo .kilo .codex; do
539
+ rm -f "./$dir/cache/gsd-update-check.json"
540
+ rm -f "$HOME/$dir/cache/gsd-update-check.json"
541
+ done
542
+ ```
543
+
544
+ 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.
545
+ </step>
546
+
547
+ <step name="display_result">
548
+ Format completion message (changelog was already shown in confirmation step):
549
+
550
+ ```
551
+ ╔═══════════════════════════════════════════════════════════╗
552
+ ║ GSD Updated: v1.5.10 → v1.5.15 ║
553
+ ╚═══════════════════════════════════════════════════════════╝
554
+
555
+ ⚠️ Restart your runtime to pick up the new commands.
556
+
557
+ [View full changelog](https://github.com/gsd-build/get-shit-done/blob/main/CHANGELOG.md)
558
+ ```
559
+ </step>
560
+
561
+
562
+ <step name="check_local_patches">
563
+ After update completes, check if the installer detected and backed up any locally modified files:
564
+
565
+ Check for gsd-local-patches/backup-meta.json in the config directory.
566
+
567
+ **If patches found:**
568
+
569
+ ```
570
+ Local patches were backed up before the update.
571
+ Run /gsd-reapply-patches to merge your modifications into the new version.
572
+ ```
573
+
574
+ **If no patches:** Continue normally.
575
+ </step>
576
+ </process>
577
+
578
+ <success_criteria>
579
+ - [ ] Installed version read correctly
580
+ - [ ] Latest version checked via npm
581
+ - [ ] Update skipped if already current
582
+ - [ ] Changelog fetched and displayed BEFORE update
583
+ - [ ] Clean install warning shown
584
+ - [ ] User confirmation obtained
585
+ - [ ] Update executed successfully
586
+ - [ ] Restart reminder shown
587
+ </success_criteria>