@opengsd/gsd-pi 1.2.0-dev.84c56d87 → 1.2.0-dev.8e6112e9

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 (631) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +1 -18
  4. package/dist/headless-events.js +7 -5
  5. package/dist/loader.js +6 -4
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/register-agent-bundles.d.ts +11 -2
  8. package/dist/register-agent-bundles.js +18 -4
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +121 -6
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/ask-user-questions.js +3 -2
  14. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  15. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  16. package/dist/resources/extensions/async-jobs/index.js +65 -0
  17. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  18. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  19. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  20. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  21. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  22. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  23. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  24. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  25. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  26. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  27. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  28. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  29. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  31. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  32. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  33. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  34. package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
  35. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  36. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  37. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  38. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  39. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  40. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  41. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  42. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  43. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  44. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  45. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  46. package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
  47. package/dist/resources/extensions/gsd/auto-start.js +35 -15
  48. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  49. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  50. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  51. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  52. package/dist/resources/extensions/gsd/auto.js +52 -2
  53. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  54. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  55. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
  56. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  57. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +145 -50
  58. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  59. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  60. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  61. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  62. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  63. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  64. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  65. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  66. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  67. package/dist/resources/extensions/gsd/constants.js +0 -2
  68. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  69. package/dist/resources/extensions/gsd/db/engine.js +5 -3
  70. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  71. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  72. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  73. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  74. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  75. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  76. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  77. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  78. package/dist/resources/extensions/gsd/files.js +33 -19
  79. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  80. package/dist/resources/extensions/gsd/gsd-db.js +11 -8
  81. package/dist/resources/extensions/gsd/guidance.js +60 -0
  82. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  83. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  84. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  85. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  86. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  87. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  88. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  89. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  90. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  91. package/dist/resources/extensions/gsd/notifications.js +12 -7
  92. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  93. package/dist/resources/extensions/gsd/preferences-models.js +2 -2
  94. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  95. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  96. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  97. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  99. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  100. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  101. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  102. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  103. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  104. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  105. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  106. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  107. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  108. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  109. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  110. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  111. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  112. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  113. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  114. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  115. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  116. package/dist/resources/extensions/gsd/state.js +11 -2
  117. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  118. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  119. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  120. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  121. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  122. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  123. package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
  124. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  125. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  126. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  127. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  128. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  129. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  130. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  131. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  132. package/dist/resources/extensions/gsd/uat-policy.js +40 -15
  133. package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
  134. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  135. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  136. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  137. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  138. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  139. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  140. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  141. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  142. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  143. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  144. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  145. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  146. package/dist/resources/extensions/gsd/worktree.js +8 -1
  147. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  148. package/dist/resources/extensions/shared/gsd-browser-cli.js +45 -3
  149. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  150. package/dist/resources/shared/package-manager-detection.js +1 -1
  151. package/dist/resources/shared/package.json +3 -0
  152. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  153. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  154. package/dist/runtime-checks.d.ts +10 -0
  155. package/dist/runtime-checks.js +27 -0
  156. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  157. package/dist/update-check.d.ts +2 -0
  158. package/dist/update-check.js +24 -1
  159. package/dist/update-cmd.js +20 -3
  160. package/dist/web/standalone/.next/BUILD_ID +1 -1
  161. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  162. package/dist/web/standalone/.next/build-manifest.json +3 -3
  163. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  164. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  166. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  174. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/index.html +1 -1
  184. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  191. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  192. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  195. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  196. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  197. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  198. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  199. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  200. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  201. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  202. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  203. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  204. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  205. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  206. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  207. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  208. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  209. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  210. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  211. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  212. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  213. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  214. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  215. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  216. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  217. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  218. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  219. package/package.json +3 -3
  220. package/packages/cloud-mcp-gateway/package.json +2 -2
  221. package/packages/contracts/dist/rpc.d.ts +1 -0
  222. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  223. package/packages/contracts/dist/rpc.js.map +1 -1
  224. package/packages/contracts/package.json +1 -1
  225. package/packages/daemon/package.json +4 -4
  226. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  227. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  228. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  229. package/packages/gsd-agent-core/package.json +5 -5
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  250. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  252. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  263. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  264. package/packages/gsd-agent-modes/package.json +7 -7
  265. package/packages/mcp-server/README.md +12 -3
  266. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  267. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  268. package/packages/mcp-server/dist/cli-runner.js +137 -0
  269. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  270. package/packages/mcp-server/dist/cli.js +2 -53
  271. package/packages/mcp-server/dist/cli.js.map +1 -1
  272. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  273. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  274. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  275. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  276. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  277. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/pid-registry.js +452 -0
  279. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  280. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  281. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  282. package/packages/mcp-server/dist/probe-mode.js +10 -0
  283. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  284. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  285. package/packages/mcp-server/dist/server.js +4 -0
  286. package/packages/mcp-server/dist/server.js.map +1 -1
  287. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  288. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  289. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  290. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  291. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  292. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  293. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  294. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  295. package/packages/mcp-server/package.json +5 -4
  296. package/packages/native/package.json +1 -1
  297. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  298. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  299. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  300. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  301. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  302. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  303. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  304. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  305. package/packages/pi-agent-core/dist/index.js +3 -0
  306. package/packages/pi-agent-core/dist/index.js.map +1 -1
  307. package/packages/pi-agent-core/package.json +1 -1
  308. package/packages/pi-ai/README.md +1 -0
  309. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  310. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  311. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  312. package/packages/pi-ai/dist/index.d.ts +2 -0
  313. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/index.js +2 -0
  315. package/packages/pi-ai/dist/index.js.map +1 -1
  316. package/packages/pi-ai/dist/models.generated.d.ts +419 -221
  317. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/models.generated.js +460 -261
  319. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  320. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  322. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  323. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  324. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  325. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  326. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  327. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  329. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  330. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  331. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  332. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  333. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  334. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  335. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  336. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  337. package/packages/pi-ai/package.json +3 -2
  338. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  339. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  341. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  344. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  346. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  348. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  350. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  352. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  354. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/index.js +1 -1
  356. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  359. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  361. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  363. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  364. package/packages/pi-coding-agent/package.json +7 -7
  365. package/packages/pi-tui/dist/index.d.ts +1 -1
  366. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  367. package/packages/pi-tui/dist/index.js +1 -1
  368. package/packages/pi-tui/dist/index.js.map +1 -1
  369. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  370. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/terminal-image.js +54 -2
  372. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  373. package/packages/pi-tui/dist/tui.d.ts +8 -0
  374. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  375. package/packages/pi-tui/dist/tui.js +63 -18
  376. package/packages/pi-tui/dist/tui.js.map +1 -1
  377. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  378. package/packages/pi-tui/dist/utils.js +110 -36
  379. package/packages/pi-tui/dist/utils.js.map +1 -1
  380. package/packages/pi-tui/package.json +2 -2
  381. package/packages/rpc-client/package.json +2 -2
  382. package/pkg/dist/theme/theme.d.ts.map +1 -1
  383. package/pkg/dist/theme/theme.js +45 -17
  384. package/pkg/dist/theme/theme.js.map +1 -1
  385. package/pkg/package.json +1 -1
  386. package/src/resources/GSD-WORKFLOW.md +5 -4
  387. package/src/resources/extensions/ask-user-questions.ts +7 -2
  388. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  389. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  390. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  391. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  392. package/src/resources/extensions/async-jobs/index.ts +79 -0
  393. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  394. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  395. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  396. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  397. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  398. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  399. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  400. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  401. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  402. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  403. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  404. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  405. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  406. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  407. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  408. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  409. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  410. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  411. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  412. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  413. package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
  414. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  415. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  416. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  417. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  418. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  419. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  420. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  421. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  422. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  423. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  424. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  425. package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
  426. package/src/resources/extensions/gsd/auto-start.ts +36 -18
  427. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  428. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  429. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  430. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  431. package/src/resources/extensions/gsd/auto.ts +64 -2
  432. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  433. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  434. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
  435. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  436. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +163 -55
  437. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  438. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  439. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  440. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  441. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  442. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  443. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  444. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  445. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  446. package/src/resources/extensions/gsd/constants.ts +0 -3
  447. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  448. package/src/resources/extensions/gsd/db/engine.ts +5 -3
  449. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  450. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  451. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  452. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  453. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  454. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  455. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  456. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  457. package/src/resources/extensions/gsd/files.ts +33 -12
  458. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  459. package/src/resources/extensions/gsd/gsd-db.ts +13 -10
  460. package/src/resources/extensions/gsd/guidance.ts +78 -0
  461. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  462. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  463. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  464. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  465. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  466. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  467. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  468. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  469. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  470. package/src/resources/extensions/gsd/notifications.ts +13 -6
  471. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  472. package/src/resources/extensions/gsd/preferences-models.ts +2 -1
  473. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  474. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  475. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  476. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  477. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  478. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  479. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  480. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  481. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  482. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  483. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  484. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  485. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  486. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  487. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  488. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  489. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  490. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  491. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  492. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  493. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  494. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  495. package/src/resources/extensions/gsd/state.ts +12 -1
  496. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  497. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  498. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  499. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  500. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  501. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  503. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  504. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  505. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  506. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  507. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  508. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  509. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  510. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  511. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  512. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  513. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  514. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  515. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  516. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  517. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  518. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  519. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  520. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  521. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  522. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  523. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  524. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  525. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  526. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  527. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  528. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  529. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  530. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  531. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  532. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  533. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  534. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  535. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  536. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  537. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  538. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  539. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  540. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  541. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  542. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  543. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  544. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  545. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  546. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  547. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  548. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  549. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  550. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  551. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  552. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  553. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  554. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  555. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  556. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  557. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  558. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  559. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  560. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  561. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  562. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  563. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  564. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +45 -2
  565. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  566. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  567. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  568. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
  569. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
  570. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  571. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  572. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  573. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  574. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  575. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  576. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  577. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  578. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  579. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  580. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  581. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  582. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  583. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  584. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  585. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  586. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  587. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  588. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  589. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  590. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  591. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  592. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  593. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  594. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
  595. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  596. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  597. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  598. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  599. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  600. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  601. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  602. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  603. package/src/resources/extensions/gsd/uat-policy.ts +60 -15
  604. package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
  605. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  606. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  607. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  608. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  609. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  610. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  611. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  612. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  613. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  614. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  615. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  616. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  617. package/src/resources/extensions/gsd/worktree.ts +7 -1
  618. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  619. package/src/resources/extensions/shared/gsd-browser-cli.ts +54 -3
  620. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  621. package/src/resources/shared/package-manager-detection.ts +1 -1
  622. package/src/resources/shared/package.json +3 -0
  623. package/src/resources/skills/create-skill/SKILL.md +3 -0
  624. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  625. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  626. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  627. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  628. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  629. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  630. /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
  631. /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
