gsd-pi 2.71.0 → 2.72.0-dev.de4c4b3

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 (459) 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 +113 -10
  22. package/dist/resources/extensions/gsd/auto/infra-errors.js +34 -0
  23. package/dist/resources/extensions/gsd/auto/loop.js +32 -1
  24. package/dist/resources/extensions/gsd/auto/phases.js +5 -1
  25. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  26. package/dist/resources/extensions/gsd/auto-dashboard.js +22 -16
  27. package/dist/resources/extensions/gsd/auto-model-selection.js +10 -2
  28. package/dist/resources/extensions/gsd/auto-prompts.js +88 -33
  29. package/dist/resources/extensions/gsd/auto-start.js +34 -7
  30. package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
  31. package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
  32. package/dist/resources/extensions/gsd/auto.js +56 -0
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +2 -0
  35. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +63 -51
  36. package/dist/resources/extensions/gsd/bootstrap/system-context.js +6 -0
  37. package/dist/resources/extensions/gsd/commands/context.js +15 -6
  38. package/dist/resources/extensions/gsd/commands/dispatcher.js +12 -2
  39. package/dist/resources/extensions/gsd/commands/handlers/auto.js +10 -33
  40. package/dist/resources/extensions/gsd/commands/handlers/core.js +56 -11
  41. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +15 -6
  42. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +4 -10
  43. package/dist/resources/extensions/gsd/dashboard-overlay.js +8 -3
  44. package/dist/resources/extensions/gsd/dispatch-guard.js +18 -1
  45. package/dist/resources/extensions/gsd/doctor-providers.js +23 -0
  46. package/dist/resources/extensions/gsd/error-classifier.js +5 -2
  47. package/dist/resources/extensions/gsd/forensics.js +19 -6
  48. package/dist/resources/extensions/gsd/gate-registry.js +208 -0
  49. package/dist/resources/extensions/gsd/gsd-db.js +41 -0
  50. package/dist/resources/extensions/gsd/guided-flow.js +5 -10
  51. package/dist/resources/extensions/gsd/metrics.js +1 -0
  52. package/dist/resources/extensions/gsd/milestone-actions.js +10 -4
  53. package/dist/resources/extensions/gsd/milestone-validation-gates.js +11 -12
  54. package/dist/resources/extensions/gsd/notification-overlay.js +42 -13
  55. package/dist/resources/extensions/gsd/notification-store.js +56 -5
  56. package/dist/resources/extensions/gsd/notification-widget.js +5 -13
  57. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +8 -3
  58. package/dist/resources/extensions/gsd/pre-execution-checks.js +35 -2
  59. package/dist/resources/extensions/gsd/prompt-validation.js +126 -0
  60. package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -3
  61. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -0
  62. package/dist/resources/extensions/gsd/prompts/execute-task.md +22 -19
  63. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  64. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
  65. package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
  66. package/dist/resources/extensions/gsd/prompts/queue.md +3 -2
  67. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  68. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
  69. package/dist/resources/extensions/gsd/session-model-override.js +25 -0
  70. package/dist/resources/extensions/gsd/shortcut-defs.js +40 -0
  71. package/dist/resources/extensions/gsd/state.js +9 -2
  72. package/dist/resources/extensions/gsd/tools/complete-slice.js +52 -1
  73. package/dist/resources/extensions/gsd/tools/complete-task.js +51 -1
  74. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +4 -1
  75. package/dist/resources/extensions/ollama/index.js +13 -5
  76. package/dist/resources/extensions/shared/gsd-phase-state.js +35 -0
  77. package/dist/resources/extensions/subagent/agents.js +8 -0
  78. package/dist/resources/extensions/subagent/index.js +17 -0
  79. package/dist/resources/skills/create-skill/SKILL.md +2 -0
  80. package/dist/startup-model-validation.d.ts +0 -1
  81. package/dist/startup-model-validation.js +6 -2
  82. package/dist/web/standalone/.next/BUILD_ID +1 -1
  83. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  84. package/dist/web/standalone/.next/build-manifest.json +3 -3
  85. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  86. package/dist/web/standalone/.next/required-server-files.json +3 -3
  87. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  88. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  98. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  126. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  146. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  162. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/index.html +1 -1
  192. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  193. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  194. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  195. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  197. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/page.js +2 -2
  199. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  201. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  202. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  203. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/middleware.js +2 -2
  205. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  207. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  208. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  209. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  210. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  211. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  215. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  216. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  217. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  218. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  219. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  220. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  221. package/dist/web/standalone/server.js +1 -1
  222. package/package.json +1 -1
  223. package/packages/mcp-server/dist/server.d.ts +12 -1
  224. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  225. package/packages/mcp-server/dist/server.js +90 -42
  226. package/packages/mcp-server/dist/server.js.map +1 -1
  227. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  228. package/packages/mcp-server/dist/workflow-tools.js +22 -12
  229. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  230. package/packages/mcp-server/src/server.ts +110 -38
  231. package/packages/mcp-server/src/workflow-tools.test.ts +110 -0
  232. package/packages/mcp-server/src/workflow-tools.ts +32 -12
  233. package/packages/pi-ai/dist/providers/amazon-bedrock.js +11 -2
  234. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  235. package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts +2 -0
  236. package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts.map +1 -0
  237. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +20 -0
  238. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -0
  239. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +4 -1
  240. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  241. package/packages/pi-ai/dist/providers/anthropic-shared.js +8 -3
  242. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  243. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +44 -1
  244. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  245. package/packages/pi-ai/dist/providers/anthropic.d.ts +2 -1
  246. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  247. package/packages/pi-ai/dist/providers/anthropic.js +7 -4
  248. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  249. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  250. package/packages/pi-ai/dist/providers/openai-completions.js +11 -0
  251. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  252. package/packages/pi-ai/src/providers/amazon-bedrock.ts +13 -1
  253. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +32 -0
  254. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +55 -1
  255. package/packages/pi-ai/src/providers/anthropic-shared.ts +14 -3
  256. package/packages/pi-ai/src/providers/anthropic.ts +8 -4
  257. package/packages/pi-ai/src/providers/openai-completions.ts +14 -0
  258. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts +2 -0
  259. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts.map +1 -0
  260. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js +61 -0
  261. package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js.map +1 -0
  262. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/agent-session.js +2 -1
  264. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +10 -0
  266. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/auth-storage.js +27 -0
  268. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +85 -0
  270. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts +2 -0
  272. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts.map +1 -0
  273. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js +64 -0
  274. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js.map +1 -0
  275. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/model-resolver.js +22 -18
  277. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts +8 -0
  279. package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts.map +1 -0
  280. package/packages/pi-coding-agent/dist/core/model-resolver.test.js +75 -0
  281. package/packages/pi-coding-agent/dist/core/model-resolver.test.js.map +1 -0
  282. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +5 -0
  283. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/retry-handler.js +55 -1
  285. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +57 -0
  287. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/sdk.d.ts +11 -0
  289. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/sdk.js +38 -5
  291. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/sdk.test.d.ts +2 -0
  293. package/packages/pi-coding-agent/dist/core/sdk.test.d.ts.map +1 -0
  294. package/packages/pi-coding-agent/dist/core/sdk.test.js +71 -0
  295. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -0
  296. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  297. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  298. package/packages/pi-coding-agent/dist/index.js +1 -1
  299. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts +2 -0
  301. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts.map +1 -0
  302. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js +13 -0
  303. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js.map +1 -0
  304. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +4 -0
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +24 -2
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  309. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +9 -2
  310. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +4 -0
  312. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +43 -0
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +7 -2
  317. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.d.ts.map +1 -1
  319. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js +6 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -3
  323. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +4 -2
  325. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  326. package/packages/pi-coding-agent/package.json +1 -1
  327. package/packages/pi-coding-agent/src/core/agent-session-renderable-tools.test.ts +70 -0
  328. package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
  329. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +108 -0
  330. package/packages/pi-coding-agent/src/core/auth-storage.ts +30 -0
  331. package/packages/pi-coding-agent/src/core/model-resolver-initial-model-auth.test.ts +78 -0
  332. package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
  333. package/packages/pi-coding-agent/src/core/model-resolver.ts +22 -18
  334. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +83 -0
  335. package/packages/pi-coding-agent/src/core/retry-handler.ts +60 -1
  336. package/packages/pi-coding-agent/src/core/sdk.test.ts +89 -0
  337. package/packages/pi-coding-agent/src/core/sdk.ts +45 -9
  338. package/packages/pi-coding-agent/src/index.ts +1 -0
  339. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
  340. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +30 -2
  341. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +15 -6
  342. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +47 -0
  343. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +7 -2
  344. package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +6 -1
  345. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -3
  346. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +4 -2
  347. package/pkg/package.json +1 -1
  348. package/src/resources/GSD-WORKFLOW.md +1 -1
  349. package/src/resources/agents/debugger.md +58 -0
  350. package/src/resources/agents/doc-writer.md +43 -0
  351. package/src/resources/agents/git-ops.md +56 -0
  352. package/src/resources/agents/javascript-pro.md +46 -271
  353. package/src/resources/agents/planner.md +55 -0
  354. package/src/resources/agents/refactorer.md +47 -0
  355. package/src/resources/agents/reviewer.md +48 -0
  356. package/src/resources/agents/security.md +59 -0
  357. package/src/resources/agents/tester.md +50 -0
  358. package/src/resources/agents/typescript-pro.md +41 -235
  359. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +122 -8
  360. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +189 -6
  361. package/src/resources/extensions/gsd/auto/infra-errors.ts +38 -0
  362. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  363. package/src/resources/extensions/gsd/auto/loop.ts +45 -1
  364. package/src/resources/extensions/gsd/auto/phases.ts +6 -0
  365. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  366. package/src/resources/extensions/gsd/auto-dashboard.ts +29 -18
  367. package/src/resources/extensions/gsd/auto-model-selection.ts +9 -1
  368. package/src/resources/extensions/gsd/auto-prompts.ts +111 -33
  369. package/src/resources/extensions/gsd/auto-start.ts +41 -7
  370. package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
  371. package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
  372. package/src/resources/extensions/gsd/auto.ts +72 -0
  373. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
  374. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +2 -0
  375. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +79 -60
  376. package/src/resources/extensions/gsd/bootstrap/system-context.ts +7 -0
  377. package/src/resources/extensions/gsd/commands/context.ts +16 -5
  378. package/src/resources/extensions/gsd/commands/dispatcher.ts +14 -2
  379. package/src/resources/extensions/gsd/commands/handlers/auto.ts +10 -36
  380. package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -11
  381. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +17 -7
  382. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +4 -10
  383. package/src/resources/extensions/gsd/dashboard-overlay.ts +10 -3
  384. package/src/resources/extensions/gsd/dispatch-guard.ts +18 -1
  385. package/src/resources/extensions/gsd/doctor-providers.ts +24 -0
  386. package/src/resources/extensions/gsd/error-classifier.ts +5 -2
  387. package/src/resources/extensions/gsd/forensics.ts +23 -7
  388. package/src/resources/extensions/gsd/gate-registry.ts +251 -0
  389. package/src/resources/extensions/gsd/gsd-db.ts +51 -0
  390. package/src/resources/extensions/gsd/guided-flow.ts +5 -10
  391. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  392. package/src/resources/extensions/gsd/metrics.ts +12 -1
  393. package/src/resources/extensions/gsd/milestone-actions.ts +10 -3
  394. package/src/resources/extensions/gsd/milestone-validation-gates.ts +11 -13
  395. package/src/resources/extensions/gsd/notification-overlay.ts +47 -14
  396. package/src/resources/extensions/gsd/notification-store.ts +54 -5
  397. package/src/resources/extensions/gsd/notification-widget.ts +5 -14
  398. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -3
  399. package/src/resources/extensions/gsd/pre-execution-checks.ts +39 -2
  400. package/src/resources/extensions/gsd/prompt-validation.ts +157 -0
  401. package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -3
  402. package/src/resources/extensions/gsd/prompts/discuss.md +2 -0
  403. package/src/resources/extensions/gsd/prompts/execute-task.md +22 -19
  404. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  405. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
  406. package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
  407. package/src/resources/extensions/gsd/prompts/queue.md +3 -2
  408. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  409. package/src/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
  410. package/src/resources/extensions/gsd/session-model-override.ts +36 -0
  411. package/src/resources/extensions/gsd/shortcut-defs.ts +56 -0
  412. package/src/resources/extensions/gsd/state.ts +13 -2
  413. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +25 -9
  414. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +28 -0
  415. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +39 -0
  416. package/src/resources/extensions/gsd/tests/complete-slice-gate-closure.test.ts +167 -0
  417. package/src/resources/extensions/gsd/tests/complete-slice-prompt-task-summary-layout.test.ts +18 -0
  418. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
  419. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +36 -0
  420. package/src/resources/extensions/gsd/tests/execute-task-prompt-existing-artifact-guard.test.ts +33 -0
  421. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +62 -0
  422. package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +31 -0
  423. package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +27 -0
  424. package/src/resources/extensions/gsd/tests/gate-registry.test.ts +140 -0
  425. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +73 -0
  426. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +180 -0
  427. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +66 -1
  428. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +36 -51
  429. package/src/resources/extensions/gsd/tests/notification-store.test.ts +35 -0
  430. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +26 -0
  431. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +90 -0
  432. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -0
  433. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +18 -0
  434. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +49 -0
  435. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +19 -0
  436. package/src/resources/extensions/gsd/tests/prompt-system-gate-coverage.test.ts +208 -0
  437. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +16 -0
  438. package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +63 -5
  439. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +35 -0
  440. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +90 -0
  441. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +7 -0
  442. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +18 -0
  443. package/src/resources/extensions/gsd/tools/complete-slice.ts +63 -0
  444. package/src/resources/extensions/gsd/tools/complete-task.ts +63 -0
  445. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +4 -1
  446. package/src/resources/extensions/gsd/types.ts +26 -0
  447. package/src/resources/extensions/ollama/index.ts +13 -3
  448. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +28 -0
  449. package/src/resources/extensions/shared/gsd-phase-state.ts +42 -0
  450. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +48 -0
  451. package/src/resources/extensions/subagent/agents.ts +10 -0
  452. package/src/resources/extensions/subagent/index.ts +18 -0
  453. package/src/resources/extensions/subagent/tests/agents-conflicts.test.ts +33 -0
  454. package/src/resources/skills/create-skill/SKILL.md +2 -0
  455. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  456. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  457. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  458. /package/dist/web/standalone/.next/static/{nPky_WQC28aBD77eZsRAB → f-Gremw0nLxxFUySaHRPw}/_buildManifest.js +0 -0
  459. /package/dist/web/standalone/.next/static/{nPky_WQC28aBD77eZsRAB → f-Gremw0nLxxFUySaHRPw}/_ssgManifest.js +0 -0
