gsd-pi 2.81.0 → 2.82.0-dev.725028083

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 (482) 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/phases.js +199 -97
  7. package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
  8. package/dist/resources/extensions/gsd/auto/session.js +9 -0
  9. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
  10. package/dist/resources/extensions/gsd/auto-dashboard.js +182 -178
  11. package/dist/resources/extensions/gsd/auto-dispatch.js +14 -11
  12. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -1
  13. package/dist/resources/extensions/gsd/auto-prompts.js +11 -3
  14. package/dist/resources/extensions/gsd/auto-recovery.js +6 -181
  15. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  16. package/dist/resources/extensions/gsd/auto-start.js +20 -23
  17. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  18. package/dist/resources/extensions/gsd/auto-verification.js +12 -6
  19. package/dist/resources/extensions/gsd/auto-worktree.js +8 -0
  20. package/dist/resources/extensions/gsd/auto.js +265 -76
  21. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +13 -6
  22. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +13 -2
  23. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  24. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  25. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -1
  26. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  27. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
  28. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  29. package/dist/resources/extensions/gsd/context-store.js +112 -0
  30. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  31. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  32. package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
  33. package/dist/resources/extensions/gsd/git-service.js +2 -1
  34. package/dist/resources/extensions/gsd/gsd-db.js +7 -23
  35. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  36. package/dist/resources/extensions/gsd/health-widget.js +4 -10
  37. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  38. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  39. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  40. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  41. package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
  42. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  43. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  44. package/dist/resources/extensions/gsd/native-git-bridge.js +14 -14
  45. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  46. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  47. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  48. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  49. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  50. package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
  51. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  52. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  53. package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
  54. package/dist/resources/extensions/gsd/session-lock.js +40 -0
  55. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
  56. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +247 -0
  57. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +50 -0
  58. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +87 -0
  59. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
  60. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
  61. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
  62. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
  63. package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
  64. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
  65. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
  66. package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
  67. package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
  68. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  69. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  70. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  71. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  72. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  73. package/dist/resources/extensions/gsd/worktree-lifecycle.js +722 -316
  74. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  75. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  76. package/dist/web/standalone/.next/BUILD_ID +1 -1
  77. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  78. package/dist/web/standalone/.next/build-manifest.json +3 -3
  79. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  80. package/dist/web/standalone/.next/required-server-files.json +3 -3
  81. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  82. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  84. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  92. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  94. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  95. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  96. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  108. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  120. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  140. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  150. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  156. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  176. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/index.html +1 -1
  186. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  187. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  188. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  189. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  190. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  191. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  192. package/dist/web/standalone/.next/server/app/page.js +2 -2
  193. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  195. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  196. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  197. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/middleware.js +2 -2
  199. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  201. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  202. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  203. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  204. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  205. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  206. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  207. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  208. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  209. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  210. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  211. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  212. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  213. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  214. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  215. package/dist/web/standalone/server.js +1 -1
  216. package/dist/welcome-screen.d.ts +0 -7
  217. package/dist/welcome-screen.js +60 -69
  218. package/package.json +3 -2
  219. package/packages/daemon/package.json +2 -2
  220. package/packages/mcp-server/README.md +2 -0
  221. package/packages/mcp-server/package.json +2 -2
  222. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  223. package/packages/native/package.json +1 -1
  224. package/packages/pi-agent-core/package.json +1 -1
  225. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  226. package/packages/pi-ai/dist/index.d.ts +2 -2
  227. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  228. package/packages/pi-ai/dist/index.js +1 -1
  229. package/packages/pi-ai/dist/index.js.map +1 -1
  230. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  231. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  232. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  233. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  234. package/packages/pi-ai/package.json +1 -1
  235. package/packages/pi-ai/src/index.ts +7 -2
  236. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  237. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  238. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  239. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  240. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  241. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  242. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  243. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  244. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
  245. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  247. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  248. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  249. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  250. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  251. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  252. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  253. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  255. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
  269. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  287. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  288. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  289. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  290. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  295. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  297. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  299. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  300. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  301. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  302. package/packages/pi-coding-agent/package.json +1 -1
  303. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  304. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  305. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
  306. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  307. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  308. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  309. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  310. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  311. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  312. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
  313. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
  314. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  315. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  316. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  317. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  318. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  319. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  320. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  321. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  322. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  323. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  324. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  325. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  326. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  327. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  328. package/packages/pi-tui/package.json +1 -1
  329. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  330. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  331. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  332. package/packages/rpc-client/package.json +1 -1
  333. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  334. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  335. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  336. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  337. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  338. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  339. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  340. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  341. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  342. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  343. package/pkg/package.json +1 -1
  344. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  345. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  346. package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
  347. package/src/resources/extensions/gsd/auto/loop.ts +113 -9
  348. package/src/resources/extensions/gsd/auto/phases.ts +158 -19
  349. package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
  350. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  351. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  352. package/src/resources/extensions/gsd/auto-dashboard.ts +230 -183
  353. package/src/resources/extensions/gsd/auto-dispatch.ts +15 -1
  354. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -1
  355. package/src/resources/extensions/gsd/auto-prompts.ts +11 -3
  356. package/src/resources/extensions/gsd/auto-recovery.ts +7 -209
  357. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  358. package/src/resources/extensions/gsd/auto-start.ts +22 -22
  359. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  360. package/src/resources/extensions/gsd/auto-verification.ts +12 -6
  361. package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
  362. package/src/resources/extensions/gsd/auto.ts +295 -75
  363. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +21 -6
  364. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -2
  365. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  366. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  367. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -1
  368. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  369. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
  370. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  371. package/src/resources/extensions/gsd/context-store.ts +120 -1
  372. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  373. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  374. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  375. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  376. package/src/resources/extensions/gsd/git-service.ts +2 -0
  377. package/src/resources/extensions/gsd/gsd-db.ts +7 -23
  378. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  379. package/src/resources/extensions/gsd/health-widget.ts +6 -10
  380. package/src/resources/extensions/gsd/journal.ts +2 -0
  381. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  382. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  383. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  384. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  385. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
  386. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  387. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  388. package/src/resources/extensions/gsd/native-git-bridge.ts +14 -13
  389. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  390. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  391. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  392. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  393. package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  394. package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
  395. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  396. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  397. package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
  398. package/src/resources/extensions/gsd/session-lock.ts +41 -0
  399. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  400. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +337 -0
  401. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +69 -0
  402. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +109 -0
  403. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  404. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  405. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  406. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  407. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  408. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  409. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
  410. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  411. package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
  412. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  413. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  414. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +99 -0
  415. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +729 -176
  416. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +291 -4
  417. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +16 -1
  418. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +18 -0
  419. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  420. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  421. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  422. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
  423. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  424. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  425. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  426. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +20 -2
  427. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +44 -0
  428. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  429. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  430. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  431. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
  432. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  433. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  434. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +26 -0
  435. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  436. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
  437. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  438. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
  439. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  440. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  441. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  442. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  443. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
  444. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  445. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
  446. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  447. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  448. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
  449. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  450. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  451. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +2 -2
  452. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
  453. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
  454. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  455. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
  456. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
  457. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  458. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +24 -0
  459. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +65 -58
  460. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +952 -0
  461. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
  462. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
  463. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  464. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  465. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +6 -0
  466. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +158 -58
  467. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +572 -118
  468. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  469. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +18 -0
  470. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  471. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  472. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  473. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  474. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  475. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1151 -524
  476. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  477. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  478. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  479. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  480. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
  481. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → KDRTXR-22LPCsa80X9dey}/_buildManifest.js +0 -0
  482. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → KDRTXR-22LPCsa80X9dey}/_ssgManifest.js +0 -0
