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
@@ -14,7 +14,7 @@ import { parseSummary } from '../files.ts';
14
14
  import { deriveState } from '../state.ts';
15
15
  import { invalidateAllCaches } from '../cache.ts';
16
16
  import { ensureDbOpen } from '../bootstrap/dynamic-tools.ts';
17
- import { closeDatabase, getAllMilestones } from '../gsd-db.ts';
17
+ import { closeDatabase, getAllMilestones, getArtifact } from '../gsd-db.ts';
18
18
  import { importWrittenMigrationToDb } from '../migrate/command.ts';
19
19
  import type {
20
20
  GSDProject,
@@ -336,7 +336,12 @@ test('Scenario 2: Fully complete project — deriveState phase', async () => {
336
336
  assert.deepStrictEqual(preview.taskCompletionPct, 100, 'complete: preview taskCompletionPct');
337
337
  assert.deepStrictEqual(preview.requirements.total, 0, 'complete: preview requirements total');
338
338
 
339
+ const imported = await importWrittenMigrationToDb(base, preview);
340
+ assert.ok(imported.artifacts >= 6, 'complete: imports generated milestone artifacts');
341
+ assert.ok(getArtifact('milestones/M001/M001-VALIDATION.md') !== null, 'complete: M001-VALIDATION.md imported as artifact');
342
+ assert.ok(getArtifact('milestones/M001/M001-SUMMARY.md') !== null, 'complete: M001-SUMMARY.md imported as artifact');
339
343
  } finally {
344
+ closeDatabase();
340
345
  rmSync(base, { recursive: true, force: true });
341
346
  }
342
347
  });
@@ -1,55 +1,53 @@
1
- // GSD Extension — Notification Overlay Tests
2
- // Tests for message wrapping in the notification panel.
3
- // Mirrors the private wrapText from notification-overlay.ts so its contract
4
- // can be exercised without exporting internals.
1
+ // Project/App: GSD-2
2
+ // File Purpose: Regression tests for notification overlay wrapping and width-safe rendering.
5
3
 
6
4
  import { describe, test } from "node:test";
7
5
  import assert from "node:assert/strict";
6
+ import { mkdtempSync, rmSync } from "node:fs";
7
+ import { tmpdir } from "node:os";
8
+ import { join } from "node:path";
8
9
 
