@opengsd/gsd-pi 1.3.0-dev.65546769 → 1.3.0-dev.965d1788

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 (411) hide show
  1. package/README.md +1 -1
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +11 -2
  4. package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
  5. package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
  6. package/dist/resources/extensions/gsd/auto/orchestrator.js +12 -3
  7. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  8. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  9. package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
  10. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  12. package/dist/resources/extensions/gsd/auto-prompts.js +26 -11
  13. package/dist/resources/extensions/gsd/auto-recovery.js +6 -507
  14. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
  15. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
  16. package/dist/resources/extensions/gsd/auto-verification.js +5 -2
  17. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -13
  18. package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +38 -0
  19. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +6 -1
  20. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
  21. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +16 -19
  22. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -19
  23. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +68 -10
  24. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  25. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
  26. package/dist/resources/extensions/gsd/commands-context.js +19 -1
  27. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -10
  28. package/dist/resources/extensions/gsd/commands-worktree.js +12 -10
  29. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -3
  30. package/dist/resources/extensions/gsd/db/queries.js +60 -0
  31. package/dist/resources/extensions/gsd/db-workspace.js +55 -3
  32. package/dist/resources/extensions/gsd/doctor-providers.js +92 -8
  33. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
  34. package/dist/resources/extensions/gsd/exec-sandbox.js +45 -9
  35. package/dist/resources/extensions/gsd/flat-phase-migration.js +45 -0
  36. package/dist/resources/extensions/gsd/forensics.js +2 -32
  37. package/dist/resources/extensions/gsd/git-service.js +5 -4
  38. package/dist/resources/extensions/gsd/gitignore.js +3 -0
  39. package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
  40. package/dist/resources/extensions/gsd/health-widget.js +55 -29
  41. package/dist/resources/extensions/gsd/json-persistence.js +20 -0
  42. package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
  43. package/dist/resources/extensions/gsd/layout-policy.js +3 -1
  44. package/dist/resources/extensions/gsd/markdown-renderer.js +8 -9
  45. package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
  46. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
  47. package/dist/resources/extensions/gsd/metrics.js +4 -4
  48. package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
  49. package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
  50. package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
  51. package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
  52. package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
  53. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  54. package/dist/resources/extensions/gsd/quick.js +45 -2
  55. package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
  56. package/dist/resources/extensions/gsd/session-forensics.js +11 -1
  57. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  58. package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
  59. package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
  60. package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
  61. package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
  62. package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
  63. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +45 -2
  64. package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
  65. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
  66. package/dist/resources/extensions/gsd/state.js +12 -611
  67. package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
  68. package/dist/resources/extensions/gsd/tools/complete-slice.js +2 -2
  69. package/dist/resources/extensions/gsd/tools/complete-task.js +43 -14
  70. package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
  71. package/dist/resources/extensions/gsd/undo.js +43 -6
  72. package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
  73. package/dist/resources/extensions/gsd/unit-registry.js +32 -4
  74. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +33 -3
  75. package/dist/resources/extensions/gsd/validation-block-guard.js +9 -4
  76. package/dist/resources/extensions/gsd/verification-gate.js +7 -0
  77. package/dist/resources/extensions/gsd/workflow-manifest.js +4 -1
  78. package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
  79. package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
  80. package/dist/resources/extensions/gsd/worktree-manager.js +44 -2
  81. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  82. package/dist/web/standalone/.next/BUILD_ID +1 -1
  83. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  84. package/dist/web/standalone/.next/build-manifest.json +3 -3
  85. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  86. package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
  87. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/index.html +1 -1
  107. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  108. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  109. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  110. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  115. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  118. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  119. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  120. package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
  121. package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
  122. package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
  123. package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
  124. package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
  125. package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
  126. package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
  127. package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
  128. package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
  129. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  130. package/package.json +1 -1
  131. package/packages/cloud-mcp-gateway/package.json +2 -2
  132. package/packages/contracts/dist/workflow.d.ts +1 -0
  133. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  134. package/packages/contracts/dist/workflow.js +2 -0
  135. package/packages/contracts/dist/workflow.js.map +1 -1
  136. package/packages/contracts/package.json +1 -1
  137. package/packages/daemon/package.json +4 -4
  138. package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
  139. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  140. package/packages/gsd-agent-core/dist/agent-session.js +3 -0
  141. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  142. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
  143. package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
  144. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
  145. package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
  146. package/packages/gsd-agent-core/dist/index.d.ts +2 -0
  147. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  148. package/packages/gsd-agent-core/dist/index.js +2 -0
  149. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  150. package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
  151. package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
  152. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
  153. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  154. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  155. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
  156. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  157. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
  158. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  159. package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
  160. package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
  161. package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
  162. package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
  163. package/packages/gsd-agent-core/package.json +5 -5
  164. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  165. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  166. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
  167. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  168. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
  169. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
  170. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
  171. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
  172. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
  173. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  174. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -829
  175. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  176. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
  177. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
  178. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
  179. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
  180. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
  181. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
  182. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
  183. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
  184. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
  185. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
  186. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +258 -0
  187. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
  188. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
  189. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
  190. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
  191. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
  192. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
  193. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  194. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  196. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
  197. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
  198. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
  199. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
  200. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  202. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
  203. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  204. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
  205. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
  206. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
  207. package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
  208. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
  209. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
  211. package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
  212. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
  214. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  215. package/packages/gsd-agent-modes/package.json +7 -7
  216. package/packages/mcp-server/README.md +1 -1
  217. package/packages/mcp-server/dist/server.d.ts +1 -1
  218. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  219. package/packages/mcp-server/dist/server.js +3 -3
  220. package/packages/mcp-server/dist/server.js.map +1 -1
  221. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  222. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  223. package/packages/mcp-server/dist/workflow-tools.js +34 -20
  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/package.json +1 -1
  229. package/packages/pi-coding-agent/README.md +3 -2
  230. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
  231. package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
  232. package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
  233. package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
  234. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
  235. package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
  236. package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
  237. package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
  238. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
  239. package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
  240. package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
  241. package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
  242. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
  243. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
  245. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
  247. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
  249. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
  251. package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
  252. package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
  253. package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  255. package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
  256. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  257. package/packages/pi-coding-agent/package.json +7 -7
  258. package/packages/pi-tui/package.json +2 -2
  259. package/packages/rpc-client/package.json +2 -2
  260. package/pkg/dist/theme/theme-schema.d.ts +75 -75
  261. package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
  262. package/pkg/dist/theme/theme-schema.js +1 -1
  263. package/pkg/dist/theme/theme-schema.js.map +1 -1
  264. package/pkg/dist/theme/theme.d.ts.map +1 -1
  265. package/pkg/dist/theme/theme.js +11 -7
  266. package/pkg/dist/theme/theme.js.map +1 -1
  267. package/pkg/package.json +1 -1
  268. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +20 -2
  269. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +80 -0
  270. package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
  271. package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
  272. package/src/resources/extensions/gsd/auto/orchestrator.ts +25 -11
  273. package/src/resources/extensions/gsd/auto/session.ts +6 -0
  274. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
  275. package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
  276. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -23
  277. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  278. package/src/resources/extensions/gsd/auto-prompts.ts +38 -12
  279. package/src/resources/extensions/gsd/auto-recovery.ts +10 -508
  280. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
  281. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
  282. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  283. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +125 -12
  284. package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +43 -0
  285. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +6 -1
  286. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
  287. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +20 -19
  288. package/src/resources/extensions/gsd/bootstrap/system-context.ts +52 -18
  289. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +74 -10
  290. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  291. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
  292. package/src/resources/extensions/gsd/commands-context.ts +18 -1
  293. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +14 -9
  294. package/src/resources/extensions/gsd/commands-worktree.ts +12 -10
  295. package/src/resources/extensions/gsd/dashboard-overlay.ts +32 -3
  296. package/src/resources/extensions/gsd/db/queries.ts +79 -0
  297. package/src/resources/extensions/gsd/db-workspace.ts +61 -3
  298. package/src/resources/extensions/gsd/doctor-providers.ts +103 -9
  299. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
  300. package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
  301. package/src/resources/extensions/gsd/flat-phase-migration.ts +44 -0
  302. package/src/resources/extensions/gsd/forensics.ts +2 -33
  303. package/src/resources/extensions/gsd/git-service.ts +6 -5
  304. package/src/resources/extensions/gsd/gitignore.ts +3 -0
  305. package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
  306. package/src/resources/extensions/gsd/health-widget.ts +69 -32
  307. package/src/resources/extensions/gsd/json-persistence.ts +20 -0
  308. package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
  309. package/src/resources/extensions/gsd/layout-policy.ts +2 -1
  310. package/src/resources/extensions/gsd/markdown-renderer.ts +8 -11
  311. package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
  312. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
  313. package/src/resources/extensions/gsd/metrics.ts +4 -4
  314. package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
  315. package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
  316. package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
  317. package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
  318. package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
  319. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  320. package/src/resources/extensions/gsd/quick.ts +43 -2
  321. package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
  322. package/src/resources/extensions/gsd/session-forensics.ts +11 -1
  323. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -1
  324. package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
  325. package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
  326. package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
  327. package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
  328. package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
  329. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +81 -7
  330. package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
  331. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
  332. package/src/resources/extensions/gsd/state.ts +32 -732
  333. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
  334. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
  335. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +111 -1
  336. package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
  337. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
  338. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
  339. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
  340. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
  341. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +11 -0
  342. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
  343. package/src/resources/extensions/gsd/tests/complete-task.test.ts +75 -0
  344. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +55 -2
  345. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
  346. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
  347. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
  348. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +107 -0
  349. package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
  350. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
  351. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
  352. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +37 -2
  353. package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
  354. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
  355. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
  356. package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
  357. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
  358. package/src/resources/extensions/gsd/tests/integration/queue-active-milestone-context-budget.test.ts +93 -0
  359. package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
  360. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
  361. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
  362. package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +14 -0
  363. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -0
  364. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
  365. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
  366. package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
  367. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
  368. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +43 -1
  369. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
  370. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +26 -0
  371. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +2 -1
  372. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  373. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +10 -0
  374. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +54 -1
  375. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
  376. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +195 -1
  377. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -0
  378. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +87 -0
  379. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -0
  380. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +56 -0
  381. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  382. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +151 -0
  383. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +26 -0
  384. package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
  385. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +193 -14
  386. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +25 -0
  387. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +79 -0
  388. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
  389. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +66 -0
  390. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +54 -0
  391. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
  392. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
  393. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  394. package/src/resources/extensions/gsd/tools/complete-slice.ts +2 -2
  395. package/src/resources/extensions/gsd/tools/complete-task.ts +53 -15
  396. package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
  397. package/src/resources/extensions/gsd/undo.ts +47 -6
  398. package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
  399. package/src/resources/extensions/gsd/unit-registry.ts +32 -4
  400. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +41 -5
  401. package/src/resources/extensions/gsd/validation-block-guard.ts +13 -7
  402. package/src/resources/extensions/gsd/verification-gate.ts +8 -0
  403. package/src/resources/extensions/gsd/workflow-manifest.ts +4 -1
  404. package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
  405. package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
  406. package/src/resources/extensions/gsd/worktree-manager.ts +41 -1
  407. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
  408. package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
  409. package/dist/web/standalone/.next/static/chunks/webpack-f46ea08200a0227e.js +0 -1
  410. /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → -ji77QJck2IKIwrGza1Bs}/_buildManifest.js +0 -0
  411. /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → -ji77QJck2IKIwrGza1Bs}/_ssgManifest.js +0 -0
