gsd-pi 2.33.1-dev.ee47f1b → 2.34.0-dev.0150ae9

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 (356) hide show
  1. package/dist/bundled-resource-path.d.ts +8 -0
  2. package/dist/bundled-resource-path.js +14 -0
  3. package/dist/headless-query.js +6 -6
  4. package/dist/resources/extensions/gsd/auto/session.js +27 -32
  5. package/dist/resources/extensions/gsd/auto-dashboard.js +29 -109
  6. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +6 -1
  7. package/dist/resources/extensions/gsd/auto-dispatch.js +52 -81
  8. package/dist/resources/extensions/gsd/auto-loop.js +956 -0
  9. package/dist/resources/extensions/gsd/auto-observability.js +4 -2
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +75 -185
  11. package/dist/resources/extensions/gsd/auto-prompts.js +133 -101
  12. package/dist/resources/extensions/gsd/auto-recovery.js +59 -97
  13. package/dist/resources/extensions/gsd/auto-start.js +330 -309
  14. package/dist/resources/extensions/gsd/auto-supervisor.js +5 -11
  15. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -7
  16. package/dist/resources/extensions/gsd/auto-timers.js +3 -4
  17. package/dist/resources/extensions/gsd/auto-verification.js +35 -73
  18. package/dist/resources/extensions/gsd/auto-worktree-sync.js +167 -0
  19. package/dist/resources/extensions/gsd/auto-worktree.js +291 -126
  20. package/dist/resources/extensions/gsd/auto.js +283 -1013
  21. package/dist/resources/extensions/gsd/captures.js +10 -4
  22. package/dist/resources/extensions/gsd/dispatch-guard.js +7 -8
  23. package/dist/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  24. package/dist/resources/extensions/gsd/doctor-checks.js +3 -4
  25. package/dist/resources/extensions/gsd/git-service.js +1 -1
  26. package/dist/resources/extensions/gsd/gsd-db.js +296 -151
  27. package/dist/resources/extensions/gsd/index.js +92 -228
  28. package/dist/resources/extensions/gsd/post-unit-hooks.js +13 -13
  29. package/dist/resources/extensions/gsd/progress-score.js +61 -156
  30. package/dist/resources/extensions/gsd/quick.js +98 -122
  31. package/dist/resources/extensions/gsd/session-lock.js +13 -0
  32. package/dist/resources/extensions/gsd/templates/preferences.md +1 -0
  33. package/dist/resources/extensions/gsd/undo.js +43 -48
  34. package/dist/resources/extensions/gsd/unit-runtime.js +16 -15
  35. package/dist/resources/extensions/gsd/verification-evidence.js +0 -1
  36. package/dist/resources/extensions/gsd/verification-gate.js +6 -35
  37. package/dist/resources/extensions/gsd/worktree-command.js +30 -24
  38. package/dist/resources/extensions/gsd/worktree-manager.js +2 -3
  39. package/dist/resources/extensions/gsd/worktree-resolver.js +344 -0
  40. package/dist/resources/extensions/gsd/worktree.js +7 -44
  41. package/dist/resources/extensions/mcp-client/index.js +2 -1
  42. package/dist/tool-bootstrap.js +59 -11
  43. package/dist/worktree-cli.js +7 -7
  44. package/package.json +1 -1
  45. package/packages/native/dist/native.d.ts +0 -2
  46. package/packages/native/dist/native.js +0 -2
  47. package/packages/native/src/native.ts +0 -3
  48. package/packages/pi-agent-core/dist/proxy.d.ts +1 -25
  49. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  50. package/packages/pi-agent-core/dist/proxy.js +1 -1
  51. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  52. package/packages/pi-agent-core/src/proxy.ts +1 -1
  53. package/packages/pi-ai/dist/api-registry.d.ts +0 -2
  54. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  55. package/packages/pi-ai/dist/api-registry.js +0 -10
  56. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  57. package/packages/pi-ai/dist/models.generated.d.ts +3630 -5483
  58. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  59. package/packages/pi-ai/dist/models.generated.js +735 -2588
  60. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  61. package/packages/pi-ai/dist/providers/anthropic.d.ts +0 -8
  62. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  63. package/packages/pi-ai/dist/providers/anthropic.js +1 -1
  64. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  65. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts +0 -1
  66. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  67. package/packages/pi-ai/dist/providers/github-copilot-headers.js +1 -1
  68. package/packages/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  69. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts +1 -43
  70. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  71. package/packages/pi-ai/dist/providers/google-gemini-cli.js +2 -2
  72. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  73. package/packages/pi-ai/dist/providers/google-shared.d.ts +0 -4
  74. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  75. package/packages/pi-ai/dist/providers/google-shared.js +1 -1
  76. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  77. package/packages/pi-ai/dist/providers/register-builtins.d.ts +0 -1
  78. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  79. package/packages/pi-ai/dist/providers/register-builtins.js +1 -1
  80. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  81. package/packages/pi-ai/dist/utils/event-stream.d.ts +0 -2
  82. package/packages/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  83. package/packages/pi-ai/dist/utils/event-stream.js +0 -4
  84. package/packages/pi-ai/dist/utils/event-stream.js.map +1 -1
  85. package/packages/pi-ai/dist/utils/overflow.d.ts +0 -4
  86. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  87. package/packages/pi-ai/dist/utils/overflow.js +0 -6
  88. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  89. package/packages/pi-ai/dist/utils/validation.d.ts +0 -8
  90. package/packages/pi-ai/dist/utils/validation.d.ts.map +1 -1
  91. package/packages/pi-ai/dist/utils/validation.js +0 -14
  92. package/packages/pi-ai/dist/utils/validation.js.map +1 -1
  93. package/packages/pi-ai/src/api-registry.ts +0 -12
  94. package/packages/pi-ai/src/models.generated.ts +1039 -2892
  95. package/packages/pi-ai/src/providers/anthropic.ts +1 -1
  96. package/packages/pi-ai/src/providers/github-copilot-headers.ts +1 -1
  97. package/packages/pi-ai/src/providers/google-gemini-cli.ts +2 -2
  98. package/packages/pi-ai/src/providers/google-shared.ts +1 -1
  99. package/packages/pi-ai/src/providers/register-builtins.ts +1 -1
  100. package/packages/pi-ai/src/utils/event-stream.ts +0 -5
  101. package/packages/pi-ai/src/utils/overflow.ts +1 -8
  102. package/packages/pi-ai/src/utils/validation.ts +0 -15
  103. package/packages/pi-coding-agent/dist/config.d.ts +0 -9
  104. package/packages/pi-coding-agent/dist/config.d.ts.map +1 -1
  105. package/packages/pi-coding-agent/dist/config.js +4 -8
  106. package/packages/pi-coding-agent/dist/config.js.map +1 -1
  107. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts +0 -4
  108. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  109. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js +1 -1
  110. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js.map +1 -1
  111. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +0 -5
  112. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  113. package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -13
  114. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  115. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +0 -8
  116. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  117. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
  118. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  119. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +0 -17
  120. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  121. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -62
  122. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  123. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +0 -2
  124. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  125. package/packages/pi-coding-agent/dist/core/lsp/config.js +0 -7
  126. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  127. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +0 -5
  128. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -1
  129. package/packages/pi-coding-agent/dist/core/lsp/edits.js +1 -1
  130. package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -1
  131. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +0 -1
  132. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  133. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +1 -1
  134. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  135. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +1 -6
  136. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -1
  137. package/packages/pi-coding-agent/dist/core/lsp/utils.js +1 -28
  138. package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -1
  139. package/packages/pi-coding-agent/dist/core/messages.d.ts +0 -8
  140. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  141. package/packages/pi-coding-agent/dist/core/messages.js +5 -5
  142. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  143. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -3
  144. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  145. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -3
  146. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  147. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts +1 -26
  148. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  149. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -59
  150. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  151. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts +0 -17
  152. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts.map +1 -1
  153. package/packages/pi-coding-agent/dist/core/prompt-templates.js +2 -2
  154. package/packages/pi-coding-agent/dist/core/prompt-templates.js.map +1 -1
  155. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +0 -4
  156. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  157. package/packages/pi-coding-agent/dist/core/session-manager.js +2 -4
  158. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  159. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +0 -12
  160. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  161. package/packages/pi-coding-agent/dist/core/settings-manager.js +2 -2
  162. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  163. package/packages/pi-coding-agent/dist/migrations.d.ts +0 -16
  164. package/packages/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  165. package/packages/pi-coding-agent/dist/migrations.js +2 -2
  166. package/packages/pi-coding-agent/dist/migrations.js.map +1 -1
  167. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts +0 -2
  168. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  169. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +2 -2
  170. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  171. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -24
  172. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  173. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +50 -512
  174. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  175. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +71 -0
  176. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -0
  177. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +514 -0
  178. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -0
  179. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +65 -4
  180. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  181. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +6 -23
  182. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  183. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +12 -0
  184. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  185. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +175 -0
  186. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -0
  187. package/packages/pi-coding-agent/dist/utils/changelog.d.ts +0 -4
  188. package/packages/pi-coding-agent/dist/utils/changelog.d.ts.map +1 -1
  189. package/packages/pi-coding-agent/dist/utils/changelog.js +1 -1
  190. package/packages/pi-coding-agent/dist/utils/changelog.js.map +1 -1
  191. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts +0 -1
  192. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
  193. package/packages/pi-coding-agent/dist/utils/clipboard-image.js +1 -1
  194. package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
  195. package/packages/pi-coding-agent/dist/utils/photon.d.ts +0 -19
  196. package/packages/pi-coding-agent/dist/utils/photon.d.ts.map +1 -1
  197. package/packages/pi-coding-agent/dist/utils/photon.js +1 -120
  198. package/packages/pi-coding-agent/dist/utils/photon.js.map +1 -1
  199. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts +0 -1
  200. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts.map +1 -1
  201. package/packages/pi-coding-agent/dist/utils/tools-manager.js +1 -1
  202. package/packages/pi-coding-agent/dist/utils/tools-manager.js.map +1 -1
  203. package/packages/pi-coding-agent/package.json +1 -1
  204. package/packages/pi-coding-agent/src/config.ts +5 -10
  205. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +1 -1
  206. package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -13
  207. package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
  208. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -73
  209. package/packages/pi-coding-agent/src/core/lsp/config.ts +0 -11
  210. package/packages/pi-coding-agent/src/core/lsp/edits.ts +1 -1
  211. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +1 -1
  212. package/packages/pi-coding-agent/src/core/lsp/utils.ts +1 -33
  213. package/packages/pi-coding-agent/src/core/messages.ts +5 -5
  214. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -2
  215. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -77
  216. package/packages/pi-coding-agent/src/core/prompt-templates.ts +2 -2
  217. package/packages/pi-coding-agent/src/core/session-manager.ts +2 -4
  218. package/packages/pi-coding-agent/src/core/settings-manager.ts +2 -2
  219. package/packages/pi-coding-agent/src/migrations.ts +2 -2
  220. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +2 -2
  221. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -561
  222. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +653 -0
  223. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +7 -26
  224. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +196 -0
  225. package/packages/pi-coding-agent/src/utils/changelog.ts +1 -1
  226. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +1 -1
  227. package/packages/pi-coding-agent/src/utils/photon.ts +0 -137
  228. package/packages/pi-coding-agent/src/utils/tools-manager.ts +1 -1
  229. package/packages/pi-tui/dist/components/editor.d.ts +0 -10
  230. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  231. package/packages/pi-tui/dist/components/editor.js +1 -1
  232. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  233. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  234. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  235. package/packages/pi-tui/dist/overlay-layout.js +288 -0
  236. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  237. package/packages/pi-tui/dist/tui.d.ts +0 -22
  238. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  239. package/packages/pi-tui/dist/tui.js +6 -272
  240. package/packages/pi-tui/dist/tui.js.map +1 -1
  241. package/packages/pi-tui/dist/utils.d.ts +0 -7
  242. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  243. package/packages/pi-tui/dist/utils.js +0 -44
  244. package/packages/pi-tui/dist/utils.js.map +1 -1
  245. package/packages/pi-tui/src/components/editor.ts +1 -1
  246. package/packages/pi-tui/src/overlay-layout.ts +372 -0
  247. package/packages/pi-tui/src/tui.ts +11 -312
  248. package/packages/pi-tui/src/utils.ts +0 -43
  249. package/pkg/dist/core/export-html/ansi-to-html.d.ts +0 -4
  250. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  251. package/pkg/dist/core/export-html/ansi-to-html.js +1 -1
  252. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  253. package/pkg/dist/modes/interactive/theme/theme.d.ts +65 -4
  254. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  255. package/pkg/dist/modes/interactive/theme/theme.js +6 -23
  256. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  257. package/pkg/dist/modes/interactive/theme/themes.d.ts +12 -0
  258. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  259. package/pkg/dist/modes/interactive/theme/themes.js +175 -0
  260. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -0
  261. package/pkg/package.json +1 -1
  262. package/src/resources/extensions/gsd/auto/session.ts +47 -30
  263. package/src/resources/extensions/gsd/auto-dashboard.ts +28 -131
  264. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +6 -1
  265. package/src/resources/extensions/gsd/auto-dispatch.ts +135 -91
  266. package/src/resources/extensions/gsd/auto-loop.ts +1665 -0
  267. package/src/resources/extensions/gsd/auto-observability.ts +4 -2
  268. package/src/resources/extensions/gsd/auto-post-unit.ts +85 -228
  269. package/src/resources/extensions/gsd/auto-prompts.ts +138 -109
  270. package/src/resources/extensions/gsd/auto-recovery.ts +124 -118
  271. package/src/resources/extensions/gsd/auto-start.ts +440 -354
  272. package/src/resources/extensions/gsd/auto-supervisor.ts +5 -12
  273. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +8 -8
  274. package/src/resources/extensions/gsd/auto-timers.ts +3 -4
  275. package/src/resources/extensions/gsd/auto-verification.ts +76 -90
  276. package/src/resources/extensions/gsd/auto-worktree-sync.ts +204 -0
  277. package/src/resources/extensions/gsd/auto-worktree.ts +389 -141
  278. package/src/resources/extensions/gsd/auto.ts +515 -1199
  279. package/src/resources/extensions/gsd/captures.ts +10 -4
  280. package/src/resources/extensions/gsd/dispatch-guard.ts +13 -9
  281. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  282. package/src/resources/extensions/gsd/doctor-checks.ts +3 -4
  283. package/src/resources/extensions/gsd/git-service.ts +8 -1
  284. package/src/resources/extensions/gsd/gitignore.ts +4 -2
  285. package/src/resources/extensions/gsd/gsd-db.ts +375 -180
  286. package/src/resources/extensions/gsd/index.ts +104 -263
  287. package/src/resources/extensions/gsd/post-unit-hooks.ts +13 -13
  288. package/src/resources/extensions/gsd/progress-score.ts +65 -200
  289. package/src/resources/extensions/gsd/quick.ts +121 -125
  290. package/src/resources/extensions/gsd/session-lock.ts +11 -0
  291. package/src/resources/extensions/gsd/templates/preferences.md +1 -0
  292. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +32 -59
  293. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +75 -27
  294. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  295. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
  296. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1458 -0
  297. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +8 -162
  298. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -108
  299. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +1 -3
  300. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -3
  301. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
  302. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -55
  303. package/src/resources/extensions/gsd/tests/headless-query.test.ts +22 -0
  304. package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +8 -11
  305. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +4 -6
  306. package/src/resources/extensions/gsd/tests/run-uat.test.ts +3 -3
  307. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
  308. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +181 -0
  309. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -3
  310. package/src/resources/extensions/gsd/tests/token-profile.test.ts +6 -6
  311. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -6
  312. package/src/resources/extensions/gsd/tests/undo.test.ts +6 -0
  313. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +24 -26
  314. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +7 -201
  315. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +205 -0
  316. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +442 -0
  317. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -3
  318. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +705 -0
  319. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +57 -106
  320. package/src/resources/extensions/gsd/tests/worktree.test.ts +5 -1
  321. package/src/resources/extensions/gsd/tests/write-gate.test.ts +43 -132
  322. package/src/resources/extensions/gsd/types.ts +90 -81
  323. package/src/resources/extensions/gsd/undo.ts +42 -46
  324. package/src/resources/extensions/gsd/unit-runtime.ts +14 -18
  325. package/src/resources/extensions/gsd/verification-evidence.ts +1 -3
  326. package/src/resources/extensions/gsd/verification-gate.ts +6 -39
  327. package/src/resources/extensions/gsd/worktree-command.ts +36 -24
  328. package/src/resources/extensions/gsd/worktree-manager.ts +2 -3
  329. package/src/resources/extensions/gsd/worktree-resolver.ts +485 -0
  330. package/src/resources/extensions/gsd/worktree.ts +7 -44
  331. package/src/resources/extensions/mcp-client/index.ts +2 -1
  332. package/dist/resources/extensions/gsd/auto-constants.js +0 -5
  333. package/dist/resources/extensions/gsd/auto-idempotency.js +0 -106
  334. package/dist/resources/extensions/gsd/auto-stuck-detection.js +0 -165
  335. package/dist/resources/extensions/gsd/mechanical-completion.js +0 -351
  336. package/packages/pi-coding-agent/dist/modes/interactive/theme/dark.json +0 -85
  337. package/packages/pi-coding-agent/dist/modes/interactive/theme/light.json +0 -84
  338. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -335
  339. package/packages/pi-coding-agent/src/modes/interactive/theme/dark.json +0 -85
  340. package/packages/pi-coding-agent/src/modes/interactive/theme/light.json +0 -84
  341. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  342. package/pkg/dist/modes/interactive/theme/dark.json +0 -85
  343. package/pkg/dist/modes/interactive/theme/light.json +0 -84
  344. package/pkg/dist/modes/interactive/theme/theme-schema.json +0 -335
  345. package/src/resources/extensions/gsd/auto-constants.ts +0 -6
  346. package/src/resources/extensions/gsd/auto-idempotency.ts +0 -151
  347. package/src/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  348. package/src/resources/extensions/gsd/mechanical-completion.ts +0 -430
  349. package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  350. package/src/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  351. package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  352. package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  353. package/src/resources/extensions/gsd/tests/loop-regression.test.ts +0 -874
  354. package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  355. package/src/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  356. package/src/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