@@ -55,46 +55,80 @@ function textContent(text: string): { content: Array<{ type: 'text'; text: strin
55
55
  // gsd_query filesystem reader
56
56
  // ---------------------------------------------------------------------------
57
57
 
58
- async function readProjectState(projectDir: string, _query: string): Promise<Record<string, unknown>> {
58
+ /**
59
+ * Normalized query categories for {@link readProjectState}.
60
+ *
61
+ * Maps user-supplied query strings (or empty) to the set of fields we return.
62
+ * Accepts common synonyms so the MCP client can pass intuitive values.
63
+ */
64
+ const QUERY_FIELDS = {
65
+ all: ['state', 'project', 'requirements', 'milestones'] as const,
66
+ state: ['state'] as const,
67
+ status: ['state'] as const,
68
+ project: ['project'] as const,
69
+ requirements: ['requirements'] as const,
70
+ milestones: ['milestones'] as const,
71
+ } as const;
72
+
73
+ type QueryCategory = keyof typeof QUERY_FIELDS;
74
+ type ProjectStateField = (typeof QUERY_FIELDS)[QueryCategory][number];
75
+
76
+ function normalizeQuery(query: string | undefined): QueryCategory {
77
+ const key = (query ?? 'all').trim().toLowerCase();
78
+ if (key in QUERY_FIELDS) return key as QueryCategory;
79
+ return 'all';
80
+ }
81
+
82
+ async function readProjectState(projectDir: string, query: string | undefined): Promise<Record<string, unknown>> {
59
83
  const gsdDir = join(resolve(projectDir), '.gsd');
60
- const result: Record<string, unknown> = { projectDir: resolve(projectDir) };
84
+ const category = normalizeQuery(query);
85
+ const wanted = new Set<ProjectStateField>(QUERY_FIELDS[category]);
61
86
 
62
- // STATE.md current execution state
63
- try {
64
- result.state = await readFile(join(gsdDir, 'STATE.md'), 'utf-8');
65
- } catch {
66
- result.state = null;
87
+ const result: Record<string, unknown> = {
88
+ projectDir: resolve(projectDir),
89
+ query: category,
90
+ };
91
+
92
+ if (wanted.has('state')) {
93
+ try {
94
+ result.state = await readFile(join(gsdDir, 'STATE.md'), 'utf-8');
95
+ } catch {
96
+ result.state = null;
97
+ }
67
98
  }
68
99
 
69
- // PROJECT.md — project description
70
- try {
71
- result.project = await readFile(join(gsdDir, 'PROJECT.md'), 'utf-8');
72
- } catch {
73
- result.project = null;
100
+ if (wanted.has('project')) {
101
+ try {
102
+ result.project = await readFile(join(gsdDir, 'PROJECT.md'), 'utf-8');
103
+ } catch {
104
+ result.project = null;
105
+ }
74
106
  }
75
107
 
76
- // REQUIREMENTS.md — requirement contract
77
- try {
78
- result.requirements = await readFile(join(gsdDir, 'REQUIREMENTS.md'), 'utf-8');
79
- } catch {
80
- result.requirements = null;
108
+ if (wanted.has('requirements')) {
109
+ try {
110
+ result.requirements = await readFile(join(gsdDir, 'REQUIREMENTS.md'), 'utf-8');
111
+ } catch {
112
+ result.requirements = null;
113
+ }
81
114
  }
82
115
 
83
- // List milestones with basic metadata
84
- const milestonesDir = join(gsdDir, 'milestones');
85
- try {
86
- const entries = await readdir(milestonesDir, { withFileTypes: true });
87
- const milestones: Array<{ id: string; hasRoadmap: boolean; hasSummary: boolean }> = [];
88
- for (const entry of entries) {
89
- if (!entry.isDirectory()) continue;
90
- const mDir = join(milestonesDir, entry.name);
91
- const hasRoadmap = await fileExists(join(mDir, `${entry.name}-ROADMAP.md`));
92
- const hasSummary = await fileExists(join(mDir, `${entry.name}-SUMMARY.md`));
93
- milestones.push({ id: entry.name, hasRoadmap, hasSummary });
116
+ if (wanted.has('milestones')) {
117
+ const milestonesDir = join(gsdDir, 'milestones');
118
+ try {
119
+ const entries = await readdir(milestonesDir, { withFileTypes: true });
120
+ const milestones: Array<{ id: string; hasRoadmap: boolean; hasSummary: boolean }> = [];
121
+ for (const entry of entries) {
122
+ if (!entry.isDirectory()) continue;
123
+ const mDir = join(milestonesDir, entry.name);
124
+ const hasRoadmap = await fileExists(join(mDir, `${entry.name}-ROADMAP.md`));
125
+ const hasSummary = await fileExists(join(mDir, `${entry.name}-SUMMARY.md`));
126
+ milestones.push({ id: entry.name, hasRoadmap, hasSummary });
127
+ }
128
+ result.milestones = milestones;
129
+ } catch {
130
+ result.milestones = [];
94
131
  }
95
- result.milestones = milestones;
96
- } catch {
97
- result.milestones = [];
98
132
  }
99
133
 
100
134
  return result;
@@ -128,8 +162,25 @@ interface ElicitRequestFormParams {
128
162
  };
129
163
  }
130
164
 
165
+ /**
166
+ * Handler extra — the second argument passed by McpServer.tool handlers.
167
+ * Contains an AbortSignal scoped to the JSON-RPC request (cancelled when
168
+ * the client cancels the `tools/call`) plus other per-request metadata.
169
+ * Tools that can actually be stopped mid-flight should honour `signal`.
170
+ */
171
+ export interface McpToolExtra {
172
+ signal?: AbortSignal;
173
+ requestId?: string | number;
174
+ sendNotification?: (notification: unknown) => void | Promise<void>;
175
+ }
176
+
131
177
  interface McpServerInstance {
132
- tool(name: string, description: string, params: Record<string, unknown>, handler: (args: Record<string, unknown>) => Promise<unknown>): unknown;
178
+ tool(
179
+ name: string,
180
+ description: string,
181
+ params: Record<string, unknown>,
182
+ handler: (args: Record<string, unknown>, extra?: McpToolExtra) => Promise<unknown>,
183
+ ): unknown;
133
184
  server: {
134
185
  elicitInput(
135
186
  params: AskUserQuestionsElicitRequest | ElicitRequestFormParams,
@@ -302,7 +353,12 @@ export async function createMcpServer(sessionManager: SessionManager): Promise<{
302
353
  );
303
354
 
304
355
  // -----------------------------------------------------------------------
305
- // gsd_execute — start a new GSD auto-mode session
356
+ // gsd_execute — start a new GSD auto-mode session.
357
+ //
358
+ // If the JSON-RPC request is aborted while the session is starting (or
359
+ // immediately after), we cancel the session so we don't leak a background
360
+ // RpcClient process. Once the session is running the caller should use
361
+ // `gsd_cancel` to stop it via sessionId.
306
362
  // -----------------------------------------------------------------------
307
363
  server.tool(
308
364
  'gsd_execute',
@@ -313,12 +369,20 @@ export async function createMcpServer(sessionManager: SessionManager): Promise<{
313
369
  model: z.string().optional().describe('Model ID override'),
314
370
  bare: z.boolean().optional().describe('Run in bare mode (skip user config)'),
315
371
  },
316
- async (args: Record<string, unknown>) => {
372
+ async (args: Record<string, unknown>, extra?: McpToolExtra) => {
317
373
  const { projectDir, command, model, bare } = args as {
318
374
  projectDir: string; command?: string; model?: string; bare?: boolean;
319
375
  };
320
376
  try {
321
377
  const sessionId = await sessionManager.startSession(projectDir, { command, model, bare });
378
+
379
+ // If the client aborted while startSession was running, cancel the
380
+ // newly-created session rather than leaving an orphaned process.
381
+ if (extra?.signal?.aborted) {
382
+ await sessionManager.cancelSession(sessionId).catch(() => { /* swallow */ });
383
+ return errorContent('gsd_execute aborted by client before returning');
384
+ }
385
+
322
386
  return jsonContent({ sessionId, status: 'started' });
323
387
  } catch (err) {
324
388
  return errorContent(err instanceof Error ? err.message : String(err));
@@ -411,17 +475,25 @@ export async function createMcpServer(sessionManager: SessionManager): Promise<{
411
475
  );
412
476
 
413
477
  // -----------------------------------------------------------------------
414
- // gsd_query — read project state from filesystem (no session needed)
478
+ // gsd_query — read project state from filesystem (no session needed).
479
+ //
480
+ // `query` is optional: when omitted the tool returns all fields (STATE.md,
481
+ // PROJECT.md, requirements, milestone listing). Accepted narrow values:
482
+ // "state" / "status", "project", "requirements", "milestones", "all".
483
+ // Unknown values fall back to "all" for forward-compatibility.
415
484
  // -----------------------------------------------------------------------
416
485
  server.tool(
417
486
  'gsd_query',
418
- 'Query GSD project state from the filesystem. Returns STATE.md, PROJECT.md, requirements, and milestone listing. Does not require an active session.',
487
+ 'Query GSD project state from the filesystem. By default returns STATE.md, PROJECT.md, requirements, and milestone listing. Pass `query` to narrow the response (accepted: "state"/"status", "project", "requirements", "milestones", "all"). Does not require an active session.',
419
488
  {
420
489
  projectDir: z.string().describe('Absolute path to the project directory'),
421
- query: z.string().describe('What to query (e.g. "status", "milestones", "requirements")'),
490
+ query: z
491
+ .enum(['all', 'state', 'status', 'project', 'requirements', 'milestones'])
492
+ .optional()
493
+ .describe('Narrow the response to a single field (default: "all")'),
422
494
  },
423
495
  async (args: Record<string, unknown>) => {
424
- const { projectDir, query } = args as { projectDir: string; query: string };
496
+ const { projectDir, query } = args as { projectDir: string; query?: string };
425
497
  try {
426
498
  const state = await readProjectState(projectDir, query);
427
499
  return jsonContent(state);
@@ -384,6 +384,116 @@ describe("workflow MCP tools", () => {
384
384
  }
385
385
  });
386
386
 
387
+ it("gsd_requirement_save opens the DB before inline requirement writes", async () => {
388
+ const base = makeTmpBase();
389
+ try {
390
+ const server = makeMockServer();
391
+ registerWorkflowTools(server as any);
392
+ const requirementTool = server.tools.find((t) => t.name === "gsd_requirement_save");
393
+ assert.ok(requirementTool, "requirement tool should be registered");
394
+
395
+ closeDatabase();
396
+
397
+ const result = await requirementTool!.handler({
398
+ projectDir: base,
399
+ class: "operability",
400
+ description: "Inline MCP requirement save regression",
401
+ why: "Reproduce missing ensureDbOpen in workflow-tools",
402
+ source: "user",
403
+ status: "active",
404
+ primary_owner: "M010/S10",
405
+ validation: "n/a",
406
+ });
407
+
408
+ assert.match((result as any).content[0].text as string, /Saved requirement R\d+/);
409
+ assert.ok(existsSync(join(base, ".gsd", "REQUIREMENTS.md")), "REQUIREMENTS.md should be written to disk");
410
+ const row = _getAdapter()!
411
+ .prepare("SELECT id, class, description FROM requirements WHERE description = ?")
412
+ .get("Inline MCP requirement save regression") as Record<string, unknown> | undefined;
413
+ assert.ok(row, "requirement should be written to the database");
414
+ assert.equal(row["class"], "operability");
415
+ } finally {
416
+ cleanup(base);
417
+ }
418
+ });
419
+
420
+ it("gsd_plan_task reopens the DB before inline task planning writes", async () => {
421
+ const base = makeTmpBase();
422
+ try {
423
+ const server = makeMockServer();
424
+ registerWorkflowTools(server as any);
425
+ const milestoneTool = server.tools.find((t) => t.name === "gsd_plan_milestone");
426
+ const sliceTool = server.tools.find((t) => t.name === "gsd_plan_slice");
427
+ const taskTool = server.tools.find((t) => t.name === "gsd_plan_task");
428
+ assert.ok(milestoneTool, "milestone planning tool should be registered");
429
+ assert.ok(sliceTool, "slice planning tool should be registered");
430
+ assert.ok(taskTool, "task planning tool should be registered");
431
+
432
+ await milestoneTool!.handler({
433
+ projectDir: base,
434
+ milestoneId: "M010",
435
+ title: "Inline task planning DB reopen",
436
+ vision: "Seed a slice, close the DB, then plan another task inline.",
437
+ slices: [
438
+ {
439
+ sliceId: "S10",
440
+ title: "Inline task planning",
441
+ risk: "medium",
442
+ depends: [],
443
+ demo: "Inline gsd_plan_task reopens the DB after it was closed.",
444
+ goal: "Preserve MCP task planning after the DB adapter is closed.",
445
+ successCriteria: "The second task plan persists after a closed DB is reopened.",
446
+ proofLevel: "integration",
447
+ integrationClosure: "The inline MCP handler reopens the DB before planning.",
448
+ observabilityImpact: "workflow-tools MCP tests cover the inline reopen path.",
449
+ },
450
+ ],
451
+ });
452
+ await sliceTool!.handler({
453
+ projectDir: base,
454
+ milestoneId: "M010",
455
+ sliceId: "S10",
456
+ goal: "Create the initial slice plan before closing the DB.",
457
+ tasks: [
458
+ {
459
+ taskId: "T10",
460
+ title: "Seed existing task",
461
+ description: "Create the initial task plan before closing the DB.",
462
+ estimate: "5m",
463
+ files: ["packages/mcp-server/src/workflow-tools.ts"],
464
+ verify: "node --test",
465
+ inputs: ["M010-ROADMAP.md"],
466
+ expectedOutput: ["T10-PLAN.md"],
467
+ },
468
+ ],
469
+ });
470
+
471
+ closeDatabase();
472
+
473
+ const result = await taskTool!.handler({
474
+ projectDir: base,
475
+ milestoneId: "M010",
476
+ sliceId: "S10",
477
+ taskId: "T11",
478
+ title: "Reopen and plan",
479
+ description: "Exercise the inline plan-task path after the DB was closed.",
480
+ estimate: "5m",
481
+ files: ["packages/mcp-server/src/workflow-tools.ts"],
482
+ verify: "node --test",
483
+ inputs: ["M010-ROADMAP.md", "S10-PLAN.md"],
484
+ expectedOutput: ["T11-PLAN.md"],
485
+ });
486
+
487
+ assert.match((result as any).content[0].text as string, /Planned task T11/);
488
+ assert.ok(
489
+ existsSync(join(base, ".gsd", "milestones", "M010", "slices", "S10", "tasks", "T11-PLAN.md")),
490
+ "T11 plan should be written after reopening the DB",
491
+ );
492
+ } finally {
493
+ cleanup(base);
494
+ }
495
+ });
496
+
387
497
  it("gsd_replan_slice and gsd_slice_replan work end-to-end", async () => {
388
498
  const base = makeTmpBase();
389
499
  try {
@@ -244,6 +244,10 @@ type WorkflowWriteGateModule = {
244
244
  ) => { block: boolean; reason?: string };
245
245
  };
246
246
 
247
+ type WorkflowDbBootstrapModule = {
248
+ ensureDbOpen: (basePath?: string) => Promise<boolean>;
249
+ };
250
+
247
251
  let workflowToolExecutorsPromise: Promise<WorkflowToolExecutors> | null = null;
248
252
  let workflowExecutionQueue: Promise<void> = Promise.resolve();
249
253
  let workflowWriteGatePromise: Promise<WorkflowWriteGateModule> | null = null;
@@ -506,6 +510,22 @@ async function runSerializedWorkflowOperation<T>(fn: () => Promise<T>): Promise<
506
510
  }
507
511
  }
508
512
 
513
+ async function runSerializedWorkflowDbOperation<T>(
514
+ projectDir: string,
515
+ fn: () => Promise<T>,
516
+ ): Promise<T> {
517
+ return runSerializedWorkflowOperation(async () => {
518
+ const { ensureDbOpen } = await importLocalModule<WorkflowDbBootstrapModule>(
519
+ "../../../src/resources/extensions/gsd/bootstrap/dynamic-tools.js",
520
+ );
521
+ const dbAvailable = await ensureDbOpen(projectDir);
522
+ if (!dbAvailable) {
523
+ throw new Error("GSD database is not available");
524
+ }
525
+ return fn();
526
+ });
527
+ }
528
+
509
529
  async function enforceWorkflowWriteGate(
510
530
  toolName: string,
511
531
  projectDir: string,
@@ -767,7 +787,7 @@ const saveGateResultParams = {
767
787
  projectDir: projectDirParam,
768
788
  milestoneId: z.string().describe("Milestone ID (e.g. M001)"),
769
789
  sliceId: z.string().describe("Slice ID (e.g. S01)"),
770
- gateId: z.enum(["Q3", "Q4", "Q5", "Q6", "Q7", "Q8"]).describe("Gate ID"),
790
+ gateId: z.enum(["Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "MV01", "MV02", "MV03", "MV04"]).describe("Gate ID"),
771
791
  taskId: z.string().optional().describe("Task ID for task-scoped gates"),
772
792
  verdict: z.enum(["pass", "flag", "omitted"]).describe("Gate verdict"),
773
793
  rationale: z.string().describe("One-sentence justification"),
@@ -969,7 +989,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
969
989
  const parsed = parseWorkflowArgs(decisionSaveSchema, args);
970
990
  const { projectDir, ...params } = parsed;
971
991
  await enforceWorkflowWriteGate("gsd_decision_save", projectDir);
972
- const result = await runSerializedWorkflowOperation(async () => {
992
+ const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
973
993
  const { saveDecisionToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
974
994
  return saveDecisionToDb(params, projectDir);
975
995
  });
@@ -985,7 +1005,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
985
1005
  const parsed = parseWorkflowArgs(decisionSaveSchema, args);
986
1006
  const { projectDir, ...params } = parsed;
987
1007
  await enforceWorkflowWriteGate("gsd_decision_save", projectDir);
988
- const result = await runSerializedWorkflowOperation(async () => {
1008
+ const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
989
1009
  const { saveDecisionToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
990
1010
  return saveDecisionToDb(params, projectDir);
991
1011
  });
@@ -1001,7 +1021,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
1001
1021
  const parsed = parseWorkflowArgs(requirementUpdateSchema, args);
1002
1022
  const { projectDir, id, ...updates } = parsed;
1003
1023
  await enforceWorkflowWriteGate("gsd_requirement_update", projectDir);
1004
- await runSerializedWorkflowOperation(async () => {
1024
+ await runSerializedWorkflowDbOperation(projectDir, async () => {
1005
1025
  const { updateRequirementInDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
1006
1026
  return updateRequirementInDb(id, updates, projectDir);
1007
1027
  });
@@ -1017,7 +1037,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
1017
1037
  const parsed = parseWorkflowArgs(requirementUpdateSchema, args);
1018
1038
  const { projectDir, id, ...updates } = parsed;
1019
1039
  await enforceWorkflowWriteGate("gsd_requirement_update", projectDir);
1020
- await runSerializedWorkflowOperation(async () => {
1040
+ await runSerializedWorkflowDbOperation(projectDir, async () => {
1021
1041
  const { updateRequirementInDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
1022
1042
  return updateRequirementInDb(id, updates, projectDir);
1023
1043
  });
@@ -1033,7 +1053,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
1033
1053
  const parsed = parseWorkflowArgs(requirementSaveSchema, args);
1034
1054
  const { projectDir, ...params } = parsed;
1035
1055
  await enforceWorkflowWriteGate("gsd_requirement_save", projectDir);
1036
- const result = await runSerializedWorkflowOperation(async () => {
1056
+ const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
1037
1057
  const { saveRequirementToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
1038
1058
  return saveRequirementToDb(params, projectDir);
1039
1059
  });
@@ -1049,7 +1069,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
1049
1069
  const parsed = parseWorkflowArgs(requirementSaveSchema, args);
1050
1070
  const { projectDir, ...params } = parsed;
1051
1071
  await enforceWorkflowWriteGate("gsd_requirement_save", projectDir);
1052
- const result = await runSerializedWorkflowOperation(async () => {
1072
+ const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
1053
1073
  const { saveRequirementToDb } = await importLocalModule<any>("../../../src/resources/extensions/gsd/db-writer.js");
1054
1074
  return saveRequirementToDb(params, projectDir);
1055
1075
  });
@@ -1064,7 +1084,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
1064
1084
  async (args: Record<string, unknown>) => {
1065
1085
  const { projectDir } = parseWorkflowArgs(milestoneGenerateIdSchema, args);
1066
1086
  await enforceWorkflowWriteGate("gsd_milestone_generate_id", projectDir);
1067
- const id = await runSerializedWorkflowOperation(async () => {
1087
+ const id = await runSerializedWorkflowDbOperation(projectDir, async () => {
1068
1088
  const {
1069
1089
  claimReservedId,
1070
1090
  findMilestoneIds,
@@ -1092,7 +1112,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
1092
1112
  async (args: Record<string, unknown>) => {
1093
1113
  const { projectDir } = parseWorkflowArgs(milestoneGenerateIdSchema, args);
1094
1114
  await enforceWorkflowWriteGate("gsd_milestone_generate_id", projectDir);
1095
- const id = await runSerializedWorkflowOperation(async () => {
1115
+ const id = await runSerializedWorkflowDbOperation(projectDir, async () => {
1096
1116
  const {
1097
1117
  claimReservedId,
1098
1118
  findMilestoneIds,
@@ -1147,7 +1167,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
1147
1167
  const parsed = parseWorkflowArgs(planTaskSchema, args);
1148
1168
  const { projectDir, ...params } = parsed;
1149
1169
  await enforceWorkflowWriteGate("gsd_plan_task", projectDir, params.milestoneId);
1150
- const result = await runSerializedWorkflowOperation(async () => {
1170
+ const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
1151
1171
  const { handlePlanTask } = await importLocalModule<any>("../../../src/resources/extensions/gsd/tools/plan-task.js");
1152
1172
  return handlePlanTask(params, projectDir);
1153
1173
  });
@@ -1168,7 +1188,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
1168
1188
  const parsed = parseWorkflowArgs(planTaskSchema, args);
1169
1189
  const { projectDir, ...params } = parsed;
1170
1190
  await enforceWorkflowWriteGate("gsd_plan_task", projectDir, params.milestoneId);
1171
- const result = await runSerializedWorkflowOperation(async () => {
1191
+ const result = await runSerializedWorkflowDbOperation(projectDir, async () => {
1172
1192
  const { handlePlanTask } = await importLocalModule<any>("../../../src/resources/extensions/gsd/tools/plan-task.js");
1173
1193
  return handlePlanTask(params, projectDir);
1174
1194
  });
@@ -1228,7 +1248,7 @@ export function registerWorkflowTools(server: McpToolServer): void {
1228
1248
  async (args: Record<string, unknown>) => {
1229
1249
  const { projectDir, milestoneId, sliceId, reason } = parseWorkflowArgs(skipSliceSchema, args);
1230
1250
  await enforceWorkflowWriteGate("gsd_skip_slice", projectDir, milestoneId);
1231
- await runSerializedWorkflowOperation(async () => {
1251
+ await runSerializedWorkflowDbOperation(projectDir, async () => {
1232
1252
  const { getSlice, updateSliceStatus } = await importLocalModule<any>("../../../src/resources/extensions/gsd/gsd-db.js");
1233
1253
  const { invalidateStateCache } = await importLocalModule<any>("../../../src/resources/extensions/gsd/state.js");
1234
1254
  const { rebuildState } = await importLocalModule<any>("../../../src/resources/extensions/gsd/doctor.js");
@@ -84,7 +84,7 @@ export const streamBedrock = (model, context, options = {}) => {
84
84
  messages: convertMessages(context, model, cacheRetention),
85
85
  system: buildSystemPrompt(context.systemPrompt, model, cacheRetention),
86
86
  inferenceConfig: { maxTokens: options.maxTokens, temperature: options.temperature },
87
- toolConfig: convertToolConfig(context.tools, options.toolChoice),
87
+ toolConfig: convertToolConfig(context.tools, options.toolChoice, model, cacheRetention),
88
88
  additionalModelRequestFields: buildAdditionalModelRequestFields(model, options),
89
89
  };
90
90
  const nextCommandInput = await options?.onPayload?.(commandInput, model);
@@ -497,7 +497,7 @@ function convertMessages(context, model, cacheRetention) {
497
497
  }
498
498
  return result;
499
499
  }
500
- function convertToolConfig(tools, toolChoice) {
500
+ function convertToolConfig(tools, toolChoice, model, cacheRetention) {
501
501
  if (!tools?.length || toolChoice === "none")
502
502
  return undefined;
503
503
  const bedrockTools = tools.map((tool) => ({
@@ -507,6 +507,15 @@ function convertToolConfig(tools, toolChoice) {
507
507
  inputSchema: { json: tool.parameters },
508
508
  },
509
509
  }));
510
+ // Add cachePoint after last tool for supported models
511
+ if (cacheRetention !== "none" && supportsPromptCaching(model)) {
512
+ bedrockTools.push({
513
+ cachePoint: {
514
+ type: CachePointType.DEFAULT,
515
+ ...(cacheRetention === "long" ? { ttl: CacheTTL.ONE_HOUR } : {}),
516
+ },
517
+ });
518
+ }
510
519
  let bedrockToolChoice;
511
520
  switch (toolChoice) {
512
521
  case "auto":