@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
@@ -0,0 +1,328 @@
1
+ // gsd-pi — Dispatch History module tests (#482 / #442 deepening)
2
+ //
3
+ // Covers: canonical key building and legacy-key normalization, window
4
+ // record/evict semantics, ledger error attachment, cross-session rehydration
5
+ // from unit_dispatches (the #482 regression: a fresh history rehydrated from
6
+ // the DB must detect a re-dispatch loop that spans session restarts),
7
+ // retry-budget suppression, and clearOnRecovery.
8
+
9
+ import test from "node:test";
10
+ import assert from "node:assert/strict";
11
+ import { mkdtempSync, mkdirSync, rmSync } from "node:fs";
12
+ import { join } from "node:path";
13
+ import { tmpdir } from "node:os";
14
+
15
+ import {
16
+ openDatabase,
17
+ closeDatabase,
18
+ insertMilestone,
19
+ } from "../gsd-db.ts";
20
+ import { registerAutoWorker } from "../db/auto-workers.ts";
21
+ import { claimMilestoneLease } from "../db/milestone-leases.ts";
22
+ import { recordDispatchClaim, markFailed, markCanceled } from "../db/unit-dispatches.ts";
23
+ import {
24
+ buildDispatchKey,
25
+ createDispatchHistory,
26
+ lookupLatestLedgerError,
27
+ normalizeDispatchKey,
28
+ parseDispatchKey,
29
+ STUCK_WINDOW_SIZE,
30
+ } from "../auto/dispatch-history.ts";
31
+
32
+ function makeBase(): string {
33
+ const base = mkdtempSync(join(tmpdir(), "gsd-dispatch-history-"));
34
+ mkdirSync(join(base, ".gsd"), { recursive: true });
35
+ return base;
36
+ }
37
+
38
+ function cleanup(base: string): void {
39
+ try { closeDatabase(); } catch { /* noop */ }
40
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
41
+ }
42
+
43
+ interface LedgerFixture {
44
+ base: string;
45
+ worker: string;
46
+ token: number;
47
+ claim(unitType: string, unitId: string): number;
48
+ }
49
+
50
+ function makeLedgerFixture(t: { after(fn: () => void): void }): LedgerFixture {
51
+ const base = makeBase();
52
+ t.after(() => cleanup(base));
53
+ openDatabase(join(base, ".gsd", "gsd.db"));
54
+ insertMilestone({ id: "M001", title: "T", status: "active" });
55
+ const worker = registerAutoWorker({ projectRootRealpath: base });
56
+ const lease = claimMilestoneLease(worker, "M001");
57
+ assert.equal(lease.ok, true);
58
+ if (!lease.ok) throw new Error("lease claim failed");
59
+ return {
60
+ base,
61
+ worker,
62
+ token: lease.token,
63
+ claim(unitType: string, unitId: string): number {
64
+ const claim = recordDispatchClaim({
65
+ traceId: `${unitType}-${unitId}-${Math.random()}`,
66
+ workerId: worker,
67
+ milestoneLeaseToken: lease.token,
68
+ milestoneId: "M001",
69
+ unitType,
70
+ unitId,
71
+ });
72
+ assert.equal(claim.ok, true);
73
+ if (!claim.ok) throw new Error("claim failed");
74
+ return claim.dispatchId;
75
+ },
76
+ };
77
+ }
78
+
79
+ function historyFor(scopeId: string | null) {
80
+ return createDispatchHistory({ resolveScopeId: () => scopeId });
81
+ }
82
+
83
+ // ─── Key format ──────────────────────────────────────────────────────────────
84
+
85
+ test("buildDispatchKey produces the canonical unitType:unitId format", () => {
86
+ assert.equal(buildDispatchKey("execute-task", "M001/S01/T01"), "execute-task:M001/S01/T01");
87
+ });
88
+
89
+ test("normalizeDispatchKey converts legacy slash keys and keeps canonical keys", () => {
90
+ assert.equal(normalizeDispatchKey("execute-task/M001/S01/T01"), "execute-task:M001/S01/T01");
91
+ assert.equal(normalizeDispatchKey("execute-task:M001/S01/T01"), "execute-task:M001/S01/T01");
92
+ assert.equal(normalizeDispatchKey("opaque"), "opaque");
93
+ });
94
+
95
+ test("parseDispatchKey splits canonical and legacy keys at the unit type", () => {
96
+ assert.deepEqual(parseDispatchKey("complete-slice:M001/S01"), {
97
+ unitType: "complete-slice",
98
+ unitId: "M001/S01",
99
+ });
100
+ assert.deepEqual(parseDispatchKey("complete-slice/M001/S01"), {
101
+ unitType: "complete-slice",
102
+ unitId: "M001/S01",
103
+ });
104
+ assert.equal(parseDispatchKey("opaque"), null);
105
+ });
106
+
107
+ // ─── Window record/evict ─────────────────────────────────────────────────────
108
+
109
+ test("recordDispatch caps the window at the window size, evicting oldest-first", () => {
110
+ const history = historyFor(null);
111
+ for (let i = 0; i < STUCK_WINDOW_SIZE + 2; i++) {
112
+ history.recordDispatch("execute-task", `M001/S01/T${i}`);
113
+ }
114
+ const window = history.getRecentWindow();
115
+ assert.equal(window.length, STUCK_WINDOW_SIZE);
116
+ assert.equal(window[0].key, "execute-task:M001/S01/T2");
117
+ assert.equal(window[window.length - 1].key, `execute-task:M001/S01/T${STUCK_WINDOW_SIZE + 1}`);
118
+ });
119
+
120
+ test("countMatching counts entries for the canonical key", () => {
121
+ const history = historyFor(null);
122
+ history.recordDispatch("execute-task", "M001/S01/T01");
123
+ history.recordDispatch("complete-slice", "M001/S01");
124
+ history.recordDispatch("execute-task", "M001/S01/T01");
125
+ assert.equal(history.countMatching("execute-task:M001/S01/T01"), 2);
126
+ assert.equal(history.countMatching("complete-slice:M001/S01"), 1);
127
+ });
128
+
129
+ test("clearOnRecovery empties the window", () => {
130
+ const history = historyFor(null);
131
+ history.recordDispatch("execute-task", "M001/S01/T01");
132
+ history.recordDispatch("execute-task", "M001/S01/T01");
133
+ history.clearOnRecovery();
134
+ assert.equal(history.getRecentWindow().length, 0);
135
+ assert.equal(history.detectStuck(), null);
136
+ });
137
+
138
+ // ─── Ledger error attachment + detect-stuck delegation ──────────────────────
139
+
140
+ test("recordDispatch attaches the latest ledger error on repeats so repeat-error detection fires", (t) => {
141
+ const f = makeLedgerFixture(t);
142
+ const dispatchId = f.claim("execute-task", "M001/S01/T01");
143
+ markFailed(dispatchId, { errorSummary: "boom: deterministic failure" });
144
+
145
+ const history = historyFor(f.base);
146
+ history.recordDispatch("execute-task", "M001/S01/T01");
147
+ history.recordDispatch("execute-task", "M001/S01/T01");
148
+ history.recordDispatch("execute-task", "M001/S01/T01");
149
+
150
+ const window = history.getRecentWindow();
151
+ // First dispatch of a unit skips the ledger lookup (zero DB cost on the
152
+ // common path); repeats attach the latest error.
153
+ assert.equal(window[0].error, undefined);
154
+ assert.equal(window[1].error, "boom: deterministic failure");
155
+ assert.equal(window[2].error, "boom: deterministic failure");
156
+ const verdict = history.detectStuck();
157
+ assert.equal(verdict?.stuck, true);
158
+ assert.match(verdict?.reason ?? "", /Same error repeated/);
159
+ });
160
+
161
+ test("lookupLatestLedgerError matches the bare unit id, not the compound key", (t) => {
162
+ const f = makeLedgerFixture(t);
163
+ const dispatchId = f.claim("execute-task", "M001/S01/T01");
164
+ markFailed(dispatchId, { errorSummary: "boom: deterministic failure" });
165
+
166
+ // The ledger keys rows by the bare unit id with the unit type in its own
167
+ // column. The shared lookup (also used by dispatch.ts's runDispatch path)
168
+ // must use the bare id; a compound `unitType/unitId` value misses entirely,
169
+ // which previously silently dropped repeat-error detection on that path.
170
+ assert.equal(
171
+ lookupLatestLedgerError("execute-task", "M001/S01/T01"),
172
+ "boom: deterministic failure",
173
+ );
174
+ assert.equal(
175
+ lookupLatestLedgerError("execute-task", "execute-task/M001/S01/T01"),
176
+ undefined,
177
+ "a compound key must not match the bare-id ledger row",
178
+ );
179
+ assert.equal(
180
+ lookupLatestLedgerError("plan-slice", "M001/S01/T01"),
181
+ undefined,
182
+ "a different unit type on the same id must not be attached",
183
+ );
184
+ });
185
+
186
+ test("recordDispatch never attaches another unit type's ledger error for the same unit id", (t) => {
187
+ const f = makeLedgerFixture(t);
188
+ const dispatchId = f.claim("plan-slice", "M001/S01");
189
+ markFailed(dispatchId, { errorSummary: "boom: plan failure" });
190
+
191
+ const history = historyFor(f.base);
192
+ history.recordDispatch("execute-task", "M001/S01");
193
+ history.recordDispatch("execute-task", "M001/S01");
194
+
195
+ assert.ok(history.getRecentWindow().every((entry) => entry.error === undefined));
196
+ assert.equal(history.detectStuck(), null);
197
+ });
198
+
199
+ test("detectStuck fires on three consecutive same-key dispatches without errors", () => {
200
+ const history = historyFor(null);
201
+ for (let i = 0; i < 3; i++) history.recordDispatch("plan-slice", "M001/S01");
202
+ const verdict = history.detectStuck();
203
+ assert.equal(verdict?.stuck, true);
204
+ assert.match(verdict?.reason ?? "", /plan-slice:M001\/S01 derived 3 consecutive times/);
205
+ });
206
+
207
+ // ─── Retry-budget suppression ────────────────────────────────────────────────
208
+
209
+ test("a bare-id ledger row for a different unit type does not suppress the stuck verdict", (t) => {
210
+ const f = makeLedgerFixture(t);
211
+ // Retry backoff is open for plan-slice:M001/S01 only (bare-id ledger row).
212
+ const dispatchId = f.claim("plan-slice", "M001/S01");
213
+ markFailed(dispatchId, { errorSummary: "", retryAfterMs: 60_000 });
214
+
215
+ const history = historyFor(f.base);
216
+ for (let i = 0; i < 3; i++) history.recordDispatch("execute-task", "M001/S01");
217
+ const verdict = history.detectStuck();
218
+ assert.equal(verdict?.stuck, true, "another unit type's backoff must not suppress this unit");
219
+ });
220
+
221
+ test("consecutive-repeat verdict is suppressed while the retry budget drains", (t) => {
222
+ const f = makeLedgerFixture(t);
223
+ // markCanceled leaves error_summary null so the repeat-error rule (which is
224
+ // never suppressed) cannot fire; the suppression target is rule 2/2b.
225
+ const first = f.claim("plan-slice", "M001/S01");
226
+ markCanceled(first, "retry");
227
+ const second = f.claim("plan-slice", "M001/S01");
228
+ markFailed(second, { errorSummary: "", retryAfterMs: 60_000 });
229
+
230
+ const history = historyFor(f.base);
231
+ for (let i = 0; i < 3; i++) history.recordDispatch("plan-slice", "M001/S01");
232
+ assert.equal(history.detectStuck(), null, "stuck verdict must be suppressed inside the retry backoff window");
233
+ });
234
+
235
+ test("exhausted retry budget does not suppress the stuck verdict", (t) => {
236
+ const f = makeLedgerFixture(t);
237
+ const ids: number[] = [];
238
+ for (let i = 0; i < 3; i++) {
239
+ const id = f.claim("plan-slice", "M001/S01");
240
+ markCanceled(id, "retry");
241
+ ids.push(id);
242
+ }
243
+ const last = f.claim("plan-slice", "M001/S01");
244
+ // attempt_n defaults to 1 here; bump via a fresh claim is unnecessary —
245
+ // exhaust by omitting next_run_at instead (no scheduled retry → no backoff).
246
+ markFailed(last, { errorSummary: "" });
247
+
248
+ const history = historyFor(f.base);
249
+ for (let i = 0; i < 3; i++) history.recordDispatch("plan-slice", "M001/S01");
250
+ const verdict = history.detectStuck();
251
+ assert.equal(verdict?.stuck, true);
252
+ });
253
+
254
+ // ─── Rehydration (#482 regression) ───────────────────────────────────────────
255
+
256
+ test("rehydrate seeds the window from the ledger with normalized canonical keys", (t) => {
257
+ const f = makeLedgerFixture(t);
258
+ for (let i = 0; i < 2; i++) {
259
+ const id = f.claim("execute-task", "M001/S01/T01");
260
+ markFailed(id, { errorSummary: "" });
261
+ }
262
+
263
+ const history = historyFor(f.base);
264
+ const count = history.rehydrate();
265
+ assert.equal(count, 2);
266
+ assert.deepEqual(
267
+ history.getRecentWindow().map((e) => e.key),
268
+ ["execute-task:M001/S01/T01", "execute-task:M001/S01/T01"],
269
+ );
270
+ });
271
+
272
+ test("#482 regression: a re-dispatch loop spanning a session restart is detected as stuck", (t) => {
273
+ const f = makeLedgerFixture(t);
274
+ // Session 1: the same unit was dispatched twice and never made progress.
275
+ for (let i = 0; i < 2; i++) {
276
+ const id = f.claim("execute-task", "M001/S01/T01");
277
+ markFailed(id, { errorSummary: "" });
278
+ }
279
+
280
+ // Session 2: a brand-new history (fresh orchestrator) rehydrates from the
281
+ // ledger; the very next decision for the same unit trips the stuck verdict
282
+ // instead of silently re-dispatching forever.
283
+ const restarted = historyFor(f.base);
284
+ restarted.rehydrate();
285
+ restarted.recordDispatch("execute-task", "M001/S01/T01");
286
+ const verdict = restarted.detectStuck();
287
+ assert.equal(verdict?.stuck, true);
288
+ assert.match(verdict?.reason ?? "", /execute-task:M001\/S01\/T01 derived 3 consecutive times/);
289
+ });
290
+
291
+ test("rehydrate mirrors recordDispatch error attachment so repeat-error detection fires after the next dispatch", (t) => {
292
+ const f = makeLedgerFixture(t);
293
+ // Session 1: two failed dispatches for the same unit, same error summary.
294
+ for (let i = 0; i < 2; i++) {
295
+ const id = f.claim("execute-task", "M001/S01/T01");
296
+ markFailed(id, { errorSummary: "boom: deterministic failure" });
297
+ }
298
+
299
+ // Session 2: fresh history rehydrates from the ledger. Just like the live
300
+ // recordDispatch path, the first occurrence of a unit skips the ledger
301
+ // lookup; only repeats carry the error. So rehydration alone does not trip
302
+ // Rule 1 — keeping the post-restart window no more aggressive than the live
303
+ // one (Rule 1 has no retry-budget suppression).
304
+ const restarted = historyFor(f.base);
305
+ const count = restarted.rehydrate();
306
+ assert.equal(count, 2);
307
+ const window = restarted.getRecentWindow();
308
+ assert.equal(window[0].error, undefined);
309
+ assert.equal(window[1].error, "boom: deterministic failure");
310
+ assert.equal(restarted.detectStuck(), null);
311
+
312
+ // The next dispatch of the same unit attaches the error again, giving two
313
+ // consecutive matching errors → Rule 1 fires, exactly as in the live path.
314
+ restarted.recordDispatch("execute-task", "M001/S01/T01");
315
+ const verdict = restarted.detectStuck();
316
+ assert.equal(verdict?.stuck, true);
317
+ assert.match(verdict?.reason ?? "", /Same error repeated/);
318
+ });
319
+
320
+ test("rehydrate degrades to an empty window without a scope or ledger", () => {
321
+ const noScope = historyFor(null);
322
+ assert.equal(noScope.rehydrate(), 0);
323
+ assert.equal(noScope.getRecentWindow().length, 0);
324
+
325
+ const noDb = historyFor("/nonexistent/scope");
326
+ assert.equal(noDb.rehydrate(), 0);
327
+ assert.equal(noDb.getRecentWindow().length, 0);
328
+ });
@@ -7,6 +7,10 @@ const require = createRequire(import.meta.url);
7
7
  const ROOT = new URL("../../../../../", import.meta.url);
