gsd-pi 2.81.0 → 2.82.0-dev.ed17d078d

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 (503) hide show
  1. package/README.md +60 -30
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  4. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  5. package/dist/resources/extensions/gsd/auto/loop.js +111 -8
  6. package/dist/resources/extensions/gsd/auto/orchestrator.js +113 -6
  7. package/dist/resources/extensions/gsd/auto/phases.js +199 -97
  8. package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
  9. package/dist/resources/extensions/gsd/auto/session.js +9 -0
  10. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
  11. package/dist/resources/extensions/gsd/auto-dashboard.js +182 -178
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +14 -11
  13. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -1
  14. package/dist/resources/extensions/gsd/auto-prompts.js +11 -3
  15. package/dist/resources/extensions/gsd/auto-recovery.js +6 -181
  16. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  17. package/dist/resources/extensions/gsd/auto-start.js +20 -23
  18. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  19. package/dist/resources/extensions/gsd/auto-verification.js +12 -6
  20. package/dist/resources/extensions/gsd/auto-worktree.js +8 -0
  21. package/dist/resources/extensions/gsd/auto.js +386 -106
  22. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +13 -6
  23. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +13 -2
  24. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  25. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  26. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -1
  27. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  28. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
  29. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  30. package/dist/resources/extensions/gsd/context-store.js +112 -0
  31. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  32. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  33. package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
  34. package/dist/resources/extensions/gsd/git-service.js +2 -1
  35. package/dist/resources/extensions/gsd/gsd-db.js +7 -23
  36. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  37. package/dist/resources/extensions/gsd/health-widget.js +4 -10
  38. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  39. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  40. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  41. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  42. package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
  43. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  44. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  45. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  46. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  47. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  48. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  49. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  50. package/dist/resources/extensions/gsd/native-git-bridge.js +14 -14
  51. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  52. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  53. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  54. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  55. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  56. package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
  57. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  58. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  59. package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
  60. package/dist/resources/extensions/gsd/session-lock.js +40 -0
  61. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
  62. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +247 -0
  63. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +50 -0
  64. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +87 -0
  65. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
  66. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
  67. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
  68. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
  69. package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
  70. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
  71. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
  72. package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
  73. package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
  74. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  75. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  76. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  77. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  78. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  79. package/dist/resources/extensions/gsd/worktree-lifecycle.js +722 -316
  80. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  81. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  82. package/dist/web/standalone/.next/BUILD_ID +1 -1
  83. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  84. package/dist/web/standalone/.next/build-manifest.json +3 -3
  85. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  86. package/dist/web/standalone/.next/required-server-files.json +3 -3
  87. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  88. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  98. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  126. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  146. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  162. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/index.html +1 -1
  192. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  193. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  194. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  195. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  197. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/page.js +2 -2
  199. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  201. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  202. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  203. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/middleware.js +2 -2
  205. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  207. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  208. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  209. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  210. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  211. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  215. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  216. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  217. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  218. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  219. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  220. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  221. package/dist/web/standalone/server.js +1 -1
  222. package/dist/welcome-screen.d.ts +0 -7
  223. package/dist/welcome-screen.js +60 -69
  224. package/package.json +3 -2
  225. package/packages/daemon/package.json +2 -2
  226. package/packages/mcp-server/README.md +2 -0
  227. package/packages/mcp-server/package.json +2 -2
  228. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  229. package/packages/native/package.json +1 -1
  230. package/packages/pi-agent-core/package.json +1 -1
  231. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  232. package/packages/pi-ai/dist/index.d.ts +2 -2
  233. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  234. package/packages/pi-ai/dist/index.js +1 -1
  235. package/packages/pi-ai/dist/index.js.map +1 -1
  236. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  237. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  239. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  240. package/packages/pi-ai/package.json +1 -1
  241. package/packages/pi-ai/src/index.ts +7 -2
  242. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  243. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  244. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  245. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  250. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
  251. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  253. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  255. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  256. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  257. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  268. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  296. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  298. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  301. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  303. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  305. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  306. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  307. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  308. package/packages/pi-coding-agent/package.json +1 -1
  309. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  310. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  311. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
  312. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  313. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  314. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  315. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  316. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  317. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  318. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
  319. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
  320. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  321. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  322. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  323. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  324. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  325. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  326. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  327. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  328. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  329. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  330. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  331. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  332. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  333. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  334. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  335. package/packages/pi-tui/dist/tui.js +5 -0
  336. package/packages/pi-tui/dist/tui.js.map +1 -1
  337. package/packages/pi-tui/package.json +1 -1
  338. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  339. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  340. package/packages/pi-tui/src/tui.ts +6 -0
  341. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  342. package/packages/rpc-client/package.json +1 -1
  343. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  344. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  345. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  346. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  347. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  348. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  349. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  350. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  351. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  352. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  353. package/pkg/package.json +1 -1
  354. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  355. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  356. package/src/resources/extensions/gsd/auto/contracts.ts +46 -11
  357. package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
  358. package/src/resources/extensions/gsd/auto/loop.ts +113 -9
  359. package/src/resources/extensions/gsd/auto/orchestrator.ts +118 -6
  360. package/src/resources/extensions/gsd/auto/phases.ts +158 -19
  361. package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
  362. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  363. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  364. package/src/resources/extensions/gsd/auto-dashboard.ts +230 -183
  365. package/src/resources/extensions/gsd/auto-dispatch.ts +15 -1
  366. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -1
  367. package/src/resources/extensions/gsd/auto-prompts.ts +11 -3
  368. package/src/resources/extensions/gsd/auto-recovery.ts +7 -209
  369. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  370. package/src/resources/extensions/gsd/auto-start.ts +22 -22
  371. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  372. package/src/resources/extensions/gsd/auto-verification.ts +12 -6
  373. package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
  374. package/src/resources/extensions/gsd/auto.ts +424 -106
  375. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +21 -6
  376. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -2
  377. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  378. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  379. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -1
  380. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  381. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
  382. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  383. package/src/resources/extensions/gsd/context-store.ts +120 -1
  384. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  385. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  386. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  387. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  388. package/src/resources/extensions/gsd/git-service.ts +2 -0
  389. package/src/resources/extensions/gsd/gsd-db.ts +7 -23
  390. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  391. package/src/resources/extensions/gsd/health-widget.ts +6 -10
  392. package/src/resources/extensions/gsd/journal.ts +2 -0
  393. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  394. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  395. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  396. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  397. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
  398. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  399. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  400. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  401. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  402. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  403. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  404. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  405. package/src/resources/extensions/gsd/native-git-bridge.ts +14 -13
  406. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  407. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  408. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  409. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  410. package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  411. package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
  412. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  413. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  414. package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
  415. package/src/resources/extensions/gsd/session-lock.ts +41 -0
  416. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  417. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +337 -0
  418. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +69 -0
  419. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +109 -0
  420. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  421. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  422. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  423. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  424. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  425. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  426. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
  427. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  428. package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
  429. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  430. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  431. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +99 -0
  432. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +729 -176
  433. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +408 -4
  434. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +291 -4
  435. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
  436. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +18 -0
  437. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  438. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  439. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  440. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
  441. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  442. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  443. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  444. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +20 -2
  445. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +44 -0
  446. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  447. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  448. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  449. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
  450. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  451. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  452. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +26 -0
  453. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  454. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  456. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  457. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
  458. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  459. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  460. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  461. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  462. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  464. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
  465. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  466. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  467. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  468. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  469. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
  470. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  471. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  472. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +2 -2
  473. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
  474. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
  475. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  476. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
  477. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
  478. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  479. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +24 -0
  480. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +65 -58
  481. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +952 -0
  482. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
  483. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
  484. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  485. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  486. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +6 -0
  487. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +158 -58
  488. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +572 -118
  489. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  490. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +18 -0
  491. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  492. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  493. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  494. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  495. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  496. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1151 -524
  497. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  498. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  499. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  500. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  501. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
  502. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → YEvjuT-fsFfYQhDSWtueS}/_buildManifest.js +0 -0
  503. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → YEvjuT-fsFfYQhDSWtueS}/_ssgManifest.js +0 -0
