@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75

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 (726) 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-style.d.ts +17 -0
  4. package/dist/cli-style.js +28 -0
  5. package/dist/cli.js +2 -19
  6. package/dist/headless-events.d.ts +4 -2
  7. package/dist/headless-events.js +14 -34
  8. package/dist/loader.js +6 -4
  9. package/dist/mcp-server.js +2 -1
  10. package/dist/models-resolver.d.ts +3 -13
  11. package/dist/models-resolver.js +3 -22
  12. package/dist/register-agent-bundles.d.ts +11 -2
  13. package/dist/register-agent-bundles.js +18 -4
  14. package/dist/resource-loader.d.ts +10 -5
  15. package/dist/resource-loader.js +123 -20
  16. package/dist/resources/.managed-resources-content-hash +1 -1
  17. package/dist/resources/GSD-WORKFLOW.md +5 -4
  18. package/dist/resources/extensions/ask-user-questions.js +3 -2
  19. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  20. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  21. package/dist/resources/extensions/async-jobs/index.js +65 -0
  22. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  23. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  24. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  25. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  26. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  27. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  28. package/dist/resources/extensions/bg-shell/utilities.js +3 -0
  29. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  30. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  31. package/dist/resources/extensions/browser-tools/index.js +69 -12
  32. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +456 -198
  33. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  34. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  35. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  36. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  37. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  38. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  39. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  40. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  41. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  42. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  43. package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
  44. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  45. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  46. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  47. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  48. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  49. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  50. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  51. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  52. package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
  53. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
  54. package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
  55. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  56. package/dist/resources/extensions/gsd/auto-start.js +41 -18
  57. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  58. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  59. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  60. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  61. package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
  62. package/dist/resources/extensions/gsd/auto.js +56 -15
  63. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  64. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
  65. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
  66. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  67. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  68. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
  69. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
  70. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  71. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  72. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  73. package/dist/resources/extensions/gsd/captures.js +4 -6
  74. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  75. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  76. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  77. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  78. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  79. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  80. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  81. package/dist/resources/extensions/gsd/constants.js +0 -2
  82. package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
  83. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  84. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  85. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  86. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  87. package/dist/resources/extensions/gsd/doctor-environment.js +258 -131
  88. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  89. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  90. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
  91. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  92. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  93. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  94. package/dist/resources/extensions/gsd/files.js +33 -19
  95. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  96. package/dist/resources/extensions/gsd/gsd-db.js +2 -1
  97. package/dist/resources/extensions/gsd/guidance.js +158 -0
  98. package/dist/resources/extensions/gsd/guided-flow.js +110 -6
  99. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  100. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  101. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  102. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  103. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  104. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  105. package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
  106. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  107. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  108. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  109. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  110. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  111. package/dist/resources/extensions/gsd/notifications.js +12 -7
  112. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
  113. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  114. package/dist/resources/extensions/gsd/paths.js +27 -0
  115. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  116. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  117. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  118. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  119. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  120. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  121. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  122. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  123. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  124. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  125. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  126. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  127. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  128. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  129. package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
  130. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  131. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  132. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  133. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  134. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  135. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  136. package/dist/resources/extensions/gsd/publication.js +87 -0
  137. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  138. package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
  139. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  140. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  141. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  142. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  143. package/dist/resources/extensions/gsd/state.js +12 -22
  144. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  145. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  146. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  147. package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
  148. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  149. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  150. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  151. package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
  152. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
  153. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  154. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  155. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  156. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  157. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  158. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  159. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  160. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  161. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  162. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  163. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  164. package/dist/resources/extensions/gsd/unit-registry.js +367 -0
  165. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  166. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  167. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  168. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  169. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  170. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  171. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  172. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  173. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  174. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  175. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  176. package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
  177. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  178. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  179. package/dist/resources/extensions/gsd/worktree-root.js +11 -0
  180. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  181. package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
  182. package/dist/resources/extensions/gsd/worktree.js +8 -1
  183. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  184. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  185. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  186. package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
  187. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  188. package/dist/resources/shared/package-manager-detection.js +1 -1
  189. package/dist/resources/shared/package.json +3 -0
  190. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  191. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  192. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  193. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  194. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  195. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  196. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  197. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  198. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  199. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  200. package/dist/runtime-checks.d.ts +10 -0
  201. package/dist/runtime-checks.js +27 -0
  202. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  203. package/dist/update-check.d.ts +2 -0
  204. package/dist/update-check.js +24 -1
  205. package/dist/update-cmd.js +20 -3
  206. package/dist/web/standalone/.next/BUILD_ID +1 -1
  207. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  208. package/dist/web/standalone/.next/build-manifest.json +3 -3
  209. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  210. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  211. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  212. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  213. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  214. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  220. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  223. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  224. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  225. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  226. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  227. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/index.html +1 -1
  230. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  231. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  232. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  235. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  236. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  237. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  238. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  239. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  242. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  243. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  244. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  245. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  246. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  247. package/dist/web/standalone/package.json +1 -1
  248. package/dist/worktree-cli.js +3 -6
  249. package/dist/worktree-status-banner.js +7 -15
  250. package/package.json +3 -3
  251. package/packages/cloud-mcp-gateway/package.json +2 -2
  252. package/packages/contracts/dist/rpc.d.ts +1 -0
  253. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  254. package/packages/contracts/dist/rpc.js.map +1 -1
  255. package/packages/contracts/dist/workflow.d.ts +4 -0
  256. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  257. package/packages/contracts/dist/workflow.js.map +1 -1
  258. package/packages/contracts/package.json +1 -1
  259. package/packages/daemon/package.json +4 -4
  260. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  261. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  262. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  263. package/packages/gsd-agent-core/package.json +5 -5
  264. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  265. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  266. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  267. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  268. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
  269. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
  271. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  275. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  278. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  279. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  280. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  281. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  282. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  283. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  284. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  285. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  286. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
  288. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  291. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  292. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  293. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  294. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  295. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  296. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  297. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  298. package/packages/gsd-agent-modes/package.json +7 -7
  299. package/packages/mcp-server/README.md +12 -3
  300. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  301. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  302. package/packages/mcp-server/dist/cli-runner.js +137 -0
  303. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  304. package/packages/mcp-server/dist/cli.js +2 -50
  305. package/packages/mcp-server/dist/cli.js.map +1 -1
  306. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  307. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  308. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  309. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  310. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  311. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  312. package/packages/mcp-server/dist/pid-registry.js +452 -0
  313. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  314. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  315. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  316. package/packages/mcp-server/dist/probe-mode.js +10 -0
  317. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  318. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  319. package/packages/mcp-server/dist/server.js +4 -0
  320. package/packages/mcp-server/dist/server.js.map +1 -1
  321. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  322. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  323. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  324. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  325. package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
  326. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  327. package/packages/mcp-server/dist/workflow-tools.js +178 -82
  328. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  329. package/packages/mcp-server/package.json +5 -4
  330. package/packages/native/package.json +1 -1
  331. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  332. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  333. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  334. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  335. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  336. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  337. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  338. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  339. package/packages/pi-agent-core/dist/index.js +3 -0
  340. package/packages/pi-agent-core/dist/index.js.map +1 -1
  341. package/packages/pi-agent-core/package.json +1 -1
  342. package/packages/pi-ai/README.md +1 -0
  343. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  344. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  345. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  346. package/packages/pi-ai/dist/index.d.ts +2 -0
  347. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  348. package/packages/pi-ai/dist/index.js +2 -0
  349. package/packages/pi-ai/dist/index.js.map +1 -1
  350. package/packages/pi-ai/dist/models.generated.d.ts +35 -125
  351. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  352. package/packages/pi-ai/dist/models.generated.js +46 -120
  353. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  354. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  355. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  356. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  357. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  358. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  359. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  360. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  361. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  362. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  363. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  364. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  365. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  366. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  367. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  368. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  369. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  370. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  371. package/packages/pi-ai/package.json +3 -2
  372. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  373. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  375. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  376. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  378. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  380. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  382. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  384. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  386. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  388. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  389. package/packages/pi-coding-agent/dist/index.js +1 -1
  390. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  392. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  393. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  395. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  396. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  397. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  398. package/packages/pi-coding-agent/package.json +7 -7
  399. package/packages/pi-tui/dist/index.d.ts +1 -1
  400. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  401. package/packages/pi-tui/dist/index.js +1 -1
  402. package/packages/pi-tui/dist/index.js.map +1 -1
  403. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  404. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  405. package/packages/pi-tui/dist/terminal-image.js +54 -2
  406. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  407. package/packages/pi-tui/dist/tui.d.ts +8 -0
  408. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  409. package/packages/pi-tui/dist/tui.js +72 -18
  410. package/packages/pi-tui/dist/tui.js.map +1 -1
  411. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  412. package/packages/pi-tui/dist/utils.js +110 -36
  413. package/packages/pi-tui/dist/utils.js.map +1 -1
  414. package/packages/pi-tui/package.json +2 -2
  415. package/packages/rpc-client/package.json +2 -2
  416. package/pkg/dist/theme/theme.d.ts.map +1 -1
  417. package/pkg/dist/theme/theme.js +45 -17
  418. package/pkg/dist/theme/theme.js.map +1 -1
  419. package/pkg/package.json +1 -1
  420. package/src/resources/GSD-WORKFLOW.md +5 -4
  421. package/src/resources/extensions/ask-user-questions.ts +7 -2
  422. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  423. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  424. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  425. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  426. package/src/resources/extensions/async-jobs/index.ts +79 -0
  427. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  428. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  429. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  430. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  431. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  432. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  433. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  434. package/src/resources/extensions/bg-shell/utilities.ts +3 -0
  435. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  436. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  437. package/src/resources/extensions/browser-tools/index.ts +71 -13
  438. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  439. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
  440. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  441. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +537 -202
  442. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  443. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  444. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  445. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  446. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  447. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  448. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  449. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  450. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  451. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  452. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  453. package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
  454. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  455. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  456. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  457. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  458. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  459. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  460. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  461. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  462. package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
  463. package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
  464. package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
  465. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  466. package/src/resources/extensions/gsd/auto-start.ts +42 -21
  467. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  468. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  469. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  470. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  471. package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
  472. package/src/resources/extensions/gsd/auto.ts +72 -17
  473. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  474. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
  475. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
  476. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  477. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  478. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
  479. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
  480. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  481. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  482. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  483. package/src/resources/extensions/gsd/captures.ts +4 -6
  484. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  485. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  486. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  487. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  488. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  489. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  490. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  491. package/src/resources/extensions/gsd/constants.ts +0 -3
  492. package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
  493. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  494. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  495. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  496. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  497. package/src/resources/extensions/gsd/doctor-environment.ts +269 -149
  498. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  499. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  500. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
  501. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  502. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  503. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  504. package/src/resources/extensions/gsd/files.ts +33 -12
  505. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  506. package/src/resources/extensions/gsd/gsd-db.ts +4 -3
  507. package/src/resources/extensions/gsd/guidance.ts +217 -0
  508. package/src/resources/extensions/gsd/guided-flow.ts +161 -26
  509. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  510. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  511. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  512. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  513. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  514. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  515. package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
  516. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  517. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  518. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  519. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  520. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  521. package/src/resources/extensions/gsd/notifications.ts +13 -6
  522. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
  523. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  524. package/src/resources/extensions/gsd/paths.ts +33 -0
  525. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  526. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  527. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  528. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  529. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  530. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  531. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
  532. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  533. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  534. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  535. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  536. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  537. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  538. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  539. package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
  540. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  541. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  542. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  543. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  544. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  545. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  546. package/src/resources/extensions/gsd/publication.ts +122 -0
  547. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  548. package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
  549. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  550. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  551. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  552. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  553. package/src/resources/extensions/gsd/state.ts +16 -22
  554. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  555. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  556. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  557. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  558. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
  559. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
  560. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  561. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  562. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  563. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  564. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  565. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  566. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  567. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  568. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  569. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  570. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  571. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  572. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  573. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  574. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  575. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  576. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  577. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  578. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  579. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
  580. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  581. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  582. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  583. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  584. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  585. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  586. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  587. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  588. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  589. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  590. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  591. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  592. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  593. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  594. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  595. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  596. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  597. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
  598. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -58
  599. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  600. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  601. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  602. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  603. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  604. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  605. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  606. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  607. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  608. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  609. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  610. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  611. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  612. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  613. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  614. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  615. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  616. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  617. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  618. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  619. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  620. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  621. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  622. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  623. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  624. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  625. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  626. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  627. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  628. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
  629. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  630. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  631. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
  632. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  633. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  634. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  635. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  636. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  637. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
  638. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  639. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
  640. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  641. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  642. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  643. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  644. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  645. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  646. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  647. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  648. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  649. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  650. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  651. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  652. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
  653. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  654. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  655. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  656. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
  657. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  658. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  659. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  660. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  661. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  662. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  663. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  664. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  665. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  666. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  667. package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
  668. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  669. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  670. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  671. package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
  672. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
  673. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  674. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  675. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  676. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  677. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  678. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  679. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  680. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  681. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  682. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  683. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  684. package/src/resources/extensions/gsd/unit-registry.ts +442 -0
  685. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  686. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  687. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  688. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  689. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  690. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  691. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  692. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  693. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  694. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  695. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  696. package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
  697. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  698. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  699. package/src/resources/extensions/gsd/worktree-root.ts +12 -0
  700. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  701. package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
  702. package/src/resources/extensions/gsd/worktree.ts +7 -1
  703. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  704. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  705. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  706. package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
  707. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  708. package/src/resources/shared/package-manager-detection.ts +1 -1
  709. package/src/resources/shared/package.json +3 -0
  710. package/src/resources/skills/create-skill/SKILL.md +3 -0
  711. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  712. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  713. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  714. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  715. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  716. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  717. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  718. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  719. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  720. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  721. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  722. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  723. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  724. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  725. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
  726. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