9
- import { truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@gsd/pi-tui";
10
+ import { visibleWidth } from "@gsd/pi-tui";
11
+ import { appendNotification, initNotificationStore, _resetNotificationStore } from "../notification-store.ts";
12
+ import { GSDNotificationOverlay, notificationOverlayOptions } from "../notification-overlay.ts";
13
+ import { wrapVisibleText } from "../tui/render-kit.ts";
10
14
 
11
- // ── wrapText logic (mirrors the private function in notification-overlay.ts) ──
15
+ const fakeTheme = {
16
+ fg: (_color: string, text: string) => text,
17
+ bold: (text: string) => text,
18
+ };
12
19
 
13
- function wrapText(text: string, maxWidth: number): string[] {
14
- if (maxWidth <= 0) return [text];
15
- const lines = wrapTextWithAnsi(text, maxWidth);
16
- return lines.map((l) =>
17
- visibleWidth(l) > maxWidth ? truncateToWidth(l, maxWidth, "") : l,
18
- );
20
+ function assertLinesFit(lines: string[], width: number): void {
21
+ for (const line of lines) {
22
+ assert.ok(
23
+ visibleWidth(line) <= width,
24
+ `line exceeds maxWidth: visibleWidth=${visibleWidth(line)} max=${width}: "${line}"`,
25
+ );
26
+ }
19
27
  }
20
28
 
21
29
  describe("notification overlay — wrapText", () => {
22
30
  test("short text returns single line", () => {
23
- const result = wrapText("hello world", 80);
31
+ const result = wrapVisibleText("hello world", 80);
24
32
  assert.deepStrictEqual(result, ["hello world"]);
25
33
  });
26
34
 
27
35
  test("long text wraps at word boundaries without exceeding maxWidth", () => {
28
36
  const text = "This is a long notification message that should wrap across multiple lines";
29
- const result = wrapText(text, 40);
37
+ const result = wrapVisibleText(text, 40);
30
38
  assert.ok(result.length > 1, `expected multiple lines, got ${result.length}`);
31
- for (const line of result) {
32
- assert.ok(
33
- visibleWidth(line) <= 40,
34
- `line exceeds maxWidth: "${line}" (${visibleWidth(line)})`,
35
- );
36
- }
39
+ assertLinesFit(result, 40);
37
40
  });
38
41
 
39
42
  test("single word exceeding maxWidth is broken to fit column budget", () => {
40
- const result = wrapText("superlongwordthatexceedsmaxwidth", 10);
41
- for (const line of result) {
42
- assert.ok(
43
- visibleWidth(line) <= 10,
44
- `line exceeds maxWidth: "${line}" (${visibleWidth(line)})`,
45
- );
46
- }
43
+ const result = wrapVisibleText("superlongwordthatexceedsmaxwidth", 10);
44
+ assertLinesFit(result, 10);
47
45
  });
48
46
 
49
47
  test("preserves all words across wrapped lines", () => {
50
48
  const words = ["alpha", "bravo", "charlie", "delta", "echo", "foxtrot"];
51
49
  const text = words.join(" ");
52
- const result = wrapText(text, 15);
50
+ const result = wrapVisibleText(text, 15);
53
51
  const rejoined = result.join(" ");
54
52
  for (const w of words) {
55
53
  assert.ok(rejoined.includes(w), `missing word: ${w}`);
@@ -70,23 +68,62 @@ describe("notification overlay — wrapText", () => {
70
68
  "(expired — will auto-refresh) ✗ google — not configured " +
71
69
  "(aistudio.google.com/apikey) ✗ groq — not configured";
72
70
  const maxWidth = 118;
73
- const result = wrapText(msg, maxWidth);
74
- for (const line of result) {
75
- assert.ok(
76
- visibleWidth(line) <= maxWidth,
77
- `line exceeds column budget: visibleWidth=${visibleWidth(line)} max=${maxWidth}: "${line}"`,
78
- );
79
- }
71
+ const result = wrapVisibleText(msg, maxWidth);
72
+ assertLinesFit(result, maxWidth);
80
73
  });
81
74
 
82
75
  test("unbreakable long token (URL) is clamped to maxWidth", () => {
83
76
  const url = "https://example.com/" + "a".repeat(200);
84
- const result = wrapText(url, 40);
85
- for (const line of result) {
86
- assert.ok(
87
- visibleWidth(line) <= 40,
88
- `line exceeds maxWidth: visibleWidth=${visibleWidth(line)} line="${line}"`,
89
- );
77
+ const result = wrapVisibleText(url, 40);
78
+ assertLinesFit(result, 40);
79
+ });
80
+
81
+ test("real overlay render fits common terminal widths", (t) => {
82
+ const dir = mkdtempSync(join(tmpdir(), "gsd-notification-overlay-"));
83
+ t.after(() => {
84
+ _resetNotificationStore();
85
+ rmSync(dir, { recursive: true, force: true });
86
+ });
87
+
88
+ initNotificationStore(dir);
89
+ appendNotification("A long notification with " + "x".repeat(180), "warning");
90
+
91
+ const overlay = new GSDNotificationOverlay({ requestRender() {} }, fakeTheme as any, () => {});
92
+ t.after(() => overlay.dispose());
93
+
94
+ for (const width of [40, 80, 120]) {
95
+ assertLinesFit(overlay.render(width), width);
96
+ overlay.invalidate();
90
97
  }
91
98
  });
99
+
100
+ test("rendered height stays within the configured overlay max height", (t) => {
101
+ const dir = mkdtempSync(join(tmpdir(), "gsd-notification-overlay-height-"));
102
+ const originalRowsDescriptor = Object.getOwnPropertyDescriptor(process.stdout, "rows");
103
+ Object.defineProperty(process.stdout, "rows", { value: 40, configurable: true });
104
+
105
+ t.after(() => {
106
+ if (originalRowsDescriptor) {
107
+ Object.defineProperty(process.stdout, "rows", originalRowsDescriptor);
108
+ } else {
109
+ delete (process.stdout as { rows?: number }).rows;
110
+ }
111
+ _resetNotificationStore();
112
+ rmSync(dir, { recursive: true, force: true });
113
+ });
114
+
115
+ initNotificationStore(dir);
116
+ for (let i = 0; i < 80; i++) {
117
+ appendNotification(`notification-${i + 1} with enough text to exercise clipping`, "warning");
118
+ }
119
+
120
+ const overlay = new GSDNotificationOverlay({ requestRender() {} }, fakeTheme as any, () => {});
121
+ t.after(() => overlay.dispose());
122
+
123
+ const rendered = overlay.render(100);
124
+ const maxHeight = Math.floor((40 * 52) / 100);
125
+ assert.ok(rendered.length <= maxHeight, `expected ${rendered.length} lines to fit maxHeight ${maxHeight}`);
126
+ assert.ok(rendered.at(-1)?.includes("╯"), "bottom border should remain visible");
127
+ assert.equal(notificationOverlayOptions().maxHeight, "52%");
128
+ });
92
129
  });
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Tests for /gsd notifications command handling and overlay launch behavior.
3
+
1
4
  import test from "node:test";
2
5
  import assert from "node:assert/strict";
3
6
  import { join } from "node:path";
@@ -58,6 +61,47 @@ test("notifications command falls back to text output when overlay returns undef
58
61
  assert.match(notices[0].message, /Recent notifications:/);
59
62
  });
60
63
 
64
+ test("notifications command opens a compact bounded overlay", async (t) => {
65
+ const base = makeTempDir("overlay-options");
66
+ initNotificationStore(base);
67
+ appendNotification("Build complete", "success");
68
+
69
+ t.after(() => {
70
+ _resetNotificationStore();
71
+ cleanup(base);
72
+ });
73
+
74
+ const notices: Array<{ message: string; level?: string }> = [];
75
+ let capturedOptions: any;
76
+ await handleNotificationsCommand(
77
+ "",
78
+ {
79
+ hasUI: true,
80
+ ui: {
81
+ custom: async (_factory: any, options: any) => {
82
+ capturedOptions = options;
83
+ return true;
84
+ },
85
+ notify: (message: string, level?: string) => {
86
+ notices.push({ message, level });
87
+ },
88
+ },
89
+ } as any,
90
+ {} as any,
91
+ );
92
+
93
+ assert.deepEqual(capturedOptions?.overlayOptions, {
94
+ width: "58%",
95
+ minWidth: 68,
96
+ maxHeight: "52%",
97
+ anchor: "top-center",
98
+ row: "24%",
99
+ margin: { top: 2, right: 2, bottom: 6, left: 2 },
100
+ backdrop: true,
101
+ });
102
+ assert.equal(notices.length, 0, "successful overlay should not emit text fallback");
103
+ });
104
+
61
105
  test("notifications tail caps inline output and hints to open overlay", async (t) => {
62
106
  const base = makeTempDir("tail-cap");
63
107
  initNotificationStore(base);
@@ -33,43 +33,6 @@ import {
33
33
  teardownAutoWorktree,
34
34
  } from "../auto-worktree.ts";
35
35
  import { normalizeWorktreePathForCompare } from "../worktree-root.ts";
36
- import {
37
- WorktreeLifecycle,
38
- type WorktreeLifecycleDeps,
39
- type NotifyCtx,
40
- } from "../worktree-lifecycle.ts";
41
- import { WorktreeStateProjection } from "../worktree-state-projection.ts";
42
- import { resolveWorktreeProjectRoot } from "../worktree-root.ts";
43
- import { AutoSession } from "../auto/session.ts";
44
-
45
- // Test-local: LegacyTestDeps had three fields Lifecycle does not need
46
- // (shouldUseWorktreeIsolation, syncWorktreeStateBack, captureIntegrationBranch).
47
- // Permit them in test fixtures so existing override patterns keep working —
48
- // Lifecycle ignores the extras via structural typing.
49
- type LegacyTestDeps = WorktreeLifecycleDeps & {
50
- shouldUseWorktreeIsolation?: () => boolean;
51
- syncWorktreeStateBack?: (
52
- mainBasePath: string,
53
- worktreePath: string,
54
- milestoneId: string,
55
- ) => { synced: string[] };
56
- captureIntegrationBranch?: (basePath: string, mid: string | undefined) => void;
57
- };
58
-
59
- /** Shim factory preserving the legacy WorktreeResolver throw shape for tests. */
60
- function makeResolver(s: AutoSession, deps: LegacyTestDeps) {
61
- const lifecycle = new WorktreeLifecycle(s, deps);
62
- return {
63
- get workPath(): string { return s.basePath; },
64
- get projectRoot(): string {
65
- return resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
66
- },
67
- mergeAndExit: (mid: string, ctx: NotifyCtx) => {
68
- const r = lifecycle.exitMilestone(mid, { merge: true }, ctx);
69
- if (!r.ok && r.cause instanceof Error) throw r.cause;
70
- },
71
- };
72
- }
73
36
 
74
37
  // ─── Helpers ──────────────────────────────────────────────────────────────────
75
38
 
@@ -91,97 +54,6 @@ function createTempRepo(t: { after: (fn: () => void) => void }): string {
91
54
  return dir;
92
55
  }
93
56
 
94
- function makeSession(overrides?: Partial<{ basePath: string; originalBasePath: string }>): AutoSession {
95
- const s = new AutoSession();
96
- s.basePath = overrides?.basePath ?? "/project";
97
- s.originalBasePath = overrides?.originalBasePath ?? "/project";
98
- return s;
99
- }
100
-
101
- interface CallLog { fn: string; args: unknown[] }
102
-
103
- function makeDeps(overrides?: Partial<LegacyTestDeps>): LegacyTestDeps & { calls: CallLog[] } {
104
- const calls: CallLog[] = [];
105
-
106
- const deps: LegacyTestDeps & { calls: CallLog[] } = {
107
- calls,
108
- isInAutoWorktree: (basePath: string) => {
109
- calls.push({ fn: "isInAutoWorktree", args: [basePath] });
110
- return basePath.includes("worktrees");
111
- },
112
- shouldUseWorktreeIsolation: () => true,
113
- getIsolationMode: () => "worktree",
114
- mergeMilestoneToMain: (basePath: string, milestoneId: string, roadmapContent: string) => {
115
- calls.push({ fn: "mergeMilestoneToMain", args: [basePath, milestoneId, roadmapContent] });
116
- return { pushed: false, codeFilesChanged: true };
117
- },
118
- syncWorktreeStateBack: (mainBasePath: string, worktreePath: string, milestoneId: string) => {
119
- calls.push({ fn: "syncWorktreeStateBack", args: [mainBasePath, worktreePath, milestoneId] });
120
- return { synced: [] };
121
- },
122
- teardownAutoWorktree: (basePath: string, milestoneId: string, opts?: { preserveBranch?: boolean }) => {
123
- calls.push({ fn: "teardownAutoWorktree", args: [basePath, milestoneId, opts] });
124
- },
125
- createAutoWorktree: (basePath: string, milestoneId: string) => {
126
- calls.push({ fn: "createAutoWorktree", args: [basePath, milestoneId] });
127
- return `${basePath}/.gsd/worktrees/${milestoneId}`;
128
- },
129
- enterAutoWorktree: (basePath: string, milestoneId: string) => {
130
- calls.push({ fn: "enterAutoWorktree", args: [basePath, milestoneId] });
131
- return `${basePath}/.gsd/worktrees/${milestoneId}`;
132
- },
133
- getAutoWorktreePath: (basePath: string, milestoneId: string) => {
134
- calls.push({ fn: "getAutoWorktreePath", args: [basePath, milestoneId] });
135
- return null;
136
- },
137
- autoCommitCurrentBranch: (basePath: string, reason: string, milestoneId: string) => {
138
- calls.push({ fn: "autoCommitCurrentBranch", args: [basePath, reason, milestoneId] });
139
- },
140
- getCurrentBranch: (basePath: string) => {
141
- calls.push({ fn: "getCurrentBranch", args: [basePath] });
142
- return "main";
143
- },
144
- checkoutBranch: (basePath: string, branch: string) => {
145
- calls.push({ fn: "checkoutBranch", args: [basePath, branch] });
146
- },
147
- autoWorktreeBranch: (milestoneId: string) => `milestone/${milestoneId}`,
148
- resolveMilestoneFile: (basePath: string, milestoneId: string, fileType: string) => {
149
- calls.push({ fn: "resolveMilestoneFile", args: [basePath, milestoneId, fileType] });
150
- return null;
151
- },
152
- readFileSync: (path: string, _enc: string) => {
153
- calls.push({ fn: "readFileSync", args: [path] });
154
- return "# Roadmap\n";
155
- },
156
- GitServiceImpl: class {
157
- constructor(_basePath: string, _gitConfig: unknown) {}
158
- } as unknown as LegacyTestDeps["GitServiceImpl"],
159
- loadEffectiveGSDPreferences: () => ({ preferences: { git: {} } }),
160
- invalidateAllCaches: () => { calls.push({ fn: "invalidateAllCaches", args: [] }); },
161
- captureIntegrationBranch: (_basePath: string, _mid: string | undefined) => {},
162
- enterBranchModeForMilestone: (_basePath: string, _milestoneId: string) => {},
163
- worktreeProjection: new WorktreeStateProjection(),
164
- ...overrides,
165
- };
166
-
167
- if (overrides) {
168
- for (const [key, val] of Object.entries(overrides)) {
169
- if (key !== "calls") (deps as unknown as Record<string, unknown>)[key] = val;
170
- }
171
- }
172
- return deps;
173
- }
174
-
175
- function makeNotifyCtx(): NotifyCtx & { messages: Array<{ msg: string; level?: string }> } {
176
- const messages: Array<{ msg: string; level?: string }> = [];
177
- return {
178
- messages,
179
- notify: (msg: string, level?: "info" | "warning" | "error" | "success") => {
180
- messages.push({ msg, level });
181
- },
182
- };
183
- }
184
-
185
57
  // ─── Suite 1: getAutoWorktreeOriginalBase() returns realpath-canonical path ──
186
58
 
187
59
  describe("getAutoWorktreeOriginalBase() is realpath-normalised", () => {
@@ -273,92 +145,15 @@ describe("normalizeWorktreePathForCompare equalises canonical vs non-canonical f
273
145
  // resolveMilestoneFile call against the "worktree" path that is actually the
274
146
  // same directory). The new code correctly skips the fallback.
275
147
 
276
- describe("WorktreeResolver: roadmap-fallback skipped when basePath is same physical path as originalBase", () => {
277
- test("with trailing-slash basePath equal to originalBase: resolveMilestoneFile called once", () => {
278
- // originalBase is canonical (as returned by workspace registry)
279
- const canonicalBase = "/tmp/m5-test-project";
280
- // s.basePath has a trailing slash same physical dir, non-canonical string
281
- const trailingSlashBase = canonicalBase + "/";
282
-
283
- const s = makeSession({
284
- basePath: trailingSlashBase,
285
- originalBasePath: canonicalBase,
286
- });
287
-
288
- const calls: CallLog[] = [];
289
- const deps = makeDeps({
290
- // isInAutoWorktree: basePath has trailing slash but is NOT a worktree
291
- isInAutoWorktree: (basePath: string) => {
292
- calls.push({ fn: "isInAutoWorktree", args: [basePath] });
293
- return false;
294
- },
295
- // resolveMilestoneFile always returns null (no roadmap found)
296
- resolveMilestoneFile: (basePath: string, milestoneId: string, fileType: string) => {
297
- calls.push({ fn: "resolveMilestoneFile", args: [basePath, milestoneId, fileType] });
298
- return null;
299
- },
300
- teardownAutoWorktree: (basePath: string, milestoneId: string, opts?: { preserveBranch?: boolean }) => {
301
- calls.push({ fn: "teardownAutoWorktree", args: [basePath, milestoneId, opts] });
302
- },
303
- });
304
-
305
- // Override calls ref so we can inspect it directly
306
- (deps as unknown as { calls: CallLog[] }).calls = calls;
307
-
308
- const resolver = makeResolver(s, deps);
309
- const ctx = makeNotifyCtx();
310
-
311
- // mergeAndExit → _mergeWorktreeMode
312
- // originalBase = s.originalBasePath = canonicalBase
313
- // s.basePath = trailingSlashBase — physically same as canonicalBase
314
- // Post-fix: isSamePath(trailingSlashBase, canonicalBase) is true
315
- // → roadmap fallback branch is skipped (resolveMilestoneFile called once)
316
- // Pre-fix (bug): trailingSlashBase !== canonicalBase → fallback entered
317
- // → resolveMilestoneFile called twice
318
-
319
- resolver.mergeAndExit("M001", ctx);
320
-
321
- const rmfCalls = calls.filter(c => c.fn === "resolveMilestoneFile");
322
- assert.strictEqual(rmfCalls.length, 1,
323
- "resolveMilestoneFile must be called exactly once — fallback should be skipped when " +
324
- "s.basePath is the same physical path as originalBase (isSamePath fix)");
325
- });
326
-
327
- test("with genuinely different basePath (inside worktree): resolveMilestoneFile called twice", () => {
328
- // originalBase is the project root
329
- const projectRoot = "/tmp/m5-test-project";
330
- // s.basePath is inside a worktree — a physically different path
331
- const worktreePath = projectRoot + "/.gsd/worktrees/M002";
332
-
333
- const s = makeSession({
334
- basePath: worktreePath,
335
- originalBasePath: projectRoot,
336
- });
337
-
338
- const calls: CallLog[] = [];
339
- const deps = makeDeps({
340
- isInAutoWorktree: (basePath: string) => {
341
- calls.push({ fn: "isInAutoWorktree", args: [basePath] });
342
- return basePath.includes("worktrees");
343
- },
344
- resolveMilestoneFile: (basePath: string, milestoneId: string, fileType: string) => {
345
- calls.push({ fn: "resolveMilestoneFile", args: [basePath, milestoneId, fileType] });
346
- return null; // no roadmap in either location
347
- },
348
- teardownAutoWorktree: (basePath: string, milestoneId: string, opts?: { preserveBranch?: boolean }) => {
349
- calls.push({ fn: "teardownAutoWorktree", args: [basePath, milestoneId, opts] });
350
- },
351
- });
352
- (deps as unknown as { calls: CallLog[] }).calls = calls;
353
-
354
- const resolver = makeResolver(s, deps);
355
- const ctx = makeNotifyCtx();
356
-
357
- resolver.mergeAndExit("M002", ctx);
358
-
359
- const rmfCalls = calls.filter(c => c.fn === "resolveMilestoneFile");
360
- assert.strictEqual(rmfCalls.length, 2,
361
- "resolveMilestoneFile must be called twice when basePath is a genuine worktree path " +
362
- "(fallback should run for different physical paths)");
363
- });
364
- });
148
+ // ADR-016 phase 2 / C2 + C3 (#5625, #5626): the prior two tests in this
149
+ // suite asserted call counts on `deps.resolveMilestoneFile` /
150
+ // `deps.isInAutoWorktree` / `deps.teardownAutoWorktree` to verify that the
151
+ // roadmap-fallback branch was skipped when basePath was a non-canonical
152
+ // form of originalBase (trailing slash). After C2/C3 those fields are
153
+ // inlined into worktree-lifecycle.ts as direct imports — the mocks no
154
+ // longer fire and the call-count assertions test nothing meaningful. The
155
+ // underlying invariant (isSamePathPhysical normalises trailing slashes,
156
+ // canonical/non-canonical pairs, and case differences) is preserved
157
+ // inside worktree-lifecycle.ts and covered indirectly by the merge-area
158
+ // integration tests, which exercise real worktree merges where the
159
+ // fallback choice matters.
@@ -1,11 +1,19 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Regression tests for parallel monitor overlay rendering and input handling.
3
+
1
4
  import { describe, it } from "node:test";
2
- import assert from "node:assert";
5
+ import assert from "node:assert/strict";
6
+
7
+ import { visibleWidth } from "@gsd/pi-tui";
3
8
 
4
- /**
5
- * Basic tests for the parallel monitor overlay data helpers.
6
- * The overlay is primarily a rendering component that reads existing
7
- * status files — these tests verify the helper logic in isolation.
8
- */
9
+ function assertLinesFit(lines: string[], width: number): void {
10
+ for (const line of lines) {
11
+ assert.ok(
12
+ visibleWidth(line) <= width,
13
+ `line exceeds width ${width}: ${visibleWidth(line)} "${line}"`,
14
+ );
15
+ }
16
+ }
9
17
 
10
18
  describe("parallel-monitor-overlay", () => {
11
19
  it("progressBar generates correct width", async () => {
@@ -37,6 +45,7 @@ describe("parallel-monitor-overlay", () => {
37
45
  const lines = overlay.render(80);
38
46
  assert.ok(Array.isArray(lines), "render should return an array");
39
47
  assert.ok(lines.length > 0, "render should return at least one line");
48
+ assertLinesFit(lines, 80);
40
49
 
41
50
  // Should contain header text
42
51
  const joined = lines.join("\n");
@@ -79,4 +88,27 @@ describe("parallel-monitor-overlay", () => {
79
88
  assert.equal((overlay as any).scrollOffset, 0, "empty overlays clamp scroll to zero");
80
89
  overlay.dispose();
81
90
  });
91
+
92
+ it("ParallelMonitorOverlay empty state fits narrow and wide widths", async () => {
93
+ const mod = await import("../parallel-monitor-overlay.js");
94
+
95
+ const mockTui = { requestRender: () => {} };
96
+ const mockTheme = {
97
+ fg: (_color: string, text: string) => text,
98
+ bold: (text: string) => text,
99
+ };
100
+ const overlay = new mod.ParallelMonitorOverlay(
101
+ mockTui,
102
+ mockTheme as any,
103
+ () => {},
104
+ "/nonexistent/path",
105
+ );
106
+
107
+ for (const width of [40, 80, 120]) {
108
+ assertLinesFit(overlay.render(width), width);
109
+ overlay.invalidate();
110
+ }
111
+
112
+ overlay.dispose();
113
+ });
82
114
  });