@opengsd/gsd-pi 1.8.1 → 1.9.0-dev.5c1a3ff2

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 (546) 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 +25 -2
  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-artifact-paths.js +16 -10
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +74 -19
  19. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
  20. package/dist/resources/extensions/gsd/auto-prompts.js +125 -18
  21. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  22. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
  23. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
  24. package/dist/resources/extensions/gsd/auto.js +5 -1
  25. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
  26. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -5
  27. package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
  28. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -50
  29. package/dist/resources/extensions/gsd/command-feedback.js +16 -12
  30. package/dist/resources/extensions/gsd/compat/compat-marker.js +19 -2
  31. package/dist/resources/extensions/gsd/constants.js +12 -13
  32. package/dist/resources/extensions/gsd/context-masker.js +97 -21
  33. package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
  34. package/dist/resources/extensions/gsd/db/engine.js +51 -16
  35. package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
  36. package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
  37. package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
  38. package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
  39. package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
  40. package/dist/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  41. package/dist/resources/extensions/gsd/doctor-engine-checks.js +3 -6
  42. package/dist/resources/extensions/gsd/flat-phase-migration.js +156 -21
  43. package/dist/resources/extensions/gsd/git-service.js +19 -7
  44. package/dist/resources/extensions/gsd/gsd-db.js +187 -45
  45. package/dist/resources/extensions/gsd/guided-flow.js +38 -13
  46. package/dist/resources/extensions/gsd/markdown-renderer.js +17 -13
  47. package/dist/resources/extensions/gsd/md-importer.js +107 -20
  48. package/dist/resources/extensions/gsd/migrate/command.js +19 -162
  49. package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
  50. package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
  51. package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
  52. package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
  53. package/dist/resources/extensions/gsd/model-cost-table.js +2 -0
  54. package/dist/resources/extensions/gsd/model-router.js +11 -0
  55. package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
  56. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
  57. package/dist/resources/extensions/gsd/paths.js +55 -11
  58. package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
  59. package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
  60. package/dist/resources/extensions/gsd/planning-subagent-registry.js +25 -0
  61. package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
  62. package/dist/resources/extensions/gsd/preferences-types.js +5 -0
  63. package/dist/resources/extensions/gsd/preferences-validation.js +48 -1
  64. package/dist/resources/extensions/gsd/preferences.js +17 -0
  65. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  66. package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
  67. package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
  68. package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
  69. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
  70. package/dist/resources/extensions/gsd/skill-activation.js +17 -3
  71. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +27 -13
  72. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +13 -3
  73. package/dist/resources/extensions/gsd/stop-notice.js +15 -1
  74. package/dist/resources/extensions/gsd/sync-lock.js +13 -7
  75. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  76. package/dist/resources/extensions/gsd/tools/complete-task.js +94 -6
  77. package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
  78. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
  79. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
  80. package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
  81. package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
  82. package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
  83. package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
  84. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
  85. package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
  86. package/dist/resources/extensions/gsd/unit-registry.js +4 -0
  87. package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
  88. package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
  89. package/dist/resources/extensions/gsd/workspace.js +2 -1
  90. package/dist/resources/extensions/gsd/worktree-state-projection.js +6 -0
  91. package/dist/resources/extensions/mac-tools/index.js +31 -9
  92. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  93. package/dist/web/standalone/.next/BUILD_ID +1 -1
  94. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  95. package/dist/web/standalone/.next/build-manifest.json +3 -3
  96. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  97. package/dist/web/standalone/.next/required-server-files.json +3 -3
  98. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  99. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  109. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  112. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  118. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  125. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  137. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  159. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  169. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  175. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  191. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  195. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/index.html +1 -1
  205. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  206. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  207. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  208. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  209. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  210. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  211. package/dist/web/standalone/.next/server/app/page.js +2 -2
  212. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  214. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  215. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  216. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/middleware.js +3 -3
  218. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  219. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  220. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  221. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  223. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  225. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  226. package/dist/web/standalone/.next/static/css/3b1ceb7abfb9a230.css +1 -0
  227. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  228. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  229. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  230. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  231. package/dist/web/standalone/package.json +0 -1
  232. package/dist/web/standalone/server.js +1 -1
  233. package/dist/web-mode.js +31 -3
  234. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  235. package/integrations/hermes/pyproject.toml +1 -1
  236. package/package.json +12 -10
  237. package/packages/cloud-mcp-gateway/package.json +2 -2
  238. package/packages/contracts/dist/workflow.d.ts +14 -0
  239. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  240. package/packages/contracts/dist/workflow.js +16 -0
  241. package/packages/contracts/dist/workflow.js.map +1 -1
  242. package/packages/contracts/package.json +1 -1
  243. package/packages/daemon/dist/cloud-config.d.ts +1 -1
  244. package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
  245. package/packages/daemon/dist/cloud-config.js +5 -1
  246. package/packages/daemon/dist/cloud-config.js.map +1 -1
  247. package/packages/daemon/dist/cloud-config.test.js +51 -1
  248. package/packages/daemon/dist/cloud-config.test.js.map +1 -1
  249. package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
  250. package/packages/daemon/dist/local-tool-executor.js +2 -0
  251. package/packages/daemon/dist/local-tool-executor.js.map +1 -1
  252. package/packages/daemon/package.json +6 -6
  253. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  254. package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
  255. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  256. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  257. package/packages/gsd-agent-core/dist/sdk.js +1 -0
  258. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  259. package/packages/gsd-agent-core/package.json +5 -5
  260. package/packages/gsd-agent-modes/package.json +7 -7
  261. package/packages/gsd-cloud/dist/cli.d.ts +5 -0
  262. package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
  263. package/packages/gsd-cloud/dist/cli.js +160 -0
  264. package/packages/gsd-cloud/dist/cli.js.map +1 -0
  265. package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
  266. package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
  267. package/packages/gsd-cloud/dist/cloud-config.js +231 -0
  268. package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
  269. package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
  270. package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
  271. package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
  272. package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
  273. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
  274. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
  275. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
  276. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
  277. package/packages/gsd-cloud/dist/cloud-runtime.d.ts +35 -0
  278. package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
  279. package/packages/gsd-cloud/dist/cloud-runtime.js +258 -0
  280. package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
  281. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
  282. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
  283. package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
  284. package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
  285. package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
  286. package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
  287. package/packages/gsd-cloud/dist/cloud-token.js +37 -0
  288. package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
  289. package/packages/gsd-cloud/dist/config.d.ts +17 -0
  290. package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
  291. package/packages/gsd-cloud/dist/config.js +146 -0
  292. package/packages/gsd-cloud/dist/config.js.map +1 -0
  293. package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
  294. package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
  295. package/packages/gsd-cloud/dist/device-flow.js +128 -0
  296. package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
  297. package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
  298. package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
  299. package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
  300. package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
  301. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
  302. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
  303. package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
  304. package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
  305. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
  306. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
  307. package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
  308. package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
  309. package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
  310. package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
  311. package/packages/gsd-cloud/dist/executors/executor.js +11 -0
  312. package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
  313. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
  314. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
  315. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
  316. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
  317. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
  318. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
  319. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
  320. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
  321. package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
  322. package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
  323. package/packages/gsd-cloud/dist/executors/index.js +29 -0
  324. package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
  325. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
  326. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
  327. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
  328. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
  329. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
  330. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
  331. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
  332. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
  333. package/packages/gsd-cloud/dist/index.d.ts +7 -0
  334. package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
  335. package/packages/gsd-cloud/dist/index.js +8 -0
  336. package/packages/gsd-cloud/dist/index.js.map +1 -0
  337. package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
  338. package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
  339. package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
  340. package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
  341. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
  342. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
  343. package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
  344. package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
  345. package/packages/gsd-cloud/dist/logger.d.ts +25 -0
  346. package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
  347. package/packages/gsd-cloud/dist/logger.js +72 -0
  348. package/packages/gsd-cloud/dist/logger.js.map +1 -0
  349. package/packages/gsd-cloud/dist/types.d.ts +51 -0
  350. package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
  351. package/packages/gsd-cloud/dist/types.js +9 -0
  352. package/packages/gsd-cloud/dist/types.js.map +1 -0
  353. package/packages/gsd-cloud/package.json +3 -3
  354. package/packages/mcp-server/README.md +15 -2
  355. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  356. package/packages/mcp-server/dist/server.js +5 -5
  357. package/packages/mcp-server/dist/server.js.map +1 -1
  358. package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
  359. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  360. package/packages/mcp-server/dist/workflow-tools.js +64 -2
  361. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  362. package/packages/mcp-server/package.json +4 -4
  363. package/packages/native/package.json +1 -1
  364. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  365. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  366. package/packages/pi-agent-core/dist/agent.js +2 -0
  367. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  368. package/packages/pi-agent-core/package.json +1 -1
  369. package/packages/pi-ai/dist/models.generated.d.ts +119 -0
  370. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  371. package/packages/pi-ai/dist/models.generated.js +107 -0
  372. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  373. package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
  374. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  375. package/packages/pi-ai/dist/providers/anthropic.js +25 -1
  376. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  377. package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
  378. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  379. package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
  380. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  381. package/packages/pi-ai/package.json +1 -1
  382. package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
  383. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
  385. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  386. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +11 -1
  387. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  388. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  389. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  390. package/packages/pi-coding-agent/package.json +7 -7
  391. package/packages/pi-tui/package.json +2 -2
  392. package/packages/rpc-client/package.json +2 -2
  393. package/pkg/package.json +1 -1
  394. package/src/resources/GSD-WORKFLOW.md +18 -49
  395. package/src/resources/extensions/browser-tools/capture.ts +2 -86
  396. package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
  397. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
  398. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
  399. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
  400. package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
  401. package/src/resources/extensions/gsd/auto-artifact-paths.ts +16 -9
  402. package/src/resources/extensions/gsd/auto-dispatch.ts +86 -19
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
  404. package/src/resources/extensions/gsd/auto-prompts.ts +142 -16
  405. package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
  406. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
  407. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
  408. package/src/resources/extensions/gsd/auto.ts +5 -1
  409. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
  410. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +39 -10
  411. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
  412. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +87 -53
  413. package/src/resources/extensions/gsd/command-feedback.ts +19 -12
  414. package/src/resources/extensions/gsd/compat/compat-marker.ts +21 -4
  415. package/src/resources/extensions/gsd/constants.ts +14 -13
  416. package/src/resources/extensions/gsd/context-masker.ts +98 -2
  417. package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
  418. package/src/resources/extensions/gsd/db/engine.ts +53 -17
  419. package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
  420. package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
  421. package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
  422. package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
  423. package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
  424. package/src/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  425. package/src/resources/extensions/gsd/doctor-engine-checks.ts +3 -5
  426. package/src/resources/extensions/gsd/flat-phase-migration.ts +160 -19
  427. package/src/resources/extensions/gsd/git-service.ts +19 -6
  428. package/src/resources/extensions/gsd/gsd-db.ts +255 -52
  429. package/src/resources/extensions/gsd/guided-flow.ts +48 -12
  430. package/src/resources/extensions/gsd/markdown-renderer.ts +25 -21
  431. package/src/resources/extensions/gsd/md-importer.ts +114 -16
  432. package/src/resources/extensions/gsd/migrate/command.ts +21 -227
  433. package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
  434. package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
  435. package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
  436. package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
  437. package/src/resources/extensions/gsd/model-cost-table.ts +2 -0
  438. package/src/resources/extensions/gsd/model-router.ts +12 -0
  439. package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
  440. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
  441. package/src/resources/extensions/gsd/paths.ts +62 -11
  442. package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
  443. package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
  444. package/src/resources/extensions/gsd/planning-subagent-registry.ts +31 -0
  445. package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
  446. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  447. package/src/resources/extensions/gsd/preferences-validation.ts +62 -0
  448. package/src/resources/extensions/gsd/preferences.ts +25 -0
  449. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  450. package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
  451. package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
  452. package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
  453. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
  454. package/src/resources/extensions/gsd/skill-activation.ts +17 -3
  455. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +30 -13
  456. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +16 -3
  457. package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
  458. package/src/resources/extensions/gsd/stop-notice.ts +18 -1
  459. package/src/resources/extensions/gsd/sync-lock.ts +14 -6
  460. package/src/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  461. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
  462. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
  463. package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
  464. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
  465. package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
  466. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +104 -0
  467. package/src/resources/extensions/gsd/tests/complete-task.test.ts +362 -1
  468. package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
  469. package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
  470. package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
  471. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
  472. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
  473. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
  474. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
  475. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
  476. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
  477. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
  478. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
  479. package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
  480. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +202 -0
  481. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
  482. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +25 -0
  483. package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
  484. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
  485. package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
  486. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
  487. package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
  488. package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
  489. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
  490. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
  491. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  492. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  493. package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
  494. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
  495. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
  496. package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
  497. package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
  498. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
  499. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
  500. package/src/resources/extensions/gsd/tests/preferences.test.ts +84 -0
  501. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +4 -0
  502. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +66 -0
  503. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
  504. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
  505. package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
  506. package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
  507. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  508. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
  509. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
  510. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
  511. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +17 -0
  512. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
  513. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
  514. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
  515. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +73 -0
  516. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
  517. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
  518. package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
  519. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
  520. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
  521. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
  522. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
  523. package/src/resources/extensions/gsd/tools/complete-task.ts +140 -5
  524. package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
  525. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
  526. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
  527. package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
  528. package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
  529. package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
  530. package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
  531. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
  532. package/src/resources/extensions/gsd/types.ts +11 -0
  533. package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
  534. package/src/resources/extensions/gsd/unit-registry.ts +4 -0
  535. package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
  536. package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
  537. package/src/resources/extensions/gsd/workspace.ts +2 -1
  538. package/src/resources/extensions/gsd/worktree-state-projection.ts +12 -0
  539. package/src/resources/extensions/mac-tools/index.ts +52 -9
  540. package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
  541. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  542. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  543. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  544. package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
  545. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → 6YWV7VAPg-jqjfPswrKZb}/_buildManifest.js +0 -0
  546. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → 6YWV7VAPg-jqjfPswrKZb}/_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
  }