@@ -1,27 +1,26 @@
1
1
  /**
2
2
  * Auto-mode Recovery — artifact resolution, verification, blocker placeholders,
3
- * skip artifacts, completed-unit persistence, merge state reconciliation,
3
+ * skip artifacts, merge state reconciliation,
4
4
  * self-heal runtime records, and loop remediation steps.
5
5
  *
6
6
  * Pure functions that receive all needed state as parameters — no module-level
7
7
  * globals or AutoContext dependency.
8
8
  */
9
- import { clearUnitRuntimeRecord, } from "./unit-runtime.js";
9
+ import { clearUnitRuntimeRecord } from "./unit-runtime.js";
10
10
  import { clearParseCache, parseRoadmap, parsePlan } from "./files.js";
11
- import { nativeConflictFiles, nativeCommit, nativeCheckoutTheirs, nativeAddPaths, nativeMergeAbort, nativeResetHard, } from "./native-git-bridge.js";
12
- import { resolveMilestonePath, resolveSlicePath, resolveSliceFile, resolveTasksDir, relMilestoneFile, relSliceFile, relSlicePath, relTaskFile, buildMilestoneFileName, buildSliceFileName, buildTaskFileName, resolveMilestoneFile, clearPathCache, resolveGsdRootFile, gsdRoot, } from "./paths.js";
13
11
  import { isValidationTerminal } from "./state.js";
