gsd-pi 2.81.0 → 2.82.0-dev.2841a1e44

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 (572) hide show
  1. package/README.md +63 -32
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/GSD-WORKFLOW.md +3 -1
  4. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  5. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  6. package/dist/resources/extensions/cmux/index.js +5 -0
  7. package/dist/resources/extensions/gsd/auto/loop.js +111 -8
  8. package/dist/resources/extensions/gsd/auto/orchestrator.js +113 -6
  9. package/dist/resources/extensions/gsd/auto/phases.js +199 -97
  10. package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
  11. package/dist/resources/extensions/gsd/auto/session.js +9 -0
  12. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
  13. package/dist/resources/extensions/gsd/auto-dashboard.js +182 -178
  14. package/dist/resources/extensions/gsd/auto-dispatch.js +14 -11
  15. package/dist/resources/extensions/gsd/auto-post-unit.js +176 -125
  16. package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
  17. package/dist/resources/extensions/gsd/auto-recovery.js +6 -181
  18. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  19. package/dist/resources/extensions/gsd/auto-start.js +20 -23
  20. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  21. package/dist/resources/extensions/gsd/auto-verification.js +38 -26
  22. package/dist/resources/extensions/gsd/auto-worktree.js +8 -0
  23. package/dist/resources/extensions/gsd/auto.js +371 -106
  24. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +13 -6
  25. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +13 -2
  26. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  27. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +16 -7
  28. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  29. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +3 -1
  30. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  31. package/dist/resources/extensions/gsd/commands/catalog.js +4 -1
  32. package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -1
  33. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  34. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
  35. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  36. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  37. package/dist/resources/extensions/gsd/context-store.js +112 -0
  38. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  39. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  40. package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
  41. package/dist/resources/extensions/gsd/git-service.js +2 -1
  42. package/dist/resources/extensions/gsd/gsd-db.js +7 -23
  43. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  44. package/dist/resources/extensions/gsd/health-widget.js +4 -10
  45. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  46. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  47. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  48. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  49. package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
  50. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  51. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  52. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  53. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  54. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  55. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  56. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  57. package/dist/resources/extensions/gsd/native-git-bridge.js +14 -14
  58. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  59. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  60. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  61. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  62. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  63. package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
  64. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  65. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  66. package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
  67. package/dist/resources/extensions/gsd/session-lock.js +40 -0
  68. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
  69. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +247 -0
  70. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +50 -0
  71. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +87 -0
  72. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
  73. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
  74. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
  75. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
  76. package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
  77. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
  78. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
  79. package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
  80. package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
  81. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  82. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  83. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  84. package/dist/resources/extensions/gsd/unit-context-manifest.js +25 -2
  85. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  86. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  87. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  88. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  89. package/dist/resources/extensions/gsd/worktree-lifecycle.js +743 -318
  90. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  91. package/dist/resources/extensions/subagent/index.js +448 -78
  92. package/dist/resources/extensions/subagent/launch.js +77 -0
  93. package/dist/resources/extensions/subagent/run-store.js +148 -0
  94. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  95. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  96. package/dist/resources/extensions/visual-brief/index.js +5 -0
  97. package/dist/resources/extensions/visual-brief/page-contract.js +122 -0
  98. package/dist/resources/extensions/visual-brief/prompts.js +111 -0
  99. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  100. package/dist/web/standalone/.next/BUILD_ID +1 -1
  101. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  102. package/dist/web/standalone/.next/build-manifest.json +4 -4
  103. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  104. package/dist/web/standalone/.next/react-loadable-manifest.json +3 -3
  105. package/dist/web/standalone/.next/required-server-files.json +3 -3
  106. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  107. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  117. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  126. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  145. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  165. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  175. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  181. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  197. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  201. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/index.html +1 -1
  211. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  212. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  213. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  214. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  216. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  217. package/dist/web/standalone/.next/server/app/page.js +2 -2
  218. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  220. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  221. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  222. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/middleware.js +2 -2
  225. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  227. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  228. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  229. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  230. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  231. package/dist/web/standalone/.next/static/chunks/{8359.e059d86b255fce1c.js → 8359.7eb3bb8f8ecf4c01.js} +2 -2
  232. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  233. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  234. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-6a95bc41e0f7ec89.js} +1 -1
  238. package/dist/web/standalone/.next/static/css/0262768ec1b89d34.css +1 -0
  239. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  240. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  241. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  242. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  243. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  244. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  245. package/dist/web/standalone/server.js +1 -1
  246. package/dist/welcome-screen.d.ts +0 -7
  247. package/dist/welcome-screen.js +60 -69
  248. package/package.json +5 -4
  249. package/packages/contracts/dist/rpc.test.js +7 -0
  250. package/packages/contracts/dist/rpc.test.js.map +1 -1
  251. package/packages/contracts/dist/workflow.d.ts +21 -0
  252. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  253. package/packages/contracts/dist/workflow.js +24 -0
  254. package/packages/contracts/dist/workflow.js.map +1 -1
  255. package/packages/contracts/src/rpc.test.ts +8 -0
  256. package/packages/contracts/src/workflow.ts +24 -0
  257. package/packages/daemon/package.json +2 -2
  258. package/packages/mcp-server/README.md +14 -3
  259. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  260. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  261. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  262. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  263. package/packages/mcp-server/package.json +2 -2
  264. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  265. package/packages/mcp-server/src/workflow-tools.test.ts +22 -0
  266. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  267. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  268. package/packages/native/package.json +1 -1
  269. package/packages/pi-agent-core/package.json +1 -1
  270. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  271. package/packages/pi-ai/dist/index.d.ts +2 -2
  272. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  273. package/packages/pi-ai/dist/index.js +1 -1
  274. package/packages/pi-ai/dist/index.js.map +1 -1
  275. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  276. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  277. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  278. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  279. package/packages/pi-ai/package.json +1 -1
  280. package/packages/pi-ai/src/index.ts +7 -2
  281. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  282. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  283. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  284. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  292. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  300. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  301. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  303. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  309. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  311. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  332. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  333. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  334. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  335. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  340. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  342. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  344. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  345. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  346. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  347. package/packages/pi-coding-agent/package.json +1 -1
  348. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  349. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  350. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
  351. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  352. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  353. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  354. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  355. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  356. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  357. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
  358. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
  359. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  360. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  361. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  362. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  363. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  364. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  365. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  366. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  367. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  368. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  369. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  370. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  372. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  373. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  374. package/packages/pi-tui/dist/tui.js +5 -0
  375. package/packages/pi-tui/dist/tui.js.map +1 -1
  376. package/packages/pi-tui/package.json +1 -1
  377. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  378. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  379. package/packages/pi-tui/src/tui.ts +6 -0
  380. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  381. package/packages/rpc-client/package.json +1 -1
  382. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  383. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  384. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  385. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  386. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  387. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  388. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  389. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  390. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  391. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  392. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  393. package/pkg/package.json +1 -1
  394. package/src/resources/GSD-WORKFLOW.md +3 -1
  395. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  396. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  397. package/src/resources/extensions/cmux/index.ts +6 -0
  398. package/src/resources/extensions/gsd/auto/contracts.ts +46 -11
  399. package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
  400. package/src/resources/extensions/gsd/auto/loop.ts +113 -9
  401. package/src/resources/extensions/gsd/auto/orchestrator.ts +118 -6
  402. package/src/resources/extensions/gsd/auto/phases.ts +158 -19
  403. package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
  404. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  405. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  406. package/src/resources/extensions/gsd/auto-dashboard.ts +230 -183
  407. package/src/resources/extensions/gsd/auto-dispatch.ts +15 -1
  408. package/src/resources/extensions/gsd/auto-post-unit.ts +201 -138
  409. package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
  410. package/src/resources/extensions/gsd/auto-recovery.ts +7 -209
  411. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  412. package/src/resources/extensions/gsd/auto-start.ts +22 -22
  413. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  414. package/src/resources/extensions/gsd/auto-verification.ts +46 -38
  415. package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
  416. package/src/resources/extensions/gsd/auto.ts +411 -106
  417. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +21 -6
  418. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -2
  419. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  420. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +16 -6
  421. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  422. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +3 -2
  423. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  424. package/src/resources/extensions/gsd/commands/catalog.ts +4 -1
  425. package/src/resources/extensions/gsd/commands/handlers/core.ts +25 -1
  426. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  427. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
  428. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  429. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  430. package/src/resources/extensions/gsd/context-store.ts +120 -1
  431. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  432. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  433. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  434. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  435. package/src/resources/extensions/gsd/git-service.ts +2 -0
  436. package/src/resources/extensions/gsd/gsd-db.ts +7 -23
  437. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  438. package/src/resources/extensions/gsd/health-widget.ts +6 -10
  439. package/src/resources/extensions/gsd/journal.ts +2 -0
  440. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  441. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  442. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  443. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  444. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
  445. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  446. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  447. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  448. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  449. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  450. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  451. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  452. package/src/resources/extensions/gsd/native-git-bridge.ts +14 -13
  453. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  454. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  455. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  456. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  457. package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  458. package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
  459. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  460. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  461. package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
  462. package/src/resources/extensions/gsd/session-lock.ts +41 -0
  463. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  464. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +337 -0
  465. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +69 -0
  466. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +109 -0
  467. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  468. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  469. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  470. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  471. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  472. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  473. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
  474. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  475. package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
  476. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  477. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  478. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +99 -0
  479. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +729 -176
  480. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +408 -4
  481. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +292 -4
  482. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
  483. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +18 -0
  484. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  485. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  486. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  487. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  488. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  489. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  490. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
  491. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  492. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  493. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  494. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +20 -2
  495. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +44 -0
  496. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
  497. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  498. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  499. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  500. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
  501. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  502. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  503. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +26 -0
  504. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  505. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
  506. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  507. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  508. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
  509. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  510. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  511. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  512. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  513. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
  514. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  515. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
  516. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  517. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  518. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  519. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  520. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
  521. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  522. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  523. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +81 -3
  524. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
  525. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
  526. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  527. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
  528. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
  529. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  530. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +24 -0
  531. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +71 -58
  532. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +952 -0
  533. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
  534. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
  535. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  536. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +21 -0
  537. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  538. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  539. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +6 -0
  540. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +158 -58
  541. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +597 -118
  542. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  543. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
  544. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  545. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  546. package/src/resources/extensions/gsd/unit-context-manifest.ts +35 -2
  547. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  548. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  549. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  550. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  551. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  552. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1171 -526
  553. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  554. package/src/resources/extensions/subagent/index.ts +567 -103
  555. package/src/resources/extensions/subagent/launch.ts +131 -0
  556. package/src/resources/extensions/subagent/run-store.ts +218 -0
  557. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  558. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  559. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  560. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  561. package/src/resources/extensions/visual-brief/index.ts +8 -0
  562. package/src/resources/extensions/visual-brief/page-contract.ts +134 -0
  563. package/src/resources/extensions/visual-brief/prompts.ts +147 -0
  564. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +172 -0
  565. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  566. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  567. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  568. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  569. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  570. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
  571. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → Qgr2B_MRhPxC0z8fwv4vT}/_buildManifest.js +0 -0
  572. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → Qgr2B_MRhPxC0z8fwv4vT}/_ssgManifest.js +0 -0
