@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.ddc97c10

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 (662) hide show
  1. package/dist/cli-style.d.ts +17 -0
  2. package/dist/cli-style.js +28 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/headless-events.d.ts +4 -2
  5. package/dist/headless-events.js +14 -34
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/models-resolver.d.ts +3 -13
  8. package/dist/models-resolver.js +3 -22
  9. package/dist/resource-loader.js +2 -14
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +5 -4
  12. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  13. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  14. package/dist/resources/extensions/async-jobs/index.js +65 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  16. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  17. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  18. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  19. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  20. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  21. package/dist/resources/extensions/bg-shell/utilities.js +5 -2
  22. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  23. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  24. package/dist/resources/extensions/browser-tools/index.js +69 -12
  25. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  26. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
  27. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  28. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  29. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  30. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  31. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  32. package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
  33. package/dist/resources/extensions/gsd/auto/phases.js +54 -6
  34. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
  39. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  40. package/dist/resources/extensions/gsd/auto-start.js +24 -26
  41. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  42. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  43. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  44. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  45. package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
  46. package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
  47. package/dist/resources/extensions/gsd/auto.js +45 -21
  48. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  49. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  50. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
  51. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  52. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  53. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
  54. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
  55. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  56. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  57. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  58. package/dist/resources/extensions/gsd/captures.js +5 -15
  59. package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
  60. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  61. package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
  62. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  63. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  64. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  65. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  66. package/dist/resources/extensions/gsd/constants.js +0 -2
  67. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  68. package/dist/resources/extensions/gsd/db/engine.js +755 -0
  69. package/dist/resources/extensions/gsd/db/queries.js +398 -0
  70. package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
  71. package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
  72. package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
  73. package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
  74. package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
  75. package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
  76. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  77. package/dist/resources/extensions/gsd/doctor-engine-checks.js +3 -3
  78. package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
  79. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  80. package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
  81. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
  82. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  83. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  84. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  85. package/dist/resources/extensions/gsd/files.js +33 -19
  86. package/dist/resources/extensions/gsd/git-service.js +1 -0
  87. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  88. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  89. package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
  90. package/dist/resources/extensions/gsd/guidance.js +158 -0
  91. package/dist/resources/extensions/gsd/guided-flow.js +57 -8
  92. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  93. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  94. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  95. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  96. package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
  97. package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
  98. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  99. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  100. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  101. package/dist/resources/extensions/gsd/model-router.js +3 -0
  102. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  103. package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
  104. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
  105. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  106. package/dist/resources/extensions/gsd/paths.js +37 -24
  107. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  108. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  109. package/dist/resources/extensions/gsd/preferences.js +14 -0
  110. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  111. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  112. package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
  113. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  114. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  115. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  116. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  117. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  118. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  119. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  120. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  121. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  122. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
  123. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  124. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  125. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  126. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  127. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  128. package/dist/resources/extensions/gsd/publication.js +87 -0
  129. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  130. package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
  131. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  132. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  133. package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
  134. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
  135. package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
  136. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  137. package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
  138. package/dist/resources/extensions/gsd/state.js +6 -20
  139. package/dist/resources/extensions/gsd/status-guards.js +56 -8
  140. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  141. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  142. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  143. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  144. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  145. package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
  146. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  147. package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
  148. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  149. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  150. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  151. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
  152. package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
  153. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  154. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  155. package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
  156. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  157. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  158. package/dist/resources/extensions/gsd/undo.js +8 -7
  159. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  160. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  161. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  162. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  163. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  164. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  165. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  166. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  167. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  168. package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
  169. package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
  170. package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
  171. package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
  172. package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
  173. package/dist/resources/extensions/gsd/worktree-root.js +28 -6
  174. package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
  175. package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
  176. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  177. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  178. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  179. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  180. package/dist/resources/shared/package-manager-detection.js +1 -1
  181. package/dist/resources/shared/package.json +3 -0
  182. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  183. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  184. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  185. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  186. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  187. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  188. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  189. package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
  190. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  191. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  192. package/dist/update-check.d.ts +2 -0
  193. package/dist/update-check.js +24 -1
  194. package/dist/update-cmd.js +20 -3
  195. package/dist/web/standalone/.next/BUILD_ID +1 -1
  196. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  197. package/dist/web/standalone/.next/build-manifest.json +3 -3
  198. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  199. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  200. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  201. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  207. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  208. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  209. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  210. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  211. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  212. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  251. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/index.html +1 -1
  253. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  255. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  256. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  258. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  259. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  260. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  261. package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
  262. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  263. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  266. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  267. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  268. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  269. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  270. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  271. package/dist/web/standalone/package.json +1 -1
  272. package/dist/worktree-cli.js +3 -6
  273. package/dist/worktree-status-banner.js +7 -11
  274. package/package.json +1 -1
  275. package/packages/cloud-mcp-gateway/package.json +2 -2
  276. package/packages/contracts/dist/rpc.d.ts +1 -0
  277. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  278. package/packages/contracts/dist/rpc.js.map +1 -1
  279. package/packages/contracts/dist/workflow.d.ts +4 -0
  280. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  281. package/packages/contracts/dist/workflow.js.map +1 -1
  282. package/packages/contracts/package.json +1 -1
  283. package/packages/daemon/package.json +4 -4
  284. package/packages/gsd-agent-core/package.json +5 -5
  285. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  291. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  292. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  293. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  294. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  296. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  297. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  298. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  299. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  300. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  301. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  302. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  303. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  304. package/packages/gsd-agent-modes/package.json +7 -7
  305. package/packages/mcp-server/dist/cli.js +9 -1
  306. package/packages/mcp-server/dist/cli.js.map +1 -1
  307. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  308. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  309. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  310. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  311. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  312. package/packages/mcp-server/dist/server.js +4 -0
  313. package/packages/mcp-server/dist/server.js.map +1 -1
  314. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  315. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  316. package/packages/mcp-server/dist/workflow-tools.js +145 -59
  317. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  318. package/packages/mcp-server/package.json +5 -4
  319. package/packages/native/package.json +1 -1
  320. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  321. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  322. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  323. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  324. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  325. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  326. package/packages/pi-agent-core/dist/index.js +3 -0
  327. package/packages/pi-agent-core/dist/index.js.map +1 -1
  328. package/packages/pi-agent-core/package.json +1 -1
  329. package/packages/pi-ai/README.md +1 -0
  330. package/packages/pi-ai/dist/index.d.ts +2 -0
  331. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  332. package/packages/pi-ai/dist/index.js +2 -0
  333. package/packages/pi-ai/dist/index.js.map +1 -1
  334. package/packages/pi-ai/dist/models.generated.d.ts +192 -0
  335. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  336. package/packages/pi-ai/dist/models.generated.js +166 -0
  337. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  338. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  339. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  340. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  341. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  342. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  343. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  344. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  345. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  346. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  347. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  348. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  349. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  350. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  351. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  352. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  354. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  355. package/packages/pi-ai/package.json +3 -2
  356. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  357. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  359. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
  362. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  365. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  367. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  369. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  371. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/index.js +1 -1
  373. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  375. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  377. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  378. package/packages/pi-coding-agent/package.json +7 -7
  379. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  380. package/packages/pi-tui/dist/tui.js +9 -0
  381. package/packages/pi-tui/dist/tui.js.map +1 -1
  382. package/packages/pi-tui/package.json +2 -2
  383. package/packages/rpc-client/package.json +2 -2
  384. package/pkg/package.json +1 -1
  385. package/src/resources/GSD-WORKFLOW.md +5 -4
  386. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  387. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  388. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  389. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  390. package/src/resources/extensions/async-jobs/index.ts +79 -0
  391. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  392. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  393. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  394. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  395. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  396. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  397. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  398. package/src/resources/extensions/bg-shell/utilities.ts +5 -2
  399. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  400. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  401. package/src/resources/extensions/browser-tools/index.ts +71 -13
  402. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  403. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  404. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  405. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  406. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
  407. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
  408. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  409. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  410. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  411. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  412. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
  413. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  414. package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
  415. package/src/resources/extensions/gsd/auto/phases.ts +74 -26
  416. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  417. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  418. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  419. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  420. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
  421. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  422. package/src/resources/extensions/gsd/auto-start.ts +24 -29
  423. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  424. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  425. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  426. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  427. package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
  428. package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
  429. package/src/resources/extensions/gsd/auto.ts +64 -25
  430. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  431. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  432. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
  433. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  434. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  435. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
  436. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
  437. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  438. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  439. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  440. package/src/resources/extensions/gsd/captures.ts +5 -16
  441. package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
  442. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  443. package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
  444. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  445. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  446. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  447. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  448. package/src/resources/extensions/gsd/constants.ts +0 -3
  449. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  450. package/src/resources/extensions/gsd/db/engine.ts +809 -0
  451. package/src/resources/extensions/gsd/db/queries.ts +490 -0
  452. package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
  453. package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
  454. package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
  455. package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
  456. package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
  457. package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
  458. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  459. package/src/resources/extensions/gsd/doctor-engine-checks.ts +3 -3
  460. package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
  461. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  462. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
  463. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
  464. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  465. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  466. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  467. package/src/resources/extensions/gsd/files.ts +33 -12
  468. package/src/resources/extensions/gsd/git-service.ts +1 -0
  469. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  470. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  471. package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
  472. package/src/resources/extensions/gsd/guidance.ts +217 -0
  473. package/src/resources/extensions/gsd/guided-flow.ts +71 -31
  474. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  475. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  476. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  477. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  478. package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
  479. package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
  480. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  481. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  482. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  483. package/src/resources/extensions/gsd/model-router.ts +3 -0
  484. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  485. package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
  486. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
  487. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  488. package/src/resources/extensions/gsd/paths.ts +42 -22
  489. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  490. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  491. package/src/resources/extensions/gsd/preferences.ts +18 -0
  492. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  493. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  494. package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
  495. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  496. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  497. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  498. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  499. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  500. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  501. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  502. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  503. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  504. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
  505. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  506. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  507. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  508. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  509. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  510. package/src/resources/extensions/gsd/publication.ts +122 -0
  511. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  512. package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
  513. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  514. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  515. package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
  516. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
  517. package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
  518. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  519. package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
  520. package/src/resources/extensions/gsd/state.ts +9 -21
  521. package/src/resources/extensions/gsd/status-guards.ts +59 -8
  522. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  523. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
  524. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
  525. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
  526. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
  527. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
  528. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  529. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
  530. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
  531. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  532. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  533. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  534. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  535. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  536. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
  537. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  538. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  539. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  540. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  541. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  542. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  543. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  544. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  545. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  546. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  547. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  548. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
  549. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  550. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  551. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  552. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
  553. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  554. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  555. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  556. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
  557. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
  558. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
  559. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
  560. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  561. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  562. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  563. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
  564. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  565. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  566. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  567. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  568. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  569. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
  570. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  571. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  572. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  573. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  574. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  575. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  576. package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
  577. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
  578. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  579. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
  580. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
  581. package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
  582. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
  583. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
  584. package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
  585. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  586. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  587. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  588. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  589. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  590. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  591. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  592. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  593. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  594. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  595. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  596. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  597. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  598. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  599. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
  600. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
  601. package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
  602. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
  603. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
  604. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
  605. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
  606. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  607. package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
  608. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  609. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  610. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  611. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  612. package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
  613. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
  614. package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
  615. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  616. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  617. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  618. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
  619. package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
  620. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  621. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  622. package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
  623. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  624. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  625. package/src/resources/extensions/gsd/undo.ts +9 -8
  626. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  627. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  628. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  629. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  630. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  631. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  632. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  633. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  634. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  635. package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
  636. package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
  637. package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
  638. package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
  639. package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
  640. package/src/resources/extensions/gsd/worktree-root.ts +29 -6
  641. package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
  642. package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
  643. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  644. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  645. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  646. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  647. package/src/resources/shared/package-manager-detection.ts +1 -1
  648. package/src/resources/shared/package.json +3 -0
  649. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  650. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  651. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  652. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  653. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  654. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  655. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  656. package/src/resources/skills/gsd-browser/SKILL.md +1 -1
  657. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  658. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  659. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  660. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  661. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_buildManifest.js +0 -0
  662. /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_ssgManifest.js +0 -0