8
8
 
9
9
  export function resolve(specifier, context, nextResolve) {
10
+ if (specifier.startsWith('node:')) {
11
+ return { url: specifier, format: 'builtin', shortCircuit: true };
12
+ }
13
+
10
14
  // 1. Redirect all workspace package bare imports to source.
11
15
  // CI portability runs don't build any packages/ dist artifacts, so every
12
16
  // @gsd/* specifier (including transitive ones pulled in by pi-coding-agent
@@ -100,6 +104,10 @@ export function resolve(specifier, context, nextResolve) {
100
104
  }
101
105
 
102
106
  export function load(url, context, nextLoad) {
107
+ if (url.startsWith('node:') || context.format === 'builtin') {
108
+ return { format: 'builtin', source: '', shortCircuit: true };
109
+ }
110
+
103
111
  // jiti/CJS may still enter through stale packages/*/dist/index.js — redirect to src.
104
112
  if (url.includes('/packages/pi-ai/dist/index.js')) {
105
113
  url = url.replace('/dist/index.js', '/src/index.ts');
@@ -0,0 +1,73 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Doctor git checks treat validation-pass closeout as terminal without SUMMARY.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+ import { execFileSync } from "node:child_process";
7
+ import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
8
+ import { tmpdir } from "node:os";
9
+ import { join } from "node:path";
10
+
11
+ import { runGSDDoctor } from "../doctor.ts";
12
+ import { openDatabase, insertMilestone, insertSlice, insertAssessment, closeDatabase } from "../gsd-db.js";
13
+ import { createWorktree, worktreePath } from "../worktree-manager.ts";
14
+
15
+ function runGit(args: string[], cwd: string): string {
16
+ return execFileSync("git", args, {
17
+ cwd,
18
+ stdio: ["ignore", "pipe", "pipe"],
19
+ encoding: "utf-8",
20
+ }).trim();
21
+ }
22
+
23
+ function makeRepo(): string {
24
+ const base = mkdtempSync(join(tmpdir(), "gsd-doctor-terminal-"));
25
+ runGit(["init", "-b", "main"], base);
26
+ runGit(["config", "user.name", "Test User"], base);
27
+ runGit(["config", "user.email", "test@example.com"], base);
28
+ writeFileSync(join(base, "package.json"), "{\"scripts\":{}}\n", "utf-8");
29
+ runGit(["add", "."], base);
30
+ runGit(["commit", "-m", "chore: init"], base);
31
+ return base;
32
+ }
33
+
34
+ test.after(() => {
35
+ closeDatabase();
36
+ });
37
+
38
+ test("doctor flags orphaned worktree for DB-complete milestone without SUMMARY", async (t) => {
39
+ const base = makeRepo();
40
+ t.after(() => rmSync(base, { recursive: true, force: true }));
41
+
42
+ mkdirSync(join(base, ".gsd"), { recursive: true });
43
+ openDatabase(join(base, ".gsd", "gsd.db"));
44
+ insertMilestone({ id: "M008", title: "Done", status: "complete" });
45
+ insertSlice({ id: "S01", milestoneId: "M008", title: "Slice", status: "complete" });
46
+ insertAssessment({
47
+ path: "milestones/M008/M008-VALIDATION.md",
48
+ milestoneId: "M008",
49
+ status: "pass",
50
+ scope: "milestone-validation",
51
+ fullContent: "verdict: pass",
52
+ });
53
+ writeFileSync(
54
+ join(base, ".gsd", "PREFERENCES.md"),
55
+ "---\ngit:\n isolation: worktree\n---\n",
56
+ );
57
+ mkdirSync(join(base, ".gsd", "milestones", "M008"), { recursive: true });
58
+ writeFileSync(
59
+ join(base, ".gsd", "milestones", "M008", "M008-ROADMAP.md"),
60
+ "# M008 Roadmap\n\n- [x] **S01: Slice** `risk:low` `depends:[]`\n",
61
+ );
62
+
63
+ createWorktree(base, "M008", { branch: "milestone/M008" });
64
+ const wtPath = worktreePath(base, "M008");
65
+ assert.ok(existsSync(wtPath), "worktree should exist for the test");
66
+
67
+ const report = await runGSDDoctor(base, { isolationMode: "worktree" });
68
+
69
+ assert.ok(
70
+ report.issues.some((issue) => issue.code === "orphaned_auto_worktree" && issue.unitId === "M008"),
71
+ "doctor should treat DB-complete milestone without SUMMARY as terminal for cleanup",
72
+ );
73
+ });
@@ -0,0 +1,132 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ import { createBashTool } from "@gsd/pi-coding-agent";
5
+
6
+ import { registerDynamicTools } from "../bootstrap/dynamic-tools.ts";
7
+ import { createAsyncBashTool } from "../../async-jobs/async-bash-tool.ts";
8
+
9
+ // These tests assert on the runtime tool objects the agent actually receives —
10
+ // the registered GSD bash tool, the core bash tool, and the async_bash tool —
11
+ // not on source text. The behavioral guarantee (an explicit timeout still
12
+ // fires after the silent 120s cap was removed) is exercised by spawning a real
13
+ // process at the bottom of the file.
14
+
15
+ /** Capture the GSD-registered `bash` tool object from registerDynamicTools. */
16
+ function registerAndCaptureBash(): any {
17
+ let captured: any = undefined;
18
+ const pi = {
19
+ registerTool: (tool: any) => {
20
+ if (!captured && tool && tool.name === "bash") captured = tool;
21
+ },
22
+ };
23
+ registerDynamicTools(pi as any);
24
+ assert.ok(captured, "registerDynamicTools must register a tool named 'bash'");
25
+ return captured;
26
+ }
27
+
28
+ // 1. Cap removal: the GSD bash tool no longer injects a default timeout. The
29
+ // schema's timeout stays optional (no `default`), so an omitted timeout
30
+ // means "no timeout" rather than a silent 120s cap.
31
+ test("GSD bash tool exposes an optional timeout with no injected default", () => {
32
+ const bash = registerAndCaptureBash();
33
+ const timeout = bash.parameters?.properties?.timeout;
34
+ assert.ok(timeout, "bash tool must expose a `timeout` parameter");
35
+ assert.equal(
36
+ "default" in timeout,
37
+ false,
38
+ "the timeout schema must not carry a default — an omitted timeout means uncapped",
39
+ );
40
+ assert.equal(
41
+ bash.parameters?.required?.includes?.("timeout") ?? false,
42
+ false,
43
+ "timeout must remain optional",
44
+ );
45
+ });
46
+
47
+ // 2. Watchdog verbiage is GSD-scoped: the core bash tool (reused by non-GSD
48
+ // embeddings with no watchdog) must NOT claim a watchdog, while the
49
+ // GSD-registered tool injects it into both description and timeout schema.
50
+ test("core bash tool does not advertise the auto-mode watchdog", () => {
51
+ const core = createBashTool(process.cwd(), { spawnHook: (c: any) => c });
52
+ assert.equal(
53
+ /stalled-tool watchdog/.test(core.description ?? ""),
54
+ false,
55
+ "core bash must not advertise a watchdog — non-GSD embeddings have none",
56
+ );
57
+ assert.equal(
58
+ /stalled-tool watchdog/.test(
59
+ (core.parameters as any)?.properties?.timeout?.description ?? "",
60
+ ),
61
+ false,
62
+ "core bash timeout schema must not advertise a watchdog",
63
+ );
64
+ });
65
+
66
+ test("GSD-registered bash tool advertises the stalled-tool watchdog", () => {
67
+ const bash = registerAndCaptureBash();
68
+ assert.equal(
69
+ /stalled-tool watchdog/.test(bash.description ?? ""),
70
+ true,
71
+ "the GSD bash description must name the stalled-tool watchdog",
72
+ );
73
+ assert.equal(
74
+ /stalled-tool watchdog/.test(
75
+ bash.parameters?.properties?.timeout?.description ?? "",
76
+ ),
77
+ true,
78
+ "the GSD bash timeout schema must name the stalled-tool watchdog",
79
+ );
80
+ });
81
+
82
+ // 3. async_bash guidance frames itself as a non-blocking/background choice and
83
+ // no longer implies sync bash is time-capped.
84
+ test("async_bash guidance is non-blocking and drops the sync-cap implication", () => {
85
+ const asyncTool: any = createAsyncBashTool(
86
+ () => ({ register: () => "job-0" }) as any,
87
+ () => process.cwd(),
88
+ );
89
+ const guidance = (asyncTool.promptGuidelines ?? []).join("\n");
90
+ assert.equal(
91
+ /more than a few seconds/.test(guidance),
92
+ false,
93
+ "async_bash guidance must not imply sync bash is time-capped",
94
+ );
95
+ assert.equal(
96
+ /non-blocking/.test(guidance),
97
+ true,
98
+ "async_bash guidance must describe itself as non-blocking",
99
+ );
100
+ });
101
+
102
+ // 4. Behavioral passthrough: an explicitly-set timeout is still honored after
103
+ // the cap removal. A 1s timeout on a 5s sleep must fire well under 5s.
104
+ test("GSD bash still forwards an explicit timeout (cap removal did not break passthrough)", async () => {
105
+ const bash = registerAndCaptureBash();
106
+
107
+ const start = Date.now();
108
+ let resultText = "";
109
+ try {
110
+ const result: any = await bash.execute(
111
+ "t1",
112
+ { command: "sleep 5", timeout: 1 },
113
+ undefined,
114
+ undefined,
115
+ { cwd: process.cwd() },
116
+ );
117
+ resultText = JSON.stringify(result ?? "");
118
+ } catch (err) {
119
+ resultText = String(err instanceof Error ? err.message : err);
120
+ }
121
+ const elapsed = Date.now() - start;
122
+
123
+ assert.equal(
124
+ /timed out|timeout|exited with code|force-killed/i.test(resultText),
125
+ true,
126
+ `explicit 1s timeout should fire before the 5s sleep completes; got: ${resultText}`,
127
+ );
128
+ assert.ok(
129
+ elapsed < 4500,
130
+ `explicit timeout should fire quickly, not run to completion (elapsed ${elapsed}ms)`,
131
+ );
132
+ });