gsd-pi 2.76.0-dev.fe143342a → 2.77.0-dev.1594b263e

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 (925) hide show
  1. package/README.md +18 -36
  2. package/dist/claude-cli-check.js +36 -3
  3. package/dist/cli-web-branch.d.ts +1 -0
  4. package/dist/cli-web-branch.js +3 -0
  5. package/dist/cli.js +38 -2
  6. package/dist/extension-discovery.d.ts +6 -0
  7. package/dist/extension-discovery.js +37 -0
  8. package/dist/extension-registry.d.ts +3 -0
  9. package/dist/extension-sort.d.ts +18 -0
  10. package/dist/extension-sort.js +114 -0
  11. package/dist/extension-validator.d.ts +47 -0
  12. package/dist/extension-validator.js +127 -0
  13. package/dist/headless.js +49 -4
  14. package/dist/loader.js +35 -7
  15. package/dist/onboarding.js +45 -0
  16. package/dist/provider-migrations.d.ts +18 -0
  17. package/dist/provider-migrations.js +14 -0
  18. package/dist/resource-loader.d.ts +40 -0
  19. package/dist/resource-loader.js +32 -13
  20. package/dist/resources/extensions/browser-tools/capture.js +9 -0
  21. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  22. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  23. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  24. package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
  25. package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
  26. package/dist/resources/extensions/claude-code-cli/readiness.js +9 -4
  27. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +559 -76
  28. package/dist/resources/extensions/cmux/index.js +20 -0
  29. package/dist/resources/extensions/github-sync/templates.js +103 -0
  30. package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
  31. package/dist/resources/extensions/google-search/index.js +3 -375
  32. package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
  33. package/dist/resources/extensions/gsd/auto/loop.js +133 -2
  34. package/dist/resources/extensions/gsd/auto/phases.js +110 -42
  35. package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
  36. package/dist/resources/extensions/gsd/auto/run-unit.js +48 -4
  37. package/dist/resources/extensions/gsd/auto/session.js +24 -3
  38. package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
  39. package/dist/resources/extensions/gsd/auto-dispatch.js +216 -40
  40. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  41. package/dist/resources/extensions/gsd/auto-model-selection.js +125 -5
  42. package/dist/resources/extensions/gsd/auto-post-unit.js +240 -66
  43. package/dist/resources/extensions/gsd/auto-prompts.js +386 -104
  44. package/dist/resources/extensions/gsd/auto-recovery.js +124 -4
  45. package/dist/resources/extensions/gsd/auto-start.js +141 -66
  46. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
  47. package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
  48. package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
  49. package/dist/resources/extensions/gsd/auto-worktree.js +230 -86
  50. package/dist/resources/extensions/gsd/auto.js +159 -48
  51. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +36 -2
  52. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
  53. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +5 -6
  54. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +11 -0
  55. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +24 -9
  56. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
  57. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +161 -11
  58. package/dist/resources/extensions/gsd/clean-root-preflight.js +93 -0
  59. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
  60. package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
  61. package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
  62. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
  63. package/dist/resources/extensions/gsd/component-loader.js +447 -0
  64. package/dist/resources/extensions/gsd/component-types.js +69 -0
  65. package/dist/resources/extensions/gsd/context-store.js +23 -7
  66. package/dist/resources/extensions/gsd/detection.js +49 -1
  67. package/dist/resources/extensions/gsd/dispatch-guard.js +29 -3
  68. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  69. package/dist/resources/extensions/gsd/file-lock.js +49 -9
  70. package/dist/resources/extensions/gsd/forensics.js +106 -0
  71. package/dist/resources/extensions/gsd/gate-registry.js +2 -2
  72. package/dist/resources/extensions/gsd/git-constants.js +28 -1
  73. package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
  74. package/dist/resources/extensions/gsd/git-service.js +127 -2
  75. package/dist/resources/extensions/gsd/gitignore.js +2 -0
  76. package/dist/resources/extensions/gsd/gsd-db.js +95 -32
  77. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
  78. package/dist/resources/extensions/gsd/guided-flow.js +214 -13
  79. package/dist/resources/extensions/gsd/health-widget.js +4 -1
  80. package/dist/resources/extensions/gsd/journal.js +17 -2
  81. package/dist/resources/extensions/gsd/key-manager.js +22 -0
  82. package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
  83. package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
  84. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
  85. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  86. package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
  87. package/dist/resources/extensions/gsd/model-router.js +42 -3
  88. package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
  89. package/dist/resources/extensions/gsd/notifications.js +30 -16
  90. package/dist/resources/extensions/gsd/pre-execution-checks.js +31 -6
  91. package/dist/resources/extensions/gsd/preferences-validation.js +23 -0
  92. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +4 -0
  93. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +5 -1
  94. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
  95. package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
  96. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  97. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  98. package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  99. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  100. package/dist/resources/extensions/gsd/reports.js +5 -4
  101. package/dist/resources/extensions/gsd/safety/evidence-collector.js +96 -0
  102. package/dist/resources/extensions/gsd/safety/file-change-validator.js +12 -4
  103. package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
  104. package/dist/resources/extensions/gsd/safety/safety-harness.js +5 -1
  105. package/dist/resources/extensions/gsd/service-tier.js +5 -2
  106. package/dist/resources/extensions/gsd/session-lock.js +19 -10
  107. package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
  108. package/dist/resources/extensions/gsd/slice-cadence.js +238 -0
  109. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
  110. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  111. package/dist/resources/extensions/gsd/state.js +69 -58
  112. package/dist/resources/extensions/gsd/sync-lock.js +98 -42
  113. package/dist/resources/extensions/gsd/token-counter.js +22 -5
  114. package/dist/resources/extensions/gsd/tools/complete-milestone.js +16 -10
  115. package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
  116. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
  117. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -2
  118. package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
  119. package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
  120. package/dist/resources/extensions/gsd/uok/audit.js +18 -2
  121. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  122. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  123. package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
  124. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  125. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  126. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  127. package/dist/resources/extensions/gsd/uok/plan-v2.js +30 -7
  128. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  129. package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
  130. package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
  131. package/dist/resources/extensions/gsd/worktree-manager.js +86 -8
  132. package/dist/resources/extensions/gsd/worktree-resolver.js +136 -17
  133. package/dist/resources/extensions/gsd/worktree-telemetry.js +198 -0
  134. package/dist/resources/extensions/mcp-client/auth.js +10 -1
  135. package/dist/resources/extensions/mcp-client/index.js +121 -10
  136. package/dist/resources/extensions/ollama/index.js +5 -1
  137. package/dist/resources/extensions/remote-questions/manager.js +11 -5
  138. package/dist/resources/extensions/shared/cmux-events.js +12 -0
  139. package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
  140. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  141. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  142. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  143. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  144. package/dist/resources/skills/verify-before-complete/SKILL.md +2 -1
  145. package/dist/resources/skills/write-docs/SKILL.md +2 -1
  146. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  147. package/dist/web/standalone/.next/BUILD_ID +1 -1
  148. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  149. package/dist/web/standalone/.next/build-manifest.json +3 -3
  150. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  151. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  156. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  158. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  161. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  167. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/index.html +1 -1
  233. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  235. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  236. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  237. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  238. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  239. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  240. package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
  241. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  242. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  244. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  246. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  247. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  248. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  249. package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
  250. package/dist/welcome-screen.js +6 -1
  251. package/dist/wizard.js +2 -0
  252. package/package.json +17 -16
  253. package/packages/daemon/package.json +2 -2
  254. package/packages/daemon/src/logger.ts +4 -3
  255. package/packages/mcp-server/README.md +3 -3
  256. package/packages/mcp-server/dist/env-writer.d.ts +1 -0
  257. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
  258. package/packages/mcp-server/dist/env-writer.js +74 -6
  259. package/packages/mcp-server/dist/env-writer.js.map +1 -1
  260. package/packages/mcp-server/dist/remote-questions.d.ts +45 -0
  261. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
  262. package/packages/mcp-server/dist/remote-questions.js +732 -0
  263. package/packages/mcp-server/dist/remote-questions.js.map +1 -0
  264. package/packages/mcp-server/dist/server.d.ts +31 -0
  265. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  266. package/packages/mcp-server/dist/server.js +179 -93
  267. package/packages/mcp-server/dist/server.js.map +1 -1
  268. package/packages/mcp-server/dist/session-manager.d.ts +14 -0
  269. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  270. package/packages/mcp-server/dist/session-manager.js +49 -1
  271. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  272. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  273. package/packages/mcp-server/dist/workflow-tools.js +15 -6
  274. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  275. package/packages/mcp-server/package.json +9 -3
  276. package/packages/mcp-server/src/env-writer.test.ts +79 -1
  277. package/packages/mcp-server/src/env-writer.ts +76 -6
  278. package/packages/mcp-server/src/mcp-server.test.ts +89 -0
  279. package/packages/mcp-server/src/readers/graph.test.ts +87 -15
  280. package/packages/mcp-server/src/readers/readers.test.ts +5 -1
  281. package/packages/mcp-server/src/remote-questions.test.ts +294 -0
  282. package/packages/mcp-server/src/remote-questions.ts +916 -0
  283. package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
  284. package/packages/mcp-server/src/server.ts +236 -108
  285. package/packages/mcp-server/src/session-manager.ts +43 -1
  286. package/packages/mcp-server/src/workflow-tools.test.ts +85 -0
  287. package/packages/mcp-server/src/workflow-tools.ts +19 -6
  288. package/packages/mcp-server/tsconfig.test.json +19 -0
  289. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  290. package/packages/native/package.json +7 -2
  291. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  292. package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
  293. package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
  294. package/packages/native/src/__tests__/ps.test.mjs +14 -8
  295. package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
  296. package/packages/native/src/__tests__/truncate.test.mjs +17 -2
  297. package/packages/native/tsconfig.tsbuildinfo +1 -1
  298. package/packages/pi-agent-core/package.json +6 -1
  299. package/packages/pi-agent-core/src/agent-loop.test.ts +226 -31
  300. package/packages/pi-agent-core/src/agent.test.ts +96 -102
  301. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  302. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  303. package/packages/pi-ai/dist/models/capability-patches.js +9 -2
  304. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  305. package/packages/pi-ai/dist/models/custom.d.ts +38 -0
  306. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -1
  307. package/packages/pi-ai/dist/models/custom.js +41 -0
  308. package/packages/pi-ai/dist/models/custom.js.map +1 -1
  309. package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
  310. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  312. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  313. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  314. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  315. package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
  316. package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
  317. package/packages/pi-ai/dist/models/generated/openai.js +17 -0
  318. package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
  319. package/packages/pi-ai/dist/models.generated.test.js +43 -70
  320. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  321. package/packages/pi-ai/dist/models.test.js +36 -11
  322. package/packages/pi-ai/dist/models.test.js.map +1 -1
  323. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +1 -1
  324. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  325. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  326. package/packages/pi-ai/dist/providers/anthropic-shared.js +27 -4
  327. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  328. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  329. package/packages/pi-ai/dist/providers/anthropic.js +8 -3
  330. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  331. package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts +2 -0
  332. package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts.map +1 -0
  333. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +80 -0
  334. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -0
  335. package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
  336. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  337. package/packages/pi-ai/dist/providers/simple-options.js +16 -1
  338. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  339. package/packages/pi-ai/package.json +6 -1
  340. package/packages/pi-ai/scripts/generate-models.ts +44 -0
  341. package/packages/pi-ai/src/models/capability-patches.ts +10 -2
  342. package/packages/pi-ai/src/models/custom.ts +42 -0
  343. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  344. package/packages/pi-ai/src/models/generated/openai.ts +17 -0
  345. package/packages/pi-ai/src/models.generated.test.ts +46 -73
  346. package/packages/pi-ai/src/models.test.ts +48 -11
  347. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +1 -1
  348. package/packages/pi-ai/src/providers/anthropic-shared.ts +26 -5
  349. package/packages/pi-ai/src/providers/anthropic.ts +9 -3
  350. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +98 -0
  351. package/packages/pi-ai/src/providers/simple-options.ts +17 -1
  352. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  353. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -31
  354. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
  356. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
  358. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  359. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
  360. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/agent-session.js +7 -0
  362. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
  364. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
  366. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
  368. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
  370. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
  372. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  373. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
  374. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
  376. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  378. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  379. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
  380. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  381. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
  382. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
  384. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
  386. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
  387. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
  388. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
  389. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
  390. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
  392. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
  393. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +8 -2
  394. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/core/extensions/loader.js +85 -8
  396. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
  398. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  400. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +14 -0
  401. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  402. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +41 -4
  404. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
  406. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
  408. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
  409. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
  410. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js.map +1 -0
  411. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/core/model-registry.js +14 -0
  413. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  414. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
  415. package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
  416. package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
  417. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  419. package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
  420. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  421. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
  422. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  423. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
  424. package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
  425. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
  426. package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
  427. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
  428. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  429. package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
  430. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  431. package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
  432. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/core/session-manager.js +1 -1
  434. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  435. package/packages/pi-coding-agent/dist/core/session-manager.test.js +21 -1
  436. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
  438. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/system-prompt.js +19 -5
  440. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
  442. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
  443. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  444. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  445. package/packages/pi-coding-agent/dist/index.js +1 -0
  446. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  447. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
  448. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  449. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -5
  450. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  451. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
  452. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  454. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
  455. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  456. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
  457. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  458. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
  459. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  461. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +30 -12
  462. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  463. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  464. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
  465. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  466. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +139 -0
  467. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
  469. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  472. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +118 -14
  474. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  475. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
  476. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
  477. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
  478. package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
  479. package/packages/pi-coding-agent/package.json +6 -1
  480. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -36
  481. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
  482. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
  483. package/packages/pi-coding-agent/src/core/agent-session.ts +11 -0
  484. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
  485. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
  486. package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
  487. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  488. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
  489. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
  490. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
  491. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  492. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  493. package/packages/pi-coding-agent/src/core/extensions/loader.ts +82 -11
  494. package/packages/pi-coding-agent/src/core/extensions/runner.ts +2 -0
  495. package/packages/pi-coding-agent/src/core/extensions/types.ts +15 -0
  496. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +48 -4
  497. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +22 -2
  498. package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
  499. package/packages/pi-coding-agent/src/core/model-registry.ts +16 -0
  500. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
  501. package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
  502. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
  503. package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
  504. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  505. package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
  506. package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
  507. package/packages/pi-coding-agent/src/core/session-manager.test.ts +30 -1
  508. package/packages/pi-coding-agent/src/core/session-manager.ts +1 -1
  509. package/packages/pi-coding-agent/src/core/system-prompt.ts +38 -4
  510. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
  511. package/packages/pi-coding-agent/src/index.ts +1 -0
  512. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
  513. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +49 -3
  514. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
  515. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
  516. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
  517. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +48 -9
  518. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +160 -1
  519. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
  520. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
  521. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +132 -14
  522. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  523. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  524. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +31 -14
  525. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  526. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
  527. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  528. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +51 -6
  529. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  530. package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
  531. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  532. package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
  533. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
  534. package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
  535. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
  536. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
  537. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
  538. package/packages/pi-tui/dist/components/editor.d.ts +14 -0
  539. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  540. package/packages/pi-tui/dist/components/editor.js +19 -0
  541. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  542. package/packages/pi-tui/dist/components/image.test.js +6 -5
  543. package/packages/pi-tui/dist/components/image.test.js.map +1 -1
  544. package/packages/pi-tui/dist/editor-component.d.ts +2 -0
  545. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
  546. package/packages/pi-tui/dist/editor-component.js.map +1 -1
  547. package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
  548. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  549. package/packages/pi-tui/dist/stdin-buffer.js +20 -0
  550. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  551. package/packages/pi-tui/package.json +6 -1
  552. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +46 -15
  553. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
  554. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +62 -6
  555. package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
  556. package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
  557. package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
  558. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
  559. package/packages/pi-tui/src/components/editor.ts +22 -0
  560. package/packages/pi-tui/src/components/image.test.ts +10 -5
  561. package/packages/pi-tui/src/editor-component.ts +3 -0
  562. package/packages/pi-tui/src/stdin-buffer.ts +26 -0
  563. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  564. package/packages/rpc-client/dist/rpc-client.test.js +101 -51
  565. package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
  566. package/packages/rpc-client/package.json +6 -1
  567. package/packages/rpc-client/src/rpc-client.test.ts +109 -52
  568. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  569. package/pkg/package.json +1 -1
  570. package/scripts/install.js +526 -0
  571. package/scripts/lib/workspace-manifest.cjs +86 -0
  572. package/scripts/link-workspace-packages.cjs +5 -17
  573. package/scripts/postinstall.js +9 -178
  574. package/src/resources/extensions/browser-tools/capture.ts +12 -0
  575. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
  576. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
  577. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
  578. package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
  579. package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
  580. package/src/resources/extensions/claude-code-cli/readiness.ts +9 -4
  581. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +609 -82
  582. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1033 -87
  583. package/src/resources/extensions/cmux/index.ts +35 -10
  584. package/src/resources/extensions/github-sync/templates.ts +151 -0
  585. package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
  586. package/src/resources/extensions/github-sync/tests/templates.test.ts +92 -1
  587. package/src/resources/extensions/google-search/extension-manifest.json +5 -4
  588. package/src/resources/extensions/google-search/index.ts +9 -470
  589. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  590. package/src/resources/extensions/gsd/auto/loop-deps.ts +14 -1
  591. package/src/resources/extensions/gsd/auto/loop.ts +151 -2
  592. package/src/resources/extensions/gsd/auto/phases.ts +139 -41
  593. package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
  594. package/src/resources/extensions/gsd/auto/run-unit.ts +56 -4
  595. package/src/resources/extensions/gsd/auto/session.ts +35 -3
  596. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  597. package/src/resources/extensions/gsd/auto/types.ts +1 -1
  598. package/src/resources/extensions/gsd/auto-dispatch.ts +229 -39
  599. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  600. package/src/resources/extensions/gsd/auto-model-selection.ts +132 -5
  601. package/src/resources/extensions/gsd/auto-post-unit.ts +255 -76
  602. package/src/resources/extensions/gsd/auto-prompts.ts +413 -94
  603. package/src/resources/extensions/gsd/auto-recovery.ts +125 -2
  604. package/src/resources/extensions/gsd/auto-start.ts +166 -60
  605. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
  606. package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
  607. package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
  608. package/src/resources/extensions/gsd/auto-worktree.ts +251 -93
  609. package/src/resources/extensions/gsd/auto.ts +182 -54
  610. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +43 -2
  611. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
  612. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -6
  613. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +11 -0
  614. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +25 -9
  615. package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
  616. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +193 -11
  617. package/src/resources/extensions/gsd/clean-root-preflight.ts +111 -0
  618. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
  619. package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
  620. package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
  621. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
  622. package/src/resources/extensions/gsd/component-loader.ts +598 -0
  623. package/src/resources/extensions/gsd/component-types.ts +362 -0
  624. package/src/resources/extensions/gsd/context-store.ts +25 -8
  625. package/src/resources/extensions/gsd/detection.ts +58 -1
  626. package/src/resources/extensions/gsd/dispatch-guard.ts +26 -2
  627. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  628. package/src/resources/extensions/gsd/file-lock.ts +84 -11
  629. package/src/resources/extensions/gsd/forensics.ts +118 -1
  630. package/src/resources/extensions/gsd/gate-registry.ts +2 -2
  631. package/src/resources/extensions/gsd/git-constants.ts +30 -1
  632. package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
  633. package/src/resources/extensions/gsd/git-service.ts +150 -2
  634. package/src/resources/extensions/gsd/gitignore.ts +2 -1
  635. package/src/resources/extensions/gsd/gsd-db.ts +97 -34
  636. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
  637. package/src/resources/extensions/gsd/guided-flow.ts +261 -14
  638. package/src/resources/extensions/gsd/health-widget.ts +3 -1
  639. package/src/resources/extensions/gsd/journal.ts +39 -3
  640. package/src/resources/extensions/gsd/key-manager.ts +22 -0
  641. package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
  642. package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
  643. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
  644. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  645. package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
  646. package/src/resources/extensions/gsd/model-router.ts +48 -1
  647. package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
  648. package/src/resources/extensions/gsd/notifications.ts +27 -15
  649. package/src/resources/extensions/gsd/pre-execution-checks.ts +33 -7
  650. package/src/resources/extensions/gsd/preferences-types.ts +8 -0
  651. package/src/resources/extensions/gsd/preferences-validation.ts +21 -0
  652. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +4 -0
  653. package/src/resources/extensions/gsd/prompts/complete-milestone.md +5 -1
  654. package/src/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
  655. package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
  656. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  657. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  658. package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
  659. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  660. package/src/resources/extensions/gsd/reports.ts +5 -4
  661. package/src/resources/extensions/gsd/safety/evidence-collector.ts +119 -0
  662. package/src/resources/extensions/gsd/safety/file-change-validator.ts +16 -3
  663. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
  664. package/src/resources/extensions/gsd/safety/safety-harness.ts +9 -0
  665. package/src/resources/extensions/gsd/service-tier.ts +5 -2
  666. package/src/resources/extensions/gsd/session-lock.ts +20 -10
  667. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  668. package/src/resources/extensions/gsd/slice-cadence.ts +299 -0
  669. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
  670. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  671. package/src/resources/extensions/gsd/state.ts +76 -66
  672. package/src/resources/extensions/gsd/sync-lock.ts +97 -39
  673. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
  674. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +2 -1
  675. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
  676. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
  677. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +322 -286
  678. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  679. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  680. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +78 -0
  681. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +12 -0
  682. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
  683. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +122 -0
  684. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +4 -1
  685. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -194
  686. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +141 -0
  687. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +64 -0
  688. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +2 -2
  689. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
  690. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +2 -2
  691. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +3 -2
  692. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +3 -2
  693. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +23 -0
  694. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -1
  695. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
  696. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  697. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +186 -0
  698. package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
  699. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
  700. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +61 -1
  701. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
  702. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +2 -1
  703. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  704. package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
  705. package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
  706. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  707. package/src/resources/extensions/gsd/tests/context-store.test.ts +79 -0
  708. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +2 -1
  709. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
  710. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +161 -0
  711. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  712. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
  713. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
  714. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
  715. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -4
  716. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +2 -1
  717. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +2 -1
  718. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +14 -9
  719. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
  720. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  721. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  722. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
  723. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +31 -0
  724. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +4 -3
  725. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +4 -3
  726. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +1 -1
  727. package/src/resources/extensions/gsd/tests/escalation.test.ts +1 -1
  728. package/src/resources/extensions/gsd/tests/exec-history.test.ts +113 -0
  729. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  730. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
  731. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +38 -0
  732. package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
  733. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +8 -104
  734. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  735. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
  736. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
  737. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +296 -1
  738. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  739. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
  740. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -56
  741. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
  742. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
  743. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +4 -2
  744. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +1 -0
  745. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +30 -0
  746. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
  747. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
  748. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
  749. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
  750. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
  751. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +9 -3
  752. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
  753. package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
  754. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +66 -0
  755. package/src/resources/extensions/gsd/tests/key-manager.test.ts +2 -0
  756. package/src/resources/extensions/gsd/tests/knowledge.test.ts +93 -1
  757. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
  758. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  759. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
  760. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +12 -0
  761. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  762. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -55
  763. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
  764. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
  765. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  766. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
  767. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  768. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  769. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -48
  770. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
  771. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +59 -2
  772. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
  773. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +274 -112
  774. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
  775. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
  776. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
  777. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +272 -0
  778. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +337 -0
  779. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
  780. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +2 -1
  781. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +44 -0
  782. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +12 -0
  783. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +15 -4
  784. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +54 -41
  785. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +213 -0
  786. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +3 -2
  787. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +4 -5
  788. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
  789. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +388 -0
  790. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
  791. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
  792. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
  793. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  794. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
  795. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +15 -6
  796. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +230 -0
  797. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  798. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
  799. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +205 -0
  800. package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
  801. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  802. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
  803. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +32 -40
  804. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +3 -2
  805. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
  806. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  807. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +120 -1
  808. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  809. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +242 -0
  810. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +3 -2
  811. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
  812. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +2 -1
  813. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  814. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +56 -0
  815. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +29 -5
  816. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  817. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +3 -3
  818. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
  819. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
  820. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +7 -6
  821. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
  822. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
  823. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +4 -3
  824. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  825. package/src/resources/extensions/gsd/tests/test-helpers.ts +153 -0
  826. package/src/resources/extensions/gsd/tests/token-counter.test.ts +105 -1
  827. package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
  828. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
  829. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
  830. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
  831. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
  832. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
  833. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
  834. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
  835. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  836. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  837. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
  838. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
  839. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  840. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  841. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +42 -2
  842. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  843. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  844. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +139 -5
  845. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -80
  846. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
  847. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
  848. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
  849. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
  850. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
  851. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +242 -247
  852. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
  853. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +6 -1
  854. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
  855. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -5
  856. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
  857. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
  858. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +210 -0
  859. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
  860. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
  861. package/src/resources/extensions/gsd/tests/write-gate.test.ts +71 -5
  862. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
  863. package/src/resources/extensions/gsd/token-counter.ts +22 -5
  864. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  865. package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
  866. package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
  867. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -2
  868. package/src/resources/extensions/gsd/types.ts +3 -3
  869. package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
  870. package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
  871. package/src/resources/extensions/gsd/uok/audit.ts +20 -2
  872. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  873. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  874. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  875. package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
  876. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  877. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  878. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  879. package/src/resources/extensions/gsd/uok/plan-v2.ts +39 -8
  880. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  881. package/src/resources/extensions/gsd/workflow-logger.ts +23 -3
  882. package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
  883. package/src/resources/extensions/gsd/worktree-manager.ts +109 -7
  884. package/src/resources/extensions/gsd/worktree-resolver.ts +150 -18
  885. package/src/resources/extensions/gsd/worktree-telemetry.ts +322 -0
  886. package/src/resources/extensions/mcp-client/auth.ts +12 -1
  887. package/src/resources/extensions/mcp-client/index.ts +132 -11
  888. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
  889. package/src/resources/extensions/ollama/index.ts +5 -1
  890. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
  891. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
  892. package/src/resources/extensions/remote-questions/manager.ts +36 -4
  893. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
  894. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  895. package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
  896. package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
  897. package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
  898. package/src/resources/skills/create-skill/SKILL.md +2 -2
  899. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  900. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  901. package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  902. package/src/resources/skills/verify-before-complete/SKILL.md +2 -1
  903. package/src/resources/skills/write-docs/SKILL.md +2 -1
  904. package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
  905. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
  906. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
  907. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
  908. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
  909. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
  910. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
  911. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -143
  912. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -142
  913. package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
  914. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
  915. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
  916. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
  917. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
  918. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -74
  919. package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
  920. package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
  921. package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
  922. package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
  923. package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -42
  924. /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → MdwvuQQLlBY6wwiSO1Tgv}/_buildManifest.js +0 -0
  925. /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → MdwvuQQLlBY6wwiSO1Tgv}/_ssgManifest.js +0 -0
