@opengsd/gsd-pi 1.3.0-dev.eed73bea → 1.4.0-dev.5fc22c6f

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 (550) hide show
  1. package/README.md +11 -11
  2. package/dist/cli.js +17 -4
  3. package/dist/headless-answers.js +1 -1
  4. package/dist/headless-ui.d.ts +1 -1
  5. package/dist/headless-ui.js +1 -1
  6. package/dist/headless.js +1 -1
  7. package/dist/onboarding.js +11 -0
  8. package/dist/resources/.managed-resources-content-hash +1 -1
  9. package/dist/resources/GSD-WORKFLOW.md +20 -25
  10. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  11. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +61 -50
  12. package/dist/resources/extensions/cursor-cli/index.js +16 -0
  13. package/dist/resources/extensions/cursor-cli/models.js +63 -0
  14. package/dist/resources/extensions/cursor-cli/package.json +11 -0
  15. package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
  16. package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
  17. package/dist/resources/extensions/gsd/activity-log.js +4 -1
  18. package/dist/resources/extensions/gsd/artifact-verification.js +431 -0
  19. package/dist/resources/extensions/gsd/auto/session.js +11 -0
  20. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
  22. package/dist/resources/extensions/gsd/auto-budget.js +5 -1
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +32 -11
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  26. package/dist/resources/extensions/gsd/auto-prompts.js +83 -25
  27. package/dist/resources/extensions/gsd/auto-recovery.js +9 -517
  28. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
  29. package/dist/resources/extensions/gsd/auto-start.js +4 -3
  30. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -3
  31. package/dist/resources/extensions/gsd/auto-verification.js +5 -2
  32. package/dist/resources/extensions/gsd/auto-worktree.js +38 -11
  33. package/dist/resources/extensions/gsd/auto.js +32 -10
  34. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -4
  36. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  37. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +147 -23
  38. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +56 -36
  39. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +29 -5
  40. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
  41. package/dist/resources/extensions/gsd/codebase-generator.js +157 -19
  42. package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
  43. package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
  44. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +154 -2
  45. package/dist/resources/extensions/gsd/commands-usage.js +1 -1
  46. package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
  47. package/dist/resources/extensions/gsd/db/engine.js +4 -1
  48. package/dist/resources/extensions/gsd/db/queries.js +39 -0
  49. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
  50. package/dist/resources/extensions/gsd/db-workspace.js +55 -3
  51. package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
  52. package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
  53. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -4
  54. package/dist/resources/extensions/gsd/doctor-engine-checks.js +227 -5
  55. package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
  56. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
  57. package/dist/resources/extensions/gsd/doctor.js +93 -3
  58. package/dist/resources/extensions/gsd/exec-sandbox.js +14 -4
  59. package/dist/resources/extensions/gsd/flat-phase-migration.js +119 -23
  60. package/dist/resources/extensions/gsd/git-service.js +61 -8
  61. package/dist/resources/extensions/gsd/gitignore.js +4 -1
  62. package/dist/resources/extensions/gsd/guidance.js +1 -0
  63. package/dist/resources/extensions/gsd/guided-flow-queue.js +20 -13
  64. package/dist/resources/extensions/gsd/guided-flow.js +40 -2
  65. package/dist/resources/extensions/gsd/json-persistence.js +20 -0
  66. package/dist/resources/extensions/gsd/key-manager.js +1 -0
  67. package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
  68. package/dist/resources/extensions/gsd/layout-policy.js +3 -1
  69. package/dist/resources/extensions/gsd/markdown-renderer.js +27 -15
  70. package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
  71. package/dist/resources/extensions/gsd/metrics.js +4 -4
  72. package/dist/resources/extensions/gsd/migrate-external.js +22 -5
  73. package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
  74. package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
  75. package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
  76. package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
  77. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  78. package/dist/resources/extensions/gsd/preferences-validation.js +25 -2
  79. package/dist/resources/extensions/gsd/preferences.js +29 -2
  80. package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
  81. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  82. package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  83. package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
  84. package/dist/resources/extensions/gsd/repository-registry.js +6 -1
  85. package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
  86. package/dist/resources/extensions/gsd/safe-fs.js +23 -2
  87. package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
  88. package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
  89. package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
  90. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
  91. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
  92. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  93. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  94. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  95. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  96. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  97. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +27 -33
  98. package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
  99. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
  100. package/dist/resources/extensions/gsd/state.js +12 -611
  101. package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
  102. package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -34
  103. package/dist/resources/extensions/gsd/tools/complete-task.js +8 -41
  104. package/dist/resources/extensions/gsd/tools/plan-slice.js +59 -44
  105. package/dist/resources/extensions/gsd/tools/plan-task.js +103 -12
  106. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
  107. package/dist/resources/extensions/gsd/undo.js +43 -6
  108. package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
  109. package/dist/resources/extensions/gsd/unit-registry.js +11 -3
  110. package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
  111. package/dist/resources/extensions/gsd/verification-gate.js +7 -0
  112. package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
  113. package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
  114. package/dist/resources/extensions/gsd/workspace.js +26 -8
  115. package/dist/resources/extensions/gsd/worktree-manager.js +140 -5
  116. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  117. package/dist/web/standalone/.next/BUILD_ID +1 -1
  118. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  119. package/dist/web/standalone/.next/build-manifest.json +3 -3
  120. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  121. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  122. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  133. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/index.html +1 -1
  142. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  143. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  144. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  145. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  150. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  151. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  154. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  155. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  156. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  157. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  158. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  159. package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
  160. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  161. package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
  162. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  163. package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
  164. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  165. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  166. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  167. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  168. package/dist/wizard.d.ts +8 -0
  169. package/dist/wizard.js +8 -1
  170. package/integrations/hermes/__init__.py +31 -0
  171. package/integrations/hermes/tests/test_directory_loader.py +37 -0
  172. package/package.json +8 -8
  173. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
  174. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
  175. package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
  176. package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
  177. package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
  178. package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
  179. package/packages/cloud-mcp-gateway/package.json +2 -2
  180. package/packages/contracts/package.json +1 -1
  181. package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
  182. package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
  183. package/packages/daemon/dist/cloud-runtime.js +25 -1
  184. package/packages/daemon/dist/cloud-runtime.js.map +1 -1
  185. package/packages/daemon/dist/cloud-runtime.test.js +51 -0
  186. package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
  187. package/packages/daemon/dist/message-batcher.d.ts +7 -0
  188. package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
  189. package/packages/daemon/dist/message-batcher.js +13 -0
  190. package/packages/daemon/dist/message-batcher.js.map +1 -1
  191. package/packages/daemon/dist/message-batcher.test.js +48 -0
  192. package/packages/daemon/dist/message-batcher.test.js.map +1 -1
  193. package/packages/daemon/package.json +5 -5
  194. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  195. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  196. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  197. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  198. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
  199. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  200. package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
  201. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  202. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  203. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  204. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  205. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  206. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  207. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  208. package/packages/gsd-agent-core/dist/index.js +2 -0
  209. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  210. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  211. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  212. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  213. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  214. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  215. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  216. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  217. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  218. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  219. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  220. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  221. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  222. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  223. package/packages/gsd-agent-core/package.json +5 -5
  224. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  225. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  226. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  228. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  229. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  231. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  232. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  233. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  234. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -841
  235. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  236. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  237. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  238. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  239. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  241. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  242. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  246. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +259 -0
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  249. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  252. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  263. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  264. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  265. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  267. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  269. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  270. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  271. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  272. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
  273. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +24 -6
  275. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  277. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  278. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  279. package/packages/gsd-agent-modes/package.json +7 -7
  280. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  281. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  282. package/packages/mcp-server/package.json +4 -4
  283. package/packages/native/package.json +1 -1
  284. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  285. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  286. package/packages/pi-agent-core/package.json +1 -1
  287. package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  288. package/packages/pi-ai/dist/env-api-keys.js +3 -0
  289. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  290. package/packages/pi-ai/dist/models.generated.d.ts +46 -0
  291. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  292. package/packages/pi-ai/dist/models.generated.js +38 -0
  293. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  294. package/packages/pi-ai/dist/types.d.ts +2 -2
  295. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/types.js.map +1 -1
  297. package/packages/pi-ai/package.json +1 -1
  298. package/packages/pi-coding-agent/README.md +3 -2
  299. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  301. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  303. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  304. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  305. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  306. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  307. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  308. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  309. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  310. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  311. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  312. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  313. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  314. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
  315. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  316. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  317. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  319. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
  321. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  323. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  325. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  328. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  329. package/packages/pi-coding-agent/package.json +7 -7
  330. package/packages/pi-tui/package.json +2 -2
  331. package/packages/rpc-client/dist/rpc-client.js +1 -1
  332. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  333. package/packages/rpc-client/package.json +2 -2
  334. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  335. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  336. package/pkg/dist/theme/theme-schema.js +1 -1
  337. package/pkg/dist/theme/theme-schema.js.map +1 -1
  338. package/pkg/dist/theme/theme.d.ts.map +1 -1
  339. package/pkg/dist/theme/theme.js +11 -7
  340. package/pkg/dist/theme/theme.js.map +1 -1
  341. package/pkg/package.json +1 -1
  342. package/scripts/link-workspace-packages.cjs +14 -4
  343. package/src/resources/GSD-WORKFLOW.md +20 -25
  344. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  345. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +67 -49
  346. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
  347. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +159 -0
  348. package/src/resources/extensions/cursor-cli/index.ts +18 -0
  349. package/src/resources/extensions/cursor-cli/models.ts +65 -0
  350. package/src/resources/extensions/cursor-cli/package.json +11 -0
  351. package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
  352. package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
  353. package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
  354. package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
  355. package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
  356. package/src/resources/extensions/gsd/activity-log.ts +4 -1
  357. package/src/resources/extensions/gsd/artifact-verification.ts +468 -0
  358. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  359. package/src/resources/extensions/gsd/auto/session.ts +14 -0
  360. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
  361. package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
  362. package/src/resources/extensions/gsd/auto-budget.ts +12 -1
  363. package/src/resources/extensions/gsd/auto-dispatch.ts +34 -12
  364. package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
  365. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  366. package/src/resources/extensions/gsd/auto-prompts.ts +80 -25
  367. package/src/resources/extensions/gsd/auto-recovery.ts +13 -518
  368. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
  369. package/src/resources/extensions/gsd/auto-start.ts +4 -3
  370. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +7 -2
  371. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  372. package/src/resources/extensions/gsd/auto-worktree.ts +50 -11
  373. package/src/resources/extensions/gsd/auto.ts +36 -8
  374. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
  375. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -4
  376. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  377. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +171 -23
  378. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
  379. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +60 -37
  380. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +39 -5
  381. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
  382. package/src/resources/extensions/gsd/codebase-generator.ts +179 -18
  383. package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
  384. package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
  385. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +136 -2
  386. package/src/resources/extensions/gsd/commands-usage.ts +1 -1
  387. package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
  388. package/src/resources/extensions/gsd/db/engine.ts +8 -1
  389. package/src/resources/extensions/gsd/db/queries.ts +40 -0
  390. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
  391. package/src/resources/extensions/gsd/db-workspace.ts +61 -3
  392. package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
  393. package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
  394. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -4
  395. package/src/resources/extensions/gsd/doctor-engine-checks.ts +275 -5
  396. package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
  397. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
  398. package/src/resources/extensions/gsd/doctor-types.ts +8 -1
  399. package/src/resources/extensions/gsd/doctor.ts +95 -3
  400. package/src/resources/extensions/gsd/exec-sandbox.ts +13 -4
  401. package/src/resources/extensions/gsd/flat-phase-migration.ts +142 -22
  402. package/src/resources/extensions/gsd/git-service.ts +70 -9
  403. package/src/resources/extensions/gsd/gitignore.ts +4 -1
  404. package/src/resources/extensions/gsd/guidance.ts +2 -0
  405. package/src/resources/extensions/gsd/guided-flow-queue.ts +20 -13
  406. package/src/resources/extensions/gsd/guided-flow.ts +45 -2
  407. package/src/resources/extensions/gsd/json-persistence.ts +20 -0
  408. package/src/resources/extensions/gsd/key-manager.ts +1 -0
  409. package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
  410. package/src/resources/extensions/gsd/layout-policy.ts +2 -1
  411. package/src/resources/extensions/gsd/markdown-renderer.ts +27 -17
  412. package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
  413. package/src/resources/extensions/gsd/metrics.ts +4 -4
  414. package/src/resources/extensions/gsd/migrate-external.ts +17 -4
  415. package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
  416. package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
  417. package/src/resources/extensions/gsd/model-router.ts +4 -5
  418. package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
  419. package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
  420. package/src/resources/extensions/gsd/preferences-models.ts +6 -3
  421. package/src/resources/extensions/gsd/preferences-validation.ts +28 -2
  422. package/src/resources/extensions/gsd/preferences.ts +38 -4
  423. package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
  424. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  425. package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
  426. package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
  427. package/src/resources/extensions/gsd/repository-registry.ts +7 -1
  428. package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
  429. package/src/resources/extensions/gsd/safe-fs.ts +22 -2
  430. package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
  431. package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
  432. package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
  433. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
  434. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
  435. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  436. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  437. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  438. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  439. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  440. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +36 -30
  441. package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
  442. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
  443. package/src/resources/extensions/gsd/state.ts +32 -732
  444. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
  445. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
  446. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
  447. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
  448. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
  449. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
  450. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
  451. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +35 -0
  452. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
  453. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
  454. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
  455. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
  456. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
  457. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
  458. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +8 -0
  459. package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
  460. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
  461. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +365 -0
  462. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
  463. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
  464. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
  465. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
  466. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
  467. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
  468. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
  469. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
  470. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
  471. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +296 -2
  472. package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
  473. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
  474. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
  475. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +74 -2
  476. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
  477. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
  478. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
  479. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
  480. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +11 -2
  481. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  482. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
  483. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
  484. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
  485. package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
  486. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
  487. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
  488. package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
  489. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
  490. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  491. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
  492. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
  493. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
  494. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +27 -0
  495. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
  496. package/src/resources/extensions/gsd/tests/plan-task.test.ts +307 -1
  497. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
  498. package/src/resources/extensions/gsd/tests/preferences.test.ts +150 -0
  499. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +142 -0
  500. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  501. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
  502. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
  503. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
  504. package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
  505. package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
  506. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +378 -0
  507. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
  508. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
  509. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
  510. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
  511. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +105 -0
  512. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +115 -0
  513. package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
  514. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
  515. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +203 -0
  516. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +6 -3
  517. package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
  518. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
  519. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
  520. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +90 -0
  521. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
  522. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
  523. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
  524. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
  525. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
  526. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +214 -6
  527. package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
  528. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
  529. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +31 -1
  530. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
  531. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  532. package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -30
  533. package/src/resources/extensions/gsd/tools/complete-task.ts +7 -39
  534. package/src/resources/extensions/gsd/tools/plan-slice.ts +60 -47
  535. package/src/resources/extensions/gsd/tools/plan-task.ts +135 -12
  536. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
  537. package/src/resources/extensions/gsd/undo.ts +47 -6
  538. package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
  539. package/src/resources/extensions/gsd/unit-registry.ts +11 -3
  540. package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
  541. package/src/resources/extensions/gsd/verification-gate.ts +8 -0
  542. package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
  543. package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
  544. package/src/resources/extensions/gsd/workspace.ts +42 -8
  545. package/src/resources/extensions/gsd/worktree-manager.ts +183 -5
  546. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  547. package/dist/web/standalone/.next/static/chunks/796.3976108148518f7d.js +0 -10
  548. package/dist/web/standalone/.next/static/chunks/webpack-7c1d97e39be2da11.js +0 -1
  549. /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_buildManifest.js +0 -0
  550. /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_ssgManifest.js +0 -0
