gsd-pi 2.82.0-dev.ed17d078d → 3.0.0

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 (567) hide show
  1. package/README.md +6 -5
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/GSD-WORKFLOW.md +10 -1
  4. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  5. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +1 -1
  6. package/dist/resources/extensions/cmux/index.js +5 -0
  7. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  8. package/dist/resources/extensions/gsd/auto/loop.js +19 -6
  9. package/dist/resources/extensions/gsd/auto/orchestrator.js +11 -0
  10. package/dist/resources/extensions/gsd/auto/phases.js +81 -31
  11. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  14. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  15. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  16. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
  17. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +246 -133
  19. package/dist/resources/extensions/gsd/auto-prompts.js +2 -2
  20. package/dist/resources/extensions/gsd/auto-recovery.js +71 -14
  21. package/dist/resources/extensions/gsd/auto-start.js +87 -14
  22. package/dist/resources/extensions/gsd/auto-verification.js +45 -26
  23. package/dist/resources/extensions/gsd/auto-worktree.js +176 -10
  24. package/dist/resources/extensions/gsd/auto.js +57 -33
  25. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  27. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +4 -2
  28. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  29. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +17 -3
  30. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  31. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  32. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  33. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  34. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  35. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
  36. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  37. package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
  38. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  39. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  40. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
  41. package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
  42. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  43. package/dist/resources/extensions/gsd/doctor.js +2 -28
  44. package/dist/resources/extensions/gsd/export-html.js +27 -425
  45. package/dist/resources/extensions/gsd/forensics.js +3 -3
  46. package/dist/resources/extensions/gsd/git-service.js +45 -3
  47. package/dist/resources/extensions/gsd/gsd-db.js +21 -6
  48. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  49. package/dist/resources/extensions/gsd/guided-flow.js +101 -116
  50. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  51. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -8
  52. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  53. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  54. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  55. package/dist/resources/extensions/gsd/native-git-bridge.js +48 -12
  56. package/dist/resources/extensions/gsd/paths.js +4 -0
  57. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  58. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
  59. package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
  60. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  61. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  62. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  63. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  64. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  65. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  66. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  67. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  68. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  69. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  70. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  71. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  72. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  73. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  74. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  75. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  76. package/dist/resources/extensions/gsd/state.js +3 -3
  77. package/dist/resources/extensions/gsd/status-guards.js +11 -0
  78. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  79. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  80. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  81. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  82. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  83. package/dist/resources/extensions/gsd/tools/plan-slice.js +87 -14
  84. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  85. package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
  86. package/dist/resources/extensions/gsd/validation.js +23 -1
  87. package/dist/resources/extensions/gsd/verification-gate.js +68 -7
  88. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  89. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  90. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  91. package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
  92. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  93. package/dist/resources/extensions/shared/html-shell.js +388 -0
  94. package/dist/resources/extensions/subagent/index.js +448 -78
  95. package/dist/resources/extensions/subagent/launch.js +77 -0
  96. package/dist/resources/extensions/subagent/run-store.js +148 -0
  97. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  98. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  99. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  100. package/dist/resources/extensions/visual-brief/index.js +5 -0
  101. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  102. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  103. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  104. package/dist/web/standalone/.next/BUILD_ID +1 -1
  105. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  106. package/dist/web/standalone/.next/build-manifest.json +4 -4
  107. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  108. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  109. package/dist/web/standalone/.next/required-server-files.json +3 -3
  110. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  111. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  121. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  131. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  138. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  150. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  186. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  202. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  206. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/index.html +1 -1
  216. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  217. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  218. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  219. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  221. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  222. package/dist/web/standalone/.next/server/app/page.js +2 -2
  223. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  226. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  227. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  228. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  229. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/middleware.js +2 -2
  232. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  234. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  235. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  236. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  237. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  238. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  239. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  241. package/dist/web/standalone/.next/static/chunks/app/layout-b23b3f6858dc6dc8.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  246. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  247. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  248. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  249. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  250. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  251. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  252. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  253. package/dist/web/standalone/server.js +1 -1
  254. package/package.json +4 -4
  255. package/packages/contracts/dist/rpc.test.js +7 -0
  256. package/packages/contracts/dist/rpc.test.js.map +1 -1
  257. package/packages/contracts/dist/workflow.d.ts +21 -0
  258. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  259. package/packages/contracts/dist/workflow.js +24 -0
  260. package/packages/contracts/dist/workflow.js.map +1 -1
  261. package/packages/contracts/src/rpc.test.ts +8 -0
  262. package/packages/contracts/src/workflow.ts +24 -0
  263. package/packages/daemon/package.json +2 -2
  264. package/packages/mcp-server/README.md +13 -4
  265. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  266. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  267. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  268. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  269. package/packages/mcp-server/package.json +2 -2
  270. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  271. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  272. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  273. package/packages/native/package.json +1 -1
  274. package/packages/native/tsconfig.json +2 -1
  275. package/packages/native/tsconfig.tsbuildinfo +1 -1
  276. package/packages/pi-agent-core/package.json +1 -1
  277. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  278. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  279. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  280. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  281. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  282. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  283. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  284. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  285. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  286. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  287. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  288. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  289. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  290. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  291. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  292. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  293. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  294. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  295. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  296. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  297. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  298. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  299. package/packages/pi-ai/package.json +1 -1
  300. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  301. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  302. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  303. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  304. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  305. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  306. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  307. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  308. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  310. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  312. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  314. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  316. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  321. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  322. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  326. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  328. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  329. package/packages/pi-coding-agent/package.json +1 -1
  330. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  331. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  332. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  333. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  334. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  335. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  336. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  337. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  338. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  339. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  340. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  341. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  342. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  343. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  344. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  345. package/packages/pi-tui/dist/terminal.js +12 -0
  346. package/packages/pi-tui/dist/terminal.js.map +1 -1
  347. package/packages/pi-tui/package.json +1 -1
  348. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  349. package/packages/pi-tui/src/terminal.ts +11 -0
  350. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  351. package/packages/rpc-client/package.json +1 -1
  352. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  353. package/pkg/package.json +1 -1
  354. package/src/resources/GSD-WORKFLOW.md +10 -1
  355. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  356. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1 -1
  357. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  358. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +9 -0
  359. package/src/resources/extensions/cmux/index.ts +6 -0
  360. package/src/resources/extensions/gsd/auto/contracts.ts +14 -6
  361. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  362. package/src/resources/extensions/gsd/auto/loop.ts +22 -6
  363. package/src/resources/extensions/gsd/auto/orchestrator.ts +11 -0
  364. package/src/resources/extensions/gsd/auto/phases.ts +90 -38
  365. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  366. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  367. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  368. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  369. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  370. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
  371. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  372. package/src/resources/extensions/gsd/auto-post-unit.ts +279 -144
  373. package/src/resources/extensions/gsd/auto-prompts.ts +2 -2
  374. package/src/resources/extensions/gsd/auto-recovery.ts +74 -11
  375. package/src/resources/extensions/gsd/auto-start.ts +94 -12
  376. package/src/resources/extensions/gsd/auto-verification.ts +58 -36
  377. package/src/resources/extensions/gsd/auto-worktree.ts +193 -10
  378. package/src/resources/extensions/gsd/auto.ts +59 -31
  379. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  380. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  381. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +4 -2
  382. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  383. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +20 -4
  384. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  385. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  386. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  387. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  388. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  389. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
  390. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  391. package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
  392. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  393. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  394. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
  395. package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
  396. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  397. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  398. package/src/resources/extensions/gsd/doctor.ts +2 -27
  399. package/src/resources/extensions/gsd/export-html.ts +27 -427
  400. package/src/resources/extensions/gsd/forensics.ts +3 -3
  401. package/src/resources/extensions/gsd/git-service.ts +51 -4
  402. package/src/resources/extensions/gsd/gsd-db.ts +21 -6
  403. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  404. package/src/resources/extensions/gsd/guided-flow.ts +134 -133
  405. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  406. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -8
  407. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  408. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  409. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  410. package/src/resources/extensions/gsd/native-git-bridge.ts +54 -12
  411. package/src/resources/extensions/gsd/paths.ts +5 -0
  412. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  413. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
  414. package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
  415. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  416. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  417. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  418. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  419. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  420. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  421. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  422. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  423. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  424. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  425. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  426. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  427. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  428. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  429. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  430. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  431. package/src/resources/extensions/gsd/state.ts +3 -3
  432. package/src/resources/extensions/gsd/status-guards.ts +13 -0
  433. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  434. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  435. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  436. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  437. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +56 -0
  438. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +80 -1
  439. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  440. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  441. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  442. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +91 -6
  443. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  444. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  445. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  446. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  447. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  448. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  449. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
  450. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  451. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  452. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  453. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  454. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  455. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
  456. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  457. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  458. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +59 -2
  459. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
  460. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
  461. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  462. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
  463. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  464. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +11 -0
  465. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  466. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  467. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  468. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  469. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  470. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  471. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  472. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  473. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  474. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  475. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  476. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +112 -1
  477. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  478. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +46 -0
  479. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  480. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  481. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  482. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
  483. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  484. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  485. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  486. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  487. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  488. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  489. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +251 -2
  490. package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
  491. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  492. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
  493. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  494. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  495. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
  496. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +59 -0
  497. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  498. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  499. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  500. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  501. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  502. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  503. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
  504. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  505. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  506. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  507. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  508. package/src/resources/extensions/gsd/tests/status-guards.test.ts +13 -1
  509. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  510. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  511. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +103 -7
  512. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  513. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
  514. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  515. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  516. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  517. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  518. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  519. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  520. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  521. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
  522. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +54 -0
  523. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  524. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  525. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  526. package/src/resources/extensions/gsd/tools/plan-slice.ts +97 -12
  527. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  528. package/src/resources/extensions/gsd/types.ts +1 -1
  529. package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
  530. package/src/resources/extensions/gsd/validation.ts +23 -1
  531. package/src/resources/extensions/gsd/verification-gate.ts +78 -6
  532. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  533. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  534. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  535. package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
  536. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  537. package/src/resources/extensions/shared/html-shell.ts +412 -0
  538. package/src/resources/extensions/subagent/index.ts +567 -103
  539. package/src/resources/extensions/subagent/launch.ts +131 -0
  540. package/src/resources/extensions/subagent/run-store.ts +218 -0
  541. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  542. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  543. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  544. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  545. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  546. package/src/resources/extensions/visual-brief/index.ts +8 -0
  547. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  548. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  549. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  550. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  551. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  553. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  555. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +0 -1
  556. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  557. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  558. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  559. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  560. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  561. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  562. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  563. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  564. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  565. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  566. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → qoMxZh-xuwuvpFW0x0k01}/_buildManifest.js +0 -0
  567. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → qoMxZh-xuwuvpFW0x0k01}/_ssgManifest.js +0 -0
