gsd-pi 2.70.1 → 2.71.0-dev.4c35d99

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 (533) hide show
  1. package/README.md +57 -17
  2. package/dist/cli.js +29 -3
  3. package/dist/headless-events.d.ts +2 -0
  4. package/dist/headless-events.js +7 -0
  5. package/dist/headless.js +16 -3
  6. package/dist/mcp-server.js +40 -17
  7. package/dist/provider-migrations.d.ts +10 -0
  8. package/dist/provider-migrations.js +12 -0
  9. package/dist/resource-loader.js +139 -13
  10. package/dist/resources/GSD-WORKFLOW.md +1 -1
  11. package/dist/resources/agents/debugger.md +58 -0
  12. package/dist/resources/agents/doc-writer.md +43 -0
  13. package/dist/resources/agents/git-ops.md +56 -0
  14. package/dist/resources/agents/javascript-pro.md +46 -271
  15. package/dist/resources/agents/planner.md +55 -0
  16. package/dist/resources/agents/refactorer.md +47 -0
  17. package/dist/resources/agents/reviewer.md +48 -0
  18. package/dist/resources/agents/security.md +59 -0
  19. package/dist/resources/agents/tester.md +50 -0
  20. package/dist/resources/agents/typescript-pro.md +41 -235
  21. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +242 -40
  22. package/dist/resources/extensions/get-secrets-from-user.js +17 -1
  23. package/dist/resources/extensions/gsd/auto/infra-errors.js +34 -0
  24. package/dist/resources/extensions/gsd/auto/loop.js +32 -1
  25. package/dist/resources/extensions/gsd/auto/phases.js +5 -1
  26. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  27. package/dist/resources/extensions/gsd/auto-dashboard.js +22 -16
  28. package/dist/resources/extensions/gsd/auto-model-selection.js +10 -2
  29. package/dist/resources/extensions/gsd/auto-prompts.js +88 -33
  30. package/dist/resources/extensions/gsd/auto-start.js +37 -18
  31. package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
  32. package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
  33. package/dist/resources/extensions/gsd/auto.js +56 -0
  34. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
  35. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +6 -0
  36. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +63 -51
  37. package/dist/resources/extensions/gsd/bootstrap/system-context.js +6 -0
  38. package/dist/resources/extensions/gsd/commands/context.js +15 -6
  39. package/dist/resources/extensions/gsd/commands/dispatcher.js +12 -2
  40. package/dist/resources/extensions/gsd/commands/handlers/auto.js +10 -33
  41. package/dist/resources/extensions/gsd/commands/handlers/core.js +56 -11
  42. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +15 -6
  43. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +4 -10
  44. package/dist/resources/extensions/gsd/custom-workflow-engine.js +16 -12
  45. package/dist/resources/extensions/gsd/dashboard-overlay.js +8 -3
  46. package/dist/resources/extensions/gsd/dispatch-guard.js +18 -1
  47. package/dist/resources/extensions/gsd/doctor-providers.js +23 -0
  48. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  49. package/dist/resources/extensions/gsd/file-lock.js +60 -0
  50. package/dist/resources/extensions/gsd/forensics.js +19 -6
  51. package/dist/resources/extensions/gsd/gate-registry.js +208 -0
  52. package/dist/resources/extensions/gsd/gsd-db.js +41 -0
  53. package/dist/resources/extensions/gsd/guided-flow.js +17 -20
  54. package/dist/resources/extensions/gsd/init-wizard.js +3 -11
  55. package/dist/resources/extensions/gsd/metrics.js +1 -0
  56. package/dist/resources/extensions/gsd/milestone-actions.js +10 -4
  57. package/dist/resources/extensions/gsd/milestone-validation-gates.js +11 -12
  58. package/dist/resources/extensions/gsd/notification-overlay.js +42 -13
  59. package/dist/resources/extensions/gsd/notification-store.js +56 -5
  60. package/dist/resources/extensions/gsd/notification-widget.js +5 -13
  61. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +8 -3
  62. package/dist/resources/extensions/gsd/pre-execution-checks.js +35 -2
  63. package/dist/resources/extensions/gsd/prompt-validation.js +126 -0
  64. package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -3
  65. package/dist/resources/extensions/gsd/prompts/discuss.md +33 -13
  66. package/dist/resources/extensions/gsd/prompts/execute-task.md +22 -19
  67. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  68. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
  69. package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
  70. package/dist/resources/extensions/gsd/prompts/queue.md +3 -2
  71. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  72. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
  73. package/dist/resources/extensions/gsd/session-model-override.js +25 -0
  74. package/dist/resources/extensions/gsd/shortcut-defs.js +40 -0
  75. package/dist/resources/extensions/gsd/state.js +241 -332
  76. package/dist/resources/extensions/gsd/tools/complete-slice.js +52 -1
  77. package/dist/resources/extensions/gsd/tools/complete-task.js +51 -1
  78. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +38 -1
  79. package/dist/resources/extensions/gsd/workflow-events.js +25 -13
  80. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +56 -0
  81. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -1
  82. package/dist/resources/extensions/ollama/index.js +13 -5
  83. package/dist/resources/extensions/shared/gsd-phase-state.js +35 -0
  84. package/dist/resources/extensions/subagent/agents.js +8 -0
  85. package/dist/resources/extensions/subagent/index.js +17 -0
  86. package/dist/resources/skills/create-skill/SKILL.md +2 -0
  87. package/dist/startup-model-validation.d.ts +0 -1
  88. package/dist/startup-model-validation.js +6 -2
  89. package/dist/web/standalone/.next/BUILD_ID +1 -1
  90. package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
  91. package/dist/web/standalone/.next/build-manifest.json +4 -4
  92. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  93. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  94. package/dist/web/standalone/.next/required-server-files.json +3 -3
  95. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  96. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  106. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  109. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  110. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  112. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  134. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  154. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  164. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  186. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  190. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/index.html +1 -1
  200. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  201. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  202. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  203. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  205. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app/page.js +2 -2
  207. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
  209. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  210. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  211. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/middleware.js +2 -2
  214. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  216. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  217. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  218. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  219. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +9 -0
  220. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  221. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  222. package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/{webpack-6e4d7e9a4f57bed4.js → webpack-b868033a5834586d.js} +1 -1
  226. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  227. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  228. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  229. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  230. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  231. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  232. package/dist/web/standalone/server.js +1 -1
  233. package/package.json +1 -1
  234. package/packages/mcp-server/dist/env-writer.d.ts +39 -0
  235. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -0
  236. package/packages/mcp-server/dist/env-writer.js +158 -0
  237. package/packages/mcp-server/dist/env-writer.js.map +1 -0
  238. package/packages/mcp-server/dist/server.d.ts +23 -3
  239. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  240. package/packages/mcp-server/dist/server.js +192 -44
  241. package/packages/mcp-server/dist/server.js.map +1 -1
  242. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  243. package/packages/mcp-server/dist/workflow-tools.js +22 -12
  244. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  245. package/packages/mcp-server/src/env-writer.test.ts +280 -0
  246. package/packages/mcp-server/src/env-writer.ts +183 -0
  247. package/packages/mcp-server/src/secure-env-collect.test.ts +265 -0
  248. package/packages/mcp-server/src/server.ts +247 -41
  249. package/packages/mcp-server/src/workflow-tools.test.ts +110 -0
  250. package/packages/mcp-server/src/workflow-tools.ts +32 -12
  251. package/packages/pi-ai/dist/providers/amazon-bedrock.js +11 -2
  252. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  253. package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts +2 -0
  254. package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts.map +1 -0
  255. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +20 -0
  256. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -0
  257. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +4 -1
  258. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  259. package/packages/pi-ai/dist/providers/anthropic-shared.js +8 -3
  260. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  261. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +44 -1
  262. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  263. package/packages/pi-ai/dist/providers/anthropic.d.ts +2 -1
  264. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  265. package/packages/pi-ai/dist/providers/anthropic.js +7 -4
  266. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  267. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  268. package/packages/pi-ai/dist/providers/openai-completions.js +11 -0
  269. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  270. package/packages/pi-ai/src/providers/amazon-bedrock.ts +13 -1
  271. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +32 -0
  272. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +55 -1
  273. package/packages/pi-ai/src/providers/anthropic-shared.ts +14 -3
  274. package/packages/pi-ai/src/providers/anthropic.ts +8 -4
  275. package/packages/pi-ai/src/providers/openai-completions.ts +14 -0
  276. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts +2 -0
  277. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts.map +1 -0
  278. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js +61 -0
  279. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js.map +1 -0
  280. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/agent-session.js +2 -1
  282. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +10 -0
  284. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/auth-storage.js +27 -0
  286. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +85 -0
  288. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.d.ts +2 -0
  290. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.d.ts.map +1 -0
  291. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +388 -0
  292. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -0
  293. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -0
  294. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts +2 -0
  297. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts.map +1 -0
  298. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js +64 -0
  299. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js.map +1 -0
  300. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/model-resolver.js +22 -18
  302. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts +8 -0
  304. package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts.map +1 -0
  305. package/packages/pi-coding-agent/dist/core/model-resolver.test.js +75 -0
  306. package/packages/pi-coding-agent/dist/core/model-resolver.test.js.map +1 -0
  307. package/packages/pi-coding-agent/dist/core/sdk.d.ts +11 -0
  308. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/sdk.js +38 -5
  310. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/core/sdk.test.d.ts +2 -0
  312. package/packages/pi-coding-agent/dist/core/sdk.test.d.ts.map +1 -0
  313. package/packages/pi-coding-agent/dist/core/sdk.test.js +71 -0
  314. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -0
  315. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  316. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  317. package/packages/pi-coding-agent/dist/index.js +1 -1
  318. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts +2 -0
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts.map +1 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js +13 -0
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js.map +1 -0
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts +19 -2
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +50 -1
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts +1 -0
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +1 -0
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +4 -0
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +24 -2
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +9 -2
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +4 -0
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +43 -0
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +175 -25
  344. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.d.ts.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js +6 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  351. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +6 -0
  352. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +62 -5
  354. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +4 -2
  356. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  359. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -0
  360. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  362. package/packages/pi-coding-agent/package.json +1 -1
  363. package/packages/pi-coding-agent/src/core/agent-session-renderable-tools.test.ts +70 -0
  364. package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
  365. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +108 -0
  366. package/packages/pi-coding-agent/src/core/auth-storage.ts +30 -0
  367. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +468 -0
  368. package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -0
  369. package/packages/pi-coding-agent/src/core/model-resolver-initial-model-auth.test.ts +78 -0
  370. package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
  371. package/packages/pi-coding-agent/src/core/model-resolver.ts +22 -18
  372. package/packages/pi-coding-agent/src/core/sdk.test.ts +89 -0
  373. package/packages/pi-coding-agent/src/core/sdk.ts +45 -9
  374. package/packages/pi-coding-agent/src/index.ts +1 -0
  375. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
  376. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +58 -2
  377. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +2 -0
  378. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +30 -2
  379. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +15 -6
  380. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +47 -0
  381. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +205 -31
  382. package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +6 -1
  383. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -0
  384. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +70 -5
  385. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +4 -2
  386. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
  387. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +1 -0
  388. package/packages/pi-tui/dist/components/__tests__/input.test.js +9 -0
  389. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  390. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.d.ts +2 -0
  391. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.d.ts.map +1 -0
  392. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +66 -0
  393. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -0
  394. package/packages/pi-tui/dist/components/input.d.ts +2 -0
  395. package/packages/pi-tui/dist/components/input.d.ts.map +1 -1
  396. package/packages/pi-tui/dist/components/input.js +7 -4
  397. package/packages/pi-tui/dist/components/input.js.map +1 -1
  398. package/packages/pi-tui/dist/components/markdown.d.ts +3 -0
  399. package/packages/pi-tui/dist/components/markdown.d.ts.map +1 -1
  400. package/packages/pi-tui/dist/components/markdown.js +17 -1
  401. package/packages/pi-tui/dist/components/markdown.js.map +1 -1
  402. package/packages/pi-tui/src/components/__tests__/input.test.ts +11 -0
  403. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +75 -0
  404. package/packages/pi-tui/src/components/input.ts +7 -4
  405. package/packages/pi-tui/src/components/markdown.ts +22 -1
  406. package/pkg/package.json +1 -1
  407. package/src/resources/GSD-WORKFLOW.md +1 -1
  408. package/src/resources/agents/debugger.md +58 -0
  409. package/src/resources/agents/doc-writer.md +43 -0
  410. package/src/resources/agents/git-ops.md +56 -0
  411. package/src/resources/agents/javascript-pro.md +46 -271
  412. package/src/resources/agents/planner.md +55 -0
  413. package/src/resources/agents/refactorer.md +47 -0
  414. package/src/resources/agents/reviewer.md +48 -0
  415. package/src/resources/agents/security.md +59 -0
  416. package/src/resources/agents/tester.md +50 -0
  417. package/src/resources/agents/typescript-pro.md +41 -235
  418. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +288 -39
  419. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +330 -2
  420. package/src/resources/extensions/get-secrets-from-user.ts +24 -1
  421. package/src/resources/extensions/gsd/auto/infra-errors.ts +38 -0
  422. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  423. package/src/resources/extensions/gsd/auto/loop.ts +45 -1
  424. package/src/resources/extensions/gsd/auto/phases.ts +6 -0
  425. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  426. package/src/resources/extensions/gsd/auto-dashboard.ts +29 -18
  427. package/src/resources/extensions/gsd/auto-model-selection.ts +9 -1
  428. package/src/resources/extensions/gsd/auto-prompts.ts +111 -33
  429. package/src/resources/extensions/gsd/auto-start.ts +44 -20
  430. package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
  431. package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
  432. package/src/resources/extensions/gsd/auto.ts +72 -0
  433. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
  434. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +6 -0
  435. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +79 -60
  436. package/src/resources/extensions/gsd/bootstrap/system-context.ts +7 -0
  437. package/src/resources/extensions/gsd/commands/context.ts +16 -5
  438. package/src/resources/extensions/gsd/commands/dispatcher.ts +14 -2
  439. package/src/resources/extensions/gsd/commands/handlers/auto.ts +10 -36
  440. package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -11
  441. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +17 -7
  442. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +4 -10
  443. package/src/resources/extensions/gsd/custom-workflow-engine.ts +19 -14
  444. package/src/resources/extensions/gsd/dashboard-overlay.ts +10 -3
  445. package/src/resources/extensions/gsd/dispatch-guard.ts +18 -1
  446. package/src/resources/extensions/gsd/doctor-providers.ts +24 -0
  447. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  448. package/src/resources/extensions/gsd/file-lock.ts +59 -0
  449. package/src/resources/extensions/gsd/forensics.ts +23 -7
  450. package/src/resources/extensions/gsd/gate-registry.ts +251 -0
  451. package/src/resources/extensions/gsd/gsd-db.ts +51 -0
  452. package/src/resources/extensions/gsd/guided-flow.ts +17 -19
  453. package/src/resources/extensions/gsd/init-wizard.ts +3 -13
  454. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  455. package/src/resources/extensions/gsd/metrics.ts +12 -1
  456. package/src/resources/extensions/gsd/milestone-actions.ts +10 -3
  457. package/src/resources/extensions/gsd/milestone-validation-gates.ts +11 -13
  458. package/src/resources/extensions/gsd/notification-overlay.ts +47 -14
  459. package/src/resources/extensions/gsd/notification-store.ts +54 -5
  460. package/src/resources/extensions/gsd/notification-widget.ts +5 -14
  461. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -3
  462. package/src/resources/extensions/gsd/pre-execution-checks.ts +39 -2
  463. package/src/resources/extensions/gsd/prompt-validation.ts +157 -0
  464. package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -3
  465. package/src/resources/extensions/gsd/prompts/discuss.md +33 -13
  466. package/src/resources/extensions/gsd/prompts/execute-task.md +22 -19
  467. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  468. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
  469. package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
  470. package/src/resources/extensions/gsd/prompts/queue.md +3 -2
  471. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  472. package/src/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
  473. package/src/resources/extensions/gsd/session-model-override.ts +36 -0
  474. package/src/resources/extensions/gsd/shortcut-defs.ts +56 -0
  475. package/src/resources/extensions/gsd/state.ts +285 -344
  476. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +25 -9
  477. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +28 -0
  478. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +39 -0
  479. package/src/resources/extensions/gsd/tests/complete-slice-gate-closure.test.ts +167 -0
  480. package/src/resources/extensions/gsd/tests/complete-slice-prompt-task-summary-layout.test.ts +18 -0
  481. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +436 -0
  482. package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +9 -0
  483. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
  484. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +36 -0
  485. package/src/resources/extensions/gsd/tests/execute-task-prompt-existing-artifact-guard.test.ts +33 -0
  486. package/src/resources/extensions/gsd/tests/file-lock.test.ts +103 -0
  487. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +62 -0
  488. package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +31 -0
  489. package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +27 -0
  490. package/src/resources/extensions/gsd/tests/gate-registry.test.ts +140 -0
  491. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +73 -0
  492. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +180 -0
  493. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +66 -1
  494. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +36 -51
  495. package/src/resources/extensions/gsd/tests/notification-store.test.ts +35 -0
  496. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +26 -0
  497. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +90 -0
  498. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -0
  499. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +18 -0
  500. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +49 -0
  501. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +19 -0
  502. package/src/resources/extensions/gsd/tests/prompt-system-gate-coverage.test.ts +208 -0
  503. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +7 -0
  504. package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +63 -5
  505. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +45 -0
  506. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +35 -0
  507. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +90 -0
  508. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +7 -0
  509. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +18 -0
  510. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +76 -0
  511. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +155 -1
  512. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +22 -0
  513. package/src/resources/extensions/gsd/tools/complete-slice.ts +63 -0
  514. package/src/resources/extensions/gsd/tools/complete-task.ts +63 -0
  515. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +64 -26
  516. package/src/resources/extensions/gsd/types.ts +26 -0
  517. package/src/resources/extensions/gsd/workflow-events.ts +34 -25
  518. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +76 -0
  519. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -1
  520. package/src/resources/extensions/ollama/index.ts +13 -3
  521. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +28 -0
  522. package/src/resources/extensions/shared/gsd-phase-state.ts +42 -0
  523. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +48 -0
  524. package/src/resources/extensions/subagent/agents.ts +10 -0
  525. package/src/resources/extensions/subagent/index.ts +18 -0
  526. package/src/resources/extensions/subagent/tests/agents-conflicts.test.ts +33 -0
  527. package/src/resources/skills/create-skill/SKILL.md +2 -0
  528. package/dist/web/standalone/.next/static/chunks/2826.821e01b07d92e948.js +0 -9
  529. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  530. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  531. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  532. /package/dist/web/standalone/.next/static/{9pw9EXtXjdM7EFrCXUEPf → OI4n_CKC-lM8IQbvGJ_tK}/_buildManifest.js +0 -0
  533. /package/dist/web/standalone/.next/static/{9pw9EXtXjdM7EFrCXUEPf → OI4n_CKC-lM8IQbvGJ_tK}/_ssgManifest.js +0 -0