@@ -55,7 +55,7 @@ import { hasPendingCaptures, loadPendingCaptures, revertExecutorResolvedCaptures
55
55
  import { debugLog } from "./debug-logger.js";
56
56
  import { runSafely } from "./auto-utils.js";
57
57
  import type { AutoSession, SidecarItem } from "./auto/session.js";
58
- import { getEvidence } from "./safety/evidence-collector.js";
58
+ import { getEvidence, clearEvidenceFromDisk } from "./safety/evidence-collector.js";
59
59
  import { validateFileChanges } from "./safety/file-change-validator.js";
60
60
  // crossReferenceEvidence available for future use when verification_evidence is stored in DB
61
61
  // import { crossReferenceEvidence, type ClaimedEvidence } from "./safety/evidence-cross-ref.js";
@@ -65,14 +65,41 @@ import { resolveExpectedArtifactPath as resolveArtifactForContent } from "./auto
65
65
  import { loadEffectiveGSDPreferences } from "./preferences.js";
66
66
  import { getSliceTasks } from "./gsd-db.js";
67
67
  import { runPreExecutionChecks, type PreExecutionResult } from "./pre-execution-checks.js";
68
- import { writePreExecutionEvidence } from "./verification-evidence.js";
68
+ import { writePreExecutionEvidence, type PreExecutionCheckJSON } from "./verification-evidence.js";
69
69
  import { ensureCodebaseMapFresh } from "./codebase-generator.js";
70
70
  import { resolveUokFlags } from "./uok/flags.js";
71
71
  import { UokGateRunner } from "./uok/gate-runner.js";
72
72
  import { writeTurnGitTransaction } from "./uok/gitops.js";
73
+ import { isClosedStatus } from "./status-guards.js";
74
+ import { detectAbandonMilestone } from "./abandon-detect.js";
75
+ import { isDeterministicPolicyError } from "./auto-tool-tracking.js";
73
76
 
74
77
  /** Maximum verification retry attempts before escalating to blocker placeholder (#2653). */
75
78
  const MAX_VERIFICATION_RETRIES = 3;
79
+ /** Keep failure toasts short while still showing concrete examples. */
80
+ const MAX_NOTIFICATION_DETAILS = 3;
81
+ const NOTIFICATION_BULLET = "•";
82
+
83
+ function formatPreExecutionCheckDetail(check: PreExecutionCheckJSON): string {
84
+ const category = check.category?.trim() || "unknown category";
85
+ const target = check.target?.trim() || "unknown target";
86
+ const message = check.message.split(/\r?\n/, 1)[0]?.trim() || "No details provided";
87
+ return ` ${NOTIFICATION_BULLET} [${category}] ${target}: ${message}`;
88
+ }
89
+
90
+ const COMPLETE_MILESTONE_DB_SETTLE_MS = 1500;
91
+ const COMPLETE_MILESTONE_DB_SETTLE_POLL_MS = 100;
92
+
93
+ async function waitForMilestoneDbClose(mid: string): Promise<boolean> {
94
+ const deadline = Date.now() + COMPLETE_MILESTONE_DB_SETTLE_MS;
95
+ while (Date.now() < deadline) {
96
+ if (!isDbAvailable()) return false;
97
+ const milestone = getMilestone(mid);
98
+ if (milestone && isClosedStatus(milestone.status)) return true;
99
+ await new Promise((resolve) => setTimeout(resolve, COMPLETE_MILESTONE_DB_SETTLE_POLL_MS));
100
+ }
101
+ return false;
102
+ }
76
103
 
77
104
 
78
105
  /** Enqueue a sidecar item (hook, triage, or quick-task) for the main loop to
@@ -107,11 +134,10 @@ import {
107
134
  updateProgressWidget as _updateProgressWidget,
108
135
  updateSliceProgressCache,
109
136
  unitVerb,
110
- hideFooter,
111
137
  describeNextUnit,
112
138
  } from "./auto-dashboard.js";
113
139
  import { existsSync, unlinkSync } from "node:fs";
114
- import { join } from "node:path";
140
+ import { join, relative } from "node:path";
115
141
  import { _resetHasChangesCache } from "./native-git-bridge.js";
116
142
  import { autoCommitCurrentBranch } from "./worktree.js";
117
143
 
@@ -239,6 +265,14 @@ export function detectRogueFileWrites(
239
265
  return rogues;
240
266
  }
241
267
 
268
+ /**
269
+ * Maximum number of times to retry a unit whose expected artifact is missing
270
+ * after execution. Matches the bounded pattern used by runPostUnitVerification
271
+ * in auto-verification.ts. Exceeding this limit pauses auto-mode instead of
272
+ * looping indefinitely (#2007).
273
+ */
274
+ const MAX_ARTIFACT_VERIFICATION_RETRIES = 3;
275
+
242
276
  export const STEP_COMPLETE_FALLBACK_MESSAGE =
243
277
  "Step complete. Run /clear, then /gsd to continue (or /gsd auto to run continuously).";
244
278
 
@@ -556,6 +590,35 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
556
590
  // Rewrite-docs completion
557
591
  if (s.currentUnit.type === "rewrite-docs") {
558
592
  await runSafely("postUnit", "rewrite-docs-resolve", async () => {
593
+ // Detect abandon/descope overrides BEFORE resolving them (#3490).
594
+ // If an override is about abandoning the milestone, park it so the
595
+ // state engine skips it. Without this, rewrite-docs only edits
596
+ // markdown but the DB still has the milestone as active.
597
+ try {
598
+ const { loadActiveOverrides } = await import("./files.js");
599
+ const overrides = await loadActiveOverrides(s.basePath);
600
+ const decision = detectAbandonMilestone(overrides, s.currentMilestoneId);
601
+ if (decision.shouldPark && s.currentMilestoneId) {
602
+ const { parkMilestone } = await import("./milestone-actions.js");
603
+ const parked = parkMilestone(s.basePath, s.currentMilestoneId, decision.reason);
604
+ if (parked) {
605
+ ctx.ui.notify(`Milestone ${s.currentMilestoneId} parked: "${decision.reason}"`, "info");
606
+ } else {
607
+ // Park refused: milestone directory missing, milestone already
608
+ // completed (SUMMARY present), or PARKED.md already exists.
609
+ // resolveAllOverrides below will still consume the override —
610
+ // surface this loudly so the user notices state drift rather
611
+ // than silently losing the abandon directive.
612
+ const msg = `Abandon detected for ${s.currentMilestoneId} but park refused (milestone is completed, already parked, or missing). Override will be resolved anyway — verify state is correct.`;
613
+ logError("engine", msg);
614
+ ctx.ui.notify(msg, "warning");
615
+ }
616
+ }
617
+ } catch (err) {
618
+ logError("engine", `abandon-detect failed: ${(err as Error).message}`);
619
+ ctx.ui.notify(`Abandon detection failed — check logs. Overrides will still be resolved.`, "warning");
620
+ }
621
+
559
622
  await resolveAllOverrides(s.basePath);
560
623
  // Reset both disk and in-memory counters. Disk counter is authoritative
561
624
  // (survives restarts); in-memory is kept in sync for the current session.
@@ -575,6 +638,87 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
575
638
  clearReactiveState(s.basePath, mid, sid);
576
639
  }
577
640
  });
641
+
642
+ // #4765 — slice-cadence collapse. When `git.collapse_cadence: "slice"`
643
+ // is set, squash-merge the slice's commits from the milestone branch
644
+ // onto main right here, so orphan risk shrinks from milestone-size to
645
+ // slice-size. Only runs in worktree isolation mode — the feature needs
646
+ // a milestone branch to squash from.
647
+ let sliceMergeStopped = false;
648
+ await runSafely("postUnit", "slice-cadence-merge", async () => {
649
+ const prefsResult = loadEffectiveGSDPreferences(s.basePath);
650
+ const prefs = prefsResult?.preferences;
651
+ const { getCollapseCadence, mergeSliceToMain } = await import("./slice-cadence.js");
652
+ if (getCollapseCadence(prefs) !== "slice") return;
653
+ if (prefs?.git?.isolation !== "worktree") return;
654
+ if (s.isolationDegraded) return;
655
+
656
+ const projectRoot = s.originalBasePath || s.basePath;
657
+ const { milestone: mid, slice: sid } = parseUnitId(unit.id);
658
+ if (!mid || !sid) return;
659
+
660
+ // Record the milestone start SHA before the first slice merge, so
661
+ // resquashMilestoneOnMain has a target at milestone completion.
662
+ // Resolve main branch dynamically — hard-coding "main" breaks repos
663
+ // that use "master" or a custom default branch.
664
+ if (!s.milestoneStartShas.has(mid)) {
665
+ try {
666
+ const { nativeDetectMainBranch } = await import("./native-git-bridge.js");
667
+ const mainBranch = nativeDetectMainBranch(projectRoot);
668
+ const { execFileSync } = await import("node:child_process");
669
+ const sha = execFileSync("git", ["rev-parse", mainBranch], {
670
+ cwd: projectRoot, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8",
671
+ }).trim();
672
+ if (sha) s.milestoneStartShas.set(mid, sha);
673
+ } catch (err) {
674
+ logWarning("engine", `slice-cadence: failed to record milestone start SHA: ${err instanceof Error ? err.message : String(err)}`);
675
+ }
676
+ }
677
+
678
+ try {
679
+ const result = mergeSliceToMain(projectRoot, mid, sid);
680
+ if (result.skipped) {
681
+ logWarning("engine", `slice-cadence: merge skipped for ${sid} — ${result.skippedReason}`);
682
+ return;
683
+ }
684
+ ctx.ui.notify(
685
+ `slice-cadence: ${sid} merged to main (${result.durationMs}ms).`,
686
+ "info",
687
+ );
688
+ } catch (err) {
689
+ const { MergeConflictError } = await import("./git-service.js");
690
+ if (err instanceof MergeConflictError) {
691
+ ctx.ui.notify(
692
+ `slice-cadence merge conflict in ${sid}: ${err.conflictedFiles.join(", ")}. ` +
693
+ `Resolve manually on main and run \`/gsd auto\` to resume.`,
694
+ "error",
695
+ );
696
+ // Stop auto AND signal the outer postUnit flow to exit early.
697
+ // Without the flag, subsequent hooks (triage, rogue detection,
698
+ // DB writes) would keep running against a conflicted main
699
+ // checkout after the loop was already told to stop.
700
+ const { stopAuto } = await import("./auto.js");
701
+ await stopAuto(ctx, undefined, `slice-merge-conflict on ${sid}`);
702
+ sliceMergeStopped = true;
703
+ return;
704
+ }
705
+ logError("engine", `slice-cadence merge failed for ${sid}`, {
706
+ error: err instanceof Error ? err.message : String(err),
707
+ });
708
+ // Non-conflict failures (dirty main, rev-walk error, etc.) can
709
+ // leave the checkout in an unexpected state. Stop auto-mode so
710
+ // the next slice doesn't dispatch on top of it.
711
+ const { stopAuto } = await import("./auto.js");
712
+ await stopAuto(ctx, undefined, `slice-merge-error on ${sid}`);
713
+ sliceMergeStopped = true;
714
+ }
715
+ });
716
+ // Exit early after stopAuto so the rest of post-unit processing
717
+ // (triage, rogue detection, hook dispatch, DB writes) doesn't run
718
+ // against a conflicted main checkout. Return "dispatched" to match
719
+ // the convention used by other stop/pauseAuto paths in this function
720
+ // (see signal handling earlier: stop/pause also return "dispatched").
721
+ if (sliceMergeStopped) return "dispatched";
578
722
  }
