@opengsd/gsd-pi 1.8.1 → 1.9.0-dev.97ef11e3

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 (613) hide show
  1. package/README.md +10 -8
  2. package/dist/cli.js +5 -1
  3. package/dist/headless-events.d.ts +2 -1
  4. package/dist/headless-events.js +11 -3
  5. package/dist/headless-milestone-readiness.d.ts +29 -0
  6. package/dist/headless-milestone-readiness.js +161 -0
  7. package/dist/headless.js +27 -3
  8. package/dist/print-mode-exit.d.ts +12 -0
  9. package/dist/print-mode-exit.js +14 -0
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +18 -49
  12. package/dist/resources/extensions/browser-tools/capture.js +2 -77
  13. package/dist/resources/extensions/browser-tools/screenshot-constraints.js +83 -0
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +17 -2
  15. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +30 -2
  16. package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
  17. package/dist/resources/extensions/gsd/auto/loop.js +24 -4
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
  19. package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
  20. package/dist/resources/extensions/gsd/auto-artifact-paths.js +16 -10
  21. package/dist/resources/extensions/gsd/auto-dispatch.js +76 -19
  22. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
  23. package/dist/resources/extensions/gsd/auto-prompts.js +137 -22
  24. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  25. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
  26. package/dist/resources/extensions/gsd/auto-start.js +29 -9
  27. package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
  28. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
  29. package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
  30. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
  31. package/dist/resources/extensions/gsd/auto.js +20 -6
  32. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
  33. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
  34. package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -50
  36. package/dist/resources/extensions/gsd/command-feedback.js +16 -12
  37. package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
  38. package/dist/resources/extensions/gsd/compat/compat-marker.js +98 -6
  39. package/dist/resources/extensions/gsd/constants.js +12 -13
  40. package/dist/resources/extensions/gsd/context-masker.js +97 -21
  41. package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
  42. package/dist/resources/extensions/gsd/db/engine.js +56 -18
  43. package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
  44. package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
  45. package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
  46. package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
  47. package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
  48. package/dist/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  49. package/dist/resources/extensions/gsd/doctor-engine-checks.js +24 -8
  50. package/dist/resources/extensions/gsd/error-classifier.js +12 -2
  51. package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
  52. package/dist/resources/extensions/gsd/flat-phase-migration.js +168 -21
  53. package/dist/resources/extensions/gsd/git-service.js +19 -7
  54. package/dist/resources/extensions/gsd/gsd-db.js +262 -76
  55. package/dist/resources/extensions/gsd/guided-flow.js +40 -15
  56. package/dist/resources/extensions/gsd/markdown-renderer.js +20 -22
  57. package/dist/resources/extensions/gsd/md-importer.js +107 -20
  58. package/dist/resources/extensions/gsd/migrate/command.js +19 -162
  59. package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
  60. package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
  61. package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
  62. package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
  63. package/dist/resources/extensions/gsd/model-cost-table.js +2 -0
  64. package/dist/resources/extensions/gsd/model-router.js +11 -0
  65. package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
  66. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
  67. package/dist/resources/extensions/gsd/paths.js +70 -16
  68. package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
  69. package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
  70. package/dist/resources/extensions/gsd/planning-subagent-registry.js +25 -0
  71. package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
  72. package/dist/resources/extensions/gsd/preferences-types.js +5 -0
  73. package/dist/resources/extensions/gsd/preferences-validation.js +48 -1
  74. package/dist/resources/extensions/gsd/preferences.js +17 -0
  75. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  76. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
  77. package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
  78. package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
  79. package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
  80. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
  81. package/dist/resources/extensions/gsd/skill-activation.js +17 -3
  82. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +125 -15
  83. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +17 -4
  84. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
  85. package/dist/resources/extensions/gsd/stop-notice.js +24 -1
  86. package/dist/resources/extensions/gsd/sync-lock.js +13 -7
  87. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  88. package/dist/resources/extensions/gsd/tools/complete-task.js +94 -6
  89. package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
  90. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
  91. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
  92. package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
  93. package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
  94. package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
  95. package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
  96. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
  97. package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
  98. package/dist/resources/extensions/gsd/unit-registry.js +4 -0
  99. package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
  100. package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
  101. package/dist/resources/extensions/gsd/workspace.js +2 -1
  102. package/dist/resources/extensions/gsd/worktree-state-projection.js +26 -18
  103. package/dist/resources/extensions/mac-tools/index.js +31 -9
  104. package/dist/resources/extensions/shared/interview-ui.js +43 -6
  105. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  106. package/dist/web/standalone/.next/BUILD_ID +1 -1
  107. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  108. package/dist/web/standalone/.next/build-manifest.json +3 -3
  109. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  110. package/dist/web/standalone/.next/required-server-files.json +3 -3
  111. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  112. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  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 -4
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  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 -4
  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 -2
  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/mcp-connections/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  188. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  204. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  208. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/index.html +1 -1
  218. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  219. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  220. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  221. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  223. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  224. package/dist/web/standalone/.next/server/app/page.js +2 -2
  225. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  227. package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
  228. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  229. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  230. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  231. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/middleware.js +3 -3
  233. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  234. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  235. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  236. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  238. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  240. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  241. package/dist/web/standalone/.next/static/css/3b1ceb7abfb9a230.css +1 -0
  242. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  243. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  244. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  245. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  246. package/dist/web/standalone/package.json +0 -1
  247. package/dist/web/standalone/server.js +1 -1
  248. package/dist/web-mode.js +31 -3
  249. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  250. package/integrations/hermes/pyproject.toml +1 -1
  251. package/package.json +13 -10
  252. package/packages/cloud-mcp-gateway/package.json +2 -2
  253. package/packages/contracts/dist/workflow.d.ts +14 -0
  254. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  255. package/packages/contracts/dist/workflow.js +16 -0
  256. package/packages/contracts/dist/workflow.js.map +1 -1
  257. package/packages/contracts/package.json +1 -1
  258. package/packages/daemon/dist/cloud-config.d.ts +1 -1
  259. package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
  260. package/packages/daemon/dist/cloud-config.js +5 -1
  261. package/packages/daemon/dist/cloud-config.js.map +1 -1
  262. package/packages/daemon/dist/cloud-config.test.js +51 -1
  263. package/packages/daemon/dist/cloud-config.test.js.map +1 -1
  264. package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
  265. package/packages/daemon/dist/local-tool-executor.js +2 -0
  266. package/packages/daemon/dist/local-tool-executor.js.map +1 -1
  267. package/packages/daemon/package.json +6 -6
  268. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  269. package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
  270. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  271. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  272. package/packages/gsd-agent-core/dist/sdk.js +1 -0
  273. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  274. package/packages/gsd-agent-core/package.json +5 -5
  275. package/packages/gsd-agent-modes/package.json +7 -7
  276. package/packages/gsd-cloud/README.md +9 -3
  277. package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
  278. package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
  279. package/packages/gsd-cloud/dist/background-cli.test.js +248 -0
  280. package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
  281. package/packages/gsd-cloud/dist/cli.d.ts +5 -0
  282. package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
  283. package/packages/gsd-cloud/dist/cli.js +266 -0
  284. package/packages/gsd-cloud/dist/cli.js.map +1 -0
  285. package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
  286. package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
  287. package/packages/gsd-cloud/dist/cloud-config.js +237 -0
  288. package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
  289. package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
  290. package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
  291. package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
  292. package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
  293. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
  294. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
  295. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
  296. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
  297. package/packages/gsd-cloud/dist/cloud-runtime.d.ts +33 -0
  298. package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
  299. package/packages/gsd-cloud/dist/cloud-runtime.js +260 -0
  300. package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
  301. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
  302. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
  303. package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
  304. package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
  305. package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
  306. package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
  307. package/packages/gsd-cloud/dist/cloud-token.js +37 -0
  308. package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
  309. package/packages/gsd-cloud/dist/config.d.ts +17 -0
  310. package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
  311. package/packages/gsd-cloud/dist/config.js +146 -0
  312. package/packages/gsd-cloud/dist/config.js.map +1 -0
  313. package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
  314. package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
  315. package/packages/gsd-cloud/dist/device-flow.js +128 -0
  316. package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
  317. package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
  318. package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
  319. package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
  320. package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
  321. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
  322. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
  323. package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
  324. package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
  325. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
  326. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
  327. package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
  328. package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
  329. package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
  330. package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
  331. package/packages/gsd-cloud/dist/executors/executor.js +11 -0
  332. package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
  333. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
  334. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
  335. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
  336. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
  337. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
  338. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
  339. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
  340. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
  341. package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
  342. package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
  343. package/packages/gsd-cloud/dist/executors/index.js +29 -0
  344. package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
  345. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
  346. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
  347. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
  348. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
  349. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
  350. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
  351. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
  352. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
  353. package/packages/gsd-cloud/dist/index.d.ts +7 -0
  354. package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
  355. package/packages/gsd-cloud/dist/index.js +8 -0
  356. package/packages/gsd-cloud/dist/index.js.map +1 -0
  357. package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
  358. package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
  359. package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
  360. package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
  361. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
  362. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
  363. package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
  364. package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
  365. package/packages/gsd-cloud/dist/logger.d.ts +25 -0
  366. package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
  367. package/packages/gsd-cloud/dist/logger.js +72 -0
  368. package/packages/gsd-cloud/dist/logger.js.map +1 -0
  369. package/packages/gsd-cloud/dist/runtime-process.d.ts +27 -0
  370. package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
  371. package/packages/gsd-cloud/dist/runtime-process.js +272 -0
  372. package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
  373. package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
  374. package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
  375. package/packages/gsd-cloud/dist/runtime-process.test.js +97 -0
  376. package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
  377. package/packages/gsd-cloud/dist/types.d.ts +51 -0
  378. package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
  379. package/packages/gsd-cloud/dist/types.js +9 -0
  380. package/packages/gsd-cloud/dist/types.js.map +1 -0
  381. package/packages/gsd-cloud/package.json +3 -3
  382. package/packages/mcp-server/README.md +15 -2
  383. package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
  384. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
  385. package/packages/mcp-server/dist/cli-runner.js +119 -33
  386. package/packages/mcp-server/dist/cli-runner.js.map +1 -1
  387. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  388. package/packages/mcp-server/dist/server.js +5 -5
  389. package/packages/mcp-server/dist/server.js.map +1 -1
  390. package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
  391. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  392. package/packages/mcp-server/dist/workflow-tools.js +64 -2
  393. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  394. package/packages/mcp-server/package.json +4 -4
  395. package/packages/native/package.json +1 -1
  396. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  397. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  398. package/packages/pi-agent-core/dist/agent.js +2 -0
  399. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  400. package/packages/pi-agent-core/package.json +1 -1
  401. package/packages/pi-ai/dist/models.generated.d.ts +136 -0
  402. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  403. package/packages/pi-ai/dist/models.generated.js +124 -0
  404. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  405. package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
  406. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  407. package/packages/pi-ai/dist/providers/anthropic.js +25 -1
  408. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  409. package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
  410. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  411. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  412. package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
  413. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  414. package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
  415. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  416. package/packages/pi-ai/package.json +1 -1
  417. package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
  418. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  419. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
  420. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  421. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +11 -1
  422. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  424. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  425. package/packages/pi-coding-agent/package.json +7 -7
  426. package/packages/pi-tui/package.json +2 -2
  427. package/packages/rpc-client/package.json +2 -2
  428. package/pkg/package.json +1 -1
  429. package/src/resources/GSD-WORKFLOW.md +18 -49
  430. package/src/resources/extensions/browser-tools/capture.ts +2 -86
  431. package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
  432. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
  433. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
  434. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
  435. package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
  436. package/src/resources/extensions/gsd/auto/loop.ts +48 -4
  437. package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
  438. package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
  439. package/src/resources/extensions/gsd/auto-artifact-paths.ts +16 -9
  440. package/src/resources/extensions/gsd/auto-dispatch.ts +87 -19
  441. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
  442. package/src/resources/extensions/gsd/auto-prompts.ts +156 -20
  443. package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
  444. package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
  445. package/src/resources/extensions/gsd/auto-start.ts +31 -8
  446. package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
  447. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
  448. package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
  449. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
  450. package/src/resources/extensions/gsd/auto.ts +25 -8
  451. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
  452. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
  453. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
  454. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +87 -53
  455. package/src/resources/extensions/gsd/command-feedback.ts +19 -12
  456. package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
  457. package/src/resources/extensions/gsd/compat/compat-marker.ts +119 -8
  458. package/src/resources/extensions/gsd/constants.ts +14 -13
  459. package/src/resources/extensions/gsd/context-masker.ts +98 -2
  460. package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
  461. package/src/resources/extensions/gsd/db/engine.ts +58 -19
  462. package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
  463. package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
  464. package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
  465. package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
  466. package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
  467. package/src/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  468. package/src/resources/extensions/gsd/doctor-engine-checks.ts +30 -7
  469. package/src/resources/extensions/gsd/error-classifier.ts +13 -2
  470. package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
  471. package/src/resources/extensions/gsd/flat-phase-migration.ts +174 -19
  472. package/src/resources/extensions/gsd/git-service.ts +19 -6
  473. package/src/resources/extensions/gsd/gsd-db.ts +340 -85
  474. package/src/resources/extensions/gsd/guided-flow.ts +50 -14
  475. package/src/resources/extensions/gsd/markdown-renderer.ts +28 -30
  476. package/src/resources/extensions/gsd/md-importer.ts +114 -16
  477. package/src/resources/extensions/gsd/migrate/command.ts +21 -227
  478. package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
  479. package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
  480. package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
  481. package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
  482. package/src/resources/extensions/gsd/model-cost-table.ts +2 -0
  483. package/src/resources/extensions/gsd/model-router.ts +12 -0
  484. package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
  485. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
  486. package/src/resources/extensions/gsd/paths.ts +77 -16
  487. package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
  488. package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
  489. package/src/resources/extensions/gsd/planning-subagent-registry.ts +31 -0
  490. package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
  491. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  492. package/src/resources/extensions/gsd/preferences-validation.ts +62 -0
  493. package/src/resources/extensions/gsd/preferences.ts +25 -0
  494. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  495. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
  496. package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
  497. package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
  498. package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
  499. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
  500. package/src/resources/extensions/gsd/skill-activation.ts +17 -3
  501. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +162 -15
  502. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +20 -4
  503. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
  504. package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
  505. package/src/resources/extensions/gsd/stop-notice.ts +29 -1
  506. package/src/resources/extensions/gsd/sync-lock.ts +14 -6
  507. package/src/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  508. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
  509. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
  510. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
  511. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
  512. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
  513. package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
  514. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
  515. package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
  516. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
  517. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +129 -0
  518. package/src/resources/extensions/gsd/tests/complete-task.test.ts +362 -1
  519. package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
  520. package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
  521. package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
  522. package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
  523. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
  524. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
  525. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
  526. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
  527. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
  528. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
  529. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +83 -0
  530. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
  531. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
  532. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
  533. package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
  534. package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
  535. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +201 -0
  536. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
  537. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
  538. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +57 -0
  539. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
  540. package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
  541. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
  542. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
  543. package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
  544. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
  545. package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
  546. package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
  547. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
  548. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
  549. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  550. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  551. package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
  552. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
  553. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
  554. package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
  555. package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
  556. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
  557. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
  558. package/src/resources/extensions/gsd/tests/preferences.test.ts +84 -0
  559. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +4 -0
  560. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
  561. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
  562. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
  563. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
  564. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
  565. package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
  566. package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
  567. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  568. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
  569. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
  570. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
  571. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
  572. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +38 -1
  573. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
  574. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
  575. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
  576. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
  577. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
  578. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +73 -0
  579. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
  580. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
  581. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
  582. package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
  583. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
  584. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
  585. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
  586. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
  587. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
  588. package/src/resources/extensions/gsd/tools/complete-task.ts +140 -5
  589. package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
  590. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
  591. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
  592. package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
  593. package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
  594. package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
  595. package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
  596. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
  597. package/src/resources/extensions/gsd/types.ts +11 -0
  598. package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
  599. package/src/resources/extensions/gsd/unit-registry.ts +4 -0
  600. package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
  601. package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
  602. package/src/resources/extensions/gsd/workspace.ts +2 -1
  603. package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -24
  604. package/src/resources/extensions/mac-tools/index.ts +52 -9
  605. package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
  606. package/src/resources/extensions/shared/interview-ui.ts +47 -8
  607. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -0
  608. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  609. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  610. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  611. package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
  612. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → DXD9fZPnqtjZSlT5xdC3v}/_buildManifest.js +0 -0
  613. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → DXD9fZPnqtjZSlT5xdC3v}/_ssgManifest.js +0 -0