@@ -0,0 +1,158 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Guidance module — the single catalog mapping typed findings
3
+ // (Recovery kinds, milestone blocker kinds, doctor issue codes, crash unit
4
+ // classes) to user-facing remediation: what happened and what to do next.
5
+ //
6
+ // Emit sites pass the typed finding; phrasing, command names, and step
7
+ // ordering live here. A missing catalog row is a visible gap, not a silent
8
+ // omission scattered across call sites.
9
+ /** Flatten guidance into a notification / pause-banner string. */
10
+ export function formatGuidance(guidance) {
11
+ if (guidance.steps.length === 0)
12
+ return guidance.summary;
13
+ const numbered = guidance.steps.map((step, index) => `${index + 1}. ${step}`).join("\n");
14
+ return `${guidance.summary}\n\n${numbered}`;
15
+ }
16
+ const RECOVERY_REMEDIATION = {
17
+ "tool-schema": "Fix the Unit Tool Contract or tool schema before retrying.",
18
+ "tool-contract": "Fix the Unit Tool Contract or prompt so the Unit is only asked to use tools owned by its phase.",
19
+ "tool-unavailable": "The tool surface had not finished registering when the Unit called it (workflow MCP startup race). Retry after the surface is ready; escalate if the tool never appears.",
20
+ "deterministic-policy": "Resolve the policy blocker; retrying the same Unit will repeat the failure.",
21
+ "lifecycle-progression": "Route to the required owning Unit or restore the missing artifact before advancing lifecycle state.",
22
+ "stale-worker": "Run `/gsd doctor` to detect and clear the stale worker or lock, then run `/gsd auto` to resume.",
23
+ "worktree-invalid": "Run `/gsd doctor` to diagnose the milestone worktree (`gsd worktree list` shows its state). Repair it, or merge salvageable work with `gsd worktree merge <name>` before recreating — recreating discards uncommitted work.",
24
+ "verification-drift": "Run `/gsd status` to see the verification finding, fix or re-run the verification, then run `/gsd auto` to resume. `/gsd doctor` can repair stale state files.",
25
+ "reconciliation-drift": "Run `/gsd doctor` to surface the persistent or repair-failed drift kinds, apply its fixes, then run `/gsd auto` to resume.",
26
+ "illegal-transition": "A derived Phase edge rejected by the Phase Transition Invariant survived reconciliation; inspect deriveState and the State Reconciliation Module before resuming.",
27
+ "runtime-unknown": "Inspect the runtime error and add a dedicated classification if it is repeatable.",
28
+ "provider-transient": "Retry after the provider/network condition clears.",
29
+ "provider-permanent": "Inspect provider credentials, model entitlement, or request shape.",
30
+ };
31
+ export function recoveryRemediation(key) {
32
+ return RECOVERY_REMEDIATION[key];
33
+ }
34
+ // ─── Milestone validation blockers ──────────────────────────────────────
35
+ // NOTE: the first line of each blocker is load-bearing — validation-block-guard
36
+ // matches /milestone validation returned needs-(?:attention|remediation)/i.
37
+ // Keep that phrase intact when editing.
38
+ export function needsAttentionBlockerGuidance(milestoneId) {
39
+ return [
40
+ `Milestone ${milestoneId} is blocked because milestone validation returned needs-attention.`,
41
+ `Fix options:`,
42
+ `1. Review the validation details: \`/gsd status\``,
43
+ `2. If you fixed the missing evidence or issue, re-run milestone validation: \`/gsd validate-milestone\``,
44
+ `3. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
45
+ `4. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
46
+ `After validation or override passes, run \`/gsd auto\` to complete and merge the milestone.`,
47
+ ].join("\n");
48
+ }
49
+ export function needsRemediationBlockerGuidance(milestoneId) {
50
+ return [
51
+ `Milestone ${milestoneId} is blocked because milestone validation returned needs-remediation, but all slices are complete.`,
52
+ `Fix options:`,
53
+ `1. Run \`/gsd dispatch reassess\` to add remediation slices, then run \`/gsd auto\``,
54
+ `2. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
55
+ `3. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
56
+ ].join("\n");
57
+ }
58
+ // ─── Milestone closeout UAT sign-off blockers ───────────────────────────
59
+ // The first sentence is the blocker finding; the numbered steps are the
60
+ // resolution path. `verdict` is the recorded non-PASS verdict, or undefined
61
+ // when no verdict has been recorded at all.
62
+ export function uatSignoffBlockerGuidance(milestoneId, sliceId, verdict) {
63
+ const finding = verdict === undefined
64
+ ? `missing UAT PASS verdict for ${sliceId}`
65
+ : `UAT verdict for ${sliceId} is "${verdict}"`;
66
+ const sliceSpecificRerunStep = `If ${sliceId} is not the most recently completed slice, type a chat request to re-run UAT for ${sliceId}; run-uat will record the verdict through \`gsd_uat_result_save\`.`;
67
+ const steps = verdict === undefined
68
+ ? [
69
+ `1. Run UAT for the most recently completed slice to record a verdict: \`/gsd dispatch uat\``,
70
+ `2. ${sliceSpecificRerunStep}`,
71
+ `3. Review the UAT criteria and progress: \`/gsd status\``,
72
+ `4. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
73
+ ]
74
+ : [
75
+ `1. Review the failing UAT findings: \`/gsd status\` (the ${sliceId} ASSESSMENT records what failed)`,
76
+ `2. Fix the issue, then re-run UAT for the most recently completed slice to record a fresh verdict: \`/gsd dispatch uat\``,
77
+ `3. ${sliceSpecificRerunStep}`,
78
+ `4. If the fix needs new implementation work, add remediation slices: \`/gsd dispatch reassess\``,
79
+ `5. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
80
+ ];
81
+ return [
82
+ `Cannot complete milestone ${milestoneId}: ${finding}. Manual UAT sign-off (PASS) is required before milestone closure.`,
83
+ `Fix options:`,
84
+ ...steps,
85
+ ].join("\n");
86
+ }
87
+ // ─── Worktree isolation degradation ─────────────────────────────────────
88
+ // The first sentence of each notice is load-bearing for log matching and
89
+ // tests — keep it intact and append guidance after it.
90
+ function restoreIsolationHint(milestoneId) {
91
+ return `To restore isolation: close any processes using the old worktree, merge salvageable work with \`/gsd worktree merge ${milestoneId}\` or remove the stale worktree with \`/gsd worktree remove ${milestoneId}\`, then run \`/gsd doctor fix\`.`;
92
+ }
93
+ export function worktreeCreationFailedGuidance(milestoneId, error) {
94
+ return [
95
+ `Auto-worktree creation for ${milestoneId} failed: ${error}. Continuing in project root.`,
96
+ `Worktree isolation is degraded for this session.`,
97
+ restoreIsolationHint(milestoneId),
98
+ ].join("\n");
99
+ }
100
+ export function isolationDegradedFallbackGuidance(milestoneId) {
101
+ return [
102
+ `Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`,
103
+ `Work continues safely on the milestone branch in the project root.`,
104
+ restoreIsolationHint(milestoneId),
105
+ ].join("\n");
106
+ }
107
+ /** Hard entry blockers from auto-start: bootstrap stopped, user must act. */
108
+ export function milestoneEntryBlockedGuidance(milestoneId, reason) {
109
+ const finding = reason === "creation-failed"
110
+ ? `worktree/branch creation failed. Isolation is degraded.`
111
+ : `isolation is degraded from a prior worktree failure.`;
112
+ return [
113
+ `Cannot enter milestone ${milestoneId}: ${finding}`,
114
+ restoreIsolationHint(milestoneId),
115
+ `Then run \`/gsd auto\` to retry.`,
116
+ ].join("\n");
117
+ }
118
+ // ─── Crash recovery resume hints ────────────────────────────────────────
119
+ /** Resume hint for an interrupted auto-mode unit, by unit class. */
120
+ export function crashResumeHint(unitType, unitId) {
121
+ if (unitType === "starting" && unitId === "bootstrap") {
122
+ return `No work was lost. Run /gsd auto to restart.`;
123
+ }
124
+ if (unitType.includes("research") || unitType.includes("plan")) {
125
+ return `The ${unitType} unit may be incomplete. Run /gsd auto to re-run it.`;
126
+ }
127
+ if (unitType.includes("execute")) {
128
+ return `Task execution was interrupted. Run /gsd auto to resume — completed work is preserved.`;
129
+ }
130
+ if (unitType.includes("complete")) {
131
+ return `Slice/milestone completion was interrupted. Run /gsd auto to finish.`;
132
+ }
133
+ return undefined;
134
+ }
135
+ // ─── Doctor issue fix hints ─────────────────────────────────────────────
136
+ // Partial by design: codes without a row render no hint. Add rows here as
137
+ // guidance is authored — the gap is visible in one place.
138
+ const DOCTOR_FIX_HINTS = {
139
+ db_unavailable: "The workflow database could not be opened — state derivation is degraded. Restart the session; if it persists, run `/gsd doctor` from the project root.",
140
+ stale_crash_lock: "Run `/gsd doctor` to clear the stale lock, then `/gsd auto` to resume.",
141
+ stale_parallel_session: "Run `/gsd doctor` to clear the stale session registration.",
142
+ unresolved_git_conflicts: "Resolve the conflict markers, commit, then re-run `/gsd auto`.",
143
+ conflict_markers_in_tracked_files: "Search the listed files for `<<<<<<<` markers, resolve, and commit.",
144
+ worktree_dirty: "Commit or merge the worktree's changes (`gsd worktree merge <name>`) before removing it.",
145
+ worktree_branch_merged: "The branch is merged — remove the worktree to reclaim space.",
146
+ orphaned_auto_worktree: "Run `/gsd doctor` to fix, or merge salvageable work with `gsd worktree merge <name>`.",
147
+ gitignore_missing_patterns: "Run `/gsd doctor` to append the missing .gitignore patterns.",
148
+ invalid_preferences: "Edit .gsd/PREFERENCES.md to fix the invalid field, then re-run the command.",
149
+ provider_key_missing: "Add the provider API key to your environment or provider config, then retry.",
150
+ provider_key_backedoff: "The key is cooling down after repeated failures — wait, or switch the phase model in .gsd/PREFERENCES.md.",
151
+ state_file_stale: "Run `/gsd doctor` to rebuild the projection from the database.",
152
+ state_file_missing: "Run `/gsd doctor` to rebuild the projection from the database.",
153
+ projection_drift: "Run `/gsd doctor` to rebuild markdown projections from the database (DB is the source of truth).",
154
+ uat_retry_exhausted: "Review the failing UAT criteria via `/gsd status`, fix the issue, then re-run `/gsd auto`.",
155
+ };
156
+ export function doctorFixHint(code) {
157
+ return DOCTOR_FIX_HINTS[code];
158
+ }
@@ -44,13 +44,14 @@ import { buildCloseoutMenuActions, buildIdleMenuSummary, getPrimaryCloseoutRecom
44
44
  import { buildRequirementsBacklogDiscussContext, countUnmappedActiveRequirements, showRequirementsBacklogReview, } from "./requirements-backlog.js";
45
45
  import { selectAndApplyModel } from "./auto-model-selection.js";
46
46
  import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
47
- import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForGuidedUnit, supportsStructuredQuestions, } from "./workflow-mcp.js";
47
+ import { supportsStructuredQuestions } from "./workflow-mcp.js";
48
+ import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
48
49
  import { runPreparation, formatCodebaseBrief, formatPriorContextBrief, } from "./preparation.js";
49
50
  import { verifyExpectedArtifact } from "./auto-recovery.js";
50
- import { getPendingGate } from "./bootstrap/write-gate.js";
51
+ import { clearPendingGate, extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
51
52
  import { _getPendingAutoStart, deletePendingAutoStart, hasPendingAutoStart, setPendingAutoStart, } from "./pending-auto-start.js";
52
53
  import { clearGuidedUnitContext, setGuidedUnitContext } from "./guided-unit-context.js";
53
- import { scheduleAutoStartAfterIdle } from "./discussion-handoff.js";
54
+ import { checkAutoStartAfterDiscuss, scheduleAutoStartAfterIdle } from "./discussion-handoff.js";
54
55
  export { maybeHandleEmptyIntentTurn, maybeHandleReadyPhraseWithoutFiles, resetEmptyTurnCounter, } from "./guided-unit-completion.js";
55
56
  export { _getPendingAutoStart, clearPendingAutoStart, getDiscussionMilestoneId, setPendingAutoStart, } from "./pending-auto-start.js";
56
57
  export { checkAutoStartAfterDiscuss } from "./discussion-handoff.js";
@@ -382,7 +383,8 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType,
382
383
  const projectRoot = resolveGuidedDispatchProjectRoot(resolvedOptions.basePath);
383
384
  const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
384
385
  const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
385
- const getTransportSupportError = resolvedOptions.deps?.getTransportSupportError ?? getWorkflowTransportSupportError;
386
+ const getDispatchReadinessError = resolvedOptions.deps?.getDispatchReadinessError
387
+ ?? getUnitWorkflowDispatchReadinessError;
386
388
  // Route through the dynamic routing pipeline (complexity classification,
387
389
  // tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
388
390
  if (ctx && unitType) {
@@ -396,7 +398,8 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType,
396
398
  routing: result.routing,
397
399
  });
398
400
  }