@@ -29,21 +29,18 @@ import {
29
29
  deleteVerificationEvidence,
30
30
  saveGateResult,
31
31
  getPendingGatesForTurn,
32
- isDbAvailable,
33
32
  } from "../gsd-db.js";
34
- import { getWorkflowDatabasePath, openWorkflowDatabasePath } from "../db-workspace.js";
33
+ import { getWorkflowDatabasePath, ensureWorkflowDbAtPath } from "../db-workspace.js";
35
34
  import { getGatesForTurn } from "../gate-registry.js";
36
35
  import { gsdProjectionRoot, clearPathCache, resolveMilestonePath, resolveSlicePath } from "../paths.js";
37
36
  import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
38
37
  import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
39
38
  import { saveFile, clearParseCache } from "../files.js";
40
39
  import { invalidateStateCache } from "../state.js";
41
- import { renderPlanCheckboxes, renderRoadmapFromDb } from "../markdown-renderer.js";
40
+ import { renderPlanCheckboxes } from "../markdown-renderer.js";
42
41
  import {
43
- renderStateProjection,
42
+ renderMilestoneShellProjections,
44
43
  renderSummaryContent,
45
- renderTopLevelQueueFromDb,
46
- renderTopLevelRoadmapFromDb,
47
44
  } from "../workflow-projections.js";