@@ -110,9 +110,12 @@ Templates are in `{{templatesDir}}`.
110
110
 
111
111
  **External facts:** Use `search-the-web` + `fetch_page`, or `search_and_read`; use `freshness` for recency. Never state current facts from training data without verification.
112
112
 
113
- **Background processes:** Use `bg_shell` `start` + `wait_for_ready` for servers/watchers/daemons. Never use `bash` with `&` or `nohup`; inherited stdout can hang. Never poll with `sleep`; use `wait_for_ready`. For status use `digest`, `highlights` for significant lines, and `output` only when debugging.
113
+ **Choosing a shell tool decide by how the command runs, not how long it takes:**
114
114
 
115
- **One-shot commands:** Use `async_bash` for builds, tests, and installs. Results are pushed on exit; use `await_job` only to block on a specific job.
115
+ - **Runs and exits (a batch command):** anything that does work and finishes — `terraform apply`, DB migrations, builds, tests, installs, long scripts. Use synchronous `bash` when you want to block and read the result now (uncapped; in auto-mode genuine hangs are caught by the stalled-tool watchdog, interactively they end on human ESC). Use `async_bash` when you want it non-blocking — it returns a job ID immediately and you `await_job` later. **Never** put a run-to-completion command under `bg_shell` `wait_for_ready`: it exits instead of staying alive, so readiness never trips and a clean exit looks like a failure.
116
+ - **Stays alive and you interact with it over time:** servers, watchers, daemons, REPLs. Use `bg_shell` `start`, then `wait_for_ready` (block until it listens/prints its ready pattern), `output`/`digest`/`highlights` to inspect, `send`/`send_and_wait` to drive it, and `kill`/`restart` to manage it. Never use `bash` with `&` or `nohup` (inherited stdout can hang); never poll with `sleep` (use `wait_for_ready`).
117
+
118
+ Quick rule of thumb: if the command would exit on its own, it's `bash`/`async_bash`; if it would keep running until you stop it, it's `bg_shell`.
116
119
 