14
- import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from "node:fs";
15
- import { atomicWriteSync } from "./atomic-write.js";
16
- import { loadJsonFileOrNull } from "./json-persistence.js";
12
+ import { nativeConflictFiles, nativeCommit, nativeCheckoutTheirs, nativeAddPaths, nativeMergeAbort, nativeResetHard, } from "./native-git-bridge.js";
13
+ import { resolveMilestonePath, resolveSlicePath, resolveSliceFile, resolveTasksDir, relMilestoneFile, relSliceFile, relSlicePath, relTaskFile, buildMilestoneFileName, buildSliceFileName, buildTaskFileName, resolveMilestoneFile, clearPathCache, resolveGsdRootFile, } from "./paths.js";
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, } from "node:fs";
17
15
  import { dirname, join } from "node:path";
18
- import { parseUnitId } from "./unit-id.js";
19
16
  // ─── Artifact Resolution & Verification ───────────────────────────────────────
20
17
  /**
21
18
  * Resolve the expected artifact for a unit to an absolute path.
22
19
  */
23
20
  export function resolveExpectedArtifactPath(unitType, unitId, base) {
24
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
21
+ const parts = unitId.split("/");
22
+ const mid = parts[0];
23
+ const sid = parts[1];
25
24
  switch (unitType) {
26
25
  case "research-milestone": {
27
26
  const dir = resolveMilestonePath(base, mid);
@@ -48,8 +47,11 @@ export function resolveExpectedArtifactPath(unitType, unitId, base) {
48
47
  return dir ? join(dir, buildSliceFileName(sid, "UAT-RESULT")) : null;
49
48
  }
50
49
  case "execute-task": {
50
+ const tid = parts[2];
51
51
  const dir = resolveSlicePath(base, mid, sid);
52
- return dir && tid ? join(dir, "tasks", buildTaskFileName(tid, "SUMMARY")) : null;
52
+ return dir && tid
53
+ ? join(dir, "tasks", buildTaskFileName(tid, "SUMMARY"))
54
+ : null;
53
55
  }
54
56
  case "complete-slice": {
55
57
  const dir = resolveSlicePath(base, mid, sid);
@@ -108,21 +110,10 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
108
110
  return false;
109
111
  if (!existsSync(absPath))
110
112
  return false;
111
- // validate-milestone must have a VALIDATION file with a terminal verdict
112
- // (pass, needs-attention, or needs-remediation). Without this check, a
113
- // VALIDATION file with missing/malformed frontmatter or an unrecognized
114
- // verdict is treated as "complete" by the artifact check but deriveState
115
- // still returns phase:"validating-milestone" (because isValidationTerminal
116
- // returns false), creating an infinite skip loop that hits the lifetime cap.
117
113
  if (unitType === "validate-milestone") {
118
- try {
119
- const validationContent = readFileSync(absPath, "utf-8");
120
- if (!isValidationTerminal(validationContent))
121
- return false;
122
- }
123
- catch {
114
+ const validationContent = readFileSync(absPath, "utf-8");
115
+ if (!isValidationTerminal(validationContent))
124
116
  return false;
125
- }
126
117
  }
127
118
  // plan-slice must produce a plan with actual task entries, not just a scaffold.
128
119
  // The plan file may exist from a prior discussion/context step with only headings
@@ -136,7 +127,10 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
136
127
  }
137
128
  // execute-task must also have its checkbox marked [x] in the slice plan
138
129
  if (unitType === "execute-task") {
139
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
130
+ const parts = unitId.split("/");
131
+ const mid = parts[0];
132
+ const sid = parts[1];
133
+ const tid = parts[2];
140
134
  if (mid && sid && tid) {
141
135
  const planAbs = resolveSliceFile(base, mid, sid, "PLAN");
142
136
  if (planAbs && existsSync(planAbs)) {
@@ -153,7 +147,9 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
153
147
  // but omitted T{tid}-PLAN.md files would be marked complete, causing execute-task
154
148
  // to dispatch with a missing task plan (see issue #739).
155
149
  if (unitType === "plan-slice") {
156
- const { milestone: mid, slice: sid } = parseUnitId(unitId);
150
+ const parts = unitId.split("/");
151
+ const mid = parts[0];
152
+ const sid = parts[1];
157
153
  if (mid && sid) {
158
154
  try {
159
155
  const planContent = readFileSync(absPath, "utf-8");
@@ -178,7 +174,9 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
178
174
  // state machine keeps returning the same complete-slice unit (roadmap still shows
179
175
  // the slice incomplete), so dispatchNextUnit recurses forever.
180
176
  if (unitType === "complete-slice") {
181
- const { milestone: mid, slice: sid } = parseUnitId(unitId);
177
+ const parts = unitId.split("/");
178
+ const mid = parts[0];
179
+ const sid = parts[1];
182
180
  if (mid && sid) {
183
181
  const dir = resolveSlicePath(base, mid, sid);
184
182
  if (dir) {
@@ -193,7 +191,7 @@ export function verifyExpectedArtifact(unitType, unitId, base) {
193
191
  try {
194
192
  const roadmapContent = readFileSync(roadmapFile, "utf-8");
195
193
  const roadmap = parseRoadmap(roadmapContent);
196
- const slice = (roadmap.slices ?? []).find(s => s.id === sid);
194
+ const slice = roadmap.slices.find((s) => s.id === sid);
197
195
  if (slice && !slice.done)
198
196
  return false;
199
197
  }
@@ -233,7 +231,9 @@ export function writeBlockerPlaceholder(unitType, unitId, base, reason) {
233
231
  return diagnoseExpectedArtifact(unitType, unitId, base);
234
232
  }
235
233
  export function diagnoseExpectedArtifact(unitType, unitId, base) {
236
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
234
+ const parts = unitId.split("/");
235
+ const mid = parts[0];
236
+ const sid = parts[1];
237
237
  switch (unitType) {
238
238
  case "research-milestone":
239
239
  return `${relMilestoneFile(base, mid, "RESEARCH")} (milestone research)`;
@@ -244,6 +244,7 @@ export function diagnoseExpectedArtifact(unitType, unitId, base) {
244
244
  case "plan-slice":
245
245
  return `${relSliceFile(base, mid, sid, "PLAN")} (slice plan)`;
246
246
  case "execute-task": {
247
+ const tid = parts[2];
247
248
  return `Task ${tid} marked [x] in ${relSliceFile(base, mid, sid, "PLAN")} + summary written`;
248
249
  }
249
250
  case "complete-slice":
@@ -310,44 +311,6 @@ export function skipExecuteTask(base, mid, sid, tid, status, reason, maxAttempts
310
311
  }
311
312
  return true;
312
313
  }
313
- // ─── Disk-backed completed-unit helpers ───────────────────────────────────────
314
- function isStringArray(data) {
315
- return Array.isArray(data) && data.every(item => typeof item === "string");
316
- }
317
- /** Path to the persisted completed-unit keys file. */
318
- export function completedKeysPath(base) {
319
- return join(gsdRoot(base), "completed-units.json");
320
- }
321
- /** Write a completed unit key to disk (read-modify-write append to set). */
322
- export function persistCompletedKey(base, key) {
323
- const file = completedKeysPath(base);
324
- const keys = loadJsonFileOrNull(file, isStringArray) ?? [];
325
- const keySet = new Set(keys);
326
- if (!keySet.has(key)) {
327
- keys.push(key);
328
- atomicWriteSync(file, JSON.stringify(keys));
329
- }
330
- }
331
- /** Remove a stale completed unit key from disk. */
332
- export function removePersistedKey(base, key) {
333
- const file = completedKeysPath(base);
334
- const keys = loadJsonFileOrNull(file, isStringArray);
335
- if (!keys)
336
- return;
337
- const filtered = keys.filter(k => k !== key);
338
- if (filtered.length !== keys.length) {
339
- atomicWriteSync(file, JSON.stringify(filtered));
340
- }
341
- }
342
- /** Load all completed unit keys from disk into the in-memory set. */
343
- export function loadPersistedKeys(base, target) {
344
- const file = completedKeysPath(base);
345
- const keys = loadJsonFileOrNull(file, isStringArray);
346
- if (keys) {
347
- for (const k of keys)
348
- target.add(k);
349
- }
350
- }
351
314
  // ─── Merge State Reconciliation ───────────────────────────────────────────────
352
315
  /**
353
316
  * Detect leftover merge state from a prior session and reconcile it.
@@ -377,8 +340,8 @@ export function reconcileMergeState(basePath, ctx) {
377
340
  }
378
341
  else {
379
342
  // Still conflicted — try auto-resolving .gsd/ state file conflicts (#530)
380
- const gsdConflicts = conflictedFiles.filter(f => f.startsWith(".gsd/"));
381
- const codeConflicts = conflictedFiles.filter(f => !f.startsWith(".gsd/"));
343
+ const gsdConflicts = conflictedFiles.filter((f) => f.startsWith(".gsd/"));
344
+ const codeConflicts = conflictedFiles.filter((f) => !f.startsWith(".gsd/"));
382
345
  if (gsdConflicts.length > 0 && codeConflicts.length === 0) {
383
346
  // All conflicts are in .gsd/ state files — auto-resolve by accepting theirs
384
347
  let resolved = true;
@@ -403,18 +366,24 @@ export function reconcileMergeState(basePath, ctx) {
403
366
  try {
404
367
  nativeMergeAbort(basePath);
405
368
  }
406
- catch { /* best-effort */ }
369
+ catch {
370
+ /* best-effort */
371
+ }
407
372
  }
408
373
  else if (hasSquashMsg) {
409
374
  try {
410
375
  unlinkSync(squashMsgPath);
411
376
  }
412
- catch { /* best-effort */ }
377
+ catch {
378
+ /* best-effort */
379
+ }
413
380
  }
414
381
  try {
415
382
  nativeResetHard(basePath);
416
383
  }
417
- catch { /* best-effort */ }
384
+ catch {
385
+ /* best-effort */
386
+ }
418
387
  ctx.ui.notify("Detected leftover merge state — auto-resolve failed, cleaned up. Re-deriving state.", "warning");
419
388
  }
420
389
  }
@@ -424,18 +393,24 @@ export function reconcileMergeState(basePath, ctx) {
424
393
  try {
425
394
  nativeMergeAbort(basePath);
426
395
  }
427
- catch { /* best-effort */ }
396
+ catch {
397
+ /* best-effort */
398
+ }
428
399
  }
429
400
  else if (hasSquashMsg) {
430
401
  try {
431
402
  unlinkSync(squashMsgPath);
432
403
  }
433
- catch { /* best-effort */ }
404
+ catch {
405
+ /* best-effort */
406
+ }
434
407
  }
435
408
  try {
436
409
  nativeResetHard(basePath);
437
410
  }
438
- catch { /* best-effort */ }
411
+ catch {
412
+ /* best-effort */
413
+ }
439
414
  ctx.ui.notify("Detected leftover merge state with unresolved conflicts — cleaned up. Re-deriving state.", "warning");
440
415
  }
441
416
  }
@@ -443,11 +418,12 @@ export function reconcileMergeState(basePath, ctx) {
443
418
  }
444
419
  // ─── Self-Heal Runtime Records ────────────────────────────────────────────────
445
420
  /**
446
- * Self-heal: scan runtime records in .gsd/ and clear any where the expected
447
- * artifact already exists on disk. This repairs incomplete closeouts from
448
- * prior crashes preventing spurious re-dispatch of already-completed units.
421
+ * Self-heal: scan runtime records in .gsd/ and clear stale ones.
422
+ * Clears dispatched records older than 1 hour (process crashed before
423
+ * completing the unit). deriveState() handles re-derivation no need
424
+ * for completion key persistence here.
449
425
  */
450
- export async function selfHealRuntimeRecords(base, ctx, completedKeySet) {
426
+ export async function selfHealRuntimeRecords(base, ctx) {
451
427
  try {
452
428
  const { listUnitRuntimeRecords } = await import("./unit-runtime.js");
453
429
  const records = listUnitRuntimeRecords(base);
@@ -456,24 +432,7 @@ export async function selfHealRuntimeRecords(base, ctx, completedKeySet) {
456
432
  const now = Date.now();
457
433
  for (const record of records) {
458
434
  const { unitType, unitId } = record;
459
- const artifactPath = resolveExpectedArtifactPath(unitType, unitId, base);
460
- // Case 1: Artifact exists — unit completed but closeout didn't finish.
461
- // Use verifyExpectedArtifact (not just existsSync) so that execute-task
462
- // also checks the plan checkbox is marked [x]. Without this, a task
463
- // whose summary exists but checkbox is unchecked would be incorrectly
464
- // marked as completed, causing deriveState to re-dispatch it endlessly.
465
- if (artifactPath && existsSync(artifactPath) && verifyExpectedArtifact(unitType, unitId, base)) {
466
- clearUnitRuntimeRecord(base, unitType, unitId);
467
- // Also persist completion key if missing
468
- const key = `${unitType}/${unitId}`;
469
- if (!completedKeySet.has(key)) {
470
- persistCompletedKey(base, key);
471
- completedKeySet.add(key);
472
- }
473
- healed++;
474
- continue;
475
- }
476
- // Case 2: No artifact but record is stale (dispatched > 1h ago, process crashed)
435
+ // Clear stale dispatched records (dispatched > 1h ago, process crashed)
477
436
  const age = now - (record.startedAt ?? 0);
478
437
  if (record.phase === "dispatched" && age > STALE_THRESHOLD_MS) {
479
438
  clearUnitRuntimeRecord(base, unitType, unitId);
@@ -496,7 +455,10 @@ export async function selfHealRuntimeRecords(base, ctx, completedKeySet) {
496
455
  * These are shown when automatic reconciliation is not possible.
497
456
  */
498
457
  export function buildLoopRemediationSteps(unitType, unitId, base) {
499
- const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
458
+ const parts = unitId.split("/");
459
+ const mid = parts[0];
460
+ const sid = parts[1];
461
+ const tid = parts[2];
500
462
  switch (unitType) {
501
463
  case "execute-task": {
502
464
  if (!mid || !sid || !tid)