48
45
  import { writeManifest } from "../workflow-manifest.js";
49
46
  import { appendEvent } from "../workflow-events.js";
@@ -108,35 +105,6 @@ function taskSummaryPath(
108
105
  );
109
106
  }
110
107
 
111
- async function renderCompleteTaskProjections(basePath: string, milestoneId: string): Promise<void> {
112
- try {
113
- await renderRoadmapFromDb(basePath, milestoneId);
114
- } catch (err) {
115
- logWarning("projection", `renderRoadmapFromDb failed for ${milestoneId}: ${(err as Error).message}`);
116
- }
117
- try {
118
- renderTopLevelRoadmapFromDb(basePath);
119
- } catch (err) {
120
- logWarning("projection", `renderTopLevelRoadmapFromDb failed: ${(err as Error).message}`);
121
- }
122
- try {
123
- renderTopLevelQueueFromDb(basePath);
124
- } catch (err) {
125
- logWarning("projection", `renderTopLevelQueueFromDb failed: ${(err as Error).message}`);
126
- }
127
- try {
128
- await renderStateProjection(basePath);
129
- } catch (err) {
130
- logWarning("projection", `renderStateProjection failed: ${(err as Error).message}`);
131
- }
132
- }
133
-
134
- function ensureCompleteTaskDbOpen(dbPath: string | null): boolean {
135
- if (!dbPath || dbPath === ":memory:") return isDbAvailable();
136
- if (isDbAvailable() && getWorkflowDatabasePath() === dbPath) return true;
137
- return openWorkflowDatabasePath(dbPath);
138
- }
139
-
140
108
  async function repairMissingTaskSummaryProjection(
141
109
  artifactBasePath: string,
142
110
  taskRow: TaskRow,
@@ -167,7 +135,7 @@ async function repairMissingTaskSummaryProjection(
167
135
  clearParseCache();
168
136
 
169
137
  try {
170
- await renderCompleteTaskProjections(artifactBasePath, taskRow.milestone_id);
138
+ await renderMilestoneShellProjections(artifactBasePath, taskRow.milestone_id);
171
139
  } catch (projErr) {
172
140
  logWarning("tool", `complete-task repair projection warning: ${(projErr as Error).message}`);
173
141
  }
@@ -473,7 +441,7 @@ export async function handleCompleteTask(
473
441
 
474
442
  // Toggle or regenerate the plan projection from DB. Missing projection
475
443
  // files are rebuilt by the renderer instead of being skipped.
476
- if (!ensureCompleteTaskDbOpen(rollbackDbPath)) {
444
+ if (!ensureWorkflowDbAtPath(rollbackDbPath)) {
477
445
  throw new Error(`database unavailable before plan projection render for ${params.milestoneId}/${params.sliceId}`);
478
446
  }
479
447
  const wrotePlan = await renderPlanCheckboxes(artifactBasePath, params.milestoneId, params.sliceId);
@@ -488,7 +456,7 @@ export async function handleCompleteTask(
488
456
  );
489
457
  let rollbackSucceeded = false;
490
458
  try {
491
- ensureCompleteTaskDbOpen(rollbackDbPath);
459
+ ensureWorkflowDbAtPath(rollbackDbPath);
492
460
  deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
493
461
  updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, "pending");
494
462
  invalidateStateCache();
@@ -640,7 +608,7 @@ export async function handleCompleteTask(
640
608
  // Separate try/catch per step so a projection failure doesn't prevent
641
609
  // the event log entry (critical for worktree reconciliation).
642
610
  try {
643
- await renderCompleteTaskProjections(artifactBasePath, params.milestoneId);
611
+ await renderMilestoneShellProjections(artifactBasePath, params.milestoneId);
644
612
  } catch (projErr) {
645
613
  logWarning("tool", `complete-task projection warning: ${(projErr as Error).message}`);
646
614
  }
@@ -51,7 +51,7 @@ export interface PlanSliceParams {
51
51
  milestoneId: string;
52
52
  sliceId: string;
53
53
  goal: string;
54
- tasks: PlanSliceTaskInput[];
54
+ tasks?: PlanSliceTaskInput[];
55
55
  /** @optional — omitted fields render as conservative defaults */
56
56
  successCriteria?: string;
57
57
  /** @optional — omitted fields render as conservative defaults */
@@ -86,10 +86,12 @@ function validateRepositoryTargetIds(
86
86
  return deduped;
87
87
  }
88
88
 
89
- function validateTasks(value: unknown): PlanSliceTaskInput[] {
90
- if (!Array.isArray(value) || value.length === 0) {
91
- throw new Error("tasks must be a non-empty array");
89
+ function validateTasks(value: unknown): PlanSliceTaskInput[] | undefined {
90
+ if (value === undefined) return undefined;
91
+ if (!Array.isArray(value)) {
92
+ throw new Error("tasks must be an array");
92
93
  }
94
+ if (value.length === 0) return undefined;
93
95
 
94
96
  const seen = new Set<string>();
95
97
  return value.map((entry, index) => {
@@ -200,7 +202,7 @@ function validateReferencedRepositories(
200
202
  };
201
203
 
202
204
  for (const id of params.targetRepositories ?? defaultTargets) noteMissing(id);
203
- for (const task of params.tasks) {
205
+ for (const task of params.tasks ?? []) {
204
206
  for (const id of task.targetRepositories ?? params.targetRepositories ?? defaultTargets) noteMissing(id);
205
207
  }
206
208
 
@@ -211,7 +213,7 @@ function validateReferencedRepositories(
211
213
  function resolveAllowedRootsForPathScope(params: PlanSliceParams, registry: RepositoryRegistry, defaultTargets: string[]): string[] {
212
214
  const requested = new Set<string>();
213
215
  for (const id of params.targetRepositories ?? defaultTargets) requested.add(id);
214
- for (const task of params.tasks) {
216
+ for (const task of params.tasks ?? []) {
215
217
  for (const id of task.targetRepositories ?? params.targetRepositories ?? defaultTargets) requested.add(id);
216
218
  }
217
219
  if (requested.size === 0) return [registry.projectRoot];
@@ -222,7 +224,7 @@ function resolveAllowedRootsForPathScope(params: PlanSliceParams, registry: Repo
222
224
  }
223
225
 
224
226
  function toTaskRows(params: PlanSliceParams, defaultTargets: string[]): TaskRow[] {
225
- return params.tasks.map((task, index) => ({
227
+ return (params.tasks ?? []).map((task, index) => ({
226
228
  milestone_id: params.milestoneId,
227
229
  slice_id: params.sliceId,
228
230
  id: task.taskId,
@@ -309,6 +311,8 @@ export async function handlePlanSlice(
309
311
  return { error: `validation failed: ${message}` };
310
312
  }
311
313
  const defaultTargets = defaultRepositoryTargets(repositoryRegistry);
314
+ const taskPayload = params.tasks ?? [];
315
+ const hasTaskPayload = taskPayload.length > 0;
312
316
  const repoValidationError = validateReferencedRepositories(params, repositoryRegistry, defaultTargets);
313
317
  if (repoValidationError) {
314
318
  return { error: `validation failed: ${repoValidationError}` };
@@ -317,7 +321,7 @@ export async function handlePlanSlice(
317
321
  const allowedAbsoluteRoots = resolveAllowedRootsForPathScope(params, repositoryRegistry, defaultTargets);
318
322
 
319
323
  const pathOnlyError = validatePathOnlyPlanningFields(
320
- params.tasks.map((task, index) => ({
324
+ taskPayload.map((task, index) => ({
321
325
  field: `tasks[${index}].expectedOutput`,
322
326
  values: task.expectedOutput,
323
327
  })),
@@ -328,7 +332,7 @@ export async function handlePlanSlice(
328
332
 
329
333
  const pathScopeError = validatePlanningPathScope(
330
334
  basePath,
331
- params.tasks.flatMap((task, index) => [
335
+ taskPayload.flatMap((task, index) => [
332
336
  { field: `tasks[${index}].files`, values: task.files },
333
337
  { field: `tasks[${index}].inputs`, values: task.inputs },
334
338
  { field: `tasks[${index}].expectedOutput`, values: task.expectedOutput },
@@ -372,16 +376,18 @@ export async function handlePlanSlice(
372
376
  return;
373
377
  }
374
378
 
375
- const newTaskIds = new Set(params.tasks.map((task) => task.taskId));
379
+ const newTaskIds = new Set(taskPayload.map((task) => task.taskId));
376
380
  const existingTasks = getSliceTasks(params.milestoneId, params.sliceId);
377
- omittedTaskIds = existingTasks
378
- .filter((task) => !newTaskIds.has(task.id))
379
- .map((task) => task.id);
380
-
381
- for (const task of existingTasks) {
382
- if (!newTaskIds.has(task.id) && isClosedStatus(task.status)) {
383
- guardError = `cannot remove completed task ${task.id}`;
384
- return;
381
+ if (hasTaskPayload) {
382
+ omittedTaskIds = existingTasks
383
+ .filter((task) => !newTaskIds.has(task.id))
384
+ .map((task) => task.id);
385
+
386
+ for (const task of existingTasks) {
387
+ if (!newTaskIds.has(task.id) && isClosedStatus(task.status)) {
388
+ guardError = `cannot remove completed task ${task.id}`;
389
+ return;
390
+ }
385
391
  }
386
392
  }
387
393
 
@@ -398,35 +404,37 @@ export async function handlePlanSlice(
398
404
  targetRepositories: params.targetRepositories ?? defaultTargets,
399
405
  });
400
406
 
401
- for (const taskId of omittedTaskIds) {
402
- deleteTask(params.milestoneId, params.sliceId, taskId);
403
- }
407
+ if (hasTaskPayload) {
408
+ for (const taskId of omittedTaskIds) {
409
+ deleteTask(params.milestoneId, params.sliceId, taskId);
410
+ }
404
411
 
405
- const existingTaskById = new Map(existingTasks.map((task) => [task.id, task]));
406
- for (const task of params.tasks) {
407
- const planning = {
408
- title: task.title,
409
- description: task.description,
410
- estimate: task.estimate,
411
- files: task.files,
412
- verify: task.verify,
413
- inputs: task.inputs,
414
- expectedOutput: task.expectedOutput,
415
- observabilityImpact: task.observabilityImpact ?? "",
416
- fullPlanMd: task.fullPlanMd,
417
- targetRepositories: task.targetRepositories ?? params.targetRepositories ?? defaultTargets,
418
- };
419
- const existingTask = existingTaskById.get(task.taskId);
420
- if (!existingTask || !isClosedStatus(existingTask.status)) {
421
- insertTask({
422
- id: task.taskId,
423
- sliceId: params.sliceId,
424
- milestoneId: params.milestoneId,
412
+ const existingTaskById = new Map(existingTasks.map((task) => [task.id, task]));
413
+ for (const task of taskPayload) {
414
+ const planning = {
425
415
  title: task.title,
426
- status: "pending",
427
- });
416
+ description: task.description,
417
+ estimate: task.estimate,
418
+ files: task.files,
419
+ verify: task.verify,
420
+ inputs: task.inputs,
421
+ expectedOutput: task.expectedOutput,
422
+ observabilityImpact: task.observabilityImpact ?? "",
423
+ fullPlanMd: task.fullPlanMd,
424
+ targetRepositories: task.targetRepositories ?? params.targetRepositories ?? defaultTargets,
425
+ };
426
+ const existingTask = existingTaskById.get(task.taskId);
427
+ if (!existingTask || !isClosedStatus(existingTask.status)) {
428
+ insertTask({
429
+ id: task.taskId,
430
+ sliceId: params.sliceId,
431
+ milestoneId: params.milestoneId,
432
+ title: task.title,
433
+ status: "pending",
434
+ });
435
+ }
436
+ upsertTaskPlanning(params.milestoneId, params.sliceId, task.taskId, planning);
428
437
  }
429
- upsertTaskPlanning(params.milestoneId, params.sliceId, task.taskId, planning);
430
438
  }
431
439
 
432
440
  // Seed quality gate rows inside the transaction — all-or-nothing with
@@ -436,7 +444,7 @@ export async function handlePlanSlice(
436
444
  insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "slice" });
437
445
  }
438
446
  const taskGates = resolveTaskGates(gateEvaluation);
439
- for (const task of params.tasks) {
447
+ for (const task of taskPayload) {
440
448
  for (const gid of taskGates) {
441
449
  insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: task.taskId });
442
450
  }
@@ -460,8 +468,13 @@ export async function handlePlanSlice(
460
468
  deleteArtifactByPath(artifactPath);
461
469
  }
462
470
 
463
- const renderResult = await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
464
- setSliceSketchFlag(params.milestoneId, params.sliceId, false);
471
+ const sliceTasks = getSliceTasks(params.milestoneId, params.sliceId);
472
+ const renderResult = sliceTasks.length === 0
473
+ ? { planPath: "", taskPlanPaths: [] as string[] }
474
+ : await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
475
+ if (sliceTasks.length > 0) {
476
+ setSliceSketchFlag(params.milestoneId, params.sliceId, false);
477
+ }
465
478
  invalidateStateCache();
466
479
  clearParseCache();
467
480
 
@@ -1,15 +1,19 @@
1
1
  import { clearParseCache } from "../files.js";
2
2
  import { isClosedStatus } from "../status-guards.js";
3
3
  import { isNonEmptyString, validateStringArray } from "../validation.js";
4
- import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning } from "../gsd-db.js";
4
+ import { getGateIdsForTurn } from "../gate-registry.js";
5
+ import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning, insertGateRow, setSliceSketchFlag } from "../gsd-db.js";
5
6
  import { invalidateStateCache } from "../state.js";
6
7
  import { renderTaskPlanFromDb, renderPlanFromDb } from "../markdown-renderer.js";
7
- import { resolveSliceFile, resolveTasksDir } from "../paths.js";
8
+ import { resolveTasksDir } from "../paths.js";
8
9
  import { flushWorkflowProjections } from "../projection-flush.js";
9
10
  import { writeManifest } from "../workflow-manifest.js";
10
11
  import { appendEvent } from "../workflow-events.js";
11
12
  import { logWarning } from "../workflow-logger.js";
13
+ import { loadEffectiveGSDPreferences } from "../preferences.js";
12
14
  import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
15
+ import { createRepositoryRegistryFromPreferences, defaultRepositoryTargets, type RepositoryRegistry } from "../repository-registry.js";
16
+ import type { GateId } from "../types.js";
13
17
 
14
18
  export interface PlanTaskParams {
15
19
  milestoneId: string;
@@ -23,6 +27,8 @@ export interface PlanTaskParams {
23
27
  inputs: string[];
24
28
  expectedOutput: string[];
25
29
  observabilityImpact?: string;
30
+ /** Repository id(s) this task touches (parent workspace); omitted for single-repo projects. */
31
+ targetRepositories?: string[];
26
32
  fullPlanMd?: string;
27
33
  /** Optional caller-provided identity for audit trail */
28
34
  actorName?: string;
@@ -37,6 +43,63 @@ export interface PlanTaskResult {
37
43
  taskPlanPath: string;
38
44
  }
39
45
 
46
+ function validateRepositoryTargetIds(field: string, value: unknown): string[] {
47
+ const ids = validateStringArray(value, field);
48
+ if (ids.length === 0) throw new Error(`${field} must include at least one repository id when provided`);
49
+ const deduped = Array.from(new Set(ids.map((id) => id.trim()).filter(Boolean)));
50
+ if (deduped.length === 0) throw new Error(`${field} must include at least one repository id when provided`);
51
+ return deduped;
52
+ }
53
+
54
+ function validateReferencedRepositories(
55
+ targetRepositories: string[] | undefined,
56
+ registry: RepositoryRegistry,
57
+ ): string | null {
58
+ if (!targetRepositories) return null;
59
+ const known = new Set(registry.repositories.map((repo) => repo.id));
60
+ const missing = targetRepositories.filter((id) => !known.has(id));
61
+ if (missing.length === 0) return null;
62
+ return `unknown targetRepositories: ${missing.join(", ")}. Declared repositories: ${Array.from(known).join(", ")}`;
63
+ }
64
+
65
+ function resolveAllowedRootsForPathScope(
66
+ targetRepositories: string[],
67
+ registry: RepositoryRegistry,
68
+ ): string[] {
69
+ if (targetRepositories.length === 0) return [registry.projectRoot];
70
+ const roots = targetRepositories
71
+ .map((id) => registry.byId.get(id)?.root)
72
+ .filter((root): root is string => typeof root === "string");
73
+ return roots.length > 0 ? roots : [registry.projectRoot];
74
+ }
75
+
76
+ function validatePathScopeForTargetRepositories(
77
+ params: PlanTaskParams,
78
+ basePath: string,
79
+ registry: RepositoryRegistry,
80
+ targetRepositories: string[],
81
+ ): string | null {
82
+ return validatePlanningPathScope(
83
+ basePath,
84
+ [
85
+ { field: "files", values: params.files },
86
+ { field: "inputs", values: params.inputs },
87
+ { field: "expectedOutput", values: params.expectedOutput },
88
+ ],
89
+ resolveAllowedRootsForPathScope(targetRepositories, registry),
90
+ );
91
+ }
92
+
93
+ function resolveEffectiveTargetRepositories(
94
+ taskTargetRepositories: string[] | undefined,
95
+ sliceTargetRepositories: string[] | undefined,
96
+ defaultTargets: string[],
97
+ ): string[] {
98
+ if (taskTargetRepositories) return taskTargetRepositories;
99
+ if (sliceTargetRepositories?.length) return sliceTargetRepositories;
100
+ return defaultTargets;
101
+ }
102
+
40
103
  function validateParams(params: PlanTaskParams): PlanTaskParams {
41
104
  if (!isNonEmptyString(params?.milestoneId)) throw new Error("milestoneId is required");
42
105
  if (!isNonEmptyString(params?.sliceId)) throw new Error("sliceId is required");
@@ -54,9 +117,18 @@ function validateParams(params: PlanTaskParams): PlanTaskParams {
54
117
  files: validateStringArray(params.files, "files"),
55
118
  inputs: validateStringArray(params.inputs, "inputs"),
56
119
  expectedOutput: validateStringArray(params.expectedOutput, "expectedOutput"),
120
+ ...(params.targetRepositories !== undefined
121
+ ? { targetRepositories: validateRepositoryTargetIds("targetRepositories", params.targetRepositories) }
122
+ : {}),
57
123
  };
58
124
  }
59
125
 
126
+ function resolveTaskGates(basePath: string): GateId[] {
127
+ const loaded = loadEffectiveGSDPreferences(basePath);
128
+ if (loaded?.preferences?.gate_evaluation?.task_gates === false) return [];
129
+ return [...getGateIdsForTurn("execute-task")];
130
+ }
131
+
60
132
  export async function handlePlanTask(
61
133
  rawParams: PlanTaskParams,
62
134
  basePath: string,
@@ -75,15 +147,19 @@ export async function handlePlanTask(
75
147
  return { error: `validation failed: ${pathOnlyError}` };
76
148
  }
77
149
 
78
- const pathScopeError = validatePlanningPathScope(basePath, [
79
- { field: "files", values: params.files },
80
- { field: "inputs", values: params.inputs },
81
- { field: "expectedOutput", values: params.expectedOutput },
82
- ]);
83
- if (pathScopeError) {
84
- return { error: `validation failed: ${pathScopeError}` };
150
+ let taskGates: GateId[];
151
+ let repositoryRegistry: RepositoryRegistry;
152
+ try {
153
+ taskGates = resolveTaskGates(basePath);
154
+ const loaded = loadEffectiveGSDPreferences(basePath);
155
+ repositoryRegistry = createRepositoryRegistryFromPreferences(basePath, loaded?.preferences);
156
+ } catch (err) {
157
+ const message = err instanceof Error ? err.message : String(err);
158
+ return { error: `validation failed: ${message}` };
85
159
  }
86
160
 
161
+ const defaultTargets = defaultRepositoryTargets(repositoryRegistry);
162
+
87
163
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
88
164
  // Guards must be inside the transaction so the state they check cannot
89
165
  // change between the read and the write (#2723).
@@ -107,6 +183,44 @@ export async function handlePlanTask(
107
183
  return;
108
184
  }
109
185
 
186
+ let effectiveTargetRepositories = resolveEffectiveTargetRepositories(
187
+ params.targetRepositories,
188
+ parentSlice.target_repositories,
189
+ defaultTargets,
190
+ );
191
+ const repoValidationError = validateReferencedRepositories(effectiveTargetRepositories, repositoryRegistry);
192
+ if (repoValidationError) {
193
+ guardError = `validation failed: ${repoValidationError}`;
194
+ return;
195
+ }
196
+
197
+ let pathScopeError = validatePathScopeForTargetRepositories(
198
+ params,
199
+ basePath,
200
+ repositoryRegistry,
201
+ effectiveTargetRepositories,
202
+ );
203
+ const storedTaskTargets = existingTask?.target_repositories?.length
204
+ ? existingTask.target_repositories
205
+ : undefined;
206
+ // Omitted targetRepositories inherit the current slice default first.
207
+ // Fall back to the stored task target only when that inherited scope
208
+ // rejects the replan paths, preserving explicit per-task parent-root work.
209
+ if (pathScopeError && params.targetRepositories === undefined && storedTaskTargets) {
210
+ const storedRepoValidationError = validateReferencedRepositories(storedTaskTargets, repositoryRegistry);
211
+ const storedPathScopeError = storedRepoValidationError
212
+ ? storedRepoValidationError
213
+ : validatePathScopeForTargetRepositories(params, basePath, repositoryRegistry, storedTaskTargets);
214
+ if (!storedPathScopeError) {
215
+ effectiveTargetRepositories = storedTaskTargets;
216
+ pathScopeError = null;
217
+ }
218
+ }
219
+ if (pathScopeError) {
220
+ guardError = `validation failed: ${pathScopeError}`;
221
+ return;
222
+ }
223
+
110
224
  if (!existingTask) {
111
225
  insertTask({
112
226
  id: params.taskId,
@@ -126,7 +240,11 @@ export async function handlePlanTask(
126
240
  expectedOutput: params.expectedOutput,
127
241
  observabilityImpact: params.observabilityImpact ?? "",
128
242
  fullPlanMd: params.fullPlanMd,
243
+ targetRepositories: effectiveTargetRepositories,
129
244
  });
245
+ for (const gid of taskGates) {
246
+ insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: params.taskId });
247
+ }
130
248
  });
131
249
  } catch (err) {
132
250
  return { error: `db write failed: ${(err as Error).message}` };
@@ -142,17 +260,22 @@ export async function handlePlanTask(
142
260
  // Flat-phase: tasks live as checkboxes in the slice plan's <tasks> block,
143
261
  // not as standalone TID-PLAN.md files. Re-render the slice plan so the
144
262
  // new/updated task appears in the plan file that gsd-core reads.
145
- // Guard: resolveTasksDir is null in flat-phase (no tasks/ subdir exists);
146
- // only sync if a slice plan already exists (guards pre-plan-slice calls).
263
+ // Guard: resolveTasksDir is null in flat-phase (no tasks/ subdir exists).
264
+ let slicePlanSynced = false;
147
265
  try {
148
266
  const tDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
149
- if (!tDir && resolveSliceFile(basePath, params.milestoneId, params.sliceId, "PLAN")) {
267
+ if (!tDir) {
150
268
  await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
269
+ slicePlanSynced = true;
151
270
  }
152
271
  } catch (syncErr) {
153
272
  logWarning("tool", `plan-task: slice-plan sync failed: ${(syncErr as Error).message}`);
154
273
  }
155
274
 
275
+ if (slicePlanSynced) {
276
+ setSliceSketchFlag(params.milestoneId, params.sliceId, false);
277
+ }
278
+
156
279
  invalidateStateCache();
157
280
  clearParseCache();
158
281
 
@@ -53,11 +53,13 @@ import { loadEffectiveGSDPreferences } from "../preferences.js";
53
53
  import { parseProject } from "../schemas/parsers.js";
54
54
  import { autoSession, getAutoRuntimeSnapshot, isAutoActive } from "../auto-runtime-state.js";
55
55
  import { renderPlanFromDb } from "../markdown-renderer.js";
56
+ import { readUnitHarnessAbort, type UnitHarnessAbortRecord } from "../unit-runtime.js";
56
57
  import {
57
58
  prepareUatRun,
58
59
  saveUatAttemptArtifact,
59
60
  type UatResultSaveParams,
60
61
  } from "../uat-run.js";
62
+ import { appendNotification } from "../notification-store.js";
61
63
  import { registerAutoWorker, markWorkerStopping, getAutoWorker } from "../db/auto-workers.js";
62
64
  import {
63
65
  claimMilestoneLease,
@@ -116,6 +118,48 @@ function blockIfWrongAutoUnit(requiredUnitType: string, operation: string): Tool
116
118
  };
117
119
  }
118
120
 
121
+ function blockIfHarnessAbortedUnit(operation: string, basePath: string): ToolExecutionResult | null {
122
+ const snapshot = getAutoRuntimeSnapshot();
123
+ if (!snapshot.active || !snapshot.currentUnit) return null;
124
+
125
+ const abort = readUnitHarnessAbort(
126
+ snapshot.basePath || basePath,
127
+ snapshot.currentUnit.type,
128
+ snapshot.currentUnit.id,
129
+ snapshot.currentUnit.startedAt,
130
+ );
131
+ if (!abort) return null;
132
+
133
+ return harnessAbortResult(operation, snapshot.currentUnit.type, snapshot.currentUnit.id, abort);
134
+ }
135
+
136
+ function harnessAbortResult(
137
+ operation: string,
138
+ unitType: string,
139
+ unitId: string,
140
+ abort: UnitHarnessAbortRecord,
141
+ ): ToolExecutionResult {
142
+ const toolText = abort.toolName ? ` while calling ${abort.toolName}` : "";
143
+ const message =
144
+ `Retryable harness abort: ${unitType} ${unitId} was truncated by ${abort.kind}${toolText}. ` +
145
+ "This gate result was not saved; leave the gate pending so auto-mode can rerun it.";
146
+ return {
147
+ content: [{ type: "text", text: message }],
148
+ details: {
149
+ operation,
150
+ error: "harness_aborted_needs_retry",
151
+ retryable: true,
152
+ unitType,
153
+ unitId,
154
+ harnessAbortKind: abort.kind,
155
+ harnessAbortReason: abort.reason,
156
+ harnessAbortToolName: abort.toolName,
157
+ harnessAbortCount: abort.count,
158
+ },
159
+ isError: true,
160
+ };
161
+ }
162
+
119
163
  function milestoneLeaseConflictResult(
120
164
  milestoneId: string,
121
165
  byWorker: string,
@@ -1135,6 +1179,9 @@ export async function executeSaveGateResult(
1135
1179
  params: SaveGateResultParams,
1136
1180
  basePath: string = process.cwd(),
1137
1181
  ): Promise<ToolExecutionResult> {
1182
+ const harnessAbort = blockIfHarnessAbortedUnit("save_gate_result", basePath);
1183
+ if (harnessAbort) return harnessAbort;
1184
+
1138
1185
  const dbAvailable = await ensureDbOpen(basePath);
1139
1186
  if (!dbAvailable) {
1140
1187
  return {
@@ -1206,6 +1253,9 @@ export async function executeUatResultSave(
1206
1253
  const unitGuard = blockIfWrongAutoUnit("run-uat", "save_uat_result");
1207
1254
  if (unitGuard) return unitGuard;
1208
1255
 
1256
+ const harnessAbort = blockIfHarnessAbortedUnit("save_uat_result", basePath);
1257
+ if (harnessAbort) return harnessAbort;
1258
+
1209
1259
  const dbAvailable = await ensureDbOpen(basePath);
1210
1260
  if (!dbAvailable) return errorResult("save_uat_result", "GSD database is not available.", "db_unavailable");
1211
1261
 
@@ -1268,6 +1318,14 @@ export async function executeUatResultSave(
1268
1318
  evaluatedAt: run.evaluatedAt,
1269
1319
  });
1270
1320
  invalidateStateCache();
1321
+ if (run.hasHuman) {
1322
+ appendNotification(
1323
+ `UAT for ${run.params.milestoneId}/${run.params.sliceId} has NEEDS-HUMAN checks awaiting human validation`,
1324
+ "warning",
1325
+ "notify",
1326
+ { kind: "uat-needs-human", scope: `${run.params.milestoneId}/${run.params.sliceId}` },
1327
+ );
1328
+ }
1271
1329
  const savedText = `UAT result saved for ${run.params.milestoneId}/${run.params.sliceId}: ${run.params.verdict}`;
1272
1330
  return {
1273
1331
  content: [{