117
120
  **Stale job hygiene:** After editing source to fix a failure, `cancel_job` every in-flight `async_bash` job before rerunning. Changed inputs make in-flight outputs untrusted.
118
121
 
@@ -65,4 +65,4 @@ Classify each capture as one of:
65
65
 
66
66
  **Important:** Do NOT execute any resolutions. Only classify and update CAPTURES.md. Resolution execution happens separately (in auto-mode dispatch or manually by the user).
67
67
 
68
- When done, say: "Triage complete."
68
+ When done, say: "Triage complete." Say this exactly once — if you already said it in a prior message, do not repeat it.
@@ -87,4 +87,4 @@ If verdict is `needs-remediation`:
87
87
 
88
88
  **File system safety:** When scanning milestone directories, use `ls` or `find` first. Never pass a directory path such as `tasks/` or `slices/` directly to `read`; it only accepts files.
89
89
 
90
- When done, say: "Milestone {{milestoneId}} validation complete — verdict: <verdict>."
90
+ When done, say: "Milestone {{milestoneId}} validation complete — verdict: <verdict>." Say this exactly once — if you already said it in a prior message, do not repeat it.
@@ -25,4 +25,5 @@ Follow the workflow defined below. Execute each phase in order, completing one b
25
25
  3. **Atomic commits.** Commit working code after each meaningful change. Use conventional commit format: `<type>(<scope>): <description>`.
26
26
  4. **Verify before shipping.** Run the project's test suite and build before marking the workflow complete.
27
27
  5. **Decision gates, not ceremony.** After each phase, summarize what changed. For low/medium complexity, ask for confirmation only when the next phase depends on a real user choice or external approval. For high complexity, confirm before proceeding to each new phase.
28
- 6. **Stay focused.** This is a {{complexity}}-complexity workflow. Match your ceremony level to the task don't over-engineer or under-deliver.
28
+ 6. **Persist workflow state.** If the artifact directory contains `STATE.json`, update it after each phase: mark the finished phase `completed`, mark the next phase `active`, set `currentPhase` to the active phase index, and refresh `updatedAt`. When every phase is completed, set `completedAt` to the completion timestamp.
29
+ 7. **Stay focused.** This is a {{complexity}}-complexity workflow. Match your ceremony level to the task — don't over-engineer or under-deliver.
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * Actionable remediation hints when auto-mode pauses on provider/model errors.
3
+ * Render with formatGuidance from the Guidance module.
3
4
  */
