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

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 (424) 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/models-resolver.d.ts +3 -13
  7. package/dist/models-resolver.js +3 -22
  8. package/dist/resource-loader.js +2 -14
  9. package/dist/resources/.managed-resources-content-hash +1 -1
  10. package/dist/resources/GSD-WORKFLOW.md +5 -4
  11. package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
  12. package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
  13. package/dist/resources/extensions/async-jobs/index.js +65 -0
  14. package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
  15. package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
  16. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
  17. package/dist/resources/extensions/bg-shell/overlay.js +9 -6
  18. package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
  19. package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
  20. package/dist/resources/extensions/bg-shell/utilities.js +3 -0
  21. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  22. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  23. package/dist/resources/extensions/browser-tools/index.js +69 -12
  24. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +30 -4
  25. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  26. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  27. package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
  28. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  29. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  30. package/dist/resources/extensions/gsd/auto/orchestrator.js +61 -44
  31. package/dist/resources/extensions/gsd/auto/phases.js +2 -2
  32. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
  33. package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
  34. package/dist/resources/extensions/gsd/auto-model-selection.js +25 -6
  35. package/dist/resources/extensions/gsd/auto-post-unit.js +23 -8
  36. package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
  37. package/dist/resources/extensions/gsd/auto-start.js +18 -15
  38. package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
  39. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
  40. package/dist/resources/extensions/gsd/auto-verification.js +9 -28
  41. package/dist/resources/extensions/gsd/auto-worktree.js +30 -90
  42. package/dist/resources/extensions/gsd/auto.js +4 -13
  43. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
  44. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
  45. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
  47. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
  48. package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
  49. package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
  50. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  51. package/dist/resources/extensions/gsd/captures.js +4 -6
  52. package/dist/resources/extensions/gsd/consent-question.js +337 -0
  53. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  54. package/dist/resources/extensions/gsd/constants.js +0 -2
  55. package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
  56. package/dist/resources/extensions/gsd/db/queries.js +26 -0
  57. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  58. package/dist/resources/extensions/gsd/doctor-environment.js +2 -6
  59. package/dist/resources/extensions/gsd/doctor-format.js +9 -6
  60. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
  61. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  62. package/dist/resources/extensions/gsd/error-classifier.js +9 -0
  63. package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
  64. package/dist/resources/extensions/gsd/files.js +33 -19
  65. package/dist/resources/extensions/gsd/guidance.js +158 -0
  66. package/dist/resources/extensions/gsd/guided-flow.js +17 -2
  67. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  68. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  69. package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
  70. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  71. package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
  72. package/dist/resources/extensions/gsd/milestone-closeout.js +13 -23
  73. package/dist/resources/extensions/gsd/notification-store.js +11 -4
  74. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
  75. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  76. package/dist/resources/extensions/gsd/paths.js +27 -0
  77. package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
  78. package/dist/resources/extensions/gsd/preferences-models.js +14 -48
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  83. package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
  84. package/dist/resources/extensions/gsd/prompts/system.md +5 -2
  85. package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
  86. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  87. package/dist/resources/extensions/gsd/publication.js +87 -0
  88. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  89. package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
  90. package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
  91. package/dist/resources/extensions/gsd/state.js +6 -20
  92. package/dist/resources/extensions/gsd/stop-notice.js +57 -0
  93. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  94. package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
  95. package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -10
  96. package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
  97. package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
  98. package/dist/resources/extensions/gsd/uat-policy.js +42 -16
  99. package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
  100. package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
  101. package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
  102. package/dist/resources/extensions/gsd/unit-registry.js +337 -0
  103. package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
  104. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  105. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  106. package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
  107. package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
  108. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  109. package/dist/resources/extensions/gsd/worktree-root.js +11 -0
  110. package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
  111. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  112. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  113. package/dist/resources/extensions/shared/gsd-browser-cli.js +96 -5
  114. package/dist/resources/shared/package.json +3 -0
  115. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  116. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  117. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  118. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  119. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  120. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  121. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  122. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  123. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  124. package/dist/web/standalone/.next/BUILD_ID +1 -1
  125. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  126. package/dist/web/standalone/.next/build-manifest.json +3 -3
  127. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  128. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/index.html +1 -1
  148. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  155. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  156. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  157. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  160. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  161. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  162. package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
  163. package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
  164. package/dist/web/standalone/package.json +1 -1
  165. package/dist/worktree-cli.js +3 -6
  166. package/dist/worktree-status-banner.js +7 -15
  167. package/package.json +1 -1
  168. package/packages/cloud-mcp-gateway/package.json +2 -2
  169. package/packages/contracts/dist/rpc.d.ts +1 -0
  170. package/packages/contracts/dist/rpc.d.ts.map +1 -1
  171. package/packages/contracts/dist/rpc.js.map +1 -1
  172. package/packages/contracts/dist/workflow.d.ts +4 -0
  173. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  174. package/packages/contracts/dist/workflow.js.map +1 -1
  175. package/packages/contracts/package.json +1 -1
  176. package/packages/daemon/package.json +4 -4
  177. package/packages/gsd-agent-core/package.json +5 -5
  178. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  179. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  180. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  181. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  182. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
  184. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  186. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
  187. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  188. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  189. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
  190. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  192. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
  193. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  194. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
  196. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  197. package/packages/gsd-agent-modes/package.json +7 -7
  198. package/packages/mcp-server/dist/cli.js +6 -3
  199. package/packages/mcp-server/dist/cli.js.map +1 -1
  200. package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
  201. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  202. package/packages/mcp-server/dist/workflow-tools.js +17 -1
  203. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  204. package/packages/mcp-server/package.json +3 -3
  205. package/packages/native/package.json +1 -1
  206. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
  207. package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  208. package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
  209. package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  210. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  211. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  212. package/packages/pi-agent-core/dist/index.js +3 -0
  213. package/packages/pi-agent-core/dist/index.js.map +1 -1
  214. package/packages/pi-agent-core/package.json +1 -1
  215. package/packages/pi-ai/README.md +1 -0
  216. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  217. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  218. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  219. package/packages/pi-ai/dist/models.generated.d.ts +35 -125
  220. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  221. package/packages/pi-ai/dist/models.generated.js +46 -120
  222. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  223. package/packages/pi-ai/package.json +3 -2
  224. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
  225. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
  227. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
  229. package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
  230. package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
  231. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
  232. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  233. package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
  234. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  235. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  236. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/index.js +1 -1
  238. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
  240. package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  241. package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
  242. package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
  243. package/packages/pi-coding-agent/package.json +7 -7
  244. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  245. package/packages/pi-tui/dist/tui.js +9 -0
  246. package/packages/pi-tui/dist/tui.js.map +1 -1
  247. package/packages/pi-tui/package.json +2 -2
  248. package/packages/rpc-client/package.json +2 -2
  249. package/pkg/package.json +1 -1
  250. package/src/resources/GSD-WORKFLOW.md +5 -4
  251. package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
  252. package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
  253. package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
  254. package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
  255. package/src/resources/extensions/async-jobs/index.ts +79 -0
  256. package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
  257. package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
  258. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
  259. package/src/resources/extensions/bg-shell/overlay.ts +9 -5
  260. package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
  261. package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
  262. package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
  263. package/src/resources/extensions/bg-shell/utilities.ts +3 -0
  264. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  265. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  266. package/src/resources/extensions/browser-tools/index.ts +71 -13
  267. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  268. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +29 -1
  269. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  270. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +34 -4
  271. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  272. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  273. package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
  274. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  275. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  276. package/src/resources/extensions/gsd/auto/orchestrator.ts +70 -46
  277. package/src/resources/extensions/gsd/auto/phases.ts +2 -2
  278. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
  279. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
  280. package/src/resources/extensions/gsd/auto-model-selection.ts +25 -5
  281. package/src/resources/extensions/gsd/auto-post-unit.ts +25 -8
  282. package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
  283. package/src/resources/extensions/gsd/auto-start.ts +18 -17
  284. package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
  285. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
  286. package/src/resources/extensions/gsd/auto-verification.ts +8 -26
  287. package/src/resources/extensions/gsd/auto-worktree.ts +30 -93
  288. package/src/resources/extensions/gsd/auto.ts +8 -15
  289. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
  290. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
  291. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  292. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
  293. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
  294. package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
  295. package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
  296. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  297. package/src/resources/extensions/gsd/captures.ts +4 -6
  298. package/src/resources/extensions/gsd/consent-question.ts +416 -0
  299. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  300. package/src/resources/extensions/gsd/constants.ts +0 -3
  301. package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
  302. package/src/resources/extensions/gsd/db/queries.ts +37 -0
  303. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  304. package/src/resources/extensions/gsd/doctor-environment.ts +2 -7
  305. package/src/resources/extensions/gsd/doctor-format.ts +12 -7
  306. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
  307. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  308. package/src/resources/extensions/gsd/error-classifier.ts +11 -0
  309. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  310. package/src/resources/extensions/gsd/files.ts +33 -12
  311. package/src/resources/extensions/gsd/guidance.ts +217 -0
  312. package/src/resources/extensions/gsd/guided-flow.ts +16 -2
  313. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  314. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  315. package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
  316. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  317. package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
  318. package/src/resources/extensions/gsd/milestone-closeout.ts +13 -23
  319. package/src/resources/extensions/gsd/notification-store.ts +26 -3
  320. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
  321. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  322. package/src/resources/extensions/gsd/paths.ts +33 -0
  323. package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
  324. package/src/resources/extensions/gsd/preferences-models.ts +12 -47
  325. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  326. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  327. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  328. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  329. package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
  330. package/src/resources/extensions/gsd/prompts/system.md +5 -2
  331. package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
  332. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  333. package/src/resources/extensions/gsd/publication.ts +122 -0
  334. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  335. package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
  336. package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
  337. package/src/resources/extensions/gsd/state.ts +9 -21
  338. package/src/resources/extensions/gsd/stop-notice.ts +75 -0
  339. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +22 -0
  340. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +101 -26
  341. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  342. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  343. package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
  344. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
  345. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
  346. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
  347. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  348. package/src/resources/extensions/gsd/tests/consent-question.test.ts +336 -0
  349. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  350. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
  351. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
  352. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
  353. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  354. package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
  355. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  356. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
  357. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
  358. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  359. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
  360. package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
  361. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
  362. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -58
  363. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  364. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
  365. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
  366. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
  367. package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
  368. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
  369. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  370. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +139 -0
  371. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
  372. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  373. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
  374. package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
  375. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
  376. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
  377. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
  378. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
  379. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
  380. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
  381. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
  382. package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
  383. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
  384. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
  385. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  386. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  387. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
  388. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  389. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  390. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  391. package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
  392. package/src/resources/extensions/gsd/tools/complete-slice.ts +20 -10
  393. package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
  394. package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
  395. package/src/resources/extensions/gsd/uat-policy.ts +62 -16
  396. package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
  397. package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
  398. package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
  399. package/src/resources/extensions/gsd/unit-registry.ts +412 -0
  400. package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
  401. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  402. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  403. package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
  404. package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
  405. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  406. package/src/resources/extensions/gsd/worktree-root.ts +12 -0
  407. package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
  408. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  409. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  410. package/src/resources/extensions/shared/gsd-browser-cli.ts +119 -5
  411. package/src/resources/shared/package.json +3 -0
  412. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  413. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  414. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  415. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  416. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  417. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  418. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  419. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  420. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  421. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  422. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  423. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → jmTLg6xZmAuq_LIqKOxrH}/_buildManifest.js +0 -0
  424. /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → jmTLg6xZmAuq_LIqKOxrH}/_ssgManifest.js +0 -0
