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
@@ -0,0 +1,337 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: ADR-017 unmerged-merge-state drift handler. Relocated from
3
+ // auto-recovery.ts as part of issue #5701. Owns:
4
+ // - rebase/cherry-pick/revert leftover cleanup (#4980 HIGH-7)
5
+ // - MERGE_HEAD / SQUASH_MSG reconciliation with auto-resolve of .gsd/
6
+ // conflicts (#530, #2542)
7
+
8
+ import { execFileSync } from "node:child_process";
9
+ import { existsSync, unlinkSync } from "node:fs";
10
+ import { isAbsolute, join, resolve } from "node:path";
11
+
12
+ import type { ExtensionContext } from "@gsd/pi-coding-agent";
13
+
14
+ import { getErrorMessage } from "../../error-utils.js";
15
+ import {
16
+ nativeAddPaths,
17
+ nativeCheckoutTheirs,
18
+ nativeCommit,
19
+ nativeConflictFiles,
20
+ nativeMergeAbort,
21
+ nativeRebaseAbort,
22
+ nativeResetHard,
23
+ } from "../../native-git-bridge.js";
24
+ import type { GSDState } from "../../types.js";
25
+ import { logError, logWarning } from "../../workflow-logger.js";
26
+ import type { DriftContext, DriftHandler, DriftRecord } from "../types.js";
27
+
28
+ export type MergeReconcileResult = "clean" | "reconciled" | "blocked";
29
+
30
+ type NotifyFn = (
31
+ message: string,
32
+ severity: "info" | "warning" | "error",
33
+ ) => void;
34
+
35
+ const SILENT_NOTIFY: NotifyFn = () => {};
36
+
37
+ function resolveGitDir(basePath: string): string {
38
+ try {
39
+ const gitDir = execFileSync("git", ["rev-parse", "--git-dir"], {
40
+ cwd: basePath,
41
+ stdio: ["ignore", "pipe", "pipe"],
42
+ encoding: "utf-8",
43
+ }).trim();
44
+
45
+ if (gitDir.length > 0) {
46
+ return isAbsolute(gitDir) ? gitDir : resolve(basePath, gitDir);
47
+ }
48
+ } catch (err) {
49
+ logWarning("recovery", `gitdir resolution failed: ${getErrorMessage(err)}`);
50
+ }
51
+
52
+ return join(basePath, ".git");
53
+ }
54
+
55
+ /**
56
+ * Best-effort abort of a pending merge/squash and hard-reset to HEAD.
57
+ * Handles both real merges (MERGE_HEAD) and squash merges (SQUASH_MSG).
58
+ */
59
+ function abortAndResetMerge(
60
+ basePath: string,
61
+ hasMergeHead: boolean,
62
+ squashMsgPath: string,
63
+ ): void {
64
+ if (hasMergeHead) {
65
+ try {
66
+ nativeMergeAbort(basePath);
67
+ } catch (err) {
68
+ /* best-effort */
69
+ logWarning(
70
+ "recovery",
71
+ `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`,
72
+ );
73
+ }
74
+ } else if (squashMsgPath) {
75
+ try {
76
+ unlinkSync(squashMsgPath);
77
+ } catch (err) {
78
+ /* best-effort */
79
+ logWarning(
80
+ "recovery",
81
+ `file unlink failed: ${err instanceof Error ? err.message : String(err)}`,
82
+ );
83
+ }
84
+ }
85
+ try {
86
+ nativeResetHard(basePath);
87
+ } catch (err) {
88
+ /* best-effort */
89
+ logError(
90
+ "recovery",
91
+ `git reset failed: ${err instanceof Error ? err.message : String(err)}`,
92
+ );
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Detect and abort other in-progress git operations left behind by a SIGKILL'd
98
+ * worker (rebase, cherry-pick, revert). Without this, a killed worker
99
+ * mid-rebase leaves `.git/rebase-merge/` or `.git/CHERRY_PICK_HEAD` and the
100
+ * worktree is wedged until the user manually runs the matching `--abort`.
101
+ *
102
+ * Called before merge-state reconciliation because these states block any
103
+ * subsequent merge/commit operation. (#4980 HIGH-7)
104
+ */
105
+ function reconcileOtherInProgressGitOps(
106
+ basePath: string,
107
+ notify: NotifyFn,
108
+ ): MergeReconcileResult {
109
+ const gitDir = resolveGitDir(basePath);
110
+ const states: Array<{
111
+ label: string;
112
+ indicators: string[];
113
+ abort: () => void;
114
+ }> = [
115
+ {
116
+ label: "rebase",
117
+ indicators: [join(gitDir, "rebase-merge"), join(gitDir, "rebase-apply")],
118
+ abort: () => nativeRebaseAbort(basePath),
119
+ },
120
+ {
121
+ label: "cherry-pick",
122
+ indicators: [join(gitDir, "CHERRY_PICK_HEAD")],
123
+ abort: () => {
124
+ try {
125
+ execFileSync("git", ["cherry-pick", "--abort"], {
126
+ cwd: basePath,
127
+ stdio: ["ignore", "pipe", "pipe"],
128
+ encoding: "utf-8",
129
+ });
130
+ } catch (err) {
131
+ throw new Error(`cherry-pick --abort failed: ${getErrorMessage(err)}`);
132
+ }
133
+ },
134
+ },
135
+ {
136
+ label: "revert",
137
+ indicators: [join(gitDir, "REVERT_HEAD")],
138
+ abort: () => {
139
+ try {
140
+ execFileSync("git", ["revert", "--abort"], {
141
+ cwd: basePath,
142
+ stdio: ["ignore", "pipe", "pipe"],
143
+ encoding: "utf-8",
144
+ });
145
+ } catch (err) {
146
+ throw new Error(`revert --abort failed: ${getErrorMessage(err)}`);
147
+ }
148
+ },
149
+ },
150
+ ];
151
+
152
+ let reconciled = false;
153
+ for (const s of states) {
154
+ const present = s.indicators.some((p) => existsSync(p));
155
+ if (!present) continue;
156
+ try {
157
+ s.abort();
158
+ notify(
159
+ `Detected leftover ${s.label} state from prior session — aborted.`,
160
+ "warning",
161
+ );
162
+ reconciled = true;
163
+ } catch (err) {
164
+ logError("recovery", `${s.label} abort failed: ${getErrorMessage(err)}`);
165
+ notify(
166
+ `Detected leftover ${s.label} state but auto-abort failed. ` +
167
+ `Run \`git ${s.label} --abort\` manually before retrying.`,
168
+ "error",
169
+ );
170
+ return "blocked";
171
+ }
172
+ }
173
+ return reconciled ? "reconciled" : "clean";
174
+ }
175
+
176
+ /**
177
+ * Core: detect leftover merge state and reconcile it. Takes a NotifyFn so the
178
+ * legacy reconcileMergeState(basePath, ctx) wrapper and the drift handler can
179
+ * both call it — the drift handler uses SILENT_NOTIFY.
180
+ */
181
+ function reconcileMergeStateCore(
182
+ basePath: string,
183
+ notify: NotifyFn,
184
+ ): MergeReconcileResult {
185
+ // First, abort any rebase/cherry-pick/revert left over from a SIGKILL'd
186
+ // worker. Doing this before the merge-state check unblocks any merge that
187
+ // would otherwise refuse with "you have unfinished operation". (HIGH-7)
188
+ const otherOpsResult = reconcileOtherInProgressGitOps(basePath, notify);
189
+ if (otherOpsResult === "blocked") return "blocked";
190
+
191
+ const gitDir = resolveGitDir(basePath);
192
+ const mergeHeadPath = join(gitDir, "MERGE_HEAD");
193
+ const squashMsgPath = join(gitDir, "SQUASH_MSG");
194
+ const hasMergeHead = existsSync(mergeHeadPath);
195
+ const hasSquashMsg = existsSync(squashMsgPath);
196
+ if (!hasMergeHead && !hasSquashMsg) {
197
+ return otherOpsResult === "reconciled" ? "reconciled" : "clean";
198
+ }
199
+
200
+ const conflictedFiles = nativeConflictFiles(basePath);
201
+ if (conflictedFiles.length === 0) {
202
+ // All conflicts resolved — finalize the merge/squash commit
203
+ try {
204
+ const commitSha = nativeCommit(basePath, "chore(gsd): reconcile merge state");
205
+ if (commitSha) {
206
+ const mode = hasMergeHead ? "merge" : "squash commit";
207
+ notify(`Finalized leftover ${mode} from prior session.`, "info");
208
+ } else {
209
+ notify(
210
+ "No new commit needed for leftover merge/squash state — already committed.",
211
+ "info",
212
+ );
213
+ }
214
+ } catch (err) {
215
+ const errorMessage = getErrorMessage(err);
216
+ notify(
217
+ `Failed to finalize leftover merge/squash commit: ${errorMessage}`,
218
+ "error",
219
+ );
220
+ return "blocked";
221
+ }
222
+ } else {
223
+ // Still conflicted — try auto-resolving .gsd/ state file conflicts (#530)
224
+ const gsdConflicts = conflictedFiles.filter((f) => f.startsWith(".gsd/"));
225
+ const codeConflicts = conflictedFiles.filter((f) => !f.startsWith(".gsd/"));
226
+
227
+ if (gsdConflicts.length > 0 && codeConflicts.length === 0) {
228
+ let resolved = true;
229
+ try {
230
+ nativeCheckoutTheirs(basePath, gsdConflicts);
231
+ nativeAddPaths(basePath, gsdConflicts);
232
+ } catch (e) {
233
+ logError(
234
+ "recovery",
235
+ `auto-resolve .gsd/ conflicts failed: ${(e as Error).message}`,
236
+ );
237
+ resolved = false;
238
+ }
239
+ if (resolved) {
240
+ try {
241
+ nativeCommit(
242
+ basePath,
243
+ "chore: auto-resolve .gsd/ state file conflicts",
244
+ );
245
+ notify(
246
+ `Auto-resolved ${gsdConflicts.length} .gsd/ state file conflict(s) from prior merge.`,
247
+ "info",
248
+ );
249
+ } catch (e) {
250
+ logError(
251
+ "recovery",
252
+ `auto-commit .gsd/ conflict resolution failed: ${(e as Error).message}`,
253
+ );
254
+ resolved = false;
255
+ }
256
+ }
257
+ if (!resolved) {
258
+ abortAndResetMerge(basePath, hasMergeHead, squashMsgPath);
259
+ notify(
260
+ "Detected leftover merge state — auto-resolve failed, cleaned up. Re-deriving state.",
261
+ "warning",
262
+ );
263
+ }
264
+ } else {
265
+ // Code conflicts present — fail safe and preserve any manual resolution
266
+ // work instead of discarding it with merge --abort/reset --hard.
267
+ notify(
268
+ "Detected leftover merge state with unresolved code conflicts. Auto-mode will pause without modifying the worktree so manual conflict resolution is preserved.",
269
+ "error",
270
+ );
271
+ return "blocked";
272
+ }
273
+ }
274
+ return "reconciled";
275
+ }
276
+
277
+ /**
278
+ * Legacy entry point preserved for existing callers (auto.ts, auto/phases.ts
279
+ * via loop-deps, integration tests). New code prefers the drift handler.
280
+ */
281
+ export function reconcileMergeState(
282
+ basePath: string,
283
+ ctx: ExtensionContext,
284
+ ): MergeReconcileResult {
285
+ return reconcileMergeStateCore(basePath, (message, severity) =>
286
+ ctx.ui.notify(message, severity),
287
+ );
288
+ }
289
+
290
+ // ─── Drift Handler ────────────────────────────────────────────────────────────
291
+
292
+ type MergeStateDrift = Extract<DriftRecord, { kind: "unmerged-merge-state" }>;
293
+
294
+ function hasMergeStateLeftovers(basePath: string): boolean {
295
+ const gitDir = resolveGitDir(basePath);
296
+ return (
297
+ existsSync(join(gitDir, "MERGE_HEAD")) ||
298
+ existsSync(join(gitDir, "SQUASH_MSG")) ||
299
+ existsSync(join(gitDir, "rebase-merge")) ||
300
+ existsSync(join(gitDir, "rebase-apply")) ||
301
+ existsSync(join(gitDir, "CHERRY_PICK_HEAD")) ||
302
+ existsSync(join(gitDir, "REVERT_HEAD"))
303
+ );
304
+ }
305
+
306
+ export function detectMergeStateDrift(
307
+ _state: GSDState,
308
+ ctx: DriftContext,
309
+ ): MergeStateDrift[] {
310
+ if (hasMergeStateLeftovers(ctx.basePath)) {
311
+ return [{ kind: "unmerged-merge-state", basePath: ctx.basePath }];
312
+ }
313
+ return [];
314
+ }
315
+
316
+ /**
317
+ * Repair: invoke the reconciliation core with a silent notify. If the
318
+ * underlying reconciliation reports "blocked" (e.g., unresolved code
319
+ * conflicts present), throw so reconcileBeforeDispatch surfaces the drift
320
+ * via ReconciliationFailedError.
321
+ */
322
+ export function repairMergeStateDrift(record: MergeStateDrift): void {
323
+ const result = reconcileMergeStateCore(record.basePath, SILENT_NOTIFY);
324
+ if (result === "blocked") {
325
+ throw new Error(
326
+ `Merge state reconciliation blocked for ${record.basePath} — likely unresolved code conflicts. Manual intervention required.`,
327
+ );
328
+ }
329
+ }
330
+
331
+ export const mergeStateHandler: DriftHandler<MergeStateDrift> = {
332
+ kind: "unmerged-merge-state",
333
+ detect: detectMergeStateDrift,
334
+ repair: (record) => {
335
+ repairMergeStateDrift(record);
336
+ },
337
+ };
@@ -0,0 +1,69 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: ADR-017 unregistered-milestone drift handler. Detects
3
+ // milestones whose on-disk directory has meaningful content (ROADMAP/
4
+ // CONTEXT/SUMMARY) but no DB row, then runs the markdown importer to
5
+ // reconcile. PROJECT.md is the human-facing index — the importer's source
6
+ // of truth is the .gsd/milestones/ directory tree.
7
+
8
+ import { existsSync } from "node:fs";
9
+
10
+ import { getMilestone, isDbAvailable } from "../../gsd-db.js";
11
+ import { migrateHierarchyToDb } from "../../md-importer.js";
12
+ import { findMilestoneIds } from "../../milestone-ids.js";
13
+ import { resolveMilestoneFile } from "../../paths.js";
14
+ import type { GSDState } from "../../types.js";
15
+ import type { DriftContext, DriftHandler, DriftRecord } from "../types.js";
16
+
17
+ type UnregisteredMilestoneDrift = Extract<
18
+ DriftRecord,
19
+ { kind: "unregistered-milestone" }
20
+ >;
21
+
22
+ function milestoneHasContent(basePath: string, milestoneId: string): boolean {
23
+ const roadmap = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
24
+ const context = resolveMilestoneFile(basePath, milestoneId, "CONTEXT");
25
+ const summary = resolveMilestoneFile(basePath, milestoneId, "SUMMARY");
26
+ return (
27
+ (roadmap !== null && existsSync(roadmap)) ||
28
+ (context !== null && existsSync(context)) ||
29
+ (summary !== null && existsSync(summary))
30
+ );
31
+ }
32
+
33
+ export function detectUnregisteredMilestoneDrift(
34
+ _state: GSDState,
35
+ ctx: DriftContext,
36
+ ): UnregisteredMilestoneDrift[] {
37
+ if (!isDbAvailable()) return [];
38
+
39
+ const drifts: UnregisteredMilestoneDrift[] = [];
40
+ for (const milestoneId of findMilestoneIds(ctx.basePath)) {
41
+ if (getMilestone(milestoneId)) continue;
42
+ if (!milestoneHasContent(ctx.basePath, milestoneId)) continue;
43
+ drifts.push({ kind: "unregistered-milestone", milestoneId });
44
+ }
45
+ return drifts;
46
+ }
47
+
48
+ /**
49
+ * Repair: invoke the markdown importer. migrateHierarchyToDb walks the same
50
+ * findMilestoneIds list the detector uses and INSERTs OR IGNOREs every
51
+ * missing milestone (and its slices/tasks) — idempotent under cap=2 retry.
52
+ *
53
+ * Note: even though we receive one record at a time, the importer is a
54
+ * project-wide operation. Repeated invocation across multiple drift records
55
+ * in the same pass is wasteful but safe; a future optimization could
56
+ * coalesce by checking whether the importer has already run this pass.
57
+ */
58
+ export function repairUnregisteredMilestone(
59
+ _record: UnregisteredMilestoneDrift,
60
+ ctx: DriftContext,
61
+ ): void {
62
+ migrateHierarchyToDb(ctx.basePath);
63
+ }
64
+
65
+ export const unregisteredMilestoneHandler: DriftHandler<UnregisteredMilestoneDrift> = {
66
+ kind: "unregistered-milestone",
67
+ detect: detectUnregisteredMilestoneDrift,
68
+ repair: repairUnregisteredMilestone,
69
+ };
@@ -0,0 +1,109 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: ADR-017 roadmap-divergence drift handler. Detects mismatches
3
+ // between ROADMAP.md (parsed slice sequence + depends declarations) and the
4
+ // DB slice rows for that milestone, then reconciles via the markdown
5
+ // importer plus an explicit junction-table sync.
6
+
7
+ import { existsSync, readFileSync } from "node:fs";
8
+
9
+ import {
10
+ getMilestone,
11
+ getMilestoneSlices,
12
+ isDbAvailable,
13
+ syncSliceDependencies,
14
+ } from "../../gsd-db.js";
15
+ import { migrateHierarchyToDb } from "../../md-importer.js";
16
+ import { findMilestoneIds } from "../../milestone-ids.js";
17
+ import { parseRoadmap } from "../../parsers-legacy.js";
18
+ import { resolveMilestoneFile } from "../../paths.js";
19
+ import type { GSDState } from "../../types.js";
20
+ import type { DriftContext, DriftHandler, DriftRecord } from "../types.js";
21
+
22
+ type RoadmapDivergenceDrift = Extract<
23
+ DriftRecord,
24
+ { kind: "roadmap-divergence" }
25
+ >;
26
+
27
+ function arraysEqual(a: readonly string[], b: readonly string[]): boolean {
28
+ if (a.length !== b.length) return false;
29
+ for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;
30
+ return true;
31
+ }
32
+
33
+ function milestoneHasDivergence(
34
+ basePath: string,
35
+ milestoneId: string,
36
+ ): boolean {
37
+ const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
38
+ if (!roadmapPath || !existsSync(roadmapPath)) return false;
39
+
40
+ let roadmap: ReturnType<typeof parseRoadmap>;
41
+ try {
42
+ roadmap = parseRoadmap(readFileSync(roadmapPath, "utf-8"));
43
+ } catch {
44
+ return false;
45
+ }
46
+
47
+ const dbSlices = getMilestoneSlices(milestoneId);
48
+ const dbSliceMap = new Map(dbSlices.map((s) => [s.id, s]));
49
+
50
+ for (let i = 0; i < roadmap.slices.length; i++) {
51
+ const roadmapSlice = roadmap.slices[i]!;
52
+ const expectedSequence = i + 1;
53
+ const dbSlice = dbSliceMap.get(roadmapSlice.id);
54
+ if (!dbSlice) return true; // Roadmap has a slice the DB doesn't.
55
+ if (dbSlice.sequence !== expectedSequence) return true;
56
+ if (!arraysEqual(dbSlice.depends, roadmapSlice.depends)) return true;
57
+ }
58
+ return false;
59
+ }
60
+
61
+ export function detectRoadmapDivergenceDrift(
62
+ _state: GSDState,
63
+ ctx: DriftContext,
64
+ ): RoadmapDivergenceDrift[] {
65
+ if (!isDbAvailable()) return [];
66
+
67
+ const drifts: RoadmapDivergenceDrift[] = [];
68
+ for (const milestoneId of findMilestoneIds(ctx.basePath)) {
69
+ // Skip milestones that don't yet have a DB row — that's the
70
+ // unregistered-milestone drift handler's responsibility.
71
+ if (!getMilestone(milestoneId)) continue;
72
+ if (milestoneHasDivergence(ctx.basePath, milestoneId)) {
73
+ drifts.push({ kind: "roadmap-divergence", milestoneId });
74
+ }
75
+ }
76
+ return drifts;
77
+ }
78
+
79
+ /**
80
+ * Repair a milestone's roadmap divergence:
81
+ * 1. migrateHierarchyToDb upserts slice rows (sequence + depends JSON
82
+ * update via ON CONFLICT DO UPDATE).
83
+ * 2. syncSliceDependencies updates the junction table per slice — the
84
+ * importer only writes the JSON column, not the relational view.
85
+ */
86
+ export function repairRoadmapDivergence(
87
+ record: RoadmapDivergenceDrift,
88
+ ctx: DriftContext,
89
+ ): void {
90
+ migrateHierarchyToDb(ctx.basePath);
91
+
92
+ const roadmapPath = resolveMilestoneFile(ctx.basePath, record.milestoneId, "ROADMAP");
93
+ if (!roadmapPath || !existsSync(roadmapPath)) return;
94
+
95
+ try {
96
+ const roadmap = parseRoadmap(readFileSync(roadmapPath, "utf-8"));
97
+ for (const slice of roadmap.slices) {
98
+ syncSliceDependencies(record.milestoneId, slice.id, slice.depends);
99
+ }
100
+ } catch {
101
+ /* parse failure: detector will fire again next pass */
102
+ }
103
+ }
104
+
105
+ export const roadmapDivergenceHandler: DriftHandler<RoadmapDivergenceDrift> = {
106
+ kind: "roadmap-divergence",
107
+ detect: detectRoadmapDivergenceDrift,
108
+ repair: repairRoadmapDivergence,
109
+ };
@@ -0,0 +1,68 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: ADR-017 stale-sketch-flag drift handler. Relocated from
3
+ // gsd-db.ts where autoHealSketchFlags previously lived with zero callers.
4
+ //
5
+ // Recovers from two scenarios (per ADR-011):
6
+ // 1. Crash between gsd_plan_slice's PLAN.md write and the sketch flag flip.
7
+ // 2. Flag-OFF downgrade: when progressive_planning is off, dispatch routes
8
+ // sketch slices to plan-slice, which writes PLAN.md but leaves
9
+ // is_sketch=1 — the next reconciliation pass clears it.
10
+
11
+ import { existsSync } from "node:fs";
12
+
13
+ import {
14
+ getSketchedSliceIds,
15
+ isDbAvailable,
16
+ setSliceSketchFlag,
17
+ } from "../../gsd-db.js";
18
+ import { resolveSliceFile } from "../../paths.js";
19
+ import type { GSDState } from "../../types.js";
20
+ import type { DriftContext, DriftHandler, DriftRecord } from "../types.js";
21
+
22
+ type SketchFlagDrift = Extract<DriftRecord, { kind: "stale-sketch-flag" }>;
23
+
24
+ export function detectStaleSketchFlags(
25
+ state: GSDState,
26
+ ctx: DriftContext,
27
+ ): SketchFlagDrift[] {
28
+ if (!isDbAvailable()) return [];
29
+ const mid = state.activeMilestone?.id;
30
+ if (!mid) return [];
31
+
32
+ const sliceIds = getSketchedSliceIds(mid);
33
+ return sliceIds
34
+ .filter((sid) => {
35
+ const planPath = resolveSliceFile(ctx.basePath, mid, sid, "PLAN");
36
+ return planPath !== null && existsSync(planPath);
37
+ })
38
+ .map((sid) => ({ kind: "stale-sketch-flag" as const, mid, sid }));
39
+ }
40
+
41
+ export function repairStaleSketchFlag(record: SketchFlagDrift): void {
42
+ setSliceSketchFlag(record.mid, record.sid, false);
43
+ }
44
+
45
+ export const sketchFlagHandler: DriftHandler<SketchFlagDrift> = {
46
+ kind: "stale-sketch-flag",
47
+ detect: detectStaleSketchFlags,
48
+ repair: (record) => {
49
+ repairStaleSketchFlag(record);
50
+ },
51
+ };
52
+
53
+ /**
54
+ * Legacy entry point preserved for callers that supply a custom hasPlanFile
55
+ * predicate. Prefer the drift handler (sketchFlagHandler) for new code.
56
+ */
57
+ export function autoHealSketchFlags(
58
+ milestoneId: string,
59
+ hasPlanFile: (sliceId: string) => boolean,
60
+ ): void {
61
+ if (!isDbAvailable()) return;
62
+ const sliceIds = getSketchedSliceIds(milestoneId);
63
+ for (const sid of sliceIds) {
64
+ if (hasPlanFile(sid)) {
65
+ setSliceSketchFlag(milestoneId, sid, false);
66
+ }
67
+ }
68
+ }