4
5
  /** Map auto unit types to the `models:` key in PREFERENCES.md. */
5
6
  export function unitTypeToPrefsPhaseKey(unitType) {
@@ -91,8 +92,3 @@ export function resolveProviderErrorGuidance(input) {
91
92
  steps.push("Run /gsd next to resume the paused unit.");
92
93
  return { summary, steps };
93
94
  }
94
- /** Flatten guidance into a pause banner / notification string. */
95
- export function formatProviderErrorGuidance(guidance) {
96
- const numbered = guidance.steps.map((step, index) => `${index + 1}. ${step}`).join("\n");
97
- return `${guidance.summary}\n\n${numbered}`;
98
- }
@@ -92,7 +92,7 @@ function emitAudit(report) {
92
92
  }
93
93
  function emitNotification(report) {
94
94
  try {
95
- appendNotification(summarize(report), "warning", "workflow-logger");
95
+ appendNotification(summarize(report), "warning", "workflow-logger", { kind: "provider-switch" });
96
96
  }
97
97
  catch {
98
98
  // Notification persistence is best-effort.
@@ -0,0 +1,87 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Publication module — push and draft-PR creation for a merged milestone (ADR-034).
3
+ //
4
+ // Publication is distinct from the merge verb: merging a milestone branch is a
5
+ // Worktree Lifecycle concern (worktree, branch, lease, stash discipline);
6
+ // publication needs only the resulting commit, a remote, and preferences.
7
+ // Extracted from the tail of `mergeMilestoneToMain` (auto-worktree.ts) so it is
8
+ // testable without a merge fixture and reachable from any closeout path.
9
+ //
10
+ // Publication failure is non-fatal to a completed local merge: every failure is
11
+ // logged and reported in the result, never thrown.
12
+ import { execFileSync } from "node:child_process";
13
+ import { buildPullRequestEvidence, createDraftPullRequestFromEvidence, } from "./pull-request-process.js";
14
+ import { logWarning } from "./workflow-logger.js";
15
+ export function gitRemoteExists(basePath, remote) {
16
+ try {
17
+ execFileSync("git", ["remote", "get-url", remote], {
18
+ cwd: basePath,
19
+ stdio: ["ignore", "pipe", "pipe"],
20
+ encoding: "utf-8",
21
+ });
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ /**
29
+ * Publish a merged milestone per preferences: push the integration branch
30
+ * (auto-push, suppressed when auto-PR owns the remote interaction) and/or
31
+ * push the milestone branch and open a draft PR (auto-PR).
32
+ */
33
+ export function publishMilestone(request) {
34
+ const result = { pushed: false, prCreated: false };
35
+ if (request.nothingToCommit)
36
+ return result;
37
+ const { basePath, prefs } = request;
38
+ const remote = prefs.remote ?? "origin";
39
+ if (prefs.autoPush && !prefs.autoPr && gitRemoteExists(basePath, remote)) {
40
+ try {
41
+ execFileSync("git", ["push", remote, request.integrationBranch], {
42
+ cwd: basePath,
43
+ stdio: ["ignore", "pipe", "pipe"],
44
+ encoding: "utf-8",
45
+ });
46
+ result.pushed = true;
47
+ }
48
+ catch (err) {
49
+ // Push failure is non-fatal
50
+ logWarning("worktree", `git push failed: ${err instanceof Error ? err.message : String(err)}`);
51
+ }
52
+ }
53
+ // #2302: PR creation is not gated on pushed/auto-push.
54
+ if (prefs.autoPr && gitRemoteExists(basePath, remote)) {
55
+ try {
56
+ // Push the milestone branch to remote first
57
+ execFileSync("git", ["push", remote, request.milestoneBranch], {
58
+ cwd: basePath,
59
+ stdio: ["ignore", "pipe", "pipe"],
60
+ encoding: "utf-8",
61
+ });
62
+ const prEvidence = buildPullRequestEvidence({
63
+ milestoneId: request.milestoneId,
64
+ milestoneTitle: request.milestoneTitle,
65
+ changeType: "feat",
66
+ summaries: [...request.sliceSummaries],
67
+ testsRun: ["Auto-created after milestone merge. Run `npm run verify:merge` before marking this draft ready."],
68
+ rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
69
+ how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
70
+ });
71
+ const prUrl = createDraftPullRequestFromEvidence(basePath, request.milestoneId, prEvidence, {
72
+ head: request.milestoneBranch,
73
+ base: prefs.prTargetBranch ?? request.integrationBranch,
74
+ });
75
+ if (!prUrl) {
76
+ throw new Error("gh pr create returned no URL");
77
+ }
78
+ result.prCreated = true;
79
+ result.prUrl = prUrl;
80
+ }
81
+ catch (err) {
82
+ // PR creation failure is non-fatal — gh may not be installed or authenticated
83
+ logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
84
+ }
85
+ }
86
+ return result;
87
+ }
@@ -10,7 +10,11 @@
10
10
  */
11
11
  import { loadFile, parseTaskPlanIO } from "./files.js";
12
12
  import { isDbAvailable, getSliceTasks } from "./gsd-db.js";
13
+ // Explicit degraded-mode fallback ONLY (ADR-017): parsePlan is consulted when
14
+ // the DB is unavailable or has no task rows for the slice; the DB path in
15
+ // loadSliceTaskIO always wins when rows exist, and the fallback logs a warning.
13
16
  import { parsePlan } from "./parsers-legacy.js";
17
+ import { logWarning } from "./workflow-logger.js";
14
18
  import { resolveTasksDir, resolveTaskFiles } from "./paths.js";
15
19
  import { join } from "node:path";
16
20
  import { loadJsonFileOrNull, saveJsonFile } from "./json-persistence.js";
@@ -178,7 +182,10 @@ export async function loadSliceTaskIO(basePath, mid, sid) {
178
182
  }
179
183
  catch { /* fall through */ }
180
184
  if (!taskEntries) {
181
- // File-based fallback: parse slice plan for task entries
185
+ // Degraded-mode fallback (ADR-017): no DB task rows for this slice —
186
+ // parse the PLAN.md projection instead. Warn so silent drift from the
187
+ // DB-authoritative path is visible in logs.
188
+ logWarning("projection", `reactive-graph: DB unavailable or no task rows for ${mid}/${sid}; falling back to PLAN.md parsing`);
182
189
  const parsed = parsePlan(planContent);
183
190
  if (parsed.tasks.length > 0) {
184
191
  taskEntries = parsed.tasks.map(t => ({
@@ -1,6 +1,8 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: ADR-015 Recovery Classification module for runtime failure taxonomy.
3
+ import { isToolUnavailableError } from "./auto-tool-tracking.js";
3
4
  import { classifyError, isTransient } from "./error-classifier.js";
5
+ import { recoveryRemediation } from "./guidance.js";
4
6
  import { ReconciliationFailedError } from "./state-reconciliation.js";
5
7
  import { IllegalPhaseTransitionError } from "./state-transition-matrix.js";
6
8
  export function classifyFailure(input) {
@@ -13,103 +15,44 @@ export function classifyFailure(input) {
13
15
  : input.error instanceof IllegalPhaseTransitionError
14
16
  ? "illegal-transition"
15
17
  : input.failureKind ?? inferFailureKind(message);
16
- switch (failureKind) {
17
- case "tool-schema":
18
- return {
19
- failureKind,
20
- action: "stop",
21
- reason: `Tool schema failure${unitSuffix(input)}: ${message}`,
22
- exitReason: "tool-schema",
23
- remediation: "Fix the Unit Tool Contract or tool schema before retrying.",
24
- };
25
- case "tool-contract":
26
- return {
27
- failureKind,
28
- action: "stop",
29
- reason: `Tool Contract failure${unitSuffix(input)}: ${message}`,
30
- exitReason: "tool-contract",
31
- remediation: "Fix the Unit Tool Contract or prompt so the Unit is only asked to use tools owned by its phase.",
32
- };
33
- case "deterministic-policy":
34
- return {
35
- failureKind,
36
- action: "stop",
37
- reason: `Deterministic policy failure${unitSuffix(input)}: ${message}`,
38
- exitReason: "deterministic-policy",
39
- remediation: "Resolve the policy blocker; retrying the same Unit will repeat the failure.",
40
- };
41
- case "lifecycle-progression":
42
- return {
43
- failureKind,
44
- action: "stop",
45
- reason: `Lifecycle progression failure${unitSuffix(input)}: ${message}`,
46
- exitReason: "lifecycle-progression",
47
- remediation: "Route to the required owning Unit or restore the missing artifact before advancing lifecycle state.",
48
- };
49
- case "stale-worker":
50
- return {
51
- failureKind,
52
- action: "stop",
53
- reason: `Stale worker failure${unitSuffix(input)}: ${message}`,
54
- exitReason: "stale-worker",
55
- remediation: "Clear or reconcile the stale worker before dispatching another Unit.",
56
- };
57
- case "worktree-invalid":
58
- return {
59
- failureKind,
60
- action: "stop",
61
- reason: `Worktree invalid${unitSuffix(input)}: ${message}`,
62
- exitReason: "worktree-invalid",
63
- remediation: "Repair or recreate the milestone worktree before launching source-writing Units.",
64
- };
65
- case "verification-drift":
66
- return {
67
- failureKind,
68
- action: "escalate",
69
- reason: `Verification drift${unitSuffix(input)}: ${message}`,
70
- exitReason: "verification-drift",
71
- remediation: "Inspect the verification artifact and reconcile the state snapshot before resuming.",
72
- };
73
- case "reconciliation-drift":
74
- return {
75
- failureKind,
76
- action: "escalate",
77
- reason: `Reconciliation drift${unitSuffix(input)}: ${message}`,
78
- exitReason: "reconciliation-drift",
79
- remediation: "Inspect the persistent or repair-failed drift kinds reported by the State Reconciliation Module before resuming.",
80
- };
81
- case "illegal-transition":
82
- return {
83
- failureKind,
84
- action: "escalate",
85
- reason: `Illegal phase transition${unitSuffix(input)}: ${message}`,
86
- exitReason: "illegal-transition",
87
- remediation: "A derived Phase edge rejected by the Phase Transition Invariant survived reconciliation; inspect deriveState and the State Reconciliation Module before resuming.",
88
- };
89
- case "provider": {
90
- const providerClass = classifyError(message, input.retryAfterMs);
91
- return {
92
- failureKind,
93
- action: isTransient(providerClass) ? "retry" : "escalate",
94
- reason: message,
95
- exitReason: `provider-${providerClass.kind}`,
96
- remediation: isTransient(providerClass)
97
- ? "Retry after the provider/network condition clears."
98
- : "Inspect provider credentials, model entitlement, or request shape.",
99
- providerClass: providerClass.kind,
100
- };
101
- }
102
- case "runtime-unknown":
103
- return {
104
- failureKind,
105
- action: "escalate",
106
- reason: message,
107
- exitReason: "runtime-unknown",
108
- remediation: "Inspect the runtime error and add a dedicated classification if it is repeatable.",
109
- };
18
+ if (failureKind === "provider") {
19
+ const providerClass = classifyError(message, input.retryAfterMs);
20
+ const transient = isTransient(providerClass);
21
+ return {
22
+ failureKind,
23
+ action: transient ? "retry" : "escalate",
24
+ reason: message,
25
+ exitReason: `provider-${providerClass.kind}`,
26
+ remediation: recoveryRemediation(transient ? "provider-transient" : "provider-permanent"),
27
+ providerClass: providerClass.kind,
28
+ };
110
29
  }
30
+ const { action, label } = FAILURE_TAXONOMY[failureKind];
31
+ return {
32
+ failureKind,
33
+ action,
34
+ reason: label ? `${label}${unitSuffix(input)}: ${message}` : message,
35
+ exitReason: failureKind,
36
+ remediation: recoveryRemediation(failureKind),
37
+ };
111
38
  }
39
+ /** Per-kind action and reason label. Remediation lives in the Guidance module. */
40
+ const FAILURE_TAXONOMY = {
41
+ "tool-schema": { action: "stop", label: "Tool schema failure" },
42
+ "tool-contract": { action: "stop", label: "Tool Contract failure" },
43
+ "tool-unavailable": { action: "retry", label: "Tool unavailable" },
44
+ "deterministic-policy": { action: "stop", label: "Deterministic policy failure" },
45
+ "lifecycle-progression": { action: "stop", label: "Lifecycle progression failure" },
46
+ "stale-worker": { action: "stop", label: "Stale worker failure" },
47
+ "worktree-invalid": { action: "stop", label: "Worktree invalid" },
48
+ "verification-drift": { action: "escalate", label: "Verification drift" },
49
+ "reconciliation-drift": { action: "escalate", label: "Reconciliation drift" },
50
+ "illegal-transition": { action: "escalate", label: "Illegal phase transition" },
51
+ "runtime-unknown": { action: "escalate", label: null },
52
+ };
112
53
  function inferFailureKind(message) {
54
+ if (isToolUnavailableError(message))
55
+ return "tool-unavailable";
113
56
  if (/tool contract|auto-unit tool scope|phase-boundary gate|not permitted.*own/i.test(message))
114
57
  return "tool-contract";
115
58
  if (/lifecycle progression|required artifact|missing .*assessment|missing .*closeout|cannot legally (?:advance|progress)/i.test(message))
@@ -161,6 +161,26 @@ function parseTableSlices(section) {
161
161
  }
162
162
  return slices;
163
163
  }
164
+ function looksLikeTable(section) {
165
+ const lines = section.split("\n");
166
+ // Checkbox format takes precedence — embedded demo tables must not switch mode (#721).
167
+ if (lines.some(line => /^\s*-\s+\[[ xX]\]/.test(line))) {
168
+ return false;
169
+ }
170
+ const pipeLines = lines.filter(line => /^\s*\|/.test(line));
171
+ if (pipeLines.length < 2)
172
+ return false;
173
+ const hasSeparatorRow = pipeLines.some((line, index) => {
174
+ if (index === 0)
175
+ return false;
176
+ const cells = line.split("|").map(c => c.trim()).filter(Boolean);
177
+ return /^\s*\|[\s:-]+\|/.test(line) && cells.length >= 2 && cells.every(c => /^[\s:-]+$/.test(c));
178
+ });
179
+ if (hasSeparatorRow)
180
+ return true;
181
+ // Tables without a separator row still expose slice IDs in data rows.
182
+ return pipeLines.some(line => /\bS\d+\b/.test(line));
183
+ }
164
184
  export function parseRoadmapSlices(content) {
165
185
  const slicesSection = extractSlicesSection(content);
166
186
  if (!slicesSection) {
@@ -171,9 +191,11 @@ export function parseRoadmapSlices(content) {
171
191
  }
172
192
  // Try table format first — if the section contains pipe-delimited rows with
173
193
  // slice IDs, parse them as a table (#1736).
174
- const tableSlices = parseTableSlices(slicesSection);
175
- if (tableSlices.length > 0) {
176
- return tableSlices;
194
+ if (looksLikeTable(slicesSection)) {
195
+ const tableSlices = parseTableSlices(slicesSection);
196
+ if (tableSlices.length > 0) {
197
+ return tableSlices;
198
+ }
177
199
  }
178
200
  // Standard checkbox format
179
201
  const slices = [];
@@ -0,0 +1,108 @@
1
+ /**
2
+ * One-shot confirmation token for destructive bash commands.
3
+ *
4
+ * The destructive-command guard hard-blocks classified commands (force push,
5
+ * rm -rf, SQL drop, etc.) in all modes. The block instructs the model to
6
+ * confirm via ask_user_questions and re-issue the command. This module is the
7
+ * missing escape hatch: it records the user's confirmation and lets the exact
8
+ * confirmed command through exactly once.
9
+ *
10
+ * Design constraints:
11
+ * - In-memory only, never persisted. A confirmation token written to disk
12
+ * could silently auto-approve a destructive command in a later session —
13
+ * confirmation must be re-obtained every process lifetime.
14
+ * - One-shot. Consuming a token clears it, so a second destructive command
15
+ * (even an identical one) re-blocks and re-prompts.
16
+ * - Command-bound. The token only matches the exact (normalized) command
17
+ * string the user confirmed. A reworded command re-blocks, which is safe.
18
+ * - Per basePath, so concurrent workspaces in one process never share tokens.
19
+ *
20
+ * Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
21
+ */
22
+ import { resolve } from "node:path";
23
+ /**
24
+ * Question-id substring that marks an ask_user_questions call as a
25
+ * destructive-command confirmation. The tool_result handler promotes the
26
+ * pending command to a confirmed token when an affirmative answer arrives for
27
+ * a question whose id contains this marker.
28
+ */
29
+ export const DESTRUCTIVE_CONFIRM_GATE_MARKER = "destructive_confirm";
30
+ const statesByBasePath = new Map();
31
+ function stateKey(basePath) {
32
+ return resolve(basePath);
33
+ }
34
+ function getState(basePath) {
35
+ const key = stateKey(basePath);
36
+ let state = statesByBasePath.get(key);
37
+ if (!state) {
38
+ state = { pendingCommand: null, confirmedCommand: null };
39
+ statesByBasePath.set(key, state);
40
+ }
41
+ return state;
42
+ }
43
+ /**
44
+ * Normalize a command for stable matching across block → confirm → retry.
45
+ * Trims surrounding whitespace and collapses internal runs of whitespace so
46
+ * cosmetic reformatting of the same command still matches the token.
47
+ */
48
+ export function normalizeDestructiveCommand(command) {
49
+ return command.replace(/\s+/g, " ").trim();
50
+ }
51
+ /**
52
+ * Whether an ask_user_questions question id is a destructive-confirm gate.
53
+ */
54
+ export function isDestructiveConfirmGateId(questionId) {
55
+ return typeof questionId === "string" && questionId.includes(DESTRUCTIVE_CONFIRM_GATE_MARKER);
56
+ }
57
+ /**
58
+ * Record that a destructive command was blocked and is awaiting confirmation.
59
+ * Called by the guard at block time. Overwrites any prior pending command —
60
+ * only the most recently blocked command can be confirmed.
61
+ */
62
+ export function requestDestructiveConfirmation(command, basePath = process.cwd()) {
63
+ const state = getState(basePath);
64
+ state.pendingCommand = normalizeDestructiveCommand(command);
65
+ // A fresh request invalidates any stale confirmed token for a different
66
+ // command so confirmation cannot leak across distinct destructive actions.
67
+ state.confirmedCommand = null;
68
+ }
69
+ /**
70
+ * Promote the pending command to a confirmed, one-shot token. Called by the
71
+ * tool_result handler when the user gives an affirmative answer to a
72
+ * destructive-confirm gate. Returns the confirmed command, or null if there
73
+ * was nothing pending (e.g. confirmation arrived without a preceding block).
74
+ */
75
+ export function confirmDestructiveCommand(basePath = process.cwd()) {
76
+ const state = getState(basePath);
77
+ if (!state.pendingCommand)
78
+ return null;
79
+ state.confirmedCommand = state.pendingCommand;
80
+ state.pendingCommand = null;
81
+ return state.confirmedCommand;
82
+ }
83
+ /**
84
+ * Check whether the given command has been confirmed, consuming the token if
85
+ * so. Returns true exactly once per confirmation; subsequent calls (or a
86
+ * non-matching command) return false. Called by the guard before blocking.
87
+ */
88
+ export function consumeDestructiveConfirmation(command, basePath = process.cwd()) {
89
+ const state = getState(basePath);
90
+ if (!state.confirmedCommand)
91
+ return false;
92
+ if (state.confirmedCommand !== normalizeDestructiveCommand(command))
93
+ return false;
94
+ state.confirmedCommand = null;
95
+ return true;
96
+ }
97
+ /**
98
+ * Inspect the pending command without consuming it (diagnostics/tests).
99
+ */
100
+ export function peekPendingDestructiveCommand(basePath = process.cwd()) {
101
+ return getState(basePath).pendingCommand;
102
+ }
103
+ /**
104
+ * Clear all destructive-confirmation state for a basePath (tests / flow reset).
105
+ */
106
+ export function resetDestructiveConfirmation(basePath = process.cwd()) {
107
+ statesByBasePath.delete(stateKey(basePath));
108
+ }
@@ -329,7 +329,7 @@ export function acquireSessionLock(basePath) {
329
329
  // #3218: Provide actionable workaround when lock recovery fails
330
330
  const lockDirPath = lockTarget + ".lock";
331
331
  const reason = existingPid
332
- ? `Another auto-mode session (PID ${existingPid}) appears to be running.\nStop it with \`kill ${existingPid}\` before starting a new session.`
332
+ ? `Another auto-mode session (PID ${existingPid}) appears to be running.\nRun \`/gsd stop\` for graceful shutdown, or choose "Force start" from \`/gsd auto\` to terminate it.`
333
333
  : `Another auto-mode session lock is stuck on this project.\nRun: rm -rf "${lockDirPath}" && rm -f "${lp}"`;
334
334
  return { acquired: false, reason, existingPid };
335
335
  }
@@ -108,11 +108,8 @@ function formatSkillActivationBlock(skillNames) {
108
108
  const safe = skillNames.filter(name => SAFE_SKILL_NAME.test(name));
109
109
  if (safe.length === 0)
110
110
  return "";
111
- // Use explicit parameter syntax so LLMs pass { skill: "..." } instead of { name: "..." }.
112
- // The function-call-like syntax `Skill('name')` led LLMs to infer a positional
113
- // parameter name, causing tool validation failures — see #2224.
114
- const calls = safe.map(name => `Call Skill({ skill: '${name}' })`).join('. ');
115
- return `<skill_activation>${calls}.</skill_activation>`;
111
+ const reads = safe.map(name => `Read the installed '${name}' skill file from <available_skills>`).join(". ");
112
+ return `<skill_activation>${reads}.</skill_activation>`;
116
113
  }
117
114
  /**
118
115
  * Manifest-driven recommendations block — informational only, does NOT
@@ -132,7 +129,7 @@ function formatSkillRecommendationsBlock(unitType, skillNames) {
132
129
  const safe = skillNames.filter(name => SAFE_SKILL_NAME.test(name));
133
130
  if (safe.length === 0)
134
131
  return "";
135
- return `<skill_recommendations unit="${unitType}">For this unit type, also consider invoking: ${safe.join(", ")}. Use Skill({ skill: 'name' }) when relevant — these are recommendations, not requirements.</skill_recommendations>`;
132
+ return `<skill_recommendations unit="${unitType}">For this unit type, also consider reading these installed skill files from <available_skills>: ${safe.join(", ")}. These are recommendations, not requirements.</skill_recommendations>`;
136
133
  }
137
134
  export function buildSkillActivationBlock(params) {
138
135
  const prefs = params.preferences ?? loadEffectiveGSDPreferences(params.base)?.preferences;
@@ -3,6 +3,11 @@
3
3
  // GSD Extension — State Derivation
4
4
  // DB-authoritative runtime derivation with explicit legacy filesystem fallback.
5
5
  // Pure TypeScript, zero Pi dependencies.
6
+ // Pre-migration fallback ONLY (ADR-017): deriveState must work on projects
7
+ // whose DB does not exist yet (before md-importer runs), so it parses markdown
8
+ // projections when `isDbAvailable()` is false or the DB has no rows. Once the
9
+ // DB is populated, decision reads go through gsd-db queries — these parsers
10
+ // must never be consulted when DB data is present.
6
11
  import { parseRoadmap, parsePlan, } from './parsers-legacy.js';
7
12
  import { parseSummary, loadFile, parseRequirementCounts, parseContextDependsOn, } from './files.js';
8
13
  import { resolveMilestoneFile, resolveSlicePath, resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveGsdRootFile, gsdRoot, } from './paths.js';
@@ -18,30 +23,11 @@ import { logWarning } from './workflow-logger.js';
18
23
  import { extractVerdict } from './verdict-parser.js';
19
24
  import { detectPendingEscalation } from './escalation.js';
20
25
  import { isTerminalMilestoneSummaryContent } from './milestone-summary-classifier.js';
21
- import { isDbAvailable, getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, getRequirementCounts, getLatestAssessmentByScope, getPendingGateCountForTurn, } from './gsd-db.js';
26
+ import { isDbAvailable, getAllMilestones, getMilestone, getSlicesByMilestoneIds, getSliceTasks, getReplanHistory, getSlice, getRequirementCounts, getLatestAssessmentByScope, getPendingGateCountForTurn, } from './gsd-db.js';
22
27
  import { wasWorkflowDatabaseOpenAttempted } from './db-workspace.js';
23
28
  import { formatCompletePhaseNextAction, countUnmappedActiveRequirements } from './requirements-backlog.js';
24
29
  import { classifyMilestoneReadiness, readinessNeedsDiscussion, } from './milestone-readiness.js';
25
- function formatNeedsAttentionBlocker(milestoneId) {
26
- return [
27
- `Milestone ${milestoneId} is blocked because milestone validation returned needs-attention.`,
28
- `Fix options:`,
29
- `1. Review the validation details: \`/gsd status\``,
30
- `2. If you fixed the missing evidence or issue, re-run milestone validation: \`/gsd validate-milestone\``,
31
- `3. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
32
- `4. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
33
- `After validation or override passes, run \`/gsd auto\` to complete and merge the milestone.`,
34
- ].join("\n");
35
- }
36
- function formatNeedsRemediationBlocker(milestoneId) {
37
- return [
38
- `Milestone ${milestoneId} is blocked because milestone validation returned needs-remediation, but all slices are complete.`,
39
- `Fix options:`,
40
- `1. Run \`/gsd dispatch reassess\` to add remediation slices, then run \`/gsd auto\``,
41
- `2. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
42
- `3. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
43
- ].join("\n");
44
- }
30
+ import { needsAttentionBlockerGuidance as formatNeedsAttentionBlocker, needsRemediationBlockerGuidance as formatNeedsRemediationBlocker, } from './guidance.js';
45
31
  /**
46
32
  * A "ghost" milestone directory contains only META.json (and no substantive
47
33
  * files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
@@ -380,12 +366,16 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
380
366
  let activeMilestoneFound = false;
381
367
  let activeMilestoneHasDraft = false;
382
368
  let firstDeferredQueuedShell = null;
369
+ const activeMilestoneIds = milestones
370
+ .filter((m) => !parkedMilestoneIds.has(m.id))
371
+ .map((m) => m.id);
372
+ const slicesByMilestone = getSlicesByMilestoneIds(activeMilestoneIds);
383
373
  for (const m of milestones) {
384
374
  if (parkedMilestoneIds.has(m.id)) {
385
375
  registry.push({ id: m.id, title: stripMilestonePrefix(m.title) || m.id, status: 'parked' });
386
376
  continue;
387
377
  }
388
- const slices = getMilestoneSlices(m.id);
378
+ const slices = slicesByMilestone.get(m.id) ?? [];
389
379
  // DB-authoritative completeness (#4179): only trust completeMilestoneIds,
390
380
  // which is itself derived from DB status. SUMMARY-file presence alone must
391
381
  // not imply completion.
@@ -0,0 +1,57 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Stop Notice module — single owner of the auto/step-mode
3
+ // stop/pause notice vocabulary. Both sides of the wire live here: the
4
+ // formatters that produce the canonical prefixes (used by stopAuto/pauseAuto)
5
+ // and the classifiers that recognize them (used by the headless host to pick
6
+ // exit codes). Wording changes in this file keep emitter and detector in
7
+ // lockstep; round-trip tests enforce it.
8
+ /** A reason string of the form "Blocked: …" marks a blocked stop. */
9
+ export function isBlockedStopReason(reason) {
10
+ return /^Blocked:\s*/i.test(reason ?? "");
11
+ }
12
+ /** Strip the "Blocked: " marker for display. */
13
+ export function stopNoticeDisplayReason(reason) {
14
+ return (reason ?? "").replace(/^Blocked:\s*/i, "").trim();
15
+ }
16
+ export function stopNoticeKind(reason) {
17
+ return isBlockedStopReason(reason) ? "blocked" : "stopped";
18
+ }
19
+ /** Canonical stop-notice prefix: "Auto-mode blocked — reason" / "Auto-mode stopped". */
20
+ export function formatStopNoticePrefix(reason) {
21
+ const displayReason = stopNoticeDisplayReason(reason);
22
+ const prefix = stopNoticeKind(reason) === "blocked" ? "Auto-mode blocked" : "Auto-mode stopped";
23
+ return displayReason ? `${prefix} — ${displayReason}` : prefix;
24
+ }
25
+ // ─── Classification (headless host side) ────────────────────────────────
26
+ // The canonical lowercase prefixes the headless event loop recognizes in
27
+ // notify messages. Emitters above and ad-hoc emitters elsewhere must start
28
+ // their terminal notices with one of these.
29
+ export const PAUSED_NOTICE_PREFIXES = ["auto-mode paused", "step-mode paused"];
30
+ export const TERMINAL_NOTICE_PREFIXES = [
31
+ "auto-mode stopped",
32
+ "step-mode stopped",
33
+ "auto-mode complete",
34
+ "no active milestone",
35
+ "auto-mode idle",
36
+ ];
37
+ /** Manual-resolution notices emitted before auto-mode can formally pause/stop. */
38
+ export function isManualResolutionNotice(message) {
39
+ return (message.includes("resolve manually and re-run /gsd auto") ||
40
+ message.includes("resolve conflicts manually and run /gsd auto to resume") ||
41
+ message.includes("resolve and run /gsd auto to resume"));
42
+ }
43
+ export function isPauseNotice(message) {
44
+ return PAUSED_NOTICE_PREFIXES.some((prefix) => message.startsWith(prefix));
45
+ }
46
+ export function isTerminalNotice(message) {
47
+ return TERMINAL_NOTICE_PREFIXES.some((prefix) => message.startsWith(prefix));
48
+ }
49
+ /** Pauses that do not require operator intervention in headless mode. */
50
+ export function isNonBlockingPauseNotice(message) {
51
+ return message.includes("idempotent advance: unit already active");
52
+ }
53
+ export function isBlockedNoticeMessage(message) {
54
+ return (message.includes("blocked:") ||
55
+ (isPauseNotice(message) && !isNonBlockingPauseNotice(message)) ||
56
+ isManualResolutionNotice(message));
57
+ }