@@ -89,14 +89,59 @@ test("emitAutoExit records reason and unmerged-work signal", () => {
89
89
  reason: "pause",
90
90
  milestoneId: "M003",
91
91
  milestoneMerged: false,
92
+ isolationMode: "worktree",
93
+ worktreeActive: true,
92
94
  });
93
95
  const entries = queryJournal(base, { eventType: "auto-exit" });
94
96
  assert.equal(entries.length, 1);
95
97
  assert.equal(entries[0].data?.reason, "pause");
96
98
  assert.equal(entries[0].data?.milestoneMerged, false);
99
+ assert.equal(entries[0].data?.isolationMode, "worktree");
100
+ assert.equal(entries[0].data?.worktreeActive, true);
97
101
  } finally { cleanup(base); }
98
102
  });
99
103
 
104
+ test("summarizeWorktreeTelemetry only counts unmerged exits from active worktrees", (t) => {
105
+ const base = makeTmpBase();
106
+ t.after(() => cleanup(base));
107
+
108
+ emitAutoExit(base, {
109
+ reason: "pause",
110
+ milestoneId: "M003",
111
+ milestoneMerged: false,
112
+ isolationMode: "none",
113
+ worktreeActive: false,
114
+ });
115
+ emitAutoExit(base, {
116
+ reason: "stop",
117
+ milestoneId: "M004",
118
+ milestoneMerged: false,
119
+ isolationMode: "branch",
120
+ worktreeActive: false,
121
+ });
122
+ emitAutoExit(base, {
123
+ reason: "other",
124
+ milestoneId: "M005",
125
+ milestoneMerged: false,
126
+ isolationMode: "worktree",
127
+ worktreeActive: false,
128
+ });
129
+ emitAutoExit(base, {
130
+ reason: "blocked",
131
+ milestoneId: "M006",
132
+ milestoneMerged: false,
133
+ });
134
+
135
+ const summary = summarizeWorktreeTelemetry(base);
136
+ assert.equal(summary.exitsWithUnmergedWork, 0);
137
+ assert.deepStrictEqual(summary.exitsByReason, {
138
+ "pause": 1,
139
+ "stop": 1,
140
+ "other": 1,
141
+ "blocked": 1,
142
+ });
143
+ });
144
+
100
145
  test("summarizeWorktreeTelemetry aggregates events correctly", () => {
101
146
  const base = makeTmpBase();
102
147
  try {
@@ -110,8 +155,20 @@ test("summarizeWorktreeTelemetry aggregates events correctly", () => {
110
155
  emitWorktreeOrphaned(base, "M002", { reason: "in-progress-unmerged", commitsAhead: 2 });
111
156
  emitWorktreeOrphaned(base, "M003", { reason: "complete-unmerged" });
112
157
 
113
- emitAutoExit(base, { reason: "pause", milestoneId: "M002", milestoneMerged: false });
114
- emitAutoExit(base, { reason: "stop", milestoneId: "M002", milestoneMerged: false });
158
+ emitAutoExit(base, {
159
+ reason: "pause",
160
+ milestoneId: "M002",
161
+ milestoneMerged: false,
162
+ isolationMode: "worktree",
163
+ worktreeActive: true,
164
+ });
165
+ emitAutoExit(base, {
166
+ reason: "stop",
167
+ milestoneId: "M002",
168
+ milestoneMerged: false,
169
+ isolationMode: "worktree",
170
+ worktreeActive: true,
171
+ });
115
172
  emitAutoExit(base, { reason: "all-complete", milestoneId: "M001", milestoneMerged: true });
116
173
 
117
174
  const summary = summarizeWorktreeTelemetry(base);
@@ -242,6 +242,24 @@ test('planning-dispatch: blocks recon agent under closeout policy', () => {
242
242
  assert.doesNotMatch(r.reason!, /read-only specialists/);
243
243
  });
244
244
 
245
+ test('complete-slice closeout policy blocks edits to user source', () => {
246
+ const r = shouldBlockPlanningUnit('edit', join(BASE, 'src', 'main.ts'), BASE, 'complete-slice', PLANNING_DISPATCH_REVIEW);
247
+ assert.strictEqual(r.block, true);
248
+ assert.match(r.reason!, /complete-slice/);
249
+ assert.match(r.reason!, /writes are restricted to \.gsd/);
250
+ });
251
+
252
+ test('complete-slice closeout policy blocks non-allowlisted verification bash', () => {
253
+ const r = shouldBlockPlanningUnit('bash', 'go test ./...', BASE, 'complete-slice', PLANNING_DISPATCH_REVIEW);
254
+ assert.strictEqual(r.block, true);
255
+ assert.match(r.reason!, /bash is restricted/);
256
+ });
257
+
258
+ test('complete-slice closeout policy allows gsd_exec verification surface', () => {
259
+ const r = shouldBlockPlanningUnit('gsd_exec', '', BASE, 'complete-slice', PLANNING_DISPATCH_REVIEW);
260
+ assert.strictEqual(r.block, false);
261
+ });
262
+
245
263
  test('planning-dispatch: still blocks writes to user source (write isolation preserved)', () => {
246
264
  const r = shouldBlockPlanningUnit('write', join(BASE, 'src', 'main.ts'), BASE, 'plan-slice', PLANNING_DISPATCH);
247
265
  assert.strictEqual(r.block, true);
@@ -0,0 +1,109 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Shared terminal rendering helpers for GSD extension TUI surfaces.
3
+
4
+ import { truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@gsd/pi-tui";
5
+
6
+ export interface ThemeLike {
7
+ fg(color: string, text: string): string;
8
+ bold(text: string): string;
9
+ }
10
+
11
+ export function safeLine(text: string, width: number, ellipsis = "…"): string {
12
+ if (width <= 0) return "";
13
+ return truncateToWidth(text, width, ellipsis);
14
+ }
15
+
16
+ export function padRightVisible(text: string, width: number): string {
17
+ if (width <= 0) return "";
18
+ const truncated = safeLine(text, width);
19
+ const pad = Math.max(0, width - visibleWidth(truncated));
20
+ return truncated + " ".repeat(pad);
21
+ }
22
+
23
+ export function rightAlign(left: string, right: string, width: number): string {
24
+ if (width <= 0) return "";
25
+ if (!right) return safeLine(left, width);
26
+ if (!left) return safeLine(" ".repeat(Math.max(0, width - visibleWidth(right))) + right, width);
27
+ const gap = Math.max(1, width - visibleWidth(left) - visibleWidth(right));
28
+ return safeLine(left + " ".repeat(gap) + right, width);
29
+ }
30
+
31
+ export function wrapVisibleText(text: string, width: number): string[] {
32
+ if (width <= 0) return [text];
33
+ return wrapTextWithAnsi(text, width).map((line) =>
34
+ visibleWidth(line) > width ? truncateToWidth(line, width, "…") : line,
35
+ );
36
+ }
37
+
38
+ export function renderBar(theme: ThemeLike, width: number, color = "muted"): string {
39
+ return safeLine(theme.fg(color, "─".repeat(Math.max(0, width))), width, "");
40
+ }
41
+
42
+ export function renderKeyHints(theme: ThemeLike, hints: string[], width: number): string {
43
+ return safeLine(theme.fg("dim", hints.filter(Boolean).join(" │ ")), width);
44
+ }
45
+
46
+ export function renderProgressBar(
47
+ theme: ThemeLike,
48
+ done: number,
49
+ total: number,
50
+ width: number,
51
+ options: {
52
+ filledColor?: string;
53
+ emptyColor?: string;
54
+ filledChar?: string;
55
+ emptyChar?: string;
56
+ } = {},
57
+ ): string {
58
+ const barWidth = Math.max(0, width);
59
+ const pct = total > 0 ? Math.max(0, Math.min(1, done / total)) : 0;
60
+ const filled = Math.round(pct * barWidth);
61
+ const filledChar = options.filledChar ?? "█";
62
+ const emptyChar = options.emptyChar ?? "░";
63
+ return (
64
+ theme.fg(options.filledColor ?? "success", filledChar.repeat(filled)) +
65
+ theme.fg(options.emptyColor ?? "dim", emptyChar.repeat(barWidth - filled))
66
+ );
67
+ }
68
+
69
+ export function statusGlyph(
70
+ theme: ThemeLike,
71
+ level: "active" | "idle" | "warning" | "error" | "success",
72
+ ): string {
73
+ switch (level) {
74
+ case "active": return theme.fg("success", "●");
75
+ case "success": return theme.fg("success", "✓");
76
+ case "warning": return theme.fg("warning", "!");
77
+ case "error": return theme.fg("error", "x");
78
+ case "idle":
79
+ default: return theme.fg("dim", "○");
80
+ }
81
+ }
82
+
83
+ export function renderFrame(
84
+ theme: ThemeLike,
85
+ inner: string[],
86
+ width: number,
87
+ options: { borderColor?: string; paddingX?: number } = {},
88
+ ): string[] {
89
+ if (width < 4) return inner.map((line) => safeLine(line, width));
90
+
91
+ const borderColor = options.borderColor ?? "borderAccent";
92
+ const paddingX = Math.max(0, options.paddingX ?? 1);
93
+ const contentWidth = Math.max(0, width - 2 - paddingX * 2);
94
+ const border = (text: string) => theme.fg(borderColor, text);
95
+ const pad = " ".repeat(paddingX);
96
+
97
+ const lines = [border("╭" + "─".repeat(width - 2) + "╮")];
98
+ for (const line of inner) {
99
+ lines.push(
100
+ border("│") +
101
+ pad +
102
+ padRightVisible(line, contentWidth) +
103
+ pad +
104
+ border("│"),
105
+ );
106
+ }
107
+ lines.push(border("╰" + "─".repeat(width - 2) + "╯"));
108
+ return lines.map((line) => safeLine(line, width, ""));
109
+ }
@@ -1,5 +1,5 @@
1
- // GSD Watch — Header renderer: ASCII logo, session info, MCP status, remote questions
2
- // Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
1
+ // Project/App: GSD-2
2
+ // File Purpose: Watch-mode terminal header and splash renderer for GSD project status.
3
3
 
4
4
  import { execFileSync } from "node:child_process";
5
5
  import { existsSync, readFileSync } from "node:fs";
@@ -8,31 +8,67 @@ import { join } from "node:path";
8
8
  import { visibleWidth, truncateToWidth } from "@gsd/pi-tui";
9
9
  import { loadEffectiveGSDPreferences } from "../preferences.js";
10
10
  import { gsdHome } from "../gsd-home.js";
11
+ import { splashPalette } from "./splash-palette.js";
11
12
 
12
13
  // ─── Constants ────────────────────────────────────────────────────────────────
13
14
 
14
- /**
15
- * GSD ASCII logo — inlined here because the canonical src/logo.ts is outside
16
- * the resources rootDir and cannot be imported directly.
17
- */
18
15
  const GSD_LOGO: readonly string[] = [
19
- ' ██████╗ ███████╗██████╗ ',
20
- ' ██╔════╝ ██╔════╝██╔══██╗',
21
- ' ██║ ███╗███████╗██║ ██║',
22
- ' ██║ ██║╚════██║██║ ██║',
23
- ' ╚██████╔╝███████║██████╔╝',
24
- ' ╚═════╝ ╚══════╝╚═════╝ ',
16
+ " ██████╗ ███████╗██████╗ ",
17
+ " ██╔════╝ ██╔════╝██╔══██╗",
18
+ " ██║ ███╗███████╗██║ ██║",
19
+ " ██║ ██║╚════██║██║ ██║",
20
+ " ╚██████╔╝███████║██████╔╝",
21
+ " ╚═════╝ ╚══════╝╚═════╝ ",
25
22
  ];
26
23
 
27
- /** Separator character for the horizontal divider line. */
28
- const SEPARATOR_CHAR = "─";
29
-
30
- /** Vertical bar between logo and info panel. */
31
- const PANEL_DIVIDER = "│";
32
-
33
24
  /** Label column width for Model/Provider/Directory/Branch rows. */
34
25
  const LABEL_COL_WIDTH = 10;
35
26
 
27
+ const ANSI_RESET = "\x1b[0m";
28
+ const ANSI_BOLD = "\x1b[1m";
29
+
30
+ function rgb(hex: string): string {
31
+ const cleaned = hex.replace("#", "");
32
+ const r = Number.parseInt(cleaned.slice(0, 2), 16);
33
+ const g = Number.parseInt(cleaned.slice(2, 4), 16);
34
+ const b = Number.parseInt(cleaned.slice(4, 6), 16);
35
+ return `\x1b[38;2;${r};${g};${b}m`;
36
+ }
37
+
38
+ const colors = {
39
+ accent: rgb(splashPalette.accent),
40
+ border: rgb(splashPalette.border),
41
+ muted: rgb(splashPalette.muted),
42
+ dim: rgb(splashPalette.dim),
43
+ text: rgb(splashPalette.text),
44
+ success: rgb(splashPalette.success),
45
+ };
46
+
47
+ function color(text: string, colorCode: string): string {
48
+ return `${colorCode}${text}${ANSI_RESET}`;
49
+ }
50
+
51
+ function bold(text: string): string {
52
+ return `${ANSI_BOLD}${text}${ANSI_RESET}`;
53
+ }
54
+
55
+ function padVisible(text: string, width: number): string {
56
+ const clipped = truncateToWidth(text, Math.max(0, width), "");
57
+ return clipped + " ".repeat(Math.max(0, width - visibleWidth(clipped)));
58
+ }
59
+
60
+ function rightAlign(left: string, right: string, width: number): string {
61
+ if (!right) return truncateToWidth(left, width, "");
62
+ const gap = Math.max(1, width - visibleWidth(left) - visibleWidth(right));
63
+ return truncateToWidth(left + " ".repeat(gap) + right, width, "");
64
+ }
65
+
66
+ function frameLine(content: string, width: number): string {
67
+ if (width < 3) return truncateToWidth(content, Math.max(0, width), "");
68
+ const innerWidth = Math.max(0, width - 2);
69
+ return `${color("│", colors.border)}${padVisible(content, innerWidth)}${color("│", colors.border)}`;
70
+ }
71
+
36
72
  // ─── Data Readers ─────────────────────────────────────────────────────────────
37
73
 
38
74
  /**
@@ -163,12 +199,11 @@ export function gatherHeaderData(projectRoot: string): HeaderData {
163
199
  * Returns empty string if value is empty.
164
200
  */
165
201
  function formatInfoLine(label: string, value: string, availableWidth: number): string {
166
- const bold = `\x1b[1m${label}\x1b[0m`;
167
- const labelVis = visibleWidth(bold);
168
- const padding = " ".repeat(Math.max(1, LABEL_COL_WIDTH - labelVis));
202
+ const labelText = bold(color(label, colors.text));
203
+ const padding = " ".repeat(Math.max(1, LABEL_COL_WIDTH - label.length));
169
204
  const maxValueWidth = Math.max(1, availableWidth - LABEL_COL_WIDTH);
170
205
  const truncValue = truncateToWidth(value, maxValueWidth, "…");
171
- return bold + padding + truncValue;
206
+ return labelText + padding + color(truncValue, colors.muted);
172
207
  }
173
208
 
174
209
  /**
@@ -181,7 +216,7 @@ export function formatMcpRow(servers: string[], width: number): string {
181
216
  // Capitalize first letter of each server name
182
217
  const items = servers.map(s => {
183
218
  const cap = s.charAt(0).toUpperCase() + s.slice(1);
184
- return `${cap} ✓`;
219
+ return `${color(cap, colors.accent)} ${color("✓", colors.success)}`;
185
220
  });
186
221
 
187
222
  const full = items.join(" · ");
@@ -194,59 +229,65 @@ export function formatMcpRow(servers: string[], width: number): string {
194
229
  /**
195
230
  * Render the full header as an array of terminal-safe strings.
196
231
  *
197
- * Layout: GSD ASCII logo on the left, info panel on the right separated by │.
198
- * Below: MCP server row, remote questions row, separator line.
232
+ * Layout: compact GSD mark on the left with a command-center status panel on
233
+ * the right. This keeps the splash visual while making the actionable command
234
+ * and workspace state easier to scan.
199
235
  */
200
236
  export function renderHeaderLines(data: HeaderData, width: number): string[] {
201
- const lines: string[] = [];
202
-
203
- // Logo is 6 lines tall. Info panel has: title + blank + model + provider + directory + branch = 6 lines
237
+ if (width < 40) return renderStackedHeader(data, width);
238
+ const outerWidth = width;
239
+ const innerWidth = Math.max(0, outerWidth - 2);
204
240
  const logoLines = GSD_LOGO;
205
- const logoWidth = Math.max(...logoLines.map(l => visibleWidth(l)));
241
+ const logoWidth = Math.max(...logoLines.map((line) => visibleWidth(line)));
242
+ const gap = ` ${color("│", colors.dim)} `;
243
+ const panelWidth = innerWidth - logoWidth - visibleWidth(gap);
206
244
 
207
- // Calculate available width for the info panel
208
- // Layout: logo + " " + "│" + " " = logoWidth + 3
209
- const dividerOverhead = 3; // " │ "
210
- const infoPanelWidth = width - logoWidth - dividerOverhead;
211
-
212
- // If terminal is too narrow for side-by-side, fall back to stacked layout
213
- if (infoPanelWidth < 20) {
245
+ if (panelWidth < 44) {
214
246
  return renderStackedHeader(data, width);
215
247
  }
216
248
 
217
- // Build info panel lines (6 lines to match logo height)
218
- const infoLines: string[] = [
219
- `\x1b[1mGet Shit Done\x1b[0m`,
220
- "",
221
- formatInfoLine("Model", data.model, infoPanelWidth),
222
- formatInfoLine("Provider", data.provider, infoPanelWidth),
223
- formatInfoLine("Directory", data.directory, infoPanelWidth),
224
- formatInfoLine("Branch", data.branch, infoPanelWidth),
249
+ const mcpRow = formatMcpRow(data.mcpServers, Math.max(1, panelWidth - 9)) || color("none configured", colors.dim);
250
+ const panelLines = [
251
+ rightAlign(
252
+ `${color("GSD", colors.accent)} ${bold(color("Project Console", colors.text))}`,
253
+ color("idle", colors.muted),
254
+ panelWidth,
255
+ ),
256
+ rightAlign(
257
+ `${color("Project", colors.muted)} ${color(data.directory, colors.text)}`,
258
+ `${color("Command", colors.muted)} ${color("/gsd start", colors.accent)}`,
259
+ panelWidth,
260
+ ),
261
+ rightAlign(
262
+ `${color("Branch", colors.muted)} ${color(data.branch, colors.text)}`,
263
+ `${color("Mode", colors.muted)} ${color("manual", colors.text)}`,
264
+ panelWidth,
265
+ ),
266
+ rightAlign(
267
+ `${color("MCP", colors.muted)} ${mcpRow}`,
268
+ `${color("Model", colors.muted)} ${color(data.model, colors.text)}`,
269
+ panelWidth,
270
+ ),
271
+ rightAlign(
272
+ `${color("Provider", colors.muted)} ${color(data.provider, colors.text)}`,
273
+ `${color("Workspace", colors.muted)} ${color(data.directory, colors.text)}`,
274
+ panelWidth,
275
+ ),
276
+ rightAlign(
277
+ color("/gsd to begin", colors.accent),
278
+ `${color("/gsd templates", colors.muted)} ${color("/gsd help", colors.muted)}`,
279
+ panelWidth,
280
+ ),
225
281
  ];
226
282
 
227
- // Merge logo and info panel side by side
228
- const maxLines = Math.max(logoLines.length, infoLines.length);
229
- for (let i = 0; i < maxLines; i++) {
230
- const logoLine = i < logoLines.length ? logoLines[i] : "";
231
- const infoLine = i < infoLines.length ? infoLines[i] : "";
232
-
233
- // Pad logo line to consistent width
234
- const logoPad = " ".repeat(Math.max(0, logoWidth - visibleWidth(logoLine)));
235
- lines.push(`${logoLine}${logoPad} ${PANEL_DIVIDER} ${infoLine}`);
236
- }
237
-
238
- // Blank line after logo+info block
239
- lines.push("");
240
-
241
- // MCP server row
242
- const mcpRow = formatMcpRow(data.mcpServers, width);
243
- if (mcpRow) {
244
- lines.push(` ${mcpRow}`);
283
+ const lines = [
284
+ color("╭" + "─".repeat(Math.max(0, outerWidth - 2)) + "╮", colors.border),
285
+ ];
286
+ for (let i = 0; i < logoLines.length; i++) {
287
+ const logo = padVisible(color(logoLines[i], colors.border), logoWidth);
288
+ lines.push(frameLine(`${logo}${gap}${panelLines[i] ?? ""}`, outerWidth));
245
289
  }
246
-
247
- // Separator line
248
- lines.push(SEPARATOR_CHAR.repeat(width));
249
-
290
+ lines.push(color("╰" + "─".repeat(Math.max(0, outerWidth - 2)) + "╯", colors.border));
250
291
  return lines;
251
292
  }
252
293
 
@@ -254,25 +295,26 @@ export function renderHeaderLines(data: HeaderData, width: number): string[] {
254
295
  * Fallback stacked layout for narrow terminals (< 20 cols for info panel).
255
296
  */
256
297
  function renderStackedHeader(data: HeaderData, width: number): string[] {
257
- const lines: string[] = [];
298
+ const outerWidth = Math.max(0, width);
299
+ if (outerWidth < 3) {
300
+ return [color(truncateToWidth("GSD", outerWidth, ""), colors.accent)];
301
+ }
302
+ const lines: string[] = [color("╭" + "─".repeat(Math.max(0, outerWidth - 2)) + "╮", colors.border)];
258
303
 
259
304
  // Title
260
- lines.push(`\x1b[1mGet Shit Done\x1b[0m`);
261
- lines.push("");
305
+ lines.push(frameLine(`${color("GSD", colors.accent)} ${bold(color("Project Console", colors.text))}`, outerWidth));
262
306
 
263
307
  // Info
264
- lines.push(formatInfoLine("Model", data.model, width));
265
- lines.push(formatInfoLine("Provider", data.provider, width));
266
- lines.push(formatInfoLine("Directory", data.directory, width));
267
- lines.push(formatInfoLine("Branch", data.branch, width));
268
- lines.push("");
308
+ lines.push(frameLine(formatInfoLine("Project", data.directory, outerWidth - 2), outerWidth));
309
+ lines.push(frameLine(formatInfoLine("Command", "/gsd start", outerWidth - 2), outerWidth));
310
+ lines.push(frameLine(formatInfoLine("Branch", data.branch, outerWidth - 2), outerWidth));
311
+ lines.push(frameLine(formatInfoLine("Model", data.model, outerWidth - 2), outerWidth));
269
312
 
270
313
  // MCP
271
- const mcpRow = formatMcpRow(data.mcpServers, width);
272
- if (mcpRow) lines.push(` ${mcpRow}`);
273
-
274
- // Separator
275
- lines.push(SEPARATOR_CHAR.repeat(width));
314
+ const mcpRow = formatMcpRow(data.mcpServers, Math.max(1, outerWidth - 7));
315
+ if (mcpRow) lines.push(frameLine(`${color("MCP", colors.muted)} ${mcpRow}`, outerWidth));
316
+ lines.push(frameLine(`${color("/gsd to begin", colors.accent)} ${color("/gsd help", colors.muted)}`, outerWidth));
317
+ lines.push(color("╰" + "─".repeat(Math.max(0, outerWidth - 2)) + "╯", colors.border));
276
318
 
277
319
  return lines;
278
320
  }
@@ -0,0 +1,11 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Shared RGB palette for the pre-theme GSD watch splash.
3
+
4
+ export const splashPalette = {
5
+ accent: "#8db7ff",
6
+ border: "#a7ba78",
7
+ muted: "#7d889f",
8
+ dim: "#4d5870",
9
+ text: "#dce4f2",
10
+ success: "#a8c978",
11
+ } as const;
@@ -65,6 +65,10 @@ export type LogComponent =
65
65
  | "memory-embeddings" // Memory layer embedding generation
66
66
  | "memory-ingest" // Memory layer ingestion pipeline
67
67
  | "memory-backfill" // ADR-013: decisions->memories backfill
68
+ | "memory-consolidation" // ADR-013: legacy memory surface gap scanner
69
+ | "knowledge-backfill" // ADR-013: KNOWLEDGE.md->memories backfill
70
+ | "knowledge-projection" // ADR-013: KNOWLEDGE.md projection renderer
71
+ | "knowledge-capture" // ADR-013: KNOWLEDGE.md capture pipeline
68
72
  | "memory-store" // Memory CRUD layer — surfaces SQLite/store-level faults (#4967)
69
73
  | "context-mode" // Context-mode exec sandbox and compaction snapshot
70
74
  | "preflight" // Clean-root preflight gate at milestone completion
@@ -322,7 +322,7 @@ export function getRequiredWorkflowToolsForGuidedUnit(unitType: string): string[
322
322
  case "execute-task":
323
323
  return ["gsd_task_complete"];
324
324
  case "complete-slice":
325
- return ["gsd_slice_complete"];
325
+ return ["gsd_slice_complete", "gsd_task_reopen", "gsd_replan_slice"];
326
326
  default:
327
327
  return [];
328
328
  }
@@ -351,7 +351,7 @@ export function getRequiredWorkflowToolsForAutoUnit(unitType: string): string[]
351
351
  case "reactive-execute":
352
352
  return ["gsd_task_complete"];
353
353
  case "complete-slice":
354
- return ["gsd_slice_complete"];
354
+ return ["gsd_slice_complete", "gsd_task_reopen", "gsd_replan_slice"];
355
355
  case "replan-slice":
356
356
  return ["gsd_replan_slice"];
357
357
  case "reassess-roadmap":