@@ -16,10 +16,11 @@ import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
16
16
  import {
17
17
  resolveMilestoneFile, resolveSliceFile, resolveSlicePath,
18
18
  resolveTasksDir, resolveTaskFiles, resolveTaskFile,
19
+ taskIdFromTaskFileName,
19
20
  relMilestoneFile, relSliceFile, relSlicePath, relMilestonePath,
20
21
  relTaskFile, resolveGsdRootFile, relGsdRootFile, resolveRuntimeFile,
21
22
  } from "./paths.js";
22
- import { resolveInlineLevel, loadEffectiveGSDPreferences } from "./preferences.js";
23
+ import { resolveInlineLevel, loadEffectiveGSDPreferences, renderLanguageDirectiveForPrompt } from "./preferences.js";
23
24
  import { createRepositoryRegistryFromPreferences } from "./repository-registry.js";
24
25
  import { isContextModeEnabled } from "./preferences-types.js";
25
26
  import { parseRoadmap } from "./parsers-legacy.js";
@@ -28,7 +29,8 @@ import type { GSDPreferences } from "./preferences.js";
28
29
  import { join, basename, relative, sep } from "node:path";
29
30
  import { existsSync } from "node:fs";
30
31
  import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary, type MinimalModelRegistry } from "./context-budget.js";
