@therocketcode/gsd-core 1.4.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 (568) hide show
  1. package/.claude-plugin/plugin.json +23 -0
  2. package/GEMINI.md +53 -0
  3. package/LICENSE +21 -0
  4. package/README.ja-JP.md +125 -0
  5. package/README.ko-KR.md +125 -0
  6. package/README.md +144 -0
  7. package/README.pt-BR.md +125 -0
  8. package/README.zh-CN.md +125 -0
  9. package/agents/gsd-advisor-researcher.md +108 -0
  10. package/agents/gsd-ai-researcher.md +114 -0
  11. package/agents/gsd-assumptions-analyzer.md +105 -0
  12. package/agents/gsd-code-fixer.md +668 -0
  13. package/agents/gsd-code-reviewer.md +387 -0
  14. package/agents/gsd-codebase-mapper.md +853 -0
  15. package/agents/gsd-debug-session-manager.md +314 -0
  16. package/agents/gsd-debugger.md +1452 -0
  17. package/agents/gsd-doc-classifier.md +168 -0
  18. package/agents/gsd-doc-synthesizer.md +204 -0
  19. package/agents/gsd-doc-verifier.md +217 -0
  20. package/agents/gsd-doc-writer.md +616 -0
  21. package/agents/gsd-domain-researcher.md +147 -0
  22. package/agents/gsd-eval-auditor.md +191 -0
  23. package/agents/gsd-eval-planner.md +154 -0
  24. package/agents/gsd-executor.md +785 -0
  25. package/agents/gsd-framework-selector.md +160 -0
  26. package/agents/gsd-integration-checker.md +470 -0
  27. package/agents/gsd-intel-updater.md +342 -0
  28. package/agents/gsd-nyquist-auditor.md +203 -0
  29. package/agents/gsd-pattern-mapper.md +335 -0
  30. package/agents/gsd-phase-researcher.md +867 -0
  31. package/agents/gsd-plan-checker.md +978 -0
  32. package/agents/gsd-planner.md +1204 -0
  33. package/agents/gsd-project-researcher.md +611 -0
  34. package/agents/gsd-research-synthesizer.md +259 -0
  35. package/agents/gsd-roadmapper.md +688 -0
  36. package/agents/gsd-security-auditor.md +155 -0
  37. package/agents/gsd-ui-auditor.md +495 -0
  38. package/agents/gsd-ui-checker.md +309 -0
  39. package/agents/gsd-ui-researcher.md +374 -0
  40. package/agents/gsd-user-profiler.md +171 -0
  41. package/agents/gsd-verifier.md +923 -0
  42. package/assets/gsd-logo-2000-transparent.png +0 -0
  43. package/assets/gsd-logo-2000-transparent.svg +17 -0
  44. package/assets/gsd-logo-2000.png +0 -0
  45. package/assets/gsd-logo-2000.svg +21 -0
  46. package/assets/terminal.svg +68 -0
  47. package/bin/install.js +12726 -0
  48. package/bin/lib/ui-safety-gate.cjs +107 -0
  49. package/commands/gsd/add-tests.md +42 -0
  50. package/commands/gsd/ai-integration-phase.md +37 -0
  51. package/commands/gsd/audit-fix.md +34 -0
  52. package/commands/gsd/audit-milestone.md +37 -0
  53. package/commands/gsd/audit-uat.md +24 -0
  54. package/commands/gsd/autonomous.md +48 -0
  55. package/commands/gsd/capture.md +62 -0
  56. package/commands/gsd/cleanup.md +24 -0
  57. package/commands/gsd/code-review.md +59 -0
  58. package/commands/gsd/complete-milestone.md +143 -0
  59. package/commands/gsd/config.md +56 -0
  60. package/commands/gsd/debug.md +52 -0
  61. package/commands/gsd/discover-product.md +65 -0
  62. package/commands/gsd/discuss-phase.md +77 -0
  63. package/commands/gsd/docs-update.md +49 -0
  64. package/commands/gsd/eval-review.md +33 -0
  65. package/commands/gsd/execute-phase.md +66 -0
  66. package/commands/gsd/explore.md +27 -0
  67. package/commands/gsd/extract-learnings.md +23 -0
  68. package/commands/gsd/fast.md +31 -0
  69. package/commands/gsd/forensics.md +57 -0
  70. package/commands/gsd/graphify.md +204 -0
  71. package/commands/gsd/health.md +31 -0
  72. package/commands/gsd/help.md +28 -0
  73. package/commands/gsd/import.md +45 -0
  74. package/commands/gsd/inbox.md +39 -0
  75. package/commands/gsd/ingest-docs.md +42 -0
  76. package/commands/gsd/manager.md +45 -0
  77. package/commands/gsd/map-codebase.md +83 -0
  78. package/commands/gsd/milestone-summary.md +51 -0
  79. package/commands/gsd/model-domain.md +65 -0
  80. package/commands/gsd/mvp-phase.md +45 -0
  81. package/commands/gsd/new-milestone.md +45 -0
  82. package/commands/gsd/new-project.md +47 -0
  83. package/commands/gsd/ns-context.md +23 -0
  84. package/commands/gsd/ns-ideate.md +24 -0
  85. package/commands/gsd/ns-manage.md +29 -0
  86. package/commands/gsd/ns-project.md +22 -0
  87. package/commands/gsd/ns-review.md +26 -0
  88. package/commands/gsd/ns-workflow.md +28 -0
  89. package/commands/gsd/pause-work.md +43 -0
  90. package/commands/gsd/phase.md +56 -0
  91. package/commands/gsd/plan-phase.md +64 -0
  92. package/commands/gsd/plan-review-convergence.md +59 -0
  93. package/commands/gsd/pr-branch.md +26 -0
  94. package/commands/gsd/profile-user.md +46 -0
  95. package/commands/gsd/progress.md +48 -0
  96. package/commands/gsd/quick.md +174 -0
  97. package/commands/gsd/recommend-architecture.md +64 -0
  98. package/commands/gsd/resume-work.md +30 -0
  99. package/commands/gsd/review-backlog.md +63 -0
  100. package/commands/gsd/review.md +42 -0
  101. package/commands/gsd/secure-phase.md +36 -0
  102. package/commands/gsd/settings.md +29 -0
  103. package/commands/gsd/ship.md +24 -0
  104. package/commands/gsd/sketch.md +60 -0
  105. package/commands/gsd/spec-phase.md +63 -0
  106. package/commands/gsd/spike.md +57 -0
  107. package/commands/gsd/stats.md +20 -0
  108. package/commands/gsd/surface.md +155 -0
  109. package/commands/gsd/testing-strategy.md +65 -0
  110. package/commands/gsd/thread.md +24 -0
  111. package/commands/gsd/ui-phase.md +35 -0
  112. package/commands/gsd/ui-review.md +33 -0
  113. package/commands/gsd/ultraplan-phase.md +34 -0
  114. package/commands/gsd/undo.md +35 -0
  115. package/commands/gsd/update.md +49 -0
  116. package/commands/gsd/validate-phase.md +36 -0
  117. package/commands/gsd/verify-work.md +39 -0
  118. package/commands/gsd/workspace.md +52 -0
  119. package/commands/gsd/workstreams.md +70 -0
  120. package/gemini-extension.json +6 -0
  121. package/gsd-core/bin/check-latest-version.cjs +161 -0
  122. package/gsd-core/bin/gsd-tools.cjs +1928 -0
  123. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  124. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  125. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  126. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  127. package/gsd-core/bin/lib/audit.cjs +743 -0
  128. package/gsd-core/bin/lib/check-command-router.cjs +343 -0
  129. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  130. package/gsd-core/bin/lib/cli-exit.cjs +42 -0
  131. package/gsd-core/bin/lib/clock.cjs +95 -0
  132. package/gsd-core/bin/lib/clusters.cjs +132 -0
  133. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  134. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  135. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  136. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  137. package/gsd-core/bin/lib/commands.cjs +1203 -0
  138. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  139. package/gsd-core/bin/lib/config-types.cjs +19 -0
  140. package/gsd-core/bin/lib/config.cjs +738 -0
  141. package/gsd-core/bin/lib/configuration.cjs +239 -0
  142. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  143. package/gsd-core/bin/lib/core.cjs +2051 -0
  144. package/gsd-core/bin/lib/decisions.cjs +118 -0
  145. package/gsd-core/bin/lib/docs.cjs +252 -0
  146. package/gsd-core/bin/lib/drift.cjs +364 -0
  147. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  148. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  149. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  150. package/gsd-core/bin/lib/graphify.cjs +496 -0
  151. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  152. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  153. package/gsd-core/bin/lib/init.cjs +1815 -0
  154. package/gsd-core/bin/lib/install-profiles.cjs +584 -0
  155. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  156. package/gsd-core/bin/lib/installer-migration-report.cjs +350 -0
  157. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  158. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  159. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  160. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  161. package/gsd-core/bin/lib/installer-migrations.cjs +823 -0
  162. package/gsd-core/bin/lib/intel.cjs +590 -0
  163. package/gsd-core/bin/lib/learnings.cjs +270 -0
  164. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  165. package/gsd-core/bin/lib/milestone.cjs +373 -0
  166. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  167. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  168. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  169. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  170. package/gsd-core/bin/lib/observability/redaction.cjs +48 -0
  171. package/gsd-core/bin/lib/package-identity.cjs +35 -0
  172. package/gsd-core/bin/lib/package-legitimacy.cjs +368 -0
  173. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  174. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  175. package/gsd-core/bin/lib/phase.cjs +1307 -0
  176. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  177. package/gsd-core/bin/lib/plan-scan.cjs +91 -0
  178. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  179. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  180. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  181. package/gsd-core/bin/lib/project-root.cjs +119 -0
  182. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  183. package/gsd-core/bin/lib/research-provider.cjs +137 -0
  184. package/gsd-core/bin/lib/research-store.cjs +167 -0
  185. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  186. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  187. package/gsd-core/bin/lib/roadmap-upgrade.cjs +476 -0
  188. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  189. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +312 -0
  190. package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +56 -0
  191. package/gsd-core/bin/lib/runtime-homes.cjs +190 -0
  192. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  193. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  194. package/gsd-core/bin/lib/schema-detect.cjs +159 -0
  195. package/gsd-core/bin/lib/secrets.cjs +34 -0
  196. package/gsd-core/bin/lib/security.cjs +480 -0
  197. package/gsd-core/bin/lib/semver-compare.cjs +42 -0
  198. package/gsd-core/bin/lib/shell-command-projection.cjs +533 -0
  199. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  200. package/gsd-core/bin/lib/state-document.cjs +259 -0
  201. package/gsd-core/bin/lib/state.cjs +2010 -0
  202. package/gsd-core/bin/lib/surface.cjs +449 -0
  203. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  204. package/gsd-core/bin/lib/template.cjs +237 -0
  205. package/gsd-core/bin/lib/uat.cjs +297 -0
  206. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  207. package/gsd-core/bin/lib/update-context.cjs +218 -0
  208. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  209. package/gsd-core/bin/lib/validate.cjs +112 -0
  210. package/gsd-core/bin/lib/verification-command-router.cjs +31 -0
  211. package/gsd-core/bin/lib/verification.cjs +193 -0
  212. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  213. package/gsd-core/bin/lib/verify.cjs +1451 -0
  214. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +81 -0
  215. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  216. package/gsd-core/bin/lib/workstream-name-policy.cjs +91 -0
  217. package/gsd-core/bin/lib/workstream.cjs +380 -0
  218. package/gsd-core/bin/lib/worktree-base-ref.cjs +325 -0
  219. package/gsd-core/bin/lib/worktree-safety.cjs +943 -0
  220. package/gsd-core/bin/shared/config-defaults.manifest.json +98 -0
  221. package/gsd-core/bin/shared/config-schema.manifest.json +192 -0
  222. package/gsd-core/bin/shared/model-catalog.json +149 -0
  223. package/gsd-core/bin/shared/runtime-aliases.manifest.json +75 -0
  224. package/gsd-core/bin/verify-reapply-patches.cjs +349 -0
  225. package/gsd-core/contexts/dev.md +21 -0
  226. package/gsd-core/contexts/research.md +22 -0
  227. package/gsd-core/contexts/review.md +23 -0
  228. package/gsd-core/references/agent-contracts.md +79 -0
  229. package/gsd-core/references/ai-evals.md +156 -0
  230. package/gsd-core/references/ai-frameworks.md +186 -0
  231. package/gsd-core/references/architecture-decision.md +74 -0
  232. package/gsd-core/references/artifact-types.md +131 -0
  233. package/gsd-core/references/auth-in-tests.md +91 -0
  234. package/gsd-core/references/autonomous-smart-discuss.md +277 -0
  235. package/gsd-core/references/checkpoints.md +814 -0
  236. package/gsd-core/references/common-bug-patterns.md +114 -0
  237. package/gsd-core/references/context-budget.md +85 -0
  238. package/gsd-core/references/continuation-format.md +253 -0
  239. package/gsd-core/references/db-test-isolation.md +54 -0
  240. package/gsd-core/references/debugger-philosophy.md +76 -0
  241. package/gsd-core/references/decimal-phase-calculation.md +64 -0
  242. package/gsd-core/references/doc-conflict-engine.md +91 -0
  243. package/gsd-core/references/domain-modeling.md +80 -0
  244. package/gsd-core/references/domain-probes.md +125 -0
  245. package/gsd-core/references/e2e-tiering.md +35 -0
  246. package/gsd-core/references/execute-mvp-tdd.md +81 -0
  247. package/gsd-core/references/executor-examples.md +110 -0
  248. package/gsd-core/references/few-shot-examples/plan-checker.md +73 -0
  249. package/gsd-core/references/few-shot-examples/verifier.md +109 -0
  250. package/gsd-core/references/flaky-test-checklist.md +22 -0
  251. package/gsd-core/references/gate-prompts.md +100 -0
  252. package/gsd-core/references/gates.md +70 -0
  253. package/gsd-core/references/git-integration.md +298 -0
  254. package/gsd-core/references/git-planning-commit.md +40 -0
  255. package/gsd-core/references/ios-scaffold.md +123 -0
  256. package/gsd-core/references/mandatory-initial-read.md +2 -0
  257. package/gsd-core/references/model-profile-resolution.md +38 -0
  258. package/gsd-core/references/model-profiles.md +245 -0
  259. package/gsd-core/references/mvp-concepts.md +49 -0
  260. package/gsd-core/references/phase-argument-parsing.md +61 -0
  261. package/gsd-core/references/planner-antipatterns.md +89 -0
  262. package/gsd-core/references/planner-chunked.md +49 -0
  263. package/gsd-core/references/planner-gap-closure.md +62 -0
  264. package/gsd-core/references/planner-graphify-auto-update.md +67 -0
  265. package/gsd-core/references/planner-human-verify-mode.md +57 -0
  266. package/gsd-core/references/planner-interface-context.md +62 -0
  267. package/gsd-core/references/planner-load-graph-context.md +36 -0
  268. package/gsd-core/references/planner-mvp-mode.md +53 -0
  269. package/gsd-core/references/planner-reviews.md +39 -0
  270. package/gsd-core/references/planner-revision.md +87 -0
  271. package/gsd-core/references/planner-source-audit.md +73 -0
  272. package/gsd-core/references/planning-config.md +473 -0
  273. package/gsd-core/references/product-discovery.md +49 -0
  274. package/gsd-core/references/project-skills-discovery.md +19 -0
  275. package/gsd-core/references/questioning.md +162 -0
  276. package/gsd-core/references/realistic-test-data.md +44 -0
  277. package/gsd-core/references/research-documentation-lookup.md +29 -0
  278. package/gsd-core/references/research-philosophy.md +29 -0
  279. package/gsd-core/references/research-verification-protocol.md +27 -0
  280. package/gsd-core/references/revision-loop.md +97 -0
  281. package/gsd-core/references/scout-codebase.md +51 -0
  282. package/gsd-core/references/skeleton-template.md +48 -0
  283. package/gsd-core/references/sketch-interactivity.md +41 -0
  284. package/gsd-core/references/sketch-theme-system.md +94 -0
  285. package/gsd-core/references/sketch-tooling.md +45 -0
  286. package/gsd-core/references/sketch-variant-patterns.md +81 -0
  287. package/gsd-core/references/spidr-splitting.md +69 -0
  288. package/gsd-core/references/tdd.md +330 -0
  289. package/gsd-core/references/test-containers.md +55 -0
  290. package/gsd-core/references/test-strategy.md +75 -0
  291. package/gsd-core/references/thinking-models-debug.md +44 -0
  292. package/gsd-core/references/thinking-models-execution.md +50 -0
  293. package/gsd-core/references/thinking-models-planning.md +62 -0
  294. package/gsd-core/references/thinking-models-research.md +50 -0
  295. package/gsd-core/references/thinking-models-verification.md +55 -0
  296. package/gsd-core/references/thinking-partner.md +96 -0
  297. package/gsd-core/references/ui-brand.md +162 -0
  298. package/gsd-core/references/universal-anti-patterns.md +63 -0
  299. package/gsd-core/references/user-profiling.md +681 -0
  300. package/gsd-core/references/user-story-template.md +58 -0
  301. package/gsd-core/references/verification-overrides.md +227 -0
  302. package/gsd-core/references/verification-patterns.md +612 -0
  303. package/gsd-core/references/verify-mvp-mode.md +85 -0
  304. package/gsd-core/references/workstream-flag.md +111 -0
  305. package/gsd-core/references/worktree-branch-check.md +38 -0
  306. package/gsd-core/references/worktree-path-safety.md +67 -0
  307. package/gsd-core/templates/AI-SPEC.md +246 -0
  308. package/gsd-core/templates/DEBUG.md +169 -0
  309. package/gsd-core/templates/README.md +77 -0
  310. package/gsd-core/templates/SECURITY.md +61 -0
  311. package/gsd-core/templates/UAT.md +265 -0
  312. package/gsd-core/templates/UI-SPEC.md +100 -0
  313. package/gsd-core/templates/VALIDATION.md +76 -0
  314. package/gsd-core/templates/adr.md +58 -0
  315. package/gsd-core/templates/claude-md.md +145 -0
  316. package/gsd-core/templates/codebase/architecture.md +255 -0
  317. package/gsd-core/templates/codebase/concerns.md +310 -0
  318. package/gsd-core/templates/codebase/conventions.md +307 -0
  319. package/gsd-core/templates/codebase/integrations.md +280 -0
  320. package/gsd-core/templates/codebase/stack.md +186 -0
  321. package/gsd-core/templates/codebase/structure.md +285 -0
  322. package/gsd-core/templates/codebase/testing.md +480 -0
  323. package/gsd-core/templates/config.json +62 -0
  324. package/gsd-core/templates/context.md +352 -0
  325. package/gsd-core/templates/continue-here.md +78 -0
  326. package/gsd-core/templates/copilot-instructions.md +7 -0
  327. package/gsd-core/templates/debug-subagent-prompt.md +91 -0
  328. package/gsd-core/templates/dev-preferences.md +21 -0
  329. package/gsd-core/templates/discovery.md +146 -0
  330. package/gsd-core/templates/discussion-log.md +63 -0
  331. package/gsd-core/templates/domain-model.md +54 -0
  332. package/gsd-core/templates/milestone-archive.md +123 -0
  333. package/gsd-core/templates/milestone.md +115 -0
  334. package/gsd-core/templates/phase-prompt.md +610 -0
  335. package/gsd-core/templates/planner-subagent-prompt.md +117 -0
  336. package/gsd-core/templates/product-brief.md +55 -0
  337. package/gsd-core/templates/project.md +186 -0
  338. package/gsd-core/templates/requirements.md +231 -0
  339. package/gsd-core/templates/research-project/ARCHITECTURE.md +204 -0
  340. package/gsd-core/templates/research-project/FEATURES.md +147 -0
  341. package/gsd-core/templates/research-project/PITFALLS.md +200 -0
  342. package/gsd-core/templates/research-project/STACK.md +120 -0
  343. package/gsd-core/templates/research-project/SUMMARY.md +170 -0
  344. package/gsd-core/templates/research.md +592 -0
  345. package/gsd-core/templates/retrospective.md +54 -0
  346. package/gsd-core/templates/roadmap.md +202 -0
  347. package/gsd-core/templates/spec.md +307 -0
  348. package/gsd-core/templates/state.md +195 -0
  349. package/gsd-core/templates/summary-complex.md +59 -0
  350. package/gsd-core/templates/summary-minimal.md +41 -0
  351. package/gsd-core/templates/summary-standard.md +48 -0
  352. package/gsd-core/templates/summary.md +248 -0
  353. package/gsd-core/templates/test-strategy.md +50 -0
  354. package/gsd-core/templates/user-profile.md +146 -0
  355. package/gsd-core/templates/user-setup.md +311 -0
  356. package/gsd-core/templates/verification-report.md +322 -0
  357. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  358. package/gsd-core/workflows/add-backlog.md +91 -0
  359. package/gsd-core/workflows/add-phase.md +113 -0
  360. package/gsd-core/workflows/add-tests.md +355 -0
  361. package/gsd-core/workflows/add-todo.md +161 -0
  362. package/gsd-core/workflows/ai-integration-phase.md +295 -0
  363. package/gsd-core/workflows/analyze-dependencies.md +96 -0
  364. package/gsd-core/workflows/audit-fix.md +178 -0
  365. package/gsd-core/workflows/audit-milestone.md +360 -0
  366. package/gsd-core/workflows/audit-uat.md +110 -0
  367. package/gsd-core/workflows/autonomous.md +797 -0
  368. package/gsd-core/workflows/check-todos.md +180 -0
  369. package/gsd-core/workflows/cleanup.md +195 -0
  370. package/gsd-core/workflows/code-review-fix.md +502 -0
  371. package/gsd-core/workflows/code-review.md +658 -0
  372. package/gsd-core/workflows/complete-milestone.md +855 -0
  373. package/gsd-core/workflows/debug.md +237 -0
  374. package/gsd-core/workflows/diagnose-issues.md +245 -0
  375. package/gsd-core/workflows/discover-product.md +112 -0
  376. package/gsd-core/workflows/discovery-phase.md +291 -0
  377. package/gsd-core/workflows/discuss-phase/modes/advisor.md +176 -0
  378. package/gsd-core/workflows/discuss-phase/modes/all.md +28 -0
  379. package/gsd-core/workflows/discuss-phase/modes/analyze.md +44 -0
  380. package/gsd-core/workflows/discuss-phase/modes/auto.md +57 -0
  381. package/gsd-core/workflows/discuss-phase/modes/batch.md +52 -0
  382. package/gsd-core/workflows/discuss-phase/modes/chain.md +98 -0
  383. package/gsd-core/workflows/discuss-phase/modes/default.md +141 -0
  384. package/gsd-core/workflows/discuss-phase/modes/power.md +44 -0
  385. package/gsd-core/workflows/discuss-phase/modes/text.md +55 -0
  386. package/gsd-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
  387. package/gsd-core/workflows/discuss-phase/templates/context.md +136 -0
  388. package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
  389. package/gsd-core/workflows/discuss-phase-assumptions.md +675 -0
  390. package/gsd-core/workflows/discuss-phase-power.md +291 -0
  391. package/gsd-core/workflows/discuss-phase.md +499 -0
  392. package/gsd-core/workflows/do.md +111 -0
  393. package/gsd-core/workflows/docs-update.md +1176 -0
  394. package/gsd-core/workflows/edit-phase.md +295 -0
  395. package/gsd-core/workflows/eval-review.md +156 -0
  396. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
  397. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  398. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
  399. package/gsd-core/workflows/execute-phase.md +1752 -0
  400. package/gsd-core/workflows/execute-plan.md +526 -0
  401. package/gsd-core/workflows/explore.md +146 -0
  402. package/gsd-core/workflows/extract-learnings.md +243 -0
  403. package/gsd-core/workflows/fast.md +124 -0
  404. package/gsd-core/workflows/forensics.md +279 -0
  405. package/gsd-core/workflows/graduation.md +196 -0
  406. package/gsd-core/workflows/health.md +224 -0
  407. package/gsd-core/workflows/help/modes/brief.md +22 -0
  408. package/gsd-core/workflows/help/modes/default.md +50 -0
  409. package/gsd-core/workflows/help/modes/full.md +789 -0
  410. package/gsd-core/workflows/help/modes/topic.md +74 -0
  411. package/gsd-core/workflows/help.md +24 -0
  412. package/gsd-core/workflows/import.md +256 -0
  413. package/gsd-core/workflows/inbox.md +387 -0
  414. package/gsd-core/workflows/ingest-docs.md +340 -0
  415. package/gsd-core/workflows/insert-phase.md +152 -0
  416. package/gsd-core/workflows/list-phase-assumptions.md +178 -0
  417. package/gsd-core/workflows/list-workspaces.md +57 -0
  418. package/gsd-core/workflows/manager.md +393 -0
  419. package/gsd-core/workflows/map-codebase.md +446 -0
  420. package/gsd-core/workflows/milestone-summary.md +224 -0
  421. package/gsd-core/workflows/model-domain.md +162 -0
  422. package/gsd-core/workflows/mvp-phase.md +222 -0
  423. package/gsd-core/workflows/new-milestone.md +635 -0
  424. package/gsd-core/workflows/new-project.md +1555 -0
  425. package/gsd-core/workflows/new-workspace.md +240 -0
  426. package/gsd-core/workflows/next.md +299 -0
  427. package/gsd-core/workflows/node-repair.md +92 -0
  428. package/gsd-core/workflows/note.md +158 -0
  429. package/gsd-core/workflows/pause-work.md +244 -0
  430. package/gsd-core/workflows/plan-milestone-gaps.md +281 -0
  431. package/gsd-core/workflows/plan-phase.md +1814 -0
  432. package/gsd-core/workflows/plan-review-convergence.md +346 -0
  433. package/gsd-core/workflows/plant-seed.md +230 -0
  434. package/gsd-core/workflows/pr-branch.md +157 -0
  435. package/gsd-core/workflows/profile-user.md +453 -0
  436. package/gsd-core/workflows/progress.md +699 -0
  437. package/gsd-core/workflows/quick.md +1017 -0
  438. package/gsd-core/workflows/reapply-patches.md +426 -0
  439. package/gsd-core/workflows/recommend-architecture.md +135 -0
  440. package/gsd-core/workflows/remove-phase.md +156 -0
  441. package/gsd-core/workflows/remove-workspace.md +108 -0
  442. package/gsd-core/workflows/resume-project.md +332 -0
  443. package/gsd-core/workflows/review.md +748 -0
  444. package/gsd-core/workflows/scan.md +107 -0
  445. package/gsd-core/workflows/secure-phase.md +182 -0
  446. package/gsd-core/workflows/session-report.md +146 -0
  447. package/gsd-core/workflows/settings-advanced.md +810 -0
  448. package/gsd-core/workflows/settings-integrations.md +312 -0
  449. package/gsd-core/workflows/settings.md +566 -0
  450. package/gsd-core/workflows/ship.md +405 -0
  451. package/gsd-core/workflows/sketch-wrap-up.md +286 -0
  452. package/gsd-core/workflows/sketch.md +361 -0
  453. package/gsd-core/workflows/spec-phase.md +263 -0
  454. package/gsd-core/workflows/spike-wrap-up.md +307 -0
  455. package/gsd-core/workflows/spike.md +453 -0
  456. package/gsd-core/workflows/stats.md +80 -0
  457. package/gsd-core/workflows/sync-skills.md +182 -0
  458. package/gsd-core/workflows/testing-strategy.md +122 -0
  459. package/gsd-core/workflows/thread.md +222 -0
  460. package/gsd-core/workflows/transition.md +694 -0
  461. package/gsd-core/workflows/ui-phase.md +328 -0
  462. package/gsd-core/workflows/ui-review.md +193 -0
  463. package/gsd-core/workflows/ultraplan-phase.md +199 -0
  464. package/gsd-core/workflows/undo.md +314 -0
  465. package/gsd-core/workflows/update.md +496 -0
  466. package/gsd-core/workflows/validate-phase.md +181 -0
  467. package/gsd-core/workflows/verify-phase.md +544 -0
  468. package/gsd-core/workflows/verify-work.md +781 -0
  469. package/hooks/dist/gsd-check-update-worker.js +108 -0
  470. package/hooks/dist/gsd-check-update.js +66 -0
  471. package/hooks/dist/gsd-config-reload.js +133 -0
  472. package/hooks/dist/gsd-context-monitor.js +195 -0
  473. package/hooks/dist/gsd-cursor-post-tool.js +75 -0
  474. package/hooks/dist/gsd-cursor-session-start.js +52 -0
  475. package/hooks/dist/gsd-graphify-update.sh +158 -0
  476. package/hooks/dist/gsd-phase-boundary.sh +47 -0
  477. package/hooks/dist/gsd-prompt-guard.js +97 -0
  478. package/hooks/dist/gsd-read-guard.js +101 -0
  479. package/hooks/dist/gsd-read-injection-scanner.js +203 -0
  480. package/hooks/dist/gsd-session-state.sh +59 -0
  481. package/hooks/dist/gsd-statusline.js +566 -0
  482. package/hooks/dist/gsd-update-banner.js +138 -0
  483. package/hooks/dist/gsd-validate-commit.sh +57 -0
  484. package/hooks/dist/gsd-workflow-guard.js +167 -0
  485. package/hooks/dist/gsd-worktree-path-guard.js +169 -0
  486. package/hooks/dist/lib/git-cmd.js +150 -0
  487. package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
  488. package/hooks/dist/managed-hooks-registry.cjs +38 -0
  489. package/hooks/gsd-check-update-worker.js +108 -0
  490. package/hooks/gsd-check-update.js +66 -0
  491. package/hooks/gsd-config-reload.js +133 -0
  492. package/hooks/gsd-context-monitor.js +195 -0
  493. package/hooks/gsd-cursor-post-tool.js +75 -0
  494. package/hooks/gsd-cursor-session-start.js +52 -0
  495. package/hooks/gsd-graphify-update.sh +158 -0
  496. package/hooks/gsd-phase-boundary.sh +47 -0
  497. package/hooks/gsd-prompt-guard.js +97 -0
  498. package/hooks/gsd-read-guard.js +101 -0
  499. package/hooks/gsd-read-injection-scanner.js +203 -0
  500. package/hooks/gsd-session-state.sh +59 -0
  501. package/hooks/gsd-statusline.js +566 -0
  502. package/hooks/gsd-update-banner.js +138 -0
  503. package/hooks/gsd-validate-commit.sh +57 -0
  504. package/hooks/gsd-workflow-guard.js +167 -0
  505. package/hooks/gsd-worktree-path-guard.js +169 -0
  506. package/hooks/hooks.json +69 -0
  507. package/hooks/lib/git-cmd.js +150 -0
  508. package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
  509. package/hooks/managed-hooks-registry.cjs +38 -0
  510. package/package.json +115 -0
  511. package/scripts/affected-tests-lib.cjs +542 -0
  512. package/scripts/audit-workflow-script-paths.cjs +73 -0
  513. package/scripts/base64-scan.sh +351 -0
  514. package/scripts/build-hooks.js +247 -0
  515. package/scripts/changeset/README.md +129 -0
  516. package/scripts/changeset/cli.cjs +590 -0
  517. package/scripts/changeset/github-release-notes.cjs +199 -0
  518. package/scripts/changeset/lint.cjs +111 -0
  519. package/scripts/changeset/new.cjs +137 -0
  520. package/scripts/changeset/parse.cjs +114 -0
  521. package/scripts/changeset/render.cjs +34 -0
  522. package/scripts/changeset/serialize.cjs +130 -0
  523. package/scripts/check-alias-drift.cjs +114 -0
  524. package/scripts/check-env.cjs +312 -0
  525. package/scripts/check-npm-integrity.cjs +215 -0
  526. package/scripts/ci-guard-runner.cjs +22 -0
  527. package/scripts/ci-prepare-test-scope.cjs +51 -0
  528. package/scripts/ci-rebase-check.cjs +86 -0
  529. package/scripts/ci-test-scope.cjs +431 -0
  530. package/scripts/command-contract-helpers.cjs +64 -0
  531. package/scripts/diff-touches-shipped-paths.cjs +155 -0
  532. package/scripts/fix-slash-commands.cjs +147 -0
  533. package/scripts/gen-inventory-manifest.cjs +115 -0
  534. package/scripts/gen-research-agents.cjs +276 -0
  535. package/scripts/generate-package-identity.cjs +125 -0
  536. package/scripts/issue-dedupe.cjs +278 -0
  537. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  538. package/scripts/lib/cli-exit.cjs +56 -0
  539. package/scripts/lint-command-contract.cjs +114 -0
  540. package/scripts/lint-descriptions.cjs +87 -0
  541. package/scripts/lint-docs-required.cjs +222 -0
  542. package/scripts/lint-legacy-dir-name.cjs +160 -0
  543. package/scripts/lint-package-identity-drift.cjs +141 -0
  544. package/scripts/lint-pr-check-project-dir.cjs +99 -0
  545. package/scripts/lint-shell-command-projection-drift.cjs +62 -0
  546. package/scripts/lint-skill-deps.cjs +185 -0
  547. package/scripts/lint-test-file-count.allowlist.json +135 -0
  548. package/scripts/lint-test-file-count.cjs +246 -0
  549. package/scripts/mutation-matrix.cjs +222 -0
  550. package/scripts/pr-template-policy.cjs +268 -0
  551. package/scripts/prompt-injection-scan.sh +207 -0
  552. package/scripts/release-notes/discord-release-summary.cjs +373 -0
  553. package/scripts/release-notes/format-github-release-notes.cjs +261 -0
  554. package/scripts/release-tarball-smoke.cjs +629 -0
  555. package/scripts/research-profiles.cjs +149 -0
  556. package/scripts/run-affected-tests.cjs +7 -0
  557. package/scripts/run-cross-platform-tests.cjs +67 -0
  558. package/scripts/run-tests.cjs +315 -0
  559. package/scripts/secret-scan-lint.sh +231 -0
  560. package/scripts/secret-scan.sh +358 -0
  561. package/scripts/setup-branch-protection.sh +236 -0
  562. package/scripts/strip-prose-atrefs.cjs +106 -0
  563. package/scripts/sync-manifest-versions.cjs +119 -0
  564. package/scripts/sync-rulesets.sh +34 -0
  565. package/scripts/sync-runtime-launcher.cjs +399 -0
  566. package/scripts/test-failure-reasons.cjs +34 -0
  567. package/scripts/verify-npm-publish.cjs +240 -0
  568. package/scripts/workflow-policy.cjs +450 -0
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env node
2
+ // gsd-hook-version: {{GSD_VERSION}}
3
+ // Background worker spawned by gsd-check-update.js (SessionStart hook).
4
+ // Checks for GSD updates and stale hooks, writes result to cache file.
5
+ // Receives paths via environment variables set by the parent hook.
6
+ //
7
+ // Using a separate file (rather than node -e '<inline code>') avoids the
8
+ // template-literal regex-escaping problem: regex source is plain JS here.
9
+
10
+ 'use strict';
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const { isSemverNewer } = require('../gsd-core/bin/lib/semver-compare.cjs');
15
+ // Latest-version lookup is delegated to the single deterministic adapter
16
+ // (#498). checkLatestVersion() owns the npm-view call, the timeout/semver
17
+ // policy, and the package name — sourced from the baked Package Identity seam.
18
+ // The previous `require('../package.json').name` (#378) resolved to undefined
19
+ // in the installed tree (only a {"type":"commonjs"} marker ships), so the
20
+ // background check never reported updates.
21
+ const { checkLatestVersion } = require('../gsd-core/bin/check-latest-version.cjs');
22
+ const { PACKAGE_NAME } = require('../gsd-core/bin/lib/package-identity.cjs');
23
+ // Authoritative list of managed hooks — shared with tests to retire source-grep
24
+ // assertions (pending-migration-to-typed-ir [#455]).
25
+ // NOTE: managed-hooks-registry.cjs must be in HOOKS_TO_COPY (scripts/build-hooks.js)
26
+ // so it is present in hooks/dist/ and ships to the installed runtime hooks/ dir.
27
+ // If it is missing (e.g., installed from an older dist), catch and degrade gracefully
28
+ // so the worker always proceeds to compute and write the result cache record.
29
+ let MANAGED_HOOKS = [];
30
+ try {
31
+ ({ MANAGED_HOOKS } = require('./managed-hooks-registry.cjs'));
32
+ } catch (e) {
33
+ // Module not found in installed runtime — stale-hook detection degrades to
34
+ // no-op (empty list means no hooks are checked for staleness). The worker
35
+ // still runs and writes package_name / installed / latest / update_available.
36
+ }
37
+
38
+ const cacheFile = process.env.GSD_CACHE_FILE;
39
+ const projectVersionFile = process.env.GSD_PROJECT_VERSION_FILE;
40
+ const globalVersionFile = process.env.GSD_GLOBAL_VERSION_FILE;
41
+
42
+ // Check project directory first (local install), then global
43
+ let installed = '0.0.0';
44
+ let configDir = '';
45
+ try {
46
+ if (fs.existsSync(projectVersionFile)) {
47
+ installed = fs.readFileSync(projectVersionFile, 'utf8').trim();
48
+ configDir = path.dirname(path.dirname(projectVersionFile));
49
+ } else if (fs.existsSync(globalVersionFile)) {
50
+ installed = fs.readFileSync(globalVersionFile, 'utf8').trim();
51
+ configDir = path.dirname(path.dirname(globalVersionFile));
52
+ }
53
+ } catch (e) {}
54
+
55
+ // Check for stale hooks — compare hook version headers against installed VERSION
56
+ // Hooks are installed at configDir/hooks/ (e.g. ~/.claude/hooks/) (#1421)
57
+ // Only check hooks that GSD currently ships — orphaned files from removed features
58
+ // (e.g., gsd-intel-*.js) must be ignored to avoid permanent stale warnings (#1750)
59
+ // MANAGED_HOOKS is imported from ./managed-hooks-registry.cjs above.
60
+
61
+ let staleHooks = [];
62
+ if (configDir) {
63
+ const hooksDir = path.join(configDir, 'hooks');
64
+ try {
65
+ if (fs.existsSync(hooksDir)) {
66
+ const hookFiles = fs.readdirSync(hooksDir).filter(f => MANAGED_HOOKS.includes(f));
67
+ for (const hookFile of hookFiles) {
68
+ try {
69
+ const content = fs.readFileSync(path.join(hooksDir, hookFile), 'utf8');
70
+ // Match both JS (//) and bash (#) comment styles
71
+ const versionMatch = content.match(/(?:\/\/|#) gsd-hook-version:\s*(.+)/);
72
+ if (versionMatch) {
73
+ const hookVersion = versionMatch[1].trim();
74
+ if (isSemverNewer(installed, hookVersion) && !hookVersion.includes('{{')) {
75
+ staleHooks.push({ file: hookFile, hookVersion, installedVersion: installed });
76
+ }
77
+ } else {
78
+ // No version header at all — definitely stale (pre-version-tracking)
79
+ staleHooks.push({ file: hookFile, hookVersion: 'unknown', installedVersion: installed });
80
+ }
81
+ } catch (e) {}
82
+ }
83
+ }
84
+ } catch (e) {}
85
+ }
86
+
87
+ // Single adapter for the registry lookup (#498). checkLatestVersion() routes
88
+ // through the shell-projection seam, which already owns the Windows shell-flag
89
+ // policy, the timeout, and semver validation. A non-ok result leaves latest
90
+ // null, exactly as the previous inline try/catch did.
91
+ let latest = null;
92
+ try {
93
+ const lv = checkLatestVersion();
94
+ if (lv && lv.ok) latest = lv.version;
95
+ } catch (e) {}
96
+
97
+ const result = {
98
+ update_available: latest && isSemverNewer(latest, installed),
99
+ installed,
100
+ latest: latest || 'unknown',
101
+ checked: Math.floor(Date.now() / 1000),
102
+ stale_hooks: staleHooks.length > 0 ? staleHooks : undefined,
103
+ package_name: PACKAGE_NAME,
104
+ };
105
+
106
+ if (cacheFile) {
107
+ try { fs.writeFileSync(cacheFile, JSON.stringify(result)); } catch (e) {}
108
+ }
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ // gsd-hook-version: {{GSD_VERSION}}
3
+ // Check for GSD updates in background, write result to cache
4
+ // Called by SessionStart hook - runs once per session
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+ const os = require('os');
9
+ const { spawn } = require('child_process');
10
+
11
+ const { updateCacheFileName } = require('../gsd-core/bin/lib/package-identity.cjs');
12
+
13
+ const homeDir = os.homedir();
14
+ const cwd = process.cwd();
15
+
16
+ // Detect runtime config directory (supports Claude, OpenCode, Kilo, Gemini)
17
+ // Respects CLAUDE_CONFIG_DIR for custom config directory setups
18
+ function detectConfigDir(baseDir) {
19
+ // Check env override first (supports multi-account setups)
20
+ const envDir = process.env.CLAUDE_CONFIG_DIR;
21
+ if (envDir && fs.existsSync(path.join(envDir, 'gsd-core', 'VERSION'))) {
22
+ return envDir;
23
+ }
24
+ for (const dir of ['.claude', '.gemini', '.config/kilo', '.kilo', '.config/opencode', '.opencode']) {
25
+ if (fs.existsSync(path.join(baseDir, dir, 'gsd-core', 'VERSION'))) {
26
+ return path.join(baseDir, dir);
27
+ }
28
+ }
29
+ return envDir || path.join(baseDir, '.claude');
30
+ }
31
+
32
+ const globalConfigDir = detectConfigDir(homeDir);
33
+ const projectConfigDir = detectConfigDir(cwd);
34
+ // Use a shared, tool-agnostic cache directory to avoid multi-runtime
35
+ // resolution mismatches where check-update writes to one runtime's cache
36
+ // but statusline reads from another (#1421).
37
+ const cacheDir = path.join(homeDir, '.cache', 'gsd');
38
+ const cacheFile = path.join(cacheDir, updateCacheFileName);
39
+
40
+ // VERSION file locations (check project first, then global)
41
+ const projectVersionFile = path.join(projectConfigDir, 'gsd-core', 'VERSION');
42
+ const globalVersionFile = path.join(globalConfigDir, 'gsd-core', 'VERSION');
43
+
44
+ // Ensure cache directory exists
45
+ if (!fs.existsSync(cacheDir)) {
46
+ fs.mkdirSync(cacheDir, { recursive: true });
47
+ }
48
+
49
+ // Run check in background via a dedicated worker script.
50
+ // Spawning a file (rather than node -e '<inline code>') keeps the worker logic
51
+ // in plain JS with no template-literal regex-escaping concerns, and makes the
52
+ // worker independently testable.
53
+ const workerPath = path.join(__dirname, 'gsd-check-update-worker.js');
54
+ const child = spawn(process.execPath, [workerPath], {
55
+ stdio: 'ignore',
56
+ windowsHide: true,
57
+ detached: true, // Required on Windows for proper process detachment
58
+ env: {
59
+ ...process.env,
60
+ GSD_CACHE_FILE: cacheFile,
61
+ GSD_PROJECT_VERSION_FILE: projectVersionFile,
62
+ GSD_GLOBAL_VERSION_FILE: globalVersionFile,
63
+ },
64
+ });
65
+
66
+ child.unref();
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env node
2
+ // gsd-hook-version: {{GSD_VERSION}}
3
+ // gsd-config-reload.js — FileChanged hook: hot-reload GSD config context
4
+ // Fires when .planning/config.json is modified, created, or deleted.
5
+ //
6
+ // When the user edits .planning/config.json mid-session, this hook reads the
7
+ // updated config and injects a summary as additionalContext so the agent knows
8
+ // the new configuration without requiring a session restart.
9
+ //
10
+ // Input (from Claude Code):
11
+ // { session_id, cwd, hook_event_name: "FileChanged",
12
+ // file_path: "/abs/path/.planning/config.json", event: "change"|"add"|"unlink" }
13
+ //
14
+ // Output:
15
+ // { hookSpecificOutput: { hookEventName: "FileChanged", additionalContext: "..." } }
16
+ // or exits 0 silently (if config absent, unreadable, or event is "unlink").
17
+ //
18
+ // Enabled for all Claude Code installs. This hook is always-on — it is a
19
+ // no-op when .planning/config.json is absent (ENOENT → exit 0).
20
+
21
+ const fs = require('fs');
22
+ const path = require('path');
23
+
24
+ let input = '';
25
+ // Timeout guard: if stdin does not close within 8s exit silently rather than
26
+ // hanging until Claude Code kills the process and reports "hook error".
27
+ const stdinTimeout = setTimeout(() => process.exit(0), 8000);
28
+ process.stdin.setEncoding('utf8');
29
+ process.stdin.on('data', chunk => (input += chunk));
30
+ process.stdin.on('end', () => {
31
+ clearTimeout(stdinTimeout);
32
+ try {
33
+ const data = JSON.parse(input);
34
+ const event = data.event; // "change" | "add" | "unlink"
35
+ const filePath = data.file_path || '';
36
+ const cwd = data.cwd || process.cwd();
37
+
38
+ // Only handle the GSD planning config — verify both basename and that the
39
+ // resolved path is .planning/config.json relative to cwd. The hook
40
+ // matcher ('config.json') fires on any watched config.json; this guard
41
+ // ensures an unrelated config.json in node_modules/ or elsewhere does not
42
+ // inject spurious additionalContext.
43
+ const basename = path.basename(filePath);
44
+ if (basename !== 'config.json') {
45
+ process.exit(0);
46
+ }
47
+ const expectedPath = path.resolve(cwd, '.planning', 'config.json');
48
+ if (path.resolve(filePath) !== expectedPath) {
49
+ process.exit(0);
50
+ }
51
+
52
+ // On unlink (deletion) emit a brief notice and exit
53
+ if (event === 'unlink') {
54
+ process.stdout.write(JSON.stringify({
55
+ hookSpecificOutput: {
56
+ hookEventName: 'FileChanged',
57
+ additionalContext:
58
+ 'GSD config (.planning/config.json) was deleted. ' +
59
+ 'Falling back to built-in defaults for this session.',
60
+ },
61
+ }));
62
+ process.exit(0);
63
+ }
64
+
65
+ // Read the updated config file
66
+ let config;
67
+ try {
68
+ const raw = fs.readFileSync(filePath, 'utf8');
69
+ config = JSON.parse(raw);
70
+ } catch (e) {
71
+ if (e && e.code === 'ENOENT') process.exit(0);
72
+ // Malformed JSON — inform the agent without crashing
73
+ process.stdout.write(JSON.stringify({
74
+ hookSpecificOutput: {
75
+ hookEventName: 'FileChanged',
76
+ additionalContext:
77
+ 'GSD config (.planning/config.json) was modified but could not be parsed. ' +
78
+ 'Check the file for JSON syntax errors.',
79
+ },
80
+ }));
81
+ process.exit(0);
82
+ }
83
+
84
+ // Build a concise summary of key config fields the agent cares about
85
+ const lines = ['GSD config reloaded (.planning/config.json updated):'];
86
+
87
+ if (config.runtime) lines.push(` runtime: ${config.runtime}`);
88
+ if (config.mode) lines.push(` mode: ${config.mode}`);
89
+
90
+ // hooks section (opt-in toggles agents act on)
91
+ if (config.hooks && typeof config.hooks === 'object') {
92
+ const hookKeys = Object.entries(config.hooks)
93
+ .filter(([, v]) => v !== undefined)
94
+ .map(([k, v]) => `${k}=${v}`)
95
+ .join(', ');
96
+ if (hookKeys) lines.push(` hooks: { ${hookKeys} }`);
97
+ }
98
+
99
+ // workflow section (key toggles)
100
+ if (config.workflow && typeof config.workflow === 'object') {
101
+ const wfKeys = Object.entries(config.workflow)
102
+ .filter(([, v]) => v !== undefined)
103
+ .map(([k, v]) => `${k}=${v}`)
104
+ .join(', ');
105
+ if (wfKeys) lines.push(` workflow: { ${wfKeys} }`);
106
+ }
107
+
108
+ // model overrides (agents use these)
109
+ if (config.models && typeof config.models === 'object') {
110
+ const modelKeys = Object.entries(config.models)
111
+ .filter(([, v]) => v !== undefined)
112
+ .map(([k, v]) => `${k}=${v}`)
113
+ .join(', ');
114
+ if (modelKeys) lines.push(` models: { ${modelKeys} }`);
115
+ }
116
+
117
+ if (lines.length === 1) {
118
+ // No notable fields — still confirm the reload happened
119
+ lines.push(' (no notable keys changed)');
120
+ }
121
+
122
+ const additionalContext = lines.join('\n');
123
+ process.stdout.write(JSON.stringify({
124
+ hookSpecificOutput: {
125
+ hookEventName: 'FileChanged',
126
+ additionalContext,
127
+ },
128
+ }));
129
+ } catch (e) {
130
+ // Silent fail — never block the session on a config reload error
131
+ process.exit(0);
132
+ }
133
+ });
@@ -0,0 +1,195 @@
1
+ #!/usr/bin/env node
2
+ // gsd-hook-version: {{GSD_VERSION}}
3
+ // Context Monitor - PostToolUse/AfterTool hook (Gemini uses AfterTool)
4
+ // Reads context metrics from the statusline bridge file and injects
5
+ // warnings when context usage is high. This makes the AGENT aware of
6
+ // context limits (the statusline only shows the user).
7
+ //
8
+ // How it works:
9
+ // 1. The statusline hook writes metrics to /tmp/claude-ctx-{session_id}.json
10
+ // 2. This hook reads those metrics after each tool use
11
+ // 3. When remaining context drops below thresholds, it injects a warning
12
+ // as additionalContext, which the agent sees in its conversation
13
+ //
14
+ // Thresholds:
15
+ // WARNING (remaining <= 35%): Agent should wrap up current task
16
+ // CRITICAL (remaining <= 25%): Agent should stop immediately and save state
17
+ //
18
+ // Debounce: 5 tool uses between warnings to avoid spam
19
+ // Severity escalation bypasses debounce (WARNING -> CRITICAL fires immediately)
20
+
21
+ const fs = require('fs');
22
+ const os = require('os');
23
+ const path = require('path');
24
+ const { spawn } = require('child_process');
25
+
26
+ const WARNING_THRESHOLD = 35; // remaining_percentage <= 35%
27
+ const CRITICAL_THRESHOLD = 25; // remaining_percentage <= 25%
28
+ const STALE_SECONDS = 60; // ignore metrics older than 60s
29
+ const DEBOUNCE_CALLS = 5; // min tool uses between warnings
30
+
31
+ let input = '';
32
+ // Timeout guard: if stdin doesn't close within 10s (e.g. pipe issues on
33
+ // Windows/Git Bash, or slow Claude Code piping during large outputs),
34
+ // exit silently instead of hanging until Claude Code kills the process
35
+ // and reports "hook error". See #775, #1162.
36
+ const stdinTimeout = setTimeout(() => process.exit(0), 10000);
37
+ process.stdin.setEncoding('utf8');
38
+ process.stdin.on('data', chunk => input += chunk);
39
+ process.stdin.on('end', () => {
40
+ clearTimeout(stdinTimeout);
41
+ try {
42
+ const data = JSON.parse(input);
43
+ const sessionId = data.session_id;
44
+
45
+ if (!sessionId) {
46
+ process.exit(0);
47
+ }
48
+
49
+ // Reject session IDs that contain path traversal sequences or path separators.
50
+ // session_id is used to construct file paths in /tmp — an unsanitized value
51
+ // could escape the temp directory and read or write arbitrary files.
52
+ if (/[/\\]|\.\./.test(sessionId)) {
53
+ process.exit(0);
54
+ }
55
+
56
+ // Check if context warnings are disabled via config.
57
+ // Collapsed existsSync+readFileSync into a single read guarded by try/catch
58
+ // (ENOENT or parse error → use defaults, same as old "planningDir absent" branch).
59
+ const cwd = data.cwd || process.cwd();
60
+ try {
61
+ const configPath = path.join(cwd, '.planning', 'config.json');
62
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
63
+ if (config.hooks?.context_warnings === false) {
64
+ process.exit(0);
65
+ }
66
+ } catch (e) {
67
+ // Missing or unparseable config → proceed with defaults (context warnings enabled)
68
+ }
69
+
70
+ const tmpDir = os.tmpdir();
71
+ const metricsPath = path.join(tmpDir, `claude-ctx-${sessionId}.json`);
72
+
73
+ // If no metrics file, this is a subagent or fresh session -- exit silently.
74
+ // Collapsed existsSync+readFileSync: ENOENT → exit 0 (identical to old !existsSync branch),
75
+ // other errors rethrow to the outer catch (swallowed → exit 0, as before).
76
+ let metricsRaw;
77
+ try {
78
+ metricsRaw = fs.readFileSync(metricsPath, 'utf8');
79
+ } catch (e) {
80
+ if (e && e.code === 'ENOENT') process.exit(0);
81
+ throw e;
82
+ }
83
+ const metrics = JSON.parse(metricsRaw);
84
+ const now = Math.floor(Date.now() / 1000);
85
+
86
+ // Ignore stale metrics
87
+ if (metrics.timestamp && (now - metrics.timestamp) > STALE_SECONDS) {
88
+ process.exit(0);
89
+ }
90
+
91
+ const remaining = metrics.remaining_percentage;
92
+ const usedPct = metrics.used_pct;
93
+
94
+ // No warning needed
95
+ if (remaining > WARNING_THRESHOLD) {
96
+ process.exit(0);
97
+ }
98
+
99
+ // Debounce: check if we warned recently
100
+ const warnPath = path.join(tmpDir, `claude-ctx-${sessionId}-warned.json`);
101
+ let warnData = { callsSinceWarn: 0, lastLevel: null };
102
+ let firstWarn = true;
103
+
104
+ // Collapsed existsSync+readFileSync: ENOENT or parse error → keep default warnData
105
+ // (same as old "file absent" branch). firstWarn tracks whether we read a valid sentinel.
106
+ try {
107
+ warnData = JSON.parse(fs.readFileSync(warnPath, 'utf8'));
108
+ firstWarn = false;
109
+ } catch (e) {
110
+ // Missing or corrupted sentinel → firstWarn stays true, warnData stays at defaults
111
+ }
112
+
113
+ warnData.callsSinceWarn = (warnData.callsSinceWarn || 0) + 1;
114
+
115
+ const isCritical = remaining <= CRITICAL_THRESHOLD;
116
+ const currentLevel = isCritical ? 'critical' : 'warning';
117
+
118
+ // Emit immediately on first warning, then debounce subsequent ones
119
+ // Severity escalation (WARNING -> CRITICAL) bypasses debounce
120
+ const severityEscalated = currentLevel === 'critical' && warnData.lastLevel === 'warning';
121
+ if (!firstWarn && warnData.callsSinceWarn < DEBOUNCE_CALLS && !severityEscalated) {
122
+ // Update counter and exit without warning
123
+ fs.writeFileSync(warnPath, JSON.stringify(warnData));
124
+ process.exit(0);
125
+ }
126
+
127
+ // Reset debounce counter
128
+ warnData.callsSinceWarn = 0;
129
+ warnData.lastLevel = currentLevel;
130
+ fs.writeFileSync(warnPath, JSON.stringify(warnData));
131
+
132
+ // Detect if GSD is active (has .planning/STATE.md in working directory)
133
+ const isGsdActive = fs.existsSync(path.join(cwd, '.planning', 'STATE.md'));
134
+
135
+ // On CRITICAL with active GSD project, auto-record session state as a
136
+ // breadcrumb for /gsd:resume-work (#1974). Fire-and-forget subprocess —
137
+ // doesn't block the hook or the agent. Fires ONCE per CRITICAL session,
138
+ // guarded by warnData.criticalRecorded to prevent repeated overwrites
139
+ // of the "crash moment" record on every debounce cycle.
140
+ if (isCritical && isGsdActive && !warnData.criticalRecorded) {
141
+ try {
142
+ // Runtime-agnostic path: this hook lives at <runtime-config>/hooks/
143
+ // and gsd-tools.cjs lives at <runtime-config>/gsd-core/bin/.
144
+ // Using __dirname makes this work on Claude Code, OpenCode, Gemini,
145
+ // Kilo, etc. without hardcoding ~/.claude/.
146
+ const gsdTools = path.join(__dirname, '..', 'gsd-core', 'bin', 'gsd-tools.cjs');
147
+ // Coerce usedPct to a safe number in case bridge file is malformed
148
+ const safeUsedPct = Number(usedPct) || 0;
149
+ const stoppedAt = `context exhaustion at ${safeUsedPct}% (${new Date().toISOString().split('T')[0]})`;
150
+ spawn(
151
+ process.execPath,
152
+ [gsdTools, 'state', 'record-session', '--stopped-at', stoppedAt],
153
+ { cwd, detached: true, stdio: 'ignore', windowsHide: true }
154
+ ).unref();
155
+ warnData.criticalRecorded = true;
156
+ // Persist the sentinel so subsequent debounce cycles don't re-fire
157
+ fs.writeFileSync(warnPath, JSON.stringify(warnData));
158
+ } catch { /* non-critical — don't let state recording break the hook */ }
159
+ }
160
+
161
+ // Build advisory warning message (never use imperative commands that
162
+ // override user preferences — see #884)
163
+ let message;
164
+ if (isCritical) {
165
+ message = isGsdActive
166
+ ? `CONTEXT CRITICAL: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
167
+ 'Context is nearly exhausted. Do NOT start new complex work or write handoff files — ' +
168
+ 'GSD state is already tracked in STATE.md. Inform the user so they can run ' +
169
+ '/gsd:pause-work at the next natural stopping point.'
170
+ : `CONTEXT CRITICAL: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
171
+ 'Context is nearly exhausted. Inform the user that context is low and ask how they ' +
172
+ 'want to proceed. Do NOT autonomously save state or write handoff files unless the user asks.';
173
+ } else {
174
+ message = isGsdActive
175
+ ? `CONTEXT WARNING: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
176
+ 'Context is getting limited. Avoid starting new complex work. If not between ' +
177
+ 'defined plan steps, inform the user so they can prepare to pause.'
178
+ : `CONTEXT WARNING: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
179
+ 'Be aware that context is getting limited. Avoid unnecessary exploration or ' +
180
+ 'starting new complex work.';
181
+ }
182
+
183
+ const output = {
184
+ hookSpecificOutput: {
185
+ hookEventName: process.env.GEMINI_API_KEY ? "AfterTool" : "PostToolUse",
186
+ additionalContext: message
187
+ }
188
+ };
189
+
190
+ process.stdout.write(JSON.stringify(output));
191
+ } catch (e) {
192
+ // Silent fail -- never block tool execution
193
+ process.exit(0);
194
+ }
195
+ });
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env node
2
+ // gsd-hook-version: {{GSD_VERSION}}
3
+ // gsd-cursor-post-tool.js — Cursor postToolUse hook (issue #777)
4
+ //
5
+ // Cursor invokes this script after each tool call completes.
6
+ // Protocol: JSON from Cursor on stdin; JSON response on stdout.
7
+ //
8
+ // Input schema (cursor postToolUse):
9
+ // { tool_name, tool_input, tool_output, duration,
10
+ // conversation_id, generation_id, model, hook_event_name,
11
+ // cursor_version, workspace_roots, user_email, transcript_path }
12
+ //
13
+ // Output schema (cursor postToolUse):
14
+ // { additional_context?: string } ← injected as context after the tool use
15
+ //
16
+ // Behaviour:
17
+ // - After a write-class tool that targets .planning/, reminds the agent
18
+ // to keep STATE.md current.
19
+ // - Fails open: any error silently exits 0.
20
+ //
21
+ // Cursor docs: https://cursor.com/docs/hooks
22
+
23
+ 'use strict';
24
+
25
+ const WRITE_TOOL_RE = /write|edit|replace|create|delete|remove|append|apply|patch|insert|mkdir/i;
26
+ const PATH_KEY_RE = /^(path|file|file_?path|filepath|target_?path|target|dir|directory|uri|filename)$/i;
27
+ const PLANNING_PATH_RE = /(^|[\\/])\.planning([\\/]|$)/;
28
+
29
+ let raw = '';
30
+ const stdinTimeout = setTimeout(() => {
31
+ // Timeout guard: exit silently rather than hanging.
32
+ process.exit(0);
33
+ }, 10000);
34
+
35
+ process.stdin.setEncoding('utf8');
36
+ process.stdin.on('data', (chunk) => { raw += chunk; });
37
+ process.stdin.on('end', () => {
38
+ clearTimeout(stdinTimeout);
39
+ try {
40
+ let input;
41
+ try { input = JSON.parse(raw || '{}'); } catch { process.stdout.write(JSON.stringify({})); return; }
42
+
43
+ const toolName = String(
44
+ input.tool_name || input.toolName || ''
45
+ ).toLowerCase();
46
+
47
+ const isWrite = WRITE_TOOL_RE.test(toolName);
48
+ if (!isWrite) { process.stdout.write(JSON.stringify({})); return; }
49
+
50
+ // Collect only PATH-bearing field values (not free-form content).
51
+ const paths = [];
52
+ const walk = (v, depth) => {
53
+ if (depth > 5 || paths.length > 64) return;
54
+ if (Array.isArray(v)) { for (const x of v) walk(x, depth + 1); return; }
55
+ if (v && typeof v === 'object') {
56
+ for (const k of Object.keys(v)) {
57
+ const val = v[k];
58
+ if (typeof val === 'string' && PATH_KEY_RE.test(k)) paths.push(val);
59
+ else walk(val, depth + 1);
60
+ }
61
+ }
62
+ };
63
+ walk(input.tool_input || input.toolInput || {}, 0);
64
+
65
+ if (paths.some((p) => PLANNING_PATH_RE.test(p))) {
66
+ process.stdout.write(JSON.stringify({
67
+ additional_context:
68
+ 'GSD: .planning/ artifact updated — ensure STATE.md reflects the latest phase and progress.',
69
+ }));
70
+ return;
71
+ }
72
+ } catch { /* fall through to empty response */ }
73
+
74
+ process.stdout.write(JSON.stringify({}));
75
+ });
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ // gsd-hook-version: {{GSD_VERSION}}
3
+ // gsd-cursor-session-start.js — Cursor sessionStart hook (issue #777)
4
+ //
5
+ // Cursor invokes this script at the start of each agent session.
6
+ // Protocol: JSON from Cursor on stdin; JSON response on stdout.
7
+ //
8
+ // Input schema (cursor sessionStart):
9
+ // { session_id, is_background_agent, composer_mode, conversation_id,
10
+ // generation_id, model, hook_event_name, cursor_version,
11
+ // workspace_roots, user_email, transcript_path }
12
+ //
13
+ // Output schema (cursor sessionStart):
14
+ // { additional_context?: string } ← injected into the session as context
15
+ //
16
+ // Behaviour:
17
+ // - If .planning/STATE.md is present, injects a brief state reminder.
18
+ // - If absent, nudges the user toward /gsd:new-project.
19
+ // - Fails open: any error silently exits 0 so a hook bug never wedges Cursor.
20
+ //
21
+ // Cursor docs: https://cursor.com/docs/hooks
22
+
23
+ 'use strict';
24
+
25
+ const fs = require('fs');
26
+ const path = require('path');
27
+
28
+ const MSG_PRESENT =
29
+ 'GSD: .planning/STATE.md is present — review the current phase and any blockers before acting.';
30
+ const MSG_ABSENT =
31
+ 'GSD: no .planning/ workflow found — run /gsd:new-project to start a tracked workflow.';
32
+
33
+ let raw = '';
34
+ const stdinTimeout = setTimeout(() => {
35
+ // Timeout guard: exit silently rather than hanging.
36
+ process.exit(0);
37
+ }, 10000);
38
+
39
+ process.stdin.setEncoding('utf8');
40
+ process.stdin.on('data', (chunk) => { raw += chunk; });
41
+ process.stdin.on('end', () => {
42
+ clearTimeout(stdinTimeout);
43
+ try {
44
+ const statePath = path.join(process.cwd(), '.planning', 'STATE.md');
45
+ const statePresent = fs.existsSync(statePath);
46
+ const msg = statePresent ? MSG_PRESENT : MSG_ABSENT;
47
+ process.stdout.write(JSON.stringify({ additional_context: msg }));
48
+ } catch {
49
+ // Fail open — never block a Cursor session because of a GSD hook error.
50
+ process.stdout.write(JSON.stringify({}));
51
+ }
52
+ });