@@ -8,7 +8,7 @@
8
8
 
9
9
  import test from "node:test";
10
10
  import assert from "node:assert/strict";
11
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync, readFileSync, realpathSync } from "node:fs";
11
+ import { existsSync, mkdtempSync, mkdirSync, writeFileSync, rmSync, readFileSync, realpathSync } from "node:fs";
12
12
  import { join } from "node:path";
13
13
  import { tmpdir } from "node:os";
14
14
  import { execSync } from "node:child_process";
@@ -208,8 +208,8 @@ test("postflightPopStash conflict warning names the exact stash ref", () => {
208
208
  assert.match(postflight.message, /failed after merge of milestone M005C/);
209
209
 
210
210
  const warning = notifications.find((n) => n.level === "warning")?.msg ?? "";
211
- assert.match(warning, /git stash pop stash@\{\d+\}/);
212
211
  assert.match(warning, /git stash apply stash@\{\d+\}/);
212
+ assert.match(warning, /git stash drop stash@\{\d+\}/);
213
213
  } finally {
214
214
  try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
215
215
  }
@@ -279,3 +279,108 @@ test("postflightPopStash falls back to milestone marker prefix when exact marker
279
279
  try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
280
280
  }
281
281
  });
282
+
283
+ test("postflightPopStash preserves stash when untracked collision differs from merged file", () => {
284
+ const repo = createTempRepo();
285
+ try {
286
+ writeFileSync(join(repo, "tests.txt"), "local preflight test\n");
287
+ const preflight = preflightCleanRoot(repo, "M009", () => {});
288
+ assert.equal(preflight.stashPushed, true, "preflight must stash untracked file");
289
+
290
+ writeFileSync(join(repo, "tests.txt"), "merged milestone test\n");
291
+ run("git add tests.txt", repo);
292
+ run('git commit -m "feat: add merged test"', repo);
293
+
294
+ const notifications: Array<{ msg: string; level: string }> = [];
295
+ const postflight = postflightPopStash(repo, "M009", preflight.stashMarker, (msg, level) => {
296
+ notifications.push({ msg, level });
297
+ });
298
+
299
+ assert.equal(postflight.needsManualRecovery, false, "different already-present untracked files must not stop auto-mode");
300
+ assert.equal(postflight.resolution, "already-present-preserved");
301
+ assert.deepEqual(postflight.collidedPaths, ["tests.txt"]);
302
+ assert.equal(readFileSync(join(repo, "tests.txt"), "utf-8"), "merged milestone test\n");
303
+ assert.equal(run("git status --porcelain", repo), "", "merged file must stay clean");
304
+
305
+ const stashList = run("git stash list", repo);
306
+ assert.ok(preflight.stashMarker && stashList.includes(preflight.stashMarker), "stash backup must be preserved");
307
+ assert.ok(
308
+ notifications.some((n) => n.level === "warning" && n.msg.includes("preserving")),
309
+ "user must be warned that the stash was preserved as backup",
310
+ );
311
+ } finally {
312
+ try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
313
+ }
314
+ });
315
+
316
+ test("postflightPopStash drops stash when untracked collision is identical to merged file", () => {
317
+ const repo = createTempRepo();
318
+ try {
319
+ writeFileSync(join(repo, "tests.txt"), "same test content\n");
320
+ const preflight = preflightCleanRoot(repo, "M010", () => {});
321
+ assert.equal(preflight.stashPushed, true, "preflight must stash untracked file");
322
+
323
+ writeFileSync(join(repo, "tests.txt"), "same test content\n");
324
+ run("git add tests.txt", repo);
325
+ run('git commit -m "feat: add same test"', repo);
326
+
327
+ const postflight = postflightPopStash(repo, "M010", preflight.stashMarker, () => {});
328
+
329
+ assert.equal(postflight.needsManualRecovery, false, "identical already-present files must not stop auto-mode");
330
+ assert.equal(postflight.resolution, "already-present-dropped");
331
+ assert.equal(readFileSync(join(repo, "tests.txt"), "utf-8"), "same test content\n");
332
+
333
+ const stashList = run("git stash list", repo);
334
+ assert.ok(!stashList.includes(preflight.stashMarker ?? ""), "identical stash must be dropped");
335
+ } finally {
336
+ try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
337
+ }
338
+ });
339
+
340
+ test("postflightPopStash requires manual recovery for mixed tracked changes and untracked collision", () => {
341
+ const repo = createTempRepo();
342
+ try {
343
+ writeFileSync(join(repo, "README.md"), "# local tracked work\n");
344
+ writeFileSync(join(repo, "tests.txt"), "local untracked work\n");
345
+ const preflight = preflightCleanRoot(repo, "M011", () => {});
346
+ assert.equal(preflight.stashPushed, true, "preflight must stash mixed changes");
347
+
348
+ writeFileSync(join(repo, "tests.txt"), "merged milestone test\n");
349
+ run("git add tests.txt", repo);
350
+ run('git commit -m "feat: add merged test"', repo);
351
+
352
+ const postflight = postflightPopStash(repo, "M011", preflight.stashMarker, () => {});
353
+
354
+ assert.equal(postflight.needsManualRecovery, true, "tracked stash payload must still require manual recovery");
355
+ assert.equal(postflight.resolution, "manual-recovery");
356
+ const stashList = run("git stash list", repo);
357
+ assert.ok(preflight.stashMarker && stashList.includes(preflight.stashMarker), "mixed stash must be preserved");
358
+ } finally {
359
+ try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
360
+ }
361
+ });
362
+
363
+ test("postflightPopStash requires manual recovery when an untracked stash path is missing after collision", () => {
364
+ const repo = createTempRepo();
365
+ try {
366
+ writeFileSync(join(repo, "tests.txt"), "local untracked work\n");
367
+ writeFileSync(join(repo, "other-tests.txt"), "other local untracked work\n");
368
+ const preflight = preflightCleanRoot(repo, "M012", () => {});
369
+ assert.equal(preflight.stashPushed, true, "preflight must stash untracked files");
370
+
371
+ writeFileSync(join(repo, "tests.txt"), "merged milestone test\n");
372
+ run("git add tests.txt", repo);
373
+ run('git commit -m "feat: add one merged test"', repo);
374
+
375
+ const postflight = postflightPopStash(repo, "M012", preflight.stashMarker, () => {});
376
+
377
+ assert.equal(postflight.needsManualRecovery, true, "partial untracked restores must still require manual recovery");
378
+ assert.equal(postflight.resolution, "manual-recovery");
379
+ assert.equal(existsSync(join(repo, "other-tests.txt")), true, "git may partially restore the non-colliding path");
380
+ assert.match(run("git status --porcelain", repo), /\?\? other-tests\.txt/, "partial restore must leave manual recovery visible");
381
+ const stashList = run("git stash list", repo);
382
+ assert.ok(preflight.stashMarker && stashList.includes(preflight.stashMarker), "stash must remain for manual recovery");
383
+ } finally {
384
+ try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
385
+ }
386
+ });
@@ -0,0 +1,16 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Tests closeout git action deferral policy for auto-mode units.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+
7
+ import { shouldDeferCloseoutGitAction } from "../auto-post-unit.ts";
8
+
9
+ test("execute-task defers closeout git action until verification passes", () => {
10
+ assert.equal(shouldDeferCloseoutGitAction("execute-task"), true);
11
+ });
12
+
13
+ test("non execute-task units keep pre-verification closeout git action", () => {
14
+ assert.equal(shouldDeferCloseoutGitAction("plan-slice"), false);
15
+ assert.equal(shouldDeferCloseoutGitAction("complete-slice"), false);
16
+ });
@@ -0,0 +1,312 @@
1
+ // ADR-013 Phase 6 cutover (Stage 1) — queryDecisionsFromMemories parity test.
2
+ //
3
+ // Verifies that reading active decisions from the `memories` table returns
4
+ // the same Decision[] shape and content as the legacy `queryDecisions` read
5
+ // from the `decisions` table, once Phase 5 dual-write has populated both
6
+ // surfaces. Lock-in regression for the prompt-inline read path which was
7
+ // switched to the memories source in auto-prompts.ts:inlineDecisionsFromDb.
8
+ //
9
+ // Scope of parity: ACTIVE decisions only. Superseded rows are intentionally
10
+ // skipped by the existing backfill, so this test does not assert parity for
11
+ // the supersedes-chain — that gap is acknowledged in
12
+ // queryDecisionsFromMemories' contract and tracked for Stage 2/3.
13
+
14
+ import test from "node:test";
15
+ import assert from "node:assert/strict";
16
+ import { mkdtempSync, mkdirSync, rmSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { tmpdir } from "node:os";
19
+
20
+ import {
21
+ closeDatabase,
22
+ insertDecision,
23
+ openDatabase,
24
+ } from "../gsd-db.ts";
25
+ import { saveDecisionToDb } from "../db-writer.ts";
26
+ import {
27
+ queryDecisions,
28
+ queryDecisionsFromMemories,
29
+ } from "../context-store.ts";
30
+
31
+ function makeTmpBase(): string {
32
+ const base = mkdtempSync(join(tmpdir(), "gsd-decisions-memories-"));
33
+ mkdirSync(join(base, ".gsd"), { recursive: true });
34
+ openDatabase(join(base, ".gsd", "gsd.db"));
35
+ return base;
36
+ }
37
+
38
+ function cleanup(base: string): void {
39
+ try {
40
+ closeDatabase();
41
+ } catch {
42
+ /* noop */
43
+ }
44
+ try {
45
+ rmSync(base, { recursive: true, force: true });
46
+ } catch {
47
+ /* noop */
48
+ }
49
+ }
50
+
51
+ async function seedDecision(
52
+ base: string,
53
+ fields: {
54
+ when_context: string;
55
+ scope: string;
56
+ decision: string;
57
+ choice: string;
58
+ rationale: string;
59
+ revisable?: string;
60
+ made_by?: "human" | "agent" | "collaborative";
61
+ },
62
+ ): Promise<string> {
63
+ // saveDecisionToDb writes ONLY to memories post-Stage-3. For parity tests
64
+ // comparing the legacy `queryDecisions` against `queryDecisionsFromMemories`,
65
+ // mirror the same row into the legacy decisions table directly so both
66
+ // surfaces hold the same data and the parity assertion is well-defined.
67
+ const result = await saveDecisionToDb(
68
+ {
69
+ when_context: fields.when_context,
70
+ scope: fields.scope,
71
+ decision: fields.decision,
72
+ choice: fields.choice,
73
+ rationale: fields.rationale,
74
+ revisable: fields.revisable ?? "Yes",
75
+ made_by: fields.made_by ?? "agent",
76
+ },
77
+ base,
78
+ );
79
+ insertDecision({
80
+ id: result.id,
81
+ when_context: fields.when_context,
82
+ scope: fields.scope,
83
+ decision: fields.decision,
84
+ choice: fields.choice,
85
+ rationale: fields.rationale,
86
+ revisable: fields.revisable ?? "Yes",
87
+ made_by: fields.made_by ?? "agent",
88
+ superseded_by: null,
89
+ });
90
+ return result.id;
91
+ }
92
+
93
+ test("queryDecisionsFromMemories returns empty when no decisions exist", () => {
94
+ const base = makeTmpBase();
95
+ try {
96
+ assert.deepEqual(queryDecisionsFromMemories(), []);
97
+ assert.deepEqual(queryDecisionsFromMemories({ milestoneId: "M001" }), []);
98
+ } finally {
99
+ cleanup(base);
100
+ }
101
+ });
102
+
103
+ test("queryDecisionsFromMemories matches queryDecisions for a single active decision", async () => {
104
+ const base = makeTmpBase();
105
+ try {
106
+ await seedDecision(base, {
107
+ when_context: "M001 discuss phase",
108
+ scope: "M001",
109
+ decision: "Adopt SQLite for persistence",
110
+ choice: "better-sqlite3",
111
+ rationale: "Native, synchronous, well-supported",
112
+ });
113
+
114
+ const fromDecisions = queryDecisions();
115
+ const fromMemories = queryDecisionsFromMemories();
116
+
117
+ assert.equal(fromDecisions.length, 1);
118
+ assert.equal(fromMemories.length, 1);
119
+
120
+ // Compare the user-visible Decision fields. seq differs across tables
121
+ // (memories.seq vs decisions.seq) so it's intentionally excluded.
122
+ const { seq: _seq1, ...d1 } = fromDecisions[0]!;
123
+ const { seq: _seq2, ...d2 } = fromMemories[0]!;
124
+ assert.deepEqual(d1, d2);
125
+ } finally {
126
+ cleanup(base);
127
+ }
128
+ });
129
+
130
+ test("queryDecisionsFromMemories preserves decision order across multiple writes", async () => {
131
+ const base = makeTmpBase();
132
+ try {
133
+ const id1 = await seedDecision(base, {
134
+ when_context: "M001 discuss",
135
+ scope: "M001",
136
+ decision: "First decision",
137
+ choice: "A",
138
+ rationale: "first",
139
+ });
140
+ const id2 = await seedDecision(base, {
141
+ when_context: "M001 plan",
142
+ scope: "M001",
143
+ decision: "Second decision",
144
+ choice: "B",
145
+ rationale: "second",
146
+ });
147
+ const id3 = await seedDecision(base, {
148
+ when_context: "M002 discuss",
149
+ scope: "M002",
150
+ decision: "Third decision",
151
+ choice: "C",
152
+ rationale: "third",
153
+ });
154
+
155
+ const fromMemories = queryDecisionsFromMemories();
156
+ assert.equal(fromMemories.length, 3);
157
+ assert.deepEqual(
158
+ fromMemories.map((d) => d.id),
159
+ [id1, id2, id3],
160
+ );
161
+ } finally {
162
+ cleanup(base);
163
+ }
164
+ });
165
+
166
+ test("queryDecisionsFromMemories filters by milestoneId (substring match on when_context)", async () => {
167
+ const base = makeTmpBase();
168
+ try {
169
+ await seedDecision(base, {
170
+ when_context: "M001 discuss",
171
+ scope: "M001",
172
+ decision: "M001 decision",
173
+ choice: "A",
174
+ rationale: "x",
175
+ });
176
+ await seedDecision(base, {
177
+ when_context: "M002 plan",
178
+ scope: "M002",
179
+ decision: "M002 decision",
180
+ choice: "B",
181
+ rationale: "y",
182
+ });
183
+ await seedDecision(base, {
184
+ when_context: "M001 execute",
185
+ scope: "M001-S01",
186
+ decision: "M001 follow-up",
187
+ choice: "C",
188
+ rationale: "z",
189
+ });
190
+ await seedDecision(base, {
191
+ when_context: "M003 plan",
192
+ scope: "M003",
193
+ decision: "Use M001 as precedent",
194
+ choice: "D",
195
+ rationale: "Mentions M001 outside when_context",
196
+ });
197
+
198
+ const m001 = queryDecisionsFromMemories({ milestoneId: "M001" });
199
+ assert.equal(m001.length, 2, "two decisions reference M001 in when_context");
200
+ assert.ok(m001.every((d) => d.when_context.includes("M001")));
201
+
202
+ const m002 = queryDecisionsFromMemories({ milestoneId: "M002" });
203
+ assert.equal(m002.length, 1);
204
+ assert.equal(m002[0]?.decision, "M002 decision");
205
+ } finally {
206
+ cleanup(base);
207
+ }
208
+ });
209
+
210
+ test("queryDecisionsFromMemories filters by scope (exact match, no prefix collisions)", async () => {
211
+ const base = makeTmpBase();
212
+ try {
213
+ await seedDecision(base, {
214
+ when_context: "M001 discuss",
215
+ scope: "M001",
216
+ decision: "Milestone-level",
217
+ choice: "A",
218
+ rationale: "x",
219
+ });
220
+ await seedDecision(base, {
221
+ when_context: "M001 plan",
222
+ scope: "M001-S01",
223
+ decision: "Slice-level",
224
+ choice: "B",
225
+ rationale: "y",
226
+ });
227
+ await seedDecision(base, {
228
+ when_context: "M001 plan",
229
+ scope: "M001-S02",
230
+ decision: "Different slice",
231
+ choice: "C",
232
+ rationale: "z",
233
+ });
234
+
235
+ // Exact-scope filter must not match prefix-similar values.
236
+ const milestoneScope = queryDecisionsFromMemories({ scope: "M001" });
237
+ assert.equal(milestoneScope.length, 1, "scope=M001 must not match M001-S01 / M001-S02");
238
+ assert.equal(milestoneScope[0]?.scope, "M001");
239
+
240
+ const sliceScope = queryDecisionsFromMemories({ scope: "M001-S01" });
241
+ assert.equal(sliceScope.length, 1);
242
+ assert.equal(sliceScope[0]?.scope, "M001-S01");
243
+ } finally {
244
+ cleanup(base);
245
+ }
246
+ });
247
+
248
+ test("queryDecisionsFromMemories matches queryDecisions for combined milestoneId + scope filters", async () => {
249
+ const base = makeTmpBase();
250
+ try {
251
+ await seedDecision(base, {
252
+ when_context: "M001 discuss",
253
+ scope: "M001",
254
+ decision: "A",
255
+ choice: "1",
256
+ rationale: "x",
257
+ });
258
+ await seedDecision(base, {
259
+ when_context: "M001 plan",
260
+ scope: "M001-S01",
261
+ decision: "B",
262
+ choice: "2",
263
+ rationale: "y",
264
+ });
265
+ await seedDecision(base, {
266
+ when_context: "M002 discuss",
267
+ scope: "M002",
268
+ decision: "C",
269
+ choice: "3",
270
+ rationale: "z",
271
+ });
272
+
273
+ const opts = { milestoneId: "M001", scope: "M001-S01" };
274
+ const fromDecisions = queryDecisions(opts);
275
+ const fromMemories = queryDecisionsFromMemories(opts);
276
+
277
+ assert.equal(fromDecisions.length, fromMemories.length);
278
+ assert.equal(fromMemories.length, 1);
279
+ assert.equal(fromMemories[0]?.id, fromDecisions[0]?.id);
280
+ assert.equal(fromMemories[0]?.scope, "M001-S01");
281
+ } finally {
282
+ cleanup(base);
283
+ }
284
+ });
285
+
286
+ test("queryDecisionsFromMemories ignores memories without a sourceDecisionId marker", async () => {
287
+ const base = makeTmpBase();
288
+ try {
289
+ // Insert a user-authored memory (no sourceDecisionId) — must not appear in
290
+ // the decisions-from-memories projection.
291
+ const { createMemory } = await import("../memory-store.ts");
292
+ createMemory({
293
+ category: "architecture",
294
+ content: "User-authored architecture note, not derived from a decision",
295
+ scope: "project",
296
+ });
297
+
298
+ await seedDecision(base, {
299
+ when_context: "M001 discuss",
300
+ scope: "M001",
301
+ decision: "Real decision",
302
+ choice: "A",
303
+ rationale: "x",
304
+ });
305
+
306
+ const fromMemories = queryDecisionsFromMemories();
307
+ assert.equal(fromMemories.length, 1, "user-authored memory must not appear as a decision");
308
+ assert.equal(fromMemories[0]?.decision, "Real decision");
309
+ } finally {
310
+ cleanup(base);
311
+ }
312
+ });
@@ -182,7 +182,6 @@ function makeMockDeps(overrides?: Partial<LoopDeps>): LoopDeps & { callLog: stri
182
182
  pruneQueueOrder: () => {},
183
183
  isInAutoWorktree: () => false,
184
184
  shouldUseWorktreeIsolation: () => false,
185
- mergeMilestoneToMain: () => ({ pushed: false, codeFilesChanged: false }),
186
185
  teardownAutoWorktree: () => {},
187
186
  createAutoWorktree: () => "/tmp/wt",
188
187
  captureIntegrationBranch: () => {},
@@ -420,6 +419,10 @@ describe("Custom engine loop integration", () => {
420
419
  await autoLoop(ctx, pi, s, deps);
421
420
 
422
421
  assert.deepEqual(turnResults, [{ status: "completed", failureClass: "none", error: undefined }]);
422
+ assert.ok(
423
+ deps.callLog.includes("journal:iteration-end"),
424
+ `complete workflow should emit iteration-end; log=${deps.callLog.join(",")}`,
425
+ );
423
426
  assert.ok(
424
427
  deps.callLog.indexOf("turnResult:completed") < deps.callLog.indexOf("stopAuto:Workflow complete"),
425
428
  `turn should finalize before stopAuto; log=${deps.callLog.join(",")}`,
@@ -472,6 +475,10 @@ describe("Custom engine loop integration", () => {
472
475
  assert.equal(turnResults[0].status, "stopped");
473
476
  assert.equal(turnResults[0].failureClass, "manual-attention");
474
477
  assert.match(turnResults[0].error ?? "", /custom-engine-dispatch-stop/);
478
+ assert.ok(
479
+ deps.callLog.includes("journal:iteration-end"),
480
+ `blocked workflow should emit iteration-end; log=${deps.callLog.join(",")}`,
481
+ );
475
482
  assert.equal(s.currentTraceId, null);
476
483
  assert.equal(s.currentTurnId, null);
477
484
  assert.equal(pi.calls.length, 0, "blocked workflow should not dispatch a custom step");
@@ -664,11 +671,16 @@ describe("Custom engine loop integration", () => {
664
671
  activeRunDir: runDir,
665
672
  basePath: runDir,
666
673
  });
674
+ const journalEvents: Array<{ eventType: string; data?: any }> = [];
667
675
  const deps = makeMockDeps({
668
676
  stopAuto: async (_ctx, _pi, reason) => {
669
677
  deps.callLog.push(`stopAuto:${reason ?? "no-reason"}`);
670
678
  s.active = false;
671
679
  },
680
+ emitJournalEvent: (entry: any) => {
681
+ journalEvents.push(entry);
682
+ deps.callLog.push(`journal:${entry.eventType}`);
683
+ },
672
684
  });
673
685
 
674
686
  const resolver = setInterval(() => {
@@ -700,6 +712,21 @@ describe("Custom engine loop integration", () => {
700
712
  assert.match(stopEntry ?? "", /requested retry 4 times without passing/);
701
713
  const finalGraph = readGraph(runDir);
702
714
  assert.equal(finalGraph.steps[0]?.status, "active", "failed verification must not reconcile the step complete");
715
+
716
+ const unitEndIndexes = journalEvents
717
+ .map((entry, index) => entry.eventType === "unit-end" ? index : -1)
718
+ .filter((index) => index >= 0);
719
+ const iterationEndIndexes = journalEvents
720
+ .map((entry, index) => entry.eventType === "iteration-end" ? index : -1)
721
+ .filter((index) => index >= 0);
722
+ assert.equal(unitEndIndexes.length, 4, "each custom verification retry/stop attempt must emit unit-end");
723
+ assert.equal(iterationEndIndexes.length, 4, "each custom verification retry/stop iteration must close after unit-end");
724
+ for (const [i, unitEndIndex] of unitEndIndexes.entries()) {
725
+ assert.ok(
726
+ iterationEndIndexes[i]! > unitEndIndex,
727
+ `custom verification attempt ${i + 1} should emit iteration-end after unit-end`,
728
+ );
729
+ }
703
730
  });
704
731
 
705
732
  it("persists custom verification retry budget across a session restart", async () => {
@@ -27,6 +27,7 @@ import {
27
27
  saveArtifactToDb,
28
28
  extractDeferredSliceRef,
29
29
  } from '../db-writer.ts';
30
+ import { getAllDecisionsFromMemories } from '../context-store.ts';
30
31
  import type { Decision, Requirement } from '../types.ts';
31
32
 
32
33
  // ═══════════════════════════════════════════════════════════════════════════
@@ -326,11 +327,14 @@ describe('db-writer', () => {
326
327
 
327
328
  assert.deepStrictEqual(result.id, 'D001', 'saveDecisionToDb returns D001 as first ID');
328
329
 
329
- // Verify DB state
330
- const dbDecision = getDecisionById('D001');
331
- assert.ok(!!dbDecision, 'decision exists in DB after save');
332
- assert.deepStrictEqual(dbDecision?.scope, 'arch', 'DB decision has correct scope');
333
- assert.deepStrictEqual(dbDecision?.choice, 'Option A', 'DB decision has correct choice');
330
+ // ADR-013 Stage 3: decisions land in memories, not the legacy table.
331
+ const memoryDecisions = getAllDecisionsFromMemories();
332
+ assert.equal(memoryDecisions.length, 1, 'one memory row exists after save');
333
+ const memDecision = memoryDecisions[0];
334
+ assert.ok(memDecision, 'memory decision exists after save');
335
+ assert.equal(memDecision.id, 'D001');
336
+ assert.equal(memDecision.scope, 'arch', 'memory decision has correct scope');
337
+ assert.equal(memDecision.choice, 'Option A', 'memory decision has correct choice');
334
338
 
335
339
  // Verify markdown file was written
336
340
  const mdPath = path.join(tmpDir, '.gsd', 'DECISIONS.md');
@@ -394,10 +398,11 @@ describe('db-writer', () => {
394
398
  assert.match(id, /^D\d{3}$/, `ID ${id} should match D### pattern`);
395
399
  }
396
400
 
397
- // Verify all 5 exist in DB
401
+ // ADR-013 Stage 3: verify all 5 exist in the memories table (decisions
402
+ // table receives no writes from saveDecisionToDb post-cutover).
403
+ const memoryIds = new Set(getAllDecisionsFromMemories().map((d) => d.id));
398
404
  for (const id of ids) {
399
- const row = getDecisionById(id);
400
- assert.ok(row, `Decision ${id} should exist in DB`);
405
+ assert.ok(memoryIds.has(id), `Decision ${id} should exist in memories`);
401
406
  }
402
407
  } finally {
403
408
  closeDatabase();