@@ -98,7 +98,13 @@ export const UNIT_REGISTRY = {
98
98
  scopeClass: "standard",
99
99
  phaseChain: ["research"],
100
100
  toolContract: {
101
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
101
+ allowedGsdTools: [
102
+ "gsd_summary_save",
103
+ "gsd_decision_save",
104
+ "gsd_exec",
105
+ "gsd_exec_search",
106
+ "gsd_resume",
107
+ ],
102
108
  requiredWorkflowTools: ["gsd_summary_save"],
103
109
  },
104
110
  },
@@ -154,7 +160,15 @@ export const UNIT_REGISTRY = {
154
160
  scopeClass: "section-close",
155
161
  phaseChain: ["validation", "planning"],
156
162
  toolContract: {
157
- allowedGsdTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
163
+ allowedGsdTools: [
164
+ "gsd_milestone_status",
165
+ "gsd_exec",
166
+ "gsd_exec_search",
167
+ "gsd_resume",
168
+ "gsd_validate_milestone",
169
+ "gsd_reassess_roadmap",
170
+ "subagent",
171
+ ],
158
172
  requiredWorkflowTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"],
159
173
  },
160
174
  },
@@ -165,6 +179,9 @@ export const UNIT_REGISTRY = {
165
179
  toolContract: {
166
180
  allowedGsdTools: [
167
181
  "gsd_milestone_status",
182
+ "gsd_exec",
183
+ "gsd_exec_search",
184
+ "gsd_resume",
168
185
  "gsd_requirement_update",
169
186
  "gsd_summary_save",
170
187
  "gsd_complete_milestone",
@@ -244,6 +261,8 @@ export const UNIT_REGISTRY = {
244
261
  allowedGsdTools: [
245
262
  "gsd_milestone_status",
246
263
  "gsd_exec",
264
+ "gsd_exec_search",
265
+ "gsd_resume",
247
266
  "gsd_slice_complete",
248
267
  "gsd_task_reopen",
249
268
  "gsd_replan_slice",
@@ -326,7 +345,13 @@ export const UNIT_REGISTRY = {
326
345
  scopeClass: "execute-task",
327
346
  phaseChain: ["execution"],
328
347
  toolContract: {
329
- allowedGsdTools: ["gsd_task_complete", "gsd_summary_save", "gsd_decision_save"],
348
+ allowedGsdTools: [
349
+ "gsd_milestone_status",
350
+ "gsd_task_complete",
351
+ "gsd_exec",
352
+ "gsd_summary_save",
353
+ "gsd_decision_save",
354
+ ],
330
355
  requiredWorkflowTools: ["gsd_task_complete", "gsd_summary_save"],
331
356
  },
332
357
  },
@@ -413,12 +438,15 @@ export const UNIT_REGISTRY = {
413
438
  requiredWorkflowTools: ["ask_user_questions"],
414
439
  },
415
440
  },
441
+ // research-project dispatches 4 parallel scout subagents (Task calls); each scout
442
+ // writes one file under .gsd/research/ directly. The parent coordinator does not
443
+ // call gsd_summary_save or gsd_decision_save — the scouts own their own output.
416
444
  "research-project": {
417
445
  kind: "primary",
418
446
  scopeClass: "standard",
419
447
  phaseChain: ["research"],
420
448
  toolContract: {
421
- allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
449
+ allowedGsdTools: [],
422
450
  requiredWorkflowTools: [],
423
451
  },
424
452
  },
@@ -1,6 +1,8 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: Block new workflow entry when completed milestone branches are still unmerged.
3
3
 
4
+ import { execFileSync } from "node:child_process";
5
+
4
6
  import {
5
7
  nativeBranchExists,
6
8
  nativeDetectMainBranch,
@@ -12,17 +14,23 @@ import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
12
14
  import { getAllMilestones } from "./gsd-db.js";
13
15
  import { resolveMilestoneIntegrationBranch } from "./git-service.js";
14
16
  import { loadEffectiveGSDPreferences } from "./preferences.js";
15
- import { captureRootDirtySnapshot, type RootDirtyEntry } from "./root-write-leak-guard.js";
16
17
  import { isClosedStatus } from "./status-guards.js";
17
18
 
19
+ export interface UnmergedMilestoneDirtyEntry {
20
+ path: string;
21
+ status: string;
22
+ }
23
+
18
24
  export interface UnmergedMilestoneBlocker {
19
25
  milestoneId: string;
20
26
  branch: string;
21
27
  integrationBranch: string;
22
28
  files: string[];
23
- dirtyOverlap: RootDirtyEntry[];
29
+ dirtyOverlap: UnmergedMilestoneDirtyEntry[];
24
30
  }
25
31
 
32
+ type UnmergedMilestoneDirtySnapshot = Map<string, UnmergedMilestoneDirtyEntry>;
33
+
26
34
  const BLOCKED_COMMANDS = new Set([
27
35
  "auto",
28
36
  "next",
@@ -67,6 +75,32 @@ function isRuntimePath(path: string): boolean {
67
75
  return path === ".gsd" || path.startsWith(".gsd/");
68
76
  }
69
77
 
78
+ function captureDirtyPathStatusSnapshot(rootPath: string): UnmergedMilestoneDirtySnapshot {
79
+ const snapshot: UnmergedMilestoneDirtySnapshot = new Map();
80
+ let status = "";
81
+ try {
82
+ status = execFileSync("git", ["status", "--porcelain", "--untracked-files=all"], {
83
+ cwd: rootPath,
84
+ stdio: ["ignore", "pipe", "pipe"],
85
+ encoding: "utf-8",
86
+ });
87
+ } catch {
88
+ return snapshot;
89
+ }
90
+
91
+ for (const line of status.split("\n")) {
92
+ if (!line.trim()) continue;
93
+ const code = line.slice(0, 2);
94
+ const path = line.slice(3).replace(/^"|"$/g, "");
95
+ if (!path || isRuntimePath(path)) continue;
96
+ snapshot.set(path, {
97
+ path,
98
+ status: code.trim() || code,
99
+ });
100
+ }
101
+ return snapshot;
102
+ }
103
+
70
104
  function formatCommandLabel(attemptedCommand: string): string {
71
105
  const trimmed = attemptedCommand.trim();
72
106
  return trimmed ? `/gsd ${trimmed}` : "/gsd";
@@ -132,7 +166,7 @@ export async function findUnmergedCompletedMilestones(base: string): Promise<Unm
132
166
  await ensureDbOpen(base);
133
167
 
134
168
  const blockers: UnmergedMilestoneBlocker[] = [];
135
- const dirtyByPath = captureRootDirtySnapshot(base);
169
+ let dirtyByPath: UnmergedMilestoneDirtySnapshot | null = null;
136
170
 
137
171
  for (const milestone of getAllMilestones()) {
138
172
  if (!isClosedStatus(milestone.status)) continue;
@@ -158,14 +192,16 @@ export async function findUnmergedCompletedMilestones(base: string): Promise<Unm
158
192
  const uniqueFiles = [...new Set(files)].sort();
159
193
  if (uniqueFiles.length === 0) continue;
160
194
 
195
+ if (!dirtyByPath) dirtyByPath = captureDirtyPathStatusSnapshot(base);
196
+ const dirtySnapshot = dirtyByPath;
161
197
  blockers.push({
162
198
  milestoneId: milestone.id,
163
199
  branch,
164
200
  integrationBranch,
165
201
  files: uniqueFiles,
166
202
  dirtyOverlap: uniqueFiles
167
- .map((path) => dirtyByPath.get(path))
168
- .filter((entry): entry is RootDirtyEntry => Boolean(entry)),
203
+ .map((path) => dirtySnapshot.get(path))
204
+ .filter((entry): entry is UnmergedMilestoneDirtyEntry => Boolean(entry)),
169
205
  });
170
206
  }
171
207
 
@@ -7,7 +7,7 @@ import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
7
7
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
8
8
  import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
9
9
  import { getIsolationMode } from "./preferences.js";
10
- import { deriveState } from "./state.js";
10
+ import { deriveState, invalidateStateCache } from "./state.js";
11
11
  import type { GSDState } from "./types.js";
12
12
  import { detectWorktreeName } from "./worktree.js";
13
13
 
@@ -133,12 +133,7 @@ export function formatValidationBlockedMessage(
133
133
  ].join("\n\n");
134
134
  }
135
135
 
136
- export async function getValidationBlockMessageForBase(
137
- base: string,
138
- attemptedCommand = "",
139
- ): Promise<string | null> {
140
- await ensureDbOpen(base);
141
- refreshWorkflowDatabaseFromDisk();
136
+ async function deriveValidationBlockState(base: string): Promise<GSDState> {
142
137
  let state = await deriveState(base);
143
138
 
144
139
  if (
@@ -153,5 +148,16 @@ export async function getValidationBlockMessageForBase(
153
148
  }
154
149
  }
155
150
 
151
+ return state;
152
+ }
153
+
154
+ export async function getValidationBlockMessageForBase(
155
+ base: string,
156
+ attemptedCommand = "",
157
+ ): Promise<string | null> {
158
+ await ensureDbOpen(base);
159
+ refreshWorkflowDatabaseFromDisk();
160
+ invalidateStateCache();
161
+ const state = await deriveValidationBlockState(base);
156
162
  return formatValidationBlockedMessage(state, attemptedCommand);
157
163
  }
@@ -244,6 +244,14 @@ export function formatFailureContext(result: VerificationResult): string {
244
244
  return header + body;
245
245
  }
246
246
 
247
+ export function formatFailureSignature(result: VerificationResult): string {
248
+ return result.checks
249
+ .filter((check) => check.exitCode !== 0)
250
+ .map((check) => `${check.command.trim()}#${check.exitCode}`)
251
+ .sort()
252
+ .join("\n");
253
+ }
254
+
247
255
  // ─── Gate Execution ─────────────────────────────────────────────────────────
248
256
 
249
257
  /** Characters that indicate shell control syntax when unquoted in a command string. */
@@ -414,9 +414,12 @@ function restoreArtifactProjections(basePath: string, manifest: StateManifest):
414
414
  if (manifest.artifacts === undefined) return;
415
415
 
416
416
  for (const artifact of manifest.artifacts) {
417
+ const content = artifact.full_content ?? "";
418
+ if (content === "") continue;
419
+
417
420
  atomicWriteSync(
418
421
  artifactProjectionPath(basePath, artifact.path),
419
- artifact.full_content ?? "",
422
+ content,
420
423
  );
421
424
  }
422
425
  }
@@ -451,16 +451,14 @@ export async function renderStateProjection(basePath: string): Promise<void> {
451
451
  }
452
452
  }
453
453
 
454
- // ─── renderAllProjections ───────────────────────────────────────────────
454
+ // ─── renderMilestoneShellProjections ─────────────────────────────────────
455
455
 
456
456
  /**
457
- * Regenerate all projection files for a milestone from DB state.
458
- * All calls are wrapped in try/catch projection failure is non-fatal per D-02.
457
+ * Regenerate milestone-level projections (roadmap, top-level views, STATE.md).
458
+ * Does not touch slice PLAN.md or task SUMMARY.md those have authoritative
459
+ * renderers in plan-slice / complete-task.
459
460
  */
460
- export async function renderAllProjections(basePath: string, milestoneId: string): Promise<void> {
461
- // Delegate to the authoritative roadmap renderer — the reduced
462
- // renderRoadmapProjection omits sections like ## Boundary Map and would
463
- // clobber the output written by plan-milestone / reassess-roadmap.
461
+ export async function renderMilestoneShellProjections(basePath: string, milestoneId: string): Promise<void> {
464
462
  try {
465
463
  await renderRoadmapFromDb(basePath, milestoneId);
466
464
  } catch (err) {
@@ -476,6 +474,21 @@ export async function renderAllProjections(basePath: string, milestoneId: string
476
474
  } catch (err) {
477
475
  logWarning("projection", `renderTopLevelQueueFromDb failed: ${(err as Error).message}`);
478
476
  }
477
+ try {
478
+ await renderStateProjection(basePath);
479
+ } catch (err) {
480
+ logWarning("projection", `renderStateProjection failed: ${(err as Error).message}`);
481
+ }
482
+ }
483
+
484
+ // ─── renderAllProjections ───────────────────────────────────────────────
485
+
486
+ /**
487
+ * Regenerate all projection files for a milestone from DB state.
488
+ * All calls are wrapped in try/catch — projection failure is non-fatal per D-02.
489
+ */
490
+ export async function renderAllProjections(basePath: string, milestoneId: string): Promise<void> {
491
+ await renderMilestoneShellProjections(basePath, milestoneId);
479
492
 
480
493
  // Query all slices for this milestone
481
494
  const sliceRows = getMilestoneSlices(milestoneId);
@@ -498,13 +511,6 @@ export async function renderAllProjections(basePath: string, milestoneId: string
498
511
  }
499
512
  }
500
513
  }
501
-
502
- // Render STATE.md
503
- try {
504
- await renderStateProjection(basePath);
505
- } catch (err) {
506
- logWarning("projection", `renderStateProjection failed: ${(err as Error).message}`);
507
- }
508
514
  }
509
515
 
510
516
  // ─── regenerateIfMissing ────────────────────────────────────────────────
@@ -7,6 +7,7 @@ import { getAutoWorktreePath } from "./auto-worktree.js";
7
7
  import { isSafeToAutoResolve } from "./auto-worktree.js";
8
8
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
9
9
  import {
10
+ listMergeStateBlockers,
10
11
  probeGitConflictState,
11
12
  reconcileGitConflictsOnSignal,
12
13
  type GitConflictProbeResult,
@@ -30,6 +31,9 @@ export type WorkspaceGitReadyResult =
30
31
  targets: string[];
31
32
  };
32
33
 
34
+ const CLEAN_TARGET_CACHE_TTL_MS = 10_000;
35
+ const cleanTargetProbeCache = new Map<string, number>();
36
+
33
37
  function normalizeTargetPath(path: string): string {
34
38
  try {
35
39
  return realpathSync(path);
@@ -110,6 +114,25 @@ function formatBlockReason(
110
114
 
111
115
  async function ensureTargetGitReady(target: string): Promise<WorkspaceGitReadyResult> {
112
116
  const fixesApplied: string[] = [];
117
+ const cacheKey = normalizeTargetPath(target);
118
+ const cachedCleanAt = cleanTargetProbeCache.get(cacheKey);
119
+ if (cachedCleanAt !== undefined) {
120
+ if (Date.now() - cachedCleanAt < CLEAN_TARGET_CACHE_TTL_MS) {
121
+ // Merge-state markers (MERGE_HEAD, rebase-apply, rebase-merge) are the most
122
+ // common way a repo transitions from clean to dirty within the TTL window,
123
+ // including when a non-git folder is initialized as a repo mid-TTL and a
124
+ // merge immediately introduces conflicts. Check them here — they are pure
125
+ // existsSync calls with no git subprocess — and fall through to a full probe
126
+ // only when markers are present.
127
+ if (listMergeStateBlockers(cacheKey).length === 0) {
128
+ return { ok: true, fixesApplied };
129
+ }
130
+ cleanTargetProbeCache.delete(cacheKey);
131
+ } else {
132
+ cleanTargetProbeCache.delete(cacheKey);
133
+ }
134
+ }
135
+
113
136
  let probe = probeGitConflictState(target);
114
137
 
115
138
  for (let attempt = 0; attempt < 3 && probe.status === "dirty"; attempt++) {
@@ -129,6 +152,7 @@ async function ensureTargetGitReady(target: string): Promise<WorkspaceGitReadyRe
129
152
  }
130
153
 
131
154
  if (probe.status === "unknown") {
155
+ cleanTargetProbeCache.delete(cacheKey);
132
156
  return {
133
157
  ok: false,
134
158
  reason: formatBlockReason("unrecoverable", [], [target]),
@@ -141,6 +165,7 @@ async function ensureTargetGitReady(target: string): Promise<WorkspaceGitReadyRe
141
165
 
142
166
  const conflictedPaths = productConflictPaths(probe);
143
167
  if (conflictedPaths.length > 0 || probe.checkFailures.length > 0) {
168
+ cleanTargetProbeCache.delete(cacheKey);
144
169
  return {
145
170
  ok: false,
146
171
  reason: formatBlockReason("product-conflicts", conflictedPaths, [target]),
@@ -151,6 +176,12 @@ async function ensureTargetGitReady(target: string): Promise<WorkspaceGitReadyRe
151
176
  };
152
177
  }
153
178
 
179
+ if (probe.status === "clean") {
180
+ cleanTargetProbeCache.set(cacheKey, Date.now());
181
+ } else {
182
+ cleanTargetProbeCache.delete(cacheKey);
183
+ }
184
+
154
185
  return { ok: true, fixesApplied };
155
186
  }
156
187
 
@@ -19,7 +19,7 @@
19
19
  * 4. remove() — git worktree remove + branch cleanup
20
20
  */
21
21
 
22
- import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, statSync } from "node:fs";
22
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, statSync, unlinkSync } from "node:fs";
23
23
  import { execFileSync } from "node:child_process";
24
24
  import { join, resolve, sep } from "node:path";
25
25
  import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
@@ -37,6 +37,7 @@ import {
37
37
  nativeGetCurrentBranch,
38
38
  nativeIsAncestor,
39
39
  nativeLogOneline,
40
+ nativeMergeAbort,
40
41
  nativeMergeSquash,
41
42
  nativeWorktreeAdd,
42
43
  nativeWorktreeList,
@@ -87,6 +88,34 @@ function deleteBranchIfPresent(basePath: string, branch: string, warningPrefix:
87
88
  }
88
89
  }
89
90
 
91
+ function cleanupFailedSquashMergeState(basePath: string): void {
92
+ try {
93
+ nativeMergeAbort(basePath);
94
+ } catch (e) {
95
+ // Squash conflicts may not create MERGE_HEAD; this is expected.
96
+ logWarning("worktree", `merge abort skipped: ${(e as Error).message}`);
97
+ }
98
+ try {
99
+ execFileSync("git", ["reset", "--merge"], {
100
+ cwd: basePath,
101
+ stdio: ["ignore", "pipe", "pipe"],
102
+ encoding: "utf-8",
103
+ });
104
+ } catch (e) {
105
+ logWarning("worktree", `failed squash merge reset failed: ${(e as Error).message}`);
106
+ }
107
+
108
+ const gitDir = resolveGitDir(basePath);
109
+ for (const marker of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
110
+ try {
111
+ const markerPath = join(gitDir, marker);
112
+ if (existsSync(markerPath)) unlinkSync(markerPath);
113
+ } catch (e) {
114
+ logWarning("worktree", `failed squash merge marker cleanup failed (${marker}): ${(e as Error).message}`);
115
+ }
116
+ }
117
+ }
118
+
90
119
  // ─── Path Helpers ──────────────────────────────────────────────────────────
91
120
 
92
121
  function normalizePathForComparison(path: string): string {
@@ -1086,6 +1115,17 @@ export function mergeWorktreeToMain(
1086
1115
 
1087
1116
  const result = nativeMergeSquash(basePath, branch);
1088
1117
  if (!result.success) {
1118
+ const dirtyWorkingTree = result.conflicts.includes("__dirty_working_tree__");
1119
+ if (!dirtyWorkingTree) {
1120
+ cleanupFailedSquashMergeState(basePath);
1121
+ }
1122
+ if (!dirtyWorkingTree && branch.startsWith("milestone/")) {
1123
+ try {
1124
+ removeWorktree(basePath, name, { branch, deleteBranch: true, force: true });
1125
+ } catch (e) {
1126
+ logWarning("worktree", `failed milestone branch cleanup after squash merge failure: ${(e as Error).message}`);
1127
+ }
1128
+ }
1089
1129
  throw new GSDError(GSD_MERGE_CONFLICT, `Merge conflicts detected in: ${result.conflicts.join(", ")}`);
1090
1130
  }
1091
1131
 
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2772],{72772:(e,s,t)=>{t.r(s),t.d(s,{Roadmap:()=>p});var d=t(18870),r=t(20607),a=t(53348),n=t(32457),l=t(62970),i=t(92893),c=t(78070),o=t(18833),x=t(93058),m=t(46054);let u=({status:e,size:s="default"})=>{let t="large"===s?"h-5 w-5":"h-4 w-4";return"done"===e?(0,d.jsx)(r.A,{className:(0,o.cn)(t,"text-success")}):"in-progress"===e?(0,d.jsx)(a.A,{className:(0,o.cn)(t,"text-warning")}):"parked"===e?(0,d.jsx)(n.A,{className:(0,o.cn)(t,"text-muted-foreground")}):(0,d.jsx)(l.A,{className:(0,o.cn)(t,"text-muted-foreground")})},h=({risk:e})=>(0,d.jsxs)("span",{className:(0,o.cn)("inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-medium uppercase","high"===e&&"bg-destructive/20 text-destructive","medium"===e&&"bg-warning/20 text-warning","low"===e&&"bg-muted text-muted-foreground"),children:["high"===e&&(0,d.jsx)(i.A,{className:"h-2.5 w-2.5"}),e]});function p(){let e=(0,x.gF)(),s=(0,x.Gr)(e),t=s?.milestones??[],r=s?.active??{},a=e.live.freshness.workspace.stale?"stale":e.live.freshness.workspace.status;return(0,d.jsxs)("div",{className:"flex h-full flex-col overflow-hidden",children:[(0,d.jsxs)("div",{className:"border-b border-border px-6 py-3",children:[(0,d.jsx)("h1",{className:"text-lg font-semibold",children:"Roadmap"}),(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:"Project milestone structure with slices and dependencies"}),(0,d.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground","data-testid":"roadmap-workspace-freshness",children:["Workspace freshness: ",a]})]}),(0,d.jsxs)("div",{className:"flex-1 overflow-y-auto p-6",children:["loading"===e.bootStatus&&(0,d.jsx)("div",{className:"py-8 text-center text-sm text-muted-foreground",children:"Loading workspace…"}),"ready"===e.bootStatus&&0===t.length&&(0,d.jsxs)("div",{className:"py-8 text-center text-sm text-muted-foreground",children:["No milestones found. Create a milestone with ",(0,d.jsx)("code",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-xs",children:"/gsd"})," to get started."]}),(0,d.jsx)("div",{className:"space-y-6",children:t.map(e=>{let s=(0,m.Jq)(e,r),t=e.slices.filter(e=>e.done).length,a=e.slices.reduce((e,s)=>e+s.tasks.length,0),n=e.slices.reduce((e,s)=>e+s.tasks.filter(e=>e.done).length,0);return(0,d.jsxs)("div",{className:"rounded-md border border-border bg-card",children:[(0,d.jsxs)("div",{className:(0,o.cn)("flex items-center gap-3 border-b border-border px-4 py-3","in-progress"===s&&"bg-accent/30"),children:[(0,d.jsx)(u,{status:s,size:"large"}),(0,d.jsx)("div",{className:"flex-1",children:(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:"font-mono text-xs text-muted-foreground",children:e.id}),(0,d.jsx)(c.A,{className:"h-3 w-3 text-muted-foreground"}),(0,d.jsx)("span",{className:"font-semibold",children:e.title})]})}),(0,d.jsxs)("div",{className:"text-right",children:[(0,d.jsxs)("div",{className:"text-sm font-medium",children:[t,"/",e.slices.length," slices"]}),(0,d.jsxs)("div",{className:"text-xs text-muted-foreground",children:[n,"/",a," tasks"]})]})]}),(0,d.jsx)("div",{className:"divide-y divide-border",children:e.slices.map(s=>{let t=(0,m.z3)(e.id,s,r),a=s.tasks.filter(e=>e.done).length,n=s.tasks.length;return(0,d.jsxs)("div",{className:(0,o.cn)("flex items-center gap-3 px-4 py-2.5","in-progress"===t&&"bg-accent/20","pending"===t&&"opacity-70","parked"===t&&"opacity-70"),children:[(0,d.jsx)("div",{className:"w-4"}),(0,d.jsx)(u,{status:t}),(0,d.jsx)("div",{className:"flex-1",children:(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:"font-mono text-xs text-muted-foreground",children:s.id}),(0,d.jsx)("span",{className:"text-sm",children:s.title}),s.risk&&(0,d.jsx)(h,{risk:s.risk}),s.depends&&s.depends.length>0&&(0,d.jsxs)("span",{className:"text-[10px] text-muted-foreground",children:["depends on ",s.depends.join(", ")]})]})}),(0,d.jsxs)("div",{className:"flex items-center gap-4",children:[(0,d.jsx)("div",{className:"w-24",children:(0,d.jsx)("div",{className:"h-1 w-full rounded-full bg-accent",children:(0,d.jsx)("div",{className:"h-full rounded-full bg-foreground/70 transition-[width]",style:{width:n>0?`${a/n*100}%`:"0%"}})})}),(0,d.jsxs)("span",{className:"w-12 text-right text-xs text-muted-foreground",children:[a,"/",n]})]})]},`${e.id}-${s.id}`)})})]},e.id)})})]})]})}}}]);