@opengsd/gsd-pi 1.2.0-dev.fb12b103 → 1.2.0-dev.fbdca60b

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 (580) 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/claude-code-cli/stream-adapter.js +447 -215
  15. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  16. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  17. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  18. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  19. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  20. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  22. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  23. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  24. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  25. package/dist/resources/extensions/gsd/auto/orchestrator.js +167 -64
  26. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  27. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  28. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  29. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  30. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  33. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  34. package/dist/resources/extensions/gsd/auto-dispatch.js +39 -58
  35. package/dist/resources/extensions/gsd/auto-model-selection.js +11 -7
  36. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  37. package/dist/resources/extensions/gsd/auto-prompts.js +66 -9
  38. package/dist/resources/extensions/gsd/auto-start.js +26 -8
  39. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  40. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  41. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  42. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  43. package/dist/resources/extensions/gsd/auto.js +52 -2
  44. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  45. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  46. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  47. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  48. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -45
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  50. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  51. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  52. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  53. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  56. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  57. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  58. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  59. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  60. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  61. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  62. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  63. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  64. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  65. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  66. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  67. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  68. package/dist/resources/extensions/gsd/files.js +33 -19
  69. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  70. package/dist/resources/extensions/gsd/gsd-db.js +17 -21
  71. package/dist/resources/extensions/gsd/guidance.js +60 -0
  72. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  73. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  74. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  75. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  76. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  77. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  78. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  79. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  80. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  81. package/dist/resources/extensions/gsd/notifications.js +12 -7
  82. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  83. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  84. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  86. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  89. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  90. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  91. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  92. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  93. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  94. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  95. package/dist/resources/extensions/gsd/prompts/run-uat.md +8 -4
  96. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  97. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  99. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  100. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  101. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  102. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  103. package/dist/resources/extensions/gsd/state.js +11 -2
  104. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  105. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  106. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  107. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  108. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  109. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  110. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  111. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  112. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  113. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  114. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  115. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  116. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  117. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  118. package/dist/resources/extensions/gsd/uat-policy.js +40 -15
  119. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  120. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  121. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  122. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  123. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  124. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  125. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  126. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  127. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  128. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  129. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  130. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  131. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  132. package/dist/resources/extensions/gsd/worktree.js +8 -1
  133. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  134. package/dist/resources/extensions/shared/gsd-browser-cli.js +21 -2
  135. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  136. package/dist/resources/shared/package-manager-detection.js +1 -1
  137. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  138. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  139. package/dist/runtime-checks.d.ts +10 -0
  140. package/dist/runtime-checks.js +27 -0
  141. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  142. package/dist/update-check.d.ts +2 -0
  143. package/dist/update-check.js +24 -1
  144. package/dist/update-cmd.js +20 -3
  145. package/dist/web/standalone/.next/BUILD_ID +1 -1
  146. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  147. package/dist/web/standalone/.next/build-manifest.json +2 -2
  148. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  149. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  150. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  156. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  158. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/index.html +1 -1
  200. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  207. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  208. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  209. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  211. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  212. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  213. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  214. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  215. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  216. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  217. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  218. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  219. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  220. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  221. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  222. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  223. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  224. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  225. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  226. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  227. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  228. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  229. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  230. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  231. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  232. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  233. package/package.json +3 -3
  234. package/packages/cloud-mcp-gateway/package.json +2 -2
  235. package/packages/contracts/package.json +1 -1
  236. package/packages/daemon/package.json +4 -4
  237. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  238. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  239. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  240. package/packages/gsd-agent-core/package.json +5 -5
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +50 -6
  248. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  252. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +17 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  260. package/packages/gsd-agent-modes/package.json +7 -7
  261. package/packages/mcp-server/README.md +12 -3
  262. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  263. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  264. package/packages/mcp-server/dist/cli-runner.js +137 -0
  265. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  266. package/packages/mcp-server/dist/cli.js +2 -53
  267. package/packages/mcp-server/dist/cli.js.map +1 -1
  268. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  269. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  270. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  271. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  272. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  273. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  274. package/packages/mcp-server/dist/pid-registry.js +459 -0
  275. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  276. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  277. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/probe-mode.js +10 -0
  279. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  280. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  281. package/packages/mcp-server/dist/server.js +4 -0
  282. package/packages/mcp-server/dist/server.js.map +1 -1
  283. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  284. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  285. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  286. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  287. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  288. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  290. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  291. package/packages/mcp-server/package.json +5 -4
  292. package/packages/native/package.json +1 -1
  293. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  294. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  295. package/packages/pi-agent-core/package.json +1 -1
  296. package/packages/pi-ai/README.md +1 -0
  297. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  298. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  299. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  300. package/packages/pi-ai/dist/index.d.ts +2 -0
  301. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/index.js +2 -0
  303. package/packages/pi-ai/dist/index.js.map +1 -1
  304. package/packages/pi-ai/dist/models.generated.d.ts +419 -221
  305. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/models.generated.js +468 -269
  307. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  308. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  309. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  310. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  311. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  312. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  313. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  314. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  315. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  316. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  317. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  318. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  319. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  320. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  321. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  322. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  323. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  324. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  325. package/packages/pi-ai/package.json +3 -2
  326. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  327. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  329. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  332. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  333. package/packages/pi-coding-agent/package.json +7 -7
  334. package/packages/pi-tui/README.md +15 -0
  335. package/packages/pi-tui/dist/index.d.ts +2 -2
  336. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  337. package/packages/pi-tui/dist/index.js +2 -2
  338. package/packages/pi-tui/dist/index.js.map +1 -1
  339. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  340. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  341. package/packages/pi-tui/dist/terminal-image.js +54 -2
  342. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  343. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  344. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  345. package/packages/pi-tui/dist/terminal.js +70 -25
  346. package/packages/pi-tui/dist/terminal.js.map +1 -1
  347. package/packages/pi-tui/dist/tui.d.ts +15 -0
  348. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/tui.js +106 -21
  350. package/packages/pi-tui/dist/tui.js.map +1 -1
  351. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/utils.js +110 -36
  353. package/packages/pi-tui/dist/utils.js.map +1 -1
  354. package/packages/pi-tui/package.json +2 -2
  355. package/packages/rpc-client/package.json +2 -2
  356. package/pkg/dist/theme/theme.d.ts.map +1 -1
  357. package/pkg/dist/theme/theme.js +45 -17
  358. package/pkg/dist/theme/theme.js.map +1 -1
  359. package/pkg/package.json +1 -1
  360. package/src/resources/GSD-WORKFLOW.md +5 -4
  361. package/src/resources/extensions/ask-user-questions.ts +7 -2
  362. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +11 -0
  363. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  364. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  365. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  366. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  367. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  368. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  369. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  370. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  371. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  372. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  373. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  374. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  375. package/src/resources/extensions/gsd/auto/orchestrator.ts +186 -66
  376. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  377. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  378. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  379. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  380. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  381. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  382. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  383. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  384. package/src/resources/extensions/gsd/auto-dispatch.ts +37 -62
  385. package/src/resources/extensions/gsd/auto-model-selection.ts +16 -7
  386. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  387. package/src/resources/extensions/gsd/auto-prompts.ts +78 -9
  388. package/src/resources/extensions/gsd/auto-start.ts +27 -11
  389. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  390. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  391. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  392. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  393. package/src/resources/extensions/gsd/auto.ts +64 -2
  394. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  395. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  396. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  397. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  398. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +118 -50
  399. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  400. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  401. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  402. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  403. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  404. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  405. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  406. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  407. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  408. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  409. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  410. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  411. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  412. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  413. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  414. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  415. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  416. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  417. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  418. package/src/resources/extensions/gsd/files.ts +33 -12
  419. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  420. package/src/resources/extensions/gsd/gsd-db.ts +19 -22
  421. package/src/resources/extensions/gsd/guidance.ts +78 -0
  422. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  423. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  424. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  425. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  426. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  427. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  428. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  429. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  430. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  431. package/src/resources/extensions/gsd/notifications.ts +13 -6
  432. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  433. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  434. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  435. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  436. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  437. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  438. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  440. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  441. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  442. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  443. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +8 -4
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  448. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  449. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  450. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  451. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  452. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  453. package/src/resources/extensions/gsd/state.ts +12 -1
  454. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  457. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +75 -1
  458. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +257 -18
  459. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  460. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  461. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  462. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  463. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  464. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  465. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  466. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  467. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  468. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  469. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  470. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  471. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  472. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  473. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  474. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  475. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  476. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  477. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  478. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  479. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  480. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  481. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  482. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  483. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +46 -0
  484. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  485. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  486. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  487. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  488. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  489. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  490. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  491. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  492. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  493. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  494. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  495. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  496. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  497. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  498. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  499. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  500. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  501. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  503. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  504. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  505. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  506. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  507. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  508. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  509. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  510. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  511. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  512. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  513. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  514. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  515. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  516. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  517. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  518. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  519. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  520. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
  521. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  522. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  523. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  524. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  525. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  526. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  527. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  528. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  529. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  530. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  531. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  532. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  533. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  534. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  535. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  536. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  537. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  538. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  539. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  540. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  541. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  542. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  543. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  544. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  545. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  546. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  547. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  548. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  549. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  550. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  551. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  552. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  553. package/src/resources/extensions/gsd/uat-policy.ts +60 -15
  554. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  555. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  556. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  557. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  558. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  559. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  560. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  561. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  562. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  563. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  564. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  565. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  566. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  567. package/src/resources/extensions/gsd/worktree.ts +7 -1
  568. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  569. package/src/resources/extensions/shared/gsd-browser-cli.ts +23 -2
  570. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  571. package/src/resources/shared/package-manager-detection.ts +1 -1
  572. package/src/resources/skills/create-skill/SKILL.md +3 -0
  573. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  574. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  575. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  576. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  577. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  578. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  579. /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
  580. /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