@@ -21,7 +21,10 @@ import {
21
21
  getMilestone,
22
22
  updateSliceStatus,
23
23
  setSliceSummaryMd,
24
+ saveGateResult,
25
+ getPendingGatesForTurn,
24
26
  } from "../gsd-db.js";
27
+ import { getGatesForTurn } from "../gate-registry.js";
25
28
  import { resolveSliceFile, resolveSlicePath, clearPathCache } from "../paths.js";
26
29
  import { checkOwnership, sliceUnitKey } from "../unit-ownership.js";
27
30
  import { saveFile, clearParseCache } from "../files.js";
@@ -39,6 +42,23 @@ export interface CompleteSliceResult {
39
42
  uatPath: string;
40
43
  }
41
44
 
45
+ /**
46
+ * Map a complete-slice-owned gate id to the CompleteSliceParams field
47
+ * whose presence drives `pass` vs. `omitted`. Keep this in lockstep with
48
+ * the gates declared in gate-registry.ts under ownerTurn "complete-slice".
49
+ */
50
+ function sliceGateFieldForId(
51
+ id: string,
52
+ params: CompleteSliceParams,
53
+ ): string | undefined {
54
+ switch (id) {
55
+ case "Q8":
56
+ return params.operationalReadiness;
57
+ default:
58
+ return undefined;
59
+ }
60
+ }
61
+
42
62
  /**
43
63
  * Render slice summary markdown matching the template format.
44
64
  * YAML frontmatter uses snake_case keys for parseSummary() compatibility.
@@ -169,6 +189,10 @@ ${reqSurfaced}
169
189
 
170
190
  ${reqInvalidated}
171
191
 
192
+ ## Operational Readiness
193
+
194
+ ${params.operationalReadiness?.trim() || "None."}
195
+
172
196
  ## Deviations
173
197
 
174
198
  ${params.deviations || "None."}
@@ -330,6 +354,45 @@ export async function handleCompleteSlice(
330
354
  // Store rendered markdown in DB for D004 recovery
331
355
  setSliceSummaryMd(params.milestoneId, params.sliceId, summaryMd, uatMd);
332
356
 
357
+ // ── Close gates owned by complete-slice (Q8) ───────────────────────────
358
+ // Each owned gate maps to a specific summary section via the registry.
359
+ // If the caller populated the corresponding field, record `pass`; if the
360
+ // field is empty, record `omitted`. Without this loop, Q8 would stay
361
+ // pending forever and block future state derivation (see gate-registry).
362
+ try {
363
+ const pendingGates = getPendingGatesForTurn(
364
+ params.milestoneId,
365
+ params.sliceId,
366
+ "complete-slice",
367
+ );
368
+ if (pendingGates.length > 0) {
369
+ const ownedDefs = new Map(getGatesForTurn("complete-slice").map((g) => [g.id, g] as const));
370
+ for (const row of pendingGates) {
371
+ const def = ownedDefs.get(row.gate_id);
372
+ if (!def) continue;
373
+ // Map gate id → param field it maps to. Keep the map local so
374
+ // adding a new complete-slice gate is a single place change.
375
+ const field = sliceGateFieldForId(def.id, params);
376
+ const hasContent = typeof field === "string" && field.trim().length > 0;
377
+ saveGateResult({
378
+ milestoneId: params.milestoneId,
379
+ sliceId: params.sliceId,
380
+ gateId: def.id,
381
+ verdict: hasContent ? "pass" : "omitted",
382
+ rationale: hasContent
383
+ ? `${def.promptSection} section populated in slice summary`
384
+ : `${def.promptSection} section left empty — recorded as omitted`,
385
+ findings: hasContent ? (field as string).trim() : "",
386
+ });
387
+ }
388
+ }
389
+ } catch (gateErr) {
390
+ logWarning(
391
+ "tool",
392
+ `complete-slice gate close warning for ${params.milestoneId}/${params.sliceId}: ${(gateErr as Error).message}`,
393
+ );
394
+ }
395
+
333
396
  // Invalidate all caches
334
397
  invalidateStateCache();
335
398
  clearPathCache();
@@ -24,7 +24,10 @@ import {
24
24
  updateTaskStatus,
25
25
  setTaskSummaryMd,
26
26
  deleteVerificationEvidence,
27
+ saveGateResult,
28
+ getPendingGatesForTurn,
27
29
  } from "../gsd-db.js";
30
+ import { getGatesForTurn } from "../gate-registry.js";
28
31
  import { resolveSliceFile, resolveTasksDir, clearPathCache } from "../paths.js";
29
32
  import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
30
33
  import { saveFile, clearParseCache } from "../files.js";
@@ -44,6 +47,27 @@ export interface CompleteTaskResult {
44
47
 
45
48
  import type { TaskRow } from "../gsd-db.js";
46
49
 
50
+ /**
51
+ * Map an execute-task-owned gate id to the CompleteTaskParams field whose
52
+ * presence drives `pass` vs. `omitted`. Keep in lockstep with the gates
53
+ * declared in gate-registry.ts under ownerTurn "execute-task".
54
+ */
55
+ function taskGateFieldForId(
56
+ id: string,
57
+ params: CompleteTaskParams,
58
+ ): string | undefined {
59
+ switch (id) {
60
+ case "Q5":
61
+ return params.failureModes;
62
+ case "Q6":
63
+ return params.loadProfile;
64
+ case "Q7":
65
+ return params.negativeTests;
66
+ default:
67
+ return undefined;
68
+ }
69
+ }
70
+
47
71
  /**
48
72
  * Normalize a list parameter that may arrive as a string (newline-delimited
49
73
  * bullet list from the LLM) into a string array (#3361).
@@ -236,6 +260,45 @@ export async function handleCompleteTask(
236
260
  // Store rendered markdown in DB for D004 recovery
237
261
  setTaskSummaryMd(params.milestoneId, params.sliceId, params.taskId, summaryMd);
238
262
 
263
+ // ── Close gates owned by execute-task (Q5/Q6/Q7) for this task ────────
264
+ // Each gate id maps to a specific params field via taskGateFieldForId.
265
+ // When the model populates the field, record `pass`; when it's empty,
266
+ // record `omitted`. Task-scoped rows are filtered by taskId so a single
267
+ // task's completion doesn't touch sibling tasks' gate rows.
268
+ try {
269
+ const pendingGates = getPendingGatesForTurn(
270
+ params.milestoneId,
271
+ params.sliceId,
272
+ "execute-task",
273
+ params.taskId,
274
+ );
275
+ if (pendingGates.length > 0) {
276
+ const ownedDefs = new Map(getGatesForTurn("execute-task").map((g) => [g.id, g] as const));
277
+ for (const row of pendingGates) {
278
+ const def = ownedDefs.get(row.gate_id);
279
+ if (!def) continue;
280
+ const field = taskGateFieldForId(def.id, params);
281
+ const hasContent = typeof field === "string" && field.trim().length > 0;
282
+ saveGateResult({
283
+ milestoneId: params.milestoneId,
284
+ sliceId: params.sliceId,
285
+ taskId: params.taskId,
286
+ gateId: def.id,
287
+ verdict: hasContent ? "pass" : "omitted",
288
+ rationale: hasContent
289
+ ? `${def.promptSection} section populated in task summary`
290
+ : `${def.promptSection} section left empty — recorded as omitted`,
291
+ findings: hasContent ? (field as string).trim() : "",
292
+ });
293
+ }
294
+ }
295
+ } catch (gateErr) {
296
+ logWarning(
297
+ "tool",
298
+ `complete-task gate close warning for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${(gateErr as Error).message}`,
299
+ );
300
+ }
301
+
239
302
  // Invalidate all caches
240
303
  invalidateStateCache();
241
304
  clearPathCache();
@@ -8,6 +8,7 @@ import {
8
8
  _getAdapter,
9
9
  saveGateResult,
10
10
  } from "../gsd-db.js";
11
+ import { GATE_REGISTRY } from "../gate-registry.js";
11
12
  import { saveArtifactToDb } from "../db-writer.js";
12
13
  import type { CompleteMilestoneParams } from "./complete-milestone.js";
13
14
  import { handleCompleteMilestone } from "./complete-milestone.js";
@@ -38,6 +39,7 @@ export function isSupportedSummaryArtifactType(
38
39
  export interface ToolExecutionResult {
39
40
  content: Array<{ type: "text"; text: string }>;
40
41
  details: Record<string, unknown>;
42
+ isError?: boolean;
41
43
  }
42
44
 
43
45
  export interface SummarySaveParams {
@@ -57,13 +59,15 @@ export async function executeSummarySave(
57
59
  return {
58
60
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot save artifact." }],
59
61
  details: { operation: "save_summary", error: "db_unavailable" },
60
- };
62
+ isError: true,
63
+ };
61
64
  }
62
65
  if (!isSupportedSummaryArtifactType(params.artifact_type)) {
63
66
  return {
64
67
  content: [{ type: "text", text: `Error: Invalid artifact_type "${params.artifact_type}". Must be one of: ${SUPPORTED_SUMMARY_ARTIFACT_TYPES.join(", ")}` }],
65
68
  details: { operation: "save_summary", error: "invalid_artifact_type" },
66
- };
69
+ isError: true,
70
+ };
67
71
  }
68
72
  const contextGuard = shouldBlockContextArtifactSaveInSnapshot(
69
73
  loadWriteGateSnapshot(basePath),
@@ -75,7 +79,8 @@ export async function executeSummarySave(
75
79
  return {
76
80
  content: [{ type: "text", text: `Error saving artifact: ${contextGuard.reason ?? "context write blocked"}` }],
77
81
  details: { operation: "save_summary", error: "context_write_blocked" },
78
- };
82
+ isError: true,
83
+ };
79
84
  }
80
85
  try {
81
86
  let relativePath: string;
@@ -108,7 +113,8 @@ export async function executeSummarySave(
108
113
  return {
109
114
  content: [{ type: "text", text: `Error saving artifact: ${msg}` }],
110
115
  details: { operation: "save_summary", error: msg },
111
- };
116
+ isError: true,
117
+ };
112
118
  }
113
119
  }
114
120
 
@@ -163,7 +169,8 @@ export async function executeTaskComplete(
163
169
  return {
164
170
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot complete task." }],
165
171
  details: { operation: "complete_task", error: "db_unavailable" },
166
- };
172
+ isError: true,
173
+ };
167
174
  }
168
175
  try {
169
176
  const coerced = { ...params };
@@ -176,6 +183,7 @@ export async function executeTaskComplete(
176
183
  return {
177
184
  content: [{ type: "text", text: `Error completing task: ${result.error}` }],
178
185
  details: { operation: "complete_task", error: result.error },
186
+ isError: true,
179
187
  };
180
188
  }
181
189
  return {
@@ -194,7 +202,8 @@ export async function executeTaskComplete(
194
202
  return {
195
203
  content: [{ type: "text", text: `Error completing task: ${msg}` }],
196
204
  details: { operation: "complete_task", error: msg },
197
- };
205
+ isError: true,
206
+ };
198
207
  }
199
208
  }
200
209
 
@@ -207,7 +216,8 @@ export async function executeSliceComplete(
207
216
  return {
208
217
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot complete slice." }],
209
218
  details: { operation: "complete_slice", error: "db_unavailable" },
210
- };
219
+ isError: true,
220
+ };
211
221
  }
212
222
  try {
213
223
  const splitPair = (s: string): [string, string] => {
@@ -257,6 +267,7 @@ export async function executeSliceComplete(
257
267
  return {
258
268
  content: [{ type: "text", text: `Error completing slice: ${result.error}` }],
259
269
  details: { operation: "complete_slice", error: result.error },
270
+ isError: true,
260
271
  };
261
272
  }
262
273
  return {
@@ -275,7 +286,8 @@ export async function executeSliceComplete(
275
286
  return {
276
287
  content: [{ type: "text", text: `Error completing slice: ${msg}` }],
277
288
  details: { operation: "complete_slice", error: msg },
278
- };
289
+ isError: true,
290
+ };
279
291
  }
280
292
  }
281
293
 
@@ -288,7 +300,8 @@ export async function executeCompleteMilestone(
288
300
  return {
289
301
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot complete milestone." }],
290
302
  details: { operation: "complete_milestone", error: "db_unavailable" },
291
- };
303
+ isError: true,
304
+ };
292
305
  }
293
306
  try {
294
307
  const sanitized = sanitizeCompleteMilestoneParams(params);
@@ -297,6 +310,7 @@ export async function executeCompleteMilestone(
297
310
  return {
298
311
  content: [{ type: "text", text: `Error completing milestone: ${result.error}` }],
299
312
  details: { operation: "complete_milestone", error: result.error },
313
+ isError: true,
300
314
  };
301
315
  }
302
316
  return {
@@ -313,7 +327,8 @@ export async function executeCompleteMilestone(
313
327
  return {
314
328
  content: [{ type: "text", text: `Error completing milestone: ${msg}` }],
315
329
  details: { operation: "complete_milestone", error: msg },
316
- };
330
+ isError: true,
331
+ };
317
332
  }
318
333
  }
319
334
 
@@ -326,7 +341,8 @@ export async function executeValidateMilestone(
326
341
  return {
327
342
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot validate milestone." }],
328
343
  details: { operation: "validate_milestone", error: "db_unavailable" },
329
- };
344
+ isError: true,
345
+ };
330
346
  }
331
347
  try {
332
348
  const result = await handleValidateMilestone(params, basePath);
@@ -334,6 +350,7 @@ export async function executeValidateMilestone(
334
350
  return {
335
351
  content: [{ type: "text", text: `Error validating milestone: ${result.error}` }],
336
352
  details: { operation: "validate_milestone", error: result.error },
353
+ isError: true,
337
354
  };
338
355
  }
339
356
  return {
@@ -351,7 +368,8 @@ export async function executeValidateMilestone(
351
368
  return {
352
369
  content: [{ type: "text", text: `Error validating milestone: ${msg}` }],
353
370
  details: { operation: "validate_milestone", error: msg },
354
- };
371
+ isError: true,
372
+ };
355
373
  }
356
374
  }
357
375
 
@@ -364,7 +382,8 @@ export async function executeReassessRoadmap(
364
382
  return {
365
383
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot reassess roadmap." }],
366
384
  details: { operation: "reassess_roadmap", error: "db_unavailable" },
367
- };
385
+ isError: true,
386
+ };
368
387
  }
369
388
  try {
370
389
  const result = await handleReassessRoadmap(params, basePath);
@@ -372,6 +391,7 @@ export async function executeReassessRoadmap(
372
391
  return {
373
392
  content: [{ type: "text", text: `Error reassessing roadmap: ${result.error}` }],
374
393
  details: { operation: "reassess_roadmap", error: result.error },
394
+ isError: true,
375
395
  };
376
396
  }
377
397
  return {
@@ -390,7 +410,8 @@ export async function executeReassessRoadmap(
390
410
  return {
391
411
  content: [{ type: "text", text: `Error reassessing roadmap: ${msg}` }],
392
412
  details: { operation: "reassess_roadmap", error: msg },
393
- };
413
+ isError: true,
414
+ };
394
415
  }
395
416
  }
396
417
 
@@ -403,15 +424,19 @@ export async function executeSaveGateResult(
403
424
  return {
404
425
  content: [{ type: "text", text: "Error: GSD database is not available." }],
405
426
  details: { operation: "save_gate_result", error: "db_unavailable" },
406
- };
427
+ isError: true,
428
+ };
407
429
  }
408
430
 
409
- const validGates = ["Q3", "Q4", "Q5", "Q6", "Q7", "Q8"];
431
+ // Source of truth: gate-registry.ts. Every declared GateId is accepted,
432
+ // so adding a new gate in one place automatically flows through here.
433
+ const validGates = Object.keys(GATE_REGISTRY);
410
434
  if (!validGates.includes(params.gateId)) {
411
435
  return {
412
436
  content: [{ type: "text", text: `Error: Invalid gateId "${params.gateId}". Must be one of: ${validGates.join(", ")}` }],
413
437
  details: { operation: "save_gate_result", error: "invalid_gate_id" },
414
- };
438
+ isError: true,
439
+ };
415
440
  }
416
441
 
417
442
  const validVerdicts = ["pass", "flag", "omitted"];
@@ -419,7 +444,8 @@ export async function executeSaveGateResult(
419
444
  return {
420
445
  content: [{ type: "text", text: `Error: Invalid verdict "${params.verdict}". Must be one of: ${validVerdicts.join(", ")}` }],
421
446
  details: { operation: "save_gate_result", error: "invalid_verdict" },
422
- };
447
+ isError: true,
448
+ };
423
449
  }
424
450
 
425
451
  try {
@@ -443,7 +469,8 @@ export async function executeSaveGateResult(
443
469
  return {
444
470
  content: [{ type: "text", text: `Error saving gate result: ${msg}` }],
445
471
  details: { operation: "save_gate_result", error: msg },
446
- };
472
+ isError: true,
473
+ };
447
474
  }
448
475
  }
449
476
 
@@ -456,7 +483,8 @@ export async function executePlanMilestone(
456
483
  return {
457
484
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot plan milestone." }],
458
485
  details: { operation: "plan_milestone", error: "db_unavailable" },
459
- };
486
+ isError: true,
487
+ };
460
488
  }
461
489
  try {
462
490
  const result = await handlePlanMilestone(params, basePath);
@@ -464,6 +492,7 @@ export async function executePlanMilestone(
464
492
  return {
465
493
  content: [{ type: "text", text: `Error planning milestone: ${result.error}` }],
466
494
  details: { operation: "plan_milestone", error: result.error },
495
+ isError: true,
467
496
  };
468
497
  }
469
498
  return {
@@ -480,7 +509,8 @@ export async function executePlanMilestone(
480
509
  return {
481
510
  content: [{ type: "text", text: `Error planning milestone: ${msg}` }],
482
511
  details: { operation: "plan_milestone", error: msg },
483
- };
512
+ isError: true,
513
+ };
484
514
  }
485
515
  }
486
516
 
@@ -493,7 +523,8 @@ export async function executePlanSlice(
493
523
  return {
494
524
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot plan slice." }],
495
525
  details: { operation: "plan_slice", error: "db_unavailable" },
496
- };
526
+ isError: true,
527
+ };
497
528
  }
498
529
  try {
499
530
  const result = await handlePlanSlice(params, basePath);
@@ -501,6 +532,7 @@ export async function executePlanSlice(
501
532
  return {
502
533
  content: [{ type: "text", text: `Error planning slice: ${result.error}` }],
503
534
  details: { operation: "plan_slice", error: result.error },
535
+ isError: true,
504
536
  };
505
537
  }
506
538
  return {
@@ -519,7 +551,8 @@ export async function executePlanSlice(
519
551
  return {
520
552
  content: [{ type: "text", text: `Error planning slice: ${msg}` }],
521
553
  details: { operation: "plan_slice", error: msg },
522
- };
554
+ isError: true,
555
+ };
523
556
  }
524
557
  }
525
558
 
@@ -532,7 +565,8 @@ export async function executeReplanSlice(
532
565
  return {
533
566
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot replan slice." }],
534
567
  details: { operation: "replan_slice", error: "db_unavailable" },
535
- };
568
+ isError: true,
569
+ };
536
570
  }
537
571
  try {
538
572
  const result = await handleReplanSlice(params, basePath);
@@ -540,6 +574,7 @@ export async function executeReplanSlice(
540
574
  return {
541
575
  content: [{ type: "text", text: `Error replanning slice: ${result.error}` }],
542
576
  details: { operation: "replan_slice", error: result.error },
577
+ isError: true,
543
578
  };
544
579
  }
545
580
  return {
@@ -558,7 +593,8 @@ export async function executeReplanSlice(
558
593
  return {
559
594
  content: [{ type: "text", text: `Error replanning slice: ${msg}` }],
560
595
  details: { operation: "replan_slice", error: msg },
561
- };
596
+ isError: true,
597
+ };
562
598
  }
563
599
  }
564
600
 
@@ -576,6 +612,7 @@ export async function executeMilestoneStatus(
576
612
  return {
577
613
  content: [{ type: "text", text: "Error: GSD database is not available." }],
578
614
  details: { operation: "milestone_status", error: "db_unavailable" },
615
+ isError: true,
579
616
  };
580
617
  }
581
618
 
@@ -624,6 +661,7 @@ export async function executeMilestoneStatus(
624
661
  return {
625
662
  content: [{ type: "text", text: `Error querying milestone status: ${msg}` }],
626
663
  details: { operation: "milestone_status", error: msg },
627
- };
664
+ isError: true,
665
+ };
628
666
  }
629
667
  }
@@ -536,6 +536,24 @@ export interface CompleteTaskParams {
536
536
  verdict: string;
537
537
  durationMs: number;
538
538
  }>;
539
+ /**
540
+ * Q5 failure-modes section content (what breaks when dependencies fail).
541
+ * Populated → `pass`; omitted/empty → `omitted`.
542
+ * @optional
543
+ */
544
+ failureModes?: string;
545
+ /**
546
+ * Q6 load-profile section content (10x breakpoint + protection).
547
+ * Populated → `pass`; omitted/empty → `omitted`.
548
+ * @optional
549
+ */
550
+ loadProfile?: string;
551
+ /**
552
+ * Q7 negative-tests section content (malformed inputs, error paths,
553
+ * boundaries). Populated → `pass`; omitted/empty → `omitted`.
554
+ * @optional
555
+ */
556
+ negativeTests?: string;
539
557
  /** Optional caller-provided identity for audit trail */