31
- import { getGateResults, getPendingGates, getPendingGatesForTurn } from "./gsd-db.js";
32
+ import type { TokenProvider } from "./token-counter.js";
33
+ import { getBlockingReworkFindingsForTask, getGateResults, getPendingGates, getPendingGatesForTurn } from "./gsd-db.js";
32
34
  import {
33
35
  GATE_REGISTRY,
34
36
  assertGateCoverage,
@@ -76,6 +78,14 @@ export { buildSkillActivationBlock, buildSkillDiscoveryVars };
76
78
  */
77
79
  const MAX_PREAMBLE_CHARS = 20_000;
78
80
 
81
+ function prependLanguageDirectiveForBase(base: string, prompt: string): string {
82
+ const directive = renderLanguageDirectiveForPrompt(
83
+ loadEffectiveGSDPreferences(base)?.preferences,
84
+ );
85
+ if (!directive || prompt.startsWith(directive)) return prompt;
86
+ return `${directive}\n\n${prompt}`;
87
+ }
88
+
79
89
  /**
80
90
  * Resolve prompt budgets from the configured executor context window.
81
91
  *
@@ -91,13 +101,29 @@ function resolvePromptBudgets(): ReturnType<typeof computeBudgets> {
91
101
  const prefs = loadEffectiveGSDPreferences();
92
102
  const sessionWindow = prefs?.preferences.context_window_override;
93
103
  const windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences, sessionWindow);
94
- return computeBudgets(windowTokens);
104
+ return computeBudgets(windowTokens, resolveExecutionProvider(prefs?.preferences));
95
105
  } catch (e) {
96
106
  logWarning("prompt", `resolvePromptBudgets failed: ${(e as Error).message}`);
97
107
  return computeBudgets(200_000);
98
108
  }
99
109
  }
100
110
 
111
+ /**
112
+ * Best-effort provider for the chars/token ratio: the executor's configured
113
+ * model profile is the only provider source reachable here (the runtime
114
+ * `sessionProvider` that reaches `formatExecutorConstraints` isn't threaded to
115
+ * `capPreamble`/summary callers). Undefined when no explicit provider is set —
116
+ * `computeBudgets` then uses the 4.0 default, i.e. today's behavior.
117
+ */
118
+ function resolveExecutionProvider(prefs?: { models?: { execution?: unknown } }): TokenProvider | undefined {
119
+ const exec = prefs?.models?.execution;
120
+ if (exec && typeof exec === "object" && "provider" in exec) {
121
+ const provider = (exec as { provider?: unknown }).provider;
122
+ if (typeof provider === "string" && provider) return provider as TokenProvider;
123
+ }
124
+ return undefined;
125
+ }
126
+
101
127
  /**
102
128
  * Character budget for dependency/prior slice summaries injected into dispatch
103
129
  * prompts. Scales with the executor's configured context window (issue #4435).
@@ -106,6 +132,34 @@ function resolveSummaryBudgetChars(): number {
106
132
  return resolvePromptBudgets().summaryBudgetChars;
107
133
  }
108
134
 
135
+
136
+ function renderBlockingReworkFindingsBlock(mid: string, sid: string, tid: string): string {
137
+ const findings = getBlockingReworkFindingsForTask(mid, sid, tid)
138
+ .filter((finding) => finding.status === "pending");
139
+ if (findings.length === 0) return "";
140
+
141
+ const lines = [
142
+ "## Blocking Rework Findings (non-optional)",
143
+ "",
144
+ "This task has structured blocking rework findings. Address every finding before calling `gsd_task_complete`. Include `reworkResolution` entries with each `findingId`, `status: \"resolved\"`, and concrete evidence. If deferring a finding, use `status: \"deferred-with-override\"` with concrete evidence and `decisionRef`.",
145
+ "",
146
+ ];
147
+ for (const finding of findings) {
148
+ lines.push(`### ${finding.finding_id} (${finding.severity})`);
149
+ lines.push(`- Status: ${finding.status}`);
150
+ lines.push(`- Finding: ${finding.description}`);
151
+ lines.push(`- Required fix: ${finding.required_fix}`);
152
+ if (finding.verification_commands.length > 0) {
153
+ lines.push("- Required verification:");
154
+ for (const command of finding.verification_commands) {
155
+ lines.push(` - \`${command}\``);
156
+ }
157
+ }
158
+ lines.push("");
159
+ }
160
+ return lines.join("\n").trim();
161
+ }
162
+
109
163
  function formatProjectClassificationForPlanning(classification: ProjectClassification): string {
110
164
  const sampleFiles = classification.contentFiles.slice(0, 8);
111
165
  const sample = sampleFiles.length > 0 ? sampleFiles.map((file) => `\`${file}\``).join(", ") : "(none)";
@@ -208,7 +262,7 @@ function formatCloseoutReviewInstructions(validationContent: string | null, vali
208
262
  ].join("\n");
209
263
  }
210
264
 
211
- function capPreamble(preamble: string): string {
265
+ export function capPreamble(preamble: string): string {
212
266
  // Cap inlined context at min(static ceiling, scaled inline budget).
213
267
  // The ceiling bounds repeated auto prompt payloads; the scaled
214
268
  // budget tightens the cap for small-window users whose true safe limit is
@@ -218,6 +272,41 @@ function capPreamble(preamble: string): string {
218
272
  return truncateAtSectionBoundary(preamble, budget).content;
219
273
  }
220
274
 
275
+ /**
276
+ * Cap the execute-task inline blocks against one shared budget in priority
277
+ * order. Unlike `capPreamble` (single concatenated preamble), execute-task
278
+ * feeds these blocks into separate, non-contiguous template placeholders, so
279
+ * they can't be joined and re-split — the budget is spent block-by-block.
280
+ *
281
+ * The task plan is the authoritative execution contract: it is never truncated
282
+ * here (it consumes budget first, whole). Remaining budget flows to the slice
283
+ * excerpt, then templates, each truncated at section boundaries so the lowest-
284
+ * priority context drops whole trailing sections first. When the task plan
285
+ * alone meets or exceeds the budget, the trailing blocks are dropped rather
286
+ * than the task plan being cut.
287
+ */
288
+ function capExecuteTaskInlineBlocks(
289
+ taskPlan: string,
290
+ slicePlan: string,
291
+ templates: string,
292
+ budgetChars: number,
293
+ ): { taskPlan: string; slicePlan: string; templates: string } {
294
+ let remaining = budgetChars - taskPlan.length;
295
+ if (remaining <= 0) {
296
+ return { taskPlan, slicePlan: "", templates: "" };
297
+ }
298
+ const cappedSlice = slicePlan.length <= remaining
299
+ ? slicePlan
300
+ : truncateAtSectionBoundary(slicePlan, remaining).content;
301
+ remaining -= cappedSlice.length;
302
+ const cappedTemplates = remaining <= 0
303
+ ? ""
304
+ : templates.length <= remaining
305
+ ? templates
306
+ : truncateAtSectionBoundary(templates, remaining).content;
307
+ return { taskPlan, slicePlan: cappedSlice, templates: cappedTemplates };
308
+ }
309
+
221
310
  type PromptContextMode = "inline" | "excerpt" | "on-demand" | "skipped";
222
311
 
223
312
  interface PromptContextTelemetryEntry {
@@ -296,7 +385,7 @@ function prependContextModeToBlock(
296
385
  block: string,
297
386
  renderMode: ContextModeRenderMode = "standalone",
298
387
  ): string {
299
- const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
388
+ const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode, basePath: base });
300
389
  const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
301
390
  const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
302
391
  if (!guidance) return block;
@@ -377,7 +466,7 @@ function formatExecutorConstraints(
377
466
  // so DEFAULT_CONTEXT_WINDOW stays the single source of truth.
378
467
  windowTokens = resolveExecutorContextWindow(undefined, undefined, sessionContextWindow, sessionProvider);
379
468
  }
380
- const budgets = computeBudgets(windowTokens);
469
+ const budgets = computeBudgets(windowTokens, sessionProvider as TokenProvider | undefined);
381
470
  const { min, max } = budgets.taskCountRange;
382
471
  const execWindowK = Math.round(windowTokens / 1000);
383
472
  const perTaskBudgetK = Math.round(budgets.inlineContextBudgetChars / 1000);
@@ -1403,6 +1492,18 @@ function resolveTaskSummariesLocation(
1403
1492
  return { dir: slicePath, relPrefix: sRel };
1404
1493
  }
1405
1494
 
1495
+ function summaryFileBelongsToSlice(
1496
+ fileName: string,
1497
+ base: string,
1498
+ mid: string,
1499
+ sid: string,
1500
+ ): boolean {
1501
+ const tid = taskIdFromTaskFileName(fileName, "SUMMARY");
1502
+ if (!tid) return false;
1503
+ const resolved = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
1504
+ return resolved !== null && basename(resolved) === fileName;
1505
+ }
1506
+
1406
1507
  export async function getPriorTaskSummaryPaths(
1407
1508
  mid: string, sid: string, currentTid: string, base: string,
1408
1509
  ): Promise<string[]> {
@@ -1414,7 +1515,10 @@ export async function getPriorTaskSummaryPaths(
1414
1515
 
1415
1516
  return summaryFiles
1416
1517
  .filter(f => {
1417
- const num = parseInt(f.replace(/^T/, ""), 10);
1518
+ if (!summaryFileBelongsToSlice(f, base, mid, sid)) return false;
1519
+ const tid = taskIdFromTaskFileName(f, "SUMMARY");
1520
+ if (!tid) return false;
1521
+ const num = parseInt(tid.replace(/^T/, ""), 10);
1418
1522
  return num < currentNum;
1419
1523
  })
1420
1524
  .map(f => `${loc.relPrefix}/${f}`);
@@ -1447,8 +1551,9 @@ export async function getDependencyTaskSummaryPaths(
1447
1551
 
1448
1552
  return summaryFiles
1449
1553
  .filter((f) => {
1450
- // Extract task ID from filename: "T02-SUMMARY.md" → "T02"
1451
- const tid = f.replace(/-SUMMARY\.md$/i, "").toUpperCase();
1554
+ if (!summaryFileBelongsToSlice(f, base, mid, sid)) return false;
1555
+ const tid = taskIdFromTaskFileName(f, "SUMMARY");
1556
+ if (!tid) return false;
1452
1557
  return depSet.has(tid);
1453
1558
  })
1454
1559
  .map((f) => `${loc.relPrefix}/${f}`);
@@ -1633,7 +1738,7 @@ export async function buildDiscussMilestonePrompt(
1633
1738
  if (headless) {
1634
1739
  const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
1635
1740
  const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
1636
- return loadPrompt("discuss-headless", {
1741
+ const prompt = loadPrompt("discuss-headless", {
1637
1742
  seedContext: roadmapContent ?? "",
1638
1743
  inlinedTemplates: contextTemplate,
1639
1744
  workingDirectory: base,
@@ -1642,6 +1747,7 @@ export async function buildDiscussMilestonePrompt(
1642
1747
  commitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
1643
1748
  multiMilestoneCommitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
1644
1749
  });
1750
+ return prependLanguageDirectiveForBase(base, prompt);
1645
1751
  }
1646
1752
 
1647
1753
  const rawInlinedContext = await buildDiscussMilestoneInlinedContext(mid, base);
@@ -1672,10 +1778,11 @@ export async function buildDiscussMilestonePrompt(
1672
1778
  const truncationNote = cappedDraftSeed !== draftSeed
1673
1779
  ? `\n\n_(Draft seed truncated; read the full draft at \`${draftRelPath}\` if needed.)_`
1674
1780
  : "";
1675
- return `${promptWithContextMode}\n\n## Prior Discussion (Draft Seed)\n\nThe following draft was captured from a prior multi-milestone discussion. Use it as seed material — the user has already provided this context. Start with a brief reflection on what the draft covers, then probe for any gaps or open questions before writing the full CONTEXT.md.\n\n${cappedDraftSeed}${truncationNote}`;
1781
+ const promptWithDraftSeed = `${promptWithContextMode}\n\n## Prior Discussion (Draft Seed)\n\nThe following draft was captured from a prior multi-milestone discussion. Use it as seed material — the user has already provided this context. Start with a brief reflection on what the draft covers, then probe for any gaps or open questions before writing the full CONTEXT.md.\n\n${cappedDraftSeed}${truncationNote}`;
1782
+ return prependLanguageDirectiveForBase(base, promptWithDraftSeed);
1676
1783
  }
1677
1784
 
1678
- return promptWithContextMode;
1785
+ return prependLanguageDirectiveForBase(base, promptWithContextMode);
1679
1786
  }
1680
1787
 
1681
1788
  /**
@@ -2697,7 +2804,7 @@ export async function buildExecuteTaskPrompt(
2697
2804
  // Compute verification budget for the executor's context window (issue #707)
2698
2805
  const prefs = loadEffectiveGSDPreferences();
2699
2806
  const contextWindow = resolveExecutorContextWindow(opts.modelRegistry, prefs?.preferences, opts.sessionContextWindow, opts.sessionProvider);
2700
- const budgets = computeBudgets(contextWindow);
2807
+ const budgets = computeBudgets(contextWindow, opts.sessionProvider as TokenProvider | undefined);
2701
2808
  const verificationBudget = `~${Math.round(budgets.verificationBudgetChars / 1000)}K chars`;
2702
2809
 
2703
2810
  // Truncate carry-forward section when it exceeds 40% of inline context budget.
@@ -2745,6 +2852,15 @@ export async function buildExecuteTaskPrompt(
2745
2852
  logWarning("prompt", `reopen reason injection failed: ${(reopenErr as Error).message}`);
2746
2853
  }
2747
2854
 
2855
+ const reworkFindingsBlock = renderBlockingReworkFindingsBlock(mid, sid, tid);
2856
+ if (reworkFindingsBlock) {
2857
+ const block = reworkFindingsBlock + "\n\n---\n\n";
2858
+ phaseAnchorSection = phaseAnchorSection
2859
+ ? `${block}${phaseAnchorSection}`
2860
+ : block;
2861
+ trackPromptContext(contextTelemetry, "rework-findings", "inline", reworkFindingsBlock);
2862
+ }
2863
+
2748
2864
  // ADR-011 Phase 2: inject any resolved-but-unapplied escalation override
2749
2865
  // into this task's prompt. Claim is atomic via DB UPDATE WHERE IS NULL, so
2750
2866
  // if a parallel build already injected it, we skip. Feature-gated by
@@ -2805,10 +2921,26 @@ export async function buildExecuteTaskPrompt(
2805
2921
  }
2806
2922
  },
2807
2923
  });
2808
- const taskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
2809
- const slicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
2924
+ const rawTaskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
2925
+ const rawSlicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
2810
2926
  const contractedCarryForward = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "prior-task-summaries");
2811
- const contractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
2927
+ const rawContractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
2928
+ // Cap the static inline blocks against one shared budget so a small-window
2929
+ // executor can't overflow (the sibling builders cap via `capPreamble`;
2930
+ // execute-task's blocks feed separate template slots, so they share a budget
2931
+ // block-by-block). Carry-forward already has its own truncation above.
2932
+ const inlineBudget = Math.min(MAX_PREAMBLE_CHARS, budgets.inlineContextBudgetChars);
2933
+ const { taskPlan: taskPlanInline, slicePlan: slicePlanExcerpt, templates: contractedTemplates } =
2934
+ capExecuteTaskInlineBlocks(rawTaskPlanInline, rawSlicePlanExcerpt, rawContractedTemplates, inlineBudget);
2935
+ const inlineDropped = (rawTaskPlanInline.length + rawSlicePlanExcerpt.length + rawContractedTemplates.length)
2936
+ - (taskPlanInline.length + slicePlanExcerpt.length + contractedTemplates.length);
2937
+ trackPromptContext(
2938
+ contextTelemetry,
2939
+ "inline-cap",
2940
+ inlineDropped > 0 ? "excerpt" : "skipped",
2941
+ null,
2942
+ inlineDropped > 0 ? `dropped ${inlineDropped} chars (budget ${inlineBudget})` : "within budget",
2943
+ );
2812
2944
  const onDemandResult = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
2813
2945
  const onDemandContext = onDemandResult.text;
2814
2946
  trackPromptContext(
@@ -2904,12 +3036,14 @@ export async function buildCompleteSlicePrompt(
2904
3036
  trackPromptContext(contextTelemetry, "prior-task-summaries", "skipped", null, "missing tasks dir");
2905
3037
  return null;
2906
3038
  }
2907
- const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY").sort();
3039
+ const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY")
3040
+ .filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
3041
+ .sort();
2908
3042
  const blocks: string[] = [];
2909
3043
  for (const file of summaryFiles) {
2910
3044
  const absPath = join(loc.dir, file);
2911
3045
  const relPath = `${loc.relPrefix}/${file}`;
2912
- const taskId = file.replace(/-SUMMARY\.md$/i, "");
3046
+ const taskId = taskIdFromTaskFileName(file, "SUMMARY") ?? file.replace(/-SUMMARY\.md$/i, "");
2913
3047
  blocks.push(await buildTaskSummaryExcerpt(absPath, relPath, taskId));
2914
3048
  }
2915
3049
  const body = blocks.length > 0 ? blocks.join("\n\n---\n\n") : null;
@@ -3522,7 +3656,9 @@ export async function buildReplanSlicePrompt(
3522
3656
  let blockerTaskId = "";
3523
3657
  const summaryLoc = resolveTaskSummariesLocation(base, mid, sid);
3524
3658
  if (summaryLoc) {
3525
- const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY").sort();
3659
+ const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY")
3660
+ .filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
3661
+ .sort();
3526
3662
  for (const file of summaryFiles) {
3527
3663
  const absPath = join(summaryLoc.dir, file);
3528
3664
  const content = await loadFile(absPath);
@@ -3530,7 +3666,7 @@ export async function buildReplanSlicePrompt(
3530
3666
  const summary = parseSummary(content);
3531
3667
  const relPath = `${summaryLoc.relPrefix}/${file}`;
3532
3668
  if (summary.frontmatter.blocker_discovered) {
3533
- blockerTaskId = summary.frontmatter.id || file.replace(/-SUMMARY\.md$/i, "");
3669
+ blockerTaskId = summary.frontmatter.id || taskIdFromTaskFileName(file, "SUMMARY") || file.replace(/-SUMMARY\.md$/i, "");
3534
3670
  inlined.push(await buildTaskSummaryExcerpt(absPath, relPath, blockerTaskId, { blocker: true }));
3535
3671
  }
3536
3672
  }
@@ -39,8 +39,7 @@ import { isClosedStatus, isInactiveStatus } from "./status-guards.js";
39
39
  import {
40
40
  resolveSlicePath,
41
41
  resolveSliceFile,
42
- resolveTasksDir,
43
- resolveTaskFiles,
42
+ resolveTaskFile,
44
43
  relMilestoneFile,
45
44
  relSliceFile,
46
45
  buildSliceFileName,
@@ -324,13 +323,16 @@ export function writeReactiveExecuteBlocker(
324
323
  const slicePath = resolveSlicePath(base, mid, sid);
325
324
  if (!slicePath) return null;
326
325
 
327
- const tasksDir = resolveTasksDir(base, mid, sid) ?? slicePath;
328
- const existingSummaries = new Set(
329
- resolveTaskFiles(tasksDir, "SUMMARY").map((f) => f.replace(/-SUMMARY\.md$/i, "").toUpperCase()),
330
- );
326
+ // Resolve each batch task's SUMMARY with slice-qualified paths so flat-phase
327
+ // slices that reuse a task id (e.g. two T03s in one phase) don't collide: a
328
+ // sibling slice's summary must never make this slice's task look complete.
329
+ const hasSummary = (tid: string): boolean => {
330
+ const summaryPath = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
331
+ return summaryPath !== null && existsSync(summaryPath);
332
+ };
331
333
 
332
- const summaryPresent = batchIds.filter((tid) => existingSummaries.has(tid.toUpperCase()));
333
- const summaryMissing = batchIds.filter((tid) => !existingSummaries.has(tid.toUpperCase()));
334
+ const summaryPresent = batchIds.filter((tid) => hasSummary(tid));
335
+ const summaryMissing = batchIds.filter((tid) => !hasSummary(tid));
334
336
  const completedTaskIds: string[] = [];
335
337
  const skippedTaskIds: string[] = [];
336
338
  const unchangedTaskIds: string[] = [];
@@ -3,11 +3,10 @@ import { AutoSession } from "./auto/session.js";
3
3
  import type { CurrentUnit } from "./auto/session.js";
4
4
  import type { SourceObservationStore } from "./source-observations.js";
5
5
  import {
6
- isDeterministicPolicyError,
7
- isQueuedUserMessageSkip,
8
- isToolInvocationError,
9
6
  markToolEnd as markTrackedToolEnd,
10
7
  markToolStart as markTrackedToolStart,
8
+ shouldClearToolInvocationErrorAfterSuccess,
9
+ updateToolInvocationError,
11
10
  } from "./auto-tool-tracking.js";
12
11
  // Re-exported as a pure pass-through. Must stay UNGATED (no autoSession.active
13
12
  // argument, unlike markToolStart at the bottom of this file) so it is true in
@@ -99,13 +98,19 @@ export function markToolEnd(toolCallId: string): void {
99
98
 
100
99
  export function recordToolInvocationError(toolName: string, errorMsg: string): void {
101
100
  if (!autoSession.active) return;
102
- if (isToolInvocationError(errorMsg) || isQueuedUserMessageSkip(errorMsg) || isDeterministicPolicyError(errorMsg)) {
103
- autoSession.lastToolInvocationError = `${toolName}: ${errorMsg}`;
104
- }
101
+ autoSession.lastToolInvocationError = updateToolInvocationError(
102
+ autoSession.lastToolInvocationError,
103
+ toolName,
104
+ errorMsg,
105
+ );
105
106
  }
106
107
 
107
- export function clearToolInvocationError(): void {
108
+ export function clearToolInvocationError(successfulToolName?: string): void {
108
109
  if (!autoSession.active) return;
110
+ if (!shouldClearToolInvocationErrorAfterSuccess(
111
+ autoSession.lastToolInvocationError,
112
+ successfulToolName,
113
+ )) return;
109
114
  autoSession.lastToolInvocationError = null;
110
115
  }
111
116
 
@@ -88,6 +88,7 @@ import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.
88
88
  import { extractVerdict } from "./verdict-parser.js";
89
89
  import { auditOrphanedPreflightStashes } from "./orphan-stash-audit.js";
90
90
  import { parseProject } from "./schemas/parsers.js";
91
+ import { LAYOUT_SEGMENTS } from "./layout-policy.js";
91
92
 
92
93
  import {
93
94
  debugLog,
@@ -152,6 +153,33 @@ export function hasGitIndexLockForTest(basePath: string): boolean {
152
153
  return existsSync(join(basePath, ".git", "index.lock"));
153
154
  }
154
155
 
156
+ function isEmptyDirectory(dirPath: string): boolean {
157
+ try {
158
+ return existsSync(dirPath) && readdirSync(dirPath).length === 0;
159
+ } catch {
160
+ return false;
161
+ }
162
+ }
163
+
164
+ export function reconcileFlatPhaseBootstrapLayout(basePath: string): boolean {
165
+ const gsdDir = join(basePath, ".gsd");
166
+ const phasesPath = join(gsdDir, LAYOUT_SEGMENTS.level1);
167
+ const milestonesPath = join(gsdDir, "milestones");
168
+
169
+ if (isEmptyDirectory(milestonesPath)) {
170
+ if (!existsSync(phasesPath)) mkdirSync(phasesPath, { recursive: true });
171
+ rmSync(milestonesPath, { recursive: true, force: true });
172
+ return true;
173
+ }
174
+
175
+ if (!existsSync(phasesPath) && !existsSync(milestonesPath)) {
176
+ mkdirSync(phasesPath, { recursive: true });
177
+ return true;
178
+ }
179
+
180
+ return false;
181
+ }
182
+
155
183
  export function _shouldAbortBootstrapForUnavailableDbForTest(
156
184
  gsdDbPath: string,
157
185
  dbAvailable: boolean,
@@ -1152,19 +1180,14 @@ export async function bootstrapAutoSession(
1152
1180
  ensureGitignore(base, { manageGitignore });
1153
1181
  if (manageGitignore !== false) untrackRuntimeFiles(base);
1154
1182
 
1155
- // Bootstrap milestones/ if it doesn't exist.
1156
- // Check milestones/ directly — ensureGsdSymlink above already created .gsd/,
1157
- // so checking .gsd/ existence would be dead code (#2942).
1158
- const gsdDir = join(base, ".gsd");
1159
- const milestonesPath = join(gsdDir, "milestones");
1160
- if (!existsSync(milestonesPath)) {
1161
- mkdirSync(milestonesPath, { recursive: true });
1183
+ // Bootstrap the flat-phase projection root and clean empty legacy scaffolds.
1184
+ if (reconcileFlatPhaseBootstrapLayout(base)) {
1162
1185
  try {
1163
1186
  nativeAddAll(base);
1164
1187
  nativeCommit(base, "chore: init gsd");
1165
1188
  } catch (err) {
1166
1189
  /* nothing to commit */
1167
- logWarning("engine", `mkdir failed: ${err instanceof Error ? err.message : String(err)}`);
1190
+ logWarning("engine", `layout bootstrap commit failed: ${err instanceof Error ? err.message : String(err)}`);
1168
1191
  }
1169
1192
  }
1170
1193
 
@@ -132,6 +132,8 @@ export function clearInFlightTools(): void {
132
132
  */
133
133
  const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
134
134
  const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
135
+ const SCHEDULE_WAKEUP_TOOL_NAME = "ScheduleWakeup";
136
+ const SCHEDULE_WAKEUP_CONTINUATION_ERROR = "`prompt` is required when `stop` is not true";
135
137
 
136
138
  /**
137
139
  * Matches the runtime's "tool not registered" error. Unlike the deterministic
@@ -151,6 +153,60 @@ export function isToolInvocationError(errorMsg: string): boolean {
151
153
  return TOOL_INVOCATION_ERROR_RE.test(errorMsg) || isDeterministicPolicyError(errorMsg);
152
154
  }
153
155
 
156
+ /**
157
+ * Claude Code validates its native ScheduleWakeup tool outside GSD's schema.
158
+ * Keep this exact and tool-scoped so similarly worded business validation from
159
+ * unrelated tools does not pause auto-mode.
160
+ */
161
+ export function isScheduleWakeupContinuationError(toolName: string, errorMsg: string): boolean {
162
+ return stripMcpToolPrefix(toolName) === SCHEDULE_WAKEUP_TOOL_NAME
163
+ && errorMsg.trim() === SCHEDULE_WAKEUP_CONTINUATION_ERROR;
164
+ }
165
+
166
+ function shouldRecordToolInvocationError(toolName: string, errorMsg: string): boolean {
167
+ return isScheduleWakeupContinuationError(toolName, errorMsg)
168
+ || isToolInvocationError(errorMsg)
169
+ || isQueuedUserMessageSkip(errorMsg);
170
+ }
171
+
172
+ function isRecordedScheduleWakeupContinuationError(recordedError: string | null): boolean {
173
+ if (!recordedError) return false;
174
+
175
+ const separator = recordedError.indexOf(": ");
176
+ return separator >= 0 && isScheduleWakeupContinuationError(
177
+ recordedError.slice(0, separator),
178
+ recordedError.slice(separator + 2),
179
+ );
180
+ }
181
+
182
+ export function updateToolInvocationError(
183
+ recordedError: string | null,
184
+ toolName: string,
185
+ errorMsg: string,
186
+ ): string | null {
187
+ if (!shouldRecordToolInvocationError(toolName, errorMsg)) return recordedError;
188
+ if (
189
+ isRecordedScheduleWakeupContinuationError(recordedError)
190
+ && !isScheduleWakeupContinuationError(toolName, errorMsg)
191
+ ) return recordedError;
192
+
193
+ return `${toolName}: ${errorMsg}`;
194
+ }
195
+
196
+ /**
197
+ * A failed continuation must survive successful diagnostic/read calls in the
198
+ * same turn. Only a later successful ScheduleWakeup proves the continuation
199
+ * was armed; all other invocation errors retain their existing clear-on-success
200
+ * behavior.
201
+ */
202
+ export function shouldClearToolInvocationErrorAfterSuccess(
203
+ recordedError: string | null,
204
+ successfulToolName?: string,
205
+ ): boolean {
206
+ return !isRecordedScheduleWakeupContinuationError(recordedError)
207
+ || stripMcpToolPrefix(successfulToolName ?? "") === SCHEDULE_WAKEUP_TOOL_NAME;
208
+ }
209
+
154
210
  /**
155
211
  * Returns true if the error message indicates the called tool was not on the
156
212
  * session's tool surface (MCP startup race — see TOOL_UNAVAILABLE_ERROR_RE).
@@ -10,6 +10,7 @@ import { existsSync, realpathSync, unlinkSync } from "node:fs";
10
10
  import { isAbsolute, join, relative } from "node:path";
11
11
 
12
12
  import { gsdRoot } from "./paths.js";
13
+ import { milestoneMetaPath } from "./git-service.js";
13
14
  import { logWarning } from "./workflow-logger.js";
14
15
 
15
16
  function isSamePath(a: string, b: string): boolean {
@@ -93,6 +94,9 @@ export function clearProjectRootStateFiles(
93
94
  // worth removing on teardown.
94
95
  const transientFiles = [
95
96
  join(gsdDir, "STATE.md"),
97
+ // Integration-branch META now lives flat at .gsd/<MID>-META.json (ADR-045).
98
+ milestoneMetaPath(basePath, milestoneId),
99
+ // Legacy location — still cleaned for pre-migration trees.
96
100
  join(gsdDir, "milestones", milestoneId, `${milestoneId}-META.json`),
97
101
  ];
98
102
 
@@ -16,7 +16,7 @@ import {
16
16
  _isSamePath as isSamePath,
17
17
  _shouldReconcileWorktreeDb,
18
18
  } from "./auto-worktree-cleanup.js";
19
- import { resolveGsdPathContract } from "./paths.js";
19
+ import { dirIsContentBearingLegacyMilestone, resolveGsdPathContract } from "./paths.js";
20
20
  import type { MilestoneScope } from "./workspace.js";
21
21
  import { WorktreeStateProjection } from "./worktree-state-projection.js";
22
22
  import { logWarning } from "./workflow-logger.js";
@@ -211,10 +211,17 @@ function syncMilestoneLayout(
211
211
  if (!existsSync(mainMilestonesDir)) return;
212
212
 
213
213
  try {
214
- mkdirSync(wtMilestonesDir, { recursive: true });
215
214
  const mainMilestones = readdirSync(mainMilestonesDir, { withFileTypes: true })
216
215
  .filter((entry) => entry.isDirectory())
217
- .map((entry) => entry.name);
216
+ .map((entry) => entry.name)
217
+ .filter((name) =>
218
+ layoutSegment !== "milestones" ||
219
+ dirIsContentBearingLegacyMilestone(join(mainMilestonesDir, name)),
220
+ );
221
+
222
+ if (mainMilestones.length === 0) return;
223
+
224
+ mkdirSync(wtMilestonesDir, { recursive: true });
218
225
 
219
226
  for (const milestoneId of mainMilestones) {
220
227
  syncMilestoneDirectory(
@@ -65,7 +65,7 @@ export function teardownAutoWorktree(
65
65
 
66
66
  // Mirror cleanup steps from mergeMilestoneToMain abort path:
67
67
 
68
- // 1. Remove transient state files (STATE.md, auto.lock, {MID}-META.json).
68
+ // 1. Remove transient state files (STATE.md, auto.lock, .gsd/{MID}-META.json).
69
69
  // Non-fatal — must not block teardown.
70
70
  try {
71
71
  clearProjectRootStateFiles(originalBasePath, milestoneId);