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
@@ -62,7 +62,9 @@ export function buildMemoryLLMCall(ctx) {
62
62
  // which returns undefined for OAuth users (Claude Max / Claude Pro).
63
63
  // See: https://github.com/gsd-build/gsd-2/issues/2959
64
64
  const resolvedKeyPromise = ctx.modelRegistry.getApiKey(selectedModel).catch(() => undefined);
65
- return async (system, user) => {
65
+ // Expose on the returned fn so tests can await resolution deterministically
66
+ // (avoids arbitrary setTimeout polling for an internal microtask).
67
+ const llmCall = async (system, user) => {
66
68
  const { completeSimple } = await import('@gsd/pi-ai');
67
69
  const resolvedApiKey = await resolvedKeyPromise;
68
70
  const result = await completeSimple(selectedModel, {
@@ -79,6 +81,10 @@ export function buildMemoryLLMCall(ctx) {
79
81
  .map(c => c.text);
80
82
  return textParts.join('');
81
83
  };
84
+ // Attach the in-flight API-key resolution so tests (and callers) can
85
+ // `await llmCall.apiKeyReady` rather than relying on setTimeout polling.
86
+ llmCall.apiKeyReady = resolvedKeyPromise;
87
+ return llmCall;
82
88
  }
83
89
  catch {
84
90
  return null;
@@ -18,6 +18,18 @@ import { loadQueueOrder, saveQueueOrder } from "./queue-order.js";
18
18
  import { deleteMilestone, getMilestone, isDbAvailable, updateMilestoneStatus } from "./gsd-db.js";
19
19
  import { removeWorktree } from "./worktree-manager.js";
20
20
  import { logWarning } from "./workflow-logger.js";
21
+ import { isAutoActive } from "./auto.js";
22
+ /**
23
+ * Writer-side assert for mutations that race with auto-mode's squash merge (#4704).
24
+ * Auto-mode is confirmed not to call parkMilestone/discardMilestone/unparkMilestone
25
+ * internally — these throws only surface invariant violations from new or forgotten
26
+ * call sites, which is the correct failure mode to catch loudly.
27
+ */
28
+ function assertNotAutoActive(action) {
29
+ if (isAutoActive()) {
30
+ throw new Error(`${action} cannot run while auto-mode is active. Stop auto-mode first with /gsd stop.`);
31
+ }
32
+ }
21
33
  // ─── Park ──────────────────────────────────────────────────────────────────
22
34
  /**
23
35
  * Park a milestone — creates a PARKED.md marker file with reason and timestamp.
@@ -25,6 +37,7 @@ import { logWarning } from "./workflow-logger.js";
25
37
  * Returns true if successfully parked, false if milestone not found or already parked.
26
38
  */
27
39
  export function parkMilestone(basePath, milestoneId, reason) {
40
+ assertNotAutoActive("park milestone");
28
41
  const mDir = resolveMilestonePath(basePath, milestoneId);
29
42
  if (!mDir || !existsSync(mDir))
30
43
  return false;
@@ -65,6 +78,7 @@ export function parkMilestone(basePath, milestoneId, reason) {
65
78
  * Returns true if successfully unparked, false if milestone not found or not parked.
66
79
  */
67
80
  export function unparkMilestone(basePath, milestoneId) {
81
+ assertNotAutoActive("unpark milestone");
68
82
  const mDir = resolveMilestonePath(basePath, milestoneId);
69
83
  if (!mDir || !existsSync(mDir))
70
84
  return false;
@@ -97,6 +111,7 @@ export function unparkMilestone(basePath, milestoneId) {
97
111
  * Returns true if successfully discarded, false if milestone not found.
98
112
  */
99
113
  export function discardMilestone(basePath, milestoneId) {
114
+ assertNotAutoActive("discard milestone");
100
115
  const mDir = resolveMilestonePath(basePath, milestoneId);
101
116
  if (!mDir || !existsSync(mDir))
102
117
  return false;
@@ -0,0 +1,299 @@
1
+ // GSD-2 — Milestone scope classifier (#4781 / ADR-003 companion).
2
+ //
3
+ // Pure heuristics over milestone planning fields. Produces a PipelineVariant
4
+ // that downstream dispatch logic can use to shape the auto-mode sequence.
5
+ // No LLM calls, no file I/O, sub-millisecond.
6
+ //
7
+ // Distinct from `complexity-classifier.ts`, which decides *model tier*
8
+ // (light/standard/heavy) for an individual unit. This module decides
9
+ // *pipeline topology* for an entire milestone at plan-milestone time.
10
+ //
11
+ // This file ships the classifier in isolation. Dispatch-side wiring
12
+ // lands in follow-up PRs so the classification contract can be reviewed
13
+ // and tested before any behavior change reaches users.
14
+ // ─── Keyword sets ─────────────────────────────────────────────────────────
15
+ /**
16
+ * Override keywords that force `standard` (at minimum) regardless of
17
+ * apparent triviality. Presence of any of these signals work that is
18
+ * either security-sensitive, irreversible, or requires runtime verification
19
+ * a "trivial" pipeline would skip.
20
+ *
21
+ * Matched as case-insensitive word-boundary substrings. Conservative — err
22
+ * on the side of including a keyword; over-classifying to `standard` costs
23
+ * units, under-classifying could ship broken auth/security/migration work.
24
+ */
25
+ const OVERRIDE_KEYWORDS = [
26
+ // Security-sensitive
27
+ "security", "auth", "authn", "authz", "authentication", "authorization",
28
+ "credential", "secret", "password", "token", "oauth", "encrypt", "decrypt",
29
+ "vulnerability", "exploit", "permission", "rbac", "acl",
30
+ // Data-migration / irreversible
31
+ "migration", "migrate", "schema change", "data migration",
32
+ "backfill", "drop column", "drop table",
33
+ // Compliance / regulatory
34
+ "compliance", "gdpr", "hipaa", "soc2", "pci",
35
+ // Infra / deploy — runtime verification needed
36
+ "deploy", "rollout", "canary", "production database",
37
+ ];
38
+ /**
39
+ * Keywords that contribute to `complex` classification on their own.
40
+ * Different from OVERRIDE_KEYWORDS in that a single match bumps to
41
+ * complex, not just to standard.
42
+ */
43
+ const COMPLEX_KEYWORDS = [
44
+ "multi-service", "distributed", "consensus", "saga", "eventual consistency",
45
+ "breaking change", "api contract change", "schema redesign",
46
+ "architect", "architecture", "refactor core",
47
+ ];
48
+ /**
49
+ * Trivial-signal keywords: presence strongly suggests a simple, contained
50
+ * deliverable. Only effective when combined with low file count / no tests
51
+ * / no override keywords.
52
+ */
53
+ const TRIVIAL_KEYWORDS = [
54
+ "single file", "one file", "static html", "static page",
55
+ "one-page", "landing page", "readme", "docs only", "typo", "rename",
56
+ "spelling", "comment", "changelog",
57
+ // Browser-only / no-build deliverable shapes (b23 forensic case).
58
+ "pure html", "browser-based", "no build step", "no build tooling",
59
+ "localstorage", "client-only", "no backend", "no server", "no backend.",
60
+ ];
61
+ // ─── Heuristics ───────────────────────────────────────────────────────────
62
+ /**
63
+ * Estimate how many distinct files the milestone will touch, based on
64
+ * explicit mentions in the input text. Returns `null` when no hint is
65
+ * discoverable — callers should treat that as "unknown, no signal."
66
+ */
67
+ function extractFileCountHint(text) {
68
+ // Explicit phrasing: "a single file", "two files", "3 files"
69
+ const singleFileMatch = /\b(a|one|single)\s+(file|page)\b/i.test(text);
70
+ if (singleFileMatch)
71
+ return 1;
72
+ const digitMatch = text.match(/\b(\d+)\s+files?\b/i);
73
+ if (digitMatch) {
74
+ const n = parseInt(digitMatch[1], 10);
75
+ if (!Number.isNaN(n))
76
+ return n;
77
+ }
78
+ const wordMatch = text.match(/\b(two|three|four|five|six|seven|eight|nine|ten)\s+files?\b/i);
79
+ if (wordMatch) {
80
+ const wordMap = {
81
+ two: 2, three: 3, four: 4, five: 5,
82
+ six: 6, seven: 7, eight: 8, nine: 9, ten: 10,
83
+ };
84
+ return wordMap[wordMatch[1].toLowerCase()] ?? null;
85
+ }
86
+ return null;
87
+ }
88
+ function escapeRegExp(value) {
89
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
90
+ }
91
+ function containsAnyKeyword(haystack, keywords) {
92
+ const lower = haystack.toLowerCase();
93
+ const hits = [];
94
+ for (const kw of keywords) {
95
+ // Word-boundary match to prevent substring collisions (e.g. "auth"
96
+ // must not match "author", "api" must not match "capital"). Phrases
97
+ // containing non-word characters (hyphens, slashes) still work because
98
+ // `\b` sits at the word-char / non-word-char transition, so
99
+ // `\bbrowser-based\b` matches "browser-based" bounded by whitespace
100
+ // or punctuation on either side.
101
+ const pattern = new RegExp(String.raw `\b${escapeRegExp(kw)}\b`, "i");
102
+ if (pattern.test(lower))
103
+ hits.push(kw);
104
+ }
105
+ return hits;
106
+ }
107
+ /**
108
+ * True when `term` appears in the text without an immediately preceding
109
+ * negator (no / without / not / zero / skip) in the same clause. Used to
110
+ * keep phrases like "no backend" or "no tests" from flipping a trivial-
111
+ * class milestone to standard. Best-effort; imperfect English parsing,
112
+ * biased toward false negatives (if unsure, treats term as present —
113
+ * which routes to standard, the safe pipeline).
114
+ */
115
+ function mentionsWithoutNegation(text, term) {
116
+ const lower = text.toLowerCase();
117
+ const termPattern = new RegExp(String.raw `\b${term}\b`, "gi");
118
+ const matches = Array.from(lower.matchAll(termPattern));
119
+ for (const m of matches) {
120
+ const start = m.index ?? 0;
121
+ const windowStart = Math.max(0, start - 30);
122
+ const window = lower.slice(windowStart, start);
123
+ // Negator anywhere in the 30-char lookback window counts as negation —
124
+ // covers "no backend", "without a server", "not using api", "zero
125
+ // dependencies on an api". If a sentence break intervenes between the
126
+ // negator and the term, treat as a different clause (positive mention).
127
+ const hasNegator = /(^|[^a-z0-9])(no|without|not|zero|skip(s|ping)?|drops?)\b/i.test(window);
128
+ const hasSentenceBreak = /[.;!?]/.test(window);
129
+ if (hasNegator && !hasSentenceBreak)
130
+ continue;
131
+ return true;
132
+ }
133
+ return false;
134
+ }
135
+ function mentionsTests(haystack) {
136
+ return mentionsWithoutNegation(haystack, "test")
137
+ || mentionsWithoutNegation(haystack, "tests")
138
+ || mentionsWithoutNegation(haystack, "testing")
139
+ || mentionsWithoutNegation(haystack, "spec")
140
+ || mentionsWithoutNegation(haystack, "unit test")
141
+ || mentionsWithoutNegation(haystack, "integration test");
142
+ }
143
+ function mentionsBackend(haystack) {
144
+ return mentionsWithoutNegation(haystack, "api")
145
+ || mentionsWithoutNegation(haystack, "backend")
146
+ || mentionsWithoutNegation(haystack, "server")
147
+ || mentionsWithoutNegation(haystack, "database")
148
+ || mentionsWithoutNegation(haystack, "endpoint");
149
+ }
150
+ // ─── DB adapter ───────────────────────────────────────────────────────────
151
+ /**
152
+ * Shape adapter: convert a milestone DB row into the classifier input
153
+ * object. Keeps `milestone-scope-classifier.ts` free of DB types at the
154
+ * module boundary — callers can either use this helper or hand-build the
155
+ * input themselves (e.g. from plan-milestone tool params before insert).
156
+ */
157
+ export function milestoneRowToScopeInput(row) {
158
+ return {
159
+ title: row.title,
160
+ vision: row.vision,
161
+ successCriteria: row.success_criteria,
162
+ keyRisks: row.key_risks,
163
+ definitionOfDone: row.definition_of_done,
164
+ requirementCoverage: row.requirement_coverage,
165
+ verificationContract: row.verification_contract,
166
+ verificationIntegration: row.verification_integration,
167
+ verificationOperational: row.verification_operational,
168
+ verificationUat: row.verification_uat,
169
+ };
170
+ }
171
+ /**
172
+ * Compute the pipeline variant for a milestone by reading its planning
173
+ * fields from the DB and running the classifier. Returns `null` when
174
+ * classification is unavailable (DB closed, milestone missing, unexpected
175
+ * error) — callers MUST treat null as "run the full pipeline" so a
176
+ * classification failure never silently downshifts dispatch.
177
+ */
178
+ export async function getMilestonePipelineVariant(mid) {
179
+ try {
180
+ const { isDbAvailable, getMilestone } = await import("./gsd-db.js");
181
+ if (!isDbAvailable())
182
+ return null;
183
+ const row = getMilestone(mid);
184
+ if (!row)
185
+ return null;
186
+ return classifyMilestoneScope(milestoneRowToScopeInput(row)).variant;
187
+ }
188
+ catch {
189
+ return null;
190
+ }
191
+ }
192
+ // ─── Public API ───────────────────────────────────────────────────────────
193
+ /**
194
+ * Classify a milestone's pipeline variant based on its planning inputs.
195
+ *
196
+ * Precedence (matches implementation order — complex-first so that
197
+ * security-sensitive architecture refactors correctly route to complex
198
+ * rather than standard; the override hit is still recorded in
199
+ * `signals.triggeredOverride` for telemetry):
200
+ * 1. Complex-signal keyword OR ≥ 8 file hint OR architecture/refactor-core
201
+ * language → `complex`.
202
+ * 2. Override keyword → `standard` (at minimum). Prevents trivial
203
+ * misclassification of security / auth / migration work.
204
+ * 3. Trivial-signal keyword AND ≤ 2 file hint AND no tests mentioned AND
205
+ * no backend mentioned → `trivial`.
206
+ * 4. Otherwise → `standard`.
207
+ *
208
+ * Ambiguity → `standard` (today's default). Safe to run the full pipeline.
209
+ */
210
+ export function classifyMilestoneScope(input) {
211
+ const haystack = [
212
+ input.title ?? "",
213
+ input.vision ?? "",
214
+ (input.successCriteria ?? []).join("\n"),
215
+ (input.keyRisks ?? []).map(r => `${r.risk ?? ""} ${r.whyItMatters ?? ""}`).join("\n"),
216
+ (input.definitionOfDone ?? []).join("\n"),
217
+ input.requirementCoverage ?? "",
218
+ input.verificationContract ?? "",
219
+ input.verificationIntegration ?? "",
220
+ input.verificationOperational ?? "",
221
+ input.verificationUat ?? "",
222
+ ].join("\n");
223
+ const overrideHits = containsAnyKeyword(haystack, OVERRIDE_KEYWORDS);
224
+ const complexHits = containsAnyKeyword(haystack, COMPLEX_KEYWORDS);
225
+ const trivialHits = containsAnyKeyword(haystack, TRIVIAL_KEYWORDS);
226
+ const fileCountHint = extractFileCountHint(haystack);
227
+ const hasTests = mentionsTests(haystack);
228
+ const hasBackend = mentionsBackend(haystack);
229
+ const reasons = [];
230
+ // Rule 2: complex-class signals. Evaluated before override because a
231
+ // complex + override input should land in complex, not standard.
232
+ if (complexHits.length > 0) {
233
+ reasons.push(`complex keywords: ${complexHits.slice(0, 3).join(", ")}`);
234
+ }
235
+ if (fileCountHint !== null && fileCountHint >= 8) {
236
+ reasons.push(`file count hint: ${fileCountHint}`);
237
+ }
238
+ const isComplex = complexHits.length > 0 || (fileCountHint !== null && fileCountHint >= 8);
239
+ if (isComplex) {
240
+ return {
241
+ variant: "complex",
242
+ reasons,
243
+ signals: {
244
+ triggeredOverride: overrideHits.length > 0,
245
+ complexCount: complexHits.length,
246
+ trivialCount: trivialHits.length,
247
+ fileCountHint,
248
+ },
249
+ };
250
+ }
251
+ // Rule 1: override keywords force standard.
252
+ if (overrideHits.length > 0) {
253
+ return {
254
+ variant: "standard",
255
+ reasons: [`override keywords: ${overrideHits.slice(0, 3).join(", ")}`],
256
+ signals: {
257
+ triggeredOverride: true,
258
+ complexCount: complexHits.length,
259
+ trivialCount: trivialHits.length,
260
+ fileCountHint,
261
+ },
262
+ };
263
+ }
264
+ // Rule 3: trivial signals — require ALL of: trivial-keyword, low file
265
+ // hint (or nothing suggesting high count), no test mention, no backend
266
+ // mention.
267
+ const fileCountOk = fileCountHint === null || fileCountHint <= 2;
268
+ const trivial = trivialHits.length > 0 &&
269
+ fileCountOk &&
270
+ !hasTests &&
271
+ !hasBackend;
272
+ if (trivial) {
273
+ reasons.push(`trivial keywords: ${trivialHits.slice(0, 3).join(", ")}`);
274
+ if (fileCountHint !== null)
275
+ reasons.push(`file count hint: ${fileCountHint}`);
276
+ reasons.push("no tests mentioned", "no backend mentioned");
277
+ return {
278
+ variant: "trivial",
279
+ reasons,
280
+ signals: {
281
+ triggeredOverride: false,
282
+ complexCount: complexHits.length,
283
+ trivialCount: trivialHits.length,
284
+ fileCountHint,
285
+ },
286
+ };
287
+ }
288
+ // Rule 4: fallback.
289
+ return {
290
+ variant: "standard",
291
+ reasons: reasons.length > 0 ? reasons : ["no strong signals — default"],
292
+ signals: {
293
+ triggeredOverride: overrideHits.length > 0,
294
+ complexCount: complexHits.length,
295
+ trivialCount: trivialHits.length,
296
+ fileCountHint,
297
+ },
298
+ };
299
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Shared milestone SUMMARY classifier.
3
+ *
4
+ * SUMMARY presence alone is not enough to prove milestone completion: recovery
5
+ * and blocker paths also write SUMMARY files. Keep this leaf module free of
6
+ * state/auto imports so state derivation, dispatch guards, and recovery can
7
+ * share one definition without cycles.
8
+ */
9
+ import { splitFrontmatter, parseFrontmatterMap } from "../shared/frontmatter.js";
10
+ import { isClosedStatus } from "./status-guards.js";
11
+ export function classifyMilestoneSummaryContent(content) {
12
+ const [fmLines] = splitFrontmatter(content);
13
+ const fm = fmLines ? parseFrontmatterMap(fmLines) : null;
14
+ const rawStatus = typeof fm?.status === "string" ? fm.status.trim().toLowerCase() : "";
15
+ if (rawStatus) {
16
+ if (isClosedStatus(rawStatus))
17
+ return "success";
18
+ if (["active", "pending", "blocked", "failed", "failure", "incomplete"].includes(rawStatus)) {
19
+ return "failure";
20
+ }
21
+ }
22
+ const failureSignal = /(?:^|\n)\s*#\s*BLOCKER\b/i.test(content)
23
+ || /auto-mode recovery failed/i.test(content)
24
+ || /verification\s+failed/i.test(content)
25
+ || /(?:^|\n)\s*(?:status|verdict|outcome|result)\s*[:=-]\s*not complete\b/i.test(content);
26
+ if (failureSignal)
27
+ return "failure";
28
+ return "unknown";
29
+ }
30
+ /**
31
+ * Legacy-compatible terminal check for state derivation.
32
+ * Unknown summaries remain terminal to preserve old handwritten SUMMARY files;
33
+ * explicit failure summaries do not.
34
+ */
35
+ export function isTerminalMilestoneSummaryContent(content) {
36
+ return classifyMilestoneSummaryContent(content) !== "failure";
37
+ }
@@ -43,6 +43,9 @@ export const BUNDLED_COST_TABLE = [
43
43
  { id: "gpt-5.3-codex-spark", inputPer1k: 0.0003, outputPer1k: 0.0012, updatedAt: "2026-03-29" },
44
44
  { id: "gpt-5.4", inputPer1k: 0.005, outputPer1k: 0.02, updatedAt: "2026-03-29" },
45
45
  { id: "gpt-5.4-mini", inputPer1k: 0.00075, outputPer1k: 0.0045, updatedAt: "2026-04-18" },
46
+ // GPT-5.5 API list price, also used for live Codex OAuth routing.
47
+ // Source: https://openai.com/api/pricing/
48
+ { id: "gpt-5.5", inputPer1k: 0.005, outputPer1k: 0.03, updatedAt: "2026-04-23" },
46
49
  // Google
47
50
  { id: "gemini-2.0-flash", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2025-03-15" },
48
51
  { id: "gemini-flash-2.0", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2025-03-15" },
@@ -43,6 +43,7 @@ export const MODEL_CAPABILITY_TIER = {
43
43
  "gpt-5.2-codex": "heavy",
44
44
  "gpt-5.3-codex": "heavy",
45
45
  "gpt-5.4": "heavy",
46
+ "gpt-5.5": "heavy",
46
47
  "o1": "heavy",
47
48
  "o3": "heavy",
48
49
  "o4-mini": "heavy",
@@ -76,6 +77,7 @@ const MODEL_COST_PER_1K_INPUT = {
76
77
  "gpt-5.3-codex": 0.005,
77
78
  "gpt-5.3-codex-spark": 0.0003,
78
79
  "gpt-5.4": 0.005,
80
+ "gpt-5.5": 0.005,
79
81
  "o4-mini": 0.005,
80
82
  "o4-mini-deep-research": 0.005,
81
83
  "gemini-2.0-flash": 0.0001,
@@ -116,6 +118,10 @@ export const MODEL_CAPABILITY_PROFILES = {
116
118
  "gpt-5.3-codex": { coding: 94, debugging: 91, research: 74, reasoning: 89, speed: 50, longContext: 80, instruction: 89 },
117
119
  "gpt-5.3-codex-spark": { coding: 68, debugging: 58, research: 42, reasoning: 52, speed: 90, longContext: 50, instruction: 74 },
118
120
  "gpt-5.4": { coding: 95, debugging: 92, research: 88, reasoning: 94, speed: 42, longContext: 88, instruction: 92 },
121
+ // GPT-5.5 scores are relative to the existing gpt-5.4 profile and backed by
122
+ // OpenAI's 2026-04-23 published eval deltas across coding, tool use, and long context.
123
+ // Source: https://openai.com/index/introducing-gpt-5-5/
124
+ "gpt-5.5": { coding: 96, debugging: 93, research: 89, reasoning: 95, speed: 42, longContext: 90, instruction: 93 },
119
125
  // ── OpenAI o-series (reasoning-first) ──────────────────────────────────────
120
126
  "o1": { coding: 78, debugging: 82, research: 78, reasoning: 90, speed: 20, longContext: 65, instruction: 82 },
121
127
  "o3": { coding: 80, debugging: 85, research: 80, reasoning: 92, speed: 25, longContext: 70, instruction: 85 },
@@ -440,6 +446,20 @@ function getModelCost(modelId) {
440
446
  function bareModelId(modelId) {
441
447
  return modelId.includes("/") ? modelId.split("/").pop() : modelId;
442
448
  }
449
+ // ─── Provider-specific Tool Limits ─────────────────────────────────────────
450
+ /**
451
+ * Groq enforces a hard limit of 128 tools per request.
452
+ * Requests exceeding this limit receive a 400 error:
453
+ * "maximum number of items is 128"
454
+ * @see https://console.groq.com/docs/tool-use
455
+ */
456
+ export const GROQ_MAX_TOOLS = 128;
457
+ /**
458
+ * Provider IDs that map to the Groq API backend.
459
+ * Used to detect Groq at the GSD routing layer where only the provider string
460
+ * is available (the pi-ai openai-completions adapter is shared across providers).
461
+ */
462
+ const GROQ_PROVIDER_IDS = new Set(["groq"]);
443
463
  // ─── Tool Compatibility Filter (ADR-005 Phase 3) ───────────────────────────
444
464
  /**
445
465
  * Check if a tool is compatible with a provider's capabilities.
@@ -461,8 +481,14 @@ export function isToolCompatibleWithProvider(toolName, providerCaps) {
461
481
  /**
462
482
  * Filter a list of tool names to only those compatible with a provider.
463
483
  * Used by the routing pipeline to adjust tool sets when switching providers.
484
+ *
485
+ * @param toolNames - The full list of active tool names to filter.
486
+ * @param providerApi - The pi-ai API string (e.g. "openai-completions").
487
+ * @param provider - Optional provider ID (e.g. "groq"). Used to apply
488
+ * provider-specific limits that can't be expressed as API-level capabilities
489
+ * (e.g. Groq's 128-tool hard limit on the shared openai-completions adapter).
464
490
  */
465
- export function filterToolsForProvider(toolNames, providerApi) {
491
+ export function filterToolsForProvider(toolNames, providerApi, provider) {
466
492
  const providerCaps = getProviderCapabilities(providerApi);
467
493
  // Provider doesn't support tool calling at all
468
494
  if (!providerCaps.toolCalling) {
@@ -478,6 +504,14 @@ export function filterToolsForProvider(toolNames, providerApi) {
478
504
  filtered.push(name);
479
505
  }
480
506
  }
507
+ // Groq enforces a hard limit of 128 tools per request (#4376).
508
+ // Trim the compatible list to GROQ_MAX_TOOLS and move the excess to filtered.
509
+ if (provider && GROQ_PROVIDER_IDS.has(provider) && compatible.length > GROQ_MAX_TOOLS) {
510
+ const trimmed = compatible.splice(GROQ_MAX_TOOLS);
511
+ filtered.push(...trimmed);
512
+ console.warn(`[gsd] Groq tool limit: ${compatible.length + trimmed.length} tools active but Groq allows at most ${GROQ_MAX_TOOLS}. ` +
513
+ `Trimming to the first ${GROQ_MAX_TOOLS} tools. Removed: ${trimmed.join(", ")}`);
514
+ }
481
515
  return { compatible, filtered };
482
516
  }
483
517
  /**
@@ -486,8 +520,13 @@ export function filterToolsForProvider(toolNames, providerApi) {
486
520
  *
487
521
  * This is a hard filter only — it removes tools that would fail at the
488
522
  * provider level. It does NOT remove tools based on soft heuristics.
523
+ *
524
+ * @param activeToolNames - The full list of currently active tool names.
525
+ * @param selectedModelApi - The pi-ai API string for the selected model.
526
+ * @param provider - Optional provider ID (e.g. "groq") for provider-specific
527
+ * limits beyond what the API-level capability profile expresses.
489
528
  */
490
- export function adjustToolSet(activeToolNames, selectedModelApi) {
491
- const { compatible, filtered } = filterToolsForProvider(activeToolNames, selectedModelApi);
529
+ export function adjustToolSet(activeToolNames, selectedModelApi, provider) {
530
+ const { compatible, filtered } = filterToolsForProvider(activeToolNames, selectedModelApi, provider);
492
531
  return { toolNames: compatible, removedTools: filtered };
493
532
  }
@@ -740,15 +740,44 @@ export function nativeResetPaths(basePath, paths) {
740
740
  gitExec(basePath, ["reset", "HEAD", "--", p], true);
741
741
  }
742
742
  }
743
+ /**
744
+ * Read `commit.gpgsign` from the repo config. Returns true only if the value
745
+ * is the literal string "true". Any other state (unset, false, error) → false.
746
+ *
747
+ * Used by nativeCommit to route signing-required commits through the git CLI,
748
+ * because the libgit2 native path does not invoke configured signers.
749
+ * (Issue #4980 CRIT-2)
750
+ */
751
+ function shouldSignCommits(basePath) {
752
+ try {
753
+ const result = execFileSync("git", ["config", "--get", "commit.gpgsign"], {
754
+ cwd: basePath,
755
+ stdio: ["ignore", "pipe", "pipe"],
756
+ encoding: "utf-8",
757
+ env: GIT_NO_PROMPT_ENV,
758
+ }).trim();
759
+ return result === "true";
760
+ }
761
+ catch {
762
+ return false;
763
+ }
764
+ }
743
765
  /**
744
766
  * Create a commit from the current index.
745
767
  * Returns the commit SHA on success, or null if nothing to commit.
746
768
  * Native: libgit2 commit create.
747
- * Fallback: `git commit --no-verify -F -`.
769
+ * Fallback: `git commit -F -` (runs hooks; honors commit.gpgsign).
770
+ *
771
+ * The fallback intentionally does NOT use --no-verify — user pre-commit /
772
+ * commit-msg / prepare-commit-msg hooks must fire on every GSD-automated
773
+ * commit. (Issue #4980 CRIT-1)
748
774
  */
749
775
  export function nativeCommit(basePath, message, options) {
750
776
  const native = loadNative();
751
- if (native) {
777
+ // libgit2's commit-create does not invoke configured GPG/SSH signers. When
778
+ // commit.gpgsign=true, route through the git CLI fallback so signing
779
+ // happens. (Issue #4980 CRIT-2)
780
+ if (native && !shouldSignCommits(basePath)) {
752
781
  try {
753
782
  return native.gitCommit(basePath, message, options?.allowEmpty);
754
783
  }
@@ -759,9 +788,10 @@ export function nativeCommit(basePath, message, options) {
759
788
  throw e;
760
789
  }
761
790
  }
762
- // Fallback: use git commit with stdin pipe for safe multi-line messages
791
+ // Fallback / signed-commit path: use git CLI with stdin pipe for safe
792
+ // multi-line messages. Hooks run; commit.gpgsign honored.
763
793
  try {
764
- const args = ["commit", "--no-verify", "-F", "-"];
794
+ const args = ["commit", "-F", "-"];
765
795
  if (options?.allowEmpty)
766
796
  args.push("--allow-empty");
767
797
  const result = execFileSync("git", args, {
@@ -2,7 +2,6 @@
2
2
  // Cross-platform desktop notifications for auto-mode events.
3
3
  import { execFileSync } from "node:child_process";
4
4
  import { loadEffectiveGSDPreferences } from "./preferences.js";
5
- import { CmuxClient, emitOsc777Notification, resolveCmuxConfig } from "../cmux/index.js";
6
5
  import { sendRemoteNotification } from "../remote-questions/notify.js";
7
6
  /**
8
7
  * Send a native desktop notification. Non-blocking, non-fatal.
@@ -20,22 +19,37 @@ export function sendDesktopNotification(title, message, level = "info", kind = "
20
19
  void sendRemoteNotification(title, message).catch(() => { });
21
20
  if (!shouldSendDesktopNotification(kind, loaded?.notifications))
22
21
  return;
23
- const cmux = resolveCmuxConfig(loaded);
24
- if (cmux.notifications) {
25
- const delivered = CmuxClient.fromPreferences(loaded).notify(title, message);
26
- if (delivered)
27
- return;
28
- emitOsc777Notification(title, message);
29
- }
30
- try {
31
- const command = buildDesktopNotificationCommand(process.platform, title, message, level);
32
- if (!command)
22
+ // cmux delivery and desktop delivery are independent — if cmux import or
23
+ // delivery fails, we must still attempt the native desktop notification.
24
+ const runCmux = async () => {
25
+ try {
26
+ const { CmuxClient, emitOsc777Notification, resolveCmuxConfig } = await import("../cmux/index.js");
27
+ const cmux = resolveCmuxConfig(loaded);
28
+ if (cmux.notifications) {
29
+ const delivered = CmuxClient.fromPreferences(loaded).notify(title, message);
30
+ if (delivered)
31
+ return true;
32
+ emitOsc777Notification(title, message);
33
+ }
34
+ }
35
+ catch {
36
+ // cmux unavailable — fall through to desktop notification
37
+ }
38
+ return false;
39
+ };
40
+ void runCmux().then((deliveredByCmux) => {
41
+ if (deliveredByCmux)
33
42
  return;
34
- execFileSync(command.file, command.args, { timeout: 3000, stdio: "ignore" });
35
- }
36
- catch {
37
- // Non-fatal — desktop notifications are best-effort
38
- }
43
+ try {
44
+ const command = buildDesktopNotificationCommand(process.platform, title, message, level);
45
+ if (!command)
46
+ return;
47
+ execFileSync(command.file, command.args, { timeout: 3000, stdio: "ignore" });
48
+ }
49
+ catch {
50
+ // Non-fatal — desktop notifications are best-effort
51
+ }
52
+ }).catch(() => { });
39
53
  }
40
54
  export function shouldSendDesktopNotification(kind, preferences = loadEffectiveGSDPreferences()?.preferences.notifications) {
41
55
  if (preferences?.enabled === false)