540
558
  actorName?: string;
541
559
  /** Optional caller-provided reason this action was triggered */
@@ -584,6 +602,14 @@ export interface CompleteSliceParams {
584
602
  affects?: string[];
585
603
  /** @optional — defaults to [] when omitted */
586
604
  drillDownPaths?: string[];
605
+ /**
606
+ * Q8 operational readiness section content (health signal, failure signal,
607
+ * recovery, monitoring gaps). When populated, the complete-slice handler
608
+ * records Q8 as `pass`; when omitted or empty, Q8 is recorded as `omitted`.
609
+ * See gate-registry.ts.
610
+ * @optional
611
+ */
612
+ operationalReadiness?: string;
587
613
  /** Optional caller-provided identity for audit trail */
588
614
  actorName?: string;
589
615
  /** Optional caller-provided reason this action was triggered */
@@ -2,6 +2,7 @@ import { createHash, randomUUID } from "node:crypto";
2
2
  import { appendFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
3
3
  import { join } from "node:path";
4
4
  import { atomicWriteSync } from "./atomic-write.js";
5
+ import { withFileLockSync } from "./file-lock.js";
5
6
  import { logWarning } from "./workflow-logger.js";
6
7
 
7
8
  // ─── Session ID ───────────────────────────────────────────────────────────
@@ -127,31 +128,39 @@ export function compactMilestoneEvents(
127
128
  const logPath = join(basePath, ".gsd", "event-log.jsonl");
128
129
  const archivePath = join(basePath, ".gsd", `event-log-${milestoneId}.jsonl.archived`);
129
130
 
130
- const allEvents = readEvents(logPath);
131
- const toArchive = allEvents.filter(
132
- (e) => (e.params as { milestoneId?: string }).milestoneId === milestoneId,
133
- );
134
- const remaining = allEvents.filter(
135
- (e) => (e.params as { milestoneId?: string }).milestoneId !== milestoneId,
136
- );
131
+ return withFileLockSync(logPath, () => {
132
+ const allEvents = readEvents(logPath);
133
+
134
+ // Single-pass partition to halve the work (per reviewer agent)
135
+ const toArchive: WorkflowEvent[] = [];
136
+ const remaining: WorkflowEvent[] = [];
137
+
138
+ for (const e of allEvents) {
139
+ if ((e.params as { milestoneId?: string }).milestoneId === milestoneId) {
140
+ toArchive.push(e);
141
+ } else {
142
+ remaining.push(e);
143
+ }
144
+ }
137
145
 
138
- if (toArchive.length === 0) {
139
- return { archived: 0 };
140
- }
146
+ if (toArchive.length === 0) {
147
+ return { archived: 0 };
148
+ }
141
149
 
142
- // Write archived events to .jsonl.archived file (crash-safe)
143
- atomicWriteSync(
144
- archivePath,
145
- toArchive.map((e) => JSON.stringify(e)).join("\n") + "\n",
146
- );
147
-
148
- // Truncate active log to remaining events only
149
- atomicWriteSync(
150
- logPath,
151
- remaining.length > 0
152
- ? remaining.map((e) => JSON.stringify(e)).join("\n") + "\n"
153
- : "",
154
- );
155
-
156
- return { archived: toArchive.length };
150
+ // Write archived events to .jsonl.archived file (crash-safe)
151
+ atomicWriteSync(
152
+ archivePath,
153
+ toArchive.map((e) => JSON.stringify(e)).join("\n") + "\n",
154
+ );
155
+
156
+ // Truncate active log to remaining events only
157
+ atomicWriteSync(
158
+ logPath,
159
+ remaining.length > 0
160
+ ? remaining.map((e) => JSON.stringify(e)).join("\n") + "\n"
161
+ : "",
162
+ );
163
+
164
+ return { archived: toArchive.length };
165
+ });
157
166
  }
@@ -0,0 +1,76 @@
1
+ import type { ExtensionContext } from "@gsd/pi-coding-agent";
2
+
3
+ import {
4
+ type EnsureProjectWorkflowMcpConfigResult,
5
+ ensureProjectWorkflowMcpConfig,
6
+ } from "./mcp-project-config.js";
7
+ import { usesWorkflowMcpTransport } from "./workflow-mcp.js";
8
+
9
+ interface WorkflowMcpAutoPrepContext {
10
+ model?: { provider?: string; baseUrl?: string };
11
+ modelRegistry?: {
12
+ getProviderAuthMode?: (provider: string) => string;
13
+ isProviderRequestReady?: (provider: string) => boolean;
14
+ };
15
+ ui?: Pick<ExtensionContext["ui"], "notify">;
16
+ }
17
+
18
+ function getAuthModeSafe(
19
+ ctx: WorkflowMcpAutoPrepContext,
20
+ provider: string | undefined,
21
+ ): string | undefined {
22
+ if (!provider) return undefined;
23
+ const getAuthMode = ctx.modelRegistry?.getProviderAuthMode;
24
+ if (typeof getAuthMode !== "function") return undefined;
25
+ try {
26
+ return getAuthMode(provider);
27
+ } catch {
28
+ return undefined;
29
+ }
30
+ }
31
+
32
+ function hasClaudeCodeProvider(ctx: WorkflowMcpAutoPrepContext): boolean {
33
+ return getAuthModeSafe(ctx, "claude-code") === "externalCli";
34
+ }
35
+
36
+ function isClaudeCodeProviderReady(ctx: WorkflowMcpAutoPrepContext): boolean {
37
+ const readyCheck = ctx.modelRegistry?.isProviderRequestReady;
38
+ if (typeof readyCheck !== "function") return false;
39
+ try {
40
+ return readyCheck("claude-code");
41
+ } catch {
42
+ return false;
43
+ }
44
+ }
45
+
46
+ export function shouldAutoPrepareWorkflowMcp(ctx: WorkflowMcpAutoPrepContext): boolean {
47
+ const provider = ctx.model?.provider;
48
+ const baseUrl = ctx.model?.baseUrl;
49
+ const authMode = getAuthModeSafe(ctx, provider);
50
+
51
+ if (usesWorkflowMcpTransport(authMode as any, baseUrl)) return true;
52
+ if (provider === "claude-code") return true;
53
+ if (hasClaudeCodeProvider(ctx)) return true;
54
+ return isClaudeCodeProviderReady(ctx);
55
+ }
56
+
57
+ export function prepareWorkflowMcpForProject(
58
+ ctx: WorkflowMcpAutoPrepContext,
59
+ projectRoot: string,
60
+ ): EnsureProjectWorkflowMcpConfigResult | null {
61
+ if (!shouldAutoPrepareWorkflowMcp(ctx)) return null;
62
+
63
+ try {
64
+ const result = ensureProjectWorkflowMcpConfig(projectRoot);
65
+ if (result.status !== "unchanged") {
66
+ ctx.ui?.notify?.(`Claude Code MCP prepared at ${result.configPath}`, "info");
67
+ }
68
+ return result;
69
+ } catch (err) {
70
+ ctx.ui?.notify?.(
71
+ `Claude Code MCP prep failed: ${err instanceof Error ? err.message : String(err)}. Detected Claude Code model but no workflow MCP. Please run /gsd mcp init . from your project root.`,
72
+ "warning",
73
+ );
74
+ return null;
75
+ }
76
+ }