@@ -0,0 +1,217 @@
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
+
10
+ import type { RecoveryFailureKind } from "./recovery-classification.js";
11
+ import type { DoctorIssueCode } from "./doctor-types.js";
12
+
13
+ // ─── Shape ──────────────────────────────────────────────────────────────
14
+
15
+ export interface Guidance {
16
+ summary: string;
17
+ steps: string[];
18
+ }
19
+
20
+ /** Flatten guidance into a notification / pause-banner string. */
21
+ export function formatGuidance(guidance: Guidance): string {
22
+ if (guidance.steps.length === 0) return guidance.summary;
23
+ const numbered = guidance.steps.map((step, index) => `${index + 1}. ${step}`).join("\n");
24
+ return `${guidance.summary}\n\n${numbered}`;
25
+ }
26
+
27
+ // ─── Recovery Classification remediation ────────────────────────────────
28
+ // Keyed by RecoveryFailureKind. The provider kind is split by transience,
29
+ // which Recovery Classification resolves before looking up guidance.
30
+
31
+ export type RecoveryGuidanceKey =
32
+ | Exclude<RecoveryFailureKind, "provider">
33
+ | "provider-transient"
34
+ | "provider-permanent";
35
+
36
+ const RECOVERY_REMEDIATION: Record<RecoveryGuidanceKey, string> = {
37
+ "tool-schema": "Fix the Unit Tool Contract or tool schema before retrying.",
38
+ "tool-contract":
39
+ "Fix the Unit Tool Contract or prompt so the Unit is only asked to use tools owned by its phase.",
40
+ "tool-unavailable":
41
+ "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.",
42
+ "deterministic-policy": "Resolve the policy blocker; retrying the same Unit will repeat the failure.",
43
+ "lifecycle-progression":
44
+ "Route to the required owning Unit or restore the missing artifact before advancing lifecycle state.",
45
+ "stale-worker":
46
+ "Run `/gsd doctor` to detect and clear the stale worker or lock, then run `/gsd auto` to resume.",
47
+ "worktree-invalid":
48
+ "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.",
49
+ "verification-drift":
50
+ "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.",
51
+ "reconciliation-drift":
52
+ "Run `/gsd doctor` to surface the persistent or repair-failed drift kinds, apply its fixes, then run `/gsd auto` to resume.",
53
+ "illegal-transition":
54
+ "A derived Phase edge rejected by the Phase Transition Invariant survived reconciliation; inspect deriveState and the State Reconciliation Module before resuming.",
55
+ "runtime-unknown": "Inspect the runtime error and add a dedicated classification if it is repeatable.",
56
+ "provider-transient": "Retry after the provider/network condition clears.",
57
+ "provider-permanent": "Inspect provider credentials, model entitlement, or request shape.",
58
+ };
59
+
60
+ export function recoveryRemediation(key: RecoveryGuidanceKey): string {
61
+ return RECOVERY_REMEDIATION[key];
62
+ }
63
+
64
+ // ─── Milestone validation blockers ──────────────────────────────────────
65
+ // NOTE: the first line of each blocker is load-bearing — validation-block-guard
66
+ // matches /milestone validation returned needs-(?:attention|remediation)/i.
67
+ // Keep that phrase intact when editing.
68
+
69
+ export function needsAttentionBlockerGuidance(milestoneId: string): string {
70
+ return [
71
+ `Milestone ${milestoneId} is blocked because milestone validation returned needs-attention.`,
72
+ `Fix options:`,
73
+ `1. Review the validation details: \`/gsd status\``,
74
+ `2. If you fixed the missing evidence or issue, re-run milestone validation: \`/gsd validate-milestone\``,
75
+ `3. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
76
+ `4. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
77
+ `After validation or override passes, run \`/gsd auto\` to complete and merge the milestone.`,
78
+ ].join("\n");
79
+ }
80
+
81
+ export function needsRemediationBlockerGuidance(milestoneId: string): string {
82
+ return [
83
+ `Milestone ${milestoneId} is blocked because milestone validation returned needs-remediation, but all slices are complete.`,
84
+ `Fix options:`,
85
+ `1. Run \`/gsd dispatch reassess\` to add remediation slices, then run \`/gsd auto\``,
86
+ `2. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
87
+ `3. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
88
+ ].join("\n");
89
+ }
90
+
91
+ // ─── Milestone closeout UAT sign-off blockers ───────────────────────────
92
+ // The first sentence is the blocker finding; the numbered steps are the
93
+ // resolution path. `verdict` is the recorded non-PASS verdict, or undefined
94
+ // when no verdict has been recorded at all.
95
+
96
+ export function uatSignoffBlockerGuidance(
97
+ milestoneId: string,
98
+ sliceId: string,
99
+ verdict?: string,
100
+ ): string {
101
+ const finding =
102
+ verdict === undefined
103
+ ? `missing UAT PASS verdict for ${sliceId}`
104
+ : `UAT verdict for ${sliceId} is "${verdict}"`;
105
+ const sliceSpecificRerunStep =
106
+ `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\`.`;
107
+ const steps =
108
+ verdict === undefined
109
+ ? [
110
+ `1. Run UAT for the most recently completed slice to record a verdict: \`/gsd dispatch uat\``,
111
+ `2. ${sliceSpecificRerunStep}`,
112
+ `3. Review the UAT criteria and progress: \`/gsd status\``,
113
+ `4. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
114
+ ]
115
+ : [
116
+ `1. Review the failing UAT findings: \`/gsd status\` (the ${sliceId} ASSESSMENT records what failed)`,
117
+ `2. Fix the issue, then re-run UAT for the most recently completed slice to record a fresh verdict: \`/gsd dispatch uat\``,
118
+ `3. ${sliceSpecificRerunStep}`,
119
+ `4. If the fix needs new implementation work, add remediation slices: \`/gsd dispatch reassess\``,
120
+ `5. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
121
+ ];
122
+ return [
123
+ `Cannot complete milestone ${milestoneId}: ${finding}. Manual UAT sign-off (PASS) is required before milestone closure.`,
124
+ `Fix options:`,
125
+ ...steps,
126
+ ].join("\n");
127
+ }
128
+
129
+ // ─── Worktree isolation degradation ─────────────────────────────────────
130
+ // The first sentence of each notice is load-bearing for log matching and
131
+ // tests — keep it intact and append guidance after it.
132
+
133
+ function restoreIsolationHint(milestoneId: string): string {
134
+ 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\`.`;
135
+ }
136
+
137
+ export function worktreeCreationFailedGuidance(milestoneId: string, error: string): string {
138
+ return [
139
+ `Auto-worktree creation for ${milestoneId} failed: ${error}. Continuing in project root.`,
140
+ `Worktree isolation is degraded for this session.`,
141
+ restoreIsolationHint(milestoneId),
142
+ ].join("\n");
143
+ }
144
+
145
+ export function isolationDegradedFallbackGuidance(milestoneId: string): string {
146
+ return [
147
+ `Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`,
148
+ `Work continues safely on the milestone branch in the project root.`,
149
+ restoreIsolationHint(milestoneId),
150
+ ].join("\n");
151
+ }
152
+
153
+ /** Hard entry blockers from auto-start: bootstrap stopped, user must act. */
154
+ export function milestoneEntryBlockedGuidance(
155
+ milestoneId: string,
156
+ reason: "creation-failed" | "isolation-degraded",
157
+ ): string {
158
+ const finding =
159
+ reason === "creation-failed"
160
+ ? `worktree/branch creation failed. Isolation is degraded.`
161
+ : `isolation is degraded from a prior worktree failure.`;
162
+ return [
163
+ `Cannot enter milestone ${milestoneId}: ${finding}`,
164
+ restoreIsolationHint(milestoneId),
165
+ `Then run \`/gsd auto\` to retry.`,
166
+ ].join("\n");
167
+ }
168
+
169
+ // ─── Crash recovery resume hints ────────────────────────────────────────
170
+
171
+ /** Resume hint for an interrupted auto-mode unit, by unit class. */
172
+ export function crashResumeHint(unitType: string, unitId: string): string | undefined {
173
+ if (unitType === "starting" && unitId === "bootstrap") {
174
+ return `No work was lost. Run /gsd auto to restart.`;
175
+ }
176
+ if (unitType.includes("research") || unitType.includes("plan")) {
177
+ return `The ${unitType} unit may be incomplete. Run /gsd auto to re-run it.`;
178
+ }
179
+ if (unitType.includes("execute")) {
180
+ return `Task execution was interrupted. Run /gsd auto to resume — completed work is preserved.`;
181
+ }
182
+ if (unitType.includes("complete")) {
183
+ return `Slice/milestone completion was interrupted. Run /gsd auto to finish.`;
184
+ }
185
+ return undefined;
186
+ }
187
+
188
+ // ─── Doctor issue fix hints ─────────────────────────────────────────────
189
+ // Partial by design: codes without a row render no hint. Add rows here as
190
+ // guidance is authored — the gap is visible in one place.
191
+
192
+ const DOCTOR_FIX_HINTS: Partial<Record<DoctorIssueCode, string>> = {
193
+ db_unavailable:
194
+ "The workflow database could not be opened — state derivation is degraded. Restart the session; if it persists, run `/gsd doctor` from the project root.",
195
+ stale_crash_lock: "Run `/gsd doctor` to clear the stale lock, then `/gsd auto` to resume.",
196
+ stale_parallel_session: "Run `/gsd doctor` to clear the stale session registration.",
197
+ unresolved_git_conflicts:
198
+ "Resolve the conflict markers, commit, then re-run `/gsd auto`.",
199
+ conflict_markers_in_tracked_files:
200
+ "Search the listed files for `<<<<<<<` markers, resolve, and commit.",
201
+ worktree_dirty:
202
+ "Commit or merge the worktree's changes (`gsd worktree merge <name>`) before removing it.",
203
+ worktree_branch_merged: "The branch is merged — remove the worktree to reclaim space.",
204
+ orphaned_auto_worktree: "Run `/gsd doctor` to fix, or merge salvageable work with `gsd worktree merge <name>`.",
205
+ gitignore_missing_patterns: "Run `/gsd doctor` to append the missing .gitignore patterns.",
206
+ invalid_preferences: "Edit .gsd/PREFERENCES.md to fix the invalid field, then re-run the command.",
207
+ provider_key_missing: "Add the provider API key to your environment or provider config, then retry.",
208
+ provider_key_backedoff: "The key is cooling down after repeated failures — wait, or switch the phase model in .gsd/PREFERENCES.md.",
209
+ state_file_stale: "Run `/gsd doctor` to rebuild the projection from the database.",
210
+ state_file_missing: "Run `/gsd doctor` to rebuild the projection from the database.",
211
+ projection_drift: "Run `/gsd doctor` to rebuild markdown projections from the database (DB is the source of truth).",
212
+ uat_retry_exhausted: "Review the failing UAT criteria via `/gsd status`, fix the issue, then re-run `/gsd auto`.",
213
+ };
214
+
215
+ export function doctorFixHint(code: DoctorIssueCode): string | undefined {
216
+ return DOCTOR_FIX_HINTS[code];
217
+ }
@@ -90,7 +90,7 @@ import {
90
90
  } from "./preparation.js";
91
91
  import { verifyExpectedArtifact } from "./auto-recovery.js";
92
92
  import type { MilestoneScope } from "./workspace.js";
93
- import { getPendingGate } from "./bootstrap/write-gate.js";
93
+ import { clearPendingGate, extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
94
94
  import {
95
95
  _getPendingAutoStart,
96
96
  clearPendingAutoStart,
@@ -100,7 +100,7 @@ import {
100
100
  setPendingAutoStart,
101
101
  } from "./pending-auto-start.js";
102
102
  import { clearGuidedUnitContext, setGuidedUnitContext } from "./guided-unit-context.js";
103
- import { scheduleAutoStartAfterIdle } from "./discussion-handoff.js";
103
+ import { checkAutoStartAfterDiscuss, scheduleAutoStartAfterIdle } from "./discussion-handoff.js";
104
104
  export {
105
105
  maybeHandleEmptyIntentTurn,
106
106
  maybeHandleReadyPhraseWithoutFiles,
@@ -1959,6 +1959,20 @@ export async function showSmartEntry(
1959
1959
  // Stale entry from an interrupted discussion — clear and continue
1960
1960
  deletePendingAutoStart(basePath);
1961
1961
  } else {
1962
+ if (milestoneHasContext && !isAgentTurnInFlight(ctx)) {
1963
+ // The discussion already produced CONTEXT but the agent_end handoff
1964
+ // never consumed the entry — e.g. an external-engine post-hoc gate
1965
+ // re-arm wiped the depth verification after the save (write-gate
1966
+ // two-process sync). CONTEXT can only be written through a verified
1967
+ // depth gate, so a gate still pending for this milestone is stale:
1968
+ // clear it and re-run the handoff instead of dead-ending.
1969
+ const gateBasePath = entry.scope.workspace.projectRoot;
1970
+ const pendingGateId = getPendingGate(gateBasePath);
1971
+ if (pendingGateId && extractDepthVerificationMilestoneId(pendingGateId) === entry.milestoneId) {
1972
+ clearPendingGate(gateBasePath);
1973
+ }
1974
+ if (checkAutoStartAfterDiscuss(basePath)) return;
1975
+ }
1962
1976
  ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
1963
1977
  return;
1964
1978
  }
@@ -911,6 +911,17 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
911
911
  return stale;
912
912
  }
913
913
 
914
+ /**
915
+ * Render-verification helper: does the rendered ROADMAP markdown mark a slice
916
+ * as done? Used by completion code to verify/repair the *projection* after a
917
+ * DB write — never as a source of truth for dispatch or completion decisions
918
+ * (ADR-017). Lives here so decision-path modules need not import
919
+ * parsers-legacy directly.
920
+ */
921
+ export function roadmapRenderMarksSliceDone(roadmapContent: string, sliceId: string): boolean {
922
+ return parseRoadmap(roadmapContent).slices.some((slice) => slice.id === sliceId && slice.done);
923
+ }
924
+
914
925
  // ─── Stale Repair ─────────────────────────────────────────────────────────
915
926
  // Body relocated to state-reconciliation/drift/stale-render.ts (ADR-017 #5702).
916
927
  // detectStaleRenders above stays as a useful diagnostic primitive; the
@@ -3,6 +3,7 @@ import { homedir } from "node:os";
3
3
  import { resolve } from "node:path";
4
4
 
5
5
  import type { ClaudeCodeMcpConfig } from "./preferences-types.js";
6
+ import { isGsdBrowserMcpServerConfig } from "../shared/gsd-browser-cli.js";
6
7
  import { toMcpWildcardToolName } from "./mcp-tool-name.js";
7
8
  import { resolveModelMcpConfig } from "./preferences-mcp.js";
8
9
 
@@ -83,34 +84,12 @@ function isWorkflowMcpServerConfig(config: unknown): boolean {
83
84
  return args.some((arg) => arg.includes("gsd-mcp-server") || arg.includes("packages/mcp-server"));
84
85
  }
85
86
 
86
- function isBrowserMcpServerConfig(config: unknown): boolean {
87
- if (!isRecord(config)) return false;
88
- const command = typeof config.command === "string" ? config.command : "";
89
- if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
90
- return true;
91
- }
92
-
93
- const env = config.env;
94
- if (isRecord(env)) {
95
- if (
96
- typeof env.GSD_BROWSER_CLI_PATH === "string"
97
- || typeof env.GSD_BROWSER_BIN_PATH === "string"
98
- || typeof env.GSD_BROWSER_MCP_COMMAND === "string"
99
- ) {
100
- return true;
101
- }
102
- }
103
-
104
- const args = Array.isArray(config.args) ? config.args.filter((arg): arg is string => typeof arg === "string") : [];
105
- return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
106
- }
107
-
108
87
  export function discoverWorkflowMcpServerName(projectDir: string): string | undefined {
109
88
  return discoverMcpServers(projectDir).find((server) => isWorkflowMcpServerConfig(server.config))?.name;
110
89
  }
111
90
 
112
91
  export function discoverBrowserMcpServerName(projectDir: string): string | undefined {
113
- return discoverMcpServers(projectDir).find((server) => isBrowserMcpServerConfig(server.config))?.name;
92
+ return discoverMcpServers(projectDir).find((server) => isGsdBrowserMcpServerConfig(server.config))?.name;
114
93
  }
115
94
 
116
95
  export function discoverMcpServerNames(projectDir: string): string[] {
@@ -1,5 +1,7 @@
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
+
4
+ import { parseMcpToolName as parsePiAiMcpToolName, stripMcpToolPrefix } from "@gsd/pi-ai";
3
5
 
4
6
  const MCP_TOOL_PREFIX = "mcp__";
5
7
 
@@ -9,18 +11,11 @@ export interface ParsedMcpToolName {
9
11
  }
10
12
 
11
13
  export function parseMcpToolName(toolName: string): ParsedMcpToolName | null {
12
- if (!toolName.startsWith(MCP_TOOL_PREFIX)) return null;
13
- const toolSeparator = toolName.indexOf("__", MCP_TOOL_PREFIX.length);
14
- if (toolSeparator < 0) return null;
15
- return {
16
- serverName: toolName.slice(MCP_TOOL_PREFIX.length, toolSeparator),
17
- toolName: toolName.slice(toolSeparator + 2),
18
- };
14
+ const parsed = parsePiAiMcpToolName(toolName);
15
+ return parsed ? { serverName: parsed.server, toolName: parsed.tool } : null;
19
16
  }
20
17
 
21
- export function stripMcpToolPrefix(toolName: string): string {
22
- return parseMcpToolName(toolName)?.toolName ?? toolName;
23
- }
18
+ export { stripMcpToolPrefix };
24
19
 
25
20
  export function toMcpToolName(serverName: string, toolName: string): string {
26
21
  return `${MCP_TOOL_PREFIX}${serverName}__${toolName}`;
@@ -264,7 +264,7 @@ export function reportConsolidationGaps(basePath: string): ConsolidationGapRepor
264
264
  try {
265
265
  const report = scanConsolidationGaps(basePath);
266
266
  if (report.totalGaps === 0) return report;
267
- appendNotification(report.summary, "warning", "workflow-logger");
267
+ appendNotification(report.summary, "warning", "workflow-logger", { kind: "memory-consolidation" });
268
268
  logWarning("memory-consolidation", report.summary);
269
269
  return report;
270
270
  } catch (e) {
@@ -10,6 +10,7 @@ import { readCrashLock, isLockProcessAlive } from "../crash-recovery.js";
10
10
  import { closeWorkflowDatabase } from "../db-workspace.js";
11
11
  import { readPausedSessionMetadata } from "../interrupted-session.js";
12
12
  import { gsdRoot } from "../paths.js";
13
+ import { canonicalWorktreesDir } from "../worktree-placement.js";
13
14
  import type { MigrationPreview } from "./writer.js";
14
15
 
15
16
  export interface MigrationPaths {
@@ -106,8 +107,10 @@ export function assertMigrationHasSlices(preview: MigrationPreview): void {
106
107
  }
107
108
 
108
109
  function hasWorktreeState(targetRoot: string): boolean {
110
+ // Legacy container is probed via gsdRoot() (symlink-resolved) on purpose —
111
+ // migration targets may have .gsd in the external-state layout.
109
112
  const containers = [
110
- join(targetRoot, ".gsd-worktrees"),
113
+ canonicalWorktreesDir(targetRoot),
111
114
  join(gsdRoot(targetRoot), "worktrees"),
112
115
  ];
113
116
  for (const worktreesDir of containers) {
@@ -6,12 +6,12 @@
6
6
  // - recovery: DB repair from artifacts, then GitHub finalize
7
7
 
8
8
  import { loadFile } from "./files.js";
9
- import { parseRoadmap } from "./parsers-legacy.js";
10
9
  import { resolveMilestoneFile } from "./paths.js";
11
- import { getMilestone, getMilestoneSlices, isDbAvailable } from "./gsd-db.js";
10
+ import { getMilestone, getClosedSliceIds, isDbAvailable } from "./gsd-db.js";
12
11
  import { isClosedStatus } from "./status-guards.js";
13
12
  import { runSafely } from "./auto-utils.js";
14
13
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
14
+ import { uatSignoffBlockerGuidance } from "./guidance.js";
15
15
  import { logWarning } from "./workflow-logger.js";
16
16
  import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
17
17
  import { buildCompleteMilestonePrompt } from "./auto-prompts.js";
@@ -86,31 +86,21 @@ export async function evaluateCompleteMilestoneDispatch(
86
86
  if (closeoutGitStop) return closeoutGitStop;
87
87
 
88
88
  if (prefs?.uat_dispatch) {
89
- let closedSliceIds: string[];
90
- if (isDbAvailable()) {
91
- closedSliceIds = getMilestoneSlices(mid)
92
- .filter((slice) => isClosedStatus(slice.status))
93
- .map((slice) => slice.id);
94
- } else {
95
- const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
96
- const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
97
- if (!roadmapContent) {
98
- return {
99
- action: "stop",
100
- reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because ROADMAP is unavailable while DB is not accessible.`,
101
- level: "warning",
102
- };
103
- }
104
- const roadmap = parseRoadmap(roadmapContent);
105
- closedSliceIds = roadmap.slices.filter((slice) => slice.done).map((slice) => slice.id);
89
+ // DB-authoritative (ADR-017): UAT sign-off gating never parses the
90
+ // ROADMAP projection. Without a DB we cannot verify — stop conservatively.
91
+ if (!isDbAvailable()) {
92
+ return {
93
+ action: "stop",
94
+ reason: `Cannot complete milestone ${mid}: unable to verify UAT verdicts because the workflow DB is not accessible.`,
95
+ level: "warning",
96
+ };
106
97
  }
107
-
108
- for (const sliceId of closedSliceIds) {
98
+ for (const sliceId of getClosedSliceIds(mid)) {
109
99
  const result = await readUatGateVerdict(basePath, mid, sliceId);
110
100
  if (!result) {
111
101
  return {
112
102
  action: "stop",
113
- reason: `Cannot complete milestone ${mid}: missing UAT PASS verdict for ${sliceId}. Manual UAT sign-off (PASS) is required before milestone closure.`,
103
+ reason: uatSignoffBlockerGuidance(mid, sliceId),
114
104
  level: "warning",
115
105
  };
116
106
  }
@@ -118,7 +108,7 @@ export async function evaluateCompleteMilestoneDispatch(
118
108
  if (!isAcceptableUatVerdict(verdict, uatType)) {
119
109
  return {
120
110
  action: "stop",
121
- reason: `Cannot complete milestone ${mid}: UAT verdict for ${sliceId} is "${verdict}". Manual UAT sign-off (PASS) is required before milestone closure.`,
111
+ reason: uatSignoffBlockerGuidance(mid, sliceId, verdict),
122
112
  level: "warning",
123
113
  };
124
114
  }
@@ -12,6 +12,17 @@ import { randomUUID } from "node:crypto";
12
12
  export type NotifySeverity = "info" | "success" | "warning" | "error";
13
13
  export type NotificationSource = "notify" | "workflow-logger";
14
14
 
15
+ /**
16
+ * Optional structured identity for a notification. When present, `kind`
17
+ * (a stable machine name like "auto-stop" or "provider-error-pause") plus
18
+ * `scope` (e.g. a milestone/slice id) — not the prose — key deduplication,
19
+ * and consumers can filter without parsing message text.
20
+ */
21
+ export interface NotificationMeta {
22
+ kind?: string;
23
+ scope?: string;
24
+ }
25
+
15
26
  export interface NotificationEntry {
16
27
  id: string;
17
28
  ts: string;
@@ -19,6 +30,8 @@ export interface NotificationEntry {
19
30
  message: string;
20
31
  source: NotificationSource;
21
32
  read: boolean;
33
+ kind?: string;
34
+ scope?: string;
22
35
  }
23
36
 
24
37
  // ─── Constants ──────────────────────────────────────────────────────────
@@ -60,11 +73,15 @@ export function appendNotification(
60
73
  message: string,
61
74
  severity: NotifySeverity,
62
75
  source: NotificationSource = "notify",
76
+ meta?: NotificationMeta,
63
77
  ): void {
64
78
  if (!_basePath) return;
65
79
  if (_suppressCount > 0) return;
66
80
  const persistedMessage = message.length > 500 ? message.slice(0, 500) + "…" : message;
67
- const dedupKey = `${_basePath}:${severity}:${source}:${persistedMessage}`;
81
+ // Structured identity (kind + scope) keys dedup when present, so a rephrased
82
+ // message of the same event still dedups; otherwise fall back to the prose.
83
+ const identity = meta?.kind ? `${meta.kind}:${meta.scope ?? ""}` : persistedMessage;
84
+ const dedupKey = `${_basePath}:${severity}:${source}:${identity}`;
68
85
  const now = Date.now();
69
86
  const lastSeen = _recentMessageTimestamps.get(dedupKey);
70
87
  if (lastSeen !== undefined && now - lastSeen < DEDUP_WINDOW_MS) return;
@@ -82,6 +99,8 @@ export function appendNotification(
82
99
  message: persistedMessage,
83
100
  source,
84
101
  read: false,
102
+ ...(meta?.kind ? { kind: meta.kind } : {}),
103
+ ...(meta?.scope ? { scope: meta.scope } : {}),
85
104
  };
86
105
 
87
106
  try {
@@ -102,11 +121,15 @@ export function appendNotification(
102
121
 
103
122
  /**
104
123
  * Read all notification entries from disk. Returns newest-first.
124
+ * An optional filter narrows by structured identity (kind and/or scope).
105
125
  */
106
- export function readNotifications(basePath?: string): NotificationEntry[] {
126
+ export function readNotifications(basePath?: string, filter?: NotificationMeta): NotificationEntry[] {
107
127
  const bp = basePath ?? _basePath;
108
128
  if (!bp) return [];
109
- return _readEntriesFromDisk(bp).reverse();
129
+ const entries = _readEntriesFromDisk(bp).filter(
130
+ (e) => (!filter?.kind || e.kind === filter.kind) && (!filter?.scope || e.scope === filter.scope),
131
+ );
132
+ return entries.reverse();
110
133
  }
111
134
 
112
135
  /**
@@ -128,8 +128,7 @@ function discoverWorkers(basePath: string): string[] {
128
128
  return [...mids].sort();
129
129
  }
130
130
 
131
- function querySliceProgress(basePath: string, mid: string): SliceProgress[] {
132
- const workRoot = worktreePathFor(basePath, mid);
131
+ function querySliceProgress(basePath: string, mid: string, workRoot: string = worktreePathFor(basePath, mid)): SliceProgress[] {
133
132
  const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
134
133
  if (!existsSync(dbPath)) return [];
135
134
 
@@ -193,9 +192,12 @@ function collectWorkerData(basePath: string): WorkerView[] {
193
192
  const workers: WorkerView[] = [];
194
193
 
195
194
  for (const mid of mids) {
195
+ // Resolve the worktree path once per worker per tick — this runs on a
196
+ // 5-second refresh interval and worktreePathFor probes the filesystem.
197
+ const workRoot = worktreePathFor(basePath, mid);
196
198
  const status = readJsonSafe<StatusJson>(join(parallelDir, `${mid}.status.json`));
197
- const lock = readJsonSafe<AutoLock>(join(worktreePathFor(basePath, mid), ".gsd", "auto.lock"));
198
- const slices = querySliceProgress(basePath, mid);
199
+ const lock = readJsonSafe<AutoLock>(join(workRoot, ".gsd", "auto.lock"));
200
+ const slices = querySliceProgress(basePath, mid, workRoot);
199
201
 
200
202
  const pid = lock?.pid || status?.pid || 0;
201
203
  const alive = pid ? isPidAlive(pid) : false;
@@ -1,10 +1,22 @@
1
1
  // GSD Extension - Legacy Parsers
2
2
  // parseRoadmap() and parsePlan() extracted from files.ts.
3
- // Used only by: md-importer.ts (migration), state.ts (pre-migration fallback),
4
- // markdown-renderer.ts (detectStaleRenders disk-vs-DB comparison),
5
- // commands-maintenance.ts (cold-path branch cleanup), and tests.
6
3
  //
7
- // NOT used in the dispatch loop or any hot-path runtime code.
4
+ // ADR-017: the DB is the single source of truth; `.gsd/*.md` files are
5
+ // projections. These parsers may be imported ONLY for:
6
+ // - migration/import (md-importer, workflow-migration, migration-auto-check)
7
+ // - drift detection that compares both sources by design
8
+ // (state-reconciliation/drift, markdown-renderer stale-render detection)
9
+ // - explicit pre-migration / DB-unavailable fallbacks (state.ts,
10
+ // reactive-graph.ts, auto-recovery.ts)
11
+ // - diagnostics and display/telemetry-only surfaces (doctor,
12
+ // doctor-git-checks, workspace-index, visualizer-data, auto-prompts
13
+ // context text, commands-maintenance, milestone-closeout, github-sync)
14
+ // - tests
15
+ //
16
+ // Dispatch/gate/completion DECISION paths must NOT import this module — they
17
+ // read the DB via gsd-db queries (e.g. getMilestoneSliceSummaries). Enforced
18
+ // by tests/parsers-legacy-importers.test.ts; new importers must be added to
19
+ // its allowlist with a one-line justification.
8
20
 
9
21
  import { extractSection, parseBullets, extractBoldField, extractAllSections, registerCacheClearCallback } from './files.js';
10
22
  import { splitFrontmatter } from '../shared/frontmatter.js';
@@ -148,6 +148,39 @@ export function clearPathCache(): void {
148
148
 
149
149
  // ─── Name Builders ─────────────────────────────────────────────────────────
150
150
 
151
+ /** Directories owned by the GSD framework — metadata, never project source. */
152
+ export const FRAMEWORK_METADATA_DIRS: readonly string[] = [".gsd", ".planning", ".audits"];
153
+
154
+ /**
155
+ * Every artifact suffix used with the name builders below — the single source
156
+ * for the `<ID>-<SUFFIX>.md` naming vocabulary. Extend this list when a new
157
+ * artifact type is introduced; consumers (md-importer walking, pre-execution
158
+ * artifact detection) pick it up from here.
159
+ */
160
+ export const PLANNING_ARTIFACT_SUFFIXES: readonly string[] = [
161
+ "CONTEXT",
162
+ "CONTEXT-DRAFT",
163
+ "ROADMAP",
164
+ "PLAN",
165
+ "REPLAN",
166
+ "SUMMARY",
167
+ "RESEARCH",
168
+ "VALIDATION",
169
+ "ASSESSMENT",
170
+ "UAT",
171
+ "DISCUSSION",
172
+ "EVAL-REVIEW",
173
+ "PARKED",
174
+ "VERIFICATION-FAILED",
175
+ "CONTINUE",
176
+ ];
177
+
178
+ /** Matches a bare planning-artifact file name, e.g. "M001-CONTEXT.md", "S01-PLAN.md". */
179
+ export const PLANNING_ARTIFACT_NAME_RE = new RegExp(
180
+ `^[MST]\\d+-(${PLANNING_ARTIFACT_SUFFIXES.join("|")})\\.md$`,
181
+ "i",
182
+ );
183
+
151
184
  /**
152
185
  * Build a milestone-level file name.
153
186
  * ("M001", "CONTEXT") → "M001-CONTEXT.md"