@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
@@ -0,0 +1,64 @@
1
+ // gsd-pi - /gsd migrate presentation helpers.
2
+ // File Purpose: Pure formatting for migration previews and post-write review prompts.
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { gsdRoot } from "../paths.js";
7
+ function formatRequirements(preview) {
8
+ if (preview.requirements.total === 0)
9
+ return null;
10
+ return `Requirements: ${preview.requirements.total} (${preview.requirements.validated} validated, ${preview.requirements.active} active, ${preview.requirements.deferred} deferred, ${preview.requirements.outOfScope} out of scope)`;
11
+ }
12
+ function formatLegacyInputs(preview) {
13
+ if (!preview.migrationInputs)
14
+ return null;
15
+ return `Legacy inputs: ${preview.migrationInputs.milestonePhaseDirs} milestone phase dir(s), ${preview.migrationInputs.decisions} decision file(s), ${preview.migrationInputs.seeds} seed file(s)`;
16
+ }
17
+ export function buildMigrationPreviewSummary(preview, targetRoot) {
18
+ const lines = [
19
+ `Decisions: ${preview.decisions.total}`,
20
+ `Milestones: ${preview.milestoneCount}`,
21
+ `Slices: ${preview.totalSlices} (${preview.doneSlices} done — ${preview.sliceCompletionPct}%)`,
22
+ `Tasks: ${preview.totalTasks} (${preview.doneTasks} done — ${preview.taskCompletionPct}%)`,
23
+ ];
24
+ const requirements = formatRequirements(preview);
25
+ if (requirements)
26
+ lines.push(requirements);
27
+ const legacyInputs = formatLegacyInputs(preview);
28
+ if (legacyInputs)
29
+ lines.push(legacyInputs);
30
+ const targetGsdPath = gsdRoot(targetRoot);
31
+ if (existsSync(targetGsdPath)) {
32
+ lines.push("");
33
+ lines.push(`⚠ A .gsd directory already exists at ${targetGsdPath}.`);
34
+ lines.push("It will be backed up, deleted, and rewritten fresh before DB import.");
35
+ }
36
+ return lines;
37
+ }
38
+ export function formatMigrationPreviewStats(preview) {
39
+ const lines = [
40
+ `- Decisions: ${preview.decisions.total}`,
41
+ `- Milestones: ${preview.milestoneCount}`,
42
+ `- Slices: ${preview.totalSlices} (${preview.doneSlices} done — ${preview.sliceCompletionPct}%)`,
43
+ `- Tasks: ${preview.totalTasks} (${preview.doneTasks} done — ${preview.taskCompletionPct}%)`,
44
+ ];
45
+ const requirements = formatRequirements(preview);
46
+ if (requirements)
47
+ lines.push(`- ${requirements}`);
48
+ const legacyInputs = formatLegacyInputs(preview);
49
+ if (legacyInputs)
50
+ lines.push(`- ${legacyInputs}`);
51
+ return lines.join("\n");
52
+ }
53
+ function defaultReviewTemplatePath() {
54
+ const promptsDir = join(dirname(fileURLToPath(import.meta.url)), "..", "prompts");
55
+ return join(promptsDir, "review-migration.md");
56
+ }
57
+ export function buildReviewPrompt(input) {
58
+ const templatePath = input.templatePath ?? defaultReviewTemplatePath();
59
+ let content = readFileSync(templatePath, "utf-8");
60
+ content = content.replaceAll("{{sourcePath}}", input.sourcePath);
61
+ content = content.replaceAll("{{gsdPath}}", input.gsdPath);
62
+ content = content.replaceAll("{{previewStats}}", formatMigrationPreviewStats(input.preview));
63
+ return content.trim();
64
+ }
@@ -48,6 +48,8 @@ export const BUNDLED_COST_TABLE = [
48
48
  // GPT-5.5 API list price, also used for live Codex OAuth routing.
49
49
  // Source: https://openai.com/api/pricing/
50
50
  { id: "gpt-5.5", inputPer1k: 0.005, outputPer1k: 0.03, updatedAt: "2026-04-23" },
51
+ // Mirrors gpt-5.5 list pricing until OpenAI publishes official gpt-5.6 pricing.
52
+ { id: "gpt-5.6", inputPer1k: 0.005, outputPer1k: 0.03, updatedAt: "2026-07-08" },
51
53
  // Google
52
54
  { id: "gemini-2.0-flash", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2025-03-15" },
53
55
  { id: "gemini-flash-2.0", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2025-03-15" },
@@ -46,10 +46,12 @@ export const MODEL_CAPABILITY_TIER = {
46
46
  "gpt-5.3-codex": "heavy",
47
47
  "gpt-5.4": "heavy",
48
48
  "gpt-5.5": "heavy",
49
+ "gpt-5.6": "heavy",
49
50
  "o1": "heavy",
50
51
  "o3": "heavy",
51
52
  "o4-mini": "heavy",
52
53
  "o4-mini-deep-research": "heavy",
54
+ "grok-4.5": "heavy",
53
55
  };
54
56
  // ─── Cost Table (per 1K input tokens, approximate USD) ───────────────────────
55
57
  // Used for cross-provider cost comparison when multiple providers offer
@@ -82,11 +84,13 @@ const MODEL_COST_PER_1K_INPUT = {
82
84
  "gpt-5.3-codex-spark": 0.0003,
83
85
  "gpt-5.4": 0.005,
84
86
  "gpt-5.5": 0.005,
87
+ "gpt-5.6": 0.005,
85
88
  "o4-mini": 0.005,
86
89
  "o4-mini-deep-research": 0.005,
87
90
  "gemini-2.0-flash": 0.0001,
88
91
  "gemini-2.5-pro": 0.00125,
89
92
  "deepseek-chat": 0.00014,
93
+ "grok-4.5": 0.002,
90
94
  };
91
95
  // ─── Capability Profiles Data Table ──────────────────────────────────────────
92
96
  // Per-model capability profiles (0–100 scale). Used for capability-aware
@@ -128,6 +132,9 @@ export const MODEL_CAPABILITY_PROFILES = {
128
132
  // OpenAI's 2026-04-23 published eval deltas across coding, tool use, and long context.
129
133
  // Source: https://openai.com/index/introducing-gpt-5-5/
130
134
  "gpt-5.5": { coding: 96, debugging: 93, research: 89, reasoning: 95, speed: 42, longContext: 90, instruction: 93 },
135
+ // GPT-5.6 profile is provisional: a small uniform step over gpt-5.5, to be
136
+ // recalibrated once OpenAI publishes official eval results.
137
+ "gpt-5.6": { coding: 97, debugging: 94, research: 90, reasoning: 96, speed: 42, longContext: 91, instruction: 94 },
131
138
  // ── OpenAI o-series (reasoning-first) ──────────────────────────────────────
132
139
  "o1": { coding: 78, debugging: 82, research: 78, reasoning: 90, speed: 20, longContext: 65, instruction: 82 },
133
140
  "o3": { coding: 80, debugging: 85, research: 80, reasoning: 92, speed: 25, longContext: 70, instruction: 85 },
@@ -139,6 +146,10 @@ export const MODEL_CAPABILITY_PROFILES = {
139
146
  "gemini-flash-2.0": { coding: 50, debugging: 40, research: 50, reasoning: 40, speed: 95, longContext: 60, instruction: 65 },
140
147
  // ── DeepSeek ───────────────────────────────────────────────────────────────
141
148
  "deepseek-chat": { coding: 75, debugging: 65, research: 55, reasoning: 70, speed: 70, longContext: 55, instruction: 65 },
149
+ // ── xAI ────────────────────────────────────────────────────────────────────
150
+ // Grok 4.5 (2026-07): Opus-class frontier model tuned for coding and agentic
151
+ // work; notably faster and more token-efficient than peer heavy models.
152
+ "grok-4.5": { coding: 95, debugging: 90, research: 82, reasoning: 93, speed: 55, longContext: 80, instruction: 90 },
142
153
  };
143
154
  // ─── Base Task Requirements Data Table ───────────────────────────────────────
144
155
  // Per-unit-type base requirement vectors. Weights indicate how important each
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { deriveState } from "./state.js";
8
8
  import { findMilestoneIds } from "./guided-flow.js";
9
- import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
9
+ import { isDbAvailable, getMilestoneSlices, getTasksBySliceIds } from "./gsd-db.js";
10
10
  import { openExistingWorkflowDatabase } from "./db-workspace.js";
11
11
  // ─── File Collection ─────────────────────────────────────────────────────────
12
12
  /**
@@ -16,10 +16,11 @@ import { openExistingWorkflowDatabase } from "./db-workspace.js";
16
16
  async function collectTouchedFiles(basePath, milestoneId) {
17
17
  const files = new Set();
18
18
  if (isDbAvailable()) {
19
- // DB path: query slices and their tasks for file lists
19
+ // DB path: query slices and their tasks for file lists (one batched task
20
+ // query instead of one per slice; file order is irrelevant here — Set dedup)
20
21
  const slices = getMilestoneSlices(milestoneId);
21
- for (const slice of slices) {
22
- const tasks = getSliceTasks(milestoneId, slice.id);
22
+ const tasksBySlice = getTasksBySliceIds(slices.map((slice) => ({ milestoneId, sliceId: slice.id })));
23
+ for (const tasks of tasksBySlice.values()) {
23
24
  for (const task of tasks) {
24
25
  if (Array.isArray(task.files)) {
25
26
  for (const f of task.files) {
@@ -75,15 +75,18 @@ function discoverWorkers(basePath) {
75
75
  }
76
76
  return [...mids].sort();
77
77
  }
78
- function querySliceProgress(basePath, mid, workRoot = worktreePathFor(basePath, mid)) {
78
+ // Slice progress + recent completions share one DB connection per worker per
79
+ // tick. Opening the isolated worker DB twice per refresh (once for each) was
80
+ // pure churn on the 5s interval.
81
+ function queryWorkerProgress(basePath, mid, workRoot = worktreePathFor(basePath, mid)) {
79
82
  const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
80
83
  if (!existsSync(dbPath))
81
- return [];
84
+ return { slices: [], completions: [] };
82
85
  const db = openWorkflowDatabaseIsolated(dbPath);
83
86
  if (!db)
84
- return [];
87
+ return { slices: [], completions: [] };
85
88
  try {
86
- const rows = db.prepare(`SELECT
89
+ const sliceRows = db.prepare(`SELECT
87
90
  s.id AS id,
88
91
  s.status AS status,
89
92
  COUNT(t.id) AS total,
@@ -93,15 +96,29 @@ function querySliceProgress(basePath, mid, workRoot = worktreePathFor(basePath,
93
96
  WHERE s.milestone_id=:mid
94
97
  GROUP BY s.id
95
98
  ORDER BY s.id`).all({ ":mid": mid });
96
- return rows.map((row) => ({
99
+ const slices = sliceRows.map((row) => ({
97
100
  id: String(row["id"] ?? ""),
98
101
  status: String(row["status"] ?? ""),
99
102
  total: Number(row["total"] ?? 0),
100
103
  done: Number(row["done"] ?? 0),
101
104
  }));
105
+ const completionRows = db.prepare(`SELECT id, slice_id, one_liner
106
+ FROM tasks
107
+ WHERE milestone_id=:mid
108
+ AND status='complete'
109
+ AND completed_at IS NOT NULL
110
+ ORDER BY completed_at DESC
111
+ LIMIT 5`).all({ ":mid": mid });
112
+ const completions = completionRows.map((row) => {
113
+ const taskId = String(row["id"] ?? "");
114
+ const sliceId = String(row["slice_id"] ?? "");
115
+ const oneLiner = String(row["one_liner"] ?? "");
116
+ return `✓ ${mid}/${sliceId}/${taskId}${oneLiner ? ": " + oneLiner : ""}`;
117
+ });
118
+ return { slices, completions };
102
119
  }
103
120
  catch {
104
- return [];
121
+ return { slices: [], completions: [] };
105
122
  }
106
123
  finally {
107
124
  try {
@@ -200,39 +217,6 @@ function extractCostFromNdjson(basePath, mid) {
200
217
  return ndjsonCostCache.get(stdoutPath)?.total ?? 0;
201
218
  }
202
219
  }
203
- function queryRecentCompletions(basePath, mid) {
204
- const workRoot = worktreePathFor(basePath, mid);
205
- const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
206
- if (!existsSync(dbPath))
207
- return [];
208
- const db = openWorkflowDatabaseIsolated(dbPath);
209
- if (!db)
210
- return [];
211
- try {
212
- const rows = db.prepare(`SELECT id, slice_id, one_liner
213
- FROM tasks
214
- WHERE milestone_id=:mid
215
- AND status='complete'
216
- AND completed_at IS NOT NULL
217
- ORDER BY completed_at DESC
218
- LIMIT 5`).all({ ":mid": mid });
219
- return rows.map((row) => {
220
- const taskId = String(row["id"] ?? "");
221
- const sliceId = String(row["slice_id"] ?? "");
222
- const oneLiner = String(row["one_liner"] ?? "");
223
- return `✓ ${mid}/${sliceId}/${taskId}${oneLiner ? ": " + oneLiner : ""}`;
224
- });
225
- }
226
- catch {
227
- return [];
228
- }
229
- finally {
230
- try {
231
- db.close();
232
- }
233
- catch { /* ignore */ }
234
- }
235
- }
236
220
  function collectWorkerData(basePath) {
237
221
  const mids = discoverWorkers(basePath);
238
222
  const parallelDir = join(basePath, ".gsd", "parallel");
@@ -243,7 +227,7 @@ function collectWorkerData(basePath) {
243
227
  const workRoot = worktreePathFor(basePath, mid);
244
228
  const status = readJsonSafe(join(parallelDir, `${mid}.status.json`));
245
229
  const lock = readJsonSafe(join(workRoot, ".gsd", "auto.lock"));
246
- const slices = querySliceProgress(basePath, mid, workRoot);
230
+ const { slices, completions } = queryWorkerProgress(basePath, mid, workRoot);
247
231
  const pid = lock?.pid || status?.pid || 0;
248
232
  const alive = pid ? isPidAlive(pid) : false;
249
233
  // Heartbeat: prefer status.json if PID matches, else use file mtime
@@ -303,6 +287,7 @@ function collectWorkerData(basePath) {
303
287
  totalSlices: slices.length,
304
288
  doneSlices,
305
289
  slices,
290
+ completions,
306
291
  errors,
307
292
  });
308
293
  }
@@ -355,10 +340,10 @@ export class ParallelMonitorOverlay {
355
340
  if (this.disposed)
356
341
  return;
357
342
  this.workers = collectWorkerData(this.basePath);
358
- // Collect completion events
343
+ // Collect completion events (already read during collectWorkerData's single
344
+ // DB open per worker — no second connection here).
359
345
  for (const wk of this.workers) {
360
- const completions = queryRecentCompletions(this.basePath, wk.mid);
361
- for (const evt of completions) {
346
+ for (const evt of wk.completions) {
362
347
  if (!this.events.includes(evt))
363
348
  this.events.push(evt);
364
349
  }
@@ -122,6 +122,14 @@ function cachedReaddir(dirPath) {
122
122
  dirListCache.set(dirPath, entries);
123
123
  return entries;
124
124
  }
125
+ function isExistingFile(path) {
126
+ try {
127
+ return statSync(path).isFile();
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ }
125
133
  /**
126
134
  * Clear the volatile directory listing caches.
127
135
  * Call after milestone transitions, file creation in planning directories,
@@ -198,6 +206,25 @@ export function buildTaskFileName(taskId, suffix) {
198
206
  // This helper is deprecated but kept for backward-compat callers.
199
207
  return `${taskId}-${suffix}.md`;
200
208
  }
209
+ /**
210
+ * Build a flat-phase task artifact file name.
211
+ * ("S06", "T03", "SUMMARY") → "S06-T03-SUMMARY.md"
212
+ */
213
+ export function buildFlatTaskFileName(sliceId, taskId, suffix) {
214
+ return `${sliceId}-${taskId}-${suffix}.md`;
215
+ }
216
+ /**
217
+ * Extract the task ID from a task artifact filename.
218
+ * Supports flat-phase S##-T##-SUFFIX.md plus legacy T##-SUFFIX.md and
219
+ * T##-DESCRIPTOR-SUFFIX.md names.
220
+ */
221
+ export function taskIdFromTaskFileName(fileName, suffix) {
222
+ const flat = new RegExp(`^S\\d+-(T\\d+)-${suffix}\\.md$`, "i").exec(fileName);
223
+ if (flat?.[1])
224
+ return flat[1].toUpperCase();
225
+ const legacy = new RegExp(`^(T\\d+)(?:-.*)?-${suffix}\\.md$`, "i").exec(fileName);
226
+ return legacy?.[1]?.toUpperCase() ?? null;
227
+ }
201
228
  // ─── Resolvers ─────────────────────────────────────────────────────────────
202
229
  /**
203
230
  * Find a directory entry by ID prefix within a parent directory.
@@ -238,7 +265,7 @@ export function resolveFile(dir, idPrefix, suffix) {
238
265
  return null;
239
266
  const target = `${idPrefix}-${suffix}.md`.toUpperCase();
240
267
  try {
241
- const entries = cachedReaddir(dir);
268
+ const entries = cachedReaddirWithTypes(dir).filter(e => e.isFile()).map(e => e.name);
242
269
  // Direct match: ID-SUFFIX.md
243
270
  const direct = entries.find(e => e.toUpperCase() === target);
244
271
  if (direct)
@@ -259,19 +286,18 @@ export function resolveFile(dir, idPrefix, suffix) {
259
286
  }
260
287
  }
261
288
  /**
262
- * Find all task files matching a pattern in a tasks directory.
263
- * Returns sorted file names matching T##-SUFFIX.md or legacy T##-*-SUFFIX.md
289
+ * Find all task files matching a pattern in a tasks directory or flat phase dir.
290
+ * Returns sorted file names matching S##-T##-SUFFIX.md, T##-SUFFIX.md,
291
+ * or legacy T##-*-SUFFIX.md.
264
292
  */
265
293
  export function resolveTaskFiles(tasksDir, suffix) {
266
294
  if (!existsSync(tasksDir))
267
295
  return [];
268
296
  try {
269
- // Current convention: T01-PLAN.md
270
- const currentPattern = new RegExp(`^T\\d+-${suffix}\\.md$`, "i");
271
- // Legacy convention: T01-INSTALL-PACKAGES-PLAN.md
272
- const legacyPattern = new RegExp(`^T\\d+-.*-${suffix}\\.md$`, "i");
273
- return cachedReaddir(tasksDir)
274
- .filter(f => currentPattern.test(f) || legacyPattern.test(f))
297
+ return cachedReaddirWithTypes(tasksDir)
298
+ .filter(e => e.isFile())
299
+ .map(e => e.name)
300
+ .filter(f => taskIdFromTaskFileName(f, suffix) !== null)
275
301
  .sort();
276
302
  }
277
303
  catch {
@@ -585,19 +611,22 @@ function legacyMilestonesHasSubdirs(basePath) {
585
611
  * See the matching TODO in markdown-renderer.ts detectStaleRenders, which
586
612
  * disabled stale-render detection for the same reason.
587
613
  */
614
+ const LEGACY_MILESTONE_RUNTIME_DIRS = new Set(["anchors"]);
588
615
  export function dirIsContentBearingLegacyMilestone(dir) {
589
616
  try {
590
617
  const entries = readdirSync(dir, { withFileTypes: true });
591
618
  // 1. Any non-META regular file → real legacy content.
592
619
  if (entries.some(e => e.isFile() && !e.name.endsWith("-META.json")))
593
620
  return true;
594
- // 2. A non-empty subdirectory → real legacy content (e.g. slices/ with slice dirs).
621
+ // 2. A non-empty non-runtime subdirectory → real legacy content (e.g. slices/ with slice dirs).
595
622
  // An *empty* subdir is treated as scaffolding (e.g. git-service.ts may create
596
623
  // an empty slices/ alongside the integration META file) and must NOT flip the
597
624
  // layout — that is the Bugbot finding this guard addresses.
598
625
  return entries.some(e => {
599
626
  if (!e.isDirectory())
600
627
  return false;
628
+ if (LEGACY_MILESTONE_RUNTIME_DIRS.has(e.name))
629
+ return false;
601
630
  try {
602
631
  return readdirSync(join(dir, e.name)).length > 0;
603
632
  }
@@ -807,7 +836,7 @@ export function resolveMilestoneFile(basePath, milestoneId, suffix) {
807
836
  const prefix = `${String(phaseNum).padStart(2, "0")}`;
808
837
  const flatName = `${prefix}-${suffix}.md`;
809
838
  const flatPath = join(mDir, flatName);
810
- if (existsSync(flatPath))
839
+ if (isExistingFile(flatPath))
811
840
  return flatPath;
812
841
  // Legacy fallback: M001-SUFFIX.md
813
842
  const file = resolveFile(mDir, milestoneId, suffix);
@@ -840,12 +869,12 @@ export function resolveSliceFile(basePath, milestoneId, sliceId, suffix) {
840
869
  const planNum = sliceIdToPlanNum(sliceId);
841
870
  const flatName = planFileName(phaseNum, planNum, suffix);
842
871
  const flatPath = join(phaseDir, flatName);
843
- if (existsSync(flatPath))
872
+ if (isExistingFile(flatPath))
844
873
  return flatPath;
845
874
  // Also check plan-number-only format MM-SUFFIX.md (written by buildSliceFileName)
846
875
  const planOnlyName = `${String(planNum).padStart(2, "0")}-${suffix}.md`;
847
876
  const planOnlyPath = join(phaseDir, planOnlyName);
848
- if (existsSync(planOnlyPath))
877
+ if (isExistingFile(planOnlyPath))
849
878
  return planOnlyPath;
850
879
  // Try prefix match for the phase+plan number (handles suffix variations)
851
880
  const planPrefix = `${String(phaseNum).padStart(2, "0")}-${String(planNum).padStart(2, "0")}-`;
@@ -890,8 +919,11 @@ export function resolveTaskFile(basePath, milestoneId, sliceId, taskId, suffix)
890
919
  const legacyBase = legacyMilestonesDir(basePath);
891
920
  const isLegacy = phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\");
892
921
  if (suffix !== "PLAN" && !isLegacy) {
893
- const flatPath = join(phaseDir, buildTaskFileName(taskId, suffix));
894
- return existsSync(flatPath) ? flatPath : null;
922
+ const flatPath = join(phaseDir, buildFlatTaskFileName(sliceId, taskId, suffix));
923
+ if (isExistingFile(flatPath))
924
+ return flatPath;
925
+ const legacyFlatPath = join(phaseDir, buildTaskFileName(taskId, suffix));
926
+ return isExistingFile(legacyFlatPath) ? legacyFlatPath : null;
895
927
  }
896
928
  const tDir = resolveTasksDir(basePath, milestoneId, sliceId);
897
929
  if (tDir) {
@@ -1003,6 +1035,28 @@ export function targetSliceFile(basePath, milestoneId, sliceId, suffix, mileston
1003
1035
  : planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), suffix);
1004
1036
  return join(dir, fileName);
1005
1037
  }
1038
+ /**
1039
+ * Build the canonical absolute write target for a task file.
1040
+ * Readers that need legacy flat-phase fallback should call resolveTaskFile.
1041
+ */
1042
+ export function targetTaskFile(basePath, milestoneId, sliceId, taskId, suffix, milestoneTitle) {
1043
+ if (suffix === "PLAN") {
1044
+ return targetSliceFile(basePath, milestoneId, sliceId, "PLAN", milestoneTitle);
1045
+ }
1046
+ const mDir = resolveMilestonePath(basePath, milestoneId);
1047
+ const legacyBase = legacyMilestonesDir(basePath);
1048
+ const isLegacy = mDir
1049
+ ? mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")
1050
+ : isLegacyMilestonesLayout(basePath);
1051
+ const milestoneDir = mDir
1052
+ ?? dirname(targetMilestoneFile(basePath, milestoneId, "ROADMAP", milestoneTitle));
1053
+ if (isLegacy) {
1054
+ const slicesDir = join(milestoneDir, "slices");
1055
+ const sliceDir = join(slicesDir, resolveDir(slicesDir, sliceId) ?? sliceId);
1056
+ return join(sliceDir, "tasks", buildTaskFileName(taskId, suffix));
1057
+ }
1058
+ return join(milestoneDir, buildFlatTaskFileName(sliceId, taskId, suffix));
1059
+ }
1006
1060
  /**
1007
1061
  * Build relative .gsd/ path to a slice file.
1008
1062
  * Preserves an existing compatibility filename when present; otherwise falls
@@ -1033,5 +1087,5 @@ export function relTaskFile(basePath, milestoneId, sliceId, taskId, suffix, mile
1033
1087
  return relSliceFile(basePath, milestoneId, sliceId, "PLAN");
1034
1088
  }
1035
1089
  const relS = relSlicePath(basePath, milestoneId, sliceId, milestoneTitle);
1036
- return `${relS}/${buildTaskFileName(taskId, suffix)}`;
1090
+ return `${relS}/${buildFlatTaskFileName(sliceId, taskId, suffix)}`;
1037
1091
  }
@@ -7,11 +7,14 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
7
  import { join } from "node:path";
8
8
  import { gsdRoot } from "./paths.js";
9
9
  function anchorsDir(basePath, milestoneId) {
10
- return join(gsdRoot(basePath), "milestones", milestoneId, "anchors");
10
+ return join(gsdRoot(basePath), "runtime", "anchors", milestoneId);
11
11
  }
12
12
  function anchorPath(basePath, milestoneId, phase) {
13
13
  return join(anchorsDir(basePath, milestoneId), `${phase}.json`);
14
14
  }
15
+ function legacyAnchorPath(basePath, milestoneId, phase) {
16
+ return join(gsdRoot(basePath), "milestones", milestoneId, "anchors", `${phase}.json`);
17
+ }
15
18
  export function writePhaseAnchor(basePath, milestoneId, anchor) {
16
19
  const dir = anchorsDir(basePath, milestoneId);
17
20
  if (!existsSync(dir)) {
@@ -20,7 +23,9 @@ export function writePhaseAnchor(basePath, milestoneId, anchor) {
20
23
  writeFileSync(anchorPath(basePath, milestoneId, anchor.phase), JSON.stringify(anchor, null, 2), "utf-8");
21
24
  }
22
25
  export function readPhaseAnchor(basePath, milestoneId, phase) {
23
- const path = anchorPath(basePath, milestoneId, phase);
26
+ const path = existsSync(anchorPath(basePath, milestoneId, phase))
27
+ ? anchorPath(basePath, milestoneId, phase)
28
+ : legacyAnchorPath(basePath, milestoneId, phase);
24
29
  if (!existsSync(path))
25
30
  return null;
26
31
  try {
@@ -0,0 +1,37 @@
1
+ import { CONFIGURABLE_PLANNING_SUBAGENT_UNITS } from "./preferences-types.js";
2
+ import { loadEffectiveGSDPreferences } from "./preferences.js";
3
+ const CONFIGURABLE_UNITS = new Set(CONFIGURABLE_PLANNING_SUBAGENT_UNITS);
4
+ function configuredAllowedSubagents(unitType, preferences) {
5
+ if (!CONFIGURABLE_UNITS.has(unitType))
6
+ return [];
7
+ return preferences?.planning_subagents?.[unitType]?.allowed ?? [];
8
+ }
9
+ function mergeAllowedSubagents(current, configured) {
10
+ return Array.from(new Set([...current, ...configured]));
11
+ }
12
+ export function applyPlanningSubagentPreferences(unitType, policy, preferences) {
13
+ if (!policy)
14
+ return policy;
15
+ const configured = configuredAllowedSubagents(unitType, preferences);
16
+ if (configured.length === 0)
17
+ return policy;
18
+ if (policy.mode === "planning") {
19
+ return {
20
+ mode: "planning-dispatch",
21
+ allowedSubagents: mergeAllowedSubagents([], configured),
22
+ };
23
+ }
24
+ if (policy.mode === "planning-dispatch") {
25
+ return {
26
+ ...policy,
27
+ allowedSubagents: mergeAllowedSubagents(policy.allowedSubagents, configured),
28
+ };
29
+ }
30
+ return policy;
31
+ }
32
+ export function resolveEffectivePlanningToolsPolicy(unitType, policy, basePath) {
33
+ if (!basePath)
34
+ return policy;
35
+ const preferences = loadEffectiveGSDPreferences(basePath)?.preferences;
36
+ return applyPlanningSubagentPreferences(unitType, policy, preferences);
37
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Read-only planning specialists that controlled planning dispatch may use.
3
+ *
4
+ * Unit manifests and project preferences still declare per-unit subsets. This
5
+ * registry is the global safety classification checked by the write gate and
6
+ * preference validation before any configured planning allowlist takes effect.
7
+ */
8
+ const PLANNING_DISPATCH_AGENT_REGISTRY = {
9
+ mnemo: { readOnlySpecialist: true },
10
+ scout: { readOnlySpecialist: true },
11
+ planner: { readOnlySpecialist: true },
12
+ reviewer: { readOnlySpecialist: true },
13
+ security: { readOnlySpecialist: true },
14
+ tester: { readOnlySpecialist: true },
15
+ };
16
+ export const ALLOWED_PLANNING_DISPATCH_AGENTS = new Set(Object.entries(PLANNING_DISPATCH_AGENT_REGISTRY)
17
+ .filter(([, metadata]) => metadata.readOnlySpecialist)
18
+ .map(([agentId]) => agentId));
19
+ export function isReadOnlyPlanningDispatchAgent(agentId) {
20
+ const metadata = PLANNING_DISPATCH_AGENT_REGISTRY[agentId];
21
+ return metadata?.readOnlySpecialist === true;
22
+ }
23
+ export function allowedPlanningDispatchAgentsList() {
24
+ return [...ALLOWED_PLANNING_DISPATCH_AGENTS].join(", ");
25
+ }
@@ -242,11 +242,11 @@ export function checkImportResolution(taskRow, _priorTasks, basePath) {
242
242
  }
243
243
  const imports = extractRelativeImports(source);
244
244
  for (const { importPath, lineNum } of imports) {
245
- // Framework-generated type modules may not exist on disk during post-exec
246
- // checks (typically generated during framework builds/typegen). Don't
247
- // block task completion on these imports.
245
+ // Framework/codegen-generated modules may not exist on disk during
246
+ // post-exec checks. Don't block task completion on these imports.
248
247
  if (/^\.{1,2}\/\+types\//.test(importPath) ||
249
- /^(?:\.{1,2}\/)+(?:[^/]+\/)*\$types(?:$|\/)/.test(importPath)) {
248
+ /^(?:\.{1,2}\/)+(?:[^/]+\/)*\$types(?:$|\/)/.test(importPath) ||
249
+ /^(?:\.{1,2}\/)+(?:[^/]+\/)*_generated(?:$|\/)/.test(importPath)) {
250
250
  continue;
251
251
  }
252
252
  const resolution = resolveImportPath(importPath, file, basePath);
@@ -61,6 +61,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set([
61
61
  "git",
62
62
  "post_unit_hooks",
63
63
  "pre_dispatch_hooks",
64
+ "planning_subagents",
64
65
  "dynamic_routing",
65
66
  "disabled_model_providers",
66
67
  "uok",
@@ -134,6 +135,10 @@ export const KNOWN_UNIT_LABELS = [
134
135
  "workflow-preferences", "discuss-project", "discuss-requirements",
135
136
  "research-decision", "research-project",
136
137
  ];
138
+ export const CONFIGURABLE_PLANNING_SUBAGENT_UNITS = [
139
+ "plan-milestone",
140
+ "plan-slice",
141
+ ];
137
142
  export const SKILL_ACTIONS = new Set(["use", "prefer", "avoid"]);
138
143
  /** The nine model-routing phase buckets. */
139
144
  export const GSD_MODEL_PHASE_KEYS = [
@@ -9,7 +9,8 @@ import { isAbsolute } from "node:path";
9
9
  import { VALID_BRANCH_NAME } from "./git-service.js";
10
10
  import { normalizeStringArray } from "../shared/format-utils.js";
11
11
  import { getGateIdsForTurn } from "./gate-registry.js";
12
- import { KNOWN_PREFERENCE_KEYS, KNOWN_UNIT_LABELS, GSD_MODEL_PHASE_KEYS, SKILL_ACTIONS, } from "./preferences-types.js";
12
+ import { KNOWN_PREFERENCE_KEYS, KNOWN_UNIT_LABELS, CONFIGURABLE_PLANNING_SUBAGENT_UNITS, GSD_MODEL_PHASE_KEYS, SKILL_ACTIONS, } from "./preferences-types.js";
13
+ import { ALLOWED_PLANNING_DISPATCH_AGENTS, allowedPlanningDispatchAgentsList, } from "./planning-subagent-registry.js";
13
14
  const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
14
15
  const VALID_THINKING_LEVELS = new Set([
15
16
  "off",
@@ -727,6 +728,52 @@ export function validatePreferences(preferences) {
727
728
  validated.pre_dispatch_hooks = validPreHooks;
728
729
  }
729
730
  }
731
+ // ─── Planning Subagents ─────────────────────────────────────────────────
732
+ if (preferences.planning_subagents !== undefined) {
733
+ if (!preferences.planning_subagents ||
734
+ typeof preferences.planning_subagents !== "object" ||
735
+ Array.isArray(preferences.planning_subagents)) {
736
+ errors.push("planning_subagents must be an object keyed by planning unit type");
737
+ }
738
+ else {
739
+ const validUnits = new Set(CONFIGURABLE_PLANNING_SUBAGENT_UNITS);
740
+ const validPlanningSubagents = {};
741
+ for (const [unitType, rawConfig] of Object.entries(preferences.planning_subagents)) {
742
+ if (!validUnits.has(unitType)) {
743
+ errors.push(`planning_subagents unknown or unsupported unit "${unitType}" — supported units: ` +
744
+ `${CONFIGURABLE_PLANNING_SUBAGENT_UNITS.join(", ")}`);
745
+ continue;
746
+ }
747
+ if (!rawConfig || typeof rawConfig !== "object" || Array.isArray(rawConfig)) {
748
+ errors.push(`planning_subagents.${unitType} must be an object with an allowed array`);
749
+ continue;
750
+ }
751
+ const allowed = normalizeStringArray(rawConfig.allowed);
752
+ if (allowed.length === 0) {
753
+ errors.push(`planning_subagents.${unitType}.allowed must include at least one read-only planning specialist`);
754
+ continue;
755
+ }
756
+ const sanitizedAllowed = [];
757
+ for (const agentId of allowed) {
758
+ if (!ALLOWED_PLANNING_DISPATCH_AGENTS.has(agentId)) {
759
+ errors.push(`planning_subagents.${unitType}.allowed includes "${agentId}", which is not classified as a ` +
760
+ `read-only planning specialist. Allowed agents: ${allowedPlanningDispatchAgentsList()}`);
761
+ continue;
762
+ }
763
+ sanitizedAllowed.push(agentId);
764
+ }
765
+ const dedupedAllowed = Array.from(new Set(sanitizedAllowed));
766
+ if (dedupedAllowed.length > 0) {
767
+ validPlanningSubagents[unitType] = {
768
+ allowed: dedupedAllowed,
769
+ };
770
+ }
771
+ }
772
+ if (Object.keys(validPlanningSubagents).length > 0) {
773
+ validated.planning_subagents = validPlanningSubagents;
774
+ }
775
+ }
776
+ }
730
777
  // ─── Dynamic Routing ─────────────────────────────────────────────────
731
778
  if (preferences.dynamic_routing !== undefined) {
732
779
  if (typeof preferences.dynamic_routing === "object" && preferences.dynamic_routing !== null) {