@@ -7,13 +7,17 @@ import {
7
7
  ARTIFACT_KEYS,
8
8
  KNOWN_UNIT_TYPES,
9
9
  UNIT_MANIFESTS,
10
+ resolveSubagentPermissionContract,
10
11
  resolveManifest,
11
12
  type ArtifactKey,
12
13
  type ContextModePolicy,
13
14
  type SkillsPolicy,
14
15
  type UnitContextManifest,
15
16
  } from "../unit-context-manifest.ts";
16
- import { ALLOWED_PLANNING_DISPATCH_AGENTS } from "../bootstrap/write-gate.ts";
17
+ import {
18
+ ALLOWED_PLANNING_DISPATCH_AGENTS,
19
+ shouldBlockPlanningUnit,
20
+ } from "../bootstrap/write-gate.ts";
17
21
  import {
18
22
  getRequiredWorkflowToolsForAutoUnit,
19
23
  getRequiredWorkflowToolsForGuidedUnit,
@@ -216,7 +220,7 @@ test("#4934: every manifest declares a tools policy", () => {
216
220
  });
217
221
 
218
222
  test("#4934: tools.mode is one of the declared policies", () => {
219
- const validModes = new Set(["all", "read-only", "planning", "planning-dispatch", "docs"]);
223
+ const validModes = new Set(["all", "read-only", "planning", "planning-dispatch", "docs", "verification"]);
220
224
  for (const [unitType, manifest] of Object.entries(UNIT_MANIFESTS)) {
221
225
  const mode = (manifest as { tools: { mode: string } }).tools.mode;
222
226
  assert.ok(
@@ -226,27 +230,101 @@ test("#4934: tools.mode is one of the declared policies", () => {
226
230
  }
227
231
  });
228
232
 
229
- test('#4934: only execute-task and reactive-execute may use tools.mode "all" (full source-tree write access)', () => {
230
- const allowedAllUnits = new Set(["execute-task", "reactive-execute"]);
233
+ test('#4934: only execution units and complete-milestone may use tools.mode "all"', () => {
234
+ const allowedAllUnits = new Set(["execute-task", "reactive-execute", "complete-milestone"]);
231
235
  for (const [unitType, manifest] of Object.entries(UNIT_MANIFESTS)) {
232
236
  const mode = (manifest as { tools: { mode: string } }).tools.mode;
233
237
  if (mode === "all") {
234
238
  assert.ok(
235
239
  allowedAllUnits.has(unitType),
236
- `manifest "${unitType}" declares tools.mode = "all" but is not on the execute-track. ` +
237
- 'Only execute-task and reactive-execute should have full source write access; ' +
240
+ `manifest "${unitType}" declares tools.mode = "all" but is not explicitly allowed. ` +
241
+ 'Only execute-task, reactive-execute, and complete-milestone should have full source write access; ' +
238
242
  'planning/discuss/research units must use "planning" or "planning-dispatch" (or "docs" for rewrite-docs).',
239
243
  );
240
244
  }
241
245
  }
242
246
  });
243
247
 
248
+ test("#5453: complete-milestone uses all tools so bash verification is not planning-dispatch blocked", () => {
249
+ const manifest = UNIT_MANIFESTS["complete-milestone"];
250
+
251
+ assert.strictEqual(manifest.tools.mode, "all");
252
+ assert.deepEqual(resolveSubagentPermissionContract("complete-milestone"), {
253
+ allowed: true,
254
+ allowedSubagents: ["*"],
255
+ toolsMode: "all",
256
+ });
257
+ // Runtime gate-level regression: these verification commands were blocked
258
+ // under planning-dispatch in #5453; complete-milestone must bypass that gate.
259
+ for (const cmd of ["git diff --name-only HEAD~1", "git log -n1 --oneline"]) {
260
+ const result = shouldBlockPlanningUnit(
261
+ "bash",
262
+ cmd,
263
+ process.cwd(),
264
+ "complete-milestone",
265
+ manifest.tools,
266
+ );
267
+ assert.strictEqual(
268
+ result.block,
269
+ false,
270
+ `shouldBlockPlanningUnit must not block ${cmd} for complete-milestone: ${result.reason}`,
271
+ );
272
+ }
273
+ });
274
+
275
+ test("#5843: run-uat uses verification tools policy so build/test commands can run", () => {
276
+ const manifest = UNIT_MANIFESTS["run-uat"];
277
+
278
+ assert.strictEqual(manifest.tools.mode, "verification");
279
+
280
+ const buildResult = shouldBlockPlanningUnit(
281
+ "bash",
282
+ "npm run build 2>&1",
283
+ process.cwd(),
284
+ "run-uat",
285
+ manifest.tools,
286
+ );
287
+ assert.strictEqual(
288
+ buildResult.block,
289
+ false,
290
+ `run-uat must allow build verification commands: ${buildResult.reason}`,
291
+ );
292
+
293
+ const sourceWriteResult = shouldBlockPlanningUnit(
294
+ "edit",
295
+ "src/main.ts",
296
+ process.cwd(),
297
+ "run-uat",
298
+ manifest.tools,
299
+ );
300
+ assert.strictEqual(sourceWriteResult.block, true);
301
+ assert.match(sourceWriteResult.reason!, /tools-policy "verification"/);
302
+ });
303
+
304
+ test("planning-dispatch hard block message omits internal tracker references", () => {
305
+ const manifest = UNIT_MANIFESTS["validate-milestone"];
306
+ assert.strictEqual(manifest.tools.mode, "planning-dispatch");
307
+
308
+ const result = shouldBlockPlanningUnit(
309
+ "task",
310
+ "scout",
311
+ process.cwd(),
312
+ "validate-milestone",
313
+ manifest.tools,
314
+ );
315
+
316
+ assert.strictEqual(result.block, true);
317
+ assert.ok(result.reason, "blocked dispatch should include a user-facing reason");
318
+ assert.doesNotMatch(result.reason!, /#[0-9]{3,}/);
319
+ });
320
+
244
321
  test('planning-dispatch mode is reserved for slice-level decomposition and completion units', () => {
245
322
  const allowedDispatchUnits = new Set([
246
323
  "plan-slice",
324
+ "research-slice",
247
325
  "refine-slice",
248
326
  "complete-slice",
249
- "complete-milestone",
327
+ "gate-evaluate",
250
328
  // Deep planning mode: research-project orchestrates 4 parallel research
251
329
  // subagents (stack/features/architecture/pitfalls). Subagent dispatch is
252
330
  // the unit's core mechanism — without it, the unit cannot do its job.
@@ -265,6 +343,24 @@ test('planning-dispatch mode is reserved for slice-level decomposition and compl
265
343
  }
266
344
  });
267
345
 
346
+ test('Unit Tool Contract exposes subagent dispatch permissions', () => {
347
+ assert.deepEqual(resolveSubagentPermissionContract("plan-slice"), {
348
+ allowed: true,
349
+ allowedSubagents: ["scout", "planner"],
350
+ toolsMode: "planning-dispatch",
351
+ });
352
+ assert.deepEqual(resolveSubagentPermissionContract("gate-evaluate"), {
353
+ allowed: true,
354
+ allowedSubagents: ["reviewer", "security", "tester"],
355
+ toolsMode: "planning-dispatch",
356
+ });
357
+ assert.deepEqual(resolveSubagentPermissionContract("discuss-milestone"), {
358
+ allowed: false,
359
+ allowedSubagents: [],
360
+ toolsMode: "planning",
361
+ });
362
+ });
363
+
268
364
  test('planning-dispatch manifests declare non-empty allowedSubagents lists', () => {
269
365
  for (const [unitType, manifest] of Object.entries(UNIT_MANIFESTS)) {
270
366
  if (manifest.tools.mode !== "planning-dispatch") continue;
@@ -162,7 +162,7 @@ describe("validate-milestone stuck-loop guard (#4094)", () => {
162
162
  assert.equal(pauseAutoMock.mock.callCount(), 0);
163
163
  });
164
164
 
165
- test("continues when no VALIDATION file exists yet", async () => {
165
+ test("retries when no VALIDATION file exists yet", async () => {
166
166
  insertMilestone({ id: "M001" });
167
167
  insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
168
168
 
@@ -173,7 +173,34 @@ describe("validate-milestone stuck-loop guard (#4094)", () => {
173
173
 
174
174
  const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
175
175
 
176
- assert.equal(result, "continue");
176
+ assert.equal(result, "retry");
177
+ assert.equal(pauseAutoMock.mock.callCount(), 0);
178
+ assert.ok(s.pendingVerificationRetry);
179
+ assert.equal(s.pendingVerificationRetry!.unitId, "M001");
180
+ assert.match(s.pendingVerificationRetry!.failureContext, /gsd_validate_milestone/);
181
+ assert.equal(s.pendingVerificationRetry!.attempt, 1);
182
+ });
183
+
184
+ test("retries when VALIDATION file exists but is empty", async () => {
185
+ insertMilestone({ id: "M001" });
186
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
187
+
188
+ const path = join(tempDir, ".gsd", "milestones", "M001", "M001-VALIDATION.md");
189
+ writeFileSync(path, "", "utf-8");
190
+ invalidateAllCaches();
191
+
192
+ const ctx = makeMockCtx();
193
+ const pi = makeMockPi();
194
+ const pauseAutoMock = mock.fn(async () => {});
195
+ const s = makeMockSession(tempDir, "validate-milestone", "M001");
196
+
197
+ const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
198
+
199
+ assert.equal(result, "retry");
177
200
  assert.equal(pauseAutoMock.mock.callCount(), 0);
201
+ assert.ok(s.pendingVerificationRetry);
202
+ assert.equal(s.pendingVerificationRetry!.unitId, "M001");
203
+ assert.match(s.pendingVerificationRetry!.failureContext, /exists but is empty/);
204
+ assert.equal(s.pendingVerificationRetry!.attempt, 1);
178
205
  });
179
206
  });
@@ -22,7 +22,7 @@ import { join, dirname } from "node:path";
22
22
  import { tmpdir } from "node:os";
23
23
  import { spawnSync } from "node:child_process";
24
24
  import { fileURLToPath, pathToFileURL } from "node:url";
25
- import { discoverCommands, runVerificationGate, formatFailureContext, captureRuntimeErrors, runDependencyAudit, isLikelyCommand } from "../verification-gate.ts";
25
+ import { discoverCommands, runVerificationGate, formatFailureContext, captureRuntimeErrors, runDependencyAudit, isLikelyCommand, validateVerificationCommand } from "../verification-gate.ts";
26
26
  import type { CaptureRuntimeErrorsOptions, DependencyAuditOptions } from "../verification-gate.ts";
27
27
  import { validatePreferences } from "../preferences.ts";
28
28
 
@@ -215,6 +215,102 @@ describe("verification-gate: discovery", () => {
215
215
  assert.equal(result.source, "task-plan");
216
216
  assert.deepStrictEqual(result.commands, ["npm run test"]);
217
217
  });
218
+
219
+ test("taskPlanVerify rejects piped pytest command", () => {
220
+ const result = discoverCommands({
221
+ taskPlanVerify: "python3 -m pytest tests/ -q --tb=short 2>&1 | tail -5",
222
+ cwd: tmp,
223
+ });
224
+ assert.equal(result.source, "none");
225
+ assert.deepStrictEqual(result.commands, []);
226
+ });
227
+
228
+ test("Python project with tests discovers pytest when package.json is absent", () => {
229
+ mkdirSync(join(tmp, "tests"));
230
+ writeFileSync(join(tmp, "tests", "test_sample.py"), "def test_sample():\n assert True\n");
231
+ writeFileSync(
232
+ join(tmp, "pyproject.toml"),
233
+ `[project]
234
+ name = "sample"
235
+
236
+ [tool.pytest.ini_options]
237
+ pythonpath = ["."]
238
+ `,
239
+ );
240
+
241
+ const result = discoverCommands({ cwd: tmp });
242
+
243
+ assert.equal(result.source, "python-project");
244
+ assert.deepStrictEqual(result.commands, ["python3 -m pytest"]);
245
+ });
246
+
247
+ test("Python project with nested Python test file discovers pytest", () => {
248
+ mkdirSync(join(tmp, "tests", "unit"), { recursive: true });
249
+ writeFileSync(join(tmp, "tests", "unit", "sample_test.py"), "def test_sample():\n assert True\n");
250
+
251
+ const result = discoverCommands({ cwd: tmp });
252
+
253
+ assert.equal(result.source, "python-project");
254
+ assert.deepStrictEqual(result.commands, ["python3 -m pytest"]);
255
+ });
256
+
257
+ test("Python project with pytest.ini discovers pytest", () => {
258
+ writeFileSync(join(tmp, "pytest.ini"), "[pytest]\npythonpath = .\n");
259
+
260
+ const result = discoverCommands({ cwd: tmp });
261
+
262
+ assert.equal(result.source, "python-project");
263
+ assert.deepStrictEqual(result.commands, ["python3 -m pytest"]);
264
+ });
265
+
266
+ test("Python project with explicit pyproject pytest marker discovers pytest", () => {
267
+ writeFileSync(
268
+ join(tmp, "pyproject.toml"),
269
+ `[tool.pytest]
270
+ pythonpath = ["."]
271
+ `,
272
+ );
273
+
274
+ const result = discoverCommands({ cwd: tmp });
275
+
276
+ assert.equal(result.source, "python-project");
277
+ assert.deepStrictEqual(result.commands, ["python3 -m pytest"]);
278
+ });
279
+
280
+ test("Python project markers without pytest evidence do not discover pytest", () => {
281
+ mkdirSync(join(tmp, "tests"));
282
+ writeFileSync(join(tmp, "tests", "README.md"), "# tests\n");
283
+ writeFileSync(
284
+ join(tmp, "pyproject.toml"),
285
+ `[project]
286
+ name = "sample"
287
+ dependencies = ["pytest-cov"]
288
+ `,
289
+ );
290
+
291
+ const result = discoverCommands({ cwd: tmp });
292
+
293
+ assert.equal(result.source, "none");
294
+ assert.deepStrictEqual(result.commands, []);
295
+ });
296
+
297
+ test("Python project with setup.cfg alone does not discover pytest", () => {
298
+ writeFileSync(join(tmp, "setup.cfg"), "[tool:pytest]\npythonpath = .\n");
299
+
300
+ const result = discoverCommands({ cwd: tmp });
301
+
302
+ assert.equal(result.source, "none");
303
+ assert.deepStrictEqual(result.commands, []);
304
+ });
305
+
306
+ test("Python project with tox.ini alone does not discover pytest", () => {
307
+ writeFileSync(join(tmp, "tox.ini"), "[pytest]\npythonpath = .\n");
308
+
309
+ const result = discoverCommands({ cwd: tmp });
310
+
311
+ assert.equal(result.source, "none");
312
+ assert.deepStrictEqual(result.commands, []);
313
+ });
218
314
  });
219
315
 
220
316
  // ─── Execution Tests ─────────────────────────────────────────────────────────
@@ -445,6 +541,10 @@ test("isLikelyCommand: prose descriptions are rejected", () => {
445
541
  assert.equal(isLikelyCommand("Build succeeds without errors or warnings"), false);
446
542
  });
447
543
 
544
+ test("isLikelyCommand: non-ASCII prose descriptions are rejected", () => {
545
+ assert.equal(isLikelyCommand("所有 命令 输出 一行 JSONL go test ./... 通过"), false);
546
+ });
547
+
448
548
  test("isLikelyCommand: empty or whitespace-only strings are rejected", () => {
449
549
  assert.equal(isLikelyCommand(""), false);
450
550
  assert.equal(isLikelyCommand(" "), false);
@@ -455,6 +555,15 @@ test("isLikelyCommand: short lowercase tokens without flags are accepted (could
455
555
  assert.equal(isLikelyCommand("mycheck"), true);
456
556
  });
457
557
 
558
+ test("validateVerificationCommand rejects shell control syntax", () => {
559
+ assert.deepEqual(validateVerificationCommand("python3 -m pytest tests/ -q --tb=short").ok, true);
560
+ const result = validateVerificationCommand("python3 -m pytest tests/ -q --tb=short 2>&1 | tail -5");
561
+ assert.equal(result.ok, false);
562
+ if (!result.ok) {
563
+ assert.match(result.reason, /shell control syntax/);
564
+ }
565
+ });
566
+
458
567
  // ─── Additional Preference Validation Tests (T02) ──────────────────────────
459
568
 
460
569
  test("verification-gate: verification_commands produces no unknown-key warnings", () => {
@@ -0,0 +1,78 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Tests for host-owned auto-mode verification verdict policy.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+
7
+ import { decideVerificationVerdict } from "../verification-verdict.ts";
8
+ import type { VerificationResult } from "../types.ts";
9
+
10
+ function makeResult(overrides: Partial<VerificationResult> = {}): VerificationResult {
11
+ return {
12
+ passed: true,
13
+ checks: [],
14
+ discoverySource: "none",
15
+ timestamp: 1,
16
+ ...overrides,
17
+ };
18
+ }
19
+
20
+ test("execute-task fails closed when no host-owned checks are discovered", () => {
21
+ const verdict = decideVerificationVerdict("execute-task", makeResult());
22
+
23
+ assert.equal(verdict.passed, false);
24
+ assert.equal(verdict.reason, "no-host-checks");
25
+ assert.equal(verdict.retryable, false);
26
+ assert.match(verdict.failureContext, /No runnable host-owned verification command/);
27
+ });
28
+
29
+ test("non execute-task units preserve no-check pass semantics", () => {
30
+ const verdict = decideVerificationVerdict("plan-slice", makeResult());
31
+
32
+ assert.equal(verdict.passed, true);
33
+ assert.equal(verdict.reason, "passed");
34
+ });
35
+
36
+ test("execute-task command failure remains retryable verification failure", () => {
37
+ const verdict = decideVerificationVerdict(
38
+ "execute-task",
39
+ makeResult({
40
+ passed: false,
41
+ discoverySource: "package-json",
42
+ checks: [
43
+ {
44
+ command: "npm test",
45
+ exitCode: 1,
46
+ stdout: "",
47
+ stderr: "failed",
48
+ durationMs: 10,
49
+ },
50
+ ],
51
+ }),
52
+ );
53
+
54
+ assert.equal(verdict.passed, false);
55
+ assert.equal(verdict.reason, "checks-failed");
56
+ assert.equal(verdict.retryable, true);
57
+ });
58
+
59
+ test("execute-task passes when a discovered host check succeeds", () => {
60
+ const verdict = decideVerificationVerdict(
61
+ "execute-task",
62
+ makeResult({
63
+ discoverySource: "preference",
64
+ checks: [
65
+ {
66
+ command: "npm test",
67
+ exitCode: 0,
68
+ stdout: "ok",
69
+ stderr: "",
70
+ durationMs: 10,
71
+ },
72
+ ],
73
+ }),
74
+ );
75
+
76
+ assert.equal(verdict.passed, true);
77
+ assert.equal(verdict.reason, "passed");
78
+ });
@@ -165,6 +165,13 @@ test("decideFinalizeResult maps break results to stop decisions", () => {
165
165
  );
166
166
  });
167
167
 
168
+ test("decideFinalizeResult maps step-wizard breaks to completed step exits", () => {
169
+ assert.deepEqual(
170
+ decideFinalizeResult({ action: "break", reason: "step-wizard" }),
171
+ { action: "complete-and-break" },
172
+ );
173
+ });
174
+
168
175
  test("decideFinalizeResult maps continue and next results", () => {
169
176
  assert.deepEqual(
170
177
  decideFinalizeResult({ action: "continue" }),
@@ -375,7 +375,7 @@ test("workflow MCP launch config reaches mutation tools over stdio", async () =>
375
375
  estimate: "10m",
376
376
  files: ["src/resources/extensions/gsd/workflow-mcp.ts"],
377
377
  verify: "node --test",
378
- inputs: ["M001-ROADMAP.md"],
378
+ inputs: [".gsd/milestones/M001/M001-ROADMAP.md"],
379
379
  expectedOutput: ["S01-PLAN.md", "T01-PLAN.md"],
380
380
  },
381
381
  ],
@@ -746,3 +746,21 @@ test("transport compatibility still blocks units whose MCP tools are not exposed
746
746
  assert.match(error ?? "", /requires secure_env_collect/);
747
747
  assert.match(error ?? "", /currently exposes only/);
748
748
  });
749
+
750
+ test("transport compatibility accepts MCP-namespaced runtime tools", () => {
751
+ const error = getWorkflowTransportSupportError(
752
+ "claude-code",
753
+ ["gsd_summary_save"],
754
+ {
755
+ projectRoot: "/tmp/project",
756
+ env: { GSD_WORKFLOW_MCP_COMMAND: "node" },
757
+ surface: "auto-mode",
758
+ unitType: "research-slice",
759
+ authMode: "externalCli",
760
+ baseUrl: "local://claude-code",
761
+ activeTools: ["mcp__gsd-workflow__gsd_summary_save"],
762
+ },
763
+ );
764
+
765
+ assert.equal(error, null);
766
+ });
@@ -4,7 +4,10 @@
4
4
  import assert from "node:assert/strict";
5
5
  import test from "node:test";
6
6
 
7
- import { measureMemoryPressure } from "../auto/workflow-memory-pressure.ts";
7
+ import {
8
+ measureMemoryPressure,
9
+ shouldCheckMemoryPressure,
10
+ } from "../auto/workflow-memory-pressure.ts";
8
11
 
9
12
  const mb = 1024 * 1024;
10
13
 
@@ -69,3 +72,20 @@ test("measureMemoryPressure falls back when heap limit cannot be read", () => {
69
72
  pct: 0.25,
70
73
  });
71
74
  });
75
+
76
+ test("shouldCheckMemoryPressure covers the first auto-mode iteration", () => {
77
+ assert.equal(shouldCheckMemoryPressure(1, 5), true);
78
+ assert.equal(shouldCheckMemoryPressure(2, 5), false);
79
+ assert.equal(shouldCheckMemoryPressure(5, 5), true);
80
+ });
81
+
82
+ test("shouldCheckMemoryPressure rejects invalid intervals", () => {
83
+ assert.throws(
84
+ () => shouldCheckMemoryPressure(1, 0),
85
+ /positive integer/,
86
+ );
87
+ assert.throws(
88
+ () => shouldCheckMemoryPressure(1, 1.5),
89
+ /positive integer/,
90
+ );
91
+ });
@@ -246,7 +246,7 @@ test("executePlanSlice writes task planning state and rendered plan artifacts",
246
246
  estimate: "15m",
247
247
  files: ["src/resources/extensions/gsd/tools/workflow-tool-executors.ts"],
248
248
  verify: "node --test",
249
- inputs: ["ROADMAP.md"],
249
+ inputs: [".gsd/milestones/M001/M001-ROADMAP.md"],
250
250
  expectedOutput: ["S01-PLAN.md", "T01-PLAN.md"],
251
251
  },
252
252
  ],
@@ -0,0 +1,39 @@
1
+ import { describe, test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, realpathSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ import { execFileSync } from "node:child_process";
7
+
8
+ import { _gitPathspecForWorktreePath } from "../auto-worktree.ts";
9
+
10
+ function run(cmd: string, args: string[], cwd: string): string {
11
+ return execFileSync(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
12
+ }
13
+
14
+ describe("worktree git pathspec", () => {
15
+ test("skips external GSD bookkeeping directories outside the git work-tree", () => {
16
+ const root = realpathSync(mkdtempSync(join(tmpdir(), "gsd-pathspec-")));
17
+ const repo = join(root, "project");
18
+ const externalGsd = join(root, ".gsd", "projects", "abc123");
19
+
20
+ try {
21
+ mkdirSync(repo, { recursive: true });
22
+ mkdirSync(join(externalGsd, "milestones", "M002-wa00fm"), { recursive: true });
23
+ mkdirSync(join(externalGsd, "runtime", "units"), { recursive: true });
24
+ run("git", ["init"], repo);
25
+ writeFileSync(join(repo, "README.md"), "# test\n");
26
+
27
+ assert.equal(
28
+ _gitPathspecForWorktreePath(repo, join(externalGsd, "milestones", "M002-wa00fm")),
29
+ null,
30
+ );
31
+ assert.equal(
32
+ _gitPathspecForWorktreePath(repo, join(externalGsd, "runtime", "units")),
33
+ null,
34
+ );
35
+ } finally {
36
+ if (existsSync(root)) rmSync(root, { recursive: true, force: true });
37
+ }
38
+ });
39
+ });
@@ -30,11 +30,13 @@ function initGitRepoIn(base: string, isolation: "worktree" | "branch" | "none"):
30
30
  }
31
31
  import {
32
32
  WorktreeLifecycle,
33
+ resetRecentWorktreeMergeFailuresForTest,
33
34
  type WorktreeLifecycleDeps,
34
35
  type NotifyCtx,
35
36
  } from "../worktree-lifecycle.js";
36
37
  import { WorktreeStateProjection } from "../worktree-state-projection.js";
37
38
  import { type TaskCommitContext } from "../worktree.js";
39
+ import { MergeConflictError } from "../git-service.js";
38
40
 
39
41
  // ADR-016 phase 2 / C-track retired all worktree-manager + cache + prefs
40
42
  // fields from `WorktreeLifecycleDeps`. Tests still pass them as overrides
@@ -141,6 +143,20 @@ function readJournalEntries(basePath: string): JournalEntry[] {
141
143
  }
142
144
  }
143
145
 
146
+ function setupMergeWorktree(basePath: string, milestoneId: string): string {
147
+ initGitRepoIn(basePath, "worktree");
148
+ execFileSync("git", ["checkout", "-b", `milestone/${milestoneId}`], { cwd: basePath, stdio: "pipe" });
149
+ execFileSync("git", ["checkout", "main"], { cwd: basePath, stdio: "pipe" });
150
+ const wt = join(basePath, ".gsd", "worktrees", milestoneId);
151
+ execFileSync("git", ["worktree", "add", wt, `milestone/${milestoneId}`], { cwd: basePath, stdio: "pipe" });
152
+ mkdirSync(join(basePath, ".gsd", "milestones", milestoneId), { recursive: true });
153
+ writeFileSync(
154
+ join(basePath, ".gsd", "milestones", milestoneId, `${milestoneId}-ROADMAP.md`),
155
+ `# ${milestoneId}\n- [x] S01: Slice one\n`,
156
+ );
157
+ return wt;
158
+ }
159
+
144
160
  // ─── Tests ───────────────────────────────────────────────────────────────────
145
161
 
146
162
  describe("worktree journal events", () => {
@@ -148,6 +164,7 @@ describe("worktree journal events", () => {
148
164
  const originalCwd = process.cwd();
149
165
 
150
166
  beforeEach(() => {
167
+ resetRecentWorktreeMergeFailuresForTest();
151
168
  // realpathSync to match what `auto-worktree.ts` returns from
152
169
  // `resolveWorktreeProjectRoot` (macOS resolves `/var` → `/private/var`).
153
170
  tmp = realpathSync(mkdtempSync(join(tmpdir(), "wt-journal-")));
@@ -284,17 +301,7 @@ describe("worktree journal events", () => {
284
301
  });
285
302
 
286
303
  test("mergeAndExit emits worktree-merge-failed on error", () => {
287
- initGitRepoIn(tmp, "worktree");
288
- execFileSync("git", ["checkout", "-b", "milestone/M001"], { cwd: tmp, stdio: "pipe" });
289
- execFileSync("git", ["checkout", "main"], { cwd: tmp, stdio: "pipe" });
290
- const wt = join(tmp, ".gsd", "worktrees", "M001");
291
- execFileSync("git", ["worktree", "add", wt, "milestone/M001"], { cwd: tmp, stdio: "pipe" });
292
- mkdirSync(join(tmp, ".gsd", "milestones", "M001"), { recursive: true });
293
- writeFileSync(
294
- join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
295
- "# M001\n- [x] S01: Slice one\n",
296
- );
297
-
304
+ const wt = setupMergeWorktree(tmp, "M001");
298
305
  const s = makeSession({ basePath: wt, originalBasePath: tmp });
299
306
  const deps = makeDeps({
300
307
  mergeMilestoneToMain: () => { throw new Error("conflict in main"); },
@@ -318,11 +325,56 @@ describe("worktree journal events", () => {
318
325
  );
319
326
  }
320
327
 
328
+ new WorktreeLifecycle(s, deps).exitMilestone(
329
+ "M001",
330
+ { merge: true },
331
+ makeNotifyCtx(),
332
+ );
333
+
321
334
  const entries = readJournalEntries(tmp);
322
- const failed = entries.find(e => e.eventType === "worktree-merge-failed");
335
+ const failures = entries.filter(e => e.eventType === "worktree-merge-failed");
336
+ const failed = failures[0];
323
337
  assert.ok(failed, "worktree-merge-failed event should be emitted");
324
338
  assert.equal(failed!.data?.milestoneId, "M001");
325
339
  assert.equal(failed!.data?.error, "conflict in main");
340
+ assert.equal(failures.length, 1, "duplicate merge failures are journaled once");
341
+ });
342
+
343
+ test("merge failure dedupe uses stable conflict category and expires", (t) => {
344
+ let now = 1_000_000;
345
+ t.mock.method(Date, "now", () => now);
346
+ const wt = setupMergeWorktree(tmp, "M001");
347
+ const s = makeSession({ basePath: wt, originalBasePath: tmp });
348
+ let attempt = 0;
349
+ const deps = makeDeps({
350
+ mergeMilestoneToMain: () => {
351
+ attempt += 1;
352
+ throw new MergeConflictError(
353
+ attempt === 1 ? ["src/a.ts"] : ["src/b.ts", "src/c.ts"],
354
+ "squash",
355
+ "milestone/M001",
356
+ "main",
357
+ );
358
+ },
359
+ });
360
+ const lifecycle = new WorktreeLifecycle(s, deps);
361
+
362
+ lifecycle.exitMilestone("M001", { merge: true }, makeNotifyCtx());
363
+ lifecycle.exitMilestone("M001", { merge: true }, makeNotifyCtx());
364
+
365
+ let failures = readJournalEntries(tmp).filter(e => e.eventType === "worktree-merge-failed");
366
+ assert.equal(failures.length, 1, "variable conflict filenames should not bypass dedupe");
367
+ assert.match(
368
+ String(failures[0]!.data?.error),
369
+ /src\/a\.ts/,
370
+ "journal payload keeps the original error message",
371
+ );
372
+
373
+ now += 60_001;
374
+ lifecycle.exitMilestone("M001", { merge: true }, makeNotifyCtx());
375
+
376
+ failures = readJournalEntries(tmp).filter(e => e.eventType === "worktree-merge-failed");
377
+ assert.equal(failures.length, 2, "same merge failure is journaled again after dedupe expiry");
326
378
  });
327
379
 
328
380
  test("journal entries have valid flowId, seq, and ts fields", () => {