399
- const compatibilityError = getTransportSupportError(result.appliedModel?.provider ?? ctx.model?.provider, getRequiredWorkflowToolsForGuidedUnit(unitType), {
401
+ const compatibilityError = getDispatchReadinessError({
402
+ provider: result.appliedModel?.provider ?? ctx.model?.provider,
400
403
  projectRoot,
401
404
  surface: "guided flow",
402
405
  unitType,
@@ -1188,6 +1191,27 @@ function selfHealRuntimeRecords(basePath, ctx) {
1188
1191
  return { cleared: 0 };
1189
1192
  }
1190
1193
  }
1194
+ /**
1195
+ * True when an agent turn is currently streaming or a dispatched message is
1196
+ * still queued waiting to trigger one. Used by the pending-auto-start stale
1197
+ * check: a live discuss turn can run for minutes before writing its first
1198
+ * artifact, and deleting its entry as "stale" re-dispatches the workflow —
1199
+ * resetting the interview and producing a duplicate completion turn.
1200
+ */
1201
+ function isAgentTurnInFlight(ctx) {
1202
+ try {
1203
+ if (typeof ctx.isIdle === "function" && !ctx.isIdle())
1204
+ return true;
1205
+ if (typeof ctx.hasPendingMessages === "function" && ctx.hasPendingMessages())
1206
+ return true;
1207
+ }
1208
+ catch {
1209
+ // assertActive() throws on a stale runner context; fall through to
1210
+ // artifact/age staleness signals.
1211
+ logWarning("guided", "isAgentTurnInFlight: ctx method threw (stale runner); assuming no turn in flight");
1212
+ }
1213
+ return false;
1214
+ }
1191
1215
  // ─── Milestone Actions Submenu ──────────────────────────────────────────────
1192
1216
  /**
1193
1217
  * Shows a submenu with Park / Discard / Skip / Back options for the active milestone.
@@ -1479,12 +1503,18 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1479
1503
  // and fires another dispatchWorkflow, resetting the conversation mid-interview.
1480
1504
  if (hasPendingAutoStart(basePath)) {
1481
1505
  // #3274: If /clear interrupted the discussion, the pending entry is stale.
1482
- // Detect staleness: no manifest, no milestone CONTEXT artifact, AND entry is older than
1483
- // 30s (avoids race between .set() and LLM writing first artifact).
1506
+ // Detect staleness: no manifest, no milestone CONTEXT/CONTEXT-DRAFT artifact,
1507
+ // the entry is older than 30s (avoids race between .set() and LLM writing the
1508
+ // first artifact), AND no agent turn is in flight. A dispatched discuss turn
1509
+ // can think for well over 30s before its first question round writes any
1510
+ // artifact; deleting the entry while that turn is live re-dispatches the
1511
+ // workflow, which both resets the interview and queues a duplicate turn that
1512
+ // replays the final "context written" message after the real one.
1484
1513
  const entry = _getPendingAutoStart(basePath);
1485
1514
  const ageMs = Date.now() - (entry.createdAt || 0);
1486
1515
  const manifestExists = existsSync(join(gsdRoot(basePath), "DISCUSSION-MANIFEST.json"));
1487
1516
  const milestoneHasContext = !!resolveMilestoneFile(basePath, entry.milestoneId, "CONTEXT");
1517
+ const milestoneHasDraft = !!resolveMilestoneFile(basePath, entry.milestoneId, "CONTEXT-DRAFT");
1488
1518
  const milestoneHasRoadmap = !!resolveMilestoneFile(basePath, entry.milestoneId, "ROADMAP");
1489
1519
  const milestoneRow = isDbAvailable() ? getMilestone(entry.milestoneId) : null;
1490
1520
  const discussPlanComplete = milestoneHasRoadmap && !!milestoneRow && milestoneRow.status !== "queued";
@@ -1493,11 +1523,30 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1493
1523
  // Clear stale in-memory guard and continue through normal active-milestone routing.
1494
1524
  deletePendingAutoStart(basePath);
1495
1525
  }
1496
- else if (!manifestExists && !milestoneHasContext && ageMs > 30_000) {
1526
+ else if (!manifestExists &&
1527
+ !milestoneHasContext &&
1528
+ !milestoneHasDraft &&
1529
+ ageMs > 30_000 &&
1530
+ !isAgentTurnInFlight(ctx)) {
1497
1531
  // Stale entry from an interrupted discussion — clear and continue
1498
1532
  deletePendingAutoStart(basePath);
1499
1533
  }
1500
1534
  else {
1535
+ if (milestoneHasContext && !isAgentTurnInFlight(ctx)) {
1536
+ // The discussion already produced CONTEXT but the agent_end handoff
1537
+ // never consumed the entry — e.g. an external-engine post-hoc gate
1538
+ // re-arm wiped the depth verification after the save (write-gate
1539
+ // two-process sync). CONTEXT can only be written through a verified
1540
+ // depth gate, so a gate still pending for this milestone is stale:
1541
+ // clear it and re-run the handoff instead of dead-ending.
1542
+ const gateBasePath = entry.scope.workspace.projectRoot;
1543
+ const pendingGateId = getPendingGate(gateBasePath);
1544
+ if (pendingGateId && extractDepthVerificationMilestoneId(pendingGateId) === entry.milestoneId) {
1545
+ clearPendingGate(gateBasePath);
1546
+ }
1547
+ if (checkAutoStartAfterDiscuss(basePath))
1548
+ return;
1549
+ }
1501
1550
  ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
1502
1551
  return;
1503
1552
  }
@@ -717,6 +717,16 @@ export function detectStaleRenders(basePath) {
717
717
  }
718
718
  return stale;
719
719
  }
720
+ /**
721
+ * Render-verification helper: does the rendered ROADMAP markdown mark a slice
722
+ * as done? Used by completion code to verify/repair the *projection* after a
723
+ * DB write — never as a source of truth for dispatch or completion decisions
724
+ * (ADR-017). Lives here so decision-path modules need not import
725
+ * parsers-legacy directly.
726
+ */
727
+ export function roadmapRenderMarksSliceDone(roadmapContent, sliceId) {
728
+ return parseRoadmap(roadmapContent).slices.some((slice) => slice.id === sliceId && slice.done);
729
+ }
720
730
  export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanData) {
721
731
  const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
722
732
  ?? join(gsdRoot(basePath), "milestones", milestoneId, "slices", sliceId);
@@ -1,6 +1,7 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { resolve } from "node:path";
4
+ import { isGsdBrowserMcpServerConfig } from "../shared/gsd-browser-cli.js";
4
5
  import { toMcpWildcardToolName } from "./mcp-tool-name.js";
5
6
  import { resolveModelMcpConfig } from "./preferences-mcp.js";
6
7
  function isRecord(value) {
@@ -63,29 +64,11 @@ function isWorkflowMcpServerConfig(config) {
63
64
  const args = Array.isArray(config.args) ? config.args.filter((arg) => typeof arg === "string") : [];
64
65
  return args.some((arg) => arg.includes("gsd-mcp-server") || arg.includes("packages/mcp-server"));
65
66
  }
66
- function isBrowserMcpServerConfig(config) {
67
- if (!isRecord(config))
68
- return false;
69
- const command = typeof config.command === "string" ? config.command : "";
70
- if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
71
- return true;
72
- }
73
- const env = config.env;
74
- if (isRecord(env)) {
75
- if (typeof env.GSD_BROWSER_CLI_PATH === "string"
76
- || typeof env.GSD_BROWSER_BIN_PATH === "string"
77
- || typeof env.GSD_BROWSER_MCP_COMMAND === "string") {
78
- return true;
79
- }
80
- }
81
- const args = Array.isArray(config.args) ? config.args.filter((arg) => typeof arg === "string") : [];
82
- return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
83
- }
84
67
  export function discoverWorkflowMcpServerName(projectDir) {
85
68
  return discoverMcpServers(projectDir).find((server) => isWorkflowMcpServerConfig(server.config))?.name;
86
69
  }
87
70
  export function discoverBrowserMcpServerName(projectDir) {
88
- return discoverMcpServers(projectDir).find((server) => isBrowserMcpServerConfig(server.config))?.name;
71
+ return discoverMcpServers(projectDir).find((server) => isGsdBrowserMcpServerConfig(server.config))?.name;
89
72
  }
90
73
  export function discoverMcpServerNames(projectDir) {
91
74
  return discoverMcpServers(projectDir).map((server) => server.name);
@@ -1,20 +1,12 @@
1
1
  // Project/App: gsd-pi
2
- // File Purpose: Shared parsing and formatting helpers for MCP-scoped tool names.
2
+ // File Purpose: GSD-facing face over the shared @gsd/pi-ai MCP tool-name helpers.
3
+ import { parseMcpToolName as parsePiAiMcpToolName, stripMcpToolPrefix } from "@gsd/pi-ai";
3
4
  const MCP_TOOL_PREFIX = "mcp__";
4
5
  export function parseMcpToolName(toolName) {
5
- if (!toolName.startsWith(MCP_TOOL_PREFIX))
6
- return null;
7
- const toolSeparator = toolName.indexOf("__", MCP_TOOL_PREFIX.length);
8
- if (toolSeparator < 0)
9
- return null;
10
- return {
11
- serverName: toolName.slice(MCP_TOOL_PREFIX.length, toolSeparator),
12
- toolName: toolName.slice(toolSeparator + 2),
13
- };
14
- }
15
- export function stripMcpToolPrefix(toolName) {
16
- return parseMcpToolName(toolName)?.toolName ?? toolName;
6
+ const parsed = parsePiAiMcpToolName(toolName);
7
+ return parsed ? { serverName: parsed.server, toolName: parsed.tool } : null;
17
8
  }
9
+ export { stripMcpToolPrefix };
18
10
  export function toMcpToolName(serverName, toolName) {
19
11
  return `${MCP_TOOL_PREFIX}${serverName}__${toolName}`;
20
12
  }
@@ -211,7 +211,7 @@ export function reportConsolidationGaps(basePath) {
211
211
  const report = scanConsolidationGaps(basePath);
212
212
  if (report.totalGaps === 0)
213
213
  return report;
214
- appendNotification(report.summary, "warning", "workflow-logger");
214
+ appendNotification(report.summary, "warning", "workflow-logger", { kind: "memory-consolidation" });
215
215
  logWarning("memory-consolidation", report.summary);
216
216
  return report;
217
217
  }
@@ -8,6 +8,7 @@ import { readCrashLock, isLockProcessAlive } from "../crash-recovery.js";
8
8
  import { closeWorkflowDatabase } from "../db-workspace.js";
9
9
  import { readPausedSessionMetadata } from "../interrupted-session.js";
10
10
  import { gsdRoot } from "../paths.js";
11
+ import { canonicalWorktreesDir } from "../worktree-placement.js";
11
12
  export class MigrationBlockedError extends Error {
12
13
  constructor(message) {
13
14
  super(message);
@@ -78,16 +79,26 @@ export function assertMigrationHasSlices(preview) {
78
79
  throw new MigrationBlockedError("Migration blocked - the legacy project would produce zero slices. Add a ROADMAP.md or phases/ content before migrating.");
79
80
  }
80
81
  function hasWorktreeState(targetRoot) {
81
- const worktreesDir = join(gsdRoot(targetRoot), "worktrees");
82
- if (!existsSync(worktreesDir))
83
- return false;
84
- try {
85
- return readdirSync(worktreesDir, { withFileTypes: true })
86
- .some((entry) => entry.isDirectory() || entry.isFile());
87
- }
88
- catch {
89
- return true;
82
+ // Legacy container is probed via gsdRoot() (symlink-resolved) on purpose —
83
+ // migration targets may have .gsd in the external-state layout.
84
+ const containers = [
85
+ canonicalWorktreesDir(targetRoot),
86
+ join(gsdRoot(targetRoot), "worktrees"),
87
+ ];
88
+ for (const worktreesDir of containers) {
89
+ if (!existsSync(worktreesDir))
90
+ continue;
91
+ try {
92
+ if (readdirSync(worktreesDir, { withFileTypes: true })
93
+ .some((entry) => entry.isDirectory() || entry.isFile())) {
94
+ return true;
95
+ }
96
+ }
97
+ catch {
98
+ return true;
99
+ }
90
100
  }
101
+ return false;
91
102
  }
92
103
  export async function assertMigrationTargetAvailable(targetRoot) {
93
104
  const targetGsdPath = gsdRoot(targetRoot);
@@ -8,7 +8,13 @@ function zeroCounts() {
8
8
  return { milestones: 0, slices: 0, tasks: 0 };
9
9
  }
10
10
  function emptyScan() {
11
- return { counts: zeroCounts(), milestones: new Set(), slices: new Set(), tasks: new Set() };
11
+ return {
12
+ counts: zeroCounts(),
13
+ milestones: new Set(),
14
+ slices: new Set(),
15
+ tasks: new Set(),
16
+ milestonesWithoutRoadmap: new Set(),
17
+ };
12
18
  }
13
19
  function sameCounts(a, b) {
14
20
  return a.milestones === b.milestones && a.slices === b.slices && a.tasks === b.tasks;
@@ -65,8 +71,10 @@ export function scanMarkdownHierarchy(basePath) {
65
71
  scan.counts.milestones++;
66
72
  scan.milestones.add(milestoneId);
67
73
  const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
68
- if (!roadmapPath || !existsSync(roadmapPath))
74
+ if (!roadmapPath || !existsSync(roadmapPath)) {
75
+ scan.milestonesWithoutRoadmap.add(milestoneId);
69
76
  continue;
77
+ }
70
78
  const roadmap = parseRoadmap(readFileSync(roadmapPath, "utf-8"));
71
79
  scan.counts.slices += roadmap.slices.length;
72
80
  for (const slice of roadmap.slices) {
@@ -112,7 +120,6 @@ export function countDbHierarchy() {
112
120
  }
113
121
  export async function checkMarkdownHierarchyAgainstDb(basePath) {
114
122
  const markdownScan = scanMarkdownHierarchy(basePath);
115
- const markdown = markdownScan.counts;
116
123
  // Always open the DB before deciding. An empty markdown tree does NOT imply
117
124
  // an empty project — the DB may hold authoritative rows whose markdown was
118
125
  // lost, which is itself recoverable drift. The previous early return here
@@ -128,6 +135,20 @@ export async function checkMarkdownHierarchyAgainstDb(basePath) {
128
135
  refreshWorkflowDatabaseFromDisk();
129
136
  const dbScan = scanDbHierarchy();
130
137
  const beforeDb = dbScan.counts;
138
+ // Discussion-phase scratch: a milestone dir with no ROADMAP and no DB row is
139
+ // a pre-registration discussion artifact (CONTEXT/CONTEXT-DRAFT only — the
140
+ // queued DB row is inserted only at discussion handoff). Treating it as
141
+ // drift would warn on every live discussion and recommend
142
+ // `/gsd recover --confirm`, an import that materializes abandoned-discussion
143
+ // dirs as ghost active milestones. Exclude such dirs from this comparison
144
+ // only; recover preflights use the raw scans and still see them.
145
+ for (const id of markdownScan.milestonesWithoutRoadmap) {
146
+ if (dbScan.milestones.has(id))
147
+ continue;
148
+ markdownScan.milestones.delete(id);
149
+ markdownScan.counts.milestones--;
150
+ }
151
+ const markdown = markdownScan.counts;
131
152
  const markdownEmpty = sameCounts(markdown, zeroCounts());
132
153
  const dbEmpty = sameCounts(beforeDb, zeroCounts());
133
154
  // Genuinely empty project: nothing on disk, nothing in the DB.
@@ -4,13 +4,16 @@
4
4
  // - preflight: dispatch git clean before complete-milestone agent (auto-dispatch)
5
5
  // - postUnit: git commit, artifact verify, DB settle, then GitHub finalize
6
6
  // - recovery: DB repair from artifacts, then GitHub finalize
7
+ import { existsSync } from "node:fs";
7
8
  import { loadFile } from "./files.js";
8
- import { parseRoadmap } from "./parsers-legacy.js";
9
9
  import { resolveMilestoneFile } from "./paths.js";
10
- import { getMilestone, getMilestoneSlices, isDbAvailable } from "./gsd-db.js";
10
+ import { getMilestone, getClosedSliceIds, getLatestAssessmentByScope, getMilestoneSlices, isDbAvailable, } from "./gsd-db.js";
11
11
  import { isClosedStatus } from "./status-guards.js";
12
+ import { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
13
+ import { handleCompleteMilestone } from "./tools/complete-milestone.js";
12
14
  import { runSafely } from "./auto-utils.js";
13
15
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
16
+ import { uatSignoffBlockerGuidance } from "./guidance.js";
14
17
  import { logWarning } from "./workflow-logger.js";
15
18
  import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
16
19
  import { buildCompleteMilestonePrompt } from "./auto-prompts.js";
@@ -19,6 +22,60 @@ import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
19
22
  import { commitPendingMilestoneCloseoutChanges, findMissingSummaries, isVerificationNotApplicable, readUatGateVerdict, } from "./auto-dispatch.js";
20
23
  const COMPLETE_MILESTONE_DB_SETTLE_MS = 1500;
21
24
  const COMPLETE_MILESTONE_DB_SETTLE_POLL_MS = 100;
25
+ /**
26
+ * True when a milestone is terminal for git cleanup (orphaned worktrees, stale branches).
27
+ * DB-authoritative (ADR-017): closed status, or validation-pass with all slices closed.
28
+ * When the DB is unavailable we cannot make this decision and conservatively
29
+ * return false so callers leave the worktree/branch alone instead of cleaning
30
+ * up based on parsed projections.
31
+ */
32
+ export async function isCompletedMilestoneTerminal(_basePath, milestoneId) {
33
+ if (!isDbAvailable())
34
+ return false;
35
+ const milestone = getMilestone(milestoneId);
36
+ if (!milestone)
37
+ return false;
38
+ if (isClosedStatus(milestone.status)) {
39
+ return true;
40
+ }
41
+ const validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
42
+ if (validation?.status !== "pass") {
43
+ return false;
44
+ }
45
+ const slices = getMilestoneSlices(milestoneId);
46
+ if (slices.length === 0)
47
+ return false;
48
+ return slices.every((slice) => isClosedStatus(slice.status));
49
+ }
50
+ /** Write a missing milestone SUMMARY projection when canonical DB closeout already settled. */
51
+ export async function repairMissingMilestoneSummaryProjection(basePath, milestoneId) {
52
+ const milestone = getMilestone(milestoneId);
53
+ if (!milestone) {
54
+ return { ok: false, error: `milestone not found: ${milestoneId}` };
55
+ }
56
+ const artifactBasePath = resolveCanonicalMilestoneRoot(basePath, milestoneId);
57
+ const summaryPath = resolveExpectedArtifactPath("complete-milestone", milestoneId, artifactBasePath);
58
+ if (summaryPath && existsSync(summaryPath)) {
59
+ return { ok: true };
60
+ }
61
+ const result = await handleCompleteMilestone({
62
+ milestoneId,
63
+ title: milestone.title,
64
+ oneLiner: "Canonical closeout completed; summary projection repaired automatically.",
65
+ narrative: "The workflow database recorded this milestone as complete, but the milestone SUMMARY artifact was missing on disk. " +
66
+ "Dispatch policy repaired the projection so closeout proof and cleanup can proceed.",
67
+ verificationPassed: true,
68
+ triggerReason: "closeout-projection-repair",
69
+ }, basePath);
70
+ if ("error" in result) {
71
+ return { ok: false, error: result.error };
72
+ }
73
+ const writtenSummaryPath = result.summaryPath;
74
+ if (result.stale || !writtenSummaryPath || !existsSync(writtenSummaryPath)) {
75
+ return { ok: false, error: "milestone SUMMARY projection write failed" };
76
+ }
77
+ return { ok: true };
78
+ }
22
79
  /**
23
80
  * True when the milestone is closed in the DB and the completion summary artifact exists.
24
81
  * Polls briefly so post-unit verification can observe the tool's DB write.
@@ -65,38 +122,42 @@ export async function evaluateCompleteMilestoneDispatch(ctx) {
65
122
  if (isDbAvailable()) {
66
123
  const milestone = getMilestone(mid);
67
124
  if (milestone && isClosedStatus(milestone.status)) {
68
- return { action: "skip" };
125
+ const artifactBasePath = resolveCanonicalMilestoneRoot(basePath, mid);
126
+ const summaryPath = resolveExpectedArtifactPath("complete-milestone", mid, artifactBasePath);
127
+ const summaryMissing = !summaryPath || !existsSync(summaryPath);
128
+ if (summaryMissing) {
129
+ const repair = await repairMissingMilestoneSummaryProjection(basePath, mid);
130
+ if (!repair.ok) {
131
+ logWarning("dispatch", `Milestone ${mid} is closed in DB but SUMMARY repair failed: ${repair.error}. Dispatching complete-milestone to retry.`);
132
+ }
133
+ else {
134
+ return { action: "skip" };
135
+ }
136
+ }
137
+ else {
138
+ return { action: "skip" };
139
+ }
69
140
  }
70
141
  }
71
142
  const closeoutGitStop = commitPendingMilestoneCloseoutChanges(basePath, mid);
72
143
  if (closeoutGitStop)
73
144
  return closeoutGitStop;
74
145
  if (prefs?.uat_dispatch) {
75
- let closedSliceIds;
76
- if (isDbAvailable()) {
77
- closedSliceIds = getMilestoneSlices(mid)
78
- .filter((slice) => isClosedStatus(slice.status))
79
- .map((slice) => slice.id);
80
- }
81
- else {
82
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
83
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
84
- if (!roadmapContent) {
85
- return {
86
- action: "stop",
87
- reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because ROADMAP is unavailable while DB is not accessible.`,
88
- level: "warning",
89
- };
90
- }
91
- const roadmap = parseRoadmap(roadmapContent);
92
- closedSliceIds = roadmap.slices.filter((slice) => slice.done).map((slice) => slice.id);
146
+ // DB-authoritative (ADR-017): UAT sign-off gating never parses the
147
+ // ROADMAP projection. Without a DB we cannot verify — stop conservatively.
148
+ if (!isDbAvailable()) {
149
+ return {
150
+ action: "stop",
151
+ reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because the workflow DB is not accessible.`,
152
+ level: "warning",
153
+ };
93
154
  }
94
- for (const sliceId of closedSliceIds) {
155
+ for (const sliceId of getClosedSliceIds(mid)) {
95
156
  const result = await readUatGateVerdict(basePath, mid, sliceId);
96
157
  if (!result) {
97
158
  return {
98
159
  action: "stop",
99
- reason: `Cannot complete milestone ${mid}: missing UAT PASS verdict for ${sliceId}. Manual UAT sign-off (PASS) is required before milestone closure.`,
160
+ reason: uatSignoffBlockerGuidance(mid, sliceId),
100
161
  level: "warning",
101
162
  };
102
163
  }
@@ -104,7 +165,7 @@ export async function evaluateCompleteMilestoneDispatch(ctx) {
104
165
  if (!isAcceptableUatVerdict(verdict, uatType)) {
105
166
  return {
106
167
  action: "stop",
107
- reason: `Cannot complete milestone ${mid}: UAT verdict for ${sliceId} is "${verdict}". Manual UAT sign-off (PASS) is required before milestone closure.`,
168
+ reason: uatSignoffBlockerGuidance(mid, sliceId, verdict),
108
169
  level: "warning",
109
170
  };
110
171
  }
@@ -5,7 +5,7 @@ import { isClosedStatus } from "./status-guards.js";
5
5
  import { transaction, getMilestone, getMilestoneSlices, getSlice, insertMilestone, insertSlice, upsertMilestonePlanning, upsertSlicePlanning, } from "./gsd-db.js";
6
6
  import { invalidateStateCache } from "./state.js";
7
7
  import { renderRoadmapFromDb } from "./markdown-renderer.js";
8
- import { renderAllProjections } from "./workflow-projections.js";
8
+ import { flushWorkflowProjections } from "./projection-flush.js";
9
9
  import { writeManifest } from "./workflow-manifest.js";
10
10
  import { appendEvent } from "./workflow-events.js";
11
11
  import { logWarning } from "./workflow-logger.js";
@@ -109,7 +109,7 @@ async function renderPlanArtifacts(basePath, params) {
109
109
  }
110
110
  async function runPostPlanHooks(basePath, params) {
111
111
  try {
112
- await renderAllProjections(basePath, params.milestoneId);
112
+ await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
113
113
  writeManifest(basePath);
114
114
  appendEvent(basePath, {
115
115
  cmd: "plan-milestone",