579
723
 
580
724
  // Post-triage: execute actionable resolutions
@@ -654,7 +798,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
654
798
  if (taskRow) {
655
799
  const expectedOutput = taskRow.expected_output ?? [];
656
800
  const plannedFiles = taskRow.files ?? [];
657
- const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles);
801
+ const audit = validateFileChanges(s.basePath, expectedOutput, plannedFiles, safetyConfig.file_change_allowlist);
658
802
  if (audit && audit.violations.length > 0) {
659
803
  const warnings = audit.violations.filter(v => v.severity === "warning");
660
804
  for (const v of warnings) {
@@ -712,6 +856,16 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
712
856
  debugLog("postUnit", { phase: "safety-content-validation", error: String(e) });
713
857
  }
714
858
  }
859
+
860
+ // Clear persisted evidence file now that post-unit processing is complete
861
+ // (Bug #4385 — prevents stale evidence from affecting retries of same unit ID).
862
+ if (safetyConfig.evidence_collection && s.currentUnit.type === "execute-task" && sMid && sSid && sTid) {
863
+ try {
864
+ clearEvidenceFromDisk(s.basePath, sMid, sSid, sTid);
865
+ } catch (e) {
866
+ debugLog("postUnit", { phase: "safety-evidence-clear", error: String(e) });
867
+ }
868
+ }
715
869
  }