@@ -19,9 +19,10 @@ import {
19
19
  } from "../gsd-db.js";
20
20
  import { GATE_REGISTRY } from "../gate-registry.js";
21
21
  import { generateRequirementsMd, saveArtifactToDb } from "../db-writer.js";
22
- import { clearPathCache, relSliceFile, resolveGsdPathContract, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
22
+ import { clearPathCache, normalizeRealPath, relSliceFile, resolveGsdPathContract, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
23
23
  import { saveFile, clearParseCache } from "../files.js";
24
24
  import { unlinkSync } from "node:fs";
25
+ import { hostname } from "node:os";
25
26
  import { join } from "node:path";
26
27
  import type { CompleteMilestoneParams } from "./complete-milestone.js";
27
28
  import { handleCompleteMilestone } from "./complete-milestone.js";
@@ -48,13 +49,21 @@ import { logError, logWarning } from "../workflow-logger.js";
48
49
  import { invalidateStateCache } from "../state.js";
49
50
  import { loadEffectiveGSDPreferences } from "../preferences.js";
50
51
  import { parseProject } from "../schemas/parsers.js";
51
- import { getAutoRuntimeSnapshot } from "../auto-runtime-state.js";
52
+ import { autoSession, getAutoRuntimeSnapshot, isAutoActive } from "../auto-runtime-state.js";
52
53
  import { renderPlanFromDb } from "../markdown-renderer.js";
53
54
  import {
54
55
  prepareUatRun,
55
56
  saveUatAttemptArtifact,
56
57
  type UatResultSaveParams,
57
58
  } from "../uat-run.js";
59
+ import { registerAutoWorker, markWorkerStopping, getAutoWorker } from "../db/auto-workers.js";
60
+ import {
61
+ claimMilestoneLease,
62
+ releaseMilestoneLease,
63
+ getMilestoneLease,
64
+ refreshMilestoneLease,
65
+ milestoneLeaseTtlSeconds,
66
+ } from "../db/milestone-leases.js";
58
67
  export type {
59
68
  UatCheckResultInput,
60
69
  UatEvidenceRef,
@@ -105,6 +114,24 @@ function blockIfWrongAutoUnit(requiredUnitType: string, operation: string): Tool
105
114
  };
106
115
  }
107
116
 
117
+ function milestoneLeaseConflictResult(
118
+ milestoneId: string,
119
+ byWorker: string,
120
+ expiresAt: string,
121
+ ): ToolExecutionResult {
122
+ return {
123
+ content: [{ type: "text", text: `Milestone ${milestoneId} is currently leased by ${byWorker}. Retry after ${expiresAt}.` }],
124
+ details: {
125
+ operation: "plan_milestone",
126
+ error: "milestone_lease_conflict",
127
+ milestoneId,
128
+ byWorker,
129
+ expiresAt,
130
+ },
131
+ isError: true,
132
+ };
133
+ }
134
+
108
135
  export interface SummarySaveParams {
109
136
  milestone_id?: string;
110
137
  slice_id?: string;
@@ -1244,7 +1271,48 @@ export async function executePlanMilestone(
1244
1271
  isError: true,
1245
1272
  };
1246
1273
  }
1274
+ let workerId: string | null = null;
1275
+ let acquiredToken: number | null = null;
1276
+ let leaseRefreshTimer: ReturnType<typeof setInterval> | undefined;
1247
1277
  try {
1278
+ // Re-read at the gate so a peer-created milestone is not treated as fresh.
1279
+ const milestoneExists = getMilestone(params.milestoneId) !== null;
1280
+ if (milestoneExists) {
1281
+ const heldLease = getMilestoneLease(params.milestoneId);
1282
+ if (heldLease?.status === "held" && Date.parse(heldLease.expires_at) > Date.now()) {
1283
+ const holder = getAutoWorker(heldLease.worker_id);
1284
+ // Let the one-shot claim path recover stale same-process worker rows.
1285
+ const projectRoot = normalizeRealPath(basePath);
1286
+ const isOurAutoLease = isAutoActive() && heldLease.worker_id === autoSession.workerId;
1287
+ const holderIsOneShotReentrantPeer = !isAutoActive()
1288
+ && !!holder
1289
+ && holder.host === hostname()
1290
+ && holder.pid === process.pid
1291
+ && holder.project_root_realpath === projectRoot;
1292
+ if (holder?.status === "active" && !isOurAutoLease && !holderIsOneShotReentrantPeer) {
1293
+ return milestoneLeaseConflictResult(params.milestoneId, heldLease.worker_id, heldLease.expires_at);
1294
+ }
1295
+ }
1296
+ }
1297
+
1298
+ // Fresh creation cannot claim a lease because the FK row does not exist.
1299
+ // In-process auto already owns its lease; re-claiming would bump its token.
1300
+ if (!isAutoActive() && milestoneExists) {
1301
+ workerId = registerAutoWorker({ projectRootRealpath: normalizeRealPath(basePath) });
1302
+ const lease = claimMilestoneLease(workerId, params.milestoneId);
1303
+ if (!lease.ok) {
1304
+ return milestoneLeaseConflictResult(params.milestoneId, lease.byWorker, lease.expiresAt);
1305
+ }
1306
+ acquiredToken = lease.token;
1307
+
1308
+ const leaseRefreshMs = (milestoneLeaseTtlSeconds() / 2) * 1000;
1309
+ leaseRefreshTimer = setInterval(() => {
1310
+ if (acquiredToken !== null && workerId !== null) {
1311
+ refreshMilestoneLease(workerId, params.milestoneId, acquiredToken);
1312
+ }
1313
+ }, leaseRefreshMs);
1314
+ }
1315
+
1248
1316
  const result = await handlePlanMilestone(params, basePath);
1249
1317
  if ("error" in result) {
1250
1318
  return {
@@ -1270,6 +1338,17 @@ export async function executePlanMilestone(
1270
1338
  isError: true,
1271
1339
  };
1272
1340
  }
1341
+ finally {
1342
+ if (leaseRefreshTimer !== undefined) {
1343
+ clearInterval(leaseRefreshTimer);
1344
+ }
1345
+ if (workerId !== null && acquiredToken !== null) {
1346
+ releaseMilestoneLease(workerId, params.milestoneId, acquiredToken);
1347
+ }
1348
+ if (workerId !== null) {
1349
+ markWorkerStopping(workerId);
1350
+ }
1351
+ }
1273
1352
  }
1274
1353
 
1275
1354
  export async function executePlanSlice(
@@ -2,7 +2,7 @@
2
2
  // File Purpose: Central UAT mode policy for dispatch, tool presentation, and result validation.
3
3
 
4
4
  import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
5
- import { extractUatType } from "./files.js";
5
+ import { extractUatType, UAT_TYPE_KEYWORDS } from "./files.js";
6
6
  import type { UatType } from "./files.js";
7
7
  import { hasBrowserRequiredText } from "./browser-evidence.js";
8
8
  import { parseMcpToolName } from "./mcp-tool-name.js";
@@ -28,19 +28,14 @@ export interface UatModePolicy {
28
28
 
29
29
  export interface UatContentPolicy {
30
30
  declaredType: UatType;
31
+ /** False when no parseable `UAT mode:` declaration exists and declaredType defaulted to artifact-driven. */
32
+ modeDeclared: boolean;
31
33
  effectiveType: UatType;
32
34
  browserRequired: boolean;
33
35
  shouldDispatchByDefault: boolean;
34
36
  }
35
37
 
36
- export const UAT_TYPES: readonly UatType[] = [
37
- "artifact-driven",
38
- "browser-executable",
39
- "runtime-executable",
40
- "live-runtime",
41
- "mixed",
42
- "human-experience",
43
- ] as const;
38
+ export const UAT_TYPES: readonly UatType[] = UAT_TYPE_KEYWORDS;
44
39
 
45
40
  export const UAT_MODE_POLICIES: Readonly<Record<UatType, UatModePolicy>> = {
46
41
  "artifact-driven": {
@@ -89,26 +84,76 @@ export function getDeclaredUatType(content: string): UatType {
89
84
  return extractUatType(content) ?? "artifact-driven";
90
85
  }
91
86
 
92
- export function classifyUatContent(content: string): UatContentPolicy {
93
- const declaredType = getDeclaredUatType(content);
94
- const browserRequired = hasBrowserRequiredText(content);
95
- const effectiveType = declaredType === "artifact-driven" && browserRequired
87
+ /** Self-contained browser UAT harnesses that manage server lifecycle internally. */
88
+ const SELF_CONTAINED_RUNTIME_UAT_COMMAND_RE =
89
+ /\b(?:npm run test:uat|node\s+(?:--check\s+\S+\s+&&\s+)*tests\/browser\/search-uat\.mjs|npx playwright test(?:\s+\S+)?)\b/i;
90
+
91
+ export function hasSelfContainedRuntimeUatCommand(content: string): boolean {
92
+ return SELF_CONTAINED_RUNTIME_UAT_COMMAND_RE.test(content);
93
+ }
94
+
95
+ function resolveEffectiveUatTypeFromPolicy(
96
+ declaredType: UatType,
97
+ browserRequired: boolean,
98
+ content: string,
99
+ ): UatType {
100
+ let effectiveType = declaredType === "artifact-driven" && browserRequired
96
101
  ? "browser-executable"
97
102
  : declaredType;
98
103
 
104
+ // M006/S01 regression: specs often declare browser-executable with localhost
105
+ // preconditions while the Evidence section names a runtime harness such as
106
+ // `npm run test:uat`. Interactive browser_* checks then race a fixed port
107
+ // against the script's own ephemeral server — run the harness instead.
108
+ if (
109
+ effectiveType === "browser-executable" &&
110
+ hasSelfContainedRuntimeUatCommand(content)
111
+ ) {
112
+ effectiveType = "runtime-executable";
113
+ }
114
+
115
+ return effectiveType;
116
+ }
117
+
118
+ export function classifyUatContent(content: string): UatContentPolicy {
119
+ return classifyUatContentForRun(content);
120
+ }
121
+
122
+ /**
123
+ * Classify UAT mode for run-uat dispatch. Supplemental context (slice summary,
124
+ * verification excerpts) can name a self-contained harness even when the UAT
125
+ * file only documents a separate server command such as `npm run test:server`.
126
+ */
127
+ export function classifyUatContentForRun(content: string, supplementalContext = ""): UatContentPolicy {
128
+ const parsedType = extractUatType(content);
129
+ const declaredType = parsedType ?? "artifact-driven";
130
+ const browserRequired = hasBrowserRequiredText(content);
131
+ const combinedForHarness = supplementalContext.trim()
132
+ ? `${content}\n\n${supplementalContext}`
133
+ : content;
134
+ const effectiveType = resolveEffectiveUatTypeFromPolicy(
135
+ declaredType,
136
+ browserRequired,
137
+ combinedForHarness,
138
+ );
139
+
99
140
  return {
100
141
  declaredType,
142
+ modeDeclared: parsedType !== undefined,
101
143
  effectiveType,
102
144
  browserRequired,
103
145
  shouldDispatchByDefault: effectiveType !== "artifact-driven" || browserRequired,
104
146
  };
105
147
  }
106
148
 
107
- export function shouldEscalateArtifactUatToBrowser(content: string): boolean {
108
- const policy = classifyUatContent(content);
149
+ export function escalatesArtifactUatToBrowser(policy: UatContentPolicy): boolean {
109
150
  return policy.declaredType === "artifact-driven" && policy.browserRequired;
110
151
  }
111
152
 
153
+ export function shouldEscalateArtifactUatToBrowser(content: string): boolean {
154
+ return escalatesArtifactUatToBrowser(classifyUatContent(content));
155
+ }
156
+
112
157
  export function resolveEffectiveUatType(content: string): UatType {
113
158
  return classifyUatContent(content).effectiveType;
114
159
  }
@@ -43,8 +43,10 @@ import {
43
43
  type ComputedArtifactId,
44
44
  type ComputedArtifactRegistry,
45
45
  type ContextModePolicy,
46
+ type ToolsPolicy,
46
47
  type UnitContextManifest,
47
48
  } from "./unit-context-manifest.js";
49
+ import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
48
50
  import type { UnitPromptContextContract } from "./tool-contract.js";
49
51
 
50
52
  /**
@@ -171,6 +173,103 @@ export function composeContextModeInstructions(
171
173
  ].join("\n");
172
174
  }
173
175
 
176
+ // ─── Tool surface hardening ───────────────────────────────────────────────
177
+ //
178
+ // Upfront guidance for units whose runtime tool surface is narrower than the
179
+ // default Claude/native set. Prevents wasted turns on tools that are blocked
180
+ // by the write gate or Claude Code SDK allowlists (run-uat gsd_exec/Bash).
181
+
182
+ export interface ComposeToolSurfaceInstructionOptions {
183
+ readonly renderMode: ContextModeRenderMode;
184
+ }
185
+
186
+ const TOOL_SURFACE_GUIDANCE_BY_UNIT: Record<string, string> = {
187
+ "run-uat":
188
+ "Do not call `gsd_exec`, `Bash`, `Write`, or `Edit` — they are unavailable in this unit. Run every automated check through `gsd_uat_exec` with the appropriate `intent`. For browser UAT modes, use `browser_*` tools when presented; if browser automation fails, record the failure honestly and use `gsd_uat_exec` for the best objective substitute.",
189
+ "complete-slice":
190
+ "Run slice-level verification through `gsd_exec` (or MCP-scoped `mcp__…__gsd_exec`), not direct `bash`. Capture learnings through `gsd_capture_thought` (or MCP-scoped `mcp__…__gsd_capture_thought`), not bare `capture_thought`, when workflow MCP tools are presented. Do not call `gsd_uat_result_save` — run-uat owns persisted UAT assessment. On verification failure, do not edit user source files in this unit.",
191
+ "gate-evaluate":
192
+ "Dispatch only **tester** subagents via `subagent`. Persist each gate with `gsd_save_gate_result`. Do not use `ToolSearch` — it is not available.",
193
+ "reactive-execute":
194
+ "Dispatch only **worker** subagents via `subagent`. Do not call `gsd_task_complete` from this parent batch — each worker owns its task completion. If a failed task left no summary, call `gsd_summary_save` with `blocker_discovered: true`.",
195
+ "execute-task":
196
+ "Complete only this task via `gsd_task_complete`. Do not call `gsd_slice_complete`, `gsd_validate_milestone`, or `gsd_complete_milestone` — the orchestrator owns phase transitions.",
197
+ "validate-milestone":
198
+ "Dispatch reviewer subagents in parallel, then persist the verdict via `gsd_validate_milestone`. Do not query `.gsd/gsd.db` directly — use `gsd_milestone_status` and inlined context.",
199
+ "complete-milestone":
200
+ "Persist completion only through `gsd_complete_milestone` after verification passes. Do not query `.gsd/gsd.db` directly. Do not write `.gsd/PROJECT.md` or `.gsd/REQUIREMENTS.md` by hand — use `gsd_summary_save` and `gsd_requirement_update`.",
201
+ "replan-slice":
202
+ "Persist replans through `gsd_replan_slice` only. Do not edit `PLAN.md` or task plans directly.",
203
+ "plan-slice":
204
+ "Persist planning through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner** for reconnaissance — not implementation agents. Do not edit user source files outside `.gsd/**`.",
205
+ "refine-slice":
206
+ "Persist refinements through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner**. Do not edit user source files outside `.gsd/**`.",
207
+ "plan-milestone":
208
+ "Persist milestone planning through `gsd_plan_milestone` / `gsd_plan_slice`. Do not edit user source files outside `.gsd/**`.",
209
+ "research-slice":
210
+ "Dispatch subagents only to **scout** or **planner** for reconnaissance. Do not edit user source files outside `.gsd/**`.",
211
+ };
212
+
213
+ function guidanceForToolsPolicy(policy: ToolsPolicy): string | null {
214
+ switch (policy.mode) {
215
+ case "planning":
216
+ return "Writes are restricted to `.gsd/**` under the working directory — do not edit user source files. `bash` is limited to read-only investigation commands. Do not dispatch subagents. For human elicitation, use workflow MCP `ask_user_questions` when available — not native `AskUserQuestion`.";
217
+ case "planning-dispatch": {
218
+ const agents = policy.allowedSubagents.map((agent) => `**${agent}**`).join(", ");
219
+ return `Writes are restricted to \`.gsd/**\`. Dispatch subagents only to: ${agents}. Do not edit user source files.`;
220
+ }
221
+ case "docs":
222
+ return "Writes are restricted to `.gsd/**` and project documentation paths (`docs/`, `README*`, `CHANGELOG.md`, root `*.md`). Do not edit application source.";
223
+ case "verification": {
224
+ const subagentLine = policy.allowedSubagents?.length
225
+ ? ` Dispatch subagents only to: ${policy.allowedSubagents.map((agent) => `**${agent}**`).join(", ")}.`
226
+ : " Do not dispatch subagents.";
227
+ return `\`bash\` is limited to build/test verification commands. Writes restricted to \`.gsd/**\`.${subagentLine}`;
228
+ }
229
+ default:
230
+ return null;
231
+ }
232
+ }
233
+
234
+ function formatForbiddenWorkflowToolsLine(
235
+ unitType: string,
236
+ unitGuidance: string | undefined,
237
+ ): string | null {
238
+ const forbidden = getUnitToolSurfaceContract(unitType)?.forbiddenGsdTools;
239
+ if (!forbidden) return null;
240
+ const names = Object.keys(forbidden).filter((name) => !unitGuidance?.includes(`\`${name}\``));
241
+ if (names.length === 0) return null;
242
+ return `Do not call ${names.map((name) => `\`${name}\``).join(", ")} in this unit.`;
243
+ }
244
+
245
+ /**
246
+ * Render upfront tool-surface guidance for a unit type. Unknown units and
247
+ * unrestricted (`tools.mode: "all"`) units omit the block unless they have
248
+ * unit-specific closeout guidance registered above.
249
+ */
250
+ export function composeToolSurfaceInstructions(
251
+ unitType: string,
252
+ opts: ComposeToolSurfaceInstructionOptions,
253
+ ): string {
254
+ const manifest = resolveManifest(unitType);
255
+ if (!manifest) return "";
256
+
257
+ const unitGuidance = TOOL_SURFACE_GUIDANCE_BY_UNIT[unitType];
258
+ const policyGuidance = unitGuidance ? null : guidanceForToolsPolicy(manifest.tools);
259
+ const forbiddenLine = formatForbiddenWorkflowToolsLine(unitType, unitGuidance);
260
+ const parts = [unitGuidance, policyGuidance, forbiddenLine].filter(
261
+ (part): part is string => typeof part === "string" && part.length > 0,
262
+ );
263
+ if (parts.length === 0) return "";
264
+
265
+ const body = parts.join(" ");
266
+ if (opts.renderMode === "nested") {
267
+ return `Tool surface: ${body}`;
268
+ }
269
+
270
+ return ["## Tool Surface", "", body].join("\n");
271
+ }
272
+
174
273
  // ─── v2 surface (#4924) ───────────────────────────────────────────────────
175
274
 
176
275
  /**
@@ -220,15 +220,19 @@ export const UNIT_REGISTRY = {
220
220
  phaseChain: ["completion"],
221
221
  toolContract: {
222
222
  allowedGsdTools: [
223
+ "gsd_exec",
223
224
  "gsd_slice_complete",
224
225
  "gsd_task_reopen",
225
226
  "gsd_replan_slice",
226
227
  "gsd_decision_save",
228
+ "gsd_capture_thought",
227
229
  "gsd_requirement_update",
228
230
  "gsd_summary_save",
229
231
  "subagent",
230
232
  ],
231
233
  requiredWorkflowTools: [
234
+ "gsd_exec",
235
+ "gsd_capture_thought",
232
236
  "gsd_slice_complete",
233
237
  "gsd_task_reopen",
234
238
  "gsd_replan_slice",
@@ -254,8 +258,21 @@ export const UNIT_REGISTRY = {
254
258
  scopeClass: "execute-task",
255
259
  phaseChain: ["execution"],
256
260
  toolContract: {
257
- allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
258
- requiredWorkflowTools: ["gsd_task_complete"],
261
+ allowedGsdTools: [
262
+ "gsd_task_complete",
263
+ "gsd_exec",
264
+ "gsd_exec_search",
265
+ "gsd_resume",
266
+ "gsd_capture_thought",
267
+ "gsd_decision_save",
268
+ ],
269
+ requiredWorkflowTools: [
270
+ "gsd_task_complete",
271
+ "gsd_exec",
272
+ "gsd_exec_search",
273
+ "gsd_resume",
274
+ "gsd_capture_thought",
275
+ ],
259
276
  },
260
277
  },
261
278
  "execute-task-simple": {
@@ -263,8 +280,21 @@ export const UNIT_REGISTRY = {
263
280
  scopeClass: "execute-task",
264
281
  phaseChain: ["execution_simple", "execution"],
265
282
  toolContract: {
266
- allowedGsdTools: ["gsd_task_complete", "gsd_decision_save"],
267
- requiredWorkflowTools: ["gsd_task_complete"],
283
+ allowedGsdTools: [
284
+ "gsd_task_complete",
285
+ "gsd_exec",
286
+ "gsd_exec_search",
287
+ "gsd_resume",
288
+ "gsd_capture_thought",
289
+ "gsd_decision_save",
290
+ ],
291
+ requiredWorkflowTools: [
292
+ "gsd_task_complete",
293
+ "gsd_exec",
294
+ "gsd_exec_search",
295
+ "gsd_resume",
296
+ "gsd_capture_thought",
297
+ ],
268
298
  },
269
299
  },
270
300
  "reactive-execute": {
@@ -137,7 +137,7 @@ export function isValidMilestoneVerdict(verdict: string): verdict is ValidationV
137
137
  * Extract the UAT type from content, defaulting to `"artifact-driven"`.
138
138
  *
139
139
  * The `"artifact-driven"` fallback is the original default used throughout
140
- * the codebase when a UAT file lacks an explicit `## UAT Type` section.
140
+ * the codebase when a UAT file has no parseable UAT mode declaration.
141
141
  */
142
142
  export function getUatType(content: string): UatType {
143
143
  return getDeclaredUatType(content);
@@ -15,6 +15,9 @@ export interface VerificationVerdict {
15
15
  failureContext: string;
16
16
  }
17
17
 
18
+ export const NO_HOST_CHECKS_FAILURE_CONTEXT =
19
+ "No runnable host-owned verification command was discovered. Add project verification_commands in .gsd/PREFERENCES.md or a runnable task-plan Verify command, then resume with /gsd next.";
20
+
18
21
  export function decideVerificationVerdict(
19
22
  unitType: string,
20
23
  result: VerificationGateResult,
@@ -33,8 +36,7 @@ export function decideVerificationVerdict(
33
36
  passed: false,
34
37
  reason: "no-host-checks",
35
38
  retryable: false,
36
- failureContext:
37
- "No runnable host-owned verification command was discovered. Add project verification_commands or a runnable task-plan Verify command before completing this execute-task.",
39
+ failureContext: NO_HOST_CHECKS_FAILURE_CONTEXT,
38
40
  };
39
41
  }
40
42
 
@@ -0,0 +1,131 @@
1
+ import { createHash } from "node:crypto";
2
+ import { appendFileSync, mkdirSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+
5
+ import { atomicWriteSync } from "./atomic-write.js";
6
+ import { resolveGsdPathContract } from "./paths.js";
7
+ import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
8
+ import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
9
+ import { normalizeWorkflowEventCommand } from "./workflow-event-vocabulary.js";
10
+ import type { WorkflowEvent } from "./workflow-events.js";
11
+
12
+ export const WORKFLOW_EVENT_LOG_FILENAME = "event-log.jsonl";
13
+
14
+ export interface WorkflowEventLedgerLocation {
15
+ projectRoot: string;
16
+ workRoot: string;
17
+ projectGsd: string;
18
+ worktreeGsd: string | null;
19
+ projectLogPath: string;
20
+ worktreeLogPath: string | null;
21
+ isWorktree: boolean;
22
+ }
23
+
24
+ export type WorkflowEventInput = Omit<WorkflowEvent, "hash" | "session_id"> & {
25
+ actor_name?: string;
26
+ trigger_reason?: string;
27
+ };
28
+
29
+ export function resolveWorkflowEventLedgerLocation(
30
+ basePath: string,
31
+ originalProjectRoot?: string | null,
32
+ ): WorkflowEventLedgerLocation {
33
+ const contract = resolveGsdPathContract(basePath, originalProjectRoot);
34
+ return {
35
+ projectRoot: contract.projectRoot,
36
+ workRoot: contract.workRoot,
37
+ projectGsd: contract.projectGsd,
38
+ worktreeGsd: contract.worktreeGsd,
39
+ projectLogPath: join(contract.projectGsd, WORKFLOW_EVENT_LOG_FILENAME),
40
+ worktreeLogPath: contract.worktreeGsd
41
+ ? join(contract.worktreeGsd, WORKFLOW_EVENT_LOG_FILENAME)
42
+ : null,
43
+ isWorktree: contract.isWorktree,
44
+ };
45
+ }
46
+
47
+ export function workflowEventLogPath(basePath: string): string {
48
+ return resolveWorkflowEventLedgerLocation(basePath).projectLogPath;
49
+ }
50
+
51
+ export function workflowEventArchivePath(basePath: string, milestoneId: string): string {
52
+ const location = resolveWorkflowEventLedgerLocation(basePath);
53
+ return join(location.projectGsd, `event-log-${milestoneId}.jsonl.archived`);
54
+ }
55
+
56
+ export function readWorktreeEventLogPath(worktreeBasePath: string): string {
57
+ const location = resolveWorkflowEventLedgerLocation(worktreeBasePath);
58
+ return location.worktreeLogPath ?? location.projectLogPath;
59
+ }
60
+
61
+ export function buildWorkflowEvent(event: WorkflowEventInput, sessionId: string): WorkflowEvent {
62
+ const hash = createHash("sha256")
63
+ .update(JSON.stringify({ cmd: event.cmd, params: event.params }))
64
+ .digest("hex")
65
+ .slice(0, 16);
66
+
67
+ return {
68
+ v: 2,
69
+ ...event,
70
+ hash,
71
+ session_id: sessionId,
72
+ };
73
+ }
74
+
75
+ export function appendWorkflowEvent(
76
+ basePath: string,
77
+ event: WorkflowEventInput,
78
+ sessionId: string,
79
+ ): WorkflowEvent {
80
+ const fullEvent = buildWorkflowEvent(event, sessionId);
81
+ const location = resolveWorkflowEventLedgerLocation(basePath);
82
+
83
+ mkdirSync(location.projectGsd, { recursive: true });
84
+ appendFileSync(location.projectLogPath, `${JSON.stringify(fullEvent)}\n`, "utf-8");
85
+ emitWorkflowEventAudit(location.projectRoot, fullEvent);
86
+ return fullEvent;
87
+ }
88
+
89
+ export function writeWorkflowEventLog(basePath: string, events: readonly WorkflowEvent[]): void {
90
+ const location = resolveWorkflowEventLedgerLocation(basePath);
91
+ mkdirSync(location.projectGsd, { recursive: true });
92
+ const content = events.map((event) => JSON.stringify(event)).join("\n") + (events.length > 0 ? "\n" : "");
93
+ atomicWriteSync(location.projectLogPath, content);
94
+ }
95
+
96
+ export function writeWorktreeEventLog(
97
+ worktreeBasePath: string,
98
+ events: readonly WorkflowEvent[],
99
+ ): void {
100
+ const location = resolveWorkflowEventLedgerLocation(worktreeBasePath);
101
+ const logPath = location.worktreeLogPath ?? location.projectLogPath;
102
+ mkdirSync(dirname(logPath), { recursive: true });
103
+ const content = events.map((event) => JSON.stringify(event)).join("\n") + (events.length > 0 ? "\n" : "");
104
+ atomicWriteSync(logPath, content);
105
+ }
106
+
107
+ function emitWorkflowEventAudit(basePath: string, event: WorkflowEvent): void {
108
+ if (!isUnifiedAuditEnabled()) return;
109
+ try {
110
+ const normalized = normalizeWorkflowEventCommand(event.cmd) ?? "unknown";
111
+ emitUokAuditEvent(
112
+ basePath,
113
+ buildAuditEnvelope({
114
+ traceId: event.session_id,
115
+ category: "orchestration",
116
+ type: `workflow-event-${normalized}`,
117
+ payload: {
118
+ cmd: event.cmd,
119
+ params: event.params,
120
+ actor: event.actor,
121
+ actorName: event.actor_name,
122
+ triggerReason: event.trigger_reason,
123
+ eventTs: event.ts,
124
+ hash: event.hash,
125
+ },
126
+ }),
127
+ );
128
+ } catch {
129
+ // Best-effort: audit projection must never block the workflow event ledger.
130
+ }
131
+ }
@@ -0,0 +1,59 @@
1
+ import type { WorkflowEvent } from "./workflow-events.js";
2
+
3
+ export interface WorkflowEventEntityKey {
4
+ type: string;
5
+ id: string;
6
+ }
7
+
8
+ export function normalizeWorkflowEventCommand(cmd: unknown): string | null {
9
+ return typeof cmd === "string" ? cmd.replace(/-/g, "_") : null;
10
+ }
11
+
12
+ /**
13
+ * Workflow progress events are keyed by the domain entity they mutate.
14
+ * Keep command aliases and conflict identity in this module so replay,
15
+ * conflict detection, and tests do not each grow their own vocabulary.
16
+ */
17
+ export function workflowEventEntityKey(event: WorkflowEvent): WorkflowEventEntityKey | null {
18
+ const p = event.params;
19
+ const cmd = normalizeWorkflowEventCommand(event.cmd);
20
+ if (!cmd) return null;
21
+
22
+ switch (cmd) {
23
+ case "complete_task":
24
+ case "start_task":
25
+ case "skip_task":
26
+ case "report_blocker":
27
+ case "record_verification":
28
+ case "plan_task":
29
+ return typeof p["taskId"] === "string"
30
+ ? { type: "task", id: p["taskId"] }
31
+ : null;
32
+
33
+ case "complete_slice":
34
+ case "replan_slice":
35
+ return typeof p["sliceId"] === "string"
36
+ ? { type: "slice", id: p["sliceId"] }
37
+ : null;
38
+
39
+ case "plan_slice":
40
+ return typeof p["sliceId"] === "string"
41
+ ? { type: "slice_plan", id: p["sliceId"] }
42
+ : null;
43
+
44
+ case "complete_milestone":
45
+ case "plan_milestone":
46
+ return typeof p["milestoneId"] === "string"
47
+ ? { type: "milestone", id: p["milestoneId"] }
48
+ : null;
49
+
50
+ case "save_decision":
51
+ if (typeof p["scope"] === "string" && typeof p["decision"] === "string") {
52
+ return { type: "decision", id: `${p["scope"]}:${p["decision"]}` };
53
+ }
54
+ return null;
55
+
56
+ default:
57
+ return null;
58
+ }
59
+ }