@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
@@ -10,198 +10,24 @@
10
10
  */
11
11
 
12
12
  import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
13
- import { existsSync, readFileSync } from "node:fs";
14
- import { join, dirname } from "node:path";
15
13
  import { gsdRoot } from "../paths.js";
16
- import { fileURLToPath } from "node:url";
17
14
  import { showNextAction } from "../../shared/tui.js";
18
15
  import {
19
16
  notifyMigrateNeedsInteractiveMenu,
20
17
  requiresInteractiveMenu,
21
18
  } from "../command-feedback.js";
22
- import {
23
- validatePlanningDirectory,
24
- parsePlanningDirectory,
25
- transformToGSD,
26
- generatePreview,
27
- writeGSDDirectory,
28
- } from "./index.js";
29
-
30
- import type { MigrationPreview, WrittenFiles } from "./writer.js";
31
- import { ensureDbOpen } from "../bootstrap/dynamic-tools.js";
32
- import { clearArtifacts, clearDecisions, clearRequirements, clearEngineHierarchy, transaction } from "../gsd-db.js";
33
- import { migrateFromMarkdown } from "../md-importer.js";
34
- import { deriveState, invalidateStateCache } from "../state.js";
35
- import {
36
- archiveLegacyPlanningDirectory,
37
- verifyMigrationProjection,
38
- writeMigrationAudit,
39
- type LegacyArchiveResult,
40
- type MigrationAuditResult,
41
- type MigrationProjectionVerification,
42
- } from "./audit.js";
43
- import {
44
- assertMigrationHasSlices,
45
- assertMigrationTargetAvailable,
46
- prepareMigrationTarget,
47
- resolveMigrationPaths,
48
- restoreMigrationTarget,
49
- type MigrationBackup,
50
- } from "./safety.js";
51
-
52
- export type MigrationImportCounts = ReturnType<typeof migrateFromMarkdown>;
53
-
54
- export interface MigrationExecutionResult {
55
- backup: MigrationBackup;
56
- written: WrittenFiles;
57
- imported: MigrationImportCounts;
58
- legacyArchive: LegacyArchiveResult;
59
- verification: MigrationProjectionVerification;
60
- audit: MigrationAuditResult;
61
- }
62
-
63
- function assertMigrationImportMatchesPreview(imported: MigrationImportCounts, preview: MigrationPreview): void {
64
- const mismatches: string[] = [];
65
- if (imported.decisions !== preview.decisions.total) {
66
- mismatches.push(`decisions ${imported.decisions}/${preview.decisions.total}`);
67
- }
68
- if (imported.hierarchy.milestones !== preview.milestoneCount) {
69
- mismatches.push(`milestones ${imported.hierarchy.milestones}/${preview.milestoneCount}`);
70
- }
71
- if (imported.hierarchy.slices !== preview.totalSlices) {
72
- mismatches.push(`slices ${imported.hierarchy.slices}/${preview.totalSlices}`);
73
- }
74
- if (imported.hierarchy.tasks !== preview.totalTasks) {
75
- mismatches.push(`tasks ${imported.hierarchy.tasks}/${preview.totalTasks}`);
76
- }
77
- if (imported.requirements !== preview.requirements.total) {
78
- mismatches.push(`requirements ${imported.requirements}/${preview.requirements.total}`);
79
- }
80
- if (mismatches.length > 0) {
81
- throw new Error(`migration DB import verification failed: ${mismatches.join(", ")}`);
82
- }
83
- }
19
+ import { executeMigrationWrite, type MigrationExecutionResult } from "./execution.js";
20
+ import { createMigrationPlan } from "./plan.js";
21
+ import { buildMigrationPreviewSummary, buildReviewPrompt } from "./presentation.js";
22
+ import type { MigrationPreview } from "./writer.js";
84
23
 