@@ -58,7 +58,11 @@ import { debugLog } from "./debug-logger.js";
58
58
  import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
59
59
  import { findMilestoneIds } from "./milestone-ids.js";
60
60
  import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
61
- import { resolveEffectiveUatType, shouldDispatchUatForContent, type UatType } from "./uat-policy.js";
61
+ import {
62
+ classifyUatContentForRun,
63
+ shouldDispatchUatForContent,
64
+ type UatType,
65
+ } from "./uat-policy.js";
62
66
  import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
63
67
 
64
68
  export { buildSkillActivationBlock, buildSkillDiscoveryVars };
@@ -972,7 +976,7 @@ export async function inlineDecisionsFromDb(
972
976
 
973
977
  /**
974
978
  * Inline requirements with optional milestone and slice scoping from the DB.
975
- * Falls back to filesystem via inlineGsdRootFile when DB unavailable or empty.
979
+ * Falls back to filesystem via inlineGsdRootFile only when DB is unavailable.
976
980
  */
977
981
  export async function inlineRequirementsFromDb(
978
982
  base: string, milestoneId?: string, sliceId?: string, level?: InlineLevel,
@@ -982,14 +986,28 @@ export async function inlineRequirementsFromDb(
982
986
  const { isDbAvailable } = await import("./gsd-db.js");
983
987
  if (isDbAvailable()) {
984
988
  const { queryRequirements, formatRequirementsForPrompt } = await import("./context-store.js");
985
- const requirements = queryRequirements({ milestoneId, sliceId });
989
+ let requirements = queryRequirements({ milestoneId, sliceId });
990
+ let broadenedScope = false;
991
+ if (requirements.length === 0 && sliceId) {
992
+ requirements = queryRequirements({ milestoneId });
993
+ broadenedScope = true;
994
+ }
995
+ if (requirements.length === 0 && milestoneId) {
996
+ requirements = queryRequirements({ status: "active" });
997
+ broadenedScope = true;
998
+ }
986
999
  if (requirements.length > 0) {
987
- // Use compact format for non-full levels to save ~40% tokens
988
- const formatted = inlineLevel !== "full"
1000
+ // Use compact format for non-full levels, milestone-scoped calls, and
1001
+ // any cascade stage that broadened past the originally requested scope —
1002
+ // a slice-scoped "full" call that fell through to the project-wide
1003
+ // active fallback must not format those rows as full requirements.
1004
+ const useCompact = inlineLevel !== "full" || !sliceId || broadenedScope;
1005
+ const formatted = useCompact
989
1006
  ? formatRequirementsCompact(requirements)
990
1007
  : formatRequirementsForPrompt(requirements);
991
1008
  return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
992
1009
  }
1010
+ return null;
993
1011
  }
994
1012
  } catch (err) {
995
1013
  logWarning("prompt", `inlineRequirementsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -1445,6 +1463,40 @@ export async function checkNeedsReassessment(
1445
1463
  * - No UAT file exists for the slice
1446
1464
  * - UAT result file already exists (idempotent — already ran)
1447
1465
  */
1466
+ /**
1467
+ * Resolve the effective UAT mode for the dispatch gate the same way
1468
+ * `buildRunUatPrompt` does: classify the UAT body with the slice's SUMMARY as
1469
+ * supplemental context, so a `browser-executable` UAT whose slice references a
1470
+ * self-contained harness (`npm run test:uat`, `search-uat.mjs`, `npx
1471
+ * playwright test`) is promoted to `runtime-executable` for the gate too.
1472
+ *
1473
+ * Without this, `checkNeedsRunUat` returns `browser-executable` while the
1474
+ * prompt instructs runtime-only execution, causing the dispatch gate to
1475
+ * require browser tools / warm up the browser daemon (or stop dispatch when
1476
+ * browser MCP is unavailable) for UAT runs that never touch the browser. See
1477
+ * cursor[bot] review on PR #696 for the M007/S01 regression.
1478
+ */
1479
+ async function resolveRunUatEffectiveType(
1480
+ base: string,
1481
+ mid: string,
1482
+ sliceId: string,
1483
+ uatContent: string,
1484
+ ): Promise<UatType> {
1485
+ let summaryContent = "";
1486
+ try {
1487
+ const summaryPath = resolveSliceFile(base, mid, sliceId, "SUMMARY");
1488
+ if (summaryPath) {
1489
+ summaryContent = (await loadFile(summaryPath)) ?? "";
1490
+ }
1491
+ } catch (err) {
1492
+ logWarning(
1493
+ "prompt",
1494
+ `resolveRunUatEffectiveType SUMMARY load failed: ${err instanceof Error ? err.message : String(err)}`,
1495
+ );
1496
+ }
1497
+ return classifyUatContentForRun(uatContent, summaryContent).effectiveType;
1498
+ }
1499
+
1448
1500
  export async function checkNeedsRunUat(
1449
1501
  base: string, mid: string, state: GSDState, prefs: GSDPreferences | undefined,
1450
1502
  ): Promise<{ sliceId: string; uatType: UatType } | null> {
@@ -1473,7 +1525,8 @@ export async function checkNeedsRunUat(
1473
1525
  if (assessmentContent && hasVerdict(assessmentContent)) continue;
1474
1526
  }
1475
1527
  if (!shouldDispatchUatForContent(uatContent, prefs)) continue;
1476
- return { sliceId: sid, uatType: resolveEffectiveUatType(uatContent) };
1528
+ const uatType = await resolveRunUatEffectiveType(base, mid, sid, uatContent);
1529
+ return { sliceId: sid, uatType };
1477
1530
  }
1478
1531
  return null;
1479
1532
  }
@@ -1506,7 +1559,8 @@ export async function checkNeedsRunUat(
1506
1559
  if (assessmentContentFb && hasVerdict(assessmentContentFb)) continue;
1507
1560
  }
1508
1561
  if (!shouldDispatchUatForContent(uatContentFb, prefs)) continue;
1509
- return { sliceId: uatSid, uatType: resolveEffectiveUatType(uatContentFb) };
1562
+ const uatType = await resolveRunUatEffectiveType(base, mid, uatSid, uatContentFb);
1563
+ return { sliceId: uatSid, uatType };
1510
1564
  }
1511
1565
  return null;
1512
1566
  }
@@ -3560,15 +3614,30 @@ export async function buildRunUatPrompt(
3560
3614
  null,
3561
3615
  cappedInlinedContext.length < rawInlinedContext.length ? `dropped ${rawInlinedContext.length - cappedInlinedContext.length} chars` : "within budget",
3562
3616
  );
3617
+ const uatPolicy = classifyUatContentForRun(uatContent, cappedInlinedContext);
3618
+ const uatType = uatPolicy.effectiveType;
3619
+ const runtimeHarnessOverride = uatPolicy.declaredType === "browser-executable" && uatType === "runtime-executable"
3620
+ ? [
3621
+ "## Runtime harness override",
3622
+ "",
3623
+ "This UAT declares `browser-executable` but the slice references a self-contained verification command (`npm run test:uat`, `search-uat.mjs`, or similar).",
3624
+ "Run **only** that command via `gsd_uat_exec` with `uat-runtime-check` intent.",
3625
+ "Do **not** call `uat-service-start`, do **not** run `npm run start`, `npm run test:server`, or any separate server command.",
3626
+ "Do **not** use `browser_navigate` or other `browser_*` tools — the harness already exercises the browser.",
3627
+ "When the harness exits 0, save **PASS** with `uatType: \"runtime-executable\"` (the effective mode above, not the UAT file header) and **runtime** check modes only.",
3628
+ "",
3629
+ ].join("\n")
3630
+ : "";
3563
3631
  const inlinedContext = prependContextModeToBlock(
3564
3632
  "run-uat",
3565
3633
  base,
3566
- cappedInlinedContext,
3634
+ runtimeHarnessOverride
3635
+ ? `${runtimeHarnessOverride}\n${cappedInlinedContext}`
3636
+ : cappedInlinedContext,
3567
3637
  );
3568
3638
  emitPromptContextTelemetry("run-uat", contextTelemetry, inlinedContext);
3569
3639
 
3570
3640
  const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "ASSESSMENT"));
3571
- const uatType = resolveEffectiveUatType(uatContent);
3572
3641
  const canonicalPresentation = JSON.stringify(buildRunUatPresentationForType(uatType), null, 2);
3573
3642
 
3574
3643
  return loadPrompt("run-uat", {
@@ -28,6 +28,7 @@ import { ensureGsdSymlink, isInheritedRepo, validateProjectId } from "./repo-ide
28
28
  import { migrateToExternalState, recoverFailedMigration } from "./migrate-external.js";
29
29
  import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
30
30
  import { gsdRoot, resolveMilestoneFile } from "./paths.js";
31
+ import { milestoneEntryBlockedGuidance } from "./guidance.js";
31
32
  import { invalidateAllCaches } from "./cache.js";
32
33
  import { writeLock, clearLock, readCrashLock, isLockProcessAlive } from "./crash-recovery.js";
33
34
  import {
@@ -1270,11 +1271,29 @@ export async function bootstrapAutoSession(
1270
1271
  }
1271
1272
  }
1272
1273
 
1273
- const blockingStrandedRecoveryAction = state.activeMilestone
1274
- ? strandedRecoveryActions.find(
1274
+ const requestedMilestoneLock = process.env.GSD_MILESTONE_LOCK?.trim() || null;
1275
+ const lockedActiveMilestone =
1276
+ requestedMilestoneLock && state.activeMilestone?.id === requestedMilestoneLock;
1277
+ let blockingStrandedRecoveryAction: OrphanAuditAction | null;
1278
+ if (lockedActiveMilestone) {
1279
+ // Parallel worker or explicit `/gsd auto Mxxx`: sibling milestones'
1280
+ // stranded work must not block this milestone's resumption, and the
1281
+ // downstream `strandedRecoveryAction` (used for currentMilestoneId,
1282
+ // setActiveMilestoneId, and adoptStrandedMilestone) must be scoped to
1283
+ // the locked milestone only. Falling back to the first sibling action
1284
+ // would mis-target adoption (#742).
1285
+ const lockMatch = strandedRecoveryActions.find(
1286
+ (action) => action.milestoneId === requestedMilestoneLock,
1287
+ ) ?? null;
1288
+ blockingStrandedRecoveryAction = lockMatch;
1289
+ strandedRecoveryAction = lockMatch;
1290
+ } else if (state.activeMilestone) {
1291
+ blockingStrandedRecoveryAction = strandedRecoveryActions.find(
1275
1292
  (action) => action.milestoneId !== state.activeMilestone?.id,
1276
- ) ?? strandedRecoveryAction
1277
- : strandedRecoveryAction;
1293
+ ) ?? strandedRecoveryAction;
1294
+ } else {
1295
+ blockingStrandedRecoveryAction = strandedRecoveryAction;
1296
+ }
1278
1297
 
1279
1298
  if (blockingStrandedRecoveryAction) {
1280
1299
  if (!state.activeMilestone) {
@@ -1296,6 +1315,8 @@ export async function bootstrapAutoSession(
1296
1315
  formatStrandedWorkRecoveryMessage(strandedRecoveryAction),
1297
1316
  "info",
1298
1317
  );
1318
+ } else if (lockedActiveMilestone) {
1319
+ strandedRecoveryAction = null;
1299
1320
  }
1300
1321
 
1301
1322
  if (
@@ -1645,14 +1666,9 @@ export async function bootstrapAutoSession(
1645
1666
  `Cannot enter milestone ${s.currentMilestoneId}: lease is held by another worker.`,
1646
1667
  "error",
1647
1668
  );
1648
- } else if (enterResult.reason === "creation-failed") {
1649
- ctx.ui.notify(
1650
- `Cannot enter milestone ${s.currentMilestoneId}: worktree/branch creation failed. Isolation is degraded.`,
1651
- "error",
1652
- );
1653
- } else if (enterResult.reason === "isolation-degraded") {
1669
+ } else if (enterResult.reason === "creation-failed" || enterResult.reason === "isolation-degraded") {
1654
1670
  ctx.ui.notify(
1655
- `Cannot enter milestone ${s.currentMilestoneId}: isolation is degraded from a prior worktree failure. Close processes locking the worktree and retry, or run /gsd doctor fix.`,
1671
+ milestoneEntryBlockedGuidance(s.currentMilestoneId, enterResult.reason),
1656
1672
  "error",
1657
1673
  );
1658
1674
  } else if (enterResult.reason === "invalid-milestone-id") {
@@ -33,6 +33,24 @@ export interface UnitActivitySnapshot {
33
33
  assistantMessages: number;
34
34
  }
35
35
 
36
+ export interface AutoUnitCloseoutRequest {
37
+ ctx: ExtensionContext;
38
+ basePath: string;
39
+ unitType: string;
40
+ unitId: string;
41
+ startedAt: number;
42
+ opts?: CloseoutOptions;
43
+ }
44
+
45
+ export interface AutoUnitCloseoutResult {
46
+ activityFile?: string;
47
+ gitTransactionRecorded: boolean;
48
+ }
49
+
50
+ type GitTransactionCloseoutOptions =
51
+ Required<Pick<CloseoutOptions, "traceId" | "turnId" | "gitAction" | "gitStatus">>
52
+ & Pick<CloseoutOptions, "gitPush" | "gitError">;
53
+
36
54
  export const GHOST_COMPLETION_MAX_ELAPSED_MS = 500;
37
55
 
38
56
  export function snapshotUnitActivity(
@@ -76,25 +94,27 @@ export function isSuspiciousGhostCompletion(
76
94
  }
77
95
 
78
96
  /**
79
- * Snapshot metrics, save activity log, and fire-and-forget memory extraction
80
- * for a completed unit. Returns the activity log file path (if any).
97
+ * Snapshot metrics, save activity log, extract memories, and record the git
98
+ * transaction for a completed auto-mode unit.
81
99
  */
82
- export async function closeoutUnit(
83
- ctx: ExtensionContext,
84
- basePath: string,
85
- unitType: string,
86
- unitId: string,
87
- startedAt: number,
88
- opts?: CloseoutOptions,
89
- ): Promise<string | undefined> {
90
- const modelId = ctx.model?.id ?? "unknown";
91
- snapshotUnitMetrics(ctx, unitType, unitId, startedAt, modelId, opts);
92
- const activityFile = saveActivityLog(ctx, basePath, unitType, unitId);
100
+ export async function closeoutAutoUnit(
101
+ request: AutoUnitCloseoutRequest,
102
+ ): Promise<AutoUnitCloseoutResult> {
103
+ const modelId = request.ctx.model?.id ?? "unknown";
104
+ snapshotUnitMetrics(
105
+ request.ctx,
106
+ request.unitType,
107
+ request.unitId,
108
+ request.startedAt,
109
+ modelId,
110
+ request.opts,
111
+ );
112
+ const activityFile = saveActivityLog(request.ctx, request.basePath, request.unitType, request.unitId);
93
113
 
94
114
  if (activityFile) {
95
115
  try {
96
- const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import('./memory-extractor.js');
97
- const llmCallFn = buildMemoryLLMCall(ctx);
116
+ const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import("./memory-extractor.js");
117
+ const llmCallFn = buildMemoryLLMCall(request.ctx);
98
118
  if (llmCallFn) {
99
119
  // Awaited: a fire-and-forget here lets memory-extractor writes land in
100
120
  // .gsd/ after closeoutUnit returns but before the milestone merge
@@ -103,11 +123,11 @@ export async function closeoutUnit(
103
123
  // bounded by the extractor's LLM call, which is the acceptable price
104
124
  // for not racing the merge boundary.
105
125
  try {
106
- await extractMemoriesFromUnit(activityFile, unitType, unitId, llmCallFn);
126
+ await extractMemoriesFromUnit(activityFile, request.unitType, request.unitId, llmCallFn);
107
127
  } catch (err) {
108
128
  logWarning(
109
129
  "engine",
110
- `memory extraction failed for ${unitType}/${unitId}: ${(err as Error).message}`,
130
+ `memory extraction failed for ${request.unitType}/${request.unitId}: ${(err as Error).message}`,
111
131
  );
112
132
  }
113
133
  }
@@ -116,23 +136,58 @@ export async function closeoutUnit(
116
136
  }
117
137
  }
118
138
 
119
- if (opts?.traceId && opts.turnId && opts.gitAction && opts.gitStatus) {
139
+ const gitTransaction = resolveGitTransactionOptions(request.opts);
140
+
141
+ if (gitTransaction) {
120
142
  writeTurnGitTransaction({
121
- basePath,
122
- traceId: opts.traceId,
123
- turnId: opts.turnId,
124
- unitType,
125
- unitId,
143
+ basePath: request.basePath,
144
+ traceId: gitTransaction.traceId,
145
+ turnId: gitTransaction.turnId,
146
+ unitType: request.unitType,
147
+ unitId: request.unitId,
126
148
  stage: "record",
127
- action: opts.gitAction,
128
- push: opts.gitPush === true,
129
- status: opts.gitStatus,
130
- error: opts.gitError,
149
+ action: gitTransaction.gitAction,
150
+ push: gitTransaction.gitPush === true,
151
+ status: gitTransaction.gitStatus,
152
+ error: gitTransaction.gitError,
131
153
  metadata: {
132
154
  activityFile,
133
155
  },
134
156
  });
135
157
  }
136
158
 
137
- return activityFile ?? undefined;
159
+ return {
160
+ ...(activityFile ? { activityFile } : {}),
161
+ gitTransactionRecorded: Boolean(gitTransaction),
162
+ };
163
+ }
164
+
165
+ function resolveGitTransactionOptions(
166
+ opts: CloseoutOptions | undefined,
167
+ ): GitTransactionCloseoutOptions | null {
168
+ if (!opts?.traceId || !opts.turnId || !opts.gitAction || !opts.gitStatus) return null;
169
+ return {
170
+ traceId: opts.traceId,
171
+ turnId: opts.turnId,
172
+ gitAction: opts.gitAction,
173
+ gitStatus: opts.gitStatus,
174
+ gitPush: opts.gitPush,
175
+ gitError: opts.gitError,
176
+ };
177
+ }
178
+
179
+ /**
180
+ * Compatibility wrapper for existing auto-loop callers. New code should prefer
181
+ * closeoutAutoUnit so the closeout request and result stay explicit.
182
+ */
183
+ export async function closeoutUnit(
184
+ ctx: ExtensionContext,
185
+ basePath: string,
186
+ unitType: string,
187
+ unitId: string,
188
+ startedAt: number,
189
+ opts?: CloseoutOptions,
190
+ ): Promise<string | undefined> {
191
+ const result = await closeoutAutoUnit({ ctx, basePath, unitType, unitId, startedAt, opts });
192
+ return result.activityFile;
138
193
  }
@@ -5,10 +5,10 @@ import {
5
5
  } from "./unit-tool-contracts.js";
6
6
  import {
7
7
  WORKFLOW_TOOL_ALIAS_PAIRS,
8
- canonicalWorkflowSurfaceToolName,
9
8
  isWorkflowSurfaceAliasTool,
10
9
  stripMcpToolPrefix,
11
10
  } from "./workflow-tool-surface.js";
11
+ import { canonicalWorkflowToolName } from "./engine-hook-contract.js";
12
12
 
13
13
  export {
14
14
  AUTO_UNIT_SCOPED_TOOLS,
@@ -51,9 +51,9 @@ type AutoUnitToolScopeResult = {
51
51
  displayReason?: string;
52
52
  };
53
53
 
54
- export function canonicalWorkflowToolName(toolName: string): string {
55
- return canonicalWorkflowSurfaceToolName(toolName);
56
- }
54
+ // Normalizer seam lives in engine-hook-contract.ts; re-exported here for
55
+ // existing scope importers.
56
+ export { canonicalWorkflowToolName };
57
57
 
58
58
  export function isWorkflowAliasTool(toolName: string): boolean {
59
59
  return isWorkflowSurfaceAliasTool(toolName);
@@ -15,7 +15,7 @@
15
15
 
16
16
  import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
17
17
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
18
- import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath, resolveMilestoneFile } from "./paths.js";
18
+ import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath } from "./paths.js";
19
19
  import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
20
20
  import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
21
21
  import { parseUnitId } from "./unit-id.js";
@@ -25,8 +25,6 @@ import { loadEffectiveGSDPreferences } from "./preferences.js";
25
25
  import type { GSDPreferences } from "./preferences-types.js";
26
26
  import { isClosedStatus } from "./status-guards.js";
27
27
  import { loadFile } from "./files.js";
28
- import { parseRoadmap } from "./parsers-legacy.js";
29
- import { isMilestoneComplete } from "./state.js";
30
28
  import {
31
29
  runVerificationGate,
32
30
  runVerificationGateForTargets,
@@ -52,6 +50,7 @@ import { getSlice } from "./gsd-db.js";
52
50
  import { getLedger } from "./metrics.js";
53
51
  import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
54
52
  import { formatPostUnitStatusCard } from "./auto-status-message.js";
53
+ import { detectWebApp } from "./web-app-uat.js";
55
54
 
56
55
  export interface VerificationContext {
57
56
  s: AutoSession;
@@ -373,29 +372,13 @@ async function runValidateMilestonePostCheck(
373
372
  * DB-backed projects are authoritative (#4094 peer review); falls back to
374
373
  * roadmap parsing only when the DB is unavailable.
375
374
  */
376
- async function countIncompleteSlices(basePath: string, milestoneId: string): Promise<number> {
377
- if (isDbAvailable()) {
378
- const slices = getMilestoneSlices(milestoneId);
379
- if (slices.length === 0) {
380
- // No DB rows — treat as "unknown", do not pause.
381
- return 1;
382
- }
383
- return slices.filter((slice) => !isClosedStatus(slice.status)).length;
384
- }
385
-
386
- // Filesystem fallback: parse the roadmap markdown.
387
- try {
388
- const roadmapFile = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
389
- if (!roadmapFile) return 1;
390
- const roadmapContent = await loadFile(roadmapFile);
391
- if (!roadmapContent) return 1;
392
- const roadmap = parseRoadmap(roadmapContent);
393
- if (roadmap.slices.length === 0) return 1;
394
- return isMilestoneComplete(roadmap) ? 0 : 1;
395
- } catch {
396
- // Parsing failures should not cause false-positive pauses.
397
- return 1;
398
- }
375
+ async function countIncompleteSlices(_basePath: string, milestoneId: string): Promise<number> {
376
+ // DB-authoritative (ADR-017): no markdown fallback. DB unavailable or no
377
+ // rows means "unknown" — do not pause.
378
+ if (!isDbAvailable()) return 1;
379
+ const slices = getMilestoneSlices(milestoneId);
380
+ if (slices.length === 0) return 1;
381
+ return slices.filter((slice) => !isClosedStatus(slice.status)).length;
399
382
  }
400
383
 
401
384
  /**
@@ -805,17 +788,32 @@ export async function runPostUnitVerification(
805
788
  s.verificationRetryFailureHashes.delete(retryKey);
806
789
  s.pendingVerificationRetry = null;
807
790
  return "continue";
791
+ } else if (
792
+ verdict.reason === "no-host-checks" &&
793
+ taskAlreadyComplete &&
794
+ detectWebApp(s.basePath) &&
795
+ !result.runtimeErrors?.some((e) => e.blocking)
796
+ ) {
797
+ s.verificationRetryCount.delete(retryKey);
798
+ s.verificationRetryFailureHashes.delete(retryKey);
799
+ s.pendingVerificationRetry = null;
800
+ ctx.ui.notify(
801
+ "No task-level host verification command was found for a completed browser-facing task; continuing so slice UAT can verify the UI with browser tools.",
802
+ "warning",
803
+ );
804
+ return "continue";
808
805
  } else if (verdict.reason === "no-host-checks") {
809
806
  s.verificationRetryCount.delete(retryKey);
810
807
  s.verificationRetryFailureHashes.delete(retryKey);
811
808
  s.pendingVerificationRetry = null;
809
+ const pauseMessage = `Verification failed: ${verdict.failureContext}`;
812
810
  ctx.ui.notify(
813
- "Verification gate FAILED — no runnable host-owned verification checks were discovered. Pausing for human review.",
811
+ `Verification gate FAILED — ${verdict.failureContext}`,
814
812
  "error",
815
813
  );
816
814
  process.stderr.write(`verification-gate: ${verdict.failureContext}\n`);
817
815
  await pauseAuto(ctx, pi, {
818
- message: "Verification failed: no runnable host-owned verification checks were discovered.",
816
+ message: pauseMessage,
819
817
  category: "unknown",
820
818
  });
821
819
  return "pause";
@@ -972,6 +972,14 @@ function _resolveIntegrationBranchForReuse(
972
972
  }
973
973
  }
974
974
 
975
+ function safeCwd(fallback: string): string {
976
+ try {
977
+ return process.cwd();
978
+ } catch {
979
+ return fallback;
980
+ }
981
+ }
982
+
975
983
  /**
976
984
  * When reusing an existing milestone branch, fast-forward it onto the
977
985
  * integration branch when that's safe (branch is a strict ancestor of
@@ -1155,7 +1163,7 @@ export function teardownAutoWorktree(
1155
1163
 
1156
1164
  const branch = autoWorktreeBranch(milestoneId);
1157
1165
  const { preserveBranch = false, preserveWorktree = false } = opts;
1158
- const previousCwd = process.cwd();
1166
+ const previousCwd = safeCwd(originalBasePath);
1159
1167
 
1160
1168
  // Wrap the entire teardown body in a single try/finally so activeWorkspace
1161
1169
  // is ALWAYS cleared — even if process.chdir throws (e.g. originalBasePath
@@ -1250,7 +1258,7 @@ export function teardownAutoWorktree(
1250
1258
  * still works after process restart when module state has been reset.
1251
1259
  */
1252
1260
  export function isInAutoWorktree(basePath: string): boolean {
1253
- const targetPath = isGsdWorktreePath(basePath) ? basePath : process.cwd();
1261
+ const targetPath = isGsdWorktreePath(basePath) ? basePath : safeCwd("");
1254
1262
  if (!isGsdWorktreePath(targetPath)) return false;
1255
1263
 
1256
1264
  const storedBase = getAutoWorktreeOriginalBase();
@@ -2229,6 +2237,11 @@ export function mergeMilestoneToMain(
2229
2237
  process.chdir(originalBasePath_);
2230
2238
  } catch (err) {
2231
2239
  logWarning("worktree", `chdir to project root after merge failed: ${err instanceof Error ? err.message : String(err)}`);
2240
+ debugLog("mergeMilestoneToMain", {
2241
+ phase: "post-merge-chdir-failed",
2242
+ target: originalBasePath_,
2243
+ error: err instanceof Error ? err.message : String(err),
2244
+ });
2232
2245
  }
2233
2246
  };
2234
2247
 
@@ -859,6 +859,20 @@ export function _warnIfWorktreeMissingForTest(
859
859
  return false;
860
860
  }
861
861
 
862
+ export function anchorProcessCwdForAutoResume(basePath: string): boolean {
863
+ try {
864
+ process.chdir(basePath);
865
+ return true;
866
+ } catch (err) {
867
+ logWarning(
868
+ "session",
869
+ `resume cwd anchor failed: ${err instanceof Error ? err.message : String(err)}`,
870
+ { file: "auto.ts", basePath },
871
+ );
872
+ return false;
873
+ }
874
+ }
875
+
862
876
  export function isAutoPaused(): boolean {
863
877
  return s.paused;
864
878
  }
@@ -924,6 +938,14 @@ export function setCurrentDispatchedModelId(model: { provider: string; id: strin
924
938
  s.currentDispatchedModelId = model ? `${model.provider}/${model.id}` : null;
925
939
  }
926
940
 
941
+ /**
942
+ * Update the active unit model after runtime recovery switches models mid-unit.
943
+ * The next session restore path reads this field before dispatching again.
944
+ */
945
+ export function setCurrentUnitModelForRecovery(model: any | null): void {
946
+ s.currentUnitModel = model;
947
+ }
948
+
927
949
  // Tool tracking — delegates to auto-tool-tracking.ts
928
950
  export function markToolStart(toolCallId: string, toolName?: string): void {
929
951
  _markToolStart(toolCallId, s.active, toolName);
@@ -1000,6 +1022,41 @@ export function stopAutoRemote(projectRoot: string): {
1000
1022
  }
1001
1023
  }
1002
1024
 
1025
+ /**
1026
+ * Force-stop a remote auto-mode session before stealing its lock.
1027
+ * The normal stop path stays SIGTERM-only so cooperative sessions can clean up;
1028
+ * this path is only for the explicit "Force start" action.
1029
+ */
1030
+ export function forceStopAutoRemote(projectRoot: string): {
1031
+ found: boolean;
1032
+ pid?: number;
1033
+ error?: string;
1034
+ } {
1035
+ const lock = readCrashLock(projectRoot);
1036
+ if (!lock) return { found: false };
1037
+
1038
+ if (lock.pid === process.pid) {
1039
+ clearLock(projectRoot);
1040
+ return { found: false };
1041
+ }
1042
+
1043
+ if (!isLockProcessAlive(lock)) {
1044
+ clearLock(projectRoot);
1045
+ return { found: false };
1046
+ }
1047
+
1048
+ try {
1049
+ process.kill(lock.pid, "SIGTERM");
1050
+ if (isLockProcessAlive(lock)) {
1051
+ process.kill(lock.pid, "SIGKILL");
1052
+ }
1053
+ clearLock(projectRoot);
1054
+ return { found: true, pid: lock.pid };
1055
+ } catch (err) {
1056
+ return { found: false, error: (err as Error).message };
1057
+ }
1058
+ }
1059
+
1003
1060
  /**
1004
1061
  * Check if a remote auto-mode session is running (from a different process).
1005
1062
  * Reads the crash lock, checks PID liveness, and returns session details.
@@ -1117,6 +1174,10 @@ function pauseAutoUnitIdentityMatches(expected: PauseAutoUnitIdentity | null): b
1117
1174
  s.currentUnit.startedAt === expected.startedAt;
1118
1175
  }
1119
1176
 
1177
+ function shouldPreserveCoordinationForPause(errorContext?: ErrorContext): boolean {
1178
+ return errorContext?.category === "provider" && errorContext.isTransient === true;
1179
+ }
1180
+
1120
1181
  function setLifecycleOutcome(
1121
1182
  ctx: ExtensionContext | undefined,
1122
1183
  input: {
@@ -2077,7 +2138,7 @@ export async function pauseAuto(
2077
2138
  clearLock(lockBase());
2078
2139
  }
2079
2140
 
2080
- if (s.workerId) {
2141
+ if (s.workerId && !shouldPreserveCoordinationForPause(_errorContext)) {
2081
2142
  try {
2082
2143
  if (s.currentMilestoneId && s.milestoneLeaseToken) {
2083
2144
  releaseMilestoneLease(s.workerId, s.currentMilestoneId, s.milestoneLeaseToken);
@@ -2400,7 +2461,7 @@ export async function startAuto(
2400
2461
  const pid = freshStartAssessment.lock?.pid;
2401
2462
  ctx.ui.notify(
2402
2463
  pid
2403
- ? `Another auto-mode session (PID ${pid}) appears to be running.\nStop it with \`kill ${pid}\` before starting a new session.`
2464
+ ? `Another auto-mode session (PID ${pid}) appears to be running.\nRun \`/gsd stop\` for graceful shutdown, or choose "Force start" from \`/gsd auto\` to terminate it.`
2404
2465
  : "Another auto-mode session appears to be running.",
2405
2466
  "error",
2406
2467
  );
@@ -2595,6 +2656,7 @@ export async function startAuto(
2595
2656
  }
2596
2657
  // ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
2597
2658
  buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
2659
+ anchorProcessCwdForAutoResume(s.basePath || base);
2598
2660
  // Rebuild scope now that s.basePath reflects the actual worktree (or project root).
2599
2661
  rebuildScope(s.basePath, s.currentMilestoneId);
2600
2662
  // Ensure the workflow-logger audit log is pinned to the project root