@@ -198,6 +198,25 @@ export function buildTaskFileName(taskId, suffix) {
198
198
  // This helper is deprecated but kept for backward-compat callers.
199
199
  return `${taskId}-${suffix}.md`;
200
200
  }
201
+ /**
202
+ * Build a flat-phase task artifact file name.
203
+ * ("S06", "T03", "SUMMARY") → "S06-T03-SUMMARY.md"
204
+ */
205
+ export function buildFlatTaskFileName(sliceId, taskId, suffix) {
206
+ return `${sliceId}-${taskId}-${suffix}.md`;
207
+ }
208
+ /**
209
+ * Extract the task ID from a task artifact filename.
210
+ * Supports flat-phase S##-T##-SUFFIX.md plus legacy T##-SUFFIX.md and
211
+ * T##-DESCRIPTOR-SUFFIX.md names.
212
+ */
213
+ export function taskIdFromTaskFileName(fileName, suffix) {
214
+ const flat = new RegExp(`^S\\d+-(T\\d+)-${suffix}\\.md$`, "i").exec(fileName);
215
+ if (flat?.[1])
216
+ return flat[1].toUpperCase();
217
+ const legacy = new RegExp(`^(T\\d+)(?:-.*)?-${suffix}\\.md$`, "i").exec(fileName);
218
+ return legacy?.[1]?.toUpperCase() ?? null;
219
+ }
201
220
  // ─── Resolvers ─────────────────────────────────────────────────────────────