85
- export async function importWrittenMigrationToDb(
86
- basePath: string,
87
- preview?: MigrationPreview,
88
- ): Promise<MigrationImportCounts> {
89
- const opened = await ensureDbOpen(basePath);
90
- if (!opened) {
91
- throw new Error(`failed to open or create the GSD database at ${basePath}`);
92
- }
93
-
94
- const counts = transaction(() => {
95
- clearEngineHierarchy();
96
- clearArtifacts();
97
- clearDecisions();
98
- clearRequirements();
99
- const imported = migrateFromMarkdown(basePath);
100
- if (preview) assertMigrationImportMatchesPreview(imported, preview);
101
- return imported;
102
- });
103
- invalidateStateCache();
104
- return counts;
105
- }
106
-
107
- export async function assertMigrationDbReadiness(
108
- targetRoot: string,
109
- preview: MigrationPreview,
110
- ): Promise<{ phase: string; registry: number }> {
111
- invalidateStateCache();
112
- const state = await deriveState(targetRoot);
113
- const dbUnavailable = state.blockers.some((blocker) => blocker.includes("DB unavailable"));
114
- if (dbUnavailable) {
115
- throw new Error(`migration DB readiness failed: ${state.blockers.join("; ")}`);
116
- }
117
- if (state.registry.length !== preview.milestoneCount) {
118
- throw new Error(`migration DB readiness failed: registry ${state.registry.length}/${preview.milestoneCount}`);
119
- }
120
- return {
121
- phase: state.phase,
122
- registry: state.registry.length,
123
- };
124
- }
125
-
126
- export async function executeMigrationWrite(
127
- sourcePath: string,
128
- targetRoot: string,
129
- project: ReturnType<typeof transformToGSD>,
130
- preview: MigrationPreview,
131
- startedAt: string = new Date().toISOString(),
132
- ): Promise<MigrationExecutionResult> {
133
- const backup = prepareMigrationTarget(targetRoot);
134
-
135
- try {
136
- const written = await writeGSDDirectory(project, targetRoot);
137
- const legacyArchive = await archiveLegacyPlanningDirectory(sourcePath, targetRoot);
138
- const imported = await importWrittenMigrationToDb(targetRoot, preview);
139
- const verification = await verifyMigrationProjection(targetRoot, preview);
140
- verification.dbReadiness = await assertMigrationDbReadiness(targetRoot, preview);
141
- const audit = await writeMigrationAudit({
142
- sourcePath,
143
- targetRoot,
144
- backupPath: backup.backupPath,
145
- preview,
146
- written,
147
- imported,
148
- legacyArchive,
149
- verification,
150
- startedAt,
151
- completedAt: new Date().toISOString(),
152
- });
153
-
154
- return { backup, written, imported, legacyArchive, verification, audit };
155
- } catch (err) {
156
- restoreMigrationTarget(backup);
157
- throw err;
158
- }
159
- }
160
-
161
- /** Format preview stats for embedding in the review prompt. */
162
- function formatPreviewStats(preview: MigrationPreview): string {
163
- const lines = [
164
- `- Decisions: ${preview.decisions.total}`,
165
- `- Milestones: ${preview.milestoneCount}`,
166
- `- Slices: ${preview.totalSlices} (${preview.doneSlices} done — ${preview.sliceCompletionPct}%)`,
167
- `- Tasks: ${preview.totalTasks} (${preview.doneTasks} done — ${preview.taskCompletionPct}%)`,
168
- ];
169
- if (preview.requirements.total > 0) {
170
- lines.push(
171
- `- Requirements: ${preview.requirements.total} (${preview.requirements.validated} validated, ${preview.requirements.active} active, ${preview.requirements.deferred} deferred, ${preview.requirements.outOfScope} out of scope)`,
172
- );
173
- }
174
- if (preview.migrationInputs) {
175
- lines.push(`- Legacy inputs: ${preview.migrationInputs.milestonePhaseDirs} milestone phase dir(s), ${preview.migrationInputs.decisions} decision file(s), ${preview.migrationInputs.seeds} seed file(s)`);
176
- }
177
- return lines.join("\n");
178
- }
179
-
180
- /** Load and interpolate the review-migration prompt template. */
181
- function buildReviewPrompt(
182
- sourcePath: string,
183
- gsdPath: string,
184
- preview: MigrationPreview,
185
- ): string {
186
- const promptsDir = join(dirname(fileURLToPath(import.meta.url)), "..", "prompts");
187
- const templatePath = join(promptsDir, "review-migration.md");
188
- let content = readFileSync(templatePath, "utf-8");
189
-
190
- content = content.replaceAll("{{sourcePath}}", sourcePath);
191
- content = content.replaceAll("{{gsdPath}}", gsdPath);
192
- content = content.replaceAll("{{previewStats}}", formatPreviewStats(preview));
193
-
194
- return content.trim();
195
- }
196
-
197
- /** Dispatch the review prompt to the agent. */
198
24
  function dispatchReview(
199
25
  pi: ExtensionAPI,
200
26
  sourcePath: string,
201
27
  gsdPath: string,
202
28
  preview: MigrationPreview,
203
29
  ): void {
204
- const prompt = buildReviewPrompt(sourcePath, gsdPath, preview);
30
+ const prompt = buildReviewPrompt({ sourcePath, gsdPath, preview });
205
31
 
206
32
  pi.sendMessage(
207
33
  {
@@ -218,34 +44,28 @@ export async function handleMigrate(
218
44
  ctx: ExtensionCommandContext,
219
45
  pi: ExtensionAPI,
220
46
  ): Promise<void> {
221
- // ── Resolve source path ────────────────────────────────────────────────────
222
- const { sourcePath, targetRoot } = resolveMigrationPaths(args);
47
+ const plan = await createMigrationPlan(args);
48
+ const { sourcePath, targetRoot } = plan;
223
49
 
224
- if (!existsSync(sourcePath)) {
50
+ if (plan.status === "missing-source") {
225
51
  ctx.ui.notify(
226
52
  `Directory not found: ${sourcePath}\n\n` +
227
- 'Migration converts a .planning/ directory (from older GSD versions) into .gsd/ format.\n' +
228
- 'If you are starting a new project, use /gsd:new-project instead.\n' +
229
- 'If migrating, ensure the path contains a .planning/ directory.',
53
+ "Migration converts a .planning/ directory (from older GSD versions) into .gsd/ format.\n" +
54
+ "If you are starting a new project, use /gsd:new-project instead.\n" +
55
+ "If migrating, ensure the path contains a .planning/ directory.",
230
56
  "error",
231
57
  );
232
58
  return;
233
59
  }
234
60
 
235
- // ── Validate ───────────────────────────────────────────────────────────────
236
- const validation = await validatePlanningDirectory(sourcePath);
237
-
238
- const warnings = validation.issues.filter((i) => i.severity === "warning");
239
- const fatals = validation.issues.filter((i) => i.severity === "fatal");
240
-
241
- for (const w of warnings) {
242
- ctx.ui.notify(`⚠ ${w.message} (${w.file})`, "warning");
61
+ for (const warning of plan.warnings) {
62
+ ctx.ui.notify(`⚠ ${warning.message} (${warning.file})`, "warning");
243
63
  }
244
- for (const f of fatals) {
245
- ctx.ui.notify(`✖ ${f.message} (${f.file})`, "error");
64
+ for (const fatal of plan.fatals) {
65
+ ctx.ui.notify(`✖ ${fatal.message} (${fatal.file})`, "error");
246
66
  }
247
67
 
248
- if (!validation.valid) {
68
+ if (plan.status === "invalid") {
249
69
  ctx.ui.notify(
250
70
  "Migration blocked — fix the fatal issues above before retrying.",
251
71
  "error",
@@ -253,41 +73,15 @@ export async function handleMigrate(
253
73
  return;
254
74
  }
255
75
 
256
- // ── Parse Transform → Preview ───────────────────────────────────────────
257
- const parsed = await parsePlanningDirectory(sourcePath);
258
- const project = transformToGSD(parsed);
259
- const preview = generatePreview(project);
260
- try {
261
- assertMigrationHasSlices(preview);
262
- await assertMigrationTargetAvailable(targetRoot);
263
- } catch (err) {
264
- ctx.ui.notify((err as Error).message, "error");
76
+ if (plan.status === "blocked") {
77
+ ctx.ui.notify(plan.message, "error");
265
78
  return;
266
79
  }
267
80
 
268
- // ── Build preview text ─────────────────────────────────────────────────────
269
- const lines: string[] = [
270
- `Decisions: ${preview.decisions.total}`,
271
- `Milestones: ${preview.milestoneCount}`,
272
- `Slices: ${preview.totalSlices} (${preview.doneSlices} done — ${preview.sliceCompletionPct}%)`,
273
- `Tasks: ${preview.totalTasks} (${preview.doneTasks} done — ${preview.taskCompletionPct}%)`,
274
- ];
81
+ const { project, preview } = plan;
275
82
 
276
- if (preview.requirements.total > 0) {
277
- lines.push(
278
- `Requirements: ${preview.requirements.total} (${preview.requirements.validated} validated, ${preview.requirements.active} active, ${preview.requirements.deferred} deferred, ${preview.requirements.outOfScope} out of scope)`,
279
- );
280
- }
281
- if (preview.migrationInputs) {
282
- lines.push(`Legacy inputs: ${preview.migrationInputs.milestonePhaseDirs} milestone phase dir(s), ${preview.migrationInputs.decisions} decision file(s), ${preview.migrationInputs.seeds} seed file(s)`);
283
- }
284
-
285
- const targetGsdExists = existsSync(gsdRoot(targetRoot));
286
- if (targetGsdExists) {
287
- lines.push("");
288
- lines.push(`⚠ A .gsd directory already exists at ${gsdRoot(targetRoot)}.`);
289
- lines.push("It will be backed up, deleted, and rewritten fresh before DB import.");
290
- }
83
+ // ── Build preview text ─────────────────────────────────────────────────────
84
+ const lines = buildMigrationPreviewSummary(preview, targetRoot);
291
85
 
292
86
  // ── Confirmation via showNextAction ────────────────────────────────────────
293
87
  if (requiresInteractiveMenu(ctx, false)) {
@@ -0,0 +1,136 @@
1
+ // gsd-pi - /gsd migrate execution service.
2
+ // File Purpose: Write migrated .gsd files, import them into the DB, verify projection/readiness, and rollback on failure.
3
+
4
+ import { ensureDbOpen } from "../bootstrap/dynamic-tools.js";
5
+ import { closeWorkflowDatabase } from "../db-workspace.js";
6
+ import { clearArtifacts, clearDecisions, clearEngineHierarchy, clearRequirements, transaction } from "../gsd-db.js";
7
+ import { migrateFromMarkdown } from "../md-importer.js";
8
+ import { deriveState, invalidateStateCache } from "../state.js";
9
+ import {
10
+ archiveLegacyPlanningDirectory,
11
+ verifyMigrationProjection,
12
+ writeMigrationAudit,
13
+ type LegacyArchiveResult,
14
+ type MigrationAuditResult,
15
+ type MigrationProjectionVerification,
16
+ } from "./audit.js";
17
+ import {
18
+ prepareMigrationTarget,
19
+ restoreMigrationTarget,
20
+ type MigrationBackup,
21
+ } from "./safety.js";
22
+ import { writeGSDDirectory, type MigrationPreview, type WrittenFiles } from "./writer.js";
23
+ import type { GSDProject } from "./types.js";
24
+
25
+ export type MigrationImportCounts = ReturnType<typeof migrateFromMarkdown>;
26
+
27
+ export interface MigrationExecutionResult {
28
+ backup: MigrationBackup;
29
+ written: WrittenFiles;
30
+ imported: MigrationImportCounts;
31
+ legacyArchive: LegacyArchiveResult;
32
+ verification: MigrationProjectionVerification;
33
+ audit: MigrationAuditResult;
34
+ }
35
+
36
+ function assertMigrationImportMatchesPreview(imported: MigrationImportCounts, preview: MigrationPreview): void {
37
+ const mismatches: string[] = [];
38
+ if (imported.decisions !== preview.decisions.total) {
39
+ mismatches.push(`decisions ${imported.decisions}/${preview.decisions.total}`);
40
+ }
41
+ if (imported.hierarchy.milestones !== preview.milestoneCount) {
42
+ mismatches.push(`milestones ${imported.hierarchy.milestones}/${preview.milestoneCount}`);
43
+ }
44
+ if (imported.hierarchy.slices !== preview.totalSlices) {
45
+ mismatches.push(`slices ${imported.hierarchy.slices}/${preview.totalSlices}`);
46
+ }
47
+ if (imported.hierarchy.tasks !== preview.totalTasks) {
48
+ mismatches.push(`tasks ${imported.hierarchy.tasks}/${preview.totalTasks}`);
49
+ }
50
+ if (imported.requirements !== preview.requirements.total) {
51
+ mismatches.push(`requirements ${imported.requirements}/${preview.requirements.total}`);
52
+ }
53
+ if (mismatches.length > 0) {
54
+ throw new Error(`migration DB import verification failed: ${mismatches.join(", ")}`);
55
+ }
56
+ }
57
+
58
+ export async function importWrittenMigrationToDb(
59
+ basePath: string,
60
+ preview?: MigrationPreview,
61
+ ): Promise<MigrationImportCounts> {
62
+ const opened = await ensureDbOpen(basePath);
63
+ if (!opened) {
64
+ throw new Error(`failed to open or create the GSD database at ${basePath}`);
65
+ }
66
+
67
+ const counts = transaction(() => {
68
+ clearEngineHierarchy();
69
+ clearArtifacts();
70
+ clearDecisions();
71
+ clearRequirements();
72
+ const imported = migrateFromMarkdown(basePath);
73
+ if (preview) assertMigrationImportMatchesPreview(imported, preview);
74
+ return imported;
75
+ });
76
+ invalidateStateCache();
77
+ return counts;
78
+ }
79
+
80
+ export async function assertMigrationDbReadiness(
81
+ targetRoot: string,
82
+ preview: MigrationPreview,
83
+ ): Promise<{ phase: string; registry: number }> {
84
+ invalidateStateCache();
85
+ const state = await deriveState(targetRoot);
86
+ const dbUnavailable = state.blockers.some((blocker) => blocker.includes("DB unavailable"));
87
+ if (dbUnavailable) {
88
+ throw new Error(`migration DB readiness failed: ${state.blockers.join("; ")}`);
89
+ }
90
+ if (state.registry.length !== preview.milestoneCount) {
91
+ throw new Error(`migration DB readiness failed: registry ${state.registry.length}/${preview.milestoneCount}`);
92
+ }
93
+ return {
94
+ phase: state.phase,
95
+ registry: state.registry.length,
96
+ };
97
+ }
98
+
99
+ export async function executeMigrationWrite(
100
+ sourcePath: string,
101
+ targetRoot: string,
102
+ project: GSDProject,
103
+ preview: MigrationPreview,
104
+ startedAt: string = new Date().toISOString(),
105
+ ): Promise<MigrationExecutionResult> {
106
+ const backup = prepareMigrationTarget(targetRoot);
107
+
108
+ try {
109
+ const written = await writeGSDDirectory(project, targetRoot);
110
+ const legacyArchive = await archiveLegacyPlanningDirectory(sourcePath, targetRoot);
111
+ const imported = await importWrittenMigrationToDb(targetRoot, preview);
112
+ const verification = await verifyMigrationProjection(targetRoot, preview);
113
+ verification.dbReadiness = await assertMigrationDbReadiness(targetRoot, preview);
114
+ const audit = await writeMigrationAudit({
115
+ sourcePath,
116
+ targetRoot,
117
+ backupPath: backup.backupPath,
118
+ preview,
119
+ written,
120
+ imported,
121
+ legacyArchive,
122
+ verification,
123
+ startedAt,
124
+ completedAt: new Date().toISOString(),
125
+ });
126
+
127
+ return { backup, written, imported, legacyArchive, verification, audit };
128
+ } catch (error) {
129
+ // The import transaction may have committed and the process may hold an
130
+ // open handle to the target gsd.db; close before the restore replaces the
131
+ // file on disk, and leave closed so the next open rebinds to the restored file.
132
+ try { closeWorkflowDatabase(); } catch { /* best-effort: restore must proceed */ }
133
+ restoreMigrationTarget(backup);
134
+ throw error;
135
+ }
136
+ }
@@ -0,0 +1,101 @@
1
+ // gsd-pi - /gsd migrate planning service.
2
+ // File Purpose: Resolve, validate, parse, transform, preview, and guard a migration before UI confirmation.
3
+
4
+ import { existsSync } from "node:fs";
5
+
6
+ import {
7
+ assertMigrationHasSlices,
8
+ assertMigrationTargetAvailable,
9
+ resolveMigrationPaths,
10
+ type MigrationPaths,
11
+ } from "./safety.js";
12
+ import { parsePlanningDirectory } from "./parser.js";
13
+ import { generatePreview } from "./preview.js";
14
+ import { transformToGSD } from "./transformer.js";
15
+ import { validatePlanningDirectory } from "./validator.js";
16
+ import type { GSDProject, ValidationIssue, ValidationResult } from "./types.js";
17
+ import type { MigrationPreview } from "./writer.js";
18
+
19
+ export interface SplitValidationIssues {
20
+ warnings: ValidationIssue[];
21
+ fatals: ValidationIssue[];
22
+ }
23
+
24
+ interface MigrationPlanBase extends MigrationPaths {
25
+ warnings: ValidationIssue[];
26
+ fatals: ValidationIssue[];
27
+ }
28
+
29
+ export interface MissingMigrationSourceResult extends MigrationPaths {
30
+ status: "missing-source";
31
+ }
32
+
33
+ export interface InvalidMigrationPlanResult extends MigrationPlanBase {
34
+ status: "invalid";
35
+ validation: ValidationResult;
36
+ }
37
+
38
+ export interface BlockedMigrationPlanResult extends MigrationPlanBase {
39
+ status: "blocked";
40
+ validation: ValidationResult;
41
+ message: string;
42
+ }
43
+
44
+ export interface ReadyMigrationPlanResult extends MigrationPlanBase {
45
+ status: "ready";
46
+ validation: ValidationResult;
47
+ project: GSDProject;
48
+ preview: MigrationPreview;
49
+ }
50
+
51
+ export type MigrationPlanResult =
52
+ | MissingMigrationSourceResult
53
+ | InvalidMigrationPlanResult
54
+ | BlockedMigrationPlanResult
55
+ | ReadyMigrationPlanResult;
56
+
57
+ export function splitValidationIssues(validation: ValidationResult): SplitValidationIssues {
58
+ return {
59
+ warnings: validation.issues.filter((issue) => issue.severity === "warning"),
60
+ fatals: validation.issues.filter((issue) => issue.severity === "fatal"),
61
+ };
62
+ }
63
+
64
+ export async function createMigrationPlan(args: string, cwd: string = process.cwd()): Promise<MigrationPlanResult> {
65
+ const paths = resolveMigrationPaths(args, cwd);
66
+ if (!existsSync(paths.sourcePath)) {
67
+ return { status: "missing-source", ...paths };
68
+ }
69
+
70
+ const validation = await validatePlanningDirectory(paths.sourcePath);
71
+ const issues = splitValidationIssues(validation);
72
+ if (!validation.valid) {
73
+ return { status: "invalid", ...paths, validation, ...issues };
74
+ }
75
+
76
+ const parsed = await parsePlanningDirectory(paths.sourcePath);
77
+ const project = transformToGSD(parsed);
78
+ const preview = generatePreview(project);
79
+
80
+ try {
81
+ assertMigrationHasSlices(preview);
82
+ await assertMigrationTargetAvailable(paths.targetRoot);
83
+ } catch (error) {
84
+ return {
85
+ status: "blocked",
86
+ ...paths,
87
+ validation,
88
+ ...issues,
89
+ message: error instanceof Error ? error.message : String(error),
90
+ };
91
+ }
92
+
93
+ return {
94
+ status: "ready",
95
+ ...paths,
96
+ validation,
97
+ ...issues,
98
+ project,
99
+ preview,
100
+ };
101
+ }
@@ -186,17 +186,14 @@ export async function writePlanningDirectory(
186
186
  });
187
187
 
188
188
  if (tasks.length === 0) {
189
- // Empty phase write a single placeholder plan so the dir isn't empty.
190
- const planPath = join(phaseDir, `${pad(phaseNum)}-01-PLAN.md`);
191
- await saveFile(
192
- planPath,
193
- formatPlanningPlan(phaseNum, 1, slice.title || slice.id, []),
194
- );
195
- paths.push(planPath);
196
- projectionWrites.push({
197
- relPath: toPlanningRel(planPath),
198
- entities: [`${milestone.id}/${slice.id}`],
199
- });
189
+ // Sketch / undecomposed slice zero tasks. Do NOT emit an ingestible
190
+ // *-PLAN.md here: the reverse transform maps one GSDTask per plan file
191
+ // (transformer.ts mapSlice), so a placeholder would materialize a
192
+ // phantom "Plan NN" task and flip the slice from "needs planning" to
193
+ // "has a planned task", causing auto-mode to skip planning (issue #1285).
194
+ // The phase dir is already created (mkdirSync above) and the slice is
195
+ // listed in ROADMAP.md, so it round-trips with tasks = [] — the correct
196
+ // sketch-slice shape.
200
197
  } else {
201
198
  for (let ti = 0; ti < tasks.length; ti++) {
202
199
  const task = tasks[ti]!;
@@ -223,19 +220,14 @@ export async function writePlanningDirectory(
223
220
  }
224
221
  }
225
222
 
226
- // If no slices produced any phases, write a single empty phase so ROADMAP.md
227
- // isn't blank and the layout is still discoverable.
223
+ // If no slices produced any phases, emit a single empty phase dir + ROADMAP
224
+ // entry so the layout stays discoverable. Do NOT write a placeholder
225
+ // *-PLAN.md — an ingestible plan file would round-trip into a phantom task
226
+ // (see the tasks.length === 0 branch above, issue #1285).
228
227
  if (roadmapEntries.length === 0) {
229
228
  const phaseDirName = `${pad(1)}-milestone`;
230
229
  const phaseDir = join(root, "phases", phaseDirName);
231
230
  mkdirSync(phaseDir, { recursive: true });
232
- const planPath = join(phaseDir, `${pad(1)}-01-PLAN.md`);
233
- await saveFile(planPath, formatPlanningPlan(1, 1, milestones[0]!.title || milestones[0]!.id, []));
234
- paths.push(planPath);
235
- projectionWrites.push({
236
- relPath: toPlanningRel(planPath),
237
- entities: [milestones[0]!.id],
238
- });
239
231
  roadmapEntries.push({ number: 1, title: milestones[0]!.title || milestones[0]!.id, done: false });
240
232
  }
241
233
 
@@ -0,0 +1,83 @@
1
+ // gsd-pi - /gsd migrate presentation helpers.
2
+ // File Purpose: Pure formatting for migration previews and post-write review prompts.
3
+
4
+ import { existsSync, readFileSync } from "node:fs";
5
+ import { dirname, join } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+
8
+ import { gsdRoot } from "../paths.js";
9
+ import type { MigrationPreview } from "./writer.js";
10
+
11
+ export interface ReviewPromptInput {
12
+ sourcePath: string;
13
+ gsdPath: string;
14
+ preview: MigrationPreview;
15
+ templatePath?: string;
16
+ }
17
+
18
+ function formatRequirements(preview: MigrationPreview): string | null {
19
+ if (preview.requirements.total === 0) return null;
20
+ return `Requirements: ${preview.requirements.total} (${preview.requirements.validated} validated, ${preview.requirements.active} active, ${preview.requirements.deferred} deferred, ${preview.requirements.outOfScope} out of scope)`;
21
+ }
22
+
23
+ function formatLegacyInputs(preview: MigrationPreview): string | null {
24
+ if (!preview.migrationInputs) return null;
25
+ return `Legacy inputs: ${preview.migrationInputs.milestonePhaseDirs} milestone phase dir(s), ${preview.migrationInputs.decisions} decision file(s), ${preview.migrationInputs.seeds} seed file(s)`;
26
+ }
27
+
28
+ export function buildMigrationPreviewSummary(preview: MigrationPreview, targetRoot: string): string[] {
29
+ const lines: string[] = [
30
+ `Decisions: ${preview.decisions.total}`,
31
+ `Milestones: ${preview.milestoneCount}`,
32
+ `Slices: ${preview.totalSlices} (${preview.doneSlices} done — ${preview.sliceCompletionPct}%)`,
33
+ `Tasks: ${preview.totalTasks} (${preview.doneTasks} done — ${preview.taskCompletionPct}%)`,
34
+ ];
35
+
36
+ const requirements = formatRequirements(preview);
37
+ if (requirements) lines.push(requirements);
38
+
39
+ const legacyInputs = formatLegacyInputs(preview);
40
+ if (legacyInputs) lines.push(legacyInputs);
41
+
42
+ const targetGsdPath = gsdRoot(targetRoot);
43
+ if (existsSync(targetGsdPath)) {
44
+ lines.push("");
45
+ lines.push(`⚠ A .gsd directory already exists at ${targetGsdPath}.`);
46
+ lines.push("It will be backed up, deleted, and rewritten fresh before DB import.");
47
+ }
48
+
49
+ return lines;
50
+ }
51
+
52
+ export function formatMigrationPreviewStats(preview: MigrationPreview): string {
53
+ const lines = [
54
+ `- Decisions: ${preview.decisions.total}`,
55
+ `- Milestones: ${preview.milestoneCount}`,
56
+ `- Slices: ${preview.totalSlices} (${preview.doneSlices} done — ${preview.sliceCompletionPct}%)`,
57
+ `- Tasks: ${preview.totalTasks} (${preview.doneTasks} done — ${preview.taskCompletionPct}%)`,
58
+ ];
59
+
60
+ const requirements = formatRequirements(preview);
61
+ if (requirements) lines.push(`- ${requirements}`);
62
+
63
+ const legacyInputs = formatLegacyInputs(preview);
64
+ if (legacyInputs) lines.push(`- ${legacyInputs}`);
65
+
66
+ return lines.join("\n");
67
+ }
68
+
69
+ function defaultReviewTemplatePath(): string {
70
+ const promptsDir = join(dirname(fileURLToPath(import.meta.url)), "..", "prompts");
71
+ return join(promptsDir, "review-migration.md");
72
+ }
73
+
74
+ export function buildReviewPrompt(input: ReviewPromptInput): string {
75
+ const templatePath = input.templatePath ?? defaultReviewTemplatePath();
76
+ let content = readFileSync(templatePath, "utf-8");
77
+
78
+ content = content.replaceAll("{{sourcePath}}", input.sourcePath);
79
+ content = content.replaceAll("{{gsdPath}}", input.gsdPath);
80
+ content = content.replaceAll("{{previewStats}}", formatMigrationPreviewStats(input.preview));
81
+
82
+ return content.trim();
83
+ }
@@ -62,6 +62,8 @@ export const BUNDLED_COST_TABLE: ModelCostEntry[] = [
62
62
  // GPT-5.5 API list price, also used for live Codex OAuth routing.
63
63
  // Source: https://openai.com/api/pricing/
64
64
  { id: "gpt-5.5", inputPer1k: 0.005, outputPer1k: 0.03, updatedAt: "2026-04-23" },
65
+ // Mirrors gpt-5.5 list pricing until OpenAI publishes official gpt-5.6 pricing.
66
+ { id: "gpt-5.6", inputPer1k: 0.005, outputPer1k: 0.03, updatedAt: "2026-07-08" },
65
67
 
66
68
  // Google
67
69
  { id: "gemini-2.0-flash", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2025-03-15" },