@@ -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
  });
@@ -0,0 +1,157 @@
1
+ // ADR-011 #5750: ROADMAP.md renders sketch slices with a `[sketch]` badge.
2
+ //
3
+ // Locks in the visual distinction so an auditor scanning the rendered roadmap
4
+ // can tell which slices are sketches awaiting refine-slice expansion vs which
5
+ // already carry a full plan. Sits alongside `plan-milestone.test.ts` which
6
+ // covers the full-plan render path.
7
+
8
+ import test from "node:test";
9
+ import assert from "node:assert/strict";
10
+ import { mkdtempSync, mkdirSync, rmSync, readFileSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { tmpdir } from "node:os";
13
+
14
+ import { openDatabase, closeDatabase } from "../gsd-db.ts";
15
+ import { handlePlanMilestone, type PlanMilestoneParams } from "../tools/plan-milestone.ts";
16
+
17
+ function makeTmpBase(): string {
18
+ const base = mkdtempSync(join(tmpdir(), "gsd-plan-sketch-render-"));
19
+ mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
20
+ openDatabase(join(base, ".gsd", "gsd.db"));
21
+ return base;
22
+ }
23
+
24
+ function cleanup(base: string): void {
25
+ try {
26
+ closeDatabase();
27
+ } catch {
28
+ /* noop */
29
+ }
30
+ try {
31
+ rmSync(base, { recursive: true, force: true });
32
+ } catch {
33
+ /* noop */
34
+ }
35
+ }
36
+
37
+ function planMilestoneWithSketches(): PlanMilestoneParams {
38
+ return {
39
+ milestoneId: "M001",
40
+ title: "Progressive Planning Demo",
41
+ vision: "Demonstrate sketch slices in ROADMAP rendering.",
42
+ successCriteria: ["S01 full, S02 sketch", "ROADMAP distinguishes them"],
43
+ keyRisks: [{ risk: "Visual collision", whyItMatters: "Auditors need to spot sketches." }],
44
+ proofStrategy: [{ riskOrUnknown: "Render correctness", retireIn: "S01", whatWillBeProven: "Roadmap shows the badge." }],
45
+ verificationContract: "Contract verification text",
46
+ verificationIntegration: "Integration verification text",
47
+ verificationOperational: "Operational verification text",
48
+ verificationUat: "UAT verification text",
49
+ definitionOfDone: ["Renderer emits badge", "Test asserts it"],
50
+ requirementCoverage: "Covers ADR-011 #5750.",
51
+ boundaryMapMarkdown: "| From | To | Produces | Consumes |\n|------|----|----------|----------|\n| S01 | S02 | scaffold | nothing |",
52
+ slices: [
53
+ {
54
+ sliceId: "S01",
55
+ title: "Fully planned scaffold",
56
+ risk: "medium" as const,
57
+ depends: [],
58
+ demo: "Scaffold is in place.",
59
+ goal: "Lay down the structural foundation.",
60
+ successCriteria: "Scaffold tests pass.",
61
+ proofLevel: "integration" as const,
62
+ integrationClosure: "Downstream slices depend on this scaffold.",
63
+ observabilityImpact: "No new telemetry.",
64
+ // No isSketch flag — defaults to full plan.
65
+ },
66
+ {
67
+ sliceId: "S02",
68
+ title: "Refinement candidate",
69
+ risk: "low" as const,
70
+ depends: ["S01"],
71
+ demo: "Sketched until S01 ships.",
72
+ goal: "Refine into a full plan after S01 lands.",
73
+ successCriteria: "",
74
+ proofLevel: "",
75
+ integrationClosure: "",
76
+ observabilityImpact: "",
77
+ isSketch: true,
78
+ sketchScope: "Pick up the scaffold from S01 and add the demo behavior. Stay inside the existing module boundaries.",
79
+ },
80
+ ],
81
+ };
82
+ }
83
+
84
+ test("ROADMAP renders sketch slices with [sketch] badge and full slices without", async () => {
85
+ const base = makeTmpBase();
86
+ try {
87
+ const params = planMilestoneWithSketches();
88
+ const result = await handlePlanMilestone(params, base);
89
+ if ("error" in result) {
90
+ assert.fail(`handlePlanMilestone failed: ${result.error}`);
91
+ }
92
+
93
+ const roadmapPath = join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md");
94
+ const roadmap = readFileSync(roadmapPath, "utf-8");
95
+
96
+ // S01 is a full slice — no sketch badge.
97
+ const s01Line = roadmap.split("\n").find((line) => line.includes("**S01:"));
98
+ assert.ok(s01Line, "S01 slice line must exist in roadmap");
99
+ assert.equal(
100
+ s01Line.includes("`[sketch]`"),
101
+ false,
102
+ "fully-planned S01 must NOT carry the sketch badge",
103
+ );
104
+ assert.match(s01Line, /`risk:medium`/);
105
+
106
+ // S02 is a sketch — badge required, positioned before risk.
107
+ const s02Line = roadmap.split("\n").find((line) => line.includes("**S02:"));
108
+ assert.ok(s02Line, "S02 slice line must exist in roadmap");
109
+ assert.ok(
110
+ s02Line.includes("`[sketch]`"),
111
+ `sketch slice S02 must carry the sketch badge, got: ${s02Line}`,
112
+ );
113
+ // Badge sits before risk so it stays visible if the line truncates.
114
+ const sketchIdx = s02Line.indexOf("`[sketch]`");
115
+ const riskIdx = s02Line.indexOf("`risk:");
116
+ assert.ok(
117
+ sketchIdx >= 0 && riskIdx >= 0 && sketchIdx < riskIdx,
118
+ "sketch badge must appear before the risk tag",
119
+ );
120
+ } finally {
121
+ cleanup(base);
122
+ }
123
+ });
124
+
125
+ test("ROADMAP omits sketch badge when no slices are sketches", async () => {
126
+ const base = makeTmpBase();
127
+ try {
128
+ const params = planMilestoneWithSketches();
129
+ // Strip the sketch designation from S02 so both slices are fully planned.
130
+ params.slices[1] = {
131
+ ...params.slices[1],
132
+ isSketch: false,
133
+ successCriteria: "Demo behavior works.",
134
+ proofLevel: "unit" as const,
135
+ integrationClosure: "S02 closes the demo behavior.",
136
+ observabilityImpact: "No new telemetry.",
137
+ };
138
+
139
+ const result = await handlePlanMilestone(params, base);
140
+ if ("error" in result) {
141
+ assert.fail(`handlePlanMilestone failed: ${result.error}`);
142
+ }
143
+
144
+ const roadmap = readFileSync(
145
+ join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
146
+ "utf-8",
147
+ );
148
+
149
+ assert.equal(
150
+ roadmap.includes("`[sketch]`"),
151
+ false,
152
+ "roadmap must not carry the sketch badge when no slice is a sketch",
153
+ );
154
+ } finally {
155
+ cleanup(base);
156
+ }
157
+ });
@@ -250,14 +250,14 @@ describe("Post-execution blocking failure retry bypass", () => {
250
250
  const s = makeMockSession(tempDir, { type: "execute-task", id: "M001/S01/T01" });
251
251
 
252
252
  // Pre-set some retry state
253
- s.verificationRetryCount.set("M001/S01/T01", 2);
253
+ s.verificationRetryCount.set("execute-task:M001/S01/T01", 2);
254
254
 
255
255
  const vctx: VerificationContext = { s, ctx, pi };
256
256
  const result = await runPostUnitVerification(vctx, pauseAutoMock);
257
257
 
258
258
  // On success, retry count should be cleared
259
259
  assert.equal(result, "continue");
260
- assert.equal(s.verificationRetryCount.has("M001/S01/T01"), false);
260
+ assert.equal(s.verificationRetryCount.has("execute-task:M001/S01/T01"), false);
261
261
  });
262
262
 
263
263
  test("post-exec failure notification mentions cross-task consistency", async () => {
@@ -14,9 +14,9 @@ import {
14
14
  insertMilestone,
15
15
  insertSlice,
16
16
  setSliceSketchFlag,
17
- autoHealSketchFlags,
18
17
  getSlice,
19
18
  } from "../gsd-db.ts";
19
+ import { autoHealSketchFlags } from "../state-reconciliation/drift/sketch-flag.ts";
20
20
  import { deriveStateFromDb } from "../state.ts";
21
21
  import { resolveDispatch } from "../auto-dispatch.ts";
22
22
  import type { DispatchContext } from "../auto-dispatch.ts";
@@ -55,6 +55,14 @@ test("system prompt hard rules forbid fabricating user responses", () => {
55
55
  assert.match(prompt, /ask_user_questions.*only valid structured user input/i);
56
56
  });
57
57
 
58
+ test("system prompt requires reading before edit or overwrite", () => {
59
+ const prompt = readPrompt("system");
60
+ assert.match(prompt, /Read before edit or overwrite/i);
61
+ assert.match(prompt, /Before any write that creates or replaces a file/i);
62
+ assert.match(prompt, /confirm whether the path exists; if it does, `read` it first/i);
63
+ assert.match(prompt, /For truly new files, confirm the path does not already exist/i);
64
+ });
65
+
58
66
  test("discuss prompt allows implementation questions when they materially matter", () => {
59
67
  const prompt = readPrompt("discuss");
60
68
  assert.match(prompt, /Lead with experience, but ask implementation when it materially matters/i);
@@ -64,6 +72,16 @@ test("discuss prompt allows implementation questions when they materially matter
64
72
  assert.doesNotMatch(prompt, /Questions must be about the experience, not the implementation/i);
65
73
  });
66
74
 
75
+ test("discuss prompt ends milestone planning with next-step handoff", () => {
76
+ const prompt = readPrompt("discuss");
77
+ assert.match(prompt, /Next steps:/);
78
+ assert.match(prompt, /\/gsd auto/);
79
+ assert.match(prompt, /\/gsd status/);
80
+ assert.match(prompt, /\/gsd visualize/);
81
+ assert.match(prompt, /\/gsd notifications/);
82
+ assert.doesNotMatch(prompt, /nothing else\. Auto-mode will start automatically/);
83
+ });
84
+
67
85
  test("guided discussion prompts avoid wrap-up prompts after every round", () => {
68
86
  const milestonePrompt = readPrompt("guided-discuss-milestone");
69
87
  const slicePrompt = readPrompt("guided-discuss-slice");
@@ -217,6 +235,17 @@ test("complete-slice prompt does not instruct LLM to toggle checkboxes manually"
217
235
  assert.doesNotMatch(prompt, /change \[ \] to \[x\]/);
218
236
  });
219
237
 
238
+ test("complete-slice prompt keeps source fixes in execution units", () => {
239
+ const prompt = readPrompt("complete-slice");
240
+ assert.match(prompt, /Do not use direct `bash` for verification commands/i);
241
+ assert.match(prompt, /do \*\*not\*\* edit source files in this unit/i);
242
+ assert.match(prompt, /do \*\*not\*\* call `gsd_slice_complete`/i);
243
+ assert.match(prompt, /gsd_task_reopen/);
244
+ assert.match(prompt, /gsd_replan_slice/);
245
+ assert.match(prompt, /needs execution follow-up/i);
246
+ assert.doesNotMatch(prompt, /Fix failures before marking done/i);
247
+ });
248
+
220
249
  test("complete-slice prompt instructs writing summary and UAT files before tool call", () => {
221
250
  const prompt = readPrompt("complete-slice");
222
251
  assert.match(prompt, /\{\{sliceSummaryPath\}\}/);
@@ -363,7 +392,9 @@ test("execute-task prompt uses camelCase parameter names matching TypeBox schema
363
392
  test("complete-slice prompt uses camelCase parameter names matching TypeBox schema", () => {
364
393
  const prompt = readPrompt("complete-slice");
365
394
  // The gsd_complete_slice tool schema uses camelCase: milestoneId, sliceId
366
- const toolCallLine = prompt.split("\n").find((l) => /gsd_complete_slice/.test(l) || /gsd_slice_complete/.test(l));
395
+ const toolCallLine = prompt.split("\n").find((l) =>
396
+ (/gsd_complete_slice/.test(l) || /gsd_slice_complete/.test(l)) && /milestoneId/.test(l) && /sliceId/.test(l)
397
+ );
367
398
  assert.ok(toolCallLine, "prompt must contain a gsd_complete_slice or gsd_slice_complete tool call line");
368
399
  assert.doesNotMatch(toolCallLine!, /milestone_id/, "must use milestoneId, not milestone_id");
369
400
  assert.doesNotMatch(toolCallLine!, /slice_id/, "must use sliceId, not slice_id");