gsd-pi 2.76.0 → 2.77.0

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 (536) hide show
  1. package/README.md +45 -25
  2. package/dist/claude-cli-check.js +32 -3
  3. package/dist/mcp-server.d.ts +7 -0
  4. package/dist/mcp-server.js +35 -1
  5. package/dist/onboarding.js +45 -0
  6. package/dist/resource-loader.d.ts +1 -1
  7. package/dist/resource-loader.js +2 -8
  8. package/dist/resources/agents/researcher.md +1 -1
  9. package/dist/resources/extensions/claude-code-cli/readiness.js +31 -8
  10. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +77 -17
  11. package/dist/resources/extensions/gsd/auto/loop.js +9 -0
  12. package/dist/resources/extensions/gsd/auto/phases.js +104 -11
  13. package/dist/resources/extensions/gsd/auto/run-unit.js +38 -2
  14. package/dist/resources/extensions/gsd/auto/session.js +22 -1
  15. package/dist/resources/extensions/gsd/auto-dispatch.js +16 -3
  16. package/dist/resources/extensions/gsd/auto-model-selection.js +53 -16
  17. package/dist/resources/extensions/gsd/auto-post-unit.js +25 -2
  18. package/dist/resources/extensions/gsd/auto-prompts.js +14 -0
  19. package/dist/resources/extensions/gsd/auto-recovery.js +32 -1
  20. package/dist/resources/extensions/gsd/auto-start.js +58 -57
  21. package/dist/resources/extensions/gsd/auto-verification.js +33 -0
  22. package/dist/resources/extensions/gsd/auto-worktree.js +51 -53
  23. package/dist/resources/extensions/gsd/auto.js +70 -28
  24. package/dist/resources/extensions/gsd/blocked-models.js +68 -0
  25. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +93 -1
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +39 -9
  27. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +93 -0
  28. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +3 -0
  29. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +12 -0
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +52 -6
  31. package/dist/resources/extensions/gsd/bootstrap/system-context.js +84 -23
  32. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +34 -2
  33. package/dist/resources/extensions/gsd/clean-root-preflight.js +93 -0
  34. package/dist/resources/extensions/gsd/commands-extract-learnings.js +54 -89
  35. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
  36. package/dist/resources/extensions/gsd/compaction-snapshot.js +121 -0
  37. package/dist/resources/extensions/gsd/complexity-classifier.js +5 -3
  38. package/dist/resources/extensions/gsd/db-writer.js +88 -16
  39. package/dist/resources/extensions/gsd/doctor-git-checks.js +23 -29
  40. package/dist/resources/extensions/gsd/doctor-providers.js +51 -5
  41. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -0
  42. package/dist/resources/extensions/gsd/error-classifier.js +31 -3
  43. package/dist/resources/extensions/gsd/exec-history.js +120 -0
  44. package/dist/resources/extensions/gsd/exec-sandbox.js +258 -0
  45. package/dist/resources/extensions/gsd/gitignore.js +1 -0
  46. package/dist/resources/extensions/gsd/gsd-db.js +168 -23
  47. package/dist/resources/extensions/gsd/guided-flow.js +190 -1
  48. package/dist/resources/extensions/gsd/health-widget.js +4 -1
  49. package/dist/resources/extensions/gsd/hook-emitter.js +108 -0
  50. package/dist/resources/extensions/gsd/init-wizard.js +15 -1
  51. package/dist/resources/extensions/gsd/key-manager.js +28 -0
  52. package/dist/resources/extensions/gsd/memory-backfill.js +126 -0
  53. package/dist/resources/extensions/gsd/memory-store.js +19 -0
  54. package/dist/resources/extensions/gsd/model-router.js +36 -3
  55. package/dist/resources/extensions/gsd/pre-execution-checks.js +44 -9
  56. package/dist/resources/extensions/gsd/preferences-types.js +9 -0
  57. package/dist/resources/extensions/gsd/preferences-validation.js +83 -0
  58. package/dist/resources/extensions/gsd/preferences.js +17 -17
  59. package/dist/resources/extensions/gsd/prompt-loader.js +22 -7
  60. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  61. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  62. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  63. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -0
  64. package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
  65. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  66. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  67. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  68. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -0
  69. package/dist/resources/extensions/gsd/safety/evidence-collector.js +96 -0
  70. package/dist/resources/extensions/gsd/safety/file-change-validator.js +13 -5
  71. package/dist/resources/extensions/gsd/safety/safety-harness.js +5 -1
  72. package/dist/resources/extensions/gsd/state.js +43 -4
  73. package/dist/resources/extensions/gsd/token-counter.js +22 -5
  74. package/dist/resources/extensions/gsd/tools/complete-milestone.js +16 -10
  75. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +59 -0
  76. package/dist/resources/extensions/gsd/tools/exec-tool.js +126 -0
  77. package/dist/resources/extensions/gsd/tools/memory-tools.js +26 -1
  78. package/dist/resources/extensions/gsd/tools/resume-tool.js +23 -0
  79. package/dist/resources/extensions/gsd/uok/plan-v2.js +20 -3
  80. package/dist/resources/extensions/gsd/workflow-mcp.js +3 -0
  81. package/dist/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  82. package/dist/resources/extensions/gsd/worktree-resolver.js +50 -10
  83. package/dist/resources/extensions/search-the-web/command-search-provider.js +5 -4
  84. package/dist/resources/extensions/search-the-web/native-search.js +45 -13
  85. package/dist/resources/skills/api-design/SKILL.md +190 -0
  86. package/dist/resources/skills/create-mcp-server/SKILL.md +121 -0
  87. package/dist/resources/skills/decompose-into-slices/SKILL.md +139 -0
  88. package/dist/resources/skills/dependency-upgrade/SKILL.md +158 -0
  89. package/dist/resources/skills/design-an-interface/SKILL.md +102 -0
  90. package/dist/resources/skills/forensics/SKILL.md +153 -0
  91. package/dist/resources/skills/grill-me/SKILL.md +93 -0
  92. package/dist/resources/skills/handoff/SKILL.md +121 -0
  93. package/dist/resources/skills/observability/SKILL.md +174 -0
  94. package/dist/resources/skills/security-review/SKILL.md +181 -0
  95. package/dist/resources/skills/spike-wrap-up/SKILL.md +138 -0
  96. package/dist/resources/skills/tdd/SKILL.md +112 -0
  97. package/dist/resources/skills/verify-before-complete/SKILL.md +98 -0
  98. package/dist/resources/skills/write-docs/SKILL.md +82 -0
  99. package/dist/resources/skills/write-milestone-brief/SKILL.md +135 -0
  100. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  101. package/dist/web/standalone/.next/BUILD_ID +1 -1
  102. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  103. package/dist/web/standalone/.next/build-manifest.json +2 -2
  104. package/dist/web/standalone/.next/required-server-files.json +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/index.html +1 -1
  122. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  129. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  130. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/middleware-manifest.json +1 -1
  132. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  133. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  134. package/dist/web/standalone/server.js +1 -1
  135. package/dist/welcome-screen.js +6 -1
  136. package/dist/wizard.js +2 -0
  137. package/package.json +1 -1
  138. package/packages/daemon/package.json +2 -2
  139. package/packages/mcp-server/dist/remote-questions.d.ts +45 -0
  140. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
  141. package/packages/mcp-server/dist/remote-questions.js +732 -0
  142. package/packages/mcp-server/dist/remote-questions.js.map +1 -0
  143. package/packages/mcp-server/dist/server.d.ts +7 -0
  144. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  145. package/packages/mcp-server/dist/server.js +70 -8
  146. package/packages/mcp-server/dist/server.js.map +1 -1
  147. package/packages/mcp-server/dist/session-manager.d.ts +14 -0
  148. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  149. package/packages/mcp-server/dist/session-manager.js +49 -1
  150. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  151. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  152. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  153. package/packages/mcp-server/dist/workflow-tools.js +163 -25
  154. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  155. package/packages/mcp-server/package.json +4 -3
  156. package/packages/mcp-server/src/mcp-server.test.ts +67 -0
  157. package/packages/mcp-server/src/remote-questions.test.ts +294 -0
  158. package/packages/mcp-server/src/remote-questions.ts +916 -0
  159. package/packages/mcp-server/src/server.ts +89 -14
  160. package/packages/mcp-server/src/session-manager.ts +43 -1
  161. package/packages/mcp-server/src/workflow-tools.test.ts +146 -1
  162. package/packages/mcp-server/src/workflow-tools.ts +215 -43
  163. package/packages/mcp-server/tsconfig.test.json +19 -0
  164. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  165. package/packages/native/package.json +1 -1
  166. package/packages/pi-agent-core/dist/agent-loop.js +12 -0
  167. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  168. package/packages/pi-agent-core/dist/types.d.ts +30 -0
  169. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  170. package/packages/pi-agent-core/dist/types.js.map +1 -1
  171. package/packages/pi-agent-core/package.json +1 -1
  172. package/packages/pi-agent-core/src/agent-loop.ts +14 -0
  173. package/packages/pi-agent-core/src/types.ts +34 -0
  174. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  175. package/packages/pi-ai/dist/models/custom.d.ts +38 -0
  176. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -1
  177. package/packages/pi-ai/dist/models/custom.js +41 -0
  178. package/packages/pi-ai/dist/models/custom.js.map +1 -1
  179. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +1 -1
  180. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  181. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts +2 -0
  182. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts.map +1 -0
  183. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +13 -0
  184. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -0
  185. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  186. package/packages/pi-ai/dist/providers/anthropic-shared.js +27 -4
  187. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  188. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  189. package/packages/pi-ai/dist/providers/anthropic.js +13 -4
  190. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  191. package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts +2 -0
  192. package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts.map +1 -0
  193. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +80 -0
  194. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -0
  195. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  196. package/packages/pi-ai/dist/providers/openai-completions.js +60 -15
  197. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  198. package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
  199. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  200. package/packages/pi-ai/dist/providers/simple-options.js +16 -1
  201. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  202. package/packages/pi-ai/dist/providers/think-tag-parser.d.ts +17 -0
  203. package/packages/pi-ai/dist/providers/think-tag-parser.d.ts.map +1 -0
  204. package/packages/pi-ai/dist/providers/think-tag-parser.js +75 -0
  205. package/packages/pi-ai/dist/providers/think-tag-parser.js.map +1 -0
  206. package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts +2 -0
  207. package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts.map +1 -0
  208. package/packages/pi-ai/dist/providers/think-tag-parser.test.js +41 -0
  209. package/packages/pi-ai/dist/providers/think-tag-parser.test.js.map +1 -0
  210. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  211. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +12 -2
  212. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  213. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +164 -14
  214. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  215. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  216. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +15 -3
  217. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  218. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts +2 -0
  219. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts.map +1 -0
  220. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +67 -0
  221. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -0
  222. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  223. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +16 -3
  224. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  225. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts +2 -0
  226. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts.map +1 -0
  227. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +67 -0
  228. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -0
  229. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +2 -0
  230. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +1 -0
  231. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +289 -0
  232. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +1 -0
  233. package/packages/pi-ai/package.json +1 -1
  234. package/packages/pi-ai/src/models/custom.ts +42 -0
  235. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +1 -1
  236. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -0
  237. package/packages/pi-ai/src/providers/anthropic-shared.ts +26 -5
  238. package/packages/pi-ai/src/providers/anthropic.ts +15 -4
  239. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +98 -0
  240. package/packages/pi-ai/src/providers/openai-completions.ts +57 -16
  241. package/packages/pi-ai/src/providers/simple-options.ts +17 -1
  242. package/packages/pi-ai/src/providers/think-tag-parser.test.ts +44 -0
  243. package/packages/pi-ai/src/providers/think-tag-parser.ts +94 -0
  244. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +200 -23
  245. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +12 -2
  246. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +84 -0
  247. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +15 -5
  248. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +84 -0
  249. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +16 -5
  250. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +363 -0
  251. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  252. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +3 -2
  253. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
  255. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/agent-session.js +32 -2
  257. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  259. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  260. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  262. package/packages/pi-coding-agent/dist/core/extensions/loader.js +4 -0
  263. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  264. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +35 -2
  265. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/extensions/runner.js +233 -0
  267. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +205 -2
  269. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts +53 -0
  272. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts.map +1 -0
  273. package/packages/pi-coding-agent/dist/core/hooks-runner.js +337 -0
  274. package/packages/pi-coding-agent/dist/core/hooks-runner.js.map +1 -0
  275. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts +2 -0
  276. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts.map +1 -0
  277. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +234 -0
  278. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -0
  279. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  280. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  282. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts +3 -1
  284. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/model-discovery.js +92 -12
  286. package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/model-discovery.test.js +16 -1
  288. package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts +2 -0
  290. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts.map +1 -0
  291. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js +40 -0
  292. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js.map +1 -0
  293. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
  294. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
  295. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
  296. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js.map +1 -0
  297. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js +61 -1
  298. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +5 -0
  300. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/model-registry.js +90 -10
  302. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/redact-secrets.d.ts +2 -0
  304. package/packages/pi-coding-agent/dist/core/redact-secrets.d.ts.map +1 -0
  305. package/packages/pi-coding-agent/dist/core/redact-secrets.js +49 -0
  306. package/packages/pi-coding-agent/dist/core/redact-secrets.js.map +1 -0
  307. package/packages/pi-coding-agent/dist/core/redact-secrets.test.d.ts +2 -0
  308. package/packages/pi-coding-agent/dist/core/redact-secrets.test.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/redact-secrets.test.js +67 -0
  310. package/packages/pi-coding-agent/dist/core/redact-secrets.test.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/session-manager.js +10 -6
  313. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/session-manager.test.js +45 -1
  315. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +55 -0
  317. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  320. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  321. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +1 -1
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +5 -4
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +13 -7
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts +7 -6
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +29 -21
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  336. package/packages/pi-coding-agent/package.json +1 -1
  337. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +3 -2
  338. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -2
  339. package/packages/pi-coding-agent/src/core/extensions/index.ts +16 -0
  340. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  341. package/packages/pi-coding-agent/src/core/extensions/runner.ts +351 -0
  342. package/packages/pi-coding-agent/src/core/extensions/types.ts +258 -0
  343. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +269 -0
  344. package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
  345. package/packages/pi-coding-agent/src/core/index.ts +10 -0
  346. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +19 -0
  347. package/packages/pi-coding-agent/src/core/model-discovery.ts +99 -12
  348. package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
  349. package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
  350. package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +75 -0
  351. package/packages/pi-coding-agent/src/core/model-registry.ts +102 -10
  352. package/packages/pi-coding-agent/src/core/redact-secrets.test.ts +86 -0
  353. package/packages/pi-coding-agent/src/core/redact-secrets.ts +58 -0
  354. package/packages/pi-coding-agent/src/core/session-manager.test.ts +65 -1
  355. package/packages/pi-coding-agent/src/core/session-manager.ts +10 -6
  356. package/packages/pi-coding-agent/src/core/settings-manager.ts +57 -0
  357. package/packages/pi-coding-agent/src/index.ts +16 -0
  358. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +6 -6
  359. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +16 -7
  360. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +36 -22
  361. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -1
  362. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  363. package/packages/pi-tui/package.json +1 -1
  364. package/packages/rpc-client/package.json +1 -1
  365. package/pkg/package.json +1 -1
  366. package/scripts/link-workspace-packages.cjs +1 -0
  367. package/src/resources/agents/researcher.md +1 -1
  368. package/src/resources/extensions/claude-code-cli/readiness.ts +32 -8
  369. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +78 -17
  370. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +149 -5
  371. package/src/resources/extensions/gsd/auto/loop-deps.ts +14 -0
  372. package/src/resources/extensions/gsd/auto/loop.ts +9 -0
  373. package/src/resources/extensions/gsd/auto/phases.ts +131 -10
  374. package/src/resources/extensions/gsd/auto/run-unit.ts +40 -2
  375. package/src/resources/extensions/gsd/auto/session.ts +35 -2
  376. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -3
  377. package/src/resources/extensions/gsd/auto-model-selection.ts +71 -15
  378. package/src/resources/extensions/gsd/auto-post-unit.ts +29 -3
  379. package/src/resources/extensions/gsd/auto-prompts.ts +28 -1
  380. package/src/resources/extensions/gsd/auto-recovery.ts +26 -1
  381. package/src/resources/extensions/gsd/auto-start.ts +60 -68
  382. package/src/resources/extensions/gsd/auto-verification.ts +33 -0
  383. package/src/resources/extensions/gsd/auto-worktree.ts +62 -63
  384. package/src/resources/extensions/gsd/auto.ts +73 -28
  385. package/src/resources/extensions/gsd/blocked-models.ts +98 -0
  386. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -1
  387. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +40 -9
  388. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +109 -0
  389. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +5 -0
  390. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -0
  391. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +54 -6
  392. package/src/resources/extensions/gsd/bootstrap/system-context.ts +89 -26
  393. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +35 -2
  394. package/src/resources/extensions/gsd/clean-root-preflight.ts +111 -0
  395. package/src/resources/extensions/gsd/commands-extract-learnings.ts +55 -90
  396. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
  397. package/src/resources/extensions/gsd/compaction-snapshot.ts +165 -0
  398. package/src/resources/extensions/gsd/complexity-classifier.ts +5 -3
  399. package/src/resources/extensions/gsd/db-writer.ts +88 -17
  400. package/src/resources/extensions/gsd/doctor-git-checks.ts +23 -27
  401. package/src/resources/extensions/gsd/doctor-providers.ts +59 -6
  402. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +2 -0
  403. package/src/resources/extensions/gsd/error-classifier.ts +36 -3
  404. package/src/resources/extensions/gsd/exec-history.ts +153 -0
  405. package/src/resources/extensions/gsd/exec-sandbox.ts +326 -0
  406. package/src/resources/extensions/gsd/gitignore.ts +1 -1
  407. package/src/resources/extensions/gsd/gsd-db.ts +186 -23
  408. package/src/resources/extensions/gsd/guided-flow.ts +222 -1
  409. package/src/resources/extensions/gsd/health-widget.ts +3 -1
  410. package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
  411. package/src/resources/extensions/gsd/init-wizard.ts +15 -1
  412. package/src/resources/extensions/gsd/journal.ts +2 -1
  413. package/src/resources/extensions/gsd/key-manager.ts +28 -0
  414. package/src/resources/extensions/gsd/memory-backfill.ts +140 -0
  415. package/src/resources/extensions/gsd/memory-store.ts +26 -0
  416. package/src/resources/extensions/gsd/model-router.ts +42 -1
  417. package/src/resources/extensions/gsd/pre-execution-checks.ts +46 -10
  418. package/src/resources/extensions/gsd/preferences-types.ts +46 -0
  419. package/src/resources/extensions/gsd/preferences-validation.ts +79 -0
  420. package/src/resources/extensions/gsd/preferences.ts +17 -17
  421. package/src/resources/extensions/gsd/prompt-loader.ts +30 -7
  422. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  423. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  424. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  425. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -0
  426. package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
  427. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  428. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  429. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  430. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -0
  431. package/src/resources/extensions/gsd/safety/evidence-collector.ts +119 -0
  432. package/src/resources/extensions/gsd/safety/file-change-validator.ts +17 -4
  433. package/src/resources/extensions/gsd/safety/safety-harness.ts +9 -0
  434. package/src/resources/extensions/gsd/state.ts +45 -4
  435. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +188 -2
  436. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +95 -1
  437. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +12 -0
  438. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +49 -0
  439. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +141 -0
  440. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +33 -3
  441. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +38 -0
  442. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +23 -0
  443. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +98 -0
  444. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +54 -0
  445. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +186 -0
  446. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +68 -66
  447. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +123 -0
  448. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +61 -1
  449. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  450. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  451. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +3 -3
  452. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  453. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +42 -0
  454. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -4
  455. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +148 -3
  456. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +1 -1
  457. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +306 -1
  458. package/src/resources/extensions/gsd/tests/escalation.test.ts +1 -1
  459. package/src/resources/extensions/gsd/tests/exec-history.test.ts +237 -0
  460. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +210 -0
  461. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +58 -0
  462. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +40 -9
  463. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +62 -0
  464. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +447 -1
  465. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +27 -0
  466. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +11 -0
  467. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +78 -0
  468. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +1 -0
  469. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +1 -0
  470. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +30 -0
  471. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -1
  472. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +1 -1
  473. package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
  474. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +37 -0
  475. package/src/resources/extensions/gsd/tests/key-manager.test.ts +9 -0
  476. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
  477. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  478. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +12 -0
  479. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  480. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +19 -0
  481. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
  482. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +14 -0
  483. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +272 -0
  484. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +356 -0
  485. package/src/resources/extensions/gsd/tests/preferences.test.ts +110 -0
  486. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +44 -0
  487. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +49 -0
  488. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +103 -4
  489. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +388 -0
  490. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +9 -3
  491. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +230 -0
  492. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +205 -0
  493. package/src/resources/extensions/gsd/tests/save-gate-result-render.test.ts +95 -0
  494. package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
  495. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +32 -40
  496. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +56 -0
  497. package/src/resources/extensions/gsd/tests/token-counter.test.ts +105 -1
  498. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
  499. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +23 -0
  500. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -3
  501. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
  502. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +35 -0
  503. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +6 -1
  504. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -5
  505. package/src/resources/extensions/gsd/tests/write-gate.test.ts +64 -0
  506. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +3 -1
  507. package/src/resources/extensions/gsd/token-counter.ts +22 -5
  508. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  509. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +81 -0
  510. package/src/resources/extensions/gsd/tools/exec-tool.ts +183 -0
  511. package/src/resources/extensions/gsd/tools/memory-tools.ts +31 -1
  512. package/src/resources/extensions/gsd/tools/resume-tool.ts +40 -0
  513. package/src/resources/extensions/gsd/uok/plan-v2.ts +26 -3
  514. package/src/resources/extensions/gsd/workflow-logger.ts +4 -1
  515. package/src/resources/extensions/gsd/workflow-mcp.ts +3 -0
  516. package/src/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  517. package/src/resources/extensions/gsd/worktree-resolver.ts +54 -9
  518. package/src/resources/extensions/search-the-web/command-search-provider.ts +5 -4
  519. package/src/resources/extensions/search-the-web/native-search.ts +48 -12
  520. package/src/resources/skills/api-design/SKILL.md +190 -0
  521. package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
  522. package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
  523. package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
  524. package/src/resources/skills/design-an-interface/SKILL.md +102 -0
  525. package/src/resources/skills/forensics/SKILL.md +153 -0
  526. package/src/resources/skills/grill-me/SKILL.md +93 -0
  527. package/src/resources/skills/handoff/SKILL.md +121 -0
  528. package/src/resources/skills/observability/SKILL.md +174 -0
  529. package/src/resources/skills/security-review/SKILL.md +181 -0
  530. package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
  531. package/src/resources/skills/tdd/SKILL.md +112 -0
  532. package/src/resources/skills/verify-before-complete/SKILL.md +98 -0
  533. package/src/resources/skills/write-docs/SKILL.md +82 -0
  534. package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
  535. /package/dist/web/standalone/.next/static/{ssX7BLv3Dw9Fb4CtrCGeR → pV-mPo7rYGb5JBC09C8GG}/_buildManifest.js +0 -0
  536. /package/dist/web/standalone/.next/static/{ssX7BLv3Dw9Fb4CtrCGeR → pV-mPo7rYGb5JBC09C8GG}/_ssgManifest.js +0 -0
@@ -15,7 +15,7 @@
15
15
  import test from "node:test";
16
16
  import assert from "node:assert/strict";
17
17
  import { mkdtempSync, mkdirSync, writeFileSync, rmSync, realpathSync, chmodSync } from "node:fs";
18
- import { join } from "node:path";
18
+ import { delimiter, join } from "node:path";
19
19
  import { tmpdir } from "node:os";
20
20
 
21
21
  import {
@@ -327,6 +327,88 @@ test("runProviderChecks ignores empty placeholder keys in auth.json", () => {
327
327
  rmSync(tmpHome, { recursive: true, force: true });
328
328
  });
329
329
 
330
+ test("runProviderChecks detects custom provider keys from models.json", () => {
331
+ const tmpHome = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-custom-home-")));
332
+ const repo = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-custom-repo-")));
333
+ const agentDir = join(tmpHome, ".gsd", "agent");
334
+ mkdirSync(agentDir, { recursive: true });
335
+ mkdirSync(join(repo, ".gsd"), { recursive: true });
336
+
337
+ writeFileSync(
338
+ join(repo, ".gsd", "PREFERENCES.md"),
339
+ [
340
+ "---",
341
+ "models:",
342
+ " execution:",
343
+ " model: custom-model",
344
+ " provider: custom-provider",
345
+ "---",
346
+ "",
347
+ ].join("\n"),
348
+ );
349
+ writeFileSync(join(agentDir, "models.json"), JSON.stringify({
350
+ providers: {
351
+ "custom-provider": {
352
+ api: "openai-completions",
353
+ apiKey: "x",
354
+ baseUrl: "https://example.invalid/v1",
355
+ models: [{ id: "custom-model", name: "Custom Model" }],
356
+ },
357
+ },
358
+ }));
359
+
360
+ withEnv({
361
+ HOME: tmpHome,
362
+ CUSTOM_PROVIDER_API_KEY: undefined,
363
+ PATH: tmpHome,
364
+ }, () => {
365
+ withCwd(repo, () => {
366
+ const results = runProviderChecks();
367
+ const custom = results.find(r => r.name === "custom-provider");
368
+ assert.ok(custom, "custom provider result should exist");
369
+ assert.equal(custom!.status, "ok", "models.json apiKey should satisfy custom provider auth");
370
+ assert.ok(custom!.message.includes("models.json"), "should report models.json source");
371
+ assert.equal(summariseProviderIssues(results), null, "custom models.json key should not raise dashboard warning");
372
+ });
373
+ });
374
+
375
+ rmSync(repo, { recursive: true, force: true });
376
+ rmSync(tmpHome, { recursive: true, force: true });
377
+ });
378
+
379
+ test("runProviderChecks reports missing custom provider key without models.json apiKey", () => {
380
+ const tmpHome = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-custom-missing-home-")));
381
+ const repo = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-custom-missing-repo-")));
382
+ mkdirSync(join(repo, ".gsd"), { recursive: true });
383
+
384
+ writeFileSync(
385
+ join(repo, ".gsd", "PREFERENCES.md"),
386
+ [
387
+ "---",
388
+ "models:",
389
+ " execution: custom-provider/custom-model",
390
+ "---",
391
+ "",
392
+ ].join("\n"),
393
+ );
394
+
395
+ withEnv({
396
+ HOME: tmpHome,
397
+ CUSTOM_PROVIDER_API_KEY: undefined,
398
+ PATH: tmpHome,
399
+ }, () => {
400
+ withCwd(repo, () => {
401
+ const results = runProviderChecks();
402
+ const custom = results.find(r => r.name === "custom-provider");
403
+ assert.ok(custom, "provider-qualified custom model should be checked");
404
+ assert.equal(custom!.status, "error", "missing custom provider key should still be reported");
405
+ });
406
+ });
407
+
408
+ rmSync(repo, { recursive: true, force: true });
409
+ rmSync(tmpHome, { recursive: true, force: true });
410
+ });
411
+
330
412
  // ─── runProviderChecks — cross-provider routing ──────────────────────────────
331
413
 
332
414
  test("runProviderChecks reports ok for Anthropic when GitHub Copilot env var is set", () => {
@@ -517,7 +599,7 @@ test("runProviderChecks reports ok for Google via google-gemini-cli auth.json (#
517
599
 
518
600
  // google-gemini-cli OAuth in auth.json (no google API key)
519
601
  const authData = {
520
- "google-gemini-cli": { type: "oauth", apiKey: "ya29.gemini-cli-token", expires: Date.now() + 3_600_000 },
602
+ "google-gemini-cli": { type: "oauth", expires: Date.now() + 3_600_000 },
521
603
  };
522
604
  writeFileSync(join(agentDir, "auth.json"), JSON.stringify(authData));
523
605
 
@@ -640,7 +722,7 @@ test("runProviderChecks reports ok for Anthropic via claude-code binary in PATH"
640
722
  COPILOT_GITHUB_TOKEN: undefined,
641
723
  GH_TOKEN: undefined,
642
724
  GITHUB_TOKEN: undefined,
643
- PATH: `${binDir}:${process.env.PATH ?? ""}`,
725
+ PATH: `${binDir}${delimiter}${process.env.PATH ?? ""}`,
644
726
  }, () => {
645
727
  try {
646
728
  const results = runProviderChecks();
@@ -654,6 +736,69 @@ test("runProviderChecks reports ok for Anthropic via claude-code binary in PATH"
654
736
  });
655
737
  });
656
738
 
739
+ test("runProviderChecks detects claude.cmd in PATH on Windows (#4503)", { skip: process.platform !== "win32" }, () => {
740
+ const tmpHome = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-cc-win-route-home-")));
741
+ const binDir = join(tmpHome, "bin");
742
+ mkdirSync(binDir, { recursive: true });
743
+
744
+ // On Windows, users commonly install Claude via a .cmd shim.
745
+ const fakeClaudeCmd = join(binDir, "claude.cmd");
746
+ writeFileSync(fakeClaudeCmd, "@echo off\r\necho mock\r\n");
747
+
748
+ withEnv({
749
+ HOME: tmpHome,
750
+ ANTHROPIC_API_KEY: undefined,
751
+ ANTHROPIC_OAUTH_TOKEN: undefined,
752
+ COPILOT_GITHUB_TOKEN: undefined,
753
+ GH_TOKEN: undefined,
754
+ GITHUB_TOKEN: undefined,
755
+ // Explicitly use ';' to mirror Windows PATH entries.
756
+ PATH: `${binDir};${process.env.PATH ?? ""}`,
757
+ PATHEXT: ".COM;.EXE;.BAT;.CMD",
758
+ }, () => {
759
+ try {
760
+ const results = runProviderChecks();
761
+ const anthropic = results.find(r => r.name === "anthropic");
762
+ assert.ok(anthropic, "anthropic result should exist");
763
+ assert.equal(anthropic!.status, "ok", "should be ok when claude.cmd is in PATH");
764
+ assert.ok(anthropic!.message.toLowerCase().includes("claude"), "should mention claude-code as source");
765
+ } finally {
766
+ rmSync(tmpHome, { recursive: true, force: true });
767
+ }
768
+ });
769
+ });
770
+
771
+ test("runProviderChecks detects claude.exe in PATH on Windows (#4548)", { skip: process.platform !== "win32" }, () => {
772
+ const tmpHome = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-cc-exe-home-")));
773
+ const binDir = join(tmpHome, "bin");
774
+ mkdirSync(binDir, { recursive: true });
775
+
776
+ // Some Windows installs ship a direct claude.exe binary (not a .cmd shim).
777
+ const fakeClaudeExe = join(binDir, "claude.exe");
778
+ writeFileSync(fakeClaudeExe, "");
779
+
780
+ withEnv({
781
+ HOME: tmpHome,
782
+ ANTHROPIC_API_KEY: undefined,
783
+ ANTHROPIC_OAUTH_TOKEN: undefined,
784
+ COPILOT_GITHUB_TOKEN: undefined,
785
+ GH_TOKEN: undefined,
786
+ GITHUB_TOKEN: undefined,
787
+ PATH: `${binDir};${process.env.PATH ?? ""}`,
788
+ PATHEXT: ".COM;.EXE;.BAT;.CMD",
789
+ }, () => {
790
+ try {
791
+ const results = runProviderChecks();
792
+ const anthropic = results.find(r => r.name === "anthropic");
793
+ assert.ok(anthropic, "anthropic result should exist");
794
+ assert.equal(anthropic!.status, "ok", "should be ok when claude.exe is in PATH (#4548)");
795
+ assert.ok(anthropic!.message.toLowerCase().includes("claude"), "should mention claude-code as source");
796
+ } finally {
797
+ rmSync(tmpHome, { recursive: true, force: true });
798
+ }
799
+ });
800
+ });
801
+
657
802
  test("PROVIDER_ROUTES includes google-gemini-cli as route for google (#2922)", async () => {
658
803
  const { readFileSync: readFS } = await import("node:fs");
659
804
  const { dirname: dirn, join: joinPath } = await import("node:path");
@@ -42,7 +42,7 @@ describe("double mergeAndExit guard (#2645)", () => {
42
42
  const allCompleteIdx = phasesSrc.indexOf("incomplete.length === 0");
43
43
  assert.ok(allCompleteIdx > 0, "phases.ts should have an all-milestones-complete check");
44
44
 
45
- const afterAllComplete = phasesSrc.slice(allCompleteIdx, allCompleteIdx + 600);
45
+ const afterAllComplete = phasesSrc.slice(allCompleteIdx, allCompleteIdx + 800);
46
46
  const mergeIdx = afterAllComplete.indexOf("deps.resolver.mergeAndExit");
47
47
  const flagIdx = afterAllComplete.indexOf("s.milestoneMergedInPhases = true");
48
48
 
@@ -10,7 +10,10 @@ import assert from 'node:assert/strict';
10
10
  import * as path from 'node:path';
11
11
  import * as os from 'node:os';
12
12
  import * as fs from 'node:fs';
13
- import { closeDatabase, isDbAvailable, getDecisionById } from '../gsd-db.ts';
13
+ import { createRequire } from 'node:module';
14
+ import { closeDatabase, isDbAvailable, getDecisionById, _getAdapter } from '../gsd-db.ts';
15
+
16
+ const _require = createRequire(import.meta.url);
14
17
 
15
18
  function makeTmpDir(): string {
16
19
  const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-ensure-db-'));
@@ -23,6 +26,263 @@ function cleanupDir(dir: string): void {
23
26
  } catch { /* swallow */ }
24
27
  }
25
28
 
29
+ function createLegacyV15Db(dbPath: string): void {
30
+ const sqlite = _require('node:sqlite');
31
+ const db = new sqlite.DatabaseSync(dbPath);
32
+ db.exec('PRAGMA journal_mode=WAL');
33
+ db.exec(`
34
+ CREATE TABLE schema_version (
35
+ version INTEGER NOT NULL,
36
+ applied_at TEXT NOT NULL
37
+ );
38
+ INSERT INTO schema_version (version, applied_at) VALUES (15, '2026-01-01T00:00:00.000Z');
39
+
40
+ CREATE TABLE decisions (
41
+ seq INTEGER PRIMARY KEY AUTOINCREMENT,
42
+ id TEXT NOT NULL UNIQUE,
43
+ when_context TEXT NOT NULL DEFAULT '',
44
+ scope TEXT NOT NULL DEFAULT '',
45
+ decision TEXT NOT NULL DEFAULT '',
46
+ choice TEXT NOT NULL DEFAULT '',
47
+ rationale TEXT NOT NULL DEFAULT '',
48
+ revisable TEXT NOT NULL DEFAULT '',
49
+ made_by TEXT NOT NULL DEFAULT 'agent',
50
+ superseded_by TEXT DEFAULT NULL
51
+ );
52
+
53
+ CREATE TABLE requirements (
54
+ id TEXT PRIMARY KEY,
55
+ class TEXT NOT NULL DEFAULT '',
56
+ status TEXT NOT NULL DEFAULT '',
57
+ description TEXT NOT NULL DEFAULT '',
58
+ why TEXT NOT NULL DEFAULT '',
59
+ source TEXT NOT NULL DEFAULT '',
60
+ primary_owner TEXT NOT NULL DEFAULT '',
61
+ supporting_slices TEXT NOT NULL DEFAULT '',
62
+ validation TEXT NOT NULL DEFAULT '',
63
+ notes TEXT NOT NULL DEFAULT '',
64
+ full_content TEXT NOT NULL DEFAULT '',
65
+ superseded_by TEXT DEFAULT NULL
66
+ );
67
+
68
+ CREATE TABLE artifacts (
69
+ path TEXT PRIMARY KEY,
70
+ artifact_type TEXT NOT NULL DEFAULT '',
71
+ milestone_id TEXT DEFAULT NULL,
72
+ slice_id TEXT DEFAULT NULL,
73
+ task_id TEXT DEFAULT NULL,
74
+ full_content TEXT NOT NULL DEFAULT '',
75
+ imported_at TEXT NOT NULL DEFAULT ''
76
+ );
77
+
78
+ CREATE TABLE memories (
79
+ seq INTEGER PRIMARY KEY AUTOINCREMENT,
80
+ id TEXT NOT NULL UNIQUE,
81
+ category TEXT NOT NULL,
82
+ content TEXT NOT NULL,
83
+ confidence REAL NOT NULL DEFAULT 0.8,
84
+ source_unit_type TEXT,
85
+ source_unit_id TEXT,
86
+ created_at TEXT NOT NULL,
87
+ updated_at TEXT NOT NULL,
88
+ superseded_by TEXT DEFAULT NULL,
89
+ hit_count INTEGER NOT NULL DEFAULT 0
90
+ );
91
+
92
+ CREATE TABLE memory_processed_units (
93
+ unit_key TEXT PRIMARY KEY,
94
+ activity_file TEXT,
95
+ processed_at TEXT NOT NULL
96
+ );
97
+
98
+ CREATE TABLE milestones (
99
+ id TEXT PRIMARY KEY,
100
+ title TEXT NOT NULL DEFAULT '',
101
+ status TEXT NOT NULL DEFAULT 'active',
102
+ depends_on TEXT NOT NULL DEFAULT '[]',
103
+ created_at TEXT NOT NULL DEFAULT '',
104
+ completed_at TEXT DEFAULT NULL,
105
+ vision TEXT NOT NULL DEFAULT '',
106
+ success_criteria TEXT NOT NULL DEFAULT '[]',
107
+ key_risks TEXT NOT NULL DEFAULT '[]',
108
+ proof_strategy TEXT NOT NULL DEFAULT '[]',
109
+ verification_contract TEXT NOT NULL DEFAULT '',
110
+ verification_integration TEXT NOT NULL DEFAULT '',
111
+ verification_operational TEXT NOT NULL DEFAULT '',
112
+ verification_uat TEXT NOT NULL DEFAULT '',
113
+ definition_of_done TEXT NOT NULL DEFAULT '[]',
114
+ requirement_coverage TEXT NOT NULL DEFAULT '',
115
+ boundary_map_markdown TEXT NOT NULL DEFAULT ''
116
+ );
117
+
118
+ CREATE TABLE slices (
119
+ milestone_id TEXT NOT NULL,
120
+ id TEXT NOT NULL,
121
+ title TEXT NOT NULL DEFAULT '',
122
+ status TEXT NOT NULL DEFAULT 'pending',
123
+ risk TEXT NOT NULL DEFAULT 'medium',
124
+ depends TEXT NOT NULL DEFAULT '[]',
125
+ demo TEXT NOT NULL DEFAULT '',
126
+ created_at TEXT NOT NULL DEFAULT '',
127
+ completed_at TEXT DEFAULT NULL,
128
+ full_summary_md TEXT NOT NULL DEFAULT '',
129
+ full_uat_md TEXT NOT NULL DEFAULT '',
130
+ goal TEXT NOT NULL DEFAULT '',
131
+ success_criteria TEXT NOT NULL DEFAULT '',
132
+ proof_level TEXT NOT NULL DEFAULT '',
133
+ integration_closure TEXT NOT NULL DEFAULT '',
134
+ observability_impact TEXT NOT NULL DEFAULT '',
135
+ sequence INTEGER DEFAULT 0,
136
+ replan_triggered_at TEXT DEFAULT NULL,
137
+ PRIMARY KEY (milestone_id, id)
138
+ );
139
+
140
+ CREATE TABLE tasks (
141
+ milestone_id TEXT NOT NULL,
142
+ slice_id TEXT NOT NULL,
143
+ id TEXT NOT NULL,
144
+ title TEXT NOT NULL DEFAULT '',
145
+ status TEXT NOT NULL DEFAULT 'pending',
146
+ one_liner TEXT NOT NULL DEFAULT '',
147
+ narrative TEXT NOT NULL DEFAULT '',
148
+ verification_result TEXT NOT NULL DEFAULT '',
149
+ duration TEXT NOT NULL DEFAULT '',
150
+ completed_at TEXT DEFAULT NULL,
151
+ blocker_discovered INTEGER DEFAULT 0,
152
+ deviations TEXT NOT NULL DEFAULT '',
153
+ known_issues TEXT NOT NULL DEFAULT '',
154
+ key_files TEXT NOT NULL DEFAULT '[]',
155
+ key_decisions TEXT NOT NULL DEFAULT '[]',
156
+ full_summary_md TEXT NOT NULL DEFAULT '',
157
+ description TEXT NOT NULL DEFAULT '',
158
+ estimate TEXT NOT NULL DEFAULT '',
159
+ files TEXT NOT NULL DEFAULT '[]',
160
+ verify TEXT NOT NULL DEFAULT '',
161
+ inputs TEXT NOT NULL DEFAULT '[]',
162
+ expected_output TEXT NOT NULL DEFAULT '[]',
163
+ observability_impact TEXT NOT NULL DEFAULT '',
164
+ full_plan_md TEXT NOT NULL DEFAULT '',
165
+ sequence INTEGER DEFAULT 0,
166
+ PRIMARY KEY (milestone_id, slice_id, id)
167
+ );
168
+
169
+ CREATE TABLE verification_evidence (
170
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
171
+ task_id TEXT NOT NULL DEFAULT '',
172
+ slice_id TEXT NOT NULL DEFAULT '',
173
+ milestone_id TEXT NOT NULL DEFAULT '',
174
+ command TEXT NOT NULL DEFAULT '',
175
+ exit_code INTEGER DEFAULT 0,
176
+ verdict TEXT NOT NULL DEFAULT '',
177
+ duration_ms INTEGER DEFAULT 0,
178
+ created_at TEXT NOT NULL DEFAULT ''
179
+ );
180
+
181
+ CREATE TABLE replan_history (
182
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
183
+ milestone_id TEXT NOT NULL DEFAULT '',
184
+ slice_id TEXT DEFAULT NULL,
185
+ task_id TEXT DEFAULT NULL,
186
+ summary TEXT NOT NULL DEFAULT '',
187
+ previous_artifact_path TEXT DEFAULT NULL,
188
+ replacement_artifact_path TEXT DEFAULT NULL,
189
+ created_at TEXT NOT NULL DEFAULT ''
190
+ );
191
+
192
+ CREATE TABLE assessments (
193
+ path TEXT PRIMARY KEY,
194
+ milestone_id TEXT NOT NULL DEFAULT '',
195
+ slice_id TEXT DEFAULT NULL,
196
+ task_id TEXT DEFAULT NULL,
197
+ status TEXT NOT NULL DEFAULT '',
198
+ scope TEXT NOT NULL DEFAULT '',
199
+ full_content TEXT NOT NULL DEFAULT '',
200
+ created_at TEXT NOT NULL DEFAULT ''
201
+ );
202
+
203
+ CREATE TABLE quality_gates (
204
+ milestone_id TEXT NOT NULL,
205
+ slice_id TEXT NOT NULL,
206
+ gate_id TEXT NOT NULL,
207
+ scope TEXT NOT NULL DEFAULT 'slice',
208
+ task_id TEXT NOT NULL DEFAULT '',
209
+ status TEXT NOT NULL DEFAULT 'pending',
210
+ verdict TEXT NOT NULL DEFAULT '',
211
+ rationale TEXT NOT NULL DEFAULT '',
212
+ findings TEXT NOT NULL DEFAULT '',
213
+ evaluated_at TEXT DEFAULT NULL,
214
+ PRIMARY KEY (milestone_id, slice_id, gate_id, task_id)
215
+ );
216
+
217
+ CREATE TABLE slice_dependencies (
218
+ milestone_id TEXT NOT NULL,
219
+ slice_id TEXT NOT NULL,
220
+ depends_on_slice_id TEXT NOT NULL,
221
+ PRIMARY KEY (milestone_id, slice_id, depends_on_slice_id)
222
+ );
223
+
224
+ CREATE TABLE gate_runs (
225
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
226
+ trace_id TEXT NOT NULL,
227
+ turn_id TEXT NOT NULL,
228
+ gate_id TEXT NOT NULL,
229
+ gate_type TEXT NOT NULL DEFAULT '',
230
+ unit_type TEXT DEFAULT NULL,
231
+ unit_id TEXT DEFAULT NULL,
232
+ milestone_id TEXT DEFAULT NULL,
233
+ slice_id TEXT DEFAULT NULL,
234
+ task_id TEXT DEFAULT NULL,
235
+ outcome TEXT NOT NULL DEFAULT 'pass',
236
+ failure_class TEXT NOT NULL DEFAULT 'none',
237
+ rationale TEXT NOT NULL DEFAULT '',
238
+ findings TEXT NOT NULL DEFAULT '',
239
+ attempt INTEGER NOT NULL DEFAULT 1,
240
+ max_attempts INTEGER NOT NULL DEFAULT 1,
241
+ retryable INTEGER NOT NULL DEFAULT 0,
242
+ evaluated_at TEXT NOT NULL DEFAULT ''
243
+ );
244
+
245
+ CREATE TABLE turn_git_transactions (
246
+ trace_id TEXT NOT NULL,
247
+ turn_id TEXT NOT NULL,
248
+ unit_type TEXT DEFAULT NULL,
249
+ unit_id TEXT DEFAULT NULL,
250
+ stage TEXT NOT NULL DEFAULT 'turn-start',
251
+ action TEXT NOT NULL DEFAULT 'status-only',
252
+ push INTEGER NOT NULL DEFAULT 0,
253
+ status TEXT NOT NULL DEFAULT 'ok',
254
+ error TEXT DEFAULT NULL,
255
+ metadata_json TEXT NOT NULL DEFAULT '{}',
256
+ updated_at TEXT NOT NULL DEFAULT '',
257
+ PRIMARY KEY (trace_id, turn_id, stage)
258
+ );
259
+
260
+ CREATE TABLE audit_events (
261
+ event_id TEXT PRIMARY KEY,
262
+ trace_id TEXT NOT NULL,
263
+ turn_id TEXT DEFAULT NULL,
264
+ caused_by TEXT DEFAULT NULL,
265
+ category TEXT NOT NULL,
266
+ type TEXT NOT NULL,
267
+ ts TEXT NOT NULL,
268
+ payload_json TEXT NOT NULL DEFAULT '{}'
269
+ );
270
+
271
+ CREATE TABLE audit_turn_index (
272
+ trace_id TEXT NOT NULL,
273
+ turn_id TEXT NOT NULL,
274
+ first_ts TEXT NOT NULL,
275
+ last_ts TEXT NOT NULL,
276
+ event_count INTEGER NOT NULL DEFAULT 0,
277
+ PRIMARY KEY (trace_id, turn_id)
278
+ );
279
+ `);
280
+ db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
281
+ db.close();
282
+ try { fs.unlinkSync(`${dbPath}-wal`); } catch { /* may not exist */ }
283
+ try { fs.unlinkSync(`${dbPath}-shm`); } catch { /* may not exist */ }
284
+ }
285
+
26
286
  // ═══════════════════════════════════════════════════════════════════════════
27
287
  // ensureDbOpen creates DB + migrates when .gsd/ has Markdown
28
288
  // ═══════════════════════════════════════════════════════════════════════════
@@ -107,6 +367,51 @@ describe('ensure-db-open', () => {
107
367
  }
108
368
  });
109
369
 
370
+ test('ensureDbOpen: migrates legacy v15 DB before bootstrap indexes touch new columns', async () => {
371
+ const tmpDir = makeTmpDir();
372
+ const gsdDir = path.join(tmpDir, '.gsd');
373
+ fs.mkdirSync(gsdDir, { recursive: true });
374
+ const dbPath = path.join(gsdDir, 'gsd.db');
375
+ createLegacyV15Db(dbPath);
376
+
377
+ try {
378
+ closeDatabase();
379
+ } catch { /* ok */ }
380
+
381
+ try {
382
+ const { ensureDbOpen } = await import('../bootstrap/dynamic-tools.ts');
383
+ const result = await ensureDbOpen(tmpDir);
384
+
385
+ assert.equal(result, true, 'legacy v15 DB should open and migrate');
386
+ assert.ok(isDbAvailable(), 'DB should be available after migrating v15');
387
+
388
+ const db = _getAdapter();
389
+ assert.ok(db, 'adapter should be available after ensureDbOpen');
390
+ assert.equal(
391
+ db.prepare('SELECT MAX(version) as version FROM schema_version').get()?.version,
392
+ 22,
393
+ 'legacy DB should migrate to current schema version',
394
+ );
395
+
396
+ const memoryColumns = new Set(db.prepare('PRAGMA table_info(memories)').all().map((row) => row.name));
397
+ const taskColumns = new Set(db.prepare('PRAGMA table_info(tasks)').all().map((row) => row.name));
398
+ assert.ok(memoryColumns.has('scope'), 'memory scope column should be present');
399
+ assert.ok(memoryColumns.has('tags'), 'memory tags column should be present');
400
+ assert.ok(taskColumns.has('escalation_pending'), 'task escalation_pending column should be present');
401
+ assert.ok(
402
+ db.prepare("SELECT 1 as present FROM sqlite_master WHERE type = 'index' AND name = 'idx_memories_scope'").get(),
403
+ 'memory scope index should be created after migration-safe bootstrap',
404
+ );
405
+ assert.ok(
406
+ db.prepare("SELECT 1 as present FROM sqlite_master WHERE type = 'index' AND name = 'idx_tasks_escalation_pending'").get(),
407
+ 'task escalation index should be created after migration-safe bootstrap',
408
+ );
409
+ } finally {
410
+ closeDatabase();
411
+ cleanupDir(tmpDir);
412
+ }
413
+ });
414
+
110
415
  // ═══════════════════════════════════════════════════════════════════════════
111
416
  // ensureDbOpen returns false when no .gsd/ exists
112
417
  // ═══════════════════════════════════════════════════════════════════════════
@@ -348,7 +348,7 @@ test("ADR-011 P2: schema v20 fresh DB has all escalation columns on tasks + sour
348
348
  assert.ok(decCols.includes("source"), "decisions table must have source column");
349
349
 
350
350
  const version = adapter.prepare("SELECT MAX(version) as v FROM schema_version").get();
351
- assert.equal(version?.["v"], 20);
351
+ assert.equal(version?.["v"], 22);
352
352
  });
353
353
 
354
354
  test("ADR-011 P2: findUnappliedEscalationOverride returns null when escalation_pending=1 (still pending)", (t) => {