@opengsd/gsd-pi 1.8.1 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) 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 +16 -47
  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/auto-artifact-paths.js +2 -2
  17. package/dist/resources/extensions/gsd/auto-dispatch.js +74 -19
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
  19. package/dist/resources/extensions/gsd/auto-prompts.js +35 -1
  20. package/dist/resources/extensions/gsd/auto.js +5 -1
  21. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +78 -4
  22. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +84 -26
  23. package/dist/resources/extensions/gsd/command-feedback.js +16 -12
  24. package/dist/resources/extensions/gsd/compat/compat-marker.js +19 -2
  25. package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
  26. package/dist/resources/extensions/gsd/db/engine.js +51 -16
  27. package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
  28. package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
  29. package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
  30. package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
  31. package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
  32. package/dist/resources/extensions/gsd/docs/preferences-reference.md +4 -4
  33. package/dist/resources/extensions/gsd/flat-phase-migration.js +156 -21
  34. package/dist/resources/extensions/gsd/gsd-db.js +187 -45
  35. package/dist/resources/extensions/gsd/guided-flow.js +29 -10
  36. package/dist/resources/extensions/gsd/markdown-renderer.js +16 -2
  37. package/dist/resources/extensions/gsd/md-importer.js +102 -14
  38. package/dist/resources/extensions/gsd/migrate/command.js +19 -162
  39. package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
  40. package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
  41. package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
  42. package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
  43. package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
  44. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
  45. package/dist/resources/extensions/gsd/paths.js +4 -1
  46. package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
  47. package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
  48. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  49. package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
  50. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
  51. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +27 -13
  52. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +13 -3
  53. package/dist/resources/extensions/gsd/stop-notice.js +15 -1
  54. package/dist/resources/extensions/gsd/sync-lock.js +13 -7
  55. package/dist/resources/extensions/gsd/tools/complete-task.js +82 -1
  56. package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
  57. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
  58. package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
  59. package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
  60. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
  61. package/dist/resources/extensions/gsd/unit-registry.js +4 -0
  62. package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
  63. package/dist/resources/extensions/gsd/worktree-state-projection.js +6 -0
  64. package/dist/resources/extensions/mac-tools/index.js +31 -9
  65. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  66. package/dist/web/standalone/.next/BUILD_ID +1 -1
  67. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  68. package/dist/web/standalone/.next/build-manifest.json +2 -2
  69. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  81. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  82. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  84. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  87. package/dist/web/standalone/.next/server/app/index.html +1 -1
  88. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  89. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  91. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  93. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  94. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  96. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  97. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  99. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  100. package/dist/web/standalone/.next/static/css/3b1ceb7abfb9a230.css +1 -0
  101. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  102. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  103. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  104. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  105. package/dist/web/standalone/package.json +0 -1
  106. package/dist/web-mode.js +31 -3
  107. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  108. package/integrations/hermes/pyproject.toml +1 -1
  109. package/package.json +12 -10
  110. package/packages/cloud-mcp-gateway/package.json +2 -2
  111. package/packages/contracts/dist/workflow.d.ts +14 -0
  112. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  113. package/packages/contracts/dist/workflow.js +16 -0
  114. package/packages/contracts/dist/workflow.js.map +1 -1
  115. package/packages/contracts/package.json +1 -1
  116. package/packages/daemon/dist/cloud-config.d.ts +1 -1
  117. package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
  118. package/packages/daemon/dist/cloud-config.js +5 -1
  119. package/packages/daemon/dist/cloud-config.js.map +1 -1
  120. package/packages/daemon/dist/cloud-config.test.js +51 -1
  121. package/packages/daemon/dist/cloud-config.test.js.map +1 -1
  122. package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
  123. package/packages/daemon/dist/local-tool-executor.js +2 -0
  124. package/packages/daemon/dist/local-tool-executor.js.map +1 -1
  125. package/packages/daemon/package.json +6 -6
  126. package/packages/gsd-agent-core/package.json +5 -5
  127. package/packages/gsd-agent-modes/package.json +7 -7
  128. package/packages/gsd-cloud/dist/cli.d.ts +5 -0
  129. package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
  130. package/packages/gsd-cloud/dist/cli.js +160 -0
  131. package/packages/gsd-cloud/dist/cli.js.map +1 -0
  132. package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
  133. package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
  134. package/packages/gsd-cloud/dist/cloud-config.js +231 -0
  135. package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
  136. package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
  137. package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
  138. package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
  139. package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
  140. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
  141. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
  142. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
  143. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
  144. package/packages/gsd-cloud/dist/cloud-runtime.d.ts +35 -0
  145. package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
  146. package/packages/gsd-cloud/dist/cloud-runtime.js +258 -0
  147. package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
  148. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
  149. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
  150. package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
  151. package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
  152. package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
  153. package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
  154. package/packages/gsd-cloud/dist/cloud-token.js +37 -0
  155. package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
  156. package/packages/gsd-cloud/dist/config.d.ts +17 -0
  157. package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
  158. package/packages/gsd-cloud/dist/config.js +146 -0
  159. package/packages/gsd-cloud/dist/config.js.map +1 -0
  160. package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
  161. package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
  162. package/packages/gsd-cloud/dist/device-flow.js +128 -0
  163. package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
  164. package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
  165. package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
  166. package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
  167. package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
  168. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
  169. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
  170. package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
  171. package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
  172. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
  173. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
  174. package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
  175. package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
  176. package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
  177. package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
  178. package/packages/gsd-cloud/dist/executors/executor.js +11 -0
  179. package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
  180. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
  181. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
  182. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
  183. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
  184. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
  185. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
  186. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
  187. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
  188. package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
  189. package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
  190. package/packages/gsd-cloud/dist/executors/index.js +29 -0
  191. package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
  192. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
  193. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
  194. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
  195. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
  196. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
  197. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
  198. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
  199. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
  200. package/packages/gsd-cloud/dist/index.d.ts +7 -0
  201. package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
  202. package/packages/gsd-cloud/dist/index.js +8 -0
  203. package/packages/gsd-cloud/dist/index.js.map +1 -0
  204. package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
  205. package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
  206. package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
  207. package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
  208. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
  209. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
  210. package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
  211. package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
  212. package/packages/gsd-cloud/dist/logger.d.ts +25 -0
  213. package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
  214. package/packages/gsd-cloud/dist/logger.js +72 -0
  215. package/packages/gsd-cloud/dist/logger.js.map +1 -0
  216. package/packages/gsd-cloud/dist/types.d.ts +51 -0
  217. package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
  218. package/packages/gsd-cloud/dist/types.js +9 -0
  219. package/packages/gsd-cloud/dist/types.js.map +1 -0
  220. package/packages/gsd-cloud/package.json +3 -3
  221. package/packages/mcp-server/README.md +8 -0
  222. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  223. package/packages/mcp-server/dist/workflow-tools.js +64 -2
  224. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  225. package/packages/mcp-server/package.json +4 -4
  226. package/packages/native/package.json +1 -1
  227. package/packages/pi-agent-core/package.json +1 -1
  228. package/packages/pi-ai/dist/models.generated.d.ts +60 -0
  229. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  230. package/packages/pi-ai/dist/models.generated.js +54 -0
  231. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  232. package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
  233. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  234. package/packages/pi-ai/dist/providers/anthropic.js +19 -0
  235. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  236. package/packages/pi-ai/package.json +1 -1
  237. package/packages/pi-coding-agent/package.json +7 -7
  238. package/packages/pi-tui/package.json +2 -2
  239. package/packages/rpc-client/package.json +2 -2
  240. package/pkg/package.json +1 -1
  241. package/src/resources/GSD-WORKFLOW.md +16 -47
  242. package/src/resources/extensions/browser-tools/capture.ts +2 -86
  243. package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
  244. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
  245. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
  246. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
  247. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  248. package/src/resources/extensions/gsd/auto-dispatch.ts +86 -19
  249. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
  250. package/src/resources/extensions/gsd/auto-prompts.ts +38 -1
  251. package/src/resources/extensions/gsd/auto.ts +5 -1
  252. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +91 -4
  253. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +80 -24
  254. package/src/resources/extensions/gsd/command-feedback.ts +19 -12
  255. package/src/resources/extensions/gsd/compat/compat-marker.ts +21 -4
  256. package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
  257. package/src/resources/extensions/gsd/db/engine.ts +53 -17
  258. package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
  259. package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
  260. package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
  261. package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
  262. package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
  263. package/src/resources/extensions/gsd/docs/preferences-reference.md +4 -4
  264. package/src/resources/extensions/gsd/flat-phase-migration.ts +160 -19
  265. package/src/resources/extensions/gsd/gsd-db.ts +255 -52
  266. package/src/resources/extensions/gsd/guided-flow.ts +39 -10
  267. package/src/resources/extensions/gsd/markdown-renderer.ts +23 -7
  268. package/src/resources/extensions/gsd/md-importer.ts +109 -11
  269. package/src/resources/extensions/gsd/migrate/command.ts +21 -227
  270. package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
  271. package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
  272. package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
  273. package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
  274. package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
  275. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
  276. package/src/resources/extensions/gsd/paths.ts +4 -1
  277. package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
  278. package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
  279. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  280. package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
  281. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
  282. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +30 -13
  283. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +16 -3
  284. package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
  285. package/src/resources/extensions/gsd/stop-notice.ts +18 -1
  286. package/src/resources/extensions/gsd/sync-lock.ts +14 -6
  287. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
  288. package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
  289. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +104 -0
  290. package/src/resources/extensions/gsd/tests/complete-task.test.ts +286 -0
  291. package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
  292. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
  293. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
  294. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
  295. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
  296. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
  297. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
  298. package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
  299. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +202 -0
  300. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
  301. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +25 -0
  302. package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
  303. package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
  304. package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
  305. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
  306. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
  307. package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
  308. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
  309. package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
  310. package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
  311. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
  312. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
  313. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
  314. package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
  315. package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
  316. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
  317. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +17 -0
  318. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
  319. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +34 -0
  320. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
  321. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
  322. package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
  323. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
  324. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
  325. package/src/resources/extensions/gsd/tools/complete-task.ts +120 -0
  326. package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
  327. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
  328. package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
  329. package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
  330. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
  331. package/src/resources/extensions/gsd/types.ts +11 -0
  332. package/src/resources/extensions/gsd/unit-registry.ts +4 -0
  333. package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
  334. package/src/resources/extensions/gsd/worktree-state-projection.ts +12 -0
  335. package/src/resources/extensions/mac-tools/index.ts +52 -9
  336. package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
  337. package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
  338. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → BE5XoklToI6lZjRzpXih8}/_buildManifest.js +0 -0
  339. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → BE5XoklToI6lZjRzpXih8}/_ssgManifest.js +0 -0