716
870
  } catch (e) {
717
871
  debugLog("postUnit", { phase: "safety-harness", error: String(e) });
@@ -731,6 +885,25 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
731
885
 
732
886
  // If verification failed, attempt to regenerate missing projection files
733
887
  // from DB data before giving up (e.g. research-slice produces PLAN from engine).
888
+ if (!triggerArtifactVerified) {
889
+ if (s.currentUnit.type === "complete-milestone") {
890
+ try {
891
+ const { milestone: mid } = parseUnitId(s.currentUnit.id);
892
+ if (mid) {
893
+ const settled = await waitForMilestoneDbClose(mid);
894
+ if (settled) {
895
+ triggerArtifactVerified = verifyExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
896
+ if (triggerArtifactVerified) {
897
+ invalidateAllCaches();
898
+ }
899
+ }
900
+ }
901
+ } catch (e) {
902
+ debugLog("postUnit", { phase: "artifact-verify-settle-db", error: String(e) });
903
+ }
904
+ }
905
+ }
906
+
734
907
  if (!triggerArtifactVerified) {
735
908
  try {
736
909
  const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
@@ -752,16 +925,35 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
752
925
  // When artifact verification fails for a unit type that has a known expected
753
926
  // artifact, return "retry" so the caller re-dispatches with failure context
754
927
  // instead of blindly re-dispatching the same unit (#1571).
755
- // After MAX_VERIFICATION_RETRIES, escalate to writeBlockerPlaceholder so the
756
- // pipeline can advance instead of looping forever (#2653).
928
+ // Retries are capped at MAX_ARTIFACT_VERIFICATION_RETRIES to prevent
929
+ // unbounded loops (#2007).
757
930
  //
758
- // HOWEVER, if the DB is unavailable (db_unavailable), the artifact was never
759
- // written because the completion tool failed at the infra level. Retrying
760
- // can never succeed and produces a costly re-dispatch loop (#2517).
761
- if (!triggerArtifactVerified && !isDbAvailable()) {
762
- // DB infra failure do NOT retry; the completion tool returned
763
- // db_unavailable so the artifact was never written. Retrying would
764
- // produce an infinite re-dispatch loop (#2517).
931
+ // Pre-checks short-circuit retry for known-unrecoverable failures:
932
+ // - Deterministic policy rejection (#4973): structural write-gate failure
933
+ // that will recur on every retry, so write a blocker placeholder.
934
+ // - DB infra failure (#2517): completion tool returned db_unavailable, so
935
+ // the artifact was never written. Retrying can never succeed.
936
+ // - Tool invocation error (#2883/#3595): malformed JSON args or queued
937
+ // user message retry will produce the same failure.
938
+ //
939
+ // #4973: Deterministic policy rejections (e.g. context_write_blocked from the
940
+ // write-gate) are checked FIRST — before the DB-availability check — because
941
+ // they are structural gates that will fire on every retry regardless of DB or
942
+ // model tier. Short-circuit immediately by writing a blocker placeholder.
943
+ if (!triggerArtifactVerified && s.lastToolInvocationError && isDeterministicPolicyError(s.lastToolInvocationError)) {
944
+ const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
945
+ debugLog("postUnit", { phase: "deterministic-policy-error-placeholder", unitType: s.currentUnit.type, unitId: s.currentUnit.id, error: s.lastToolInvocationError });
946
+ const reason = `Deterministic policy rejection for ${s.currentUnit.type} "${s.currentUnit.id}": ${s.lastToolInvocationError}. Retrying cannot resolve this gate — writing blocker placeholder to advance pipeline.`;
947
+ s.lastToolInvocationError = null;
948
+ s.pendingVerificationRetry = null;
949
+ s.verificationRetryCount.delete(retryKey);
950
+ writeBlockerPlaceholder(s.currentUnit.type, s.currentUnit.id, s.basePath, reason);
951
+ ctx.ui.notify(
952
+ `${s.currentUnit.type} ${s.currentUnit.id} — deterministic policy rejection, wrote blocker placeholder (no retries) (#4973)`,
953
+ "warning",
954
+ );
955
+ // Fall through to "continue" — do NOT enter the retry or db-unavailable paths.
956
+ } else if (!triggerArtifactVerified && !isDbAvailable()) {
765
957
  debugLog("postUnit", { phase: "artifact-verify-skip-db-unavailable", unitType: s.currentUnit.type, unitId: s.currentUnit.id });
766
958
  const dbSkipDiag = diagnoseExpectedArtifact(s.currentUnit.type, s.currentUnit.id, s.basePath);
767
959
  ctx.ui.notify(
@@ -769,9 +961,6 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
769
961
  "error",
770
962
  );
771
963
  } else if (!triggerArtifactVerified) {
772
- // #2883/#3595: If the artifact is missing because the tool invocation
773
- // failed (malformed JSON) or was skipped (queued user message), retrying
774
- // will produce the same failure. Pause auto-mode instead of looping.
775
964
  if (s.lastToolInvocationError) {
776
965
  const isUserSkip = /queued user message/i.test(s.lastToolInvocationError);
777
966
  const errMsg = isUserSkip
@@ -788,68 +977,36 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
788
977
  if (hasExpectedArtifact) {
789
978
  const retryKey = `${s.currentUnit.type}:${s.currentUnit.id}`;
790
979
  const attempt = (s.verificationRetryCount.get(retryKey) ?? 0) + 1;
791
- s.verificationRetryCount.set(retryKey, attempt);
792
-
793
- if (attempt > MAX_VERIFICATION_RETRIES) {
794
- // #4175: For complete-milestone, a blocker placeholder is harmful —
795
- // the stub SUMMARY has no recovery value (milestone is terminal),
796
- // it does not update DB status (so deriveState never advances),
797
- // and it fools stopAuto's presence check into merging a milestone
798
- // that was never legitimately completed. Pause auto-mode with a
799
- // clear single failure signal and preserve the worktree branch.
800
- if (s.currentUnit.type === "complete-milestone") {
801
- debugLog("postUnit", {
802
- phase: "artifact-verify-pause-complete-milestone",
803
- unitType: s.currentUnit.type,
804
- unitId: s.currentUnit.id,
805
- attempt,
806
- maxRetries: MAX_VERIFICATION_RETRIES,
807
- });
808
- s.verificationRetryCount.delete(retryKey);
809
- s.pendingVerificationRetry = null;
810
- ctx.ui.notify(
811
- `Milestone ${s.currentUnit.id} verification failed after ${MAX_VERIFICATION_RETRIES} retries — worktree branch preserved. Re-run /gsd auto once blockers are resolved.`,
812
- "error",
813
- );
814
- await pauseAuto(ctx, pi);
815
- return "dispatched";
816
- }
817
-
818
- // Retries exhausted — write a blocker placeholder so the pipeline
819
- // can advance past this stuck unit (#2653).
820
- debugLog("postUnit", {
821
- phase: "artifact-verify-escalate",
822
- unitType: s.currentUnit.type,
823
- unitId: s.currentUnit.id,
824
- attempt,
825
- maxRetries: MAX_VERIFICATION_RETRIES,
826
- });
827
- const reason = `Artifact verification failed after ${MAX_VERIFICATION_RETRIES} retries for ${s.currentUnit.type} "${s.currentUnit.id}".`;
828
- writeBlockerPlaceholder(s.currentUnit.type, s.currentUnit.id, s.basePath, reason);
829
- ctx.ui.notify(
830
- `${s.currentUnit.type} ${s.currentUnit.id} — verification retries exhausted (${MAX_VERIFICATION_RETRIES}), wrote blocker placeholder to advance pipeline`,
831
- "warning",
832
- );
833
- // Reset retry count and fall through to "continue" so the loop
834
- // re-derives state with the placeholder in place.
980
+ if (attempt > MAX_ARTIFACT_VERIFICATION_RETRIES) {
835
981
  s.verificationRetryCount.delete(retryKey);
836
- s.pendingVerificationRetry = null;
837
- // Do NOT return "retry" — fall through to "continue" below.
838
- } else {
839
- s.pendingVerificationRetry = {
840
- unitId: s.currentUnit.id,
841
- failureContext: `Artifact verification failed: expected artifact for ${s.currentUnit.type} "${s.currentUnit.id}" was not found on disk after unit execution (attempt ${attempt}).`,
842
- attempt,
843
- };
844
- debugLog("postUnit", { phase: "artifact-verify-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
982
+ debugLog("postUnit", { phase: "artifact-verify-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
845
983
  ctx.ui.notify(
846
- `Artifact missing for ${s.currentUnit.type} ${s.currentUnit.id} retrying (attempt ${attempt})`,
847
- "warning",
984
+ `Artifact still missing for ${s.currentUnit.type} ${s.currentUnit.id} after ${MAX_ARTIFACT_VERIFICATION_RETRIES} retries — pausing auto-mode`,
985
+ "error",
848
986
  );
849
- return "retry";
987
+ await pauseAuto(ctx, pi);
988
+ return "dispatched";
850
989
  }
990
+ s.verificationRetryCount.set(retryKey, attempt);
991
+ s.pendingVerificationRetry = {
992
+ unitId: s.currentUnit.id,
993
+ failureContext: `Artifact verification failed: expected artifact for ${s.currentUnit.type} "${s.currentUnit.id}" was not found on disk after unit execution (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}).`,
994
+ attempt,
995
+ };
996
+ debugLog("postUnit", { phase: "artifact-verify-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
997
+ ctx.ui.notify(
998
+ `Artifact missing for ${s.currentUnit.type} ${s.currentUnit.id} — retrying (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES})`,
999
+ "warning",
1000
+ );
1001
+ return "retry";
851
1002
  }
852
1003
  }
1004
+
1005
+ // Verification succeeded — clear the retry counter so a future failure
1006
+ // of the same unit gets a full retry budget instead of the stale count.
1007
+ if (triggerArtifactVerified) {
1008
+ s.verificationRetryCount.delete(`${s.currentUnit.type}:${s.currentUnit.id}`);
1009
+ }
853
1010
  } else {
854
1011
  // Hook unit completed — no additional processing needed
855
1012
  }
@@ -1089,8 +1246,11 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
1089
1246
 
1090
1247
  // Write evidence JSON to slice artifacts directory
1091
1248
  const slicePath = resolveSlicePath(s.basePath, mid, sid);
1249
+ const evidenceFileName = `${sid}-PRE-EXEC-VERIFY.json`;
1250
+ let evidencePath = join(".gsd", "milestones", mid, "slices", sid, evidenceFileName);
1092
1251
  if (slicePath) {
1093
1252
  writePreExecutionEvidence(result, slicePath, mid, sid);
1253
+ evidencePath = relative(s.basePath, join(slicePath, evidenceFileName)) || evidenceFileName;
1094
1254
  }
1095
1255
 
1096
1256
  if (uokFlags.gates) {
@@ -1127,13 +1287,24 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
1127
1287
  if (result.status === "fail") {
1128
1288
  const blockingChecks = result.checks.filter(c => !c.passed && c.blocking);
1129
1289
  const blockingCount = blockingChecks.length;
1130
- const details = blockingChecks.slice(0, 3).map(c => ` \u2022 ${c.message}`).join("\n");
1131
- const suffix = blockingChecks.length > 3 ? `\n \u2022 ...and ${blockingChecks.length - 3} more` : "";
1132
- const evidenceNote = `\nSee ${sid}-PRE-EXEC-VERIFY.json for full details.`;
1290
+ const details = blockingChecks.slice(0, MAX_NOTIFICATION_DETAILS).map(formatPreExecutionCheckDetail).join("\n");
1291
+ const suffix = blockingChecks.length > MAX_NOTIFICATION_DETAILS
1292
+ ? `\n ${NOTIFICATION_BULLET} ...and ${blockingChecks.length - MAX_NOTIFICATION_DETAILS} more`
1293
+ : "";
1294
+ const evidenceNote = `\nSee ${evidencePath} for full details.`;
1133
1295
  ctx.ui.notify(
1134
1296
  `Pre-execution checks failed: ${blockingCount} blocking issue${blockingCount === 1 ? "" : "s"} found\n${details}${suffix}${evidenceNote}`,
1135
1297
  "error",
1136
1298
  );
1299
+ // Persist failure context so the next plan-slice re-dispatch can inject
1300
+ // it into the prompt and break the infinite loop (#4551).
1301
+ s.lastPreExecFailure = {
1302
+ unitId: currentUnit.id,
1303
+ blockingFindings: blockingChecks.map(
1304
+ c => `[${c.category}] ${c.target}: ${c.message}`,
1305
+ ),
1306
+ verdictExcerpt: `status=${result.status}; ${blockingCount} blocking issue${blockingCount === 1 ? "" : "s"} detected`,
1307
+ };
1137
1308
  preExecPauseNeeded = true;
1138
1309
  } else if (result.status === "warn") {
1139
1310
  ctx.ui.notify(
@@ -1142,6 +1313,14 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
1142
1313
  );
1143
1314
  // Strict mode: treat warnings as blocking
1144
1315
  if (prefs?.enhanced_verification_strict === true) {
1316
+ const warnChecks = result.checks.filter(c => !c.passed);
1317
+ s.lastPreExecFailure = {
1318
+ unitId: currentUnit.id,
1319
+ blockingFindings: warnChecks.map(
1320
+ c => `[${c.category}] ${c.target}: ${c.message}`,
1321
+ ),
1322
+ verdictExcerpt: `status=${result.status} (strict mode); ${warnChecks.length} warning${warnChecks.length === 1 ? "" : "s"} treated as blocking`,
1323
+ };
1145
1324
  preExecPauseNeeded = true;
1146
1325
  }
1147
1326
  }