202
221
  /**
203
222
  * Find a directory entry by ID prefix within a parent directory.
@@ -259,19 +278,16 @@ export function resolveFile(dir, idPrefix, suffix) {
259
278
  }
260
279
  }
261
280
  /**
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
281
+ * Find all task files matching a pattern in a tasks directory or flat phase dir.
282
+ * Returns sorted file names matching S##-T##-SUFFIX.md, T##-SUFFIX.md,
283
+ * or legacy T##-*-SUFFIX.md.
264
284
  */
265
285
  export function resolveTaskFiles(tasksDir, suffix) {
266
286
  if (!existsSync(tasksDir))
267
287
  return [];
268
288
  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
289
  return cachedReaddir(tasksDir)
274
- .filter(f => currentPattern.test(f) || legacyPattern.test(f))
290
+ .filter(f => taskIdFromTaskFileName(f, suffix) !== null)
275
291
  .sort();
276
292
  }
277
293
  catch {
@@ -585,19 +601,22 @@ function legacyMilestonesHasSubdirs(basePath) {
585
601
  * See the matching TODO in markdown-renderer.ts detectStaleRenders, which
586
602
  * disabled stale-render detection for the same reason.
587
603
  */
604
+ const LEGACY_MILESTONE_RUNTIME_DIRS = new Set(["anchors"]);
588
605
  export function dirIsContentBearingLegacyMilestone(dir) {
589
606
  try {
590
607
  const entries = readdirSync(dir, { withFileTypes: true });
591
608
  // 1. Any non-META regular file → real legacy content.
592
609
  if (entries.some(e => e.isFile() && !e.name.endsWith("-META.json")))
593
610
  return true;
594
- // 2. A non-empty subdirectory → real legacy content (e.g. slices/ with slice dirs).
611
+ // 2. A non-empty non-runtime subdirectory → real legacy content (e.g. slices/ with slice dirs).
595
612
  // An *empty* subdir is treated as scaffolding (e.g. git-service.ts may create
596
613
  // an empty slices/ alongside the integration META file) and must NOT flip the
597
614
  // layout — that is the Bugbot finding this guard addresses.
598
615
  return entries.some(e => {
599
616
  if (!e.isDirectory())
600
617
  return false;
618
+ if (LEGACY_MILESTONE_RUNTIME_DIRS.has(e.name))
619
+ return false;
601
620
  try {
602
621
  return readdirSync(join(dir, e.name)).length > 0;
603
622
  }
@@ -890,8 +909,11 @@ export function resolveTaskFile(basePath, milestoneId, sliceId, taskId, suffix)
890
909
  const legacyBase = legacyMilestonesDir(basePath);
891
910
  const isLegacy = phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\");
892
911
  if (suffix !== "PLAN" && !isLegacy) {
893
- const flatPath = join(phaseDir, buildTaskFileName(taskId, suffix));
894
- return existsSync(flatPath) ? flatPath : null;
912
+ const flatPath = join(phaseDir, buildFlatTaskFileName(sliceId, taskId, suffix));
913
+ if (existsSync(flatPath))
914
+ return flatPath;
915
+ const legacyFlatPath = join(phaseDir, buildTaskFileName(taskId, suffix));
916
+ return existsSync(legacyFlatPath) ? legacyFlatPath : null;
895
917
  }
896
918
  const tDir = resolveTasksDir(basePath, milestoneId, sliceId);
897
919
  if (tDir) {
@@ -1003,6 +1025,28 @@ export function targetSliceFile(basePath, milestoneId, sliceId, suffix, mileston
1003
1025
  : planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), suffix);
1004
1026
  return join(dir, fileName);
1005
1027
  }
1028
+ /**
1029
+ * Build the canonical absolute write target for a task file.
1030
+ * Readers that need legacy flat-phase fallback should call resolveTaskFile.
1031
+ */
1032
+ export function targetTaskFile(basePath, milestoneId, sliceId, taskId, suffix, milestoneTitle) {
1033
+ if (suffix === "PLAN") {
1034
+ return targetSliceFile(basePath, milestoneId, sliceId, "PLAN", milestoneTitle);
1035
+ }
1036
+ const mDir = resolveMilestonePath(basePath, milestoneId);
1037
+ const legacyBase = legacyMilestonesDir(basePath);
1038
+ const isLegacy = mDir
1039
+ ? mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")
1040
+ : isLegacyMilestonesLayout(basePath);
1041
+ const milestoneDir = mDir
1042
+ ?? dirname(targetMilestoneFile(basePath, milestoneId, "ROADMAP", milestoneTitle));
1043
+ if (isLegacy) {
1044
+ const slicesDir = join(milestoneDir, "slices");
1045
+ const sliceDir = join(slicesDir, resolveDir(slicesDir, sliceId) ?? sliceId);
1046
+ return join(sliceDir, "tasks", buildTaskFileName(taskId, suffix));
1047
+ }
1048
+ return join(milestoneDir, buildFlatTaskFileName(sliceId, taskId, suffix));
1049
+ }
1006
1050
  /**
1007
1051
  * Build relative .gsd/ path to a slice file.
1008
1052
  * Preserves an existing compatibility filename when present; otherwise falls
@@ -1033,5 +1077,5 @@ export function relTaskFile(basePath, milestoneId, sliceId, taskId, suffix, mile
1033
1077
  return relSliceFile(basePath, milestoneId, sliceId, "PLAN");
1034
1078
  }
1035
1079
  const relS = relSlicePath(basePath, milestoneId, sliceId, milestoneTitle);
1036
- return `${relS}/${buildTaskFileName(taskId, suffix)}`;
1080
+ return `${relS}/${buildFlatTaskFileName(sliceId, taskId, suffix)}`;
1037
1081
  }
@@ -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) {
@@ -635,6 +635,7 @@ function mergePreferences(base, override) {
635
635
  : undefined,
636
636
  post_unit_hooks: mergePostUnitHooks(base.post_unit_hooks, override.post_unit_hooks),
637
637
  pre_dispatch_hooks: mergePreDispatchHooks(base.pre_dispatch_hooks, override.pre_dispatch_hooks),
638
+ planning_subagents: mergePlanningSubagents(base.planning_subagents, override.planning_subagents),
638
639
  dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
639
640
  ? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) }
640
641
  : undefined,
@@ -752,6 +753,22 @@ function mergePreDispatchHooks(base, override) {
752
753
  }
753
754
  return merged.length > 0 ? merged : undefined;
754
755
  }
756
+ function mergePlanningSubagents(base, override) {
757
+ if (!base && !override)
758
+ return undefined;
759
+ const merged = {};
760
+ const unitTypes = new Set([
761
+ ...Object.keys(base ?? {}),
762
+ ...Object.keys(override ?? {}),
763
+ ]);
764
+ for (const unitType of unitTypes) {
765
+ const allowed = mergeStringLists(base?.[unitType]?.allowed, override?.[unitType]?.allowed);
766
+ if (allowed?.length) {
767
+ merged[unitType] = { allowed };
768
+ }
769
+ }
770
+ return Object.keys(merged).length > 0 ? merged : undefined;
771
+ }
755
772
  // ─── System Prompt Rendering ──────────────────────────────────────────────────
756
773
  export function renderPreferencesForSystemPrompt(preferences, resolutions, options) {
757
774
  const validated = validatePreferences(preferences);
@@ -66,12 +66,12 @@ Then:
66
66
  **Web apps:** when inlined Web App UAT guidance is present, follow it for Playwright scaffolding and browser-capable verification commands.
67
67
  4. For non-trivial slices, plan observability / proof level / integration closure, threat surface, and requirement impact. Omit entirely for simple slices.
68
68
  5. Decompose the slice into tasks that fit one context window each. Every task passed to `gsd_plan_slice` must use the exact keys `taskId`, `title`, `description`, `estimate`, `files`, `verify`, `inputs`, `expectedOutput`, and optional `observabilityImpact`. Put Why / Do / Done-when detail in `description`. `files`, `inputs`, and `expectedOutput` must be JSON arrays of strings, even for one path (for example, `"expectedOutput": ["src/index.ts"]`, never `"expectedOutput": "src/index.ts"`). `expectedOutput` is path-only: list only files the task creates or overwrites, and use `[]` for pure verification tasks. Never list GSD planning artifacts — anything under `.gsd/`, `.planning/`, or `.audits/`, or artifact names like `M001-CONTEXT.md` / `S01-PLAN.md` — in `inputs`, `files`, or `expectedOutput`: their content is preloaded as context, and they are written by workflow tools, not by tasks.
69
- 6. **Persist planning state through `gsd_plan_slice`.** Call it with the full payload. The tool writes to the DB and renders `{{outputPath}}` and `{{slicePath}}/tasks/T##-PLAN.md` automatically. Do NOT rely on direct `PLAN.md` writes.
69
+ 6. **Persist planning state through `gsd_plan_slice`.** Call it with the full payload. The tool writes to the DB and renders `{{outputPath}}` with embedded task planning automatically. Do NOT rely on direct `PLAN.md` writes.
70
70
  7. **Self-audit the plan.** If every task were completed exactly as written, the slice goal/demo should be true. Every must-have maps to a task. Inputs and Expected Output are backtick-wrapped file paths.
71
71
  8. If refinement produced structural decisions that diverge from the sketch, call `gsd_decision_save` for each; the tool persists the decision and regenerates `.gsd/DECISIONS.md`.
72
72
  9. {{commitInstruction}}
73
73
 
74
- The slice directory and tasks/ subdirectory already exist. Do NOT mkdir.
74
+ The slice plan path already exists. Do NOT mkdir.
75
75
 
76
76
  **Autonomous execution:** Do not call `ask_user_questions` or `secure_env_collect`. Document assumptions in the plan.
77
77