@@ -37,6 +37,10 @@ import type { PlanSliceParams } from "./plan-slice.js";
37
37
  import { handlePlanSlice } from "./plan-slice.js";
38
38
  import type { ReplanSliceParams } from "./replan-slice.js";
39
39
  import { handleReplanSlice } from "./replan-slice.js";
40
+ import type { ReplanTaskParams } from "./replan-task.js";
41
+ import { handleReplanTask } from "./replan-task.js";
42
+ import type { ReworkBriefSaveParams } from "./rework-brief.js";
43
+ import { handleReworkBriefSave } from "./rework-brief.js";
40
44
  import type { ReopenMilestoneParams } from "./reopen-milestone.js";
41
45
  import { handleReopenMilestone } from "./reopen-milestone.js";
42
46
  import type { ReopenSliceParams } from "./reopen-slice.js";
@@ -696,6 +700,8 @@ export type SliceCompleteExecutorParams = CompleteSliceParams;
696
700
  export type PlanMilestoneExecutorParams = PlanMilestoneParams;
697
701
  export type PlanSliceExecutorParams = PlanSliceParams;
698
702
  export type ReplanSliceExecutorParams = ReplanSliceParams;
703
+ export type ReplanTaskExecutorParams = ReplanTaskParams;
704
+ export type ReworkBriefSaveExecutorParams = ReworkBriefSaveParams;
699
705
  export type ReopenTaskExecutorParams = ReopenTaskParams;
700
706
  export type ReopenSliceExecutorParams = ReopenSliceParams;
701
707
  export type ReopenMilestoneExecutorParams = ReopenMilestoneParams;
@@ -1490,6 +1496,92 @@ export async function executePlanSlice(
1490
1496
  }
1491
1497
  }
1492
1498
 
1499
+
1500
+ export async function executeReplanTask(
1501
+ params: ReplanTaskExecutorParams,
1502
+ basePath: string = process.cwd(),
1503
+ ): Promise<ToolExecutionResult> {
1504
+ const dbAvailable = await ensureDbOpen(basePath);
1505
+ if (!dbAvailable) {
1506
+ return {
1507
+ content: [{ type: "text", text: "Error: GSD database is not available. Cannot replan task." }],
1508
+ details: { operation: "replan_task", error: "db_unavailable" },
1509
+ isError: true,
1510
+ };
1511
+ }
1512
+ try {
1513
+ const result = await handleReplanTask(params, basePath);
1514
+ if ("error" in result) {
1515
+ return {
1516
+ content: [{ type: "text", text: `Error replanning task: ${result.error}` }],
1517
+ details: { operation: "replan_task", error: result.error },
1518
+ isError: true,
1519
+ };
1520
+ }
1521
+ return {
1522
+ content: [{ type: "text", text: `Replanned task ${result.taskId} (${result.sliceId}/${result.milestoneId})` }],
1523
+ details: {
1524
+ operation: "replan_task",
1525
+ milestoneId: result.milestoneId,
1526
+ sliceId: result.sliceId,
1527
+ taskId: result.taskId,
1528
+ taskPlanPath: result.taskPlanPath,
1529
+ },
1530
+ };
1531
+ } catch (err) {
1532
+ const msg = err instanceof Error ? err.message : String(err);
1533
+ logError("tool", `replan_task tool failed: ${msg}`, { tool: "gsd_replan_task", error: String(err) });
1534
+ return {
1535
+ content: [{ type: "text", text: `Error replanning task: ${msg}` }],
1536
+ details: { operation: "replan_task", error: msg },
1537
+ isError: true,
1538
+ };
1539
+ }
1540
+ }
1541
+
1542
+ export async function executeReworkBriefSave(
1543
+ params: ReworkBriefSaveExecutorParams,
1544
+ basePath: string = process.cwd(),
1545
+ ): Promise<ToolExecutionResult> {
1546
+ const dbAvailable = await ensureDbOpen(basePath);
1547
+ if (!dbAvailable) {
1548
+ return {
1549
+ content: [{ type: "text", text: "Error: GSD database is not available. Cannot save rework brief." }],
1550
+ details: { operation: "rework_brief_save", error: "db_unavailable" },
1551
+ isError: true,
1552
+ };
1553
+ }
1554
+ try {
1555
+ const result = await handleReworkBriefSave(params);
1556
+ if ("error" in result) {
1557
+ return {
1558
+ content: [{ type: "text", text: `Error saving rework brief: ${result.error}` }],
1559
+ details: { operation: "rework_brief_save", error: result.error },
1560
+ isError: true,
1561
+ };
1562
+ }
1563
+ return {
1564
+ content: [{ type: "text", text: `Saved rework brief ${result.briefId} with ${result.findingCount} finding(s)` }],
1565
+ details: {
1566
+ operation: "rework_brief_save",
1567
+ briefId: result.briefId,
1568
+ milestoneId: result.milestoneId,
1569
+ sliceId: result.sliceId,
1570
+ taskId: result.taskId,
1571
+ findingCount: result.findingCount,
1572
+ },
1573
+ };
1574
+ } catch (err) {
1575
+ const msg = err instanceof Error ? err.message : String(err);
1576
+ logError("tool", `rework_brief_save tool failed: ${msg}`, { tool: "gsd_rework_brief_save", error: String(err) });
1577
+ return {
1578
+ content: [{ type: "text", text: `Error saving rework brief: ${msg}` }],
1579
+ details: { operation: "rework_brief_save", error: msg },
1580
+ isError: true,
1581
+ };
1582
+ }
1583
+ }
1584
+
1493
1585
  export async function executeReplanSlice(
1494
1586
  params: ReplanSliceExecutorParams,
1495
1587
  basePath: string = process.cwd(),
@@ -695,6 +695,17 @@ export interface CompleteTaskParams {
695
695
  verdict: string;
696
696
  durationMs: number;
697
697
  }>;
698
+ /**
699
+ * Resolution evidence for structured rework findings linked to this task.
700
+ * All blocking findings must be resolved before completion is accepted.
701
+ * @optional
702
+ */
703
+ reworkResolution?: Array<{
704
+ findingId: string;
705
+ status: "resolved" | "deferred-with-override";
706
+ evidence: string;
707
+ decisionRef?: string;
708
+ }>;
698
709
  /**
699
710
  * Q5 failure-modes section content (what breaks when dependencies fail).
700
711
  * Populated → `pass`; omitted/empty → `omitted`.
@@ -290,6 +290,8 @@ export const UNIT_REGISTRY = {
290
290
  "gsd_slice_complete",
291
291
  "gsd_task_reopen",
292
292
  "gsd_replan_slice",
293
+ "gsd_replan_task",
294
+ "gsd_rework_brief_save",
293
295
  "gsd_decision_save",
294
296
  "gsd_capture_thought",
295
297
  "gsd_requirement_update",
@@ -303,6 +305,8 @@ export const UNIT_REGISTRY = {
303
305
  "gsd_slice_complete",
304
306
  "gsd_task_reopen",
305
307
  "gsd_replan_slice",
308
+ "gsd_replan_task",
309
+ "gsd_rework_brief_save",
306
310
  "gsd_requirement_update",
307
311
  "gsd_summary_save",
308
312
  ],
@@ -6,7 +6,7 @@ import { join } from "node:path";
6
6
 
7
7
  import type { GSDState, Phase } from "../types.js";
8
8
  import { gsdRoot, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
9
- import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "../gsd-db.js";
9
+ import { isDbAvailable, getMilestoneSlices, getTasksBySliceIds } from "../gsd-db.js";
10
10
  import type { SliceRow } from "../db-task-slice-rows.js";
11
11
  import type { UokGraphNode } from "./contracts.js";
12
12
 
@@ -39,6 +39,19 @@ function graphOutputPath(basePath: string): string {
39
39
  return join(gsdRoot(basePath), "runtime", "uok-plan-v2-graph.json");
40
40
  }
41
41
 
42
+ // True when the on-disk graph matches `output` ignoring the volatile `compiledAt`
43
+ // stamp, so redundant recompiles on the dispatch hot path skip the disk write.
44
+ function graphBodyUnchanged(outPath: string, output: Record<string, unknown>): boolean {
45
+ try {
46
+ const existing = JSON.parse(readFileSync(outPath, "utf-8")) as Record<string, unknown>;
47
+ const { compiledAt: _existingStamp, ...existingBody } = existing;
48
+ const { compiledAt: _outputStamp, ...outputBody } = output;
49
+ return JSON.stringify(existingBody) === JSON.stringify(outputBody);
50
+ } catch {
51
+ return false; // Missing, unreadable, or corrupt — write.
52
+ }
53
+ }
54
+
42
55
  function hasFileContent(path: string | null): boolean {
43
56
  if (!path || !existsSync(path)) return false;
44
57
  try {
@@ -120,9 +133,11 @@ export function compileUnitGraphFromState(basePath: string, state: GSDState): Pl
120
133
  };
121
134
  }
122
135
 
136
+ const tasksBySlice = getTasksBySliceIds(slices.map((slice) => ({ milestoneId: mid, sliceId: slice.id })));
137
+
123
138
  for (const slice of slices) {
124
139
  const sid = slice.id;
125
- const tasks = getSliceTasks(mid, sid)
140
+ const tasks = (tasksBySlice.get(`${mid}\0${sid}`) ?? [])
126
141
  .sort((a, b) => Number(a.sequence ?? 0) - Number(b.sequence ?? 0));
127
142
 
128
143
  let previousTaskNodeId: string | null = null;
@@ -174,7 +189,9 @@ export function compileUnitGraphFromState(basePath: string, state: GSDState): Pl
174
189
 
175
190
  const outPath = graphOutputPath(basePath);
176
191
  mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
177
- writeFileSync(outPath, JSON.stringify(output, null, 2) + "\n", "utf-8");
192
+ if (!graphBodyUnchanged(outPath, output)) {
193
+ writeFileSync(outPath, JSON.stringify(output, null, 2) + "\n", "utf-8");
194
+ }
178
195
 
179
196
  return {
180
197
  ok: true,
@@ -179,6 +179,14 @@ function syncOtherMilestoneArtifacts(
179
179
  }
180
180
  }
181
181
 
182
+ function syncFlatPhaseArtifacts(prGsd: string, wtGsd: string): void {
183
+ safeCopyRecursive(
184
+ join(prGsd, "phases"),
185
+ join(wtGsd, "phases"),
186
+ { force: false },
187
+ );
188
+ }
189
+
182
190
  /**
183
191
  * Root-level .gsd/ files copied from worktree back to project root for
184
192
  * post-merge diagnostics. Markdown projections are NOT in this list — DB
@@ -254,6 +262,10 @@ export function _projectRootToWorktreeImpl(
254
262
  // worktree-bound unit; the project root remains authoritative.
255
263
  syncRootProjectionFilesToWorktree(prGsd, wtGsd);
256
264
 
265
+ // Flat-phase artifacts (phases/NN-slug/NN-CONTEXT.md, NN-DISCUSSION.md,
266
+ // ROADMAP, etc.) must be available before the first worktree dispatch.
267
+ syncFlatPhaseArtifacts(prGsd, wtGsd);
268
+
257
269
  // Copy milestone directory from project root to worktree — additive only.
258
270
  // force:false prevents cpSync from overwriting existing worktree files.
259
271
  // Without this, worktree-local files (e.g. VALIDATION.md written
@@ -17,6 +17,10 @@ import { StringEnum, Type } from "@gsd/pi-ai";
17
17
  import { execFileSync } from "node:child_process";
18
18
  import { statSync, readdirSync } from "node:fs";
19
19
  import path from "node:path";
20
+ import {
21
+ constrainScreenshot,
22
+ getScreenshotBufferDimensions,
23
+ } from "../browser-tools/screenshot-constraints.js";
20
24
 
21
25
  // ---------------------------------------------------------------------------
22
26
  // Paths
@@ -96,6 +100,45 @@ interface MacAgentResponse {
96
100
  error?: string;
97
101
  }
98
102
 
103
+ interface MacScreenshotPayload {
104
+ imageData: string;
105
+ width: number;
106
+ height: number;
107
+ format: string;
108
+ mimeType: string;
109
+ }
110
+
111
+ function macScreenshotQualityToPercent(quality: number | undefined): number {
112
+ if (quality === undefined || !Number.isFinite(quality)) return 80;
113
+ return Math.min(100, Math.max(1, Math.round(quality * 100)));
114
+ }
115
+
116
+ export async function prepareMacScreenshotPayload(
117
+ data: Record<string, any>,
118
+ quality: number | undefined,
119
+ ): Promise<MacScreenshotPayload> {
120
+ const format = data.format as string;
121
+ const mimeType = format === "png" ? "image/png" : "image/jpeg";
122
+ const rawBuffer = Buffer.from(data.imageData as string, "base64");
123
+ const constrainedBuffer = await constrainScreenshot(
124
+ null as any,
125
+ rawBuffer,
126
+ mimeType,
127
+ macScreenshotQualityToPercent(quality),
128
+ );
129
+ const dimensions = constrainedBuffer === rawBuffer
130
+ ? null
131
+ : await getScreenshotBufferDimensions(constrainedBuffer);
132
+
133
+ return {
134
+ imageData: constrainedBuffer.toString("base64"),
135
+ width: dimensions?.width ?? (data.width as number),
136
+ height: dimensions?.height ?? (data.height as number),
137
+ format,
138
+ mimeType,
139
+ };
140
+ }
141
+
99
142
  /**
100
143
  * Invoke the mac-agent CLI with a command and optional params.
101
144
  * Handles compilation caching, stdin/stdout JSON protocol, and error surfacing.
@@ -718,19 +761,19 @@ export default function (pi: ExtensionAPI) {
718
761
  throw new Error("mac_screenshot: " + result.error);
719
762
  }
720
763
 
721
- const data = result.data!;
722
- const imageData = data.imageData as string;
723
- const format = data.format as string;
724
- const width = data.width as number;
725
- const height = data.height as number;
726
- const mimeType = format === "png" ? "image/png" : "image/jpeg";
764
+ const screenshot = await prepareMacScreenshotPayload(result.data!, args.quality);
727
765
 
728
766
  return {
729
767
  content: [
730
- { type: "text" as const, text: `Screenshot: ${width}x${height} ${format}` },
731
- { type: "image" as const, data: imageData, mimeType },
768
+ { type: "text" as const, text: `Screenshot: ${screenshot.width}x${screenshot.height} ${screenshot.format}` },
769
+ { type: "image" as const, data: screenshot.imageData, mimeType: screenshot.mimeType },
732
770
  ],
733
- details: { width, height, format, mimeType },
771
+ details: {
772
+ width: screenshot.width,
773
+ height: screenshot.height,
774
+ format: screenshot.format,
775
+ mimeType: screenshot.mimeType,
776
+ },
734
777
  };
735
778
  },
736
779
  });
@@ -0,0 +1,70 @@
1
+ const { describe, it, afterEach } = require("node:test");
2
+ const assert = require("node:assert/strict");
3
+ const jiti = require("jiti")(__filename, { interopDefault: true, debug: false });
4
+
5
+ const { prepareMacScreenshotPayload } = jiti("../index.ts");
6
+ const { __setSharpForTesting } = jiti("../../browser-tools/screenshot-constraints.ts");
7
+
8
+ async function createTestJpeg(width, height) {
9
+ const sharp = require("sharp");
10
+ return sharp({
11
+ create: {
12
+ width,
13
+ height,
14
+ channels: 3,
15
+ background: { r: 128, g: 128, b: 128 },
16
+ },
17
+ })
18
+ .jpeg({ quality: 80 })
19
+ .toBuffer();
20
+ }
21
+
22
+ describe("prepareMacScreenshotPayload", () => {
23
+ afterEach(() => {
24
+ __setSharpForTesting(undefined);
25
+ });
26
+
27
+ it("resizes oversized mac screenshots before returning base64 image data", async () => {
28
+ const sharp = require("sharp");
29
+ const input = await createTestJpeg(3000, 2000);
30
+
31
+ const result = await prepareMacScreenshotPayload(
32
+ {
33
+ imageData: input.toString("base64"),
34
+ format: "jpeg",
35
+ width: 3000,
36
+ height: 2000,
37
+ },
38
+ 0.8,
39
+ );
40
+
41
+ const output = Buffer.from(result.imageData, "base64");
42
+ const meta = await sharp(output).metadata();
43
+ assert.equal(result.mimeType, "image/jpeg");
44
+ assert.equal(result.width, 1568);
45
+ assert.ok(result.height > 1000 && result.height < 1100);
46
+ assert.equal(meta.width, result.width);
47
+ assert.equal(meta.height, result.height);
48
+ });
49
+
50
+ it("falls back to raw screenshot data and original dimensions when sharp is unavailable", async () => {
51
+ __setSharpForTesting(null);
52
+ const input = await createTestJpeg(3000, 2000);
53
+ const inputBase64 = input.toString("base64");
54
+
55
+ const result = await prepareMacScreenshotPayload(
56
+ {
57
+ imageData: inputBase64,
58
+ format: "jpeg",
59
+ width: 3000,
60
+ height: 2000,
61
+ },
62
+ 0.8,
63
+ );
64
+
65
+ assert.equal(result.imageData, inputBase64);
66
+ assert.equal(result.width, 3000);
67
+ assert.equal(result.height, 2000);
68
+ assert.equal(result.mimeType, "image/jpeg");
69
+ });
70
+ });