@opengsd/gsd-pi 1.0.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 (2880) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +96 -0
  3. package/package.json +171 -0
  4. package/packages/contracts/dist/index.d.ts +3 -0
  5. package/packages/contracts/dist/index.d.ts.map +1 -0
  6. package/packages/contracts/dist/index.js +5 -0
  7. package/packages/contracts/dist/index.js.map +1 -0
  8. package/packages/contracts/dist/rpc.d.ts +549 -0
  9. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  10. package/packages/contracts/dist/rpc.js +53 -0
  11. package/packages/contracts/dist/rpc.js.map +1 -0
  12. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  13. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  14. package/packages/contracts/dist/rpc.test.js +54 -0
  15. package/packages/contracts/dist/rpc.test.js.map +1 -0
  16. package/packages/contracts/dist/workflow.d.ts +201 -0
  17. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  18. package/packages/contracts/dist/workflow.js +225 -0
  19. package/packages/contracts/dist/workflow.js.map +1 -0
  20. package/packages/contracts/package.json +39 -0
  21. package/packages/contracts/src/index.ts +5 -0
  22. package/packages/contracts/src/rpc.test.ts +80 -0
  23. package/packages/contracts/src/rpc.ts +286 -0
  24. package/packages/contracts/src/workflow.ts +237 -0
  25. package/packages/contracts/tsconfig.json +25 -0
  26. package/packages/daemon/package.json +49 -0
  27. package/packages/daemon/src/channel-manager.ts +223 -0
  28. package/packages/daemon/src/cli.ts +96 -0
  29. package/packages/daemon/src/commands.ts +110 -0
  30. package/packages/daemon/src/config.ts +137 -0
  31. package/packages/daemon/src/daemon.test.ts +763 -0
  32. package/packages/daemon/src/daemon.ts +199 -0
  33. package/packages/daemon/src/discord-bot.test.ts +792 -0
  34. package/packages/daemon/src/discord-bot.ts +491 -0
  35. package/packages/daemon/src/event-bridge.test.ts +620 -0
  36. package/packages/daemon/src/event-bridge.ts +494 -0
  37. package/packages/daemon/src/event-formatter.test.ts +401 -0
  38. package/packages/daemon/src/event-formatter.ts +413 -0
  39. package/packages/daemon/src/index.ts +55 -0
  40. package/packages/daemon/src/launchd.test.ts +356 -0
  41. package/packages/daemon/src/launchd.ts +242 -0
  42. package/packages/daemon/src/logger.ts +89 -0
  43. package/packages/daemon/src/message-batcher.test.ts +308 -0
  44. package/packages/daemon/src/message-batcher.ts +216 -0
  45. package/packages/daemon/src/orchestrator.test.ts +584 -0
  46. package/packages/daemon/src/orchestrator.ts +469 -0
  47. package/packages/daemon/src/project-scanner.test.ts +235 -0
  48. package/packages/daemon/src/project-scanner.ts +99 -0
  49. package/packages/daemon/src/session-manager.test.ts +822 -0
  50. package/packages/daemon/src/session-manager.ts +400 -0
  51. package/packages/daemon/src/types.ts +184 -0
  52. package/packages/daemon/src/verbosity.test.ts +171 -0
  53. package/packages/daemon/src/verbosity.ts +101 -0
  54. package/packages/daemon/tsconfig.json +24 -0
  55. package/packages/mcp-server/README.md +275 -0
  56. package/packages/mcp-server/package.json +53 -0
  57. package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
  58. package/packages/mcp-server/src/alias-telemetry.ts +30 -0
  59. package/packages/mcp-server/src/cli.ts +70 -0
  60. package/packages/mcp-server/src/env-writer.test.ts +433 -0
  61. package/packages/mcp-server/src/env-writer.ts +292 -0
  62. package/packages/mcp-server/src/import-candidates.test.ts +53 -0
  63. package/packages/mcp-server/src/index.ts +43 -0
  64. package/packages/mcp-server/src/mcp-server.test.ts +1395 -0
  65. package/packages/mcp-server/src/parse-workflow-args.test.ts +80 -0
  66. package/packages/mcp-server/src/readers/captures.ts +119 -0
  67. package/packages/mcp-server/src/readers/doctor-lite.ts +225 -0
  68. package/packages/mcp-server/src/readers/graph.test.ts +679 -0
  69. package/packages/mcp-server/src/readers/graph.ts +863 -0
  70. package/packages/mcp-server/src/readers/index.ts +28 -0
  71. package/packages/mcp-server/src/readers/knowledge.ts +111 -0
  72. package/packages/mcp-server/src/readers/metrics.ts +118 -0
  73. package/packages/mcp-server/src/readers/paths.test.ts +67 -0
  74. package/packages/mcp-server/src/readers/paths.ts +334 -0
  75. package/packages/mcp-server/src/readers/readers.test.ts +513 -0
  76. package/packages/mcp-server/src/readers/roadmap.ts +263 -0
  77. package/packages/mcp-server/src/readers/state.ts +223 -0
  78. package/packages/mcp-server/src/remote-questions.test.ts +397 -0
  79. package/packages/mcp-server/src/remote-questions.ts +967 -0
  80. package/packages/mcp-server/src/secure-env-collect.test.ts +260 -0
  81. package/packages/mcp-server/src/server.ts +1342 -0
  82. package/packages/mcp-server/src/session-manager.ts +404 -0
  83. package/packages/mcp-server/src/tool-credentials.test.ts +95 -0
  84. package/packages/mcp-server/src/tool-credentials.ts +97 -0
  85. package/packages/mcp-server/src/types.ts +96 -0
  86. package/packages/mcp-server/src/workflow-tools-parity.test.ts +257 -0
  87. package/packages/mcp-server/src/workflow-tools.test.ts +2350 -0
  88. package/packages/mcp-server/src/workflow-tools.ts +2257 -0
  89. package/packages/mcp-server/tsconfig.json +25 -0
  90. package/packages/mcp-server/tsconfig.test.json +19 -0
  91. package/packages/native/dist/ast/index.d.ts +4 -0
  92. package/packages/native/dist/ast/index.js +11 -0
  93. package/packages/native/dist/ast/types.d.ts +69 -0
  94. package/packages/native/dist/ast/types.js +2 -0
  95. package/packages/native/dist/clipboard/index.d.ts +28 -0
  96. package/packages/native/dist/clipboard/index.js +38 -0
  97. package/packages/native/dist/clipboard/types.d.ts +7 -0
  98. package/packages/native/dist/clipboard/types.js +2 -0
  99. package/packages/native/dist/diff/index.d.ts +33 -0
  100. package/packages/native/dist/diff/index.js +43 -0
  101. package/packages/native/dist/diff/types.d.ts +23 -0
  102. package/packages/native/dist/diff/types.js +2 -0
  103. package/packages/native/dist/fd/index.d.ts +26 -0
  104. package/packages/native/dist/fd/index.js +30 -0
  105. package/packages/native/dist/fd/types.d.ts +29 -0
  106. package/packages/native/dist/fd/types.js +2 -0
  107. package/packages/native/dist/glob/index.d.ts +28 -0
  108. package/packages/native/dist/glob/index.js +35 -0
  109. package/packages/native/dist/glob/types.d.ts +50 -0
  110. package/packages/native/dist/glob/types.js +2 -0
  111. package/packages/native/dist/grep/index.d.ts +21 -0
  112. package/packages/native/dist/grep/index.js +28 -0
  113. package/packages/native/dist/grep/types.d.ts +99 -0
  114. package/packages/native/dist/grep/types.js +2 -0
  115. package/packages/native/dist/gsd-parser/index.d.ts +45 -0
  116. package/packages/native/dist/gsd-parser/index.js +61 -0
  117. package/packages/native/dist/gsd-parser/types.d.ts +55 -0
  118. package/packages/native/dist/gsd-parser/types.js +8 -0
  119. package/packages/native/dist/highlight/index.d.ts +28 -0
  120. package/packages/native/dist/highlight/index.js +38 -0
  121. package/packages/native/dist/highlight/types.d.ts +25 -0
  122. package/packages/native/dist/highlight/types.js +2 -0
  123. package/packages/native/dist/html/index.d.ts +15 -0
  124. package/packages/native/dist/html/index.js +19 -0
  125. package/packages/native/dist/html/types.d.ts +7 -0
  126. package/packages/native/dist/html/types.js +2 -0
  127. package/packages/native/dist/image/index.d.ts +15 -0
  128. package/packages/native/dist/image/index.js +23 -0
  129. package/packages/native/dist/image/types.d.ts +35 -0
  130. package/packages/native/dist/image/types.js +29 -0
  131. package/packages/native/dist/index.d.ts +46 -0
  132. package/packages/native/dist/index.js +85 -0
  133. package/packages/native/dist/json-parse/index.d.ts +23 -0
  134. package/packages/native/dist/json-parse/index.js +78 -0
  135. package/packages/native/dist/native.d.ts +57 -0
  136. package/packages/native/dist/native.js +113 -0
  137. package/packages/native/dist/ps/index.d.ts +38 -0
  138. package/packages/native/dist/ps/index.js +53 -0
  139. package/packages/native/dist/stream-process/index.d.ts +35 -0
  140. package/packages/native/dist/stream-process/index.js +254 -0
  141. package/packages/native/dist/text/index.d.ts +55 -0
  142. package/packages/native/dist/text/index.js +76 -0
  143. package/packages/native/dist/text/types.d.ts +27 -0
  144. package/packages/native/dist/text/types.js +13 -0
  145. package/packages/native/dist/truncate/index.d.ts +29 -0
  146. package/packages/native/dist/truncate/index.js +30 -0
  147. package/packages/native/dist/ttsr/index.d.ts +27 -0
  148. package/packages/native/dist/ttsr/index.js +37 -0
  149. package/packages/native/dist/ttsr/types.d.ts +9 -0
  150. package/packages/native/dist/ttsr/types.js +2 -0
  151. package/packages/native/dist/xxhash/index.d.ts +22 -0
  152. package/packages/native/dist/xxhash/index.js +89 -0
  153. package/packages/native/package.json +97 -0
  154. package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
  155. package/packages/native/src/__tests__/clipboard.test.mjs +126 -0
  156. package/packages/native/src/__tests__/diff.test.mjs +189 -0
  157. package/packages/native/src/__tests__/fd.test.mjs +199 -0
  158. package/packages/native/src/__tests__/glob.test.mjs +237 -0
  159. package/packages/native/src/__tests__/grep.test.mjs +179 -0
  160. package/packages/native/src/__tests__/highlight.test.mjs +156 -0
  161. package/packages/native/src/__tests__/html.test.mjs +98 -0
  162. package/packages/native/src/__tests__/image.test.mjs +137 -0
  163. package/packages/native/src/__tests__/json-parse.test.mjs +158 -0
  164. package/packages/native/src/__tests__/module-compat.test.mjs +123 -0
  165. package/packages/native/src/__tests__/ps.test.mjs +115 -0
  166. package/packages/native/src/__tests__/stream-process.test.mjs +108 -0
  167. package/packages/native/src/__tests__/text.test.mjs +295 -0
  168. package/packages/native/src/__tests__/truncate.test.mjs +160 -0
  169. package/packages/native/src/__tests__/ttsr.test.mjs +135 -0
  170. package/packages/native/src/__tests__/xxhash.test.mjs +122 -0
  171. package/packages/native/src/ast/index.ts +12 -0
  172. package/packages/native/src/ast/types.ts +75 -0
  173. package/packages/native/src/clipboard/index.ts +40 -0
  174. package/packages/native/src/clipboard/types.ts +7 -0
  175. package/packages/native/src/diff/index.ts +61 -0
  176. package/packages/native/src/diff/types.ts +24 -0
  177. package/packages/native/src/fd/index.ts +36 -0
  178. package/packages/native/src/fd/types.ts +31 -0
  179. package/packages/native/src/glob/index.ts +44 -0
  180. package/packages/native/src/glob/types.ts +53 -0
  181. package/packages/native/src/grep/index.ts +49 -0
  182. package/packages/native/src/grep/types.ts +105 -0
  183. package/packages/native/src/gsd-parser/index.ts +98 -0
  184. package/packages/native/src/gsd-parser/types.ts +62 -0
  185. package/packages/native/src/highlight/index.ts +44 -0
  186. package/packages/native/src/highlight/types.ts +25 -0
  187. package/packages/native/src/html/index.ts +24 -0
  188. package/packages/native/src/html/types.ts +7 -0
  189. package/packages/native/src/image/index.ts +28 -0
  190. package/packages/native/src/image/types.ts +41 -0
  191. package/packages/native/src/index.ts +128 -0
  192. package/packages/native/src/json-parse/index.ts +76 -0
  193. package/packages/native/src/native.ts +154 -0
  194. package/packages/native/src/ps/index.ts +52 -0
  195. package/packages/native/src/stream-process/index.ts +313 -0
  196. package/packages/native/src/text/index.ts +125 -0
  197. package/packages/native/src/text/types.ts +29 -0
  198. package/packages/native/src/truncate/index.ts +50 -0
  199. package/packages/native/src/ttsr/index.ts +39 -0
  200. package/packages/native/src/ttsr/types.ts +10 -0
  201. package/packages/native/src/xxhash/index.ts +98 -0
  202. package/packages/native/tsconfig.json +9 -0
  203. package/packages/native/tsconfig.tsbuildinfo +1 -0
  204. package/packages/pi-agent-core/package.json +23 -0
  205. package/packages/pi-agent-core/src/agent-loop.test.ts +733 -0
  206. package/packages/pi-agent-core/src/agent-loop.ts +851 -0
  207. package/packages/pi-agent-core/src/agent.test.ts +129 -0
  208. package/packages/pi-agent-core/src/agent.ts +668 -0
  209. package/packages/pi-agent-core/src/index.ts +10 -0
  210. package/packages/pi-agent-core/src/proxy.ts +334 -0
  211. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  212. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  213. package/packages/pi-agent-core/src/types.ts +358 -0
  214. package/packages/pi-agent-core/tsconfig.json +28 -0
  215. package/packages/pi-ai/bedrock-provider.d.ts +1 -0
  216. package/packages/pi-ai/bedrock-provider.js +1 -0
  217. package/packages/pi-ai/package.json +48 -0
  218. package/packages/pi-ai/scripts/generate-models.ts +1671 -0
  219. package/packages/pi-ai/src/api-registry.ts +86 -0
  220. package/packages/pi-ai/src/bedrock-provider.ts +6 -0
  221. package/packages/pi-ai/src/cli.ts +133 -0
  222. package/packages/pi-ai/src/env-api-keys.ts +148 -0
  223. package/packages/pi-ai/src/index.ts +36 -0
  224. package/packages/pi-ai/src/models/capability-patches.ts +51 -0
  225. package/packages/pi-ai/src/models/custom.ts +337 -0
  226. package/packages/pi-ai/src/models/fake-model.ts +30 -0
  227. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1554 -0
  228. package/packages/pi-ai/src/models/generated/anthropic.ts +398 -0
  229. package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
  230. package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
  231. package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
  232. package/packages/pi-ai/src/models/generated/google-antigravity.ts +177 -0
  233. package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
  234. package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
  235. package/packages/pi-ai/src/models/generated/google.ts +466 -0
  236. package/packages/pi-ai/src/models/generated/groq.ts +160 -0
  237. package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
  238. package/packages/pi-ai/src/models/generated/index.ts +52 -0
  239. package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
  240. package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
  241. package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
  242. package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
  243. package/packages/pi-ai/src/models/generated/openai-codex.ts +177 -0
  244. package/packages/pi-ai/src/models/generated/openai.ts +721 -0
  245. package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
  246. package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
  247. package/packages/pi-ai/src/models/generated/openrouter.ts +4291 -0
  248. package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
  249. package/packages/pi-ai/src/models/generated/xai.ts +415 -0
  250. package/packages/pi-ai/src/models/generated/zai.ts +241 -0
  251. package/packages/pi-ai/src/models/index.ts +115 -0
  252. package/packages/pi-ai/src/models.generated.test.ts +362 -0
  253. package/packages/pi-ai/src/models.test.ts +404 -0
  254. package/packages/pi-ai/src/models.ts +3 -0
  255. package/packages/pi-ai/src/oauth.ts +1 -0
  256. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  257. package/packages/pi-ai/src/providers/amazon-bedrock.ts +797 -0
  258. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +92 -0
  259. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +36 -0
  260. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
  261. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +134 -0
  262. package/packages/pi-ai/src/providers/anthropic-shared.ts +899 -0
  263. package/packages/pi-ai/src/providers/anthropic-vertex.ts +130 -0
  264. package/packages/pi-ai/src/providers/anthropic.ts +240 -0
  265. package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
  266. package/packages/pi-ai/src/providers/api-family.ts +57 -0
  267. package/packages/pi-ai/src/providers/azure-openai-responses.ts +248 -0
  268. package/packages/pi-ai/src/providers/fake.ts +376 -0
  269. package/packages/pi-ai/src/providers/github-copilot-headers.ts +37 -0
  270. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +90 -0
  271. package/packages/pi-ai/src/providers/google-gemini-cli.ts +982 -0
  272. package/packages/pi-ai/src/providers/google-shared.test.ts +137 -0
  273. package/packages/pi-ai/src/providers/google-shared.ts +364 -0
  274. package/packages/pi-ai/src/providers/google-vertex.ts +500 -0
  275. package/packages/pi-ai/src/providers/google.ts +467 -0
  276. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +118 -0
  277. package/packages/pi-ai/src/providers/mistral.ts +597 -0
  278. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  279. package/packages/pi-ai/src/providers/openai-codex-responses.ts +1007 -0
  280. package/packages/pi-ai/src/providers/openai-completions.test.ts +75 -0
  281. package/packages/pi-ai/src/providers/openai-completions.ts +830 -0
  282. package/packages/pi-ai/src/providers/openai-responses-shared.ts +496 -0
  283. package/packages/pi-ai/src/providers/openai-responses.ts +205 -0
  284. package/packages/pi-ai/src/providers/openai-shared.ts +193 -0
  285. package/packages/pi-ai/src/providers/provider-capabilities.test.ts +174 -0
  286. package/packages/pi-ai/src/providers/provider-capabilities.ts +215 -0
  287. package/packages/pi-ai/src/providers/register-builtins.ts +216 -0
  288. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  289. package/packages/pi-ai/src/providers/simple-options.ts +61 -0
  290. package/packages/pi-ai/src/providers/think-tag-parser.test.ts +44 -0
  291. package/packages/pi-ai/src/providers/think-tag-parser.ts +94 -0
  292. package/packages/pi-ai/src/providers/transform-messages-report.test.ts +189 -0
  293. package/packages/pi-ai/src/providers/transform-messages.ts +289 -0
  294. package/packages/pi-ai/src/stream.ts +59 -0
  295. package/packages/pi-ai/src/types.ts +413 -0
  296. package/packages/pi-ai/src/utils/event-stream.ts +87 -0
  297. package/packages/pi-ai/src/utils/hash.ts +13 -0
  298. package/packages/pi-ai/src/utils/json-parse.ts +51 -0
  299. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +282 -0
  300. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +470 -0
  301. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +80 -0
  302. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +323 -0
  303. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +80 -0
  304. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +468 -0
  305. package/packages/pi-ai/src/utils/oauth/google-oauth-utils.ts +201 -0
  306. package/packages/pi-ai/src/utils/oauth/index.ts +134 -0
  307. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +472 -0
  308. package/packages/pi-ai/src/utils/oauth/pkce.ts +34 -0
  309. package/packages/pi-ai/src/utils/oauth/types.ts +49 -0
  310. package/packages/pi-ai/src/utils/overflow.ts +129 -0
  311. package/packages/pi-ai/src/utils/repair-tool-json.ts +241 -0
  312. package/packages/pi-ai/src/utils/sanitize-unicode.ts +25 -0
  313. package/packages/pi-ai/src/utils/tests/json-parse.test.ts +17 -0
  314. package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
  315. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +240 -0
  316. package/packages/pi-ai/src/utils/typebox-helpers.ts +24 -0
  317. package/packages/pi-ai/src/utils/validation.ts +69 -0
  318. package/packages/pi-ai/src/web-runtime-env-api-keys.ts +86 -0
  319. package/packages/pi-ai/src/web-runtime-oauth.ts +9 -0
  320. package/packages/pi-ai/tsconfig.json +28 -0
  321. package/packages/pi-coding-agent/package.json +52 -0
  322. package/packages/pi-coding-agent/scripts/copy-assets.cjs +55 -0
  323. package/packages/pi-coding-agent/src/cli/abort-signal-timeout.test.ts +73 -0
  324. package/packages/pi-coding-agent/src/cli/abort-signal-timeout.ts +18 -0
  325. package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
  326. package/packages/pi-coding-agent/src/cli/args.ts +357 -0
  327. package/packages/pi-coding-agent/src/cli/config-selector.ts +52 -0
  328. package/packages/pi-coding-agent/src/cli/file-processor.ts +96 -0
  329. package/packages/pi-coding-agent/src/cli/list-models.ts +164 -0
  330. package/packages/pi-coding-agent/src/cli/session-picker.ts +51 -0
  331. package/packages/pi-coding-agent/src/cli.ts +20 -0
  332. package/packages/pi-coding-agent/src/config.ts +245 -0
  333. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +491 -0
  334. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +93 -0
  335. package/packages/pi-coding-agent/src/core/agent-session-renderable-tools.test.ts +70 -0
  336. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  337. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +172 -0
  338. package/packages/pi-coding-agent/src/core/agent-session.ts +3150 -0
  339. package/packages/pi-coding-agent/src/core/artifact-manager.ts +125 -0
  340. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +654 -0
  341. package/packages/pi-coding-agent/src/core/auth-storage.ts +925 -0
  342. package/packages/pi-coding-agent/src/core/bash-executor.ts +316 -0
  343. package/packages/pi-coding-agent/src/core/blob-store.ts +154 -0
  344. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +1571 -0
  345. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +307 -0
  346. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +598 -0
  347. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +986 -0
  348. package/packages/pi-coding-agent/src/core/compaction/index.ts +7 -0
  349. package/packages/pi-coding-agent/src/core/compaction/utils.ts +368 -0
  350. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  351. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +440 -0
  352. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  353. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +117 -0
  354. package/packages/pi-coding-agent/src/core/constants.ts +59 -0
  355. package/packages/pi-coding-agent/src/core/contextual-tips.test.ts +259 -0
  356. package/packages/pi-coding-agent/src/core/contextual-tips.ts +232 -0
  357. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  358. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  359. package/packages/pi-coding-agent/src/core/defaults.ts +3 -0
  360. package/packages/pi-coding-agent/src/core/diagnostics.ts +15 -0
  361. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +163 -0
  362. package/packages/pi-coding-agent/src/core/discovery-cache.ts +104 -0
  363. package/packages/pi-coding-agent/src/core/event-bus.ts +33 -0
  364. package/packages/pi-coding-agent/src/core/exec.ts +106 -0
  365. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +258 -0
  366. package/packages/pi-coding-agent/src/core/export-html/index.ts +306 -0
  367. package/packages/pi-coding-agent/src/core/export-html/template.css +971 -0
  368. package/packages/pi-coding-agent/src/core/export-html/template.html +54 -0
  369. package/packages/pi-coding-agent/src/core/export-html/template.js +1583 -0
  370. package/packages/pi-coding-agent/src/core/export-html/tool-renderer.ts +114 -0
  371. package/packages/pi-coding-agent/src/core/export-html/vendor/highlight.min.js +1213 -0
  372. package/packages/pi-coding-agent/src/core/export-html/vendor/marked.min.js +6 -0
  373. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  374. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  375. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  376. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  377. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  378. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  379. package/packages/pi-coding-agent/src/core/extensions/index.ts +186 -0
  380. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +275 -0
  381. package/packages/pi-coding-agent/src/core/extensions/loader.ts +1139 -0
  382. package/packages/pi-coding-agent/src/core/extensions/project-trust.ts +51 -0
  383. package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +81 -0
  384. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +282 -0
  385. package/packages/pi-coding-agent/src/core/extensions/runner.ts +1241 -0
  386. package/packages/pi-coding-agent/src/core/extensions/types.ts +1872 -0
  387. package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +127 -0
  388. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +242 -0
  389. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +164 -0
  390. package/packages/pi-coding-agent/src/core/footer-data-provider.ts +144 -0
  391. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +54 -0
  392. package/packages/pi-coding-agent/src/core/fs-utils.ts +12 -0
  393. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +271 -0
  394. package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
  395. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  396. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  397. package/packages/pi-coding-agent/src/core/index.ts +80 -0
  398. package/packages/pi-coding-agent/src/core/keybindings.ts +211 -0
  399. package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
  400. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +280 -0
  401. package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
  402. package/packages/pi-coding-agent/src/core/lock-utils.ts +113 -0
  403. package/packages/pi-coding-agent/src/core/lsp/client.ts +968 -0
  404. package/packages/pi-coding-agent/src/core/lsp/config.ts +356 -0
  405. package/packages/pi-coding-agent/src/core/lsp/defaults.json +456 -0
  406. package/packages/pi-coding-agent/src/core/lsp/edits.ts +109 -0
  407. package/packages/pi-coding-agent/src/core/lsp/helpers.ts +54 -0
  408. package/packages/pi-coding-agent/src/core/lsp/index.ts +1065 -0
  409. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +451 -0
  410. package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +70 -0
  411. package/packages/pi-coding-agent/src/core/lsp/lsp.md +39 -0
  412. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +190 -0
  413. package/packages/pi-coding-agent/src/core/lsp/types.ts +445 -0
  414. package/packages/pi-coding-agent/src/core/lsp/utils.ts +706 -0
  415. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  416. package/packages/pi-coding-agent/src/core/messages.ts +226 -0
  417. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +144 -0
  418. package/packages/pi-coding-agent/src/core/model-discovery.ts +318 -0
  419. package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
  420. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +730 -0
  421. package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
  422. package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +210 -0
  423. package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
  424. package/packages/pi-coding-agent/src/core/model-registry.ts +1053 -0
  425. package/packages/pi-coding-agent/src/core/model-resolver-initial-model-auth.test.ts +78 -0
  426. package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
  427. package/packages/pi-coding-agent/src/core/model-resolver.ts +511 -0
  428. package/packages/pi-coding-agent/src/core/models-json-writer.test.ts +145 -0
  429. package/packages/pi-coding-agent/src/core/models-json-writer.ts +188 -0
  430. package/packages/pi-coding-agent/src/core/package-commands.test.ts +262 -0
  431. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  432. package/packages/pi-coding-agent/src/core/package-manager.ts +1845 -0
  433. package/packages/pi-coding-agent/src/core/prompt-templates.ts +299 -0
  434. package/packages/pi-coding-agent/src/core/redact-secrets.test.ts +86 -0
  435. package/packages/pi-coding-agent/src/core/redact-secrets.ts +58 -0
  436. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +295 -0
  437. package/packages/pi-coding-agent/src/core/resolve-config-value.ts +118 -0
  438. package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +107 -0
  439. package/packages/pi-coding-agent/src/core/resource-loader.ts +929 -0
  440. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +518 -0
  441. package/packages/pi-coding-agent/src/core/retry-handler.ts +576 -0
  442. package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
  443. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  444. package/packages/pi-coding-agent/src/core/sdk.test.ts +113 -0
  445. package/packages/pi-coding-agent/src/core/sdk.ts +688 -0
  446. package/packages/pi-coding-agent/src/core/session-manager.test.ts +129 -0
  447. package/packages/pi-coding-agent/src/core/session-manager.ts +1646 -0
  448. package/packages/pi-coding-agent/src/core/settings-manager-security.test.ts +102 -0
  449. package/packages/pi-coding-agent/src/core/settings-manager.ts +1247 -0
  450. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +117 -0
  451. package/packages/pi-coding-agent/src/core/skills.ts +490 -0
  452. package/packages/pi-coding-agent/src/core/slash-commands.ts +43 -0
  453. package/packages/pi-coding-agent/src/core/system-prompt.ts +296 -0
  454. package/packages/pi-coding-agent/src/core/timings.ts +25 -0
  455. package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
  456. package/packages/pi-coding-agent/src/core/tools/bash-background.test.ts +91 -0
  457. package/packages/pi-coding-agent/src/core/tools/bash-interceptor.test.ts +198 -0
  458. package/packages/pi-coding-agent/src/core/tools/bash-interceptor.ts +115 -0
  459. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +77 -0
  460. package/packages/pi-coding-agent/src/core/tools/bash.ts +478 -0
  461. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +85 -0
  462. package/packages/pi-coding-agent/src/core/tools/edit-diff.ts +402 -0
  463. package/packages/pi-coding-agent/src/core/tools/edit.ts +242 -0
  464. package/packages/pi-coding-agent/src/core/tools/find.ts +209 -0
  465. package/packages/pi-coding-agent/src/core/tools/grep.ts +356 -0
  466. package/packages/pi-coding-agent/src/core/tools/hashline-edit.ts +318 -0
  467. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +207 -0
  468. package/packages/pi-coding-agent/src/core/tools/hashline.test.ts +456 -0
  469. package/packages/pi-coding-agent/src/core/tools/hashline.ts +525 -0
  470. package/packages/pi-coding-agent/src/core/tools/index.ts +226 -0
  471. package/packages/pi-coding-agent/src/core/tools/ls.ts +178 -0
  472. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +67 -0
  473. package/packages/pi-coding-agent/src/core/tools/path-utils.ts +106 -0
  474. package/packages/pi-coding-agent/src/core/tools/read.ts +235 -0
  475. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +31 -0
  476. package/packages/pi-coding-agent/src/core/tools/tool-compatibility-registry.ts +83 -0
  477. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  478. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  479. package/packages/pi-coding-agent/src/core/tools/truncate.ts +267 -0
  480. package/packages/pi-coding-agent/src/core/tools/write.ts +133 -0
  481. package/packages/pi-coding-agent/src/index.ts +422 -0
  482. package/packages/pi-coding-agent/src/main.ts +649 -0
  483. package/packages/pi-coding-agent/src/migrations.ts +295 -0
  484. package/packages/pi-coding-agent/src/modes/index.ts +16 -0
  485. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +128 -0
  486. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +93 -0
  487. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/collapsible-message.test.ts +111 -0
  488. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
  489. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +28 -0
  490. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +41 -0
  491. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +512 -0
  492. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +139 -0
  493. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +66 -0
  494. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +161 -0
  495. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.test.ts +115 -0
  496. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.ts +107 -0
  497. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +360 -0
  498. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +200 -0
  499. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.test.ts +35 -0
  500. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +287 -0
  501. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +66 -0
  502. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +54 -0
  503. package/packages/pi-coding-agent/src/modes/interactive/components/collapsible-message.ts +45 -0
  504. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +73 -0
  505. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +599 -0
  506. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +43 -0
  507. package/packages/pi-coding-agent/src/modes/interactive/components/custom-editor.ts +97 -0
  508. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +89 -0
  509. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.test.ts +68 -0
  510. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +159 -0
  511. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +153 -0
  512. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +99 -0
  513. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +97 -0
  514. package/packages/pi-coding-agent/src/modes/interactive/components/extension-editor.ts +150 -0
  515. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +92 -0
  516. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +152 -0
  517. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +266 -0
  518. package/packages/pi-coding-agent/src/modes/interactive/components/index.ts +33 -0
  519. package/packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts +122 -0
  520. package/packages/pi-coding-agent/src/modes/interactive/components/keybinding-hints.ts +84 -0
  521. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +256 -0
  522. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +693 -0
  523. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +127 -0
  524. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +231 -0
  525. package/packages/pi-coding-agent/src/modes/interactive/components/render-cache.ts +22 -0
  526. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +342 -0
  527. package/packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts +63 -0
  528. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +194 -0
  529. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +1015 -0
  530. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +466 -0
  531. package/packages/pi-coding-agent/src/modes/interactive/components/show-images-selector.ts +47 -0
  532. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +61 -0
  533. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts +27 -0
  534. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.ts +67 -0
  535. package/packages/pi-coding-agent/src/modes/interactive/components/thinking-selector.ts +66 -0
  536. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +49 -0
  537. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +303 -0
  538. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1457 -0
  539. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +345 -0
  540. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +84 -0
  541. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +1125 -0
  542. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.test.ts +28 -0
  543. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +154 -0
  544. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +76 -0
  545. package/packages/pi-coding-agent/src/modes/interactive/components/visual-truncate.ts +50 -0
  546. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +230 -0
  547. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1066 -0
  548. package/packages/pi-coding-agent/src/modes/interactive/controllers/extension-ui-controller.ts +68 -0
  549. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +373 -0
  550. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +157 -0
  551. package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +76 -0
  552. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-lifecycle.test.ts +63 -0
  553. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +73 -0
  554. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +40 -0
  555. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4418 -0
  556. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
  557. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +695 -0
  558. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  559. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +96 -0
  560. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +1130 -0
  561. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +388 -0
  562. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +68 -0
  563. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
  564. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +15 -0
  565. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.test.ts +39 -0
  566. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.ts +56 -0
  567. package/packages/pi-coding-agent/src/modes/print-mode.ts +106 -0
  568. package/packages/pi-coding-agent/src/modes/rpc/jsonl.ts +64 -0
  569. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +109 -0
  570. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +574 -0
  571. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +891 -0
  572. package/packages/pi-coding-agent/src/modes/rpc/rpc-protocol-v2.test.ts +971 -0
  573. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +4 -0
  574. package/packages/pi-coding-agent/src/modes/shared/command-context-actions.ts +53 -0
  575. package/packages/pi-coding-agent/src/resources/extensions/memory/index.ts +270 -0
  576. package/packages/pi-coding-agent/src/resources/extensions/memory/pipeline.ts +567 -0
  577. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  578. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +98 -0
  579. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +479 -0
  580. package/packages/pi-coding-agent/src/tests/path-display.test.ts +85 -0
  581. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
  582. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  583. package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
  584. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
  585. package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
  586. package/packages/pi-coding-agent/src/utils/changelog.ts +99 -0
  587. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +227 -0
  588. package/packages/pi-coding-agent/src/utils/clipboard-native.ts +11 -0
  589. package/packages/pi-coding-agent/src/utils/clipboard.ts +14 -0
  590. package/packages/pi-coding-agent/src/utils/error.ts +6 -0
  591. package/packages/pi-coding-agent/src/utils/frontmatter.ts +39 -0
  592. package/packages/pi-coding-agent/src/utils/git.ts +192 -0
  593. package/packages/pi-coding-agent/src/utils/image-convert.ts +28 -0
  594. package/packages/pi-coding-agent/src/utils/image-resize.ts +225 -0
  595. package/packages/pi-coding-agent/src/utils/mime.ts +30 -0
  596. package/packages/pi-coding-agent/src/utils/path-display.ts +36 -0
  597. package/packages/pi-coding-agent/src/utils/photon.ts +2 -0
  598. package/packages/pi-coding-agent/src/utils/shell.ts +212 -0
  599. package/packages/pi-coding-agent/src/utils/sleep.ts +18 -0
  600. package/packages/pi-coding-agent/src/utils/tools-manager.ts +286 -0
  601. package/packages/pi-coding-agent/tsconfig.json +28 -0
  602. package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts +2 -0
  603. package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts.map +1 -0
  604. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +206 -0
  605. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -0
  606. package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts +2 -0
  607. package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts.map +1 -0
  608. package/packages/pi-tui/dist/__tests__/fuzzy.test.js +100 -0
  609. package/packages/pi-tui/dist/__tests__/fuzzy.test.js.map +1 -0
  610. package/packages/pi-tui/dist/__tests__/keys.test.d.ts +2 -0
  611. package/packages/pi-tui/dist/__tests__/keys.test.d.ts.map +1 -0
  612. package/packages/pi-tui/dist/__tests__/keys.test.js +18 -0
  613. package/packages/pi-tui/dist/__tests__/keys.test.js.map +1 -0
  614. package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
  615. package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
  616. package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
  617. package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
  618. package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts +2 -0
  619. package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts.map +1 -0
  620. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +227 -0
  621. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -0
  622. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.d.ts +2 -0
  623. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.d.ts.map +1 -0
  624. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +80 -0
  625. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -0
  626. package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
  627. package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
  628. package/packages/pi-tui/dist/__tests__/style.test.js +129 -0
  629. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
  630. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  631. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  632. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  633. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  634. package/packages/pi-tui/dist/__tests__/tui.test.d.ts +2 -0
  635. package/packages/pi-tui/dist/__tests__/tui.test.d.ts.map +1 -0
  636. package/packages/pi-tui/dist/__tests__/tui.test.js +315 -0
  637. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -0
  638. package/packages/pi-tui/dist/__tests__/utils.test.d.ts +2 -0
  639. package/packages/pi-tui/dist/__tests__/utils.test.d.ts.map +1 -0
  640. package/packages/pi-tui/dist/__tests__/utils.test.js +17 -0
  641. package/packages/pi-tui/dist/__tests__/utils.test.js.map +1 -0
  642. package/packages/pi-tui/dist/autocomplete.d.ts +55 -0
  643. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -0
  644. package/packages/pi-tui/dist/autocomplete.js +540 -0
  645. package/packages/pi-tui/dist/autocomplete.js.map +1 -0
  646. package/packages/pi-tui/dist/components/__tests__/box.test.d.ts +2 -0
  647. package/packages/pi-tui/dist/components/__tests__/box.test.d.ts.map +1 -0
  648. package/packages/pi-tui/dist/components/__tests__/box.test.js +20 -0
  649. package/packages/pi-tui/dist/components/__tests__/box.test.js.map +1 -0
  650. package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.d.ts +2 -0
  651. package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.d.ts.map +1 -0
  652. package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.js +38 -0
  653. package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.js.map +1 -0
  654. package/packages/pi-tui/dist/components/__tests__/editor.test.d.ts +2 -0
  655. package/packages/pi-tui/dist/components/__tests__/editor.test.d.ts.map +1 -0
  656. package/packages/pi-tui/dist/components/__tests__/editor.test.js +89 -0
  657. package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -0
  658. package/packages/pi-tui/dist/components/__tests__/input.test.d.ts +2 -0
  659. package/packages/pi-tui/dist/components/__tests__/input.test.d.ts.map +1 -0
  660. package/packages/pi-tui/dist/components/__tests__/input.test.js +81 -0
  661. package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -0
  662. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
  663. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
  664. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
  665. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
  666. package/packages/pi-tui/dist/components/__tests__/loader.test.d.ts +2 -0
  667. package/packages/pi-tui/dist/components/__tests__/loader.test.d.ts.map +1 -0
  668. package/packages/pi-tui/dist/components/__tests__/loader.test.js +81 -0
  669. package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -0
  670. package/packages/pi-tui/dist/components/__tests__/markdown-list.test.d.ts +2 -0
  671. package/packages/pi-tui/dist/components/__tests__/markdown-list.test.d.ts.map +1 -0
  672. package/packages/pi-tui/dist/components/__tests__/markdown-list.test.js +36 -0
  673. package/packages/pi-tui/dist/components/__tests__/markdown-list.test.js.map +1 -0
  674. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.d.ts +2 -0
  675. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.d.ts.map +1 -0
  676. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +70 -0
  677. package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -0
  678. package/packages/pi-tui/dist/components/__tests__/select-list.test.d.ts +2 -0
  679. package/packages/pi-tui/dist/components/__tests__/select-list.test.d.ts.map +1 -0
  680. package/packages/pi-tui/dist/components/__tests__/select-list.test.js +42 -0
  681. package/packages/pi-tui/dist/components/__tests__/select-list.test.js.map +1 -0
  682. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.d.ts +2 -0
  683. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.d.ts.map +1 -0
  684. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js +14 -0
  685. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js.map +1 -0
  686. package/packages/pi-tui/dist/components/box.d.ts +23 -0
  687. package/packages/pi-tui/dist/components/box.d.ts.map +1 -0
  688. package/packages/pi-tui/dist/components/box.js +111 -0
  689. package/packages/pi-tui/dist/components/box.js.map +1 -0
  690. package/packages/pi-tui/dist/components/cancellable-loader.d.ts +22 -0
  691. package/packages/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -0
  692. package/packages/pi-tui/dist/components/cancellable-loader.js +38 -0
  693. package/packages/pi-tui/dist/components/cancellable-loader.js.map +1 -0
  694. package/packages/pi-tui/dist/components/editor.d.ts +245 -0
  695. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -0
  696. package/packages/pi-tui/dist/components/editor.js +1825 -0
  697. package/packages/pi-tui/dist/components/editor.js.map +1 -0
  698. package/packages/pi-tui/dist/components/image.d.ts +37 -0
  699. package/packages/pi-tui/dist/components/image.d.ts.map +1 -0
  700. package/packages/pi-tui/dist/components/image.js +84 -0
  701. package/packages/pi-tui/dist/components/image.js.map +1 -0
  702. package/packages/pi-tui/dist/components/image.test.d.ts +6 -0
  703. package/packages/pi-tui/dist/components/image.test.d.ts.map +1 -0
  704. package/packages/pi-tui/dist/components/image.test.js +33 -0
  705. package/packages/pi-tui/dist/components/image.test.js.map +1 -0
  706. package/packages/pi-tui/dist/components/input.d.ts +42 -0
  707. package/packages/pi-tui/dist/components/input.d.ts.map +1 -0
  708. package/packages/pi-tui/dist/components/input.js +479 -0
  709. package/packages/pi-tui/dist/components/input.js.map +1 -0
  710. package/packages/pi-tui/dist/components/loader.d.ts +24 -0
  711. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -0
  712. package/packages/pi-tui/dist/components/loader.js +74 -0
  713. package/packages/pi-tui/dist/components/loader.js.map +1 -0
  714. package/packages/pi-tui/dist/components/markdown.d.ts +106 -0
  715. package/packages/pi-tui/dist/components/markdown.d.ts.map +1 -0
  716. package/packages/pi-tui/dist/components/markdown.js +668 -0
  717. package/packages/pi-tui/dist/components/markdown.js.map +1 -0
  718. package/packages/pi-tui/dist/components/select-list.d.ts +32 -0
  719. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -0
  720. package/packages/pi-tui/dist/components/select-list.js +155 -0
  721. package/packages/pi-tui/dist/components/select-list.js.map +1 -0
  722. package/packages/pi-tui/dist/components/settings-list.d.ts +50 -0
  723. package/packages/pi-tui/dist/components/settings-list.d.ts.map +1 -0
  724. package/packages/pi-tui/dist/components/settings-list.js +179 -0
  725. package/packages/pi-tui/dist/components/settings-list.js.map +1 -0
  726. package/packages/pi-tui/dist/components/spacer.d.ts +12 -0
  727. package/packages/pi-tui/dist/components/spacer.d.ts.map +1 -0
  728. package/packages/pi-tui/dist/components/spacer.js +22 -0
  729. package/packages/pi-tui/dist/components/spacer.js.map +1 -0
  730. package/packages/pi-tui/dist/components/text.d.ts +19 -0
  731. package/packages/pi-tui/dist/components/text.d.ts.map +1 -0
  732. package/packages/pi-tui/dist/components/text.js +83 -0
  733. package/packages/pi-tui/dist/components/text.js.map +1 -0
  734. package/packages/pi-tui/dist/components/truncated-text.d.ts +13 -0
  735. package/packages/pi-tui/dist/components/truncated-text.d.ts.map +1 -0
  736. package/packages/pi-tui/dist/components/truncated-text.js +54 -0
  737. package/packages/pi-tui/dist/components/truncated-text.js.map +1 -0
  738. package/packages/pi-tui/dist/editor-component.d.ts +41 -0
  739. package/packages/pi-tui/dist/editor-component.d.ts.map +1 -0
  740. package/packages/pi-tui/dist/editor-component.js +2 -0
  741. package/packages/pi-tui/dist/editor-component.js.map +1 -0
  742. package/packages/pi-tui/dist/fuzzy.d.ts +16 -0
  743. package/packages/pi-tui/dist/fuzzy.d.ts.map +1 -0
  744. package/packages/pi-tui/dist/fuzzy.js +111 -0
  745. package/packages/pi-tui/dist/fuzzy.js.map +1 -0
  746. package/packages/pi-tui/dist/index.d.ts +24 -0
  747. package/packages/pi-tui/dist/index.d.ts.map +1 -0
  748. package/packages/pi-tui/dist/index.js +35 -0
  749. package/packages/pi-tui/dist/index.js.map +1 -0
  750. package/packages/pi-tui/dist/keybindings.d.ts +39 -0
  751. package/packages/pi-tui/dist/keybindings.d.ts.map +1 -0
  752. package/packages/pi-tui/dist/keybindings.js +116 -0
  753. package/packages/pi-tui/dist/keybindings.js.map +1 -0
  754. package/packages/pi-tui/dist/keys.d.ts +142 -0
  755. package/packages/pi-tui/dist/keys.d.ts.map +1 -0
  756. package/packages/pi-tui/dist/keys.js +994 -0
  757. package/packages/pi-tui/dist/keys.js.map +1 -0
  758. package/packages/pi-tui/dist/kill-ring.d.ts +28 -0
  759. package/packages/pi-tui/dist/kill-ring.d.ts.map +1 -0
  760. package/packages/pi-tui/dist/kill-ring.js +46 -0
  761. package/packages/pi-tui/dist/kill-ring.js.map +1 -0
  762. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  763. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  764. package/packages/pi-tui/dist/overlay-layout.js +314 -0
  765. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  766. package/packages/pi-tui/dist/stdin-buffer.d.ts +55 -0
  767. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -0
  768. package/packages/pi-tui/dist/stdin-buffer.js +342 -0
  769. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -0
  770. package/packages/pi-tui/dist/style.d.ts +52 -0
  771. package/packages/pi-tui/dist/style.d.ts.map +1 -0
  772. package/packages/pi-tui/dist/style.js +219 -0
  773. package/packages/pi-tui/dist/style.js.map +1 -0
  774. package/packages/pi-tui/dist/terminal-image.d.ts +68 -0
  775. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -0
  776. package/packages/pi-tui/dist/terminal-image.js +181 -0
  777. package/packages/pi-tui/dist/terminal-image.js.map +1 -0
  778. package/packages/pi-tui/dist/terminal.d.ts +89 -0
  779. package/packages/pi-tui/dist/terminal.d.ts.map +1 -0
  780. package/packages/pi-tui/dist/terminal.js +295 -0
  781. package/packages/pi-tui/dist/terminal.js.map +1 -0
  782. package/packages/pi-tui/dist/tui.d.ts +213 -0
  783. package/packages/pi-tui/dist/tui.d.ts.map +1 -0
  784. package/packages/pi-tui/dist/tui.js +978 -0
  785. package/packages/pi-tui/dist/tui.js.map +1 -0
  786. package/packages/pi-tui/dist/undo-stack.d.ts +17 -0
  787. package/packages/pi-tui/dist/undo-stack.d.ts.map +1 -0
  788. package/packages/pi-tui/dist/undo-stack.js +27 -0
  789. package/packages/pi-tui/dist/undo-stack.js.map +1 -0
  790. package/packages/pi-tui/dist/utils.d.ts +72 -0
  791. package/packages/pi-tui/dist/utils.d.ts.map +1 -0
  792. package/packages/pi-tui/dist/utils.js +120 -0
  793. package/packages/pi-tui/dist/utils.js.map +1 -0
  794. package/packages/pi-tui/package.json +35 -0
  795. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +264 -0
  796. package/packages/pi-tui/src/__tests__/fuzzy.test.ts +120 -0
  797. package/packages/pi-tui/src/__tests__/keys.test.ts +21 -0
  798. package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
  799. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +266 -0
  800. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +99 -0
  801. package/packages/pi-tui/src/__tests__/style.test.ts +156 -0
  802. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  803. package/packages/pi-tui/src/__tests__/tui.test.ts +377 -0
  804. package/packages/pi-tui/src/__tests__/utils.test.ts +22 -0
  805. package/packages/pi-tui/src/autocomplete.ts +675 -0
  806. package/packages/pi-tui/src/components/__tests__/box.test.ts +25 -0
  807. package/packages/pi-tui/src/components/__tests__/cancellable-loader.test.ts +45 -0
  808. package/packages/pi-tui/src/components/__tests__/editor.test.ts +119 -0
  809. package/packages/pi-tui/src/components/__tests__/input.test.ts +111 -0
  810. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
  811. package/packages/pi-tui/src/components/__tests__/loader.test.ts +122 -0
  812. package/packages/pi-tui/src/components/__tests__/markdown-list.test.ts +40 -0
  813. package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +82 -0
  814. package/packages/pi-tui/src/components/__tests__/select-list.test.ts +70 -0
  815. package/packages/pi-tui/src/components/__tests__/truncated-text.test.ts +17 -0
  816. package/packages/pi-tui/src/components/box.ts +150 -0
  817. package/packages/pi-tui/src/components/cancellable-loader.ts +42 -0
  818. package/packages/pi-tui/src/components/editor.ts +2196 -0
  819. package/packages/pi-tui/src/components/image.test.ts +41 -0
  820. package/packages/pi-tui/src/components/image.ts +131 -0
  821. package/packages/pi-tui/src/components/input.ts +558 -0
  822. package/packages/pi-tui/src/components/loader.ts +83 -0
  823. package/packages/pi-tui/src/components/markdown.ts +842 -0
  824. package/packages/pi-tui/src/components/select-list.ts +194 -0
  825. package/packages/pi-tui/src/components/settings-list.ts +251 -0
  826. package/packages/pi-tui/src/components/spacer.ts +28 -0
  827. package/packages/pi-tui/src/components/text.ts +107 -0
  828. package/packages/pi-tui/src/components/truncated-text.ts +72 -0
  829. package/packages/pi-tui/src/editor-component.ts +77 -0
  830. package/packages/pi-tui/src/fuzzy.ts +138 -0
  831. package/packages/pi-tui/src/index.ts +98 -0
  832. package/packages/pi-tui/src/keybindings.ts +189 -0
  833. package/packages/pi-tui/src/keys.ts +1196 -0
  834. package/packages/pi-tui/src/kill-ring.ts +46 -0
  835. package/packages/pi-tui/src/overlay-layout.ts +408 -0
  836. package/packages/pi-tui/src/stdin-buffer.ts +419 -0
  837. package/packages/pi-tui/src/style.ts +295 -0
  838. package/packages/pi-tui/src/terminal-image.ts +260 -0
  839. package/packages/pi-tui/src/terminal.ts +377 -0
  840. package/packages/pi-tui/src/tui.ts +1182 -0
  841. package/packages/pi-tui/src/undo-stack.ts +28 -0
  842. package/packages/pi-tui/src/utils.ts +154 -0
  843. package/packages/pi-tui/tsconfig.json +28 -0
  844. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
  845. package/packages/rpc-client/README.md +132 -0
  846. package/packages/rpc-client/examples/basic-usage.ts +13 -0
  847. package/packages/rpc-client/package.json +42 -0
  848. package/packages/rpc-client/src/index.ts +10 -0
  849. package/packages/rpc-client/src/jsonl.ts +64 -0
  850. package/packages/rpc-client/src/rpc-client.test.ts +625 -0
  851. package/packages/rpc-client/src/rpc-client.ts +663 -0
  852. package/packages/rpc-client/src/rpc-types.ts +4 -0
  853. package/packages/rpc-client/tsconfig.examples.json +17 -0
  854. package/packages/rpc-client/tsconfig.json +25 -0
  855. package/pkg/dist/core/export-html/template.css +971 -0
  856. package/pkg/dist/core/export-html/template.html +54 -0
  857. package/pkg/dist/core/export-html/template.js +1583 -0
  858. package/pkg/dist/core/export-html/vendor/highlight.min.js +1213 -0
  859. package/pkg/dist/core/export-html/vendor/marked.min.js +6 -0
  860. package/pkg/package.json +8 -0
  861. package/scripts/ensure-workspace-builds.cjs +123 -0
  862. package/scripts/install.js +526 -0
  863. package/scripts/lib/workspace-manifest.cjs +86 -0
  864. package/scripts/link-workspace-packages.cjs +82 -0
  865. package/scripts/postinstall.js +11 -0
  866. package/src/resources/GSD-WORKFLOW.md +664 -0
  867. package/src/resources/agents/debugger.md +58 -0
  868. package/src/resources/agents/doc-writer.md +43 -0
  869. package/src/resources/agents/git-ops.md +56 -0
  870. package/src/resources/agents/javascript-pro.md +55 -0
  871. package/src/resources/agents/planner.md +55 -0
  872. package/src/resources/agents/refactorer.md +47 -0
  873. package/src/resources/agents/researcher.md +29 -0
  874. package/src/resources/agents/reviewer.md +48 -0
  875. package/src/resources/agents/scout.md +56 -0
  876. package/src/resources/agents/security.md +59 -0
  877. package/src/resources/agents/tester.md +50 -0
  878. package/src/resources/agents/typescript-pro.md +61 -0
  879. package/src/resources/agents/worker.md +31 -0
  880. package/src/resources/extensions/ask-user-questions.ts +478 -0
  881. package/src/resources/extensions/async-jobs/async-bash-timeout.test.ts +122 -0
  882. package/src/resources/extensions/async-jobs/async-bash-tool.ts +263 -0
  883. package/src/resources/extensions/async-jobs/await-tool.test.ts +200 -0
  884. package/src/resources/extensions/async-jobs/await-tool.ts +136 -0
  885. package/src/resources/extensions/async-jobs/cancel-job-tool.ts +35 -0
  886. package/src/resources/extensions/async-jobs/extension-manifest.json +13 -0
  887. package/src/resources/extensions/async-jobs/index.ts +153 -0
  888. package/src/resources/extensions/async-jobs/job-manager.ts +242 -0
  889. package/src/resources/extensions/aws-auth/index.ts +144 -0
  890. package/src/resources/extensions/bg-shell/bg-shell-command.ts +219 -0
  891. package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +413 -0
  892. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +985 -0
  893. package/src/resources/extensions/bg-shell/extension-manifest.json +14 -0
  894. package/src/resources/extensions/bg-shell/index.ts +54 -0
  895. package/src/resources/extensions/bg-shell/interaction.ts +200 -0
  896. package/src/resources/extensions/bg-shell/output-formatter.ts +262 -0
  897. package/src/resources/extensions/bg-shell/overlay.ts +441 -0
  898. package/src/resources/extensions/bg-shell/process-manager.ts +469 -0
  899. package/src/resources/extensions/bg-shell/readiness-detector.ts +126 -0
  900. package/src/resources/extensions/bg-shell/types.ts +291 -0
  901. package/src/resources/extensions/bg-shell/utilities.ts +93 -0
  902. package/src/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
  903. package/src/resources/extensions/browser-tools/capture.ts +229 -0
  904. package/src/resources/extensions/browser-tools/core.ts +1196 -0
  905. package/src/resources/extensions/browser-tools/evaluate-helpers.ts +184 -0
  906. package/src/resources/extensions/browser-tools/extension-manifest.json +37 -0
  907. package/src/resources/extensions/browser-tools/index.ts +163 -0
  908. package/src/resources/extensions/browser-tools/lifecycle.ts +270 -0
  909. package/src/resources/extensions/browser-tools/package.json +24 -0
  910. package/src/resources/extensions/browser-tools/refs.ts +264 -0
  911. package/src/resources/extensions/browser-tools/settle.ts +197 -0
  912. package/src/resources/extensions/browser-tools/state.ts +408 -0
  913. package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +601 -0
  914. package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +651 -0
  915. package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +91 -0
  916. package/src/resources/extensions/browser-tools/tools/action-cache.ts +216 -0
  917. package/src/resources/extensions/browser-tools/tools/assertions.ts +342 -0
  918. package/src/resources/extensions/browser-tools/tools/codegen.ts +274 -0
  919. package/src/resources/extensions/browser-tools/tools/device.ts +183 -0
  920. package/src/resources/extensions/browser-tools/tools/extract.ts +229 -0
  921. package/src/resources/extensions/browser-tools/tools/forms.ts +805 -0
  922. package/src/resources/extensions/browser-tools/tools/injection-detect.ts +221 -0
  923. package/src/resources/extensions/browser-tools/tools/inspection.ts +492 -0
  924. package/src/resources/extensions/browser-tools/tools/intent.ts +629 -0
  925. package/src/resources/extensions/browser-tools/tools/interaction.ts +865 -0
  926. package/src/resources/extensions/browser-tools/tools/navigation.ts +232 -0
  927. package/src/resources/extensions/browser-tools/tools/network-mock.ts +244 -0
  928. package/src/resources/extensions/browser-tools/tools/pages.ts +303 -0
  929. package/src/resources/extensions/browser-tools/tools/pdf.ts +92 -0
  930. package/src/resources/extensions/browser-tools/tools/refs.ts +541 -0
  931. package/src/resources/extensions/browser-tools/tools/screenshot.ts +102 -0
  932. package/src/resources/extensions/browser-tools/tools/session.ts +400 -0
  933. package/src/resources/extensions/browser-tools/tools/state-persistence.ts +202 -0
  934. package/src/resources/extensions/browser-tools/tools/verify.ts +117 -0
  935. package/src/resources/extensions/browser-tools/tools/visual-diff.ts +209 -0
  936. package/src/resources/extensions/browser-tools/tools/wait.ts +247 -0
  937. package/src/resources/extensions/browser-tools/tools/zoom.ts +105 -0
  938. package/src/resources/extensions/browser-tools/utils.ts +660 -0
  939. package/src/resources/extensions/claude-code-cli/index.ts +28 -0
  940. package/src/resources/extensions/claude-code-cli/models.ts +51 -0
  941. package/src/resources/extensions/claude-code-cli/package.json +11 -0
  942. package/src/resources/extensions/claude-code-cli/partial-builder.ts +305 -0
  943. package/src/resources/extensions/claude-code-cli/readiness.ts +242 -0
  944. package/src/resources/extensions/claude-code-cli/sdk-types.ts +149 -0
  945. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1981 -0
  946. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +256 -0
  947. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +2380 -0
  948. package/src/resources/extensions/cmux/index.ts +479 -0
  949. package/src/resources/extensions/cmux/package.json +7 -0
  950. package/src/resources/extensions/context7/extension-manifest.json +12 -0
  951. package/src/resources/extensions/context7/index.ts +435 -0
  952. package/src/resources/extensions/context7/package.json +11 -0
  953. package/src/resources/extensions/get-secrets-from-user.ts +608 -0
  954. package/src/resources/extensions/github-sync/cli.ts +367 -0
  955. package/src/resources/extensions/github-sync/index.ts +93 -0
  956. package/src/resources/extensions/github-sync/mapping.ts +81 -0
  957. package/src/resources/extensions/github-sync/sync.ts +594 -0
  958. package/src/resources/extensions/github-sync/templates.ts +339 -0
  959. package/src/resources/extensions/github-sync/tests/cli.test.ts +89 -0
  960. package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +43 -0
  961. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
  962. package/src/resources/extensions/github-sync/tests/mapping.test.ts +104 -0
  963. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +14 -0
  964. package/src/resources/extensions/github-sync/tests/templates.test.ts +209 -0
  965. package/src/resources/extensions/github-sync/types.ts +47 -0
  966. package/src/resources/extensions/google-search/extension-manifest.json +13 -0
  967. package/src/resources/extensions/google-search/index.ts +6 -0
  968. package/src/resources/extensions/google-search/package.json +9 -0
  969. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  970. package/src/resources/extensions/gsd/activity-log.ts +184 -0
  971. package/src/resources/extensions/gsd/atomic-write.ts +185 -0
  972. package/src/resources/extensions/gsd/auto/contracts.ts +159 -0
  973. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  974. package/src/resources/extensions/gsd/auto/detect-stuck.ts +138 -0
  975. package/src/resources/extensions/gsd/auto/finalize-timeout.ts +49 -0
  976. package/src/resources/extensions/gsd/auto/infra-errors.ts +92 -0
  977. package/src/resources/extensions/gsd/auto/lease-conflict-notice.ts +62 -0
  978. package/src/resources/extensions/gsd/auto/loop-deps.ts +302 -0
  979. package/src/resources/extensions/gsd/auto/loop.ts +1448 -0
  980. package/src/resources/extensions/gsd/auto/orchestrator.ts +417 -0
  981. package/src/resources/extensions/gsd/auto/phases.ts +3014 -0
  982. package/src/resources/extensions/gsd/auto/resolve.ts +176 -0
  983. package/src/resources/extensions/gsd/auto/run-unit.ts +306 -0
  984. package/src/resources/extensions/gsd/auto/session.ts +427 -0
  985. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  986. package/src/resources/extensions/gsd/auto/types.ts +130 -0
  987. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +19 -0
  988. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  989. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  990. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  991. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  992. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  993. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  994. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  995. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +179 -0
  996. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  997. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  998. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  999. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +542 -0
  1000. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +71 -0
  1001. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  1002. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  1003. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  1004. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  1005. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  1006. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  1007. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +51 -0
  1008. package/src/resources/extensions/gsd/auto-artifact-paths.ts +218 -0
  1009. package/src/resources/extensions/gsd/auto-budget.ts +57 -0
  1010. package/src/resources/extensions/gsd/auto-dashboard.ts +1239 -0
  1011. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +311 -0
  1012. package/src/resources/extensions/gsd/auto-dispatch.ts +1827 -0
  1013. package/src/resources/extensions/gsd/auto-model-selection.ts +755 -0
  1014. package/src/resources/extensions/gsd/auto-post-unit.ts +2375 -0
  1015. package/src/resources/extensions/gsd/auto-prompts.ts +4108 -0
  1016. package/src/resources/extensions/gsd/auto-recovery.ts +1217 -0
  1017. package/src/resources/extensions/gsd/auto-runtime-state.ts +63 -0
  1018. package/src/resources/extensions/gsd/auto-start.ts +1561 -0
  1019. package/src/resources/extensions/gsd/auto-status-message.ts +45 -0
  1020. package/src/resources/extensions/gsd/auto-supervisor.ts +86 -0
  1021. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +308 -0
  1022. package/src/resources/extensions/gsd/auto-timers.ts +366 -0
  1023. package/src/resources/extensions/gsd/auto-tool-tracking.ts +156 -0
  1024. package/src/resources/extensions/gsd/auto-unit-closeout.ts +138 -0
  1025. package/src/resources/extensions/gsd/auto-utils.ts +25 -0
  1026. package/src/resources/extensions/gsd/auto-verification.ts +955 -0
  1027. package/src/resources/extensions/gsd/auto-worktree-repair.ts +194 -0
  1028. package/src/resources/extensions/gsd/auto-worktree.ts +2570 -0
  1029. package/src/resources/extensions/gsd/auto.ts +3167 -0
  1030. package/src/resources/extensions/gsd/blocked-models.ts +98 -0
  1031. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +685 -0
  1032. package/src/resources/extensions/gsd/bootstrap/crash-log.ts +32 -0
  1033. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1408 -0
  1034. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +144 -0
  1035. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +123 -0
  1036. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +67 -0
  1037. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +166 -0
  1038. package/src/resources/extensions/gsd/bootstrap/notify-interceptor.ts +34 -0
  1039. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +61 -0
  1040. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +68 -0
  1041. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +154 -0
  1042. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +1203 -0
  1043. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +101 -0
  1044. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +61 -0
  1045. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +32 -0
  1046. package/src/resources/extensions/gsd/bootstrap/system-context.ts +770 -0
  1047. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +103 -0
  1048. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
  1049. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +103 -0
  1050. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1059 -0
  1051. package/src/resources/extensions/gsd/branch-patterns.ts +16 -0
  1052. package/src/resources/extensions/gsd/browser-evidence.ts +29 -0
  1053. package/src/resources/extensions/gsd/cache.ts +40 -0
  1054. package/src/resources/extensions/gsd/captures.ts +571 -0
  1055. package/src/resources/extensions/gsd/changelog.ts +213 -0
  1056. package/src/resources/extensions/gsd/claude-import.ts +705 -0
  1057. package/src/resources/extensions/gsd/clean-root-preflight.ts +564 -0
  1058. package/src/resources/extensions/gsd/closeout-recovery.ts +290 -0
  1059. package/src/resources/extensions/gsd/codebase-generator.ts +616 -0
  1060. package/src/resources/extensions/gsd/collision-diagnostics.ts +332 -0
  1061. package/src/resources/extensions/gsd/commands/catalog.ts +577 -0
  1062. package/src/resources/extensions/gsd/commands/context.ts +159 -0
  1063. package/src/resources/extensions/gsd/commands/dispatcher.ts +101 -0
  1064. package/src/resources/extensions/gsd/commands/handlers/auto.ts +179 -0
  1065. package/src/resources/extensions/gsd/commands/handlers/core.ts +597 -0
  1066. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  1067. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +144 -0
  1068. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
  1069. package/src/resources/extensions/gsd/commands/handlers/ops.ts +359 -0
  1070. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +147 -0
  1071. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +691 -0
  1072. package/src/resources/extensions/gsd/commands/index.ts +20 -0
  1073. package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
  1074. package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
  1075. package/src/resources/extensions/gsd/commands-bootstrap.ts +280 -0
  1076. package/src/resources/extensions/gsd/commands-closeout.ts +109 -0
  1077. package/src/resources/extensions/gsd/commands-cmux.ts +182 -0
  1078. package/src/resources/extensions/gsd/commands-codebase.ts +198 -0
  1079. package/src/resources/extensions/gsd/commands-config.ts +119 -0
  1080. package/src/resources/extensions/gsd/commands-debug.ts +510 -0
  1081. package/src/resources/extensions/gsd/commands-do.ts +110 -0
  1082. package/src/resources/extensions/gsd/commands-eval-review.ts +716 -0
  1083. package/src/resources/extensions/gsd/commands-extensions.ts +1088 -0
  1084. package/src/resources/extensions/gsd/commands-extract-learnings.ts +493 -0
  1085. package/src/resources/extensions/gsd/commands-handlers.ts +510 -0
  1086. package/src/resources/extensions/gsd/commands-inspect.ts +99 -0
  1087. package/src/resources/extensions/gsd/commands-logs.ts +537 -0
  1088. package/src/resources/extensions/gsd/commands-maintenance.ts +544 -0
  1089. package/src/resources/extensions/gsd/commands-mcp-status.ts +402 -0
  1090. package/src/resources/extensions/gsd/commands-memory.ts +551 -0
  1091. package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
  1092. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1848 -0
  1093. package/src/resources/extensions/gsd/commands-rate.ts +55 -0
  1094. package/src/resources/extensions/gsd/commands-scan.ts +126 -0
  1095. package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
  1096. package/src/resources/extensions/gsd/commands-ship.ts +292 -0
  1097. package/src/resources/extensions/gsd/commands-verdict.ts +229 -0
  1098. package/src/resources/extensions/gsd/commands-workflow-templates.ts +684 -0
  1099. package/src/resources/extensions/gsd/commands-worktree.ts +383 -0
  1100. package/src/resources/extensions/gsd/commands.ts +17 -0
  1101. package/src/resources/extensions/gsd/compaction-snapshot.ts +165 -0
  1102. package/src/resources/extensions/gsd/complexity-classifier.ts +331 -0
  1103. package/src/resources/extensions/gsd/component-loader.ts +592 -0
  1104. package/src/resources/extensions/gsd/component-types.ts +362 -0
  1105. package/src/resources/extensions/gsd/config-overlay.ts +331 -0
  1106. package/src/resources/extensions/gsd/constants.ts +69 -0
  1107. package/src/resources/extensions/gsd/context-budget.ts +309 -0
  1108. package/src/resources/extensions/gsd/context-injector.ts +100 -0
  1109. package/src/resources/extensions/gsd/context-masker.ts +74 -0
  1110. package/src/resources/extensions/gsd/context-store.ts +497 -0
  1111. package/src/resources/extensions/gsd/crash-recovery.ts +427 -0
  1112. package/src/resources/extensions/gsd/custom-execution-policy.ts +74 -0
  1113. package/src/resources/extensions/gsd/custom-verification.ts +183 -0
  1114. package/src/resources/extensions/gsd/custom-workflow-engine.ts +274 -0
  1115. package/src/resources/extensions/gsd/dashboard-overlay.ts +684 -0
  1116. package/src/resources/extensions/gsd/db/auto-workers.ts +310 -0
  1117. package/src/resources/extensions/gsd/db/command-queue.ts +149 -0
  1118. package/src/resources/extensions/gsd/db/milestone-leases.ts +300 -0
  1119. package/src/resources/extensions/gsd/db/runtime-kv.ts +127 -0
  1120. package/src/resources/extensions/gsd/db/unit-dispatches.ts +554 -0
  1121. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  1122. package/src/resources/extensions/gsd/db-base-schema.ts +387 -0
  1123. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  1124. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  1125. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  1126. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  1127. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  1128. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  1129. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  1130. package/src/resources/extensions/gsd/db-migration-steps.ts +464 -0
  1131. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  1132. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  1133. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  1134. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  1135. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  1136. package/src/resources/extensions/gsd/db-task-slice-rows.ts +150 -0
  1137. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  1138. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  1139. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  1140. package/src/resources/extensions/gsd/db-writer.ts +966 -0
  1141. package/src/resources/extensions/gsd/debug-logger.ts +178 -0
  1142. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  1143. package/src/resources/extensions/gsd/deep-project-setup-policy.ts +257 -0
  1144. package/src/resources/extensions/gsd/definition-io.ts +18 -0
  1145. package/src/resources/extensions/gsd/definition-loader.ts +469 -0
  1146. package/src/resources/extensions/gsd/delegation-policy.ts +197 -0
  1147. package/src/resources/extensions/gsd/detection.ts +1339 -0
  1148. package/src/resources/extensions/gsd/dev-execution-policy.ts +51 -0
  1149. package/src/resources/extensions/gsd/dev-workflow-engine.ts +110 -0
  1150. package/src/resources/extensions/gsd/diff-context.ts +214 -0
  1151. package/src/resources/extensions/gsd/dispatch-guard.ts +211 -0
  1152. package/src/resources/extensions/gsd/docs/COORDINATION.md +42 -0
  1153. package/src/resources/extensions/gsd/docs/claude-marketplace-import.md +214 -0
  1154. package/src/resources/extensions/gsd/docs/preferences-reference.md +755 -0
  1155. package/src/resources/extensions/gsd/doctor-checks.ts +5 -0
  1156. package/src/resources/extensions/gsd/doctor-engine-checks.ts +196 -0
  1157. package/src/resources/extensions/gsd/doctor-environment.ts +643 -0
  1158. package/src/resources/extensions/gsd/doctor-format.ts +99 -0
  1159. package/src/resources/extensions/gsd/doctor-git-checks.ts +622 -0
  1160. package/src/resources/extensions/gsd/doctor-global-checks.ts +84 -0
  1161. package/src/resources/extensions/gsd/doctor-proactive.ts +488 -0
  1162. package/src/resources/extensions/gsd/doctor-providers.ts +523 -0
  1163. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +793 -0
  1164. package/src/resources/extensions/gsd/doctor-types.ts +134 -0
  1165. package/src/resources/extensions/gsd/doctor.ts +802 -0
  1166. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +233 -0
  1167. package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
  1168. package/src/resources/extensions/gsd/engine-resolver.ts +57 -0
  1169. package/src/resources/extensions/gsd/engine-types.ts +71 -0
  1170. package/src/resources/extensions/gsd/env-utils.ts +31 -0
  1171. package/src/resources/extensions/gsd/error-classifier.ts +188 -0
  1172. package/src/resources/extensions/gsd/error-utils.ts +6 -0
  1173. package/src/resources/extensions/gsd/errors.ts +29 -0
  1174. package/src/resources/extensions/gsd/escalation.ts +369 -0
  1175. package/src/resources/extensions/gsd/eval-review-schema.ts +243 -0
  1176. package/src/resources/extensions/gsd/exec-history.ts +153 -0
  1177. package/src/resources/extensions/gsd/exec-sandbox.ts +333 -0
  1178. package/src/resources/extensions/gsd/execution-policy.ts +43 -0
  1179. package/src/resources/extensions/gsd/exit-command.ts +30 -0
  1180. package/src/resources/extensions/gsd/export-html.ts +1008 -0
  1181. package/src/resources/extensions/gsd/export.ts +318 -0
  1182. package/src/resources/extensions/gsd/extension-manifest.json +33 -0
  1183. package/src/resources/extensions/gsd/file-lock.ts +132 -0
  1184. package/src/resources/extensions/gsd/files.ts +1009 -0
  1185. package/src/resources/extensions/gsd/forensics.ts +1342 -0
  1186. package/src/resources/extensions/gsd/fresh-run-ui.ts +43 -0
  1187. package/src/resources/extensions/gsd/gate-registry.ts +251 -0
  1188. package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
  1189. package/src/resources/extensions/gsd/git-constants.ts +41 -0
  1190. package/src/resources/extensions/gsd/git-self-heal.ts +158 -0
  1191. package/src/resources/extensions/gsd/git-service.ts +1412 -0
  1192. package/src/resources/extensions/gsd/gitignore.ts +336 -0
  1193. package/src/resources/extensions/gsd/graph-context.ts +212 -0
  1194. package/src/resources/extensions/gsd/graph.ts +349 -0
  1195. package/src/resources/extensions/gsd/gsd-command-home.ts +209 -0
  1196. package/src/resources/extensions/gsd/gsd-db.ts +3190 -0
  1197. package/src/resources/extensions/gsd/gsd-home.ts +30 -0
  1198. package/src/resources/extensions/gsd/guided-flow-queue.ts +443 -0
  1199. package/src/resources/extensions/gsd/guided-flow.ts +2887 -0
  1200. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  1201. package/src/resources/extensions/gsd/health-widget-core.ts +140 -0
  1202. package/src/resources/extensions/gsd/health-widget.ts +148 -0
  1203. package/src/resources/extensions/gsd/history.ts +144 -0
  1204. package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
  1205. package/src/resources/extensions/gsd/index.ts +37 -0
  1206. package/src/resources/extensions/gsd/init-wizard.ts +704 -0
  1207. package/src/resources/extensions/gsd/interrupted-session.ts +269 -0
  1208. package/src/resources/extensions/gsd/journal.ts +218 -0
  1209. package/src/resources/extensions/gsd/json-persistence.ts +78 -0
  1210. package/src/resources/extensions/gsd/jsonl-utils.ts +21 -0
  1211. package/src/resources/extensions/gsd/key-manager.ts +1018 -0
  1212. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  1213. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  1214. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  1215. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  1216. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  1217. package/src/resources/extensions/gsd/markdown-renderer.ts +982 -0
  1218. package/src/resources/extensions/gsd/marketplace-discovery.ts +508 -0
  1219. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  1220. package/src/resources/extensions/gsd/mcp-project-config.ts +128 -0
  1221. package/src/resources/extensions/gsd/md-importer.ts +748 -0
  1222. package/src/resources/extensions/gsd/memory-backfill.ts +212 -0
  1223. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  1224. package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
  1225. package/src/resources/extensions/gsd/memory-extractor.ts +434 -0
  1226. package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
  1227. package/src/resources/extensions/gsd/memory-relations.ts +240 -0
  1228. package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
  1229. package/src/resources/extensions/gsd/memory-store.ts +909 -0
  1230. package/src/resources/extensions/gsd/metrics.ts +1040 -0
  1231. package/src/resources/extensions/gsd/migrate/audit.ts +219 -0
  1232. package/src/resources/extensions/gsd/migrate/command.ts +341 -0
  1233. package/src/resources/extensions/gsd/migrate/index.ts +44 -0
  1234. package/src/resources/extensions/gsd/migrate/parser.ts +323 -0
  1235. package/src/resources/extensions/gsd/migrate/parsers.ts +676 -0
  1236. package/src/resources/extensions/gsd/migrate/preview.ts +58 -0
  1237. package/src/resources/extensions/gsd/migrate/safety.ts +149 -0
  1238. package/src/resources/extensions/gsd/migrate/transformer.ts +411 -0
  1239. package/src/resources/extensions/gsd/migrate/types.ts +370 -0
  1240. package/src/resources/extensions/gsd/migrate/validator.ts +55 -0
  1241. package/src/resources/extensions/gsd/migrate/writer.ts +592 -0
  1242. package/src/resources/extensions/gsd/migrate-external.ts +215 -0
  1243. package/src/resources/extensions/gsd/migration-auto-check.ts +121 -0
  1244. package/src/resources/extensions/gsd/milestone-actions.ts +193 -0
  1245. package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
  1246. package/src/resources/extensions/gsd/milestone-id-utils.ts +32 -0
  1247. package/src/resources/extensions/gsd/milestone-ids.ts +136 -0
  1248. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +373 -0
  1249. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  1250. package/src/resources/extensions/gsd/milestone-validation-gates.ts +53 -0
  1251. package/src/resources/extensions/gsd/model-cost-table.ts +89 -0
  1252. package/src/resources/extensions/gsd/model-router.ts +844 -0
  1253. package/src/resources/extensions/gsd/namespaced-registry.ts +467 -0
  1254. package/src/resources/extensions/gsd/namespaced-resolver.ts +307 -0
  1255. package/src/resources/extensions/gsd/native-git-bridge.ts +1447 -0
  1256. package/src/resources/extensions/gsd/native-parser-bridge.ts +267 -0
  1257. package/src/resources/extensions/gsd/notification-overlay.ts +322 -0
  1258. package/src/resources/extensions/gsd/notification-store.ts +342 -0
  1259. package/src/resources/extensions/gsd/notification-widget.ts +69 -0
  1260. package/src/resources/extensions/gsd/notifications.ts +153 -0
  1261. package/src/resources/extensions/gsd/observability-validator.ts +456 -0
  1262. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  1263. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  1264. package/src/resources/extensions/gsd/package.json +11 -0
  1265. package/src/resources/extensions/gsd/parallel-eligibility.ts +248 -0
  1266. package/src/resources/extensions/gsd/parallel-merge.ts +270 -0
  1267. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +507 -0
  1268. package/src/resources/extensions/gsd/parallel-orchestrator.ts +1077 -0
  1269. package/src/resources/extensions/gsd/parsers-legacy.ts +292 -0
  1270. package/src/resources/extensions/gsd/paths.ts +722 -0
  1271. package/src/resources/extensions/gsd/pending-auto-start.ts +81 -0
  1272. package/src/resources/extensions/gsd/phase-anchor.ts +71 -0
  1273. package/src/resources/extensions/gsd/planning-depth.ts +137 -0
  1274. package/src/resources/extensions/gsd/planning-path-scope.ts +45 -0
  1275. package/src/resources/extensions/gsd/plugin-importer.ts +411 -0
  1276. package/src/resources/extensions/gsd/post-execution-checks.ts +665 -0
  1277. package/src/resources/extensions/gsd/post-unit-hooks.ts +86 -0
  1278. package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
  1279. package/src/resources/extensions/gsd/pre-execution-checks.ts +890 -0
  1280. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  1281. package/src/resources/extensions/gsd/preferences-models.ts +572 -0
  1282. package/src/resources/extensions/gsd/preferences-skills.ts +147 -0
  1283. package/src/resources/extensions/gsd/preferences-types.ts +579 -0
  1284. package/src/resources/extensions/gsd/preferences-validation.ts +1453 -0
  1285. package/src/resources/extensions/gsd/preferences.ts +697 -0
  1286. package/src/resources/extensions/gsd/preparation.ts +1419 -0
  1287. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  1288. package/src/resources/extensions/gsd/progress-score.ts +161 -0
  1289. package/src/resources/extensions/gsd/project-research-policy.ts +259 -0
  1290. package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +217 -0
  1291. package/src/resources/extensions/gsd/prompt-loader.ts +248 -0
  1292. package/src/resources/extensions/gsd/prompt-ordering.ts +200 -0
  1293. package/src/resources/extensions/gsd/prompt-validation.ts +157 -0
  1294. package/src/resources/extensions/gsd/prompts/add-tests.md +36 -0
  1295. package/src/resources/extensions/gsd/prompts/complete-milestone.md +91 -0
  1296. package/src/resources/extensions/gsd/prompts/complete-slice.md +49 -0
  1297. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +27 -0
  1298. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  1299. package/src/resources/extensions/gsd/prompts/discuss-headless.md +252 -0
  1300. package/src/resources/extensions/gsd/prompts/discuss.md +368 -0
  1301. package/src/resources/extensions/gsd/prompts/doctor-heal.md +31 -0
  1302. package/src/resources/extensions/gsd/prompts/execute-task.md +73 -0
  1303. package/src/resources/extensions/gsd/prompts/forensics.md +155 -0
  1304. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
  1305. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +116 -0
  1306. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +113 -0
  1307. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +99 -0
  1308. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +74 -0
  1309. package/src/resources/extensions/gsd/prompts/guided-research-decision.md +70 -0
  1310. package/src/resources/extensions/gsd/prompts/guided-research-project.md +102 -0
  1311. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +15 -0
  1312. package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
  1313. package/src/resources/extensions/gsd/prompts/guided-workflow-preferences.md +68 -0
  1314. package/src/resources/extensions/gsd/prompts/heal-skill.md +45 -0
  1315. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +28 -0
  1316. package/src/resources/extensions/gsd/prompts/plan-milestone.md +114 -0
  1317. package/src/resources/extensions/gsd/prompts/plan-slice.md +55 -0
  1318. package/src/resources/extensions/gsd/prompts/queue.md +128 -0
  1319. package/src/resources/extensions/gsd/prompts/quick-task.md +40 -0
  1320. package/src/resources/extensions/gsd/prompts/reactive-execute.md +44 -0
  1321. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +68 -0
  1322. package/src/resources/extensions/gsd/prompts/refine-slice.md +79 -0
  1323. package/src/resources/extensions/gsd/prompts/replan-slice.md +39 -0
  1324. package/src/resources/extensions/gsd/prompts/research-milestone.md +47 -0
  1325. package/src/resources/extensions/gsd/prompts/research-slice.md +58 -0
  1326. package/src/resources/extensions/gsd/prompts/rethink.md +95 -0
  1327. package/src/resources/extensions/gsd/prompts/review-migration.md +66 -0
  1328. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +33 -0
  1329. package/src/resources/extensions/gsd/prompts/run-uat.md +89 -0
  1330. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  1331. package/src/resources/extensions/gsd/prompts/system.md +180 -0
  1332. package/src/resources/extensions/gsd/prompts/triage-captures.md +68 -0
  1333. package/src/resources/extensions/gsd/prompts/validate-milestone.md +88 -0
  1334. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  1335. package/src/resources/extensions/gsd/prompts/workflow-start.md +28 -0
  1336. package/src/resources/extensions/gsd/prompts/worktree-merge.md +125 -0
  1337. package/src/resources/extensions/gsd/provider-error-pause.ts +49 -0
  1338. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  1339. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  1340. package/src/resources/extensions/gsd/queue-order.ts +235 -0
  1341. package/src/resources/extensions/gsd/queue-reorder-ui.ts +295 -0
  1342. package/src/resources/extensions/gsd/quick.ts +297 -0
  1343. package/src/resources/extensions/gsd/reactive-graph.ts +337 -0
  1344. package/src/resources/extensions/gsd/recovery-classification.ts +139 -0
  1345. package/src/resources/extensions/gsd/repo-identity.ts +683 -0
  1346. package/src/resources/extensions/gsd/reports.ts +505 -0
  1347. package/src/resources/extensions/gsd/repository-registry.ts +108 -0
  1348. package/src/resources/extensions/gsd/rethink.ts +164 -0
  1349. package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
  1350. package/src/resources/extensions/gsd/roadmap-slices.ts +294 -0
  1351. package/src/resources/extensions/gsd/root-write-leak-guard.ts +101 -0
  1352. package/src/resources/extensions/gsd/routing-history.ts +286 -0
  1353. package/src/resources/extensions/gsd/rule-registry.ts +599 -0
  1354. package/src/resources/extensions/gsd/rule-types.ts +68 -0
  1355. package/src/resources/extensions/gsd/run-manager.ts +214 -0
  1356. package/src/resources/extensions/gsd/safe-fs.ts +48 -0
  1357. package/src/resources/extensions/gsd/safety/content-validator.ts +98 -0
  1358. package/src/resources/extensions/gsd/safety/destructive-guard.ts +49 -0
  1359. package/src/resources/extensions/gsd/safety/evidence-collector.ts +265 -0
  1360. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +155 -0
  1361. package/src/resources/extensions/gsd/safety/file-change-validator.ts +124 -0
  1362. package/src/resources/extensions/gsd/safety/git-checkpoint.ts +130 -0
  1363. package/src/resources/extensions/gsd/safety/safety-harness.ts +114 -0
  1364. package/src/resources/extensions/gsd/schemas/__fixtures__/valid-project.md +26 -0
  1365. package/src/resources/extensions/gsd/schemas/__fixtures__/valid-requirements.md +57 -0
  1366. package/src/resources/extensions/gsd/schemas/__fixtures__/valid-roadmap.md +19 -0
  1367. package/src/resources/extensions/gsd/schemas/parsers.ts +346 -0
  1368. package/src/resources/extensions/gsd/schemas/validate.ts +452 -0
  1369. package/src/resources/extensions/gsd/service-tier.ts +199 -0
  1370. package/src/resources/extensions/gsd/session-forensics.ts +580 -0
  1371. package/src/resources/extensions/gsd/session-lock.ts +732 -0
  1372. package/src/resources/extensions/gsd/session-model-override.ts +36 -0
  1373. package/src/resources/extensions/gsd/session-status-io.ts +179 -0
  1374. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  1375. package/src/resources/extensions/gsd/shortcut-defs.ts +56 -0
  1376. package/src/resources/extensions/gsd/skill-catalog.ts +1088 -0
  1377. package/src/resources/extensions/gsd/skill-discovery.ts +157 -0
  1378. package/src/resources/extensions/gsd/skill-health.ts +422 -0
  1379. package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
  1380. package/src/resources/extensions/gsd/skill-telemetry.ts +141 -0
  1381. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +242 -0
  1382. package/src/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +83 -0
  1383. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +64 -0
  1384. package/src/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +176 -0
  1385. package/src/resources/extensions/gsd/slice-cadence.ts +411 -0
  1386. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +86 -0
  1387. package/src/resources/extensions/gsd/slice-parallel-eligibility.ts +73 -0
  1388. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +913 -0
  1389. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  1390. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  1391. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +417 -0
  1392. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +66 -0
  1393. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +101 -0
  1394. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  1395. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  1396. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  1397. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  1398. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  1399. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  1400. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +65 -0
  1401. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  1402. package/src/resources/extensions/gsd/state-reconciliation.ts +25 -0
  1403. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  1404. package/src/resources/extensions/gsd/state.ts +1730 -0
  1405. package/src/resources/extensions/gsd/status-guards.ts +41 -0
  1406. package/src/resources/extensions/gsd/structured-data-formatter.ts +146 -0
  1407. package/src/resources/extensions/gsd/sync-lock.ts +152 -0
  1408. package/src/resources/extensions/gsd/templates/PREFERENCES.md +101 -0
  1409. package/src/resources/extensions/gsd/templates/context.md +108 -0
  1410. package/src/resources/extensions/gsd/templates/decisions.md +8 -0
  1411. package/src/resources/extensions/gsd/templates/knowledge.md +19 -0
  1412. package/src/resources/extensions/gsd/templates/milestone-summary.md +81 -0
  1413. package/src/resources/extensions/gsd/templates/milestone-validation.md +74 -0
  1414. package/src/resources/extensions/gsd/templates/plan.md +152 -0
  1415. package/src/resources/extensions/gsd/templates/project.md +41 -0
  1416. package/src/resources/extensions/gsd/templates/reassessment.md +29 -0
  1417. package/src/resources/extensions/gsd/templates/requirements.md +81 -0
  1418. package/src/resources/extensions/gsd/templates/research.md +79 -0
  1419. package/src/resources/extensions/gsd/templates/roadmap.md +131 -0
  1420. package/src/resources/extensions/gsd/templates/runtime.md +21 -0
  1421. package/src/resources/extensions/gsd/templates/secrets-manifest.md +22 -0
  1422. package/src/resources/extensions/gsd/templates/slice-context.md +58 -0
  1423. package/src/resources/extensions/gsd/templates/slice-summary.md +108 -0
  1424. package/src/resources/extensions/gsd/templates/state.md +17 -0
  1425. package/src/resources/extensions/gsd/templates/task-plan.md +95 -0
  1426. package/src/resources/extensions/gsd/templates/task-summary.md +66 -0
  1427. package/src/resources/extensions/gsd/templates/uat.md +54 -0
  1428. package/src/resources/extensions/gsd/tests/active-milestone-id-guard.test.ts +91 -0
  1429. package/src/resources/extensions/gsd/tests/activity-log.test.ts +175 -0
  1430. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +80 -0
  1431. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +296 -0
  1432. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +145 -0
  1433. package/src/resources/extensions/gsd/tests/artifact-validators.test.ts +524 -0
  1434. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +143 -0
  1435. package/src/resources/extensions/gsd/tests/ask-user-questions-dedup.test.ts +120 -0
  1436. package/src/resources/extensions/gsd/tests/atomic-write.test.ts +144 -0
  1437. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +47 -0
  1438. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +89 -0
  1439. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +62 -0
  1440. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +807 -0
  1441. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +457 -0
  1442. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +289 -0
  1443. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +72 -0
  1444. package/src/resources/extensions/gsd/tests/auto-loop-symlink-worktree.test.ts +190 -0
  1445. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +5503 -0
  1446. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  1447. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +61 -0
  1448. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  1449. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  1450. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
  1451. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +479 -0
  1452. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +1300 -0
  1453. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +76 -0
  1454. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +103 -0
  1455. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +759 -0
  1456. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +390 -0
  1457. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +32 -0
  1458. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +60 -0
  1459. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +218 -0
  1460. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +66 -0
  1461. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +74 -0
  1462. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  1463. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1773 -0
  1464. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +48 -0
  1465. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  1466. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +98 -0
  1467. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +59 -0
  1468. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +277 -0
  1469. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +348 -0
  1470. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +45 -0
  1471. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +61 -0
  1472. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +27 -0
  1473. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +26 -0
  1474. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +175 -0
  1475. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +161 -0
  1476. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +49 -0
  1477. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +32 -0
  1478. package/src/resources/extensions/gsd/tests/auto-start-validation-block.test.ts +52 -0
  1479. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +19 -0
  1480. package/src/resources/extensions/gsd/tests/auto-status-message.test.ts +46 -0
  1481. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +31 -0
  1482. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +70 -0
  1483. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +54 -0
  1484. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  1485. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +106 -0
  1486. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +134 -0
  1487. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +80 -0
  1488. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +244 -0
  1489. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +199 -0
  1490. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +171 -0
  1491. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +143 -0
  1492. package/src/resources/extensions/gsd/tests/block-db-writes.test.ts +63 -0
  1493. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +98 -0
  1494. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +23 -0
  1495. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  1496. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +92 -0
  1497. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  1498. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +147 -0
  1499. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +77 -0
  1500. package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +180 -0
  1501. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +290 -0
  1502. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
  1503. package/src/resources/extensions/gsd/tests/capability-router.test.ts +371 -0
  1504. package/src/resources/extensions/gsd/tests/captures.test.ts +524 -0
  1505. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
  1506. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
  1507. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  1508. package/src/resources/extensions/gsd/tests/claude-import-marketplace-discovery.test.ts +191 -0
  1509. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +350 -0
  1510. package/src/resources/extensions/gsd/tests/claude-skill-dirs.test.ts +51 -0
  1511. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +509 -0
  1512. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +76 -0
  1513. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  1514. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  1515. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +101 -0
  1516. package/src/resources/extensions/gsd/tests/cmux.test.ts +333 -0
  1517. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +669 -0
  1518. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +43 -0
  1519. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +506 -0
  1520. package/src/resources/extensions/gsd/tests/collision-diagnostics.test.ts +705 -0
  1521. package/src/resources/extensions/gsd/tests/command-queue.test.ts +141 -0
  1522. package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
  1523. package/src/resources/extensions/gsd/tests/commands-config.test.ts +31 -0
  1524. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +188 -0
  1525. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +178 -0
  1526. package/src/resources/extensions/gsd/tests/commands-do.test.ts +175 -0
  1527. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +612 -0
  1528. package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
  1529. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +663 -0
  1530. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +46 -0
  1531. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
  1532. package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
  1533. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  1534. package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
  1535. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +156 -0
  1536. package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
  1537. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +439 -0
  1538. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +311 -0
  1539. package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +48 -0
  1540. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +136 -0
  1541. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +366 -0
  1542. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  1543. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +743 -0
  1544. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +193 -0
  1545. package/src/resources/extensions/gsd/tests/complete-slice-gate-closure.test.ts +167 -0
  1546. package/src/resources/extensions/gsd/tests/complete-slice-prompt-task-summary-layout.test.ts +18 -0
  1547. package/src/resources/extensions/gsd/tests/complete-slice-string-coercion.test.ts +247 -0
  1548. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +156 -0
  1549. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +556 -0
  1550. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +50 -0
  1551. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +105 -0
  1552. package/src/resources/extensions/gsd/tests/complete-task.test.ts +513 -0
  1553. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +84 -0
  1554. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +61 -0
  1555. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  1556. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +206 -0
  1557. package/src/resources/extensions/gsd/tests/component-loader.test.ts +582 -0
  1558. package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
  1559. package/src/resources/extensions/gsd/tests/context-budget.test.ts +389 -0
  1560. package/src/resources/extensions/gsd/tests/context-injector.test.ts +313 -0
  1561. package/src/resources/extensions/gsd/tests/context-masker.test.ts +122 -0
  1562. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  1563. package/src/resources/extensions/gsd/tests/context-store.test.ts +715 -0
  1564. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +185 -0
  1565. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +120 -0
  1566. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +294 -0
  1567. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +331 -0
  1568. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +709 -0
  1569. package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
  1570. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +902 -0
  1571. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +415 -0
  1572. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  1573. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +483 -0
  1574. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  1575. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +360 -0
  1576. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +23 -0
  1577. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +110 -0
  1578. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  1579. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  1580. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  1581. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  1582. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  1583. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  1584. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  1585. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  1586. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  1587. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  1588. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
  1589. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  1590. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  1591. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  1592. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +95 -0
  1593. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  1594. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  1595. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  1596. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +130 -0
  1597. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  1598. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  1599. package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +152 -0
  1600. package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +221 -0
  1601. package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +230 -0
  1602. package/src/resources/extensions/gsd/tests/db-writer.test.ts +980 -0
  1603. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +942 -0
  1604. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  1605. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +187 -0
  1606. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  1607. package/src/resources/extensions/gsd/tests/decision-scope-cascade.test.ts +370 -0
  1608. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  1609. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  1610. package/src/resources/extensions/gsd/tests/deep-mode-integration.test.ts +406 -0
  1611. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +923 -0
  1612. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +1705 -0
  1613. package/src/resources/extensions/gsd/tests/deep-project-setup-policy.test.ts +193 -0
  1614. package/src/resources/extensions/gsd/tests/defer-milestone-stamp.test.ts +30 -0
  1615. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +65 -0
  1616. package/src/resources/extensions/gsd/tests/deferred-slice-dispatch.test.ts +203 -0
  1617. package/src/resources/extensions/gsd/tests/definition-io.test.ts +57 -0
  1618. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +762 -0
  1619. package/src/resources/extensions/gsd/tests/delegation-policy.test.ts +151 -0
  1620. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +514 -0
  1621. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +133 -0
  1622. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +1388 -0
  1623. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +641 -0
  1624. package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +313 -0
  1625. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +558 -0
  1626. package/src/resources/extensions/gsd/tests/derive-state.test.ts +1049 -0
  1627. package/src/resources/extensions/gsd/tests/detect-stuck-respects-retry.test.ts +173 -0
  1628. package/src/resources/extensions/gsd/tests/detection.test.ts +1367 -0
  1629. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +314 -0
  1630. package/src/resources/extensions/gsd/tests/diff-context.test.ts +136 -0
  1631. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  1632. package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +71 -0
  1633. package/src/resources/extensions/gsd/tests/discuss-command-targeting-5471.test.ts +125 -0
  1634. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +62 -0
  1635. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  1636. package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +45 -0
  1637. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +115 -0
  1638. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +15 -0
  1639. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +170 -0
  1640. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +35 -0
  1641. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +138 -0
  1642. package/src/resources/extensions/gsd/tests/dispatch-backgroundable-annotation.test.ts +55 -0
  1643. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +276 -0
  1644. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +43 -0
  1645. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
  1646. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +446 -0
  1647. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +279 -0
  1648. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +358 -0
  1649. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +206 -0
  1650. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +55 -0
  1651. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +112 -0
  1652. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  1653. package/src/resources/extensions/gsd/tests/doctor-fix-flag.test.ts +92 -0
  1654. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  1655. package/src/resources/extensions/gsd/tests/doctor-heal-fixable-warnings.test.ts +14 -0
  1656. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
  1657. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +828 -0
  1658. package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +47 -0
  1659. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +43 -0
  1660. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +36 -0
  1661. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +149 -0
  1662. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  1663. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +271 -0
  1664. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +531 -0
  1665. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +530 -0
  1666. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
  1667. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +32 -0
  1668. package/src/resources/extensions/gsd/tests/escalation.test.ts +819 -0
  1669. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +53 -0
  1670. package/src/resources/extensions/gsd/tests/eval-review-schema.test.ts +282 -0
  1671. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  1672. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +121 -0
  1673. package/src/resources/extensions/gsd/tests/exec-history.test.ts +252 -0
  1674. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +407 -0
  1675. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
  1676. package/src/resources/extensions/gsd/tests/execute-task-prompt-existing-artifact-guard.test.ts +33 -0
  1677. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +62 -0
  1678. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +187 -0
  1679. package/src/resources/extensions/gsd/tests/exit-command.test.ts +101 -0
  1680. package/src/resources/extensions/gsd/tests/export-html-all.test.ts +116 -0
  1681. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +387 -0
  1682. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +164 -0
  1683. package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +144 -0
  1684. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +43 -0
  1685. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  1686. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +108 -0
  1687. package/src/resources/extensions/gsd/tests/file-lock.test.ts +177 -0
  1688. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +18 -0
  1689. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
  1690. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +103 -0
  1691. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
  1692. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
  1693. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
  1694. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
  1695. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
  1696. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
  1697. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +305 -0
  1698. package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +121 -0
  1699. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +43 -0
  1700. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  1701. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +215 -0
  1702. package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +100 -0
  1703. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +298 -0
  1704. package/src/resources/extensions/gsd/tests/fresh-run-ui.test.ts +65 -0
  1705. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +34 -0
  1706. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +193 -0
  1707. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +246 -0
  1708. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +218 -0
  1709. package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +216 -0
  1710. package/src/resources/extensions/gsd/tests/gate-registry.test.ts +140 -0
  1711. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
  1712. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +156 -0
  1713. package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +103 -0
  1714. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +77 -0
  1715. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +91 -0
  1716. package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
  1717. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +599 -0
  1718. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +134 -0
  1719. package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +117 -0
  1720. package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +226 -0
  1721. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1210 -0
  1722. package/src/resources/extensions/gsd/tests/gsd-home.test.ts +43 -0
  1723. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +114 -0
  1724. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +95 -0
  1725. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
  1726. package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +66 -0
  1727. package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +149 -0
  1728. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +445 -0
  1729. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +146 -0
  1730. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  1731. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +43 -0
  1732. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  1733. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  1734. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  1735. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +147 -0
  1736. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +219 -0
  1737. package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +140 -0
  1738. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  1739. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  1740. package/src/resources/extensions/gsd/tests/handler-worktree-write-isolation.test.ts +57 -0
  1741. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +130 -0
  1742. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  1743. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +350 -0
  1744. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +127 -0
  1745. package/src/resources/extensions/gsd/tests/headless-query.test.ts +184 -0
  1746. package/src/resources/extensions/gsd/tests/health-widget.test.ts +251 -0
  1747. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
  1748. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +56 -0
  1749. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +103 -0
  1750. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
  1751. package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +32 -0
  1752. package/src/resources/extensions/gsd/tests/infra-error.test.ts +129 -0
  1753. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +189 -0
  1754. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +275 -0
  1755. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +16 -0
  1756. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +239 -0
  1757. package/src/resources/extensions/gsd/tests/insert-slice-no-wipe.test.ts +88 -0
  1758. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +199 -0
  1759. package/src/resources/extensions/gsd/tests/integration/atomic-task-closeout.test.ts +72 -0
  1760. package/src/resources/extensions/gsd/tests/integration/auto-preflight.test.ts +38 -0
  1761. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +966 -0
  1762. package/src/resources/extensions/gsd/tests/integration/auto-secrets-gate.test.ts +194 -0
  1763. package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +121 -0
  1764. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +964 -0
  1765. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +430 -0
  1766. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +256 -0
  1767. package/src/resources/extensions/gsd/tests/integration/continue-here.test.ts +281 -0
  1768. package/src/resources/extensions/gsd/tests/integration/doctor-completion-deferral.test.ts +88 -0
  1769. package/src/resources/extensions/gsd/tests/integration/doctor-delimiter-fix.test.ts +83 -0
  1770. package/src/resources/extensions/gsd/tests/integration/doctor-enhancements.test.ts +243 -0
  1771. package/src/resources/extensions/gsd/tests/integration/doctor-environment-worktree.test.ts +164 -0
  1772. package/src/resources/extensions/gsd/tests/integration/doctor-environment.test.ts +403 -0
  1773. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  1774. package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +263 -0
  1775. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +90 -0
  1776. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +954 -0
  1777. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +431 -0
  1778. package/src/resources/extensions/gsd/tests/integration/doctor-roadmap-summary-atomicity.test.ts +123 -0
  1779. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +549 -0
  1780. package/src/resources/extensions/gsd/tests/integration/doctor.test.ts +612 -0
  1781. package/src/resources/extensions/gsd/tests/integration/e2e-workflow-pipeline-integration.test.ts +476 -0
  1782. package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +415 -0
  1783. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +130 -0
  1784. package/src/resources/extensions/gsd/tests/integration/git-self-heal.test.ts +131 -0
  1785. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +2040 -0
  1786. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  1787. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +257 -0
  1788. package/src/resources/extensions/gsd/tests/integration/headless-command.ts +534 -0
  1789. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +474 -0
  1790. package/src/resources/extensions/gsd/tests/integration/inherited-repo-home-dir.test.ts +191 -0
  1791. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +274 -0
  1792. package/src/resources/extensions/gsd/tests/integration/integration-mixed-milestones.test.ts +539 -0
  1793. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +634 -0
  1794. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +169 -0
  1795. package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +77 -0
  1796. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +405 -0
  1797. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +119 -0
  1798. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +669 -0
  1799. package/src/resources/extensions/gsd/tests/integration/parallel-workers-multi-milestone-e2e.test.ts +337 -0
  1800. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +98 -0
  1801. package/src/resources/extensions/gsd/tests/integration/plugin-importer-live.test.ts +481 -0
  1802. package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +161 -0
  1803. package/src/resources/extensions/gsd/tests/integration/queue-reorder-e2e.test.ts +335 -0
  1804. package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +253 -0
  1805. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +689 -0
  1806. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1356 -0
  1807. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +980 -0
  1808. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +832 -0
  1809. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  1810. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +341 -0
  1811. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +369 -0
  1812. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +248 -0
  1813. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +223 -0
  1814. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +71 -0
  1815. package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +119 -0
  1816. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +241 -0
  1817. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +180 -0
  1818. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +19 -0
  1819. package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
  1820. package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +429 -0
  1821. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +1473 -0
  1822. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +179 -0
  1823. package/src/resources/extensions/gsd/tests/journal.test.ts +373 -0
  1824. package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +183 -0
  1825. package/src/resources/extensions/gsd/tests/key-manager.test.ts +501 -0
  1826. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  1827. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  1828. package/src/resources/extensions/gsd/tests/knowledge.test.ts +434 -0
  1829. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +53 -0
  1830. package/src/resources/extensions/gsd/tests/lease-conflict-notice.test.ts +38 -0
  1831. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  1832. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  1833. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  1834. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
  1835. package/src/resources/extensions/gsd/tests/manifest-status.test.ts +274 -0
  1836. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1292 -0
  1837. package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +91 -0
  1838. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
  1839. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  1840. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +89 -0
  1841. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +183 -0
  1842. package/src/resources/extensions/gsd/tests/md-importer.test.ts +416 -0
  1843. package/src/resources/extensions/gsd/tests/measurement.test.ts +531 -0
  1844. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  1845. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  1846. package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
  1847. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +244 -0
  1848. package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
  1849. package/src/resources/extensions/gsd/tests/memory-leak-guards.test.ts +91 -0
  1850. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
  1851. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +79 -0
  1852. package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
  1853. package/src/resources/extensions/gsd/tests/memory-store.test.ts +460 -0
  1854. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +327 -0
  1855. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +303 -0
  1856. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  1857. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +105 -0
  1858. package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +222 -0
  1859. package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +400 -0
  1860. package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +141 -0
  1861. package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +287 -0
  1862. package/src/resources/extensions/gsd/tests/metrics-milestone-scope.test.ts +64 -0
  1863. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +149 -0
  1864. package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +378 -0
  1865. package/src/resources/extensions/gsd/tests/metrics.test.ts +519 -0
  1866. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +165 -0
  1867. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
  1868. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +782 -0
  1869. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +242 -0
  1870. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +651 -0
  1871. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +448 -0
  1872. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +347 -0
  1873. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +361 -0
  1874. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +135 -0
  1875. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
  1876. package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +73 -0
  1877. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +152 -0
  1878. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +364 -0
  1879. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +68 -0
  1880. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +206 -0
  1881. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  1882. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +202 -0
  1883. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  1884. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +122 -0
  1885. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +111 -0
  1886. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +305 -0
  1887. package/src/resources/extensions/gsd/tests/model-router.test.ts +990 -0
  1888. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +90 -0
  1889. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +278 -0
  1890. package/src/resources/extensions/gsd/tests/namespaced-registry.test.ts +1027 -0
  1891. package/src/resources/extensions/gsd/tests/namespaced-resolver.test.ts +671 -0
  1892. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +228 -0
  1893. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
  1894. package/src/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +61 -0
  1895. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +55 -0
  1896. package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +23 -0
  1897. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +200 -0
  1898. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +50 -0
  1899. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +129 -0
  1900. package/src/resources/extensions/gsd/tests/notification-store.test.ts +325 -0
  1901. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +87 -0
  1902. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +134 -0
  1903. package/src/resources/extensions/gsd/tests/notifications.test.ts +134 -0
  1904. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  1905. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +159 -0
  1906. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
  1907. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  1908. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +374 -0
  1909. package/src/resources/extensions/gsd/tests/overrides.test.ts +124 -0
  1910. package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +330 -0
  1911. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +164 -0
  1912. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +273 -0
  1913. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +170 -0
  1914. package/src/resources/extensions/gsd/tests/parallel-milestone-isolation.test.ts +106 -0
  1915. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +114 -0
  1916. package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +736 -0
  1917. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  1918. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +332 -0
  1919. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +308 -0
  1920. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +158 -0
  1921. package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +226 -0
  1922. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +199 -0
  1923. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +157 -0
  1924. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +253 -0
  1925. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +420 -0
  1926. package/src/resources/extensions/gsd/tests/parsers.test.ts +1892 -0
  1927. package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +209 -0
  1928. package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +175 -0
  1929. package/src/resources/extensions/gsd/tests/paths-cache.test.ts +170 -0
  1930. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +121 -0
  1931. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +144 -0
  1932. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +42 -0
  1933. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +24 -0
  1934. package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +83 -0
  1935. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +126 -0
  1936. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +404 -0
  1937. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
  1938. package/src/resources/extensions/gsd/tests/plan-milestone-artifact-verification.test.ts +102 -0
  1939. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  1940. package/src/resources/extensions/gsd/tests/plan-milestone-queue-context.test.ts +48 -0
  1941. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  1942. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  1943. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +71 -0
  1944. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +349 -0
  1945. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
  1946. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +306 -0
  1947. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +712 -0
  1948. package/src/resources/extensions/gsd/tests/plan-task.test.ts +183 -0
  1949. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  1950. package/src/resources/extensions/gsd/tests/planning-depth-setter.test.ts +172 -0
  1951. package/src/resources/extensions/gsd/tests/plugin-importer.test.ts +1383 -0
  1952. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +536 -0
  1953. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +1065 -0
  1954. package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
  1955. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +25 -0
  1956. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +300 -0
  1957. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +567 -0
  1958. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
  1959. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
  1960. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  1961. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +149 -0
  1962. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +275 -0
  1963. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +2246 -0
  1964. package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +244 -0
  1965. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +708 -0
  1966. package/src/resources/extensions/gsd/tests/preferences-formatting.test.ts +87 -0
  1967. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  1968. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +118 -0
  1969. package/src/resources/extensions/gsd/tests/preferences.test.ts +1314 -0
  1970. package/src/resources/extensions/gsd/tests/preflight-context-draft-filter.test.ts +115 -0
  1971. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
  1972. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +222 -0
  1973. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  1974. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +620 -0
  1975. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  1976. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +35 -0
  1977. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +56 -0
  1978. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +277 -0
  1979. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +677 -0
  1980. package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +326 -0
  1981. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +574 -0
  1982. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +387 -0
  1983. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  1984. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +49 -0
  1985. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  1986. package/src/resources/extensions/gsd/tests/prompt-loader-working-directory.test.ts +19 -0
  1987. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  1988. package/src/resources/extensions/gsd/tests/prompt-ordering.test.ts +296 -0
  1989. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  1990. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +91 -0
  1991. package/src/resources/extensions/gsd/tests/prompt-system-gate-coverage.test.ts +208 -0
  1992. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  1993. package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
  1994. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +744 -0
  1995. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  1996. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  1997. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +344 -0
  1998. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +51 -0
  1999. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +39 -0
  2000. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +101 -0
  2001. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +166 -0
  2002. package/src/resources/extensions/gsd/tests/queue-order.test.ts +192 -0
  2003. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  2004. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  2005. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +106 -0
  2006. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +36 -0
  2007. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  2008. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +61 -0
  2009. package/src/resources/extensions/gsd/tests/rate-limit-model-fallback.test.ts +90 -0
  2010. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +511 -0
  2011. package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +363 -0
  2012. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +728 -0
  2013. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +146 -0
  2014. package/src/resources/extensions/gsd/tests/reassess-detection.test.ts +154 -0
  2015. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +442 -0
  2016. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +135 -0
  2017. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  2018. package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +144 -0
  2019. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +161 -0
  2020. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +126 -0
  2021. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +252 -0
  2022. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +442 -0
  2023. package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +131 -0
  2024. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +197 -0
  2025. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  2026. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +774 -0
  2027. package/src/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
  2028. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
  2029. package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -0
  2030. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  2031. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +609 -0
  2032. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +258 -0
  2033. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +101 -0
  2034. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  2035. package/src/resources/extensions/gsd/tests/requirements.test.ts +110 -0
  2036. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +132 -0
  2037. package/src/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +23 -0
  2038. package/src/resources/extensions/gsd/tests/resolve-ts.mjs +9 -0
  2039. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +50 -0
  2040. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +65 -0
  2041. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +102 -0
  2042. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +209 -0
  2043. package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +161 -0
  2044. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +305 -0
  2045. package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +82 -0
  2046. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  2047. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +213 -0
  2048. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +399 -0
  2049. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +464 -0
  2050. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +294 -0
  2051. package/src/resources/extensions/gsd/tests/routing-history.test.ts +229 -0
  2052. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +411 -0
  2053. package/src/resources/extensions/gsd/tests/run-manager.test.ts +229 -0
  2054. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +151 -0
  2055. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +94 -0
  2056. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +94 -0
  2057. package/src/resources/extensions/gsd/tests/runtime-kv.test.ts +120 -0
  2058. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +268 -0
  2059. package/src/resources/extensions/gsd/tests/save-gate-result-render.test.ts +95 -0
  2060. package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
  2061. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  2062. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  2063. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +364 -0
  2064. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  2065. package/src/resources/extensions/gsd/tests/service-tier.test.ts +131 -0
  2066. package/src/resources/extensions/gsd/tests/session-forensics-readonly-classification.test.ts +70 -0
  2067. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +166 -0
  2068. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +379 -0
  2069. package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +224 -0
  2070. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +40 -0
  2071. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +387 -0
  2072. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +304 -0
  2073. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +239 -0
  2074. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +58 -0
  2075. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +182 -0
  2076. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +130 -0
  2077. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +244 -0
  2078. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
  2079. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
  2080. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +352 -0
  2081. package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
  2082. package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +126 -0
  2083. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
  2084. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  2085. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +63 -0
  2086. package/src/resources/extensions/gsd/tests/skipped-validation-completion.test.ts +144 -0
  2087. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +57 -0
  2088. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +301 -0
  2089. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +79 -0
  2090. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +187 -0
  2091. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +92 -0
  2092. package/src/resources/extensions/gsd/tests/slice-parallel-eligibility.test.ts +95 -0
  2093. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +348 -0
  2094. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +124 -0
  2095. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +76 -0
  2096. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +33 -0
  2097. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  2098. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +29 -0
  2099. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +65 -0
  2100. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +45 -0
  2101. package/src/resources/extensions/gsd/tests/stale-milestone-id-reservation.test.ts +79 -0
  2102. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +147 -0
  2103. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +49 -0
  2104. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +152 -0
  2105. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +148 -0
  2106. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +334 -0
  2107. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +203 -0
  2108. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +442 -0
  2109. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +424 -0
  2110. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  2111. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1645 -0
  2112. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1137 -0
  2113. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  2114. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +42 -0
  2115. package/src/resources/extensions/gsd/tests/status-guards.test.ts +50 -0
  2116. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +123 -0
  2117. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +95 -0
  2118. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +18 -0
  2119. package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +216 -0
  2120. package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +285 -0
  2121. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +232 -0
  2122. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +197 -0
  2123. package/src/resources/extensions/gsd/tests/subagent-agent-discovery.test.ts +91 -0
  2124. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +174 -0
  2125. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +226 -0
  2126. package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +121 -0
  2127. package/src/resources/extensions/gsd/tests/symlink-extension-discovery.test.ts +125 -0
  2128. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +145 -0
  2129. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +153 -0
  2130. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +40 -0
  2131. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  2132. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +99 -0
  2133. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +162 -0
  2134. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +98 -0
  2135. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +186 -0
  2136. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +128 -0
  2137. package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
  2138. package/src/resources/extensions/gsd/tests/test-helpers.ts +214 -0
  2139. package/src/resources/extensions/gsd/tests/test-utils.ts +165 -0
  2140. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  2141. package/src/resources/extensions/gsd/tests/token-counter.test.ts +242 -0
  2142. package/src/resources/extensions/gsd/tests/token-profile.test.ts +100 -0
  2143. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +382 -0
  2144. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +179 -0
  2145. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +306 -0
  2146. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +211 -0
  2147. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +155 -0
  2148. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +383 -0
  2149. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +138 -0
  2150. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +612 -0
  2151. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +330 -0
  2152. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +88 -0
  2153. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +153 -0
  2154. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  2155. package/src/resources/extensions/gsd/tests/unborn-branch.test.ts +85 -0
  2156. package/src/resources/extensions/gsd/tests/undo.test.ts +462 -0
  2157. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +203 -0
  2158. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +529 -0
  2159. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +462 -0
  2160. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +326 -0
  2161. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +258 -0
  2162. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +335 -0
  2163. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +112 -0
  2164. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +67 -0
  2165. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
  2166. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +245 -0
  2167. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +85 -0
  2168. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +69 -0
  2169. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +145 -0
  2170. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +241 -0
  2171. package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +58 -0
  2172. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +178 -0
  2173. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +163 -0
  2174. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
  2175. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  2176. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +262 -0
  2177. package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
  2178. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  2179. package/src/resources/extensions/gsd/tests/update-command.test.ts +86 -0
  2180. package/src/resources/extensions/gsd/tests/vacuous-truth-slices.test.ts +115 -0
  2181. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  2182. package/src/resources/extensions/gsd/tests/validate-directory.test.ts +269 -0
  2183. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  2184. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +21 -0
  2185. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +300 -0
  2186. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +371 -0
  2187. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +766 -0
  2188. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +104 -0
  2189. package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +178 -0
  2190. package/src/resources/extensions/gsd/tests/validation.test.ts +72 -0
  2191. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +239 -0
  2192. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  2193. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +601 -0
  2194. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +1265 -0
  2195. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +112 -0
  2196. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  2197. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  2198. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +204 -0
  2199. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +109 -0
  2200. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -0
  2201. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +359 -0
  2202. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +716 -0
  2203. package/src/resources/extensions/gsd/tests/wave1-critical-regressions.test.ts +49 -0
  2204. package/src/resources/extensions/gsd/tests/wave2-events-regressions.test.ts +48 -0
  2205. package/src/resources/extensions/gsd/tests/wave3-session-regressions.test.ts +47 -0
  2206. package/src/resources/extensions/gsd/tests/wave4-write-safety-regressions.test.ts +70 -0
  2207. package/src/resources/extensions/gsd/tests/wave5-consistency-regressions.test.ts +165 -0
  2208. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +97 -0
  2209. package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +56 -0
  2210. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +146 -0
  2211. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  2212. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  2213. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  2214. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  2215. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  2216. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  2217. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +313 -0
  2218. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  2219. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +205 -0
  2220. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  2221. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  2222. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  2223. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +630 -0
  2224. package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +123 -0
  2225. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +92 -0
  2226. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +411 -0
  2227. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +336 -0
  2228. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +76 -0
  2229. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +771 -0
  2230. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +91 -0
  2231. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  2232. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  2233. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +405 -0
  2234. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  2235. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +91 -0
  2236. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  2237. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  2238. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  2239. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +198 -0
  2240. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1397 -0
  2241. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  2242. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  2243. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +154 -0
  2244. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
  2245. package/src/resources/extensions/gsd/tests/workspace-index.test.ts +38 -0
  2246. package/src/resources/extensions/gsd/tests/workspace.test.ts +196 -0
  2247. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +117 -0
  2248. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +202 -0
  2249. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +219 -0
  2250. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +165 -0
  2251. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +440 -0
  2252. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +39 -0
  2253. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  2254. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +207 -0
  2255. package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +109 -0
  2256. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +181 -0
  2257. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +216 -0
  2258. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +397 -0
  2259. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +992 -0
  2260. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +27 -0
  2261. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +290 -0
  2262. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +110 -0
  2263. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +242 -0
  2264. package/src/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +165 -0
  2265. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +180 -0
  2266. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  2267. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +206 -0
  2268. package/src/resources/extensions/gsd/tests/worktree-root-resolution.test.ts +50 -0
  2269. package/src/resources/extensions/gsd/tests/worktree-root.test.ts +69 -0
  2270. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +417 -0
  2271. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
  2272. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +228 -0
  2273. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +134 -0
  2274. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +705 -0
  2275. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +156 -0
  2276. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +85 -0
  2277. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +148 -0
  2278. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +283 -0
  2279. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +206 -0
  2280. package/src/resources/extensions/gsd/tests/worktree.test.ts +304 -0
  2281. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +476 -0
  2282. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +188 -0
  2283. package/src/resources/extensions/gsd/tests/write-gate.test.ts +726 -0
  2284. package/src/resources/extensions/gsd/tests/write-intercept.test.ts +76 -0
  2285. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +25 -0
  2286. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +81 -0
  2287. package/src/resources/extensions/gsd/token-counter.ts +83 -0
  2288. package/src/resources/extensions/gsd/tool-contract.ts +82 -0
  2289. package/src/resources/extensions/gsd/tools/complete-milestone.ts +273 -0
  2290. package/src/resources/extensions/gsd/tools/complete-slice.ts +568 -0
  2291. package/src/resources/extensions/gsd/tools/complete-task.ts +473 -0
  2292. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  2293. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +81 -0
  2294. package/src/resources/extensions/gsd/tools/exec-tool.ts +286 -0
  2295. package/src/resources/extensions/gsd/tools/memory-tools.ts +427 -0
  2296. package/src/resources/extensions/gsd/tools/plan-milestone.ts +370 -0
  2297. package/src/resources/extensions/gsd/tools/plan-slice.ts +443 -0
  2298. package/src/resources/extensions/gsd/tools/plan-task.ts +161 -0
  2299. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +289 -0
  2300. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +152 -0
  2301. package/src/resources/extensions/gsd/tools/reopen-slice.ts +152 -0
  2302. package/src/resources/extensions/gsd/tools/reopen-task.ts +146 -0
  2303. package/src/resources/extensions/gsd/tools/replan-slice.ts +242 -0
  2304. package/src/resources/extensions/gsd/tools/resume-tool.ts +40 -0
  2305. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  2306. package/src/resources/extensions/gsd/tools/validate-milestone.ts +301 -0
  2307. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +991 -0
  2308. package/src/resources/extensions/gsd/triage-resolution.ts +578 -0
  2309. package/src/resources/extensions/gsd/triage-ui.ts +196 -0
  2310. package/src/resources/extensions/gsd/tui/render-kit.ts +153 -0
  2311. package/src/resources/extensions/gsd/types.ts +721 -0
  2312. package/src/resources/extensions/gsd/undo.ts +465 -0
  2313. package/src/resources/extensions/gsd/unit-context-composer.ts +285 -0
  2314. package/src/resources/extensions/gsd/unit-context-manifest.ts +796 -0
  2315. package/src/resources/extensions/gsd/unit-id.ts +14 -0
  2316. package/src/resources/extensions/gsd/unit-ownership.ts +275 -0
  2317. package/src/resources/extensions/gsd/unit-runtime.ts +267 -0
  2318. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +150 -0
  2319. package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
  2320. package/src/resources/extensions/gsd/uok/audit.ts +85 -0
  2321. package/src/resources/extensions/gsd/uok/contracts.ts +306 -0
  2322. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +60 -0
  2323. package/src/resources/extensions/gsd/uok/execution-graph.ts +263 -0
  2324. package/src/resources/extensions/gsd/uok/flags.ts +45 -0
  2325. package/src/resources/extensions/gsd/uok/gate-runner.ts +206 -0
  2326. package/src/resources/extensions/gsd/uok/gitops.ts +80 -0
  2327. package/src/resources/extensions/gsd/uok/kernel.ts +124 -0
  2328. package/src/resources/extensions/gsd/uok/loop-adapter.ts +212 -0
  2329. package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
  2330. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  2331. package/src/resources/extensions/gsd/uok/plan-v2.ts +209 -0
  2332. package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
  2333. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  2334. package/src/resources/extensions/gsd/user-input-boundary.ts +166 -0
  2335. package/src/resources/extensions/gsd/validate-directory.ts +186 -0
  2336. package/src/resources/extensions/gsd/validation-block-guard.ts +83 -0
  2337. package/src/resources/extensions/gsd/validation.ts +45 -0
  2338. package/src/resources/extensions/gsd/verdict-parser.ts +110 -0
  2339. package/src/resources/extensions/gsd/verification-evidence.ts +270 -0
  2340. package/src/resources/extensions/gsd/verification-gate.ts +848 -0
  2341. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  2342. package/src/resources/extensions/gsd/visualizer-data.ts +953 -0
  2343. package/src/resources/extensions/gsd/visualizer-overlay.ts +570 -0
  2344. package/src/resources/extensions/gsd/visualizer-views.ts +1229 -0
  2345. package/src/resources/extensions/gsd/watch/header-renderer.ts +331 -0
  2346. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  2347. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  2348. package/src/resources/extensions/gsd/workflow-engine.ts +38 -0
  2349. package/src/resources/extensions/gsd/workflow-events.ts +166 -0
  2350. package/src/resources/extensions/gsd/workflow-install.ts +422 -0
  2351. package/src/resources/extensions/gsd/workflow-logger.ts +381 -0
  2352. package/src/resources/extensions/gsd/workflow-manifest.ts +260 -0
  2353. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +60 -0
  2354. package/src/resources/extensions/gsd/workflow-mcp.ts +459 -0
  2355. package/src/resources/extensions/gsd/workflow-migration.ts +340 -0
  2356. package/src/resources/extensions/gsd/workflow-plugins.ts +402 -0
  2357. package/src/resources/extensions/gsd/workflow-projections.ts +567 -0
  2358. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  2359. package/src/resources/extensions/gsd/workflow-reconcile.ts +681 -0
  2360. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  2361. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  2362. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +88 -0
  2363. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  2364. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  2365. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  2366. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +75 -0
  2367. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  2368. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  2369. package/src/resources/extensions/gsd/workflow-templates/full-project.md +42 -0
  2370. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +46 -0
  2371. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  2372. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  2373. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  2374. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  2375. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  2376. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  2377. package/src/resources/extensions/gsd/workflow-templates/refactor.md +84 -0
  2378. package/src/resources/extensions/gsd/workflow-templates/registry.json +269 -0
  2379. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  2380. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  2381. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +74 -0
  2382. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +82 -0
  2383. package/src/resources/extensions/gsd/workflow-templates/spike.md +76 -0
  2384. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  2385. package/src/resources/extensions/gsd/workflow-templates.ts +278 -0
  2386. package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
  2387. package/src/resources/extensions/gsd/workspace-index.ts +277 -0
  2388. package/src/resources/extensions/gsd/workspace.ts +95 -0
  2389. package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
  2390. package/src/resources/extensions/gsd/worktree-command.ts +834 -0
  2391. package/src/resources/extensions/gsd/worktree-health.ts +178 -0
  2392. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1989 -0
  2393. package/src/resources/extensions/gsd/worktree-manager.ts +909 -0
  2394. package/src/resources/extensions/gsd/worktree-root.ts +182 -0
  2395. package/src/resources/extensions/gsd/worktree-safety.ts +329 -0
  2396. package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
  2397. package/src/resources/extensions/gsd/worktree-state-projection.ts +447 -0
  2398. package/src/resources/extensions/gsd/worktree-telemetry.ts +366 -0
  2399. package/src/resources/extensions/gsd/worktree.ts +235 -0
  2400. package/src/resources/extensions/gsd/write-intercept.ts +99 -0
  2401. package/src/resources/extensions/mac-tools/extension-manifest.json +16 -0
  2402. package/src/resources/extensions/mac-tools/index.ts +852 -0
  2403. package/src/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
  2404. package/src/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
  2405. package/src/resources/extensions/mcp-client/auth.ts +160 -0
  2406. package/src/resources/extensions/mcp-client/index.ts +526 -0
  2407. package/src/resources/extensions/mcp-client/manager.ts +516 -0
  2408. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
  2409. package/src/resources/extensions/mcp-client/tests/manager.test.ts +165 -0
  2410. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +89 -0
  2411. package/src/resources/extensions/ollama/index.ts +158 -0
  2412. package/src/resources/extensions/ollama/model-capabilities.ts +186 -0
  2413. package/src/resources/extensions/ollama/ndjson-stream.ts +63 -0
  2414. package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +128 -0
  2415. package/src/resources/extensions/ollama/ollama-chat-provider.ts +459 -0
  2416. package/src/resources/extensions/ollama/ollama-client.ts +262 -0
  2417. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  2418. package/src/resources/extensions/ollama/ollama-discovery.ts +134 -0
  2419. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +215 -0
  2420. package/src/resources/extensions/ollama/ollama-tool.ts +287 -0
  2421. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +258 -0
  2422. package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +82 -0
  2423. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
  2424. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  2425. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +55 -0
  2426. package/src/resources/extensions/ollama/thinking-parser.ts +116 -0
  2427. package/src/resources/extensions/ollama/types.ts +153 -0
  2428. package/src/resources/extensions/package.json +3 -0
  2429. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  2430. package/src/resources/extensions/remote-questions/config.ts +126 -0
  2431. package/src/resources/extensions/remote-questions/discord-adapter.ts +148 -0
  2432. package/src/resources/extensions/remote-questions/extension-manifest.json +11 -0
  2433. package/src/resources/extensions/remote-questions/format.ts +315 -0
  2434. package/src/resources/extensions/remote-questions/http-client.ts +76 -0
  2435. package/src/resources/extensions/remote-questions/manager.ts +270 -0
  2436. package/src/resources/extensions/remote-questions/mod.ts +16 -0
  2437. package/src/resources/extensions/remote-questions/notify.ts +90 -0
  2438. package/src/resources/extensions/remote-questions/remote-command.ts +437 -0
  2439. package/src/resources/extensions/remote-questions/slack-adapter.ts +141 -0
  2440. package/src/resources/extensions/remote-questions/status.ts +31 -0
  2441. package/src/resources/extensions/remote-questions/store.ts +81 -0
  2442. package/src/resources/extensions/remote-questions/telegram-adapter.ts +231 -0
  2443. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +256 -0
  2444. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  2445. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  2446. package/src/resources/extensions/remote-questions/types.ts +102 -0
  2447. package/src/resources/extensions/search-the-web/cache.ts +78 -0
  2448. package/src/resources/extensions/search-the-web/command-search-provider.ts +105 -0
  2449. package/src/resources/extensions/search-the-web/extension-manifest.json +13 -0
  2450. package/src/resources/extensions/search-the-web/format.ts +258 -0
  2451. package/src/resources/extensions/search-the-web/http.ts +238 -0
  2452. package/src/resources/extensions/search-the-web/index.ts +64 -0
  2453. package/src/resources/extensions/search-the-web/native-search.ts +276 -0
  2454. package/src/resources/extensions/search-the-web/provider.ts +150 -0
  2455. package/src/resources/extensions/search-the-web/tavily.ts +116 -0
  2456. package/src/resources/extensions/search-the-web/tool-fetch-page.ts +589 -0
  2457. package/src/resources/extensions/search-the-web/tool-llm-context.ts +608 -0
  2458. package/src/resources/extensions/search-the-web/tool-search.ts +677 -0
  2459. package/src/resources/extensions/search-the-web/url-utils.ts +144 -0
  2460. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  2461. package/src/resources/extensions/shared/confirm-ui.ts +126 -0
  2462. package/src/resources/extensions/shared/format-utils.ts +99 -0
  2463. package/src/resources/extensions/shared/frontmatter.ts +117 -0
  2464. package/src/resources/extensions/shared/gsd-phase-state.ts +95 -0
  2465. package/src/resources/extensions/shared/html-shell.ts +412 -0
  2466. package/src/resources/extensions/shared/interview-ui.ts +848 -0
  2467. package/src/resources/extensions/shared/layout-utils.ts +75 -0
  2468. package/src/resources/extensions/shared/mod.ts +31 -0
  2469. package/src/resources/extensions/shared/next-action-ui.ts +226 -0
  2470. package/src/resources/extensions/shared/path-display.ts +19 -0
  2471. package/src/resources/extensions/shared/rtk-session-stats.ts +248 -0
  2472. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  2473. package/src/resources/extensions/shared/rtk.ts +98 -0
  2474. package/src/resources/extensions/shared/sanitize.ts +55 -0
  2475. package/src/resources/extensions/shared/terminal.ts +28 -0
  2476. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +161 -0
  2477. package/src/resources/extensions/shared/tests/format-utils.test.ts +155 -0
  2478. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +90 -0
  2479. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +198 -0
  2480. package/src/resources/extensions/shared/tests/interview-preview.test.ts +185 -0
  2481. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +144 -0
  2482. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  2483. package/src/resources/extensions/shared/tui.ts +11 -0
  2484. package/src/resources/extensions/shared/ui.ts +401 -0
  2485. package/src/resources/extensions/slash-commands/audit.ts +89 -0
  2486. package/src/resources/extensions/slash-commands/clear.ts +10 -0
  2487. package/src/resources/extensions/slash-commands/create-extension.ts +311 -0
  2488. package/src/resources/extensions/slash-commands/create-slash-command.ts +234 -0
  2489. package/src/resources/extensions/slash-commands/extension-manifest.json +11 -0
  2490. package/src/resources/extensions/slash-commands/index.ts +12 -0
  2491. package/src/resources/extensions/subagent/agents.ts +166 -0
  2492. package/src/resources/extensions/subagent/extension-manifest.json +13 -0
  2493. package/src/resources/extensions/subagent/index.ts +1938 -0
  2494. package/src/resources/extensions/subagent/isolation.ts +504 -0
  2495. package/src/resources/extensions/subagent/launch.ts +131 -0
  2496. package/src/resources/extensions/subagent/run-store.ts +218 -0
  2497. package/src/resources/extensions/subagent/tests/agents-conflicts.test.ts +33 -0
  2498. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  2499. package/src/resources/extensions/subagent/tests/model-override.test.ts +55 -0
  2500. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  2501. package/src/resources/extensions/subagent/worker-registry.ts +100 -0
  2502. package/src/resources/extensions/ttsr/extension-manifest.json +11 -0
  2503. package/src/resources/extensions/ttsr/index.ts +168 -0
  2504. package/src/resources/extensions/ttsr/rule-loader.ts +75 -0
  2505. package/src/resources/extensions/ttsr/ttsr-interrupt.md +6 -0
  2506. package/src/resources/extensions/ttsr/ttsr-manager.ts +465 -0
  2507. package/src/resources/extensions/universal-config/discovery.ts +104 -0
  2508. package/src/resources/extensions/universal-config/extension-manifest.json +13 -0
  2509. package/src/resources/extensions/universal-config/format.ts +191 -0
  2510. package/src/resources/extensions/universal-config/index.ts +120 -0
  2511. package/src/resources/extensions/universal-config/package.json +11 -0
  2512. package/src/resources/extensions/universal-config/scanners.ts +642 -0
  2513. package/src/resources/extensions/universal-config/tests/discovery.test.ts +119 -0
  2514. package/src/resources/extensions/universal-config/tests/format.test.ts +127 -0
  2515. package/src/resources/extensions/universal-config/tests/scanners.test.ts +456 -0
  2516. package/src/resources/extensions/universal-config/tools.ts +60 -0
  2517. package/src/resources/extensions/universal-config/types.ts +135 -0
  2518. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  2519. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  2520. package/src/resources/extensions/visual-brief/index.ts +8 -0
  2521. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  2522. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  2523. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  2524. package/src/resources/extensions/voice/extension-manifest.json +12 -0
  2525. package/src/resources/extensions/voice/index.ts +264 -0
  2526. package/src/resources/extensions/voice/linux-ready.ts +86 -0
  2527. package/src/resources/extensions/voice/speech-recognizer.py +504 -0
  2528. package/src/resources/extensions/voice/speech-recognizer.swift +154 -0
  2529. package/src/resources/extensions/voice/tests/linux-ready.test.ts +140 -0
  2530. package/src/resources/skills/accessibility/SKILL.md +522 -0
  2531. package/src/resources/skills/accessibility/references/WCAG.md +162 -0
  2532. package/src/resources/skills/agent-browser/SKILL.md +517 -0
  2533. package/src/resources/skills/agent-browser/references/authentication.md +202 -0
  2534. package/src/resources/skills/agent-browser/references/commands.md +263 -0
  2535. package/src/resources/skills/agent-browser/references/profiling.md +120 -0
  2536. package/src/resources/skills/agent-browser/references/proxy-support.md +194 -0
  2537. package/src/resources/skills/agent-browser/references/session-management.md +193 -0
  2538. package/src/resources/skills/agent-browser/references/snapshot-refs.md +194 -0
  2539. package/src/resources/skills/agent-browser/references/video-recording.md +173 -0
  2540. package/src/resources/skills/agent-browser/templates/authenticated-session.sh +105 -0
  2541. package/src/resources/skills/agent-browser/templates/capture-workflow.sh +69 -0
  2542. package/src/resources/skills/agent-browser/templates/form-automation.sh +62 -0
  2543. package/src/resources/skills/api-design/SKILL.md +190 -0
  2544. package/src/resources/skills/best-practices/SKILL.md +583 -0
  2545. package/src/resources/skills/btw/SKILL.md +42 -0
  2546. package/src/resources/skills/code-optimizer/SKILL.md +160 -0
  2547. package/src/resources/skills/code-optimizer/references/algorithmic-complexity.md +66 -0
  2548. package/src/resources/skills/code-optimizer/references/build-compilation.md +90 -0
  2549. package/src/resources/skills/code-optimizer/references/bundle-dependencies.md +82 -0
  2550. package/src/resources/skills/code-optimizer/references/caching-memoization.md +76 -0
  2551. package/src/resources/skills/code-optimizer/references/concurrency-async.md +80 -0
  2552. package/src/resources/skills/code-optimizer/references/config-infra.md +71 -0
  2553. package/src/resources/skills/code-optimizer/references/data-structures.md +80 -0
  2554. package/src/resources/skills/code-optimizer/references/database-queries.md +76 -0
  2555. package/src/resources/skills/code-optimizer/references/dead-code-redundancy.md +84 -0
  2556. package/src/resources/skills/code-optimizer/references/error-resilience.md +80 -0
  2557. package/src/resources/skills/code-optimizer/references/io-network.md +89 -0
  2558. package/src/resources/skills/code-optimizer/references/logging-observability.md +64 -0
  2559. package/src/resources/skills/code-optimizer/references/memory-resources.md +66 -0
  2560. package/src/resources/skills/code-optimizer/references/rendering-ui.md +90 -0
  2561. package/src/resources/skills/code-optimizer/references/security-performance.md +68 -0
  2562. package/src/resources/skills/core-web-vitals/SKILL.md +441 -0
  2563. package/src/resources/skills/core-web-vitals/references/LCP.md +208 -0
  2564. package/src/resources/skills/create-gsd-extension/SKILL.md +93 -0
  2565. package/src/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
  2566. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
  2567. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
  2568. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
  2569. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
  2570. package/src/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
  2571. package/src/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
  2572. package/src/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
  2573. package/src/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
  2574. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +37 -0
  2575. package/src/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
  2576. package/src/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
  2577. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
  2578. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
  2579. package/src/resources/skills/create-gsd-extension/references/state-management.md +70 -0
  2580. package/src/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
  2581. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
  2582. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
  2583. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +104 -0
  2584. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
  2585. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +176 -0
  2586. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +76 -0
  2587. package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
  2588. package/src/resources/skills/create-skill/SKILL.md +186 -0
  2589. package/src/resources/skills/create-skill/references/api-security.md +226 -0
  2590. package/src/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
  2591. package/src/resources/skills/create-skill/references/common-patterns.md +595 -0
  2592. package/src/resources/skills/create-skill/references/core-principles.md +437 -0
  2593. package/src/resources/skills/create-skill/references/executable-code.md +175 -0
  2594. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
  2595. package/src/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
  2596. package/src/resources/skills/create-skill/references/recommended-structure.md +168 -0
  2597. package/src/resources/skills/create-skill/references/skill-structure.md +372 -0
  2598. package/src/resources/skills/create-skill/references/use-xml-tags.md +466 -0
  2599. package/src/resources/skills/create-skill/references/using-scripts.md +113 -0
  2600. package/src/resources/skills/create-skill/references/using-templates.md +112 -0
  2601. package/src/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
  2602. package/src/resources/skills/create-skill/templates/router-skill.md +73 -0
  2603. package/src/resources/skills/create-skill/templates/simple-skill.md +33 -0
  2604. package/src/resources/skills/create-skill/workflows/add-reference.md +96 -0
  2605. package/src/resources/skills/create-skill/workflows/add-script.md +93 -0
  2606. package/src/resources/skills/create-skill/workflows/add-template.md +74 -0
  2607. package/src/resources/skills/create-skill/workflows/add-workflow.md +120 -0
  2608. package/src/resources/skills/create-skill/workflows/audit-skill.md +148 -0
  2609. package/src/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
  2610. package/src/resources/skills/create-skill/workflows/get-guidance.md +121 -0
  2611. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
  2612. package/src/resources/skills/create-skill/workflows/verify-skill.md +204 -0
  2613. package/src/resources/skills/create-workflow/SKILL.md +130 -0
  2614. package/src/resources/skills/create-workflow/references/feature-patterns.md +128 -0
  2615. package/src/resources/skills/create-workflow/references/verification-policies.md +76 -0
  2616. package/src/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
  2617. package/src/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
  2618. package/src/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
  2619. package/src/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
  2620. package/src/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
  2621. package/src/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
  2622. package/src/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
  2623. package/src/resources/skills/debug-like-expert/SKILL.md +231 -0
  2624. package/src/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
  2625. package/src/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
  2626. package/src/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
  2627. package/src/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
  2628. package/src/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
  2629. package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
  2630. package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
  2631. package/src/resources/skills/design-an-interface/SKILL.md +102 -0
  2632. package/src/resources/skills/forensics/SKILL.md +153 -0
  2633. package/src/resources/skills/frontend-design/SKILL.md +45 -0
  2634. package/src/resources/skills/github-workflows/SKILL.md +90 -0
  2635. package/src/resources/skills/github-workflows/references/gh/SKILL.md +276 -0
  2636. package/src/resources/skills/github-workflows/references/gh/references/issue-stories.md +204 -0
  2637. package/src/resources/skills/github-workflows/references/gh/references/labels.md +170 -0
  2638. package/src/resources/skills/github-workflows/references/gh/references/milestones.md +158 -0
  2639. package/src/resources/skills/github-workflows/references/gh/references/projects-v2.md +177 -0
  2640. package/src/resources/skills/github-workflows/references/gh/scripts/experiment_cleanup.py +191 -0
  2641. package/src/resources/skills/github-workflows/references/gh/scripts/github_project_setup.py +799 -0
  2642. package/src/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  2643. package/src/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  2644. package/src/resources/skills/grill-me/SKILL.md +93 -0
  2645. package/src/resources/skills/handoff/SKILL.md +121 -0
  2646. package/src/resources/skills/lint/SKILL.md +145 -0
  2647. package/src/resources/skills/make-interfaces-feel-better/SKILL.md +122 -0
  2648. package/src/resources/skills/make-interfaces-feel-better/animations.md +379 -0
  2649. package/src/resources/skills/make-interfaces-feel-better/performance.md +88 -0
  2650. package/src/resources/skills/make-interfaces-feel-better/surfaces.md +247 -0
  2651. package/src/resources/skills/make-interfaces-feel-better/typography.md +123 -0
  2652. package/src/resources/skills/observability/SKILL.md +174 -0
  2653. package/src/resources/skills/react-best-practices/README.md +123 -0
  2654. package/src/resources/skills/react-best-practices/SKILL.md +136 -0
  2655. package/src/resources/skills/react-best-practices/metadata.json +15 -0
  2656. package/src/resources/skills/react-best-practices/rules/_sections.md +46 -0
  2657. package/src/resources/skills/react-best-practices/rules/_template.md +28 -0
  2658. package/src/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  2659. package/src/resources/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  2660. package/src/resources/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  2661. package/src/resources/skills/react-best-practices/rules/async-api-routes.md +38 -0
  2662. package/src/resources/skills/react-best-practices/rules/async-defer-await.md +80 -0
  2663. package/src/resources/skills/react-best-practices/rules/async-dependencies.md +51 -0
  2664. package/src/resources/skills/react-best-practices/rules/async-parallel.md +28 -0
  2665. package/src/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  2666. package/src/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  2667. package/src/resources/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  2668. package/src/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  2669. package/src/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  2670. package/src/resources/skills/react-best-practices/rules/bundle-preload.md +50 -0
  2671. package/src/resources/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  2672. package/src/resources/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
  2673. package/src/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  2674. package/src/resources/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  2675. package/src/resources/skills/react-best-practices/rules/js-batch-dom-css.md +107 -0
  2676. package/src/resources/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  2677. package/src/resources/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  2678. package/src/resources/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  2679. package/src/resources/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  2680. package/src/resources/skills/react-best-practices/rules/js-early-exit.md +50 -0
  2681. package/src/resources/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  2682. package/src/resources/skills/react-best-practices/rules/js-index-maps.md +37 -0
  2683. package/src/resources/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  2684. package/src/resources/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  2685. package/src/resources/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  2686. package/src/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  2687. package/src/resources/skills/react-best-practices/rules/rendering-activity.md +26 -0
  2688. package/src/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  2689. package/src/resources/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  2690. package/src/resources/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  2691. package/src/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  2692. package/src/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  2693. package/src/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  2694. package/src/resources/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  2695. package/src/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  2696. package/src/resources/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  2697. package/src/resources/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  2698. package/src/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  2699. package/src/resources/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  2700. package/src/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  2701. package/src/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  2702. package/src/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  2703. package/src/resources/skills/react-best-practices/rules/rerender-memo.md +44 -0
  2704. package/src/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  2705. package/src/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  2706. package/src/resources/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  2707. package/src/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  2708. package/src/resources/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  2709. package/src/resources/skills/react-best-practices/rules/server-auth-actions.md +96 -0
  2710. package/src/resources/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  2711. package/src/resources/skills/react-best-practices/rules/server-cache-react.md +76 -0
  2712. package/src/resources/skills/react-best-practices/rules/server-dedup-props.md +65 -0
  2713. package/src/resources/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
  2714. package/src/resources/skills/react-best-practices/rules/server-serialization.md +38 -0
  2715. package/src/resources/skills/review/SKILL.md +218 -0
  2716. package/src/resources/skills/security-review/SKILL.md +181 -0
  2717. package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
  2718. package/src/resources/skills/tdd/SKILL.md +112 -0
  2719. package/src/resources/skills/test/SKILL.md +204 -0
  2720. package/src/resources/skills/userinterface-wiki/SKILL.md +253 -0
  2721. package/src/resources/skills/userinterface-wiki/rules/_sections.md +66 -0
  2722. package/src/resources/skills/userinterface-wiki/rules/_template.md +24 -0
  2723. package/src/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
  2724. package/src/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
  2725. package/src/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
  2726. package/src/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
  2727. package/src/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
  2728. package/src/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
  2729. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
  2730. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
  2731. package/src/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
  2732. package/src/resources/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
  2733. package/src/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
  2734. package/src/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
  2735. package/src/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
  2736. package/src/resources/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
  2737. package/src/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
  2738. package/src/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
  2739. package/src/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
  2740. package/src/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
  2741. package/src/resources/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
  2742. package/src/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
  2743. package/src/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
  2744. package/src/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
  2745. package/src/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
  2746. package/src/resources/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
  2747. package/src/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
  2748. package/src/resources/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
  2749. package/src/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
  2750. package/src/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
  2751. package/src/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
  2752. package/src/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
  2753. package/src/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
  2754. package/src/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
  2755. package/src/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
  2756. package/src/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
  2757. package/src/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
  2758. package/src/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
  2759. package/src/resources/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
  2760. package/src/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
  2761. package/src/resources/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
  2762. package/src/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
  2763. package/src/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
  2764. package/src/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
  2765. package/src/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
  2766. package/src/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
  2767. package/src/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
  2768. package/src/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
  2769. package/src/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
  2770. package/src/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
  2771. package/src/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
  2772. package/src/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
  2773. package/src/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
  2774. package/src/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
  2775. package/src/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
  2776. package/src/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
  2777. package/src/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
  2778. package/src/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
  2779. package/src/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
  2780. package/src/resources/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
  2781. package/src/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
  2782. package/src/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
  2783. package/src/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
  2784. package/src/resources/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
  2785. package/src/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
  2786. package/src/resources/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
  2787. package/src/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
  2788. package/src/resources/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
  2789. package/src/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
  2790. package/src/resources/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
  2791. package/src/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
  2792. package/src/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
  2793. package/src/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
  2794. package/src/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
  2795. package/src/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
  2796. package/src/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
  2797. package/src/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
  2798. package/src/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
  2799. package/src/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
  2800. package/src/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
  2801. package/src/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
  2802. package/src/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
  2803. package/src/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
  2804. package/src/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
  2805. package/src/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
  2806. package/src/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
  2807. package/src/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
  2808. package/src/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
  2809. package/src/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
  2810. package/src/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
  2811. package/src/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
  2812. package/src/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
  2813. package/src/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
  2814. package/src/resources/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
  2815. package/src/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
  2816. package/src/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
  2817. package/src/resources/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
  2818. package/src/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
  2819. package/src/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
  2820. package/src/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
  2821. package/src/resources/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
  2822. package/src/resources/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
  2823. package/src/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
  2824. package/src/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
  2825. package/src/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
  2826. package/src/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
  2827. package/src/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
  2828. package/src/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
  2829. package/src/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
  2830. package/src/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
  2831. package/src/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
  2832. package/src/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
  2833. package/src/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
  2834. package/src/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
  2835. package/src/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
  2836. package/src/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
  2837. package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
  2838. package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
  2839. package/src/resources/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
  2840. package/src/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
  2841. package/src/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
  2842. package/src/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
  2843. package/src/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
  2844. package/src/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
  2845. package/src/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
  2846. package/src/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
  2847. package/src/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
  2848. package/src/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
  2849. package/src/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
  2850. package/src/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
  2851. package/src/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
  2852. package/src/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
  2853. package/src/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
  2854. package/src/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
  2855. package/src/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
  2856. package/src/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
  2857. package/src/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
  2858. package/src/resources/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
  2859. package/src/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
  2860. package/src/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
  2861. package/src/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
  2862. package/src/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
  2863. package/src/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
  2864. package/src/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
  2865. package/src/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
  2866. package/src/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
  2867. package/src/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
  2868. package/src/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
  2869. package/src/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
  2870. package/src/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
  2871. package/src/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
  2872. package/src/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
  2873. package/src/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
  2874. package/src/resources/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
  2875. package/src/resources/skills/verify-before-complete/SKILL.md +98 -0
  2876. package/src/resources/skills/web-design-guidelines/SKILL.md +39 -0
  2877. package/src/resources/skills/web-quality-audit/SKILL.md +168 -0
  2878. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +91 -0
  2879. package/src/resources/skills/write-docs/SKILL.md +82 -0
  2880. package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
@@ -0,0 +1,3190 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: GSD database facade, schema, migrations, and single-writer write API.
3
+ // GSD Database Abstraction Layer
4
+ // Provides a SQLite database with provider fallback chain:
5
+ // node:sqlite (built-in) → better-sqlite3 (npm) → null (unavailable)
6
+ //
7
+ // Exposes a unified sync API for decisions and requirements storage.
8
+ // Schema is initialized on first open with WAL mode for file-backed DBs.
9
+ //
10
+ // ─── Single-writer invariant ─────────────────────────────────────────────
11
+ // This file is the ONLY place in the codebase that issues write SQL
12
+ // (INSERT / UPDATE / DELETE / REPLACE / BEGIN-COMMIT transactions) against
13
+ // the engine database at `.gsd/gsd.db`. All other modules must call the
14
+ // typed wrappers exported here. The structural test
15
+ // `tests/single-writer-invariant.test.ts` fails CI if a new bypass appears.
16
+ //
17
+ // `_getAdapter()` is retained for read-only SELECTs in query modules
18
+ // (context-store, memory-store queries, doctor checks, projections).
19
+ // Do NOT use it for writes — add a wrapper here instead.
20
+ //
21
+ // The separate `.gsd/unit-claims.db` managed by `unit-ownership.ts` is an
22
+ // intentionally independent store for cross-worktree claim races and is
23
+ // excluded from this invariant.
24
+
25
+ import { createRequire } from "node:module";
26
+ import { createHash } from "node:crypto";
27
+ import { existsSync, copyFileSync, mkdirSync, realpathSync } from "node:fs";
28
+ import { dirname } from "node:path";
29
+ import type { Decision, Requirement, GateRow, GateId, GateScope, GateStatus, GateVerdict } from "./types.js";
30
+ import { GSDError, GSD_STALE_STATE } from "./errors.js";
31
+ import type { GsdWorkspace, MilestoneScope } from "./workspace.js";
32
+ import { getGateIdsForTurn, type OwnerTurn } from "./gate-registry.js";
33
+ import { logError, logWarning } from "./workflow-logger.js";
34
+ import { createDbAdapter, type DbAdapter } from "./db-adapter.js";
35
+ import { createBaseSchemaObjects } from "./db-base-schema.js";
36
+ import { createCoordinationTablesV24 } from "./db-coordination-schema.js";
37
+ import { createDbConnectionCache, type DbConnectionCacheEntry } from "./db-connection-cache.js";
38
+ import {
39
+ emptyTaskStatusCounts,
40
+ rowToActiveTaskSummary,
41
+ rowToIdStatusSummary,
42
+ rowToTaskStatusCounts,
43
+ rowsToStringColumn,
44
+ type ActiveTaskSummary,
45
+ type IdStatusSummary,
46
+ type TaskStatusCounts,
47
+ } from "./db-lightweight-query-rows.js";
48
+ import {
49
+ rowToActiveDecision,
50
+ rowToActiveRequirement,
51
+ rowToDecision,
52
+ rowToRequirement,
53
+ rowsToRequirementCounts,
54
+ } from "./db-decision-requirement-rows.js";
55
+ import { rowToGate } from "./db-gate-rows.js";
56
+ import { rowToArtifact, rowToMilestone, type ArtifactRow, type MilestoneRow } from "./db-milestone-artifact-rows.js";
57
+ import { backupDatabaseBeforeMigration } from "./db-migration-backup.js";
58
+ import {
59
+ applyMigrationV2Artifacts,
60
+ applyMigrationV3Memories,
61
+ applyMigrationV4DecisionMadeBy,
62
+ applyMigrationV5HierarchyTables,
63
+ applyMigrationV6SliceSummaries,
64
+ applyMigrationV7Dependencies,
65
+ applyMigrationV8PlanningFields,
66
+ applyMigrationV9Ordering,
67
+ applyMigrationV10ReplanTrigger,
68
+ applyMigrationV11TaskPlanning,
69
+ applyMigrationV12QualityGates,
70
+ applyMigrationV13HotPathIndexes,
71
+ applyMigrationV14SliceDependencies,
72
+ applyMigrationV15AuditTables,
73
+ applyMigrationV16EscalationSource,
74
+ applyMigrationV17TaskEscalation,
75
+ applyMigrationV18MemorySources,
76
+ applyMigrationV19MemoryFts,
77
+ applyMigrationV20MemoryRelations,
78
+ applyMigrationV21StructuredMemories,
79
+ applyMigrationV22QualityGateRepair,
80
+ applyMigrationV23MilestoneQueue,
81
+ applyMigrationV26MilestoneCommitAttributions,
82
+ applyMigrationV27ArtifactHash,
83
+ applyMigrationV28MemoryLastHitAt,
84
+ applyMigrationV29RepositoryTargets,
85
+ } from "./db-migration-steps.js";
86
+ import { isMemoriesFtsAvailableSchema, tryCreateMemoriesFtsSchema } from "./db-memory-fts-schema.js";
87
+ import { createDbOpenState, type DbOpenPhase } from "./db-open-state.js";
88
+ import { createRuntimeKvTableV25 } from "./db-runtime-kv-schema.js";
89
+ import { ensureColumn, getCurrentSchemaVersion, recordSchemaVersion } from "./db-schema-metadata.js";
90
+ import { rowToSlice, rowToTask, type SliceRow, type TaskRow } from "./db-task-slice-rows.js";
91
+ import { createDbTransactionRunner } from "./db-transaction.js";
92
+ import { ensureVerificationEvidenceDedupIndex } from "./db-verification-evidence-schema.js";
93
+ import { createSqliteProviderLoader, suppressSqliteWarning, type DbProviderName, type SqliteFallbackOpen } from "./db-provider.js";
94
+ // Type-only import to avoid a circular runtime dep. The runtime side of
95
+ // workflow-manifest.ts depends on this file, but the StateManifest type is
96
+ // pure structure with no runtime coupling.
97
+ import type { StateManifest } from "./workflow-manifest.js";
98
+
99
+ const _require = createRequire(import.meta.url);
100
+ type ProviderName = DbProviderName;
101
+
102
+ export type { ArtifactRow, MilestoneRow } from "./db-milestone-artifact-rows.js";
103
+ export type { ActiveTaskSummary, IdStatusSummary, TaskStatusCounts } from "./db-lightweight-query-rows.js";
104
+ export type { SliceRow, TaskRow } from "./db-task-slice-rows.js";
105
+
106
+ const providerLoader = createSqliteProviderLoader({
107
+ requireModule: (id: string) => _require(id),
108
+ suppressSqliteWarning,
109
+ nodeVersion: process.versions.node,
110
+ writeStderr: (message: string) => process.stderr.write(message),
111
+ });
112
+
113
+ export const SCHEMA_VERSION = 29;
114
+ const TERMINAL_STATUS_SQL = "'complete', 'done', 'skipped', 'closed'";
115
+
116
+ function initSchema(db: DbAdapter, fileBacked: boolean, dbPath: string | null): void {
117
+ const conservativeFilePragmas = fileBacked && _isLikelyWslDrvFsPathForTest(dbPath);
118
+ if (fileBacked) db.exec(conservativeFilePragmas ? "PRAGMA journal_mode=DELETE" : "PRAGMA journal_mode=WAL");
119
+ if (fileBacked) db.exec("PRAGMA busy_timeout = 5000");
120
+ if (fileBacked) db.exec(conservativeFilePragmas ? "PRAGMA synchronous = FULL" : "PRAGMA synchronous = NORMAL");
121
+ if (fileBacked) db.exec("PRAGMA auto_vacuum = INCREMENTAL");
122
+ if (fileBacked) db.exec("PRAGMA cache_size = -8000"); // 8 MB page cache
123
+ if (fileBacked && !conservativeFilePragmas && process.platform !== "darwin") db.exec("PRAGMA mmap_size = 67108864"); // 64 MB mmap
124
+ db.exec("PRAGMA temp_store = MEMORY");
125
+ db.exec("PRAGMA foreign_keys = ON");
126
+
127
+ db.exec("BEGIN");
128
+ try {
129
+ createBaseSchemaObjects(db, {
130
+ tryCreateMemoriesFts,
131
+ ensureVerificationEvidenceDedupIndex,
132
+ });
133
+
134
+ const existing = db.prepare("SELECT count(*) as cnt FROM schema_version").get();
135
+ if (existing && (existing["cnt"] as number) === 0) {
136
+ createCoordinationTablesV24(db);
137
+ createRuntimeKvTableV25(db);
138
+
139
+ // Fresh install — all tables are created above with the full current schema,
140
+ // so it is safe to create all migration-specific indexes here. For existing
141
+ // databases these indexes are created inside the individual migration guards
142
+ // in migrateSchema() after the corresponding columns have been added.
143
+ db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_escalation_pending ON tasks(milestone_id, slice_id, escalation_pending)");
144
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope)");
145
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_kind ON memory_sources(kind)");
146
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_sources_scope ON memory_sources(scope)");
147
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_from ON memory_relations(from_id)");
148
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memory_relations_to ON memory_relations(to_id)");
149
+
150
+ recordSchemaVersion(db, SCHEMA_VERSION);
151
+ }
152
+
153
+ db.exec("COMMIT");
154
+ } catch (err) {
155
+ db.exec("ROLLBACK");
156
+ throw err;
157
+ }
158
+
159
+ migrateSchema(db);
160
+ }
161
+
162
+ export function _isLikelyWslDrvFsPathForTest(dbPath: string | null): boolean {
163
+ if (!dbPath || process.platform !== "linux") return false;
164
+ const drvFsPathPattern = /^\/mnt\/[a-z](?:\/|$)/i;
165
+ if (drvFsPathPattern.test(dbPath)) return true;
166
+ try {
167
+ return drvFsPathPattern.test(realpathSync(dbPath));
168
+ } catch {
169
+ return false;
170
+ }
171
+ }
172
+
173
+ /**
174
+ * Create the FTS5 virtual table for memories plus the triggers that keep it
175
+ * in sync with the base table. FTS5 may be unavailable on stripped-down
176
+ * SQLite builds — callers should treat failure as non-fatal and fall back
177
+ * to LIKE-based scans in `memory-store.queryMemoriesRanked`.
178
+ */
179
+ export function tryCreateMemoriesFts(db: DbAdapter): boolean {
180
+ return tryCreateMemoriesFtsSchema(db, {
181
+ onUnavailable: (message) => logWarning("db", message),
182
+ });
183
+ }
184
+
185
+ export function isMemoriesFtsAvailable(db: DbAdapter): boolean {
186
+ return isMemoriesFtsAvailableSchema(db);
187
+ }
188
+
189
+ function backfillMemoriesFts(db: DbAdapter): void {
190
+ db.exec(`INSERT INTO memories_fts(rowid, content) SELECT seq, content FROM memories`);
191
+ }
192
+
193
+ function copyQualityGateRowsToRepairedTable(db: DbAdapter): void {
194
+ db.exec(`
195
+ INSERT OR IGNORE INTO quality_gates_new
196
+ (milestone_id, slice_id, gate_id, scope, task_id, status, verdict, rationale, findings, evaluated_at)
197
+ SELECT milestone_id, slice_id, gate_id, scope, COALESCE(task_id, ''), status, verdict, rationale, findings, evaluated_at
198
+ FROM quality_gates
199
+ `);
200
+ }
201
+
202
+ function migrateSchema(db: DbAdapter): void {
203
+ const currentVersion = getCurrentSchemaVersion(db);
204
+ if (currentVersion >= SCHEMA_VERSION) return;
205
+
206
+ backupDatabaseBeforeMigration(db, currentPath, currentVersion, {
207
+ existsSync,
208
+ copyFileSync,
209
+ logWarning,
210
+ });
211
+
212
+ db.exec("BEGIN");
213
+ try {
214
+ if (currentVersion < 2) {
215
+ applyMigrationV2Artifacts(db);
216
+ recordSchemaVersion(db, 2);
217
+ }
218
+
219
+ if (currentVersion < 3) {
220
+ applyMigrationV3Memories(db);
221
+ recordSchemaVersion(db, 3);
222
+ }
223
+
224
+ if (currentVersion < 4) {
225
+ applyMigrationV4DecisionMadeBy(db);
226
+ recordSchemaVersion(db, 4);
227
+ }
228
+
229
+ if (currentVersion < 5) {
230
+ applyMigrationV5HierarchyTables(db);
231
+ recordSchemaVersion(db, 5);
232
+ }
233
+
234
+ if (currentVersion < 6) {
235
+ applyMigrationV6SliceSummaries(db);
236
+ recordSchemaVersion(db, 6);
237
+ }
238
+
239
+ if (currentVersion < 7) {
240
+ applyMigrationV7Dependencies(db);
241
+ recordSchemaVersion(db, 7);
242
+ }
243
+
244
+ if (currentVersion < 8) {
245
+ applyMigrationV8PlanningFields(db);
246
+ recordSchemaVersion(db, 8);
247
+ }
248
+
249
+ if (currentVersion < 9) {
250
+ applyMigrationV9Ordering(db);
251
+ recordSchemaVersion(db, 9);
252
+ }
253
+
254
+ if (currentVersion < 10) {
255
+ applyMigrationV10ReplanTrigger(db);
256
+ recordSchemaVersion(db, 10);
257
+ }
258
+
259
+ if (currentVersion < 11) {
260
+ applyMigrationV11TaskPlanning(db);
261
+ recordSchemaVersion(db, 11);
262
+ }
263
+
264
+ if (currentVersion < 12) {
265
+ // NOTE: The original DDL used COALESCE(task_id, '') in the PRIMARY KEY
266
+ // expression, which is invalid SQLite syntax and causes startup errors on
267
+ // DBs that migrate through v12. The corrected DDL uses
268
+ // task_id TEXT NOT NULL DEFAULT '' with a plain column list PK. DBs that
269
+ // were created with the broken DDL are repaired by the v22 migration below.
270
+ applyMigrationV12QualityGates(db);
271
+ recordSchemaVersion(db, 12);
272
+ }
273
+
274
+ if (currentVersion < 13) {
275
+ applyMigrationV13HotPathIndexes(db, ensureVerificationEvidenceDedupIndex);
276
+ recordSchemaVersion(db, 13);
277
+ }
278
+
279
+ if (currentVersion < 14) {
280
+ applyMigrationV14SliceDependencies(db);
281
+ recordSchemaVersion(db, 14);
282
+ }
283
+
284
+ if (currentVersion < 15) {
285
+ applyMigrationV15AuditTables(db);
286
+ recordSchemaVersion(db, 15);
287
+ }
288
+
289
+ if (currentVersion < 16) {
290
+ applyMigrationV16EscalationSource(db);
291
+ recordSchemaVersion(db, 16);
292
+ }
293
+
294
+ if (currentVersion < 17) {
295
+ applyMigrationV17TaskEscalation(db);
296
+ recordSchemaVersion(db, 17);
297
+ }
298
+
299
+ if (currentVersion < 18) {
300
+ applyMigrationV18MemorySources(db);
301
+ recordSchemaVersion(db, 18);
302
+ }
303
+
304
+ if (currentVersion < 19) {
305
+ applyMigrationV19MemoryFts(db, {
306
+ tryCreateMemoriesFts,
307
+ isMemoriesFtsAvailable,
308
+ backfillMemoriesFts,
309
+ logWarning,
310
+ });
311
+ recordSchemaVersion(db, 19);
312
+ }
313
+
314
+ if (currentVersion < 20) {
315
+ applyMigrationV20MemoryRelations(db);
316
+ recordSchemaVersion(db, 20);
317
+ }
318
+
319
+ if (currentVersion < 21) {
320
+ applyMigrationV21StructuredMemories(db);
321
+ recordSchemaVersion(db, 21);
322
+ }
323
+
324
+ if (currentVersion < 22) {
325
+ applyMigrationV22QualityGateRepair(db, { copyQualityGateRowsToRepairedTable });
326
+ recordSchemaVersion(db, 22);
327
+ }
328
+
329
+ if (currentVersion < 23) {
330
+ applyMigrationV23MilestoneQueue(db);
331
+ recordSchemaVersion(db, 23);
332
+ }
333
+
334
+ if (currentVersion < 24) {
335
+ // v24: auto-mode coordination tables. See createCoordinationTablesV24
336
+ // for full schema + invariants. No-op for fresh installs (the same
337
+ // helper runs in the fresh-install path); for upgraded DBs this is
338
+ // the only place these tables get created.
339
+ createCoordinationTablesV24(db);
340
+ recordSchemaVersion(db, 24);
341
+ }
342
+
343
+ if (currentVersion < 25) {
344
+ // v25: runtime_kv non-correctness-critical key-value storage. See
345
+ // createRuntimeKvTableV25 for the full schema + invariants.
346
+ createRuntimeKvTableV25(db);
347
+ recordSchemaVersion(db, 25);
348
+ }
349
+
350
+ if (currentVersion < 26) {
351
+ applyMigrationV26MilestoneCommitAttributions(db);
352
+ recordSchemaVersion(db, 26);
353
+ }
354
+
355
+ if (currentVersion < 27) {
356
+ applyMigrationV27ArtifactHash(db);
357
+ recordSchemaVersion(db, 27);
358
+ }
359
+
360
+ if (currentVersion < 28) {
361
+ applyMigrationV28MemoryLastHitAt(db);
362
+ recordSchemaVersion(db, 28);
363
+ }
364
+
365
+ if (currentVersion < 29) {
366
+ applyMigrationV29RepositoryTargets(db);
367
+ recordSchemaVersion(db, 29);
368
+ }
369
+
370
+ db.exec("COMMIT");
371
+ } catch (err) {
372
+ db.exec("ROLLBACK");
373
+ throw err;
374
+ }
375
+ }
376
+
377
+ let currentDb: DbAdapter | null = null;
378
+ let currentPath: string | null = null;
379
+ let currentPid: number = 0;
380
+ let _exitHandlerRegistered = false;
381
+ const _dbOpenState = createDbOpenState();
382
+ /**
383
+ * Identity key of the workspace whose connection is currently active
384
+ * (currentDb). Set by openDatabaseByWorkspace(); null when the active
385
+ * connection was opened via the legacy openDatabase(path) path.
386
+ */
387
+ let _currentIdentityKey: string | null = null;
388
+
389
+ /**
390
+ * Workspace-scoped connection cache.
391
+ * Key: GsdWorkspace.identityKey (realpath-normalized project root).
392
+ * Value: the DB path and open adapter for that workspace.
393
+ *
394
+ * Sibling worktrees of the same project share the same identityKey (set by
395
+ * createWorkspace) and therefore reuse the same cached connection, preserving
396
+ * shared-WAL semantics. Different projects get distinct cache entries.
397
+ *
398
+ * NOTE: Only one connection is "active" at a time (currentDb/currentPath).
399
+ * The cache allows fast re-activation of a previously opened connection when
400
+ * callers switch between known workspaces via openDatabaseByWorkspace().
401
+ */
402
+ const _dbCache = createDbConnectionCache();
403
+
404
+ /** Test helper: expose the internal cache for inspection. Not for production use. */
405
+ export function _getDbCache(): ReadonlyMap<string, DbConnectionCacheEntry> {
406
+ return _dbCache.asReadonlyMap();
407
+ }
408
+
409
+ function closeCachedConnection(entry: DbConnectionCacheEntry, source: "all" | "workspace"): void {
410
+ try {
411
+ entry.db.exec("PRAGMA wal_checkpoint(TRUNCATE)");
412
+ } catch (e) {
413
+ if (source === "workspace") logWarning("db", `WAL checkpoint (byWorkspace) failed: ${(e as Error).message}`);
414
+ }
415
+ try {
416
+ entry.db.exec("PRAGMA incremental_vacuum(64)");
417
+ } catch (e) {
418
+ if (source === "workspace") logWarning("db", `incremental vacuum (byWorkspace) failed: ${(e as Error).message}`);
419
+ }
420
+ try {
421
+ entry.db.close();
422
+ } catch (e) {
423
+ if (source === "workspace") logWarning("db", `database close (byWorkspace) failed: ${(e as Error).message}`);
424
+ }
425
+ }
426
+
427
+ /**
428
+ * Close and evict every entry in the workspace connection cache, then call
429
+ * closeDatabase() to close the active connection.
430
+ *
431
+ * Use this for test teardown or process-shutdown paths where every open
432
+ * connection must be flushed. Normal callers should use closeDatabase() or
433
+ * closeDatabaseByWorkspace() instead.
434
+ */
435
+ export function closeAllDatabases(): void {
436
+ // Close all non-active cached connections first.
437
+ _dbCache.closeNonActive(currentDb, (entry) => closeCachedConnection(entry, "all"));
438
+ closeDatabase();
439
+ }
440
+
441
+ /**
442
+ * Open (or reuse) the database connection scoped to the given workspace.
443
+ *
444
+ * Uses workspace.identityKey as the cache key, so sibling worktrees of the
445
+ * same project resolve to the same connection. On a cache hit the existing
446
+ * adapter is reactivated as the current connection without re-opening the
447
+ * file. On a cache miss, delegates to openDatabase() for the full
448
+ * open + schema-init + migration flow, then caches the result.
449
+ *
450
+ * When switching to a different workspace, the previously active connection
451
+ * is preserved in the cache (not closed), so callers can switch back to it
452
+ * cheaply via a subsequent openDatabaseByWorkspace() call.
453
+ *
454
+ * @param workspace A GsdWorkspace created by createWorkspace().
455
+ * @returns true if the connection is open and ready, false otherwise.
456
+ */
457
+ export function openDatabaseByWorkspace(workspace: GsdWorkspace): boolean {
458
+ const key = workspace.identityKey;
459
+ const dbPath = workspace.contract.projectDb;
460
+
461
+ const cached = _dbCache.get(key);
462
+ if (cached) {
463
+ // Reactivate the cached connection as the current singleton.
464
+ currentDb = cached.db;
465
+ currentPath = cached.dbPath;
466
+ currentPid = process.pid;
467
+ _dbOpenState.markAttempted();
468
+ _currentIdentityKey = key;
469
+ return true;
470
+ }
471
+
472
+ // Cache miss — need to open a new connection.
473
+ //
474
+ // If there is a currently active workspace connection, stash it in the
475
+ // cache under its identity key before calling openDatabase(), because
476
+ // openDatabase() will call closeDatabase() when the path changes (which
477
+ // would destroy the existing adapter). By nulling out currentDb first,
478
+ // we prevent openDatabase() from closing the live adapter.
479
+ let oldDb: typeof currentDb = null;
480
+ let oldPath: typeof currentPath = null;
481
+ let oldPid: typeof currentPid = 0;
482
+ let oldKey: typeof _currentIdentityKey = null;
483
+
484
+ if (currentDb !== null && _currentIdentityKey !== null) {
485
+ // Snapshot the old globals so we can restore them on failure.
486
+ oldDb = currentDb;
487
+ oldPath = currentPath;
488
+ oldPid = currentPid;
489
+ oldKey = _currentIdentityKey;
490
+ // Save the current connection so it stays alive in the cache.
491
+ _dbCache.set(_currentIdentityKey, {
492
+ dbPath: currentPath!,
493
+ db: currentDb,
494
+ });
495
+ // Detach from globals so openDatabase() opens fresh without closing it.
496
+ currentDb = null;
497
+ currentPath = null;
498
+ currentPid = 0;
499
+ _currentIdentityKey = null;
500
+ }
501
+
502
+ // Run the full open/schema/migration flow for the new workspace.
503
+ // openDatabase() can throw on corrupt DB or permission error — catch so we
504
+ // can restore the previous connection rather than leaving globals null.
505
+ let opened: boolean;
506
+ try {
507
+ opened = openDatabase(dbPath);
508
+ } catch (err) {
509
+ // Failed to open the new DB. Restore the previous workspace connection so
510
+ // the caller's workspace remains active (it is still safe in _dbCache).
511
+ if (oldDb !== null) {
512
+ currentDb = oldDb;
513
+ currentPath = oldPath;
514
+ currentPid = oldPid;
515
+ _currentIdentityKey = oldKey;
516
+ }
517
+ throw err;
518
+ }
519
+ if (opened && currentDb) {
520
+ _dbCache.set(key, { dbPath, db: currentDb });
521
+ _currentIdentityKey = key;
522
+ } else if (!opened && oldDb !== null) {
523
+ // Restore the previous connection so the caller's workspace remains active.
524
+ // The failed attempt left no live adapter, so the globals stayed null.
525
+ currentDb = oldDb;
526
+ currentPath = oldPath;
527
+ currentPid = oldPid;
528
+ _currentIdentityKey = oldKey;
529
+ }
530
+ return opened;
531
+ }
532
+
533
+ /**
534
+ * Open (or reuse) the database connection scoped to the workspace in a
535
+ * MilestoneScope. Thin delegation to openDatabaseByWorkspace().
536
+ */
537
+ export function openDatabaseByScope(scope: MilestoneScope): boolean {
538
+ return openDatabaseByWorkspace(scope.workspace);
539
+ }
540
+
541
+ /**
542
+ * Close the database connection for the given workspace and remove it from
543
+ * the cache. If the workspace's connection is currently active (currentDb),
544
+ * performs a full closeDatabase() including WAL checkpoint. Otherwise only
545
+ * removes the cache entry (the adapter was already replaced by a later open).
546
+ */
547
+ export function closeDatabaseByWorkspace(workspace: GsdWorkspace): void {
548
+ const key = workspace.identityKey;
549
+ const cached = _dbCache.get(key);
550
+ if (!cached) return;
551
+
552
+ _dbCache.delete(key);
553
+
554
+ if (currentDb === cached.db) {
555
+ // This workspace's connection is the active one — full close.
556
+ closeDatabase();
557
+ } else {
558
+ // Connection was displaced by a later open; close the adapter directly.
559
+ closeCachedConnection(cached, "workspace");
560
+ }
561
+ }
562
+
563
+ export function getDbProvider(): ProviderName | null {
564
+ providerLoader.load();
565
+ return providerLoader.getProviderName();
566
+ }
567
+
568
+ export function isDbAvailable(): boolean {
569
+ return currentDb !== null;
570
+ }
571
+
572
+ /**
573
+ * Returns true if openDatabase() has been called at least once this session.
574
+ * Used to distinguish "DB not yet initialized" from "DB genuinely unavailable"
575
+ * so that early callers (e.g. before_agent_start context injection) don't
576
+ * trigger a false degraded-mode warning.
577
+ */
578
+ export function wasDbOpenAttempted(): boolean {
579
+ return _dbOpenState.snapshot().attempted;
580
+ }
581
+
582
+ export function getDbStatus(): {
583
+ available: boolean;
584
+ provider: ProviderName | null;
585
+ attempted: boolean;
586
+ lastError: Error | null;
587
+ lastPhase: DbOpenPhase | null;
588
+ } {
589
+ providerLoader.load();
590
+ const openState = _dbOpenState.snapshot();
591
+ return {
592
+ available: currentDb !== null,
593
+ provider: providerLoader.getProviderName(),
594
+ attempted: openState.attempted,
595
+ lastError: openState.lastError,
596
+ lastPhase: openState.lastPhase,
597
+ };
598
+ }
599
+
600
+ export function openDatabase(path: string): boolean {
601
+ _dbOpenState.markAttempted();
602
+ if (currentDb && currentPath !== path) closeDatabase();
603
+ if (currentDb && currentPath === path) return true;
604
+
605
+ // Reset error state only when a new open attempt is actually going to run.
606
+ _dbOpenState.clearError();
607
+
608
+ let rawDb: unknown;
609
+ let fallbackOpen: SqliteFallbackOpen | null = null;
610
+ try {
611
+ rawDb = providerLoader.openRaw(path);
612
+ } catch (primaryErr) {
613
+ _dbOpenState.recordError("open", primaryErr);
614
+ // node:sqlite loaded but failed to open this file — try better-sqlite3 as fallback.
615
+ fallbackOpen = providerLoader.tryOpenBetterSqliteFallback(path);
616
+ if (fallbackOpen) {
617
+ rawDb = fallbackOpen.rawDb;
618
+ _dbOpenState.clearError();
619
+ }
620
+ if (!rawDb) throw primaryErr;
621
+ }
622
+ if (!rawDb) return false;
623
+
624
+ const adapter = createDbAdapter(rawDb);
625
+ const fileBacked = path !== ":memory:";
626
+ try {
627
+ initSchema(adapter, fileBacked, path);
628
+ } catch (err) {
629
+ // Corrupt freelist: DDL fails with "malformed" but VACUUM can rebuild.
630
+ // Attempt VACUUM recovery before giving up (see #2519).
631
+ if (fileBacked && err instanceof Error && err.message?.includes("malformed")) {
632
+ try {
633
+ adapter.exec("VACUUM");
634
+ initSchema(adapter, fileBacked, path);
635
+ process.stderr.write("gsd-db: recovered corrupt database via VACUUM\n");
636
+ } catch (retryErr) {
637
+ _dbOpenState.recordError("vacuum-recovery", retryErr);
638
+ try { adapter.close(); } catch (e) { logWarning("db", `close after VACUUM failed: ${(e as Error).message}`); }
639
+ throw retryErr;
640
+ }
641
+ } else {
642
+ _dbOpenState.recordError("initSchema", err);
643
+ try { adapter.close(); } catch (e) { logWarning("db", `close after initSchema failed: ${(e as Error).message}`); }
644
+ throw err;
645
+ }
646
+ }
647
+
648
+ // Commit fallback provider switch only after open + schema both succeeded.
649
+ if (fallbackOpen) providerLoader.commitFallback(fallbackOpen);
650
+
651
+ currentDb = adapter;
652
+ currentPath = path;
653
+ currentPid = process.pid;
654
+
655
+ if (!_exitHandlerRegistered) {
656
+ _exitHandlerRegistered = true;
657
+ process.on("exit", () => { try { closeDatabase(); } catch (e) { logWarning("db", `exit handler close failed: ${(e as Error).message}`); } });
658
+ }
659
+
660
+ return true;
661
+ }
662
+
663
+ export function closeDatabase(): void {
664
+ if (currentDb) {
665
+ try {
666
+ currentDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
667
+ } catch (e) { logWarning("db", `WAL checkpoint failed: ${(e as Error).message}`); }
668
+ try {
669
+ // Incremental vacuum to reclaim space without blocking
670
+ currentDb.exec('PRAGMA incremental_vacuum(64)');
671
+ } catch (e) { logWarning("db", `incremental vacuum failed: ${(e as Error).message}`); }
672
+ try {
673
+ currentDb.close();
674
+ } catch (e) { logWarning("db", `database close failed: ${(e as Error).message}`); }
675
+ // If this connection was workspace-tracked, evict it from the cache so
676
+ // subsequent openDatabaseByWorkspace() calls re-open rather than reactivate
677
+ // a closed adapter.
678
+ if (_currentIdentityKey !== null) {
679
+ _dbCache.delete(_currentIdentityKey);
680
+ _currentIdentityKey = null;
681
+ }
682
+ currentDb = null;
683
+ currentPath = null;
684
+ currentPid = 0;
685
+ }
686
+ // Reset session-scoped state unconditionally so stale error info from a
687
+ // failed open doesn't persist into the next open attempt or status check.
688
+ _dbOpenState.reset();
689
+ }
690
+
691
+ /**
692
+ * Re-open the active database connection from disk.
693
+ *
694
+ * Auto-mode can observe artifacts written by a workflow server running in a
695
+ * different process before its long-lived singleton has re-synchronized. The
696
+ * recovery path uses this to force the next state derivation to read from the
697
+ * current on-disk database instead of continuing with a possibly stale handle.
698
+ */
699
+ export function refreshOpenDatabaseFromDisk(): boolean {
700
+ if (!currentDb || !currentPath) return false;
701
+ if (currentPath === ":memory:") return false;
702
+
703
+ const dbPath = currentPath;
704
+ const identityKey = _currentIdentityKey;
705
+
706
+ try {
707
+ closeDatabase();
708
+ const opened = openDatabase(dbPath);
709
+ if (opened && identityKey && currentDb) {
710
+ _dbCache.set(identityKey, { dbPath, db: currentDb });
711
+ _currentIdentityKey = identityKey;
712
+ }
713
+ return opened;
714
+ } catch (e) {
715
+ logWarning("db", `database refresh failed: ${(e as Error).message}`);
716
+ return false;
717
+ }
718
+ }
719
+
720
+ /** Run a full VACUUM — call sparingly (e.g. after milestone completion). */
721
+ export function vacuumDatabase(): void {
722
+ if (!currentDb) return;
723
+ try {
724
+ currentDb.exec('VACUUM');
725
+ } catch (e) { logWarning("db", `VACUUM failed: ${(e as Error).message}`); }
726
+ }
727
+
728
+ /** Flush WAL into gsd.db so `git add .gsd/gsd.db` stages current state — safe while DB is open. */
729
+ export function checkpointDatabase(): void {
730
+ if (!currentDb) return;
731
+ try {
732
+ currentDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
733
+ } catch (e) { logWarning("db", `WAL checkpoint failed: ${(e as Error).message}`); }
734
+ }
735
+
736
+ const _transactionRunner = createDbTransactionRunner();
737
+
738
+ function createTransactionControls(db: DbAdapter) {
739
+ return {
740
+ begin: () => db.exec("BEGIN"),
741
+ beginRead: () => db.exec("BEGIN DEFERRED"),
742
+ commit: () => db.exec("COMMIT"),
743
+ rollback: () => db.exec("ROLLBACK"),
744
+ };
745
+ }
746
+
747
+ /**
748
+ * Whether the current call is running inside an active SQLite transaction.
749
+ * Statement-time recovery paths (e.g. VACUUM retry on a malformed memory
750
+ * store) MUST gate on this — SQLite refuses VACUUM inside a transaction
751
+ * and would mask the original error with a secondary "cannot VACUUM" throw.
752
+ */
753
+ export function isInTransaction(): boolean {
754
+ return _transactionRunner.isInTransaction();
755
+ }
756
+
757
+ export function transaction<T>(fn: () => T): T {
758
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
759
+ return _transactionRunner.transaction(createTransactionControls(currentDb), fn);
760
+ }
761
+
762
+ /**
763
+ * Wrap a block of reads in a DEFERRED transaction so that all SELECTs observe
764
+ * a consistent snapshot of the DB even if a concurrent writer commits between
765
+ * them. Use this for multi-query read flows (e.g. tool executors that query
766
+ * milestone + slices + counts and want one snapshot). Re-entrant — if already
767
+ * inside a transaction, runs fn() without starting a nested one.
768
+ */
769
+ export function readTransaction<T>(fn: () => T): T {
770
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
771
+
772
+ return _transactionRunner.readTransaction(createTransactionControls(currentDb), fn, (rollbackErr) => {
773
+ // A failed ROLLBACK after a failed read is a split-brain signal —
774
+ // the transaction is in an indeterminate state. Surface it via the
775
+ // logger instead of swallowing it.
776
+ logError("db", "snapshotState ROLLBACK failed", {
777
+ error: rollbackErr.message,
778
+ });
779
+ });
780
+ }
781
+
782
+ export function insertDecision(d: Omit<Decision, "seq">): void {
783
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
784
+ currentDb.prepare(
785
+ `INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
786
+ VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :source, :superseded_by)`,
787
+ ).run({
788
+ ":id": d.id,
789
+ ":when_context": d.when_context,
790
+ ":scope": d.scope,
791
+ ":decision": d.decision,
792
+ ":choice": d.choice,
793
+ ":rationale": d.rationale,
794
+ ":revisable": d.revisable,
795
+ ":made_by": d.made_by ?? "agent",
796
+ ":source": d.source ?? "discussion",
797
+ ":superseded_by": d.superseded_by,
798
+ });
799
+ }
800
+
801
+ export function getDecisionById(id: string): Decision | null {
802
+ if (!currentDb) return null;
803
+ const row = currentDb.prepare("SELECT * FROM decisions WHERE id = ?").get(id);
804
+ if (!row) return null;
805
+ return rowToDecision(row);
806
+ }
807
+
808
+ export function getActiveDecisions(): Decision[] {
809
+ if (!currentDb) return [];
810
+ const rows = currentDb.prepare("SELECT * FROM active_decisions").all();
811
+ return rows.map(rowToActiveDecision);
812
+ }
813
+
814
+ export function insertRequirement(r: Requirement): void {
815
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
816
+ currentDb.prepare(
817
+ `INSERT INTO requirements (id, class, status, description, why, source, primary_owner, supporting_slices, validation, notes, full_content, superseded_by)
818
+ VALUES (:id, :class, :status, :description, :why, :source, :primary_owner, :supporting_slices, :validation, :notes, :full_content, :superseded_by)`,
819
+ ).run({
820
+ ":id": r.id,
821
+ ":class": r.class,
822
+ ":status": r.status,
823
+ ":description": r.description,
824
+ ":why": r.why,
825
+ ":source": r.source,
826
+ ":primary_owner": r.primary_owner,
827
+ ":supporting_slices": r.supporting_slices,
828
+ ":validation": r.validation,
829
+ ":notes": r.notes,
830
+ ":full_content": r.full_content,
831
+ ":superseded_by": r.superseded_by,
832
+ });
833
+ }
834
+
835
+ export function getRequirementById(id: string): Requirement | null {
836
+ if (!currentDb) return null;
837
+ const row = currentDb.prepare("SELECT * FROM requirements WHERE id = ?").get(id);
838
+ if (!row) return null;
839
+ return rowToRequirement(row);
840
+ }
841
+
842
+ export function getActiveRequirements(): Requirement[] {
843
+ if (!currentDb) return [];
844
+ const rows = currentDb.prepare("SELECT * FROM active_requirements").all();
845
+ return rows.map(rowToActiveRequirement);
846
+ }
847
+
848
+ export function getRequirementCounts(): {
849
+ active: number;
850
+ validated: number;
851
+ deferred: number;
852
+ outOfScope: number;
853
+ blocked: number;
854
+ total: number;
855
+ } {
856
+ if (!currentDb) {
857
+ return { active: 0, validated: 0, deferred: 0, outOfScope: 0, blocked: 0, total: 0 };
858
+ }
859
+ const rows = currentDb
860
+ .prepare("SELECT lower(status) as status, COUNT(*) as count FROM requirements GROUP BY lower(status)")
861
+ .all();
862
+ return rowsToRequirementCounts(rows);
863
+ }
864
+
865
+ export function getDbOwnerPid(): number {
866
+ return currentPid;
867
+ }
868
+
869
+ export function getDbPath(): string | null {
870
+ return currentPath;
871
+ }
872
+
873
+ export function _getAdapter(): DbAdapter | null {
874
+ return currentDb;
875
+ }
876
+
877
+ export function _resetProvider(): void {
878
+ providerLoader.reset();
879
+ }
880
+
881
+ export function upsertDecision(d: Omit<Decision, "seq">): void {
882
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
883
+ // Use ON CONFLICT DO UPDATE instead of INSERT OR REPLACE to preserve the
884
+ // seq column. INSERT OR REPLACE deletes then reinserts, resetting seq and
885
+ // corrupting decision ordering in DECISIONS.md after reconcile replay.
886
+ currentDb.prepare(
887
+ `INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
888
+ VALUES (:id, :when_context, :scope, :decision, :choice, :rationale, :revisable, :made_by, :source, :superseded_by)
889
+ ON CONFLICT(id) DO UPDATE SET
890
+ when_context = excluded.when_context,
891
+ scope = excluded.scope,
892
+ decision = excluded.decision,
893
+ choice = excluded.choice,
894
+ rationale = excluded.rationale,
895
+ revisable = excluded.revisable,
896
+ made_by = excluded.made_by,
897
+ source = excluded.source,
898
+ superseded_by = excluded.superseded_by`,
899
+ ).run({
900
+ ":id": d.id,
901
+ ":when_context": d.when_context,
902
+ ":scope": d.scope,
903
+ ":decision": d.decision,
904
+ ":choice": d.choice,
905
+ ":rationale": d.rationale,
906
+ ":revisable": d.revisable,
907
+ ":made_by": d.made_by ?? "agent",
908
+ ":source": d.source ?? "discussion",
909
+ ":superseded_by": d.superseded_by ?? null,
910
+ });
911
+ }
912
+
913
+ export function upsertRequirement(r: Requirement): void {
914
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
915
+ currentDb.prepare(
916
+ `INSERT OR REPLACE INTO requirements (id, class, status, description, why, source, primary_owner, supporting_slices, validation, notes, full_content, superseded_by)
917
+ VALUES (:id, :class, :status, :description, :why, :source, :primary_owner, :supporting_slices, :validation, :notes, :full_content, :superseded_by)`,
918
+ ).run({
919
+ ":id": r.id,
920
+ ":class": r.class,
921
+ ":status": r.status,
922
+ ":description": r.description,
923
+ ":why": r.why,
924
+ ":source": r.source,
925
+ ":primary_owner": r.primary_owner,
926
+ ":supporting_slices": r.supporting_slices,
927
+ ":validation": r.validation,
928
+ ":notes": r.notes,
929
+ ":full_content": r.full_content,
930
+ ":superseded_by": r.superseded_by ?? null,
931
+ });
932
+ }
933
+
934
+ export function clearArtifacts(): void {
935
+ if (!currentDb) return;
936
+ try { currentDb.exec("DELETE FROM artifacts"); } catch (e) { logWarning("db", `clearArtifacts failed: ${(e as Error).message}`); }
937
+ }
938
+
939
+ export function clearDecisions(): void {
940
+ if (!currentDb) return;
941
+ try { currentDb.exec("DELETE FROM decisions"); } catch (e) { logWarning("db", `clearDecisions failed: ${(e as Error).message}`); }
942
+ }
943
+
944
+ export function clearRequirements(): void {
945
+ if (!currentDb) return;
946
+ try { currentDb.exec("DELETE FROM requirements"); } catch (e) { logWarning("db", `clearRequirements failed: ${(e as Error).message}`); }
947
+ }
948
+
949
+ export function insertArtifact(a: {
950
+ path: string;
951
+ artifact_type: string;
952
+ milestone_id: string | null;
953
+ slice_id: string | null;
954
+ task_id: string | null;
955
+ full_content: string;
956
+ }): void {
957
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
958
+ const contentHash = createHash("sha256").update(a.full_content).digest("hex");
959
+ currentDb.prepare(
960
+ `INSERT OR REPLACE INTO artifacts (path, artifact_type, milestone_id, slice_id, task_id, full_content, imported_at, content_hash)
961
+ VALUES (:path, :artifact_type, :milestone_id, :slice_id, :task_id, :full_content, :imported_at, :content_hash)`,
962
+ ).run({
963
+ ":path": a.path,
964
+ ":artifact_type": a.artifact_type,
965
+ ":milestone_id": a.milestone_id,
966
+ ":slice_id": a.slice_id,
967
+ ":task_id": a.task_id,
968
+ ":full_content": a.full_content,
969
+ ":imported_at": new Date().toISOString(),
970
+ ":content_hash": contentHash,
971
+ });
972
+ }
973
+
974
+ export interface MilestonePlanningRecord {
975
+ vision: string;
976
+ successCriteria: string[];
977
+ keyRisks: Array<{ risk: string; whyItMatters: string }>;
978
+ proofStrategy: Array<{ riskOrUnknown: string; retireIn: string; whatWillBeProven: string }>;
979
+ verificationContract: string;
980
+ verificationIntegration: string;
981
+ verificationOperational: string;
982
+ verificationUat: string;
983
+ definitionOfDone: string[];
984
+ requirementCoverage: string;
985
+ boundaryMapMarkdown: string;
986
+ }
987
+
988
+ export interface SlicePlanningRecord {
989
+ goal: string;
990
+ successCriteria: string;
991
+ proofLevel: string;
992
+ integrationClosure: string;
993
+ observabilityImpact: string;
994
+ targetRepositories?: string[];
995
+ }
996
+
997
+ export interface TaskPlanningRecord {
998
+ title?: string;
999
+ description: string;
1000
+ estimate: string;
1001
+ files: string[];
1002
+ verify: string;
1003
+ inputs: string[];
1004
+ expectedOutput: string[];
1005
+ observabilityImpact: string;
1006
+ fullPlanMd?: string;
1007
+ targetRepositories?: string[];
1008
+ }
1009
+
1010
+ export function insertMilestone(m: {
1011
+ id: string;
1012
+ title?: string;
1013
+ status?: string;
1014
+ depends_on?: string[];
1015
+ planning?: Partial<MilestonePlanningRecord>;
1016
+ }): void {
1017
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1018
+ currentDb.prepare(
1019
+ `INSERT OR IGNORE INTO milestones (
1020
+ id, title, status, depends_on, created_at,
1021
+ vision, success_criteria, key_risks, proof_strategy,
1022
+ verification_contract, verification_integration, verification_operational, verification_uat,
1023
+ definition_of_done, requirement_coverage, boundary_map_markdown
1024
+ ) VALUES (
1025
+ :id, :title, :status, :depends_on, :created_at,
1026
+ :vision, :success_criteria, :key_risks, :proof_strategy,
1027
+ :verification_contract, :verification_integration, :verification_operational, :verification_uat,
1028
+ :definition_of_done, :requirement_coverage, :boundary_map_markdown
1029
+ )`,
1030
+ ).run({
1031
+ ":id": m.id,
1032
+ ":title": m.title ?? "",
1033
+ // Default to "queued" — never auto-create milestones as "active" (#3380).
1034
+ // Callers that need "active" must pass it explicitly.
1035
+ ":status": m.status ?? "queued",
1036
+ ":depends_on": JSON.stringify(m.depends_on ?? []),
1037
+ ":created_at": new Date().toISOString(),
1038
+ ":vision": m.planning?.vision ?? "",
1039
+ ":success_criteria": JSON.stringify(m.planning?.successCriteria ?? []),
1040
+ ":key_risks": JSON.stringify(m.planning?.keyRisks ?? []),
1041
+ ":proof_strategy": JSON.stringify(m.planning?.proofStrategy ?? []),
1042
+ ":verification_contract": m.planning?.verificationContract ?? "",
1043
+ ":verification_integration": m.planning?.verificationIntegration ?? "",
1044
+ ":verification_operational": m.planning?.verificationOperational ?? "",
1045
+ ":verification_uat": m.planning?.verificationUat ?? "",
1046
+ ":definition_of_done": JSON.stringify(m.planning?.definitionOfDone ?? []),
1047
+ ":requirement_coverage": m.planning?.requirementCoverage ?? "",
1048
+ ":boundary_map_markdown": m.planning?.boundaryMapMarkdown ?? "",
1049
+ });
1050
+ }
1051
+
1052
+ export function upsertMilestonePlanning(milestoneId: string, planning: Partial<MilestonePlanningRecord> & { title?: string; status?: string; depends_on?: string[] }): void {
1053
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1054
+ currentDb.prepare(
1055
+ `UPDATE milestones SET
1056
+ title = COALESCE(NULLIF(:title, ''), title),
1057
+ status = COALESCE(NULLIF(:status, ''), status),
1058
+ depends_on = COALESCE(:depends_on, depends_on),
1059
+ vision = COALESCE(:vision, vision),
1060
+ success_criteria = COALESCE(:success_criteria, success_criteria),
1061
+ key_risks = COALESCE(:key_risks, key_risks),
1062
+ proof_strategy = COALESCE(:proof_strategy, proof_strategy),
1063
+ verification_contract = COALESCE(:verification_contract, verification_contract),
1064
+ verification_integration = COALESCE(:verification_integration, verification_integration),
1065
+ verification_operational = COALESCE(:verification_operational, verification_operational),
1066
+ verification_uat = COALESCE(:verification_uat, verification_uat),
1067
+ definition_of_done = COALESCE(:definition_of_done, definition_of_done),
1068
+ requirement_coverage = COALESCE(:requirement_coverage, requirement_coverage),
1069
+ boundary_map_markdown = COALESCE(:boundary_map_markdown, boundary_map_markdown)
1070
+ WHERE id = :id`,
1071
+ ).run({
1072
+ ":id": milestoneId,
1073
+ ":title": planning.title ?? "",
1074
+ ":status": planning.status ?? "",
1075
+ ":depends_on": planning.depends_on ? JSON.stringify(planning.depends_on) : null,
1076
+ ":vision": planning.vision ?? null,
1077
+ ":success_criteria": planning.successCriteria ? JSON.stringify(planning.successCriteria) : null,
1078
+ ":key_risks": planning.keyRisks ? JSON.stringify(planning.keyRisks) : null,
1079
+ ":proof_strategy": planning.proofStrategy ? JSON.stringify(planning.proofStrategy) : null,
1080
+ ":verification_contract": planning.verificationContract ?? null,
1081
+ ":verification_integration": planning.verificationIntegration ?? null,
1082
+ ":verification_operational": planning.verificationOperational ?? null,
1083
+ ":verification_uat": planning.verificationUat ?? null,
1084
+ ":definition_of_done": planning.definitionOfDone ? JSON.stringify(planning.definitionOfDone) : null,
1085
+ ":requirement_coverage": planning.requirementCoverage ?? null,
1086
+ ":boundary_map_markdown": planning.boundaryMapMarkdown ?? null,
1087
+ });
1088
+ }
1089
+
1090
+ export function insertSlice(s: {
1091
+ id: string;
1092
+ milestoneId: string;
1093
+ title?: string;
1094
+ status?: string;
1095
+ risk?: string;
1096
+ depends?: string[];
1097
+ demo?: string;
1098
+ sequence?: number;
1099
+ isSketch?: boolean;
1100
+ sketchScope?: string;
1101
+ planning?: Partial<SlicePlanningRecord>;
1102
+ }): void {
1103
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1104
+ currentDb.prepare(
1105
+ `INSERT INTO slices (
1106
+ milestone_id, id, title, status, risk, depends, demo, created_at,
1107
+ goal, success_criteria, proof_level, integration_closure, observability_impact, target_repositories, sequence,
1108
+ is_sketch, sketch_scope
1109
+ ) VALUES (
1110
+ :milestone_id, :id, :title, :status, :risk, :depends, :demo, :created_at,
1111
+ :goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :target_repositories, :sequence,
1112
+ :is_sketch, :sketch_scope
1113
+ )
1114
+ ON CONFLICT (milestone_id, id) DO UPDATE SET
1115
+ title = CASE WHEN :raw_title IS NOT NULL THEN excluded.title ELSE slices.title END,
1116
+ status = CASE WHEN slices.status IN (${TERMINAL_STATUS_SQL}) THEN slices.status ELSE excluded.status END,
1117
+ risk = CASE WHEN :raw_risk IS NOT NULL THEN excluded.risk ELSE slices.risk END,
1118
+ depends = excluded.depends,
1119
+ demo = CASE WHEN :raw_demo IS NOT NULL THEN excluded.demo ELSE slices.demo END,
1120
+ goal = CASE WHEN :raw_goal IS NOT NULL THEN excluded.goal ELSE slices.goal END,
1121
+ success_criteria = CASE WHEN :raw_success_criteria IS NOT NULL THEN excluded.success_criteria ELSE slices.success_criteria END,
1122
+ proof_level = CASE WHEN :raw_proof_level IS NOT NULL THEN excluded.proof_level ELSE slices.proof_level END,
1123
+ integration_closure = CASE WHEN :raw_integration_closure IS NOT NULL THEN excluded.integration_closure ELSE slices.integration_closure END,
1124
+ observability_impact = CASE WHEN :raw_observability_impact IS NOT NULL THEN excluded.observability_impact ELSE slices.observability_impact END,
1125
+ target_repositories = CASE WHEN :raw_target_repositories IS NOT NULL THEN excluded.target_repositories ELSE slices.target_repositories END,
1126
+ sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END,
1127
+ is_sketch = CASE WHEN :raw_is_sketch IS NOT NULL THEN excluded.is_sketch ELSE slices.is_sketch END,
1128
+ sketch_scope = CASE WHEN :raw_sketch_scope IS NOT NULL THEN excluded.sketch_scope ELSE slices.sketch_scope END`,
1129
+ ).run({
1130
+ ":milestone_id": s.milestoneId,
1131
+ ":id": s.id,
1132
+ ":title": s.title ?? "",
1133
+ ":status": s.status ?? "pending",
1134
+ ":risk": s.risk ?? "medium",
1135
+ ":depends": JSON.stringify(s.depends ?? []),
1136
+ ":demo": s.demo ?? "",
1137
+ ":created_at": new Date().toISOString(),
1138
+ ":goal": s.planning?.goal ?? "",
1139
+ ":success_criteria": s.planning?.successCriteria ?? "",
1140
+ ":proof_level": s.planning?.proofLevel ?? "",
1141
+ ":integration_closure": s.planning?.integrationClosure ?? "",
1142
+ ":observability_impact": s.planning?.observabilityImpact ?? "",
1143
+ ":target_repositories": JSON.stringify(s.planning?.targetRepositories ?? []),
1144
+ ":sequence": s.sequence ?? 0,
1145
+ ":is_sketch": s.isSketch ? 1 : 0,
1146
+ ":sketch_scope": s.sketchScope ?? "",
1147
+ // Raw sentinel params: NULL when caller omitted the field, used in ON CONFLICT guards
1148
+ ":raw_title": s.title ?? null,
1149
+ ":raw_risk": s.risk ?? null,
1150
+ ":raw_demo": s.demo ?? null,
1151
+ ":raw_goal": s.planning?.goal ?? null,
1152
+ ":raw_success_criteria": s.planning?.successCriteria ?? null,
1153
+ ":raw_proof_level": s.planning?.proofLevel ?? null,
1154
+ ":raw_integration_closure": s.planning?.integrationClosure ?? null,
1155
+ ":raw_observability_impact": s.planning?.observabilityImpact ?? null,
1156
+ ":raw_target_repositories": s.planning?.targetRepositories ? JSON.stringify(s.planning.targetRepositories) : null,
1157
+ ":raw_sequence": s.sequence ?? null,
1158
+ ":raw_is_sketch": s.isSketch === undefined ? null : (s.isSketch ? 1 : 0),
1159
+ // NOTE: use !== undefined (not ??) so an explicit empty string "" is treated
1160
+ // as a present value and correctly clears the existing sketch_scope on
1161
+ // CONFLICT. ?? would incorrectly preserve the stale value.
1162
+ ":raw_sketch_scope": s.sketchScope !== undefined ? s.sketchScope : null,
1163
+ });
1164
+ }
1165
+
1166
+ // ADR-011: sketch-then-refine helpers
1167
+ export function setSliceSketchFlag(milestoneId: string, sliceId: string, isSketch: boolean): void {
1168
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1169
+ currentDb.prepare(
1170
+ `UPDATE slices SET is_sketch = :is_sketch WHERE milestone_id = :mid AND id = :sid`,
1171
+ ).run({ ":is_sketch": isSketch ? 1 : 0, ":mid": milestoneId, ":sid": sliceId });
1172
+ }
1173
+
1174
+ /**
1175
+ * ADR-017 raw primitive: returns slice IDs in a milestone whose is_sketch flag
1176
+ * is still 1. The stale-sketch-flag drift handler at
1177
+ * `state-reconciliation/drift/sketch-flag.ts` composes this with PLAN.md
1178
+ * existence checks to detect drift, then writes via `setSliceSketchFlag`.
1179
+ */
1180
+ export function getSketchedSliceIds(milestoneId: string): string[] {
1181
+ if (!currentDb) return [];
1182
+ const rows = currentDb.prepare(
1183
+ `SELECT id FROM slices WHERE milestone_id = :mid AND is_sketch = 1`,
1184
+ ).all({ ":mid": milestoneId }) as Array<{ id: string }>;
1185
+ return rows.map((r) => r.id);
1186
+ }
1187
+
1188
+ export function upsertSlicePlanning(milestoneId: string, sliceId: string, planning: Partial<SlicePlanningRecord>): void {
1189
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1190
+ currentDb.prepare(
1191
+ `UPDATE slices SET
1192
+ goal = COALESCE(:goal, goal),
1193
+ success_criteria = COALESCE(:success_criteria, success_criteria),
1194
+ proof_level = COALESCE(:proof_level, proof_level),
1195
+ integration_closure = COALESCE(:integration_closure, integration_closure),
1196
+ observability_impact = COALESCE(:observability_impact, observability_impact),
1197
+ target_repositories = COALESCE(:target_repositories, target_repositories)
1198
+ WHERE milestone_id = :milestone_id AND id = :id`,
1199
+ ).run({
1200
+ ":milestone_id": milestoneId,
1201
+ ":id": sliceId,
1202
+ ":goal": planning.goal ?? null,
1203
+ ":success_criteria": planning.successCriteria ?? null,
1204
+ ":proof_level": planning.proofLevel ?? null,
1205
+ ":integration_closure": planning.integrationClosure ?? null,
1206
+ ":observability_impact": planning.observabilityImpact ?? null,
1207
+ ":target_repositories": planning.targetRepositories ? JSON.stringify(planning.targetRepositories) : null,
1208
+ });
1209
+ }
1210
+
1211
+ export function insertTask(t: {
1212
+ id: string;
1213
+ sliceId: string;
1214
+ milestoneId: string;
1215
+ title?: string;
1216
+ status?: string;
1217
+ oneLiner?: string;
1218
+ narrative?: string;
1219
+ verificationResult?: string;
1220
+ duration?: string;
1221
+ blockerDiscovered?: boolean;
1222
+ deviations?: string;
1223
+ knownIssues?: string;
1224
+ keyFiles?: string[];
1225
+ keyDecisions?: string[];
1226
+ fullSummaryMd?: string;
1227
+ sequence?: number;
1228
+ planning?: Partial<TaskPlanningRecord>;
1229
+ }): void {
1230
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1231
+ currentDb.prepare(
1232
+ `INSERT INTO tasks (
1233
+ milestone_id, slice_id, id, title, status, one_liner, narrative,
1234
+ verification_result, duration, completed_at, blocker_discovered,
1235
+ deviations, known_issues, key_files, key_decisions, full_summary_md,
1236
+ description, estimate, files, verify, inputs, expected_output, observability_impact, sequence
1237
+ , target_repositories
1238
+ ) VALUES (
1239
+ :milestone_id, :slice_id, :id, :title, :status, :one_liner, :narrative,
1240
+ :verification_result, :duration, :completed_at, :blocker_discovered,
1241
+ :deviations, :known_issues, :key_files, :key_decisions, :full_summary_md,
1242
+ :description, :estimate, :files, :verify, :inputs, :expected_output, :observability_impact, :sequence
1243
+ , :target_repositories
1244
+ )
1245
+ ON CONFLICT(milestone_id, slice_id, id) DO UPDATE SET
1246
+ title = CASE WHEN NULLIF(:title, '') IS NOT NULL THEN :title ELSE tasks.title END,
1247
+ status = :status,
1248
+ one_liner = :one_liner,
1249
+ narrative = :narrative,
1250
+ verification_result = :verification_result,
1251
+ duration = :duration,
1252
+ completed_at = :completed_at,
1253
+ blocker_discovered = :blocker_discovered,
1254
+ deviations = :deviations,
1255
+ known_issues = :known_issues,
1256
+ key_files = :key_files,
1257
+ key_decisions = :key_decisions,
1258
+ full_summary_md = :full_summary_md,
1259
+ description = CASE WHEN NULLIF(:description, '') IS NOT NULL THEN :description ELSE tasks.description END,
1260
+ estimate = CASE WHEN NULLIF(:estimate, '') IS NOT NULL THEN :estimate ELSE tasks.estimate END,
1261
+ files = CASE WHEN NULLIF(:files, '[]') IS NOT NULL THEN :files ELSE tasks.files END,
1262
+ verify = CASE WHEN NULLIF(:verify, '') IS NOT NULL THEN :verify ELSE tasks.verify END,
1263
+ inputs = CASE WHEN NULLIF(:inputs, '[]') IS NOT NULL THEN :inputs ELSE tasks.inputs END,
1264
+ expected_output = CASE WHEN NULLIF(:expected_output, '[]') IS NOT NULL THEN :expected_output ELSE tasks.expected_output END,
1265
+ observability_impact = CASE WHEN NULLIF(:observability_impact, '') IS NOT NULL THEN :observability_impact ELSE tasks.observability_impact END,
1266
+ sequence = :sequence,
1267
+ target_repositories = CASE
1268
+ WHEN :raw_target_repositories IS NOT NULL THEN :target_repositories
1269
+ ELSE tasks.target_repositories
1270
+ END`,
1271
+ ).run({
1272
+ ":milestone_id": t.milestoneId,
1273
+ ":slice_id": t.sliceId,
1274
+ ":id": t.id,
1275
+ ":title": t.title ?? "",
1276
+ ":status": t.status ?? "pending",
1277
+ ":one_liner": t.oneLiner ?? "",
1278
+ ":narrative": t.narrative ?? "",
1279
+ ":verification_result": t.verificationResult ?? "",
1280
+ ":duration": t.duration ?? "",
1281
+ ":completed_at": t.status === "done" || t.status === "complete" ? new Date().toISOString() : null,
1282
+ ":blocker_discovered": t.blockerDiscovered ? 1 : 0,
1283
+ ":deviations": t.deviations ?? "",
1284
+ ":known_issues": t.knownIssues ?? "",
1285
+ ":key_files": JSON.stringify(t.keyFiles ?? []),
1286
+ ":key_decisions": JSON.stringify(t.keyDecisions ?? []),
1287
+ ":full_summary_md": t.fullSummaryMd ?? "",
1288
+ ":description": t.planning?.description ?? "",
1289
+ ":estimate": t.planning?.estimate ?? "",
1290
+ ":files": JSON.stringify(t.planning?.files ?? []),
1291
+ ":verify": t.planning?.verify ?? "",
1292
+ ":inputs": JSON.stringify(t.planning?.inputs ?? []),
1293
+ ":expected_output": JSON.stringify(t.planning?.expectedOutput ?? []),
1294
+ ":observability_impact": t.planning?.observabilityImpact ?? "",
1295
+ ":sequence": t.sequence ?? 0,
1296
+ ":target_repositories": JSON.stringify(t.planning?.targetRepositories ?? []),
1297
+ ":raw_target_repositories":
1298
+ t.planning && "targetRepositories" in t.planning
1299
+ ? JSON.stringify(t.planning.targetRepositories ?? [])
1300
+ : null,
1301
+ });
1302
+ }
1303
+
1304
+ export function updateTaskStatus(milestoneId: string, sliceId: string, taskId: string, status: string, completedAt?: string): void {
1305
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1306
+ currentDb.prepare(
1307
+ `UPDATE tasks SET status = :status, completed_at = :completed_at
1308
+ WHERE milestone_id = :milestone_id AND slice_id = :slice_id AND id = :id`,
1309
+ ).run({
1310
+ ":status": status,
1311
+ ":completed_at": completedAt ?? null,
1312
+ ":milestone_id": milestoneId,
1313
+ ":slice_id": sliceId,
1314
+ ":id": taskId,
1315
+ });
1316
+ }
1317
+
1318
+ export function setTaskBlockerDiscovered(milestoneId: string, sliceId: string, taskId: string, discovered: boolean): void {
1319
+ if (!currentDb) return;
1320
+ currentDb.prepare(
1321
+ `UPDATE tasks SET blocker_discovered = :discovered WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
1322
+ ).run({ ":discovered": discovered ? 1 : 0, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1323
+ }
1324
+
1325
+ export function upsertTaskPlanning(milestoneId: string, sliceId: string, taskId: string, planning: Partial<TaskPlanningRecord>): void {
1326
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1327
+ currentDb.prepare(
1328
+ `UPDATE tasks SET
1329
+ title = COALESCE(:title, title),
1330
+ description = COALESCE(:description, description),
1331
+ estimate = COALESCE(:estimate, estimate),
1332
+ files = COALESCE(:files, files),
1333
+ verify = COALESCE(:verify, verify),
1334
+ inputs = COALESCE(:inputs, inputs),
1335
+ expected_output = COALESCE(:expected_output, expected_output),
1336
+ observability_impact = COALESCE(:observability_impact, observability_impact),
1337
+ full_plan_md = COALESCE(:full_plan_md, full_plan_md),
1338
+ target_repositories = COALESCE(:target_repositories, target_repositories)
1339
+ WHERE milestone_id = :milestone_id AND slice_id = :slice_id AND id = :id`,
1340
+ ).run({
1341
+ ":milestone_id": milestoneId,
1342
+ ":slice_id": sliceId,
1343
+ ":id": taskId,
1344
+ ":title": planning.title ?? null,
1345
+ ":description": planning.description ?? null,
1346
+ ":estimate": planning.estimate ?? null,
1347
+ ":files": planning.files ? JSON.stringify(planning.files) : null,
1348
+ ":verify": planning.verify ?? null,
1349
+ ":inputs": planning.inputs ? JSON.stringify(planning.inputs) : null,
1350
+ ":expected_output": planning.expectedOutput ? JSON.stringify(planning.expectedOutput) : null,
1351
+ ":observability_impact": planning.observabilityImpact ?? null,
1352
+ ":full_plan_md": planning.fullPlanMd ?? null,
1353
+ ":target_repositories": planning.targetRepositories ? JSON.stringify(planning.targetRepositories) : null,
1354
+ });
1355
+ }
1356
+
1357
+ export function getSlice(milestoneId: string, sliceId: string): SliceRow | null {
1358
+ if (!currentDb) return null;
1359
+ const row = currentDb.prepare("SELECT * FROM slices WHERE milestone_id = :mid AND id = :sid").get({ ":mid": milestoneId, ":sid": sliceId });
1360
+ if (!row) return null;
1361
+ return rowToSlice(row);
1362
+ }
1363
+
1364
+ export function updateSliceStatus(milestoneId: string, sliceId: string, status: string, completedAt?: string): void {
1365
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1366
+ currentDb.prepare(
1367
+ `UPDATE slices SET status = :status, completed_at = :completed_at
1368
+ WHERE milestone_id = :milestone_id AND id = :id`,
1369
+ ).run({
1370
+ ":status": status,
1371
+ ":completed_at": completedAt ?? null,
1372
+ ":milestone_id": milestoneId,
1373
+ ":id": sliceId,
1374
+ });
1375
+ }
1376
+
1377
+ export function setTaskSummaryMd(milestoneId: string, sliceId: string, taskId: string, md: string): void {
1378
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1379
+ currentDb.prepare(
1380
+ `UPDATE tasks SET full_summary_md = :md WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
1381
+ ).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId, ":md": md });
1382
+ }
1383
+
1384
+ export function setSliceSummaryMd(milestoneId: string, sliceId: string, summaryMd: string, uatMd: string): void {
1385
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1386
+ currentDb.prepare(
1387
+ `UPDATE slices SET full_summary_md = :summary_md, full_uat_md = :uat_md WHERE milestone_id = :mid AND id = :sid`,
1388
+ ).run({ ":mid": milestoneId, ":sid": sliceId, ":summary_md": summaryMd, ":uat_md": uatMd });
1389
+ }
1390
+
1391
+ export function getTask(milestoneId: string, sliceId: string, taskId: string): TaskRow | null {
1392
+ if (!currentDb) return null;
1393
+ const row = currentDb.prepare(
1394
+ "SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid",
1395
+ ).get({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1396
+ if (!row) return null;
1397
+ return rowToTask(row);
1398
+ }
1399
+
1400
+ export function getSliceTasks(milestoneId: string, sliceId: string): TaskRow[] {
1401
+ if (!currentDb) return [];
1402
+ const rows = currentDb.prepare(
1403
+ "SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid ORDER BY sequence, id",
1404
+ ).all({ ":mid": milestoneId, ":sid": sliceId });
1405
+ return rows.map(rowToTask);
1406
+ }
1407
+
1408
+ export function getCompletedMilestoneTaskFileHints(milestoneId: string): string[] {
1409
+ if (!currentDb) return [];
1410
+ const rows = currentDb.prepare(
1411
+ `SELECT files, key_files
1412
+ FROM tasks
1413
+ WHERE milestone_id = :mid AND status IN ('complete', 'done')`,
1414
+ ).all({ ":mid": milestoneId }) as Array<Record<string, unknown>>;
1415
+
1416
+ const hints = new Set<string>();
1417
+ for (const row of rows) {
1418
+ for (const raw of [row["files"], row["key_files"]]) {
1419
+ for (const file of parseStringArrayColumn(raw)) {
1420
+ const normalized = normalizeRepoPath(file);
1421
+ if (normalized) hints.add(normalized);
1422
+ }
1423
+ }
1424
+ }
1425
+ return [...hints];
1426
+ }
1427
+
1428
+ function parseStringArrayColumn(raw: unknown): string[] {
1429
+ if (Array.isArray(raw)) return raw.filter((entry): entry is string => typeof entry === "string");
1430
+ if (typeof raw !== "string") return [];
1431
+ const trimmed = raw.trim();
1432
+ if (!trimmed) return [];
1433
+ try {
1434
+ const parsed = JSON.parse(trimmed);
1435
+ if (Array.isArray(parsed)) return parsed.filter((entry): entry is string => typeof entry === "string");
1436
+ if (typeof parsed === "string") return [parsed];
1437
+ } catch {
1438
+ return trimmed.split(",");
1439
+ }
1440
+ return [];
1441
+ }
1442
+
1443
+ function normalizeRepoPath(file: string): string {
1444
+ return file.trim().replace(/\\/g, "/").replace(/^\.\/+/, "");
1445
+ }
1446
+
1447
+ // ─── ADR-011 Phase 2 escalation helpers ──────────────────────────────────
1448
+
1449
+ /** Set pause-on-escalation state on a completed task. Mutually exclusive with awaiting_review. */
1450
+ export function setTaskEscalationPending(
1451
+ milestoneId: string, sliceId: string, taskId: string,
1452
+ artifactPath: string,
1453
+ ): void {
1454
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1455
+ currentDb.prepare(
1456
+ `UPDATE tasks
1457
+ SET escalation_pending = 1,
1458
+ escalation_awaiting_review = 0,
1459
+ escalation_artifact_path = :path
1460
+ WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
1461
+ ).run({ ":path": artifactPath, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1462
+ }
1463
+
1464
+ /** Set awaiting-review state (artifact exists but continueWithDefault=true, no pause). Mutually exclusive with pending. */
1465
+ export function setTaskEscalationAwaitingReview(
1466
+ milestoneId: string, sliceId: string, taskId: string,
1467
+ artifactPath: string,
1468
+ ): void {
1469
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1470
+ currentDb.prepare(
1471
+ `UPDATE tasks
1472
+ SET escalation_awaiting_review = 1,
1473
+ escalation_pending = 0,
1474
+ escalation_artifact_path = :path
1475
+ WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
1476
+ ).run({ ":path": artifactPath, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1477
+ }
1478
+
1479
+ /** Clear escalation-pending and awaiting-review flags once the user has resolved it. */
1480
+ export function clearTaskEscalationFlags(
1481
+ milestoneId: string, sliceId: string, taskId: string,
1482
+ ): void {
1483
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1484
+ currentDb.prepare(
1485
+ `UPDATE tasks
1486
+ SET escalation_pending = 0,
1487
+ escalation_awaiting_review = 0
1488
+ WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
1489
+ ).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1490
+ }
1491
+
1492
+ /**
1493
+ * Atomically claim a resolved escalation override for injection into a downstream
1494
+ * task's prompt. Returns true if this caller claimed it (must inject), false if
1495
+ * another caller already claimed it (must skip).
1496
+ */
1497
+ export function claimEscalationOverride(
1498
+ milestoneId: string, sliceId: string, sourceTaskId: string,
1499
+ ): boolean {
1500
+ if (!currentDb) return false;
1501
+ const now = new Date().toISOString();
1502
+ const result = currentDb.prepare(
1503
+ `UPDATE tasks
1504
+ SET escalation_override_applied_at = :now
1505
+ WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid
1506
+ AND escalation_override_applied_at IS NULL
1507
+ AND escalation_artifact_path IS NOT NULL`,
1508
+ ).run({ ":now": now, ":mid": milestoneId, ":sid": sliceId, ":tid": sourceTaskId });
1509
+ // node:sqlite + better-sqlite3 both surface `changes` on the run result.
1510
+ const changes = (result as { changes?: number }).changes ?? 0;
1511
+ return changes > 0;
1512
+ }
1513
+
1514
+ /** Find the most recent resolved-but-unapplied escalation override in a slice. */
1515
+ export function findUnappliedEscalationOverride(
1516
+ milestoneId: string, sliceId: string,
1517
+ ): { taskId: string; artifactPath: string } | null {
1518
+ if (!currentDb) return null;
1519
+ // Filter BOTH flags: escalation_pending=0 AND escalation_awaiting_review=0
1520
+ // ensures we only claim overrides the user has explicitly resolved.
1521
+ // Without the awaiting_review filter, continueWithDefault=true artifacts
1522
+ // (not yet responded to) would be prematurely claimed, causing the override
1523
+ // to be lost when the user later resolves (#ADR-011 Phase 2 peer-review Bug 2).
1524
+ const row = currentDb.prepare(
1525
+ `SELECT id, escalation_artifact_path AS path
1526
+ FROM tasks
1527
+ WHERE milestone_id = :mid AND slice_id = :sid
1528
+ AND escalation_artifact_path IS NOT NULL
1529
+ AND escalation_override_applied_at IS NULL
1530
+ AND escalation_pending = 0
1531
+ AND escalation_awaiting_review = 0
1532
+ ORDER BY sequence DESC, id DESC
1533
+ LIMIT 1`,
1534
+ ).get({ ":mid": milestoneId, ":sid": sliceId }) as
1535
+ | { id: string; path: string | null }
1536
+ | undefined;
1537
+ if (!row || !row.path) return null;
1538
+ return { taskId: row.id, artifactPath: row.path };
1539
+ }
1540
+
1541
+ /** Set the blocker_source provenance field (used when rejecting an escalation). */
1542
+ export function setTaskBlockerSource(
1543
+ milestoneId: string, sliceId: string, taskId: string, source: string,
1544
+ ): void {
1545
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1546
+ currentDb.prepare(
1547
+ `UPDATE tasks
1548
+ SET blocker_discovered = 1,
1549
+ blocker_source = :src
1550
+ WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
1551
+ ).run({ ":src": source, ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1552
+ }
1553
+
1554
+ /** List tasks with active escalation artifacts across a milestone (for /gsd escalate list). */
1555
+ export function listEscalationArtifacts(milestoneId: string, includeResolved: boolean = false): TaskRow[] {
1556
+ if (!currentDb) return [];
1557
+ const filter = includeResolved
1558
+ ? "escalation_artifact_path IS NOT NULL"
1559
+ : "(escalation_pending = 1 OR escalation_awaiting_review = 1) AND escalation_artifact_path IS NOT NULL";
1560
+ const rows = currentDb.prepare(
1561
+ `SELECT * FROM tasks WHERE milestone_id = :mid AND ${filter} ORDER BY slice_id, sequence, id`,
1562
+ ).all({ ":mid": milestoneId });
1563
+ return rows.map(rowToTask);
1564
+ }
1565
+
1566
+ export function insertVerificationEvidence(e: {
1567
+ taskId: string;
1568
+ sliceId: string;
1569
+ milestoneId: string;
1570
+ command: string;
1571
+ exitCode: number;
1572
+ verdict: string;
1573
+ durationMs: number;
1574
+ }): void {
1575
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1576
+ currentDb.prepare(
1577
+ `INSERT OR IGNORE INTO verification_evidence (task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at)
1578
+ VALUES (:task_id, :slice_id, :milestone_id, :command, :exit_code, :verdict, :duration_ms, :created_at)`,
1579
+ ).run({
1580
+ ":task_id": e.taskId,
1581
+ ":slice_id": e.sliceId,
1582
+ ":milestone_id": e.milestoneId,
1583
+ ":command": e.command,
1584
+ ":exit_code": e.exitCode,
1585
+ ":verdict": e.verdict,
1586
+ ":duration_ms": e.durationMs,
1587
+ ":created_at": new Date().toISOString(),
1588
+ });
1589
+ }
1590
+
1591
+ export interface VerificationEvidenceRow {
1592
+ id: number;
1593
+ task_id: string;
1594
+ slice_id: string;
1595
+ milestone_id: string;
1596
+ command: string;
1597
+ exit_code: number;
1598
+ verdict: string;
1599
+ duration_ms: number;
1600
+ created_at: string;
1601
+ }
1602
+
1603
+ export function getVerificationEvidence(milestoneId: string, sliceId: string, taskId: string): VerificationEvidenceRow[] {
1604
+ if (!currentDb) return [];
1605
+ const rows = currentDb.prepare(
1606
+ "SELECT * FROM verification_evidence WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid ORDER BY id",
1607
+ ).all({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
1608
+ return rows as unknown as VerificationEvidenceRow[];
1609
+ }
1610
+
1611
+ export function getAllMilestones(): MilestoneRow[] {
1612
+ if (!currentDb) return [];
1613
+ const rows = currentDb.prepare(
1614
+ "SELECT * FROM milestones ORDER BY CASE WHEN sequence > 0 THEN 0 ELSE 1 END, sequence, id",
1615
+ ).all();
1616
+ return rows.map(rowToMilestone);
1617
+ }
1618
+
1619
+ export function getMilestone(id: string): MilestoneRow | null {
1620
+ if (!currentDb) return null;
1621
+ const row = currentDb.prepare("SELECT * FROM milestones WHERE id = :id").get({ ":id": id });
1622
+ if (!row) return null;
1623
+ return rowToMilestone(row);
1624
+ }
1625
+
1626
+ export function setMilestoneQueueOrder(order: string[]): void {
1627
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1628
+ currentDb.exec("BEGIN IMMEDIATE");
1629
+ try {
1630
+ currentDb.prepare("UPDATE milestones SET sequence = 0").run();
1631
+ const stmt = currentDb.prepare("UPDATE milestones SET sequence = :sequence WHERE id = :id");
1632
+ order.forEach((id, index) => {
1633
+ stmt.run({ ":id": id, ":sequence": index + 1 });
1634
+ });
1635
+ currentDb.exec("COMMIT");
1636
+ } catch (err) {
1637
+ currentDb.exec("ROLLBACK");
1638
+ throw err;
1639
+ }
1640
+ }
1641
+
1642
+ /**
1643
+ * Update a milestone's status in the database.
1644
+ * Used by park/unpark to keep the DB in sync with the filesystem marker.
1645
+ * See: https://github.com/open-gsd/gsd-pi/issues/2694
1646
+ */
1647
+ export function updateMilestoneStatus(milestoneId: string, status: string, completedAt?: string | null): void {
1648
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
1649
+ currentDb.prepare(
1650
+ `UPDATE milestones SET status = :status, completed_at = :completed_at WHERE id = :id`,
1651
+ ).run({ ":status": status, ":completed_at": completedAt ?? null, ":id": milestoneId });
1652
+ }
1653
+
1654
+ export function getActiveMilestoneFromDb(): MilestoneRow | null {
1655
+ if (!currentDb) return null;
1656
+ const row = currentDb.prepare(
1657
+ "SELECT * FROM milestones WHERE status NOT IN ('complete', 'done', 'skipped', 'closed', 'parked') ORDER BY id LIMIT 1",
1658
+ ).get();
1659
+ if (!row) return null;
1660
+ return rowToMilestone(row);
1661
+ }
1662
+
1663
+ export function getActiveSliceFromDb(milestoneId: string): SliceRow | null {
1664
+ if (!currentDb) return null;
1665
+
1666
+ // Single query: find the first non-complete slice whose dependencies are all satisfied.
1667
+ // Uses json_each() to expand the JSON depends array and checks each dep is complete.
1668
+ const row = currentDb.prepare(
1669
+ `SELECT s.* FROM slices s
1670
+ WHERE s.milestone_id = :mid
1671
+ AND s.status NOT IN ('complete', 'done', 'skipped')
1672
+ AND NOT EXISTS (
1673
+ SELECT 1 FROM json_each(s.depends) AS dep
1674
+ WHERE dep.value NOT IN (
1675
+ SELECT id FROM slices WHERE milestone_id = :mid AND status IN ('complete', 'done', 'skipped')
1676
+ )
1677
+ )
1678
+ ORDER BY s.sequence, s.id
1679
+ LIMIT 1`,
1680
+ ).get({ ":mid": milestoneId });
1681
+ if (!row) return null;
1682
+ return rowToSlice(row);
1683
+ }
1684
+
1685
+ export function getActiveTaskFromDb(milestoneId: string, sliceId: string): TaskRow | null {
1686
+ if (!currentDb) return null;
1687
+ const row = currentDb.prepare(
1688
+ "SELECT * FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND status NOT IN ('complete', 'done') ORDER BY sequence, id LIMIT 1",
1689
+ ).get({ ":mid": milestoneId, ":sid": sliceId });
1690
+ if (!row) return null;
1691
+ return rowToTask(row);
1692
+ }
1693
+
1694
+ export function getMilestoneSlices(milestoneId: string): SliceRow[] {
1695
+ if (!currentDb) return [];
1696
+ const rows = currentDb.prepare("SELECT * FROM slices WHERE milestone_id = :mid ORDER BY sequence, id").all({ ":mid": milestoneId });
1697
+ return rows.map(rowToSlice);
1698
+ }
1699
+
1700
+ export function getArtifact(path: string): ArtifactRow | null {
1701
+ if (!currentDb) return null;
1702
+ const row = currentDb.prepare("SELECT * FROM artifacts WHERE path = :path").get({ ":path": path });
1703
+ if (!row) return null;
1704
+ return rowToArtifact(row);
1705
+ }
1706
+
1707
+ // ─── Lightweight Query Variants (hot-path optimized) ─────────────────────
1708
+
1709
+ /** Fast milestone status check — avoids deserializing JSON planning fields. */
1710
+ export function getActiveMilestoneIdFromDb(): IdStatusSummary | null {
1711
+ if (!currentDb) return null;
1712
+ const row = currentDb.prepare(
1713
+ "SELECT id, status FROM milestones WHERE status NOT IN ('complete', 'done', 'skipped', 'closed', 'parked') ORDER BY id LIMIT 1",
1714
+ ).get();
1715
+ if (!row) return null;
1716
+ return rowToIdStatusSummary(row);
1717
+ }
1718
+
1719
+ /** Fast slice status check — avoids deserializing JSON depends/planning fields. */
1720
+ export function getSliceStatusSummary(milestoneId: string): IdStatusSummary[] {
1721
+ if (!currentDb) return [];
1722
+ return currentDb.prepare(
1723
+ "SELECT id, status FROM slices WHERE milestone_id = :mid ORDER BY sequence, id",
1724
+ ).all({ ":mid": milestoneId }).map(rowToIdStatusSummary);
1725
+ }
1726
+
1727
+ /** Fast task status check — avoids deserializing JSON arrays and large text fields. */
1728
+ export function getActiveTaskIdFromDb(milestoneId: string, sliceId: string): ActiveTaskSummary | null {
1729
+ if (!currentDb) return null;
1730
+ const row = currentDb.prepare(
1731
+ "SELECT id, status, title FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND status NOT IN ('complete', 'done') ORDER BY sequence, id LIMIT 1",
1732
+ ).get({ ":mid": milestoneId, ":sid": sliceId });
1733
+ if (!row) return null;
1734
+ return rowToActiveTaskSummary(row);
1735
+ }
1736
+
1737
+ /** Count tasks by status for a slice — useful for progress reporting without full row load. */
1738
+ export function getSliceTaskCounts(milestoneId: string, sliceId: string): TaskStatusCounts {
1739
+ if (!currentDb) return emptyTaskStatusCounts();
1740
+ const row = currentDb.prepare(
1741
+ `SELECT
1742
+ COUNT(*) as total,
1743
+ SUM(CASE WHEN status IN ('complete', 'done') THEN 1 ELSE 0 END) as done,
1744
+ SUM(CASE WHEN status NOT IN ('complete', 'done') THEN 1 ELSE 0 END) as pending
1745
+ FROM tasks WHERE milestone_id = :mid AND slice_id = :sid`,
1746
+ ).get({ ":mid": milestoneId, ":sid": sliceId });
1747
+ return rowToTaskStatusCounts(row);
1748
+ }
1749
+
1750
+ // ─── Slice Dependencies (junction table) ─────────────────────────────────
1751
+
1752
+ /** Sync the slice_dependencies junction table from a slice's JSON depends array. */
1753
+ export function syncSliceDependencies(milestoneId: string, sliceId: string, depends: string[]): void {
1754
+ if (!currentDb) return;
1755
+ currentDb.prepare(
1756
+ "DELETE FROM slice_dependencies WHERE milestone_id = :mid AND slice_id = :sid",
1757
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
1758
+ for (const dep of depends) {
1759
+ currentDb.prepare(
1760
+ "INSERT OR IGNORE INTO slice_dependencies (milestone_id, slice_id, depends_on_slice_id) VALUES (:mid, :sid, :dep)",
1761
+ ).run({ ":mid": milestoneId, ":sid": sliceId, ":dep": dep });
1762
+ }
1763
+ }
1764
+
1765
+ /** Get all slices that depend on a given slice. */
1766
+ export function getDependentSlices(milestoneId: string, sliceId: string): string[] {
1767
+ if (!currentDb) return [];
1768
+ const rows = currentDb.prepare(
1769
+ "SELECT slice_id FROM slice_dependencies WHERE milestone_id = :mid AND depends_on_slice_id = :sid",
1770
+ ).all({ ":mid": milestoneId, ":sid": sliceId });
1771
+ return rowsToStringColumn(rows, "slice_id");
1772
+ }
1773
+
1774
+ // ─── Worktree DB Helpers ──────────────────────────────────────────────────
1775
+
1776
+ export function copyWorktreeDb(srcDbPath: string, destDbPath: string): boolean {
1777
+ try {
1778
+ if (!existsSync(srcDbPath)) return false;
1779
+ const destDir = dirname(destDbPath);
1780
+ mkdirSync(destDir, { recursive: true });
1781
+ copyFileSync(srcDbPath, destDbPath);
1782
+ return true;
1783
+ } catch (err) {
1784
+ logError("db", "failed to copy DB to worktree", { error: (err as Error).message });
1785
+ return false;
1786
+ }
1787
+ }
1788
+
1789
+ export interface ReconcileResult {
1790
+ decisions: number;
1791
+ requirements: number;
1792
+ artifacts: number;
1793
+ milestones: number;
1794
+ slices: number;
1795
+ tasks: number;
1796
+ memories: number;
1797
+ verification_evidence: number;
1798
+ conflicts: string[];
1799
+ }
1800
+
1801
+ export function reconcileWorktreeDb(
1802
+ mainDbPath: string,
1803
+ worktreeDbPath: string,
1804
+ ): ReconcileResult {
1805
+ const zero: ReconcileResult = { decisions: 0, requirements: 0, artifacts: 0, milestones: 0, slices: 0, tasks: 0, memories: 0, verification_evidence: 0, conflicts: [] };
1806
+ if (!existsSync(worktreeDbPath)) return zero;
1807
+ // Guard: bail when both paths resolve to the same physical file.
1808
+ // ATTACHing a WAL-mode DB to itself corrupts the WAL (#2823).
1809
+ try {
1810
+ if (realpathSync(mainDbPath) === realpathSync(worktreeDbPath)) return zero;
1811
+ } catch (e) { logWarning("db", `realpathSync failed: ${(e as Error).message}`); }
1812
+ // Sanitize path: reject any characters that could break ATTACH syntax.
1813
+ // ATTACH DATABASE doesn't support parameterized paths in all providers,
1814
+ // so we use strict allowlist validation instead.
1815
+ if (/['";\x00]/.test(worktreeDbPath)) {
1816
+ logError("db", "worktree DB reconciliation failed: path contains unsafe characters");
1817
+ return zero;
1818
+ }
1819
+ if (!currentDb) {
1820
+ const opened = openDatabase(mainDbPath);
1821
+ if (!opened) {
1822
+ logError("db", "worktree DB reconciliation failed: cannot open main DB");
1823
+ return zero;
1824
+ }
1825
+ }
1826
+ const adapter = currentDb!;
1827
+ const conflicts: string[] = [];
1828
+ try {
1829
+ adapter.exec(`ATTACH DATABASE '${worktreeDbPath}' AS wt`);
1830
+ try {
1831
+ const wtInfo = adapter.prepare("PRAGMA wt.table_info('decisions')").all();
1832
+ const hasMadeBy = wtInfo.some((col) => col["name"] === "made_by");
1833
+ // ADR-011: worktree may predate schema v16/v17. For missing columns we
1834
+ // fall through to the main DB's existing value (not a literal default)
1835
+ // so reconcile never silently clears state the main tree has recorded.
1836
+ const hasDecisionSource = wtInfo.some((col) => col["name"] === "source");
1837
+ const wtMilestoneInfo = adapter.prepare("PRAGMA wt.table_info('milestones')").all();
1838
+ const hasMilestoneSequence = wtMilestoneInfo.some((col) => col["name"] === "sequence");
1839
+ const wtSliceInfo = adapter.prepare("PRAGMA wt.table_info('slices')").all();
1840
+ const hasIsSketch = wtSliceInfo.some((col) => col["name"] === "is_sketch");
1841
+ const hasSketchScope = wtSliceInfo.some((col) => col["name"] === "sketch_scope");
1842
+ const hasSliceTargetRepositories = wtSliceInfo.some((col) => col["name"] === "target_repositories");
1843
+ const wtTaskInfo = adapter.prepare("PRAGMA wt.table_info('tasks')").all();
1844
+ const hasTaskTargetRepositories = wtTaskInfo.some((col) => col["name"] === "target_repositories");
1845
+ const hasBlockerSource = wtTaskInfo.some((col) => col["name"] === "blocker_source");
1846
+ const hasEscalationPending = wtTaskInfo.some((col) => col["name"] === "escalation_pending");
1847
+ const hasEscalationAwaiting = wtTaskInfo.some((col) => col["name"] === "escalation_awaiting_review");
1848
+ const hasEscalationArtifact = wtTaskInfo.some((col) => col["name"] === "escalation_artifact_path");
1849
+ const hasEscalationOverride = wtTaskInfo.some((col) => col["name"] === "escalation_override_applied_at");
1850
+ const wtArtifactInfo = adapter.prepare("PRAGMA wt.table_info('artifacts')").all();
1851
+ const hasArtifactContentHash = wtArtifactInfo.some((col) => col["name"] === "content_hash");
1852
+ const wtMemoryInfo = adapter.prepare("PRAGMA wt.table_info('memories')").all();
1853
+ const hasMemoryScope = wtMemoryInfo.some((col) => col["name"] === "scope");
1854
+ const hasMemoryTags = wtMemoryInfo.some((col) => col["name"] === "tags");
1855
+ const hasMemoryStructuredFields = wtMemoryInfo.some((col) => col["name"] === "structured_fields");
1856
+ const hasMemoryLastHitAt = wtMemoryInfo.some((col) => col["name"] === "last_hit_at");
1857
+
1858
+ const decConf = adapter.prepare(
1859
+ `SELECT m.id FROM decisions m INNER JOIN wt.decisions w ON m.id = w.id WHERE m.decision != w.decision OR m.choice != w.choice OR m.rationale != w.rationale OR ${
1860
+ hasMadeBy ? "m.made_by != w.made_by" : "'agent' != 'agent'"
1861
+ } OR m.superseded_by IS NOT w.superseded_by`,
1862
+ ).all();
1863
+ for (const row of decConf) conflicts.push(`decision ${(row as Record<string, unknown>)["id"]}: modified in both`);
1864
+
1865
+ const reqConf = adapter.prepare(
1866
+ `SELECT m.id FROM requirements m INNER JOIN wt.requirements w ON m.id = w.id WHERE m.description != w.description OR m.status != w.status OR m.notes != w.notes OR m.superseded_by IS NOT w.superseded_by`,
1867
+ ).all();
1868
+ for (const row of reqConf) conflicts.push(`requirement ${(row as Record<string, unknown>)["id"]}: modified in both`);
1869
+
1870
+ const merged: Omit<ReconcileResult, "conflicts"> = { decisions: 0, requirements: 0, artifacts: 0, milestones: 0, slices: 0, tasks: 0, memories: 0, verification_evidence: 0 };
1871
+
1872
+ function countChanges(result: unknown): number {
1873
+ return typeof result === "object" && result !== null ? ((result as { changes?: number }).changes ?? 0) : 0;
1874
+ }
1875
+
1876
+ adapter.exec("BEGIN");
1877
+ try {
1878
+ // Join the target decisions so we can prefer an existing main.source
1879
+ // when the worktree predates v16 — otherwise a write-through reconcile
1880
+ // would clobber 'escalation'-sourced decisions with the literal default.
1881
+ merged.decisions = countChanges(adapter.prepare(`
1882
+ INSERT OR REPLACE INTO decisions (
1883
+ id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by
1884
+ )
1885
+ SELECT w.id, w.when_context, w.scope, w.decision, w.choice, w.rationale, w.revisable, ${
1886
+ hasMadeBy ? "w.made_by" : "COALESCE(m.made_by, 'agent')"
1887
+ }, ${
1888
+ hasDecisionSource ? "w.source" : "COALESCE(m.source, 'discussion')"
1889
+ }, w.superseded_by
1890
+ FROM wt.decisions w
1891
+ LEFT JOIN decisions m ON m.id = w.id
1892
+ `).run());
1893
+
1894
+ merged.requirements = countChanges(adapter.prepare(`
1895
+ INSERT OR REPLACE INTO requirements (
1896
+ id, class, status, description, why, source, primary_owner,
1897
+ supporting_slices, validation, notes, full_content, superseded_by
1898
+ )
1899
+ SELECT id, class, status, description, why, source, primary_owner,
1900
+ supporting_slices, validation, notes, full_content, superseded_by
1901
+ FROM wt.requirements
1902
+ `).run());
1903
+
1904
+ // V27: preserve content_hash. If the worktree predates V27 (no column),
1905
+ // fall back to the main DB's existing hash so reconcile doesn't null
1906
+ // out integrity fingerprints on artifacts that were unchanged in wt.
1907
+ merged.artifacts = countChanges(adapter.prepare(`
1908
+ INSERT OR REPLACE INTO artifacts (
1909
+ path, artifact_type, milestone_id, slice_id, task_id, full_content, imported_at, content_hash
1910
+ )
1911
+ SELECT w.path, w.artifact_type, w.milestone_id, w.slice_id, w.task_id, w.full_content, w.imported_at,
1912
+ ${hasArtifactContentHash ? "w.content_hash" : "m.content_hash"}
1913
+ FROM wt.artifacts w
1914
+ LEFT JOIN artifacts m ON m.path = w.path
1915
+ `).run());
1916
+
1917
+ // Merge milestones — worktree may have updated status/planning fields.
1918
+ // Never downgrade status: complete > active > pre-planning (#4372).
1919
+ // A stale worktree may carry an older 'active' status for a milestone
1920
+ // that the main DB has already marked 'complete'; preserve the higher status.
1921
+ merged.milestones = countChanges(adapter.prepare(`
1922
+ INSERT OR REPLACE INTO milestones (
1923
+ id, title, status, depends_on, created_at, completed_at,
1924
+ vision, success_criteria, key_risks, proof_strategy,
1925
+ verification_contract, verification_integration, verification_operational, verification_uat,
1926
+ definition_of_done, requirement_coverage, boundary_map_markdown, sequence
1927
+ )
1928
+ SELECT w.id, w.title,
1929
+ CASE
1930
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1931
+ THEN m.status ELSE w.status
1932
+ END,
1933
+ w.depends_on,
1934
+ CASE
1935
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1936
+ THEN m.created_at ELSE w.created_at
1937
+ END,
1938
+ CASE
1939
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1940
+ THEN m.completed_at ELSE w.completed_at
1941
+ END,
1942
+ w.vision, w.success_criteria, w.key_risks, w.proof_strategy,
1943
+ w.verification_contract, w.verification_integration, w.verification_operational, w.verification_uat,
1944
+ w.definition_of_done, w.requirement_coverage, w.boundary_map_markdown,
1945
+ ${hasMilestoneSequence ? "COALESCE(w.sequence, 0)" : "COALESCE(m.sequence, 0)"}
1946
+ FROM wt.milestones w
1947
+ LEFT JOIN milestones m ON m.id = w.id
1948
+ `).run());
1949
+
1950
+ // Merge slices — preserve worktree progress but never downgrade completed status (#2558).
1951
+ // ADR-011 Phase 1: carry is_sketch + sketch_scope so reconcile doesn't
1952
+ // silently clear sketch metadata. When the worktree predates v16,
1953
+ // fall back to the main DB's existing value rather than a literal 0/''.
1954
+ merged.slices = countChanges(adapter.prepare(`
1955
+ INSERT OR REPLACE INTO slices (
1956
+ milestone_id, id, title, status, risk, depends, demo, created_at, completed_at,
1957
+ full_summary_md, full_uat_md, goal, success_criteria, proof_level,
1958
+ integration_closure, observability_impact, target_repositories, sequence, replan_triggered_at,
1959
+ is_sketch, sketch_scope
1960
+ )
1961
+ SELECT w.milestone_id, w.id, w.title,
1962
+ CASE
1963
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1964
+ THEN m.status ELSE w.status
1965
+ END,
1966
+ w.risk, w.depends, w.demo, w.created_at,
1967
+ CASE
1968
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1969
+ THEN m.completed_at ELSE w.completed_at
1970
+ END,
1971
+ w.full_summary_md, w.full_uat_md, w.goal, w.success_criteria, w.proof_level,
1972
+ w.integration_closure, w.observability_impact,
1973
+ ${hasSliceTargetRepositories ? "COALESCE(w.target_repositories, m.target_repositories, '[]')" : "COALESCE(m.target_repositories, '[]')"},
1974
+ w.sequence, w.replan_triggered_at,
1975
+ ${hasIsSketch ? "w.is_sketch" : "COALESCE(m.is_sketch, 0)"},
1976
+ ${hasSketchScope ? "w.sketch_scope" : "COALESCE(m.sketch_scope, '')"}
1977
+ FROM wt.slices w
1978
+ LEFT JOIN slices m ON m.milestone_id = w.milestone_id AND m.id = w.id
1979
+ `).run());
1980
+
1981
+ // Merge tasks — preserve execution results, never downgrade completed status (#2558).
1982
+ // ADR-011 P2: carry blocker_source + escalation_* columns so worktree reconcile
1983
+ // doesn't silently clear escalation state back to defaults.
1984
+ merged.tasks = countChanges(adapter.prepare(`
1985
+ INSERT OR REPLACE INTO tasks (
1986
+ milestone_id, slice_id, id, title, status, one_liner, narrative,
1987
+ verification_result, duration, completed_at, blocker_discovered,
1988
+ deviations, known_issues, key_files, key_decisions, full_summary_md,
1989
+ description, estimate, files, verify, inputs, expected_output,
1990
+ observability_impact, full_plan_md, target_repositories, sequence,
1991
+ blocker_source, escalation_pending, escalation_awaiting_review,
1992
+ escalation_artifact_path, escalation_override_applied_at
1993
+ )
1994
+ SELECT w.milestone_id, w.slice_id, w.id, w.title,
1995
+ CASE
1996
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
1997
+ THEN m.status ELSE w.status
1998
+ END,
1999
+ w.one_liner, w.narrative,
2000
+ w.verification_result, w.duration,
2001
+ CASE
2002
+ WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
2003
+ THEN m.completed_at ELSE w.completed_at
2004
+ END,
2005
+ w.blocker_discovered,
2006
+ w.deviations, w.known_issues, w.key_files, w.key_decisions, w.full_summary_md,
2007
+ w.description, w.estimate, w.files, w.verify, w.inputs, w.expected_output,
2008
+ w.observability_impact, w.full_plan_md,
2009
+ ${hasTaskTargetRepositories ? "COALESCE(w.target_repositories, m.target_repositories, '[]')" : "COALESCE(m.target_repositories, '[]')"},
2010
+ w.sequence,
2011
+ ${hasBlockerSource ? "w.blocker_source" : "COALESCE(m.blocker_source, '')"},
2012
+ ${hasEscalationPending ? "w.escalation_pending" : "COALESCE(m.escalation_pending, 0)"},
2013
+ ${hasEscalationAwaiting ? "w.escalation_awaiting_review" : "COALESCE(m.escalation_awaiting_review, 0)"},
2014
+ ${hasEscalationArtifact ? "w.escalation_artifact_path" : "m.escalation_artifact_path"},
2015
+ ${hasEscalationOverride ? "w.escalation_override_applied_at" : "m.escalation_override_applied_at"}
2016
+ FROM wt.tasks w
2017
+ LEFT JOIN tasks m ON m.milestone_id = w.milestone_id AND m.slice_id = w.slice_id AND m.id = w.id
2018
+ `).run());
2019
+
2020
+ // Merge memories — keep worktree-learned insights.
2021
+ // V18 (scope, tags), V21 (structured_fields), V28 (last_hit_at): for each
2022
+ // column the wt may not yet have (older worktree DB), fall back to the
2023
+ // main DB's existing value via LEFT JOIN so reconcile never silently
2024
+ // resets these fields to defaults on rows that already had them.
2025
+ merged.memories = countChanges(adapter.prepare(`
2026
+ INSERT OR REPLACE INTO memories (
2027
+ seq, id, category, content, confidence, source_unit_type, source_unit_id,
2028
+ created_at, updated_at, superseded_by, hit_count,
2029
+ scope, tags, structured_fields, last_hit_at
2030
+ )
2031
+ SELECT w.seq, w.id, w.category, w.content, w.confidence, w.source_unit_type, w.source_unit_id,
2032
+ w.created_at, w.updated_at, w.superseded_by, w.hit_count,
2033
+ ${hasMemoryScope ? "w.scope" : "COALESCE(m.scope, 'project')"},
2034
+ ${hasMemoryTags ? "w.tags" : "COALESCE(m.tags, '[]')"},
2035
+ ${hasMemoryStructuredFields ? "w.structured_fields" : "m.structured_fields"},
2036
+ ${hasMemoryLastHitAt ? "w.last_hit_at" : "m.last_hit_at"}
2037
+ FROM wt.memories w
2038
+ LEFT JOIN memories m ON m.id = w.id
2039
+ `).run());
2040
+
2041
+ // Merge verification evidence — append-only, use INSERT OR IGNORE to avoid duplicates
2042
+ merged.verification_evidence = countChanges(adapter.prepare(`
2043
+ INSERT OR IGNORE INTO verification_evidence (
2044
+ task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at
2045
+ )
2046
+ SELECT task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at
2047
+ FROM wt.verification_evidence
2048
+ `).run());
2049
+
2050
+ adapter.exec("COMMIT");
2051
+ } catch (txErr) {
2052
+ try { adapter.exec("ROLLBACK"); } catch (e) { logWarning("db", `rollback failed: ${(e as Error).message}`); }
2053
+ throw txErr;
2054
+ }
2055
+ return { ...merged, conflicts };
2056
+ } finally {
2057
+ try { adapter.exec("DETACH DATABASE wt"); } catch (e) { logWarning("db", `detach worktree DB failed: ${(e as Error).message}`); }
2058
+ }
2059
+ } catch (err) {
2060
+ logError("db", "worktree DB reconciliation failed", { error: (err as Error).message });
2061
+ return { ...zero, conflicts };
2062
+ }
2063
+ }
2064
+
2065
+ // ─── Replan & Assessment Helpers ──────────────────────────────────────────
2066
+
2067
+ export function insertReplanHistory(entry: {
2068
+ milestoneId: string;
2069
+ sliceId?: string | null;
2070
+ taskId?: string | null;
2071
+ summary: string;
2072
+ previousArtifactPath?: string | null;
2073
+ replacementArtifactPath?: string | null;
2074
+ }): void {
2075
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2076
+ // INSERT OR REPLACE: idempotent on (milestone_id, slice_id, task_id) via schema v11 unique index.
2077
+ // Retrying the same replan silently updates summary instead of accumulating duplicate rows.
2078
+ currentDb.prepare(
2079
+ `INSERT OR REPLACE INTO replan_history (milestone_id, slice_id, task_id, summary, previous_artifact_path, replacement_artifact_path, created_at)
2080
+ VALUES (:milestone_id, :slice_id, :task_id, :summary, :previous_artifact_path, :replacement_artifact_path, :created_at)`,
2081
+ ).run({
2082
+ ":milestone_id": entry.milestoneId,
2083
+ ":slice_id": entry.sliceId ?? null,
2084
+ ":task_id": entry.taskId ?? null,
2085
+ ":summary": entry.summary,
2086
+ ":previous_artifact_path": entry.previousArtifactPath ?? null,
2087
+ ":replacement_artifact_path": entry.replacementArtifactPath ?? null,
2088
+ ":created_at": new Date().toISOString(),
2089
+ });
2090
+ }
2091
+
2092
+ export function insertAssessment(entry: {
2093
+ path: string;
2094
+ milestoneId: string;
2095
+ sliceId?: string | null;
2096
+ taskId?: string | null;
2097
+ status: string;
2098
+ scope: string;
2099
+ fullContent: string;
2100
+ }): void {
2101
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2102
+ // Idempotent: PRIMARY KEY is `path`, which is deterministic given (milestone_id, scope) per
2103
+ // the artifact-path resolver. Retrying the same reassess-roadmap silently overwrites the row
2104
+ // instead of accumulating duplicates.
2105
+ currentDb.prepare(
2106
+ `INSERT OR REPLACE INTO assessments (path, milestone_id, slice_id, task_id, status, scope, full_content, created_at)
2107
+ VALUES (:path, :milestone_id, :slice_id, :task_id, :status, :scope, :full_content, :created_at)`,
2108
+ ).run({
2109
+ ":path": entry.path,
2110
+ ":milestone_id": entry.milestoneId,
2111
+ ":slice_id": entry.sliceId ?? null,
2112
+ ":task_id": entry.taskId ?? null,
2113
+ ":status": entry.status,
2114
+ ":scope": entry.scope,
2115
+ ":full_content": entry.fullContent,
2116
+ ":created_at": new Date().toISOString(),
2117
+ });
2118
+ }
2119
+
2120
+ export function deleteAssessmentByScope(milestoneId: string, scope: string): void {
2121
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2122
+ currentDb.prepare(
2123
+ `DELETE FROM assessments WHERE milestone_id = :mid AND scope = :scope`,
2124
+ ).run({ ":mid": milestoneId, ":scope": scope });
2125
+ }
2126
+
2127
+ export function deleteVerificationEvidence(milestoneId: string, sliceId: string, taskId: string): void {
2128
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2129
+ currentDb.prepare(
2130
+ `DELETE FROM verification_evidence WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid`,
2131
+ ).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
2132
+ }
2133
+
2134
+ export function deleteTask(milestoneId: string, sliceId: string, taskId: string): void {
2135
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2136
+ transaction(() => {
2137
+ // Must delete verification_evidence first (FK constraint)
2138
+ currentDb!.prepare(
2139
+ `DELETE FROM verification_evidence WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid`,
2140
+ ).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
2141
+ currentDb!.prepare(
2142
+ `DELETE FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid`,
2143
+ ).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
2144
+ currentDb!.prepare(
2145
+ `DELETE FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
2146
+ ).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
2147
+ });
2148
+ }
2149
+
2150
+ export function deleteSlice(milestoneId: string, sliceId: string): void {
2151
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2152
+ transaction(() => {
2153
+ // Cascade-style manual deletion: evidence → tasks → dependencies → slice
2154
+ currentDb!.prepare(
2155
+ `DELETE FROM verification_evidence WHERE milestone_id = :mid AND slice_id = :sid`,
2156
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
2157
+ currentDb!.prepare(
2158
+ `DELETE FROM tasks WHERE milestone_id = :mid AND slice_id = :sid`,
2159
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
2160
+ currentDb!.prepare(
2161
+ `DELETE FROM slice_dependencies WHERE milestone_id = :mid AND slice_id = :sid`,
2162
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
2163
+ currentDb!.prepare(
2164
+ `DELETE FROM slice_dependencies WHERE milestone_id = :mid AND depends_on_slice_id = :sid`,
2165
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
2166
+ currentDb!.prepare(
2167
+ `DELETE FROM slices WHERE milestone_id = :mid AND id = :sid`,
2168
+ ).run({ ":mid": milestoneId, ":sid": sliceId });
2169
+ });
2170
+ }
2171
+
2172
+ export function deleteMilestone(milestoneId: string): void {
2173
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2174
+ transaction(() => {
2175
+ currentDb!.prepare(
2176
+ `DELETE FROM verification_evidence WHERE milestone_id = :mid`,
2177
+ ).run({ ":mid": milestoneId });
2178
+ currentDb!.prepare(
2179
+ `DELETE FROM quality_gates WHERE milestone_id = :mid`,
2180
+ ).run({ ":mid": milestoneId });
2181
+ currentDb!.prepare(
2182
+ `DELETE FROM gate_runs WHERE milestone_id = :mid`,
2183
+ ).run({ ":mid": milestoneId });
2184
+ currentDb!.prepare(
2185
+ `DELETE FROM tasks WHERE milestone_id = :mid`,
2186
+ ).run({ ":mid": milestoneId });
2187
+ currentDb!.prepare(
2188
+ `DELETE FROM slice_dependencies WHERE milestone_id = :mid`,
2189
+ ).run({ ":mid": milestoneId });
2190
+ currentDb!.prepare(
2191
+ `DELETE FROM slices WHERE milestone_id = :mid`,
2192
+ ).run({ ":mid": milestoneId });
2193
+ currentDb!.prepare(
2194
+ `DELETE FROM replan_history WHERE milestone_id = :mid`,
2195
+ ).run({ ":mid": milestoneId });
2196
+ currentDb!.prepare(
2197
+ `DELETE FROM assessments WHERE milestone_id = :mid`,
2198
+ ).run({ ":mid": milestoneId });
2199
+ currentDb!.prepare(
2200
+ `DELETE FROM artifacts WHERE milestone_id = :mid`,
2201
+ ).run({ ":mid": milestoneId });
2202
+ currentDb!.prepare(
2203
+ `DELETE FROM milestone_commit_attributions WHERE milestone_id = :mid`,
2204
+ ).run({ ":mid": milestoneId });
2205
+ currentDb!.prepare(
2206
+ `DELETE FROM milestone_leases WHERE milestone_id = :mid`,
2207
+ ).run({ ":mid": milestoneId });
2208
+ currentDb!.prepare(
2209
+ `DELETE FROM milestones WHERE id = :mid`,
2210
+ ).run({ ":mid": milestoneId });
2211
+ });
2212
+ }
2213
+
2214
+ export function updateSliceFields(milestoneId: string, sliceId: string, fields: {
2215
+ title?: string;
2216
+ risk?: string;
2217
+ depends?: string[];
2218
+ demo?: string;
2219
+ }): void {
2220
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2221
+ currentDb.prepare(
2222
+ `UPDATE slices SET
2223
+ title = COALESCE(:title, title),
2224
+ risk = COALESCE(:risk, risk),
2225
+ depends = COALESCE(:depends, depends),
2226
+ demo = COALESCE(:demo, demo)
2227
+ WHERE milestone_id = :milestone_id AND id = :id`,
2228
+ ).run({
2229
+ ":milestone_id": milestoneId,
2230
+ ":id": sliceId,
2231
+ ":title": fields.title ?? null,
2232
+ ":risk": fields.risk ?? null,
2233
+ ":depends": fields.depends ? JSON.stringify(fields.depends) : null,
2234
+ ":demo": fields.demo ?? null,
2235
+ });
2236
+ }
2237
+
2238
+ export function getReplanHistory(milestoneId: string, sliceId?: string): Array<Record<string, unknown>> {
2239
+ if (!currentDb) return [];
2240
+ if (sliceId) {
2241
+ return currentDb.prepare(
2242
+ `SELECT * FROM replan_history WHERE milestone_id = :mid AND slice_id = :sid ORDER BY created_at DESC`,
2243
+ ).all({ ":mid": milestoneId, ":sid": sliceId });
2244
+ }
2245
+ return currentDb.prepare(
2246
+ `SELECT * FROM replan_history WHERE milestone_id = :mid ORDER BY created_at DESC`,
2247
+ ).all({ ":mid": milestoneId });
2248
+ }
2249
+
2250
+ export function getAssessment(path: string): Record<string, unknown> | null {
2251
+ if (!currentDb) return null;
2252
+ const row = currentDb.prepare(
2253
+ `SELECT * FROM assessments WHERE path = :path`,
2254
+ ).get({ ":path": path });
2255
+ return row ?? null;
2256
+ }
2257
+
2258
+ export function getLatestAssessmentByScope(
2259
+ milestoneId: string,
2260
+ scope: string,
2261
+ ): Record<string, unknown> | null {
2262
+ if (!currentDb) return null;
2263
+ const row = currentDb.prepare(
2264
+ `SELECT * FROM assessments
2265
+ WHERE milestone_id = :mid AND scope = :scope
2266
+ ORDER BY created_at DESC
2267
+ LIMIT 1`,
2268
+ ).get({ ":mid": milestoneId, ":scope": scope });
2269
+ return row ?? null;
2270
+ }
2271
+
2272
+ // ─── Quality Gates ───────────────────────────────────────────────────────
2273
+
2274
+ export function insertGateRow(g: {
2275
+ milestoneId: string;
2276
+ sliceId: string;
2277
+ gateId: GateId;
2278
+ scope: GateScope;
2279
+ taskId?: string | null;
2280
+ status?: GateStatus;
2281
+ }): void {
2282
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2283
+ currentDb.prepare(
2284
+ `INSERT OR IGNORE INTO quality_gates (milestone_id, slice_id, gate_id, scope, task_id, status)
2285
+ VALUES (:mid, :sid, :gid, :scope, :tid, :status)`,
2286
+ ).run({
2287
+ ":mid": g.milestoneId,
2288
+ ":sid": g.sliceId,
2289
+ ":gid": g.gateId,
2290
+ ":scope": g.scope,
2291
+ ":tid": g.taskId ?? "",
2292
+ ":status": g.status ?? "pending",
2293
+ });
2294
+ }
2295
+
2296
+ export function saveGateResult(g: {
2297
+ milestoneId: string;
2298
+ sliceId: string;
2299
+ gateId: string;
2300
+ taskId?: string | null;
2301
+ verdict: GateVerdict;
2302
+ rationale: string;
2303
+ findings: string;
2304
+ }): void {
2305
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2306
+ currentDb.prepare(
2307
+ `UPDATE quality_gates
2308
+ SET status = 'complete', verdict = :verdict, rationale = :rationale,
2309
+ findings = :findings, evaluated_at = :evaluated_at
2310
+ WHERE milestone_id = :mid AND slice_id = :sid AND gate_id = :gid
2311
+ AND task_id = :tid`,
2312
+ ).run({
2313
+ ":mid": g.milestoneId,
2314
+ ":sid": g.sliceId,
2315
+ ":gid": g.gateId,
2316
+ ":tid": g.taskId ?? "",
2317
+ ":verdict": g.verdict,
2318
+ ":rationale": g.rationale,
2319
+ ":findings": g.findings,
2320
+ ":evaluated_at": new Date().toISOString(),
2321
+ });
2322
+
2323
+ const outcome =
2324
+ g.verdict === "pass"
2325
+ ? "pass"
2326
+ : g.verdict === "omitted"
2327
+ ? "manual-attention"
2328
+ : "fail";
2329
+ insertGateRun({
2330
+ traceId: `quality-gate:${g.milestoneId}:${g.sliceId}`,
2331
+ turnId: `gate:${g.gateId}:${g.taskId ?? "slice"}`,
2332
+ gateId: g.gateId,
2333
+ gateType: "quality-gate",
2334
+ milestoneId: g.milestoneId,
2335
+ sliceId: g.sliceId,
2336
+ taskId: g.taskId ?? undefined,
2337
+ outcome,
2338
+ failureClass: outcome === "fail" ? "verification" : outcome === "manual-attention" ? "manual-attention" : "none",
2339
+ rationale: g.rationale,
2340
+ findings: g.findings,
2341
+ attempt: 1,
2342
+ maxAttempts: 1,
2343
+ retryable: false,
2344
+ evaluatedAt: new Date().toISOString(),
2345
+ });
2346
+ }
2347
+
2348
+ export function getPendingGates(milestoneId: string, sliceId: string, scope?: GateScope): GateRow[] {
2349
+ if (!currentDb) return [];
2350
+ const sql = scope
2351
+ ? `SELECT * FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid AND scope = :scope AND status = 'pending'`
2352
+ : `SELECT * FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid AND status = 'pending'`;
2353
+ const params: Record<string, unknown> = { ":mid": milestoneId, ":sid": sliceId };
2354
+ if (scope) params[":scope"] = scope;
2355
+ return currentDb.prepare(sql).all(params).map(rowToGate);
2356
+ }
2357
+
2358
+ export function getGateResults(milestoneId: string, sliceId: string, scope?: GateScope): GateRow[] {
2359
+ if (!currentDb) return [];
2360
+ const sql = scope
2361
+ ? `SELECT * FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid AND scope = :scope`
2362
+ : `SELECT * FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid`;
2363
+ const params: Record<string, unknown> = { ":mid": milestoneId, ":sid": sliceId };
2364
+ if (scope) params[":scope"] = scope;
2365
+ return currentDb.prepare(sql).all(params).map(rowToGate);
2366
+ }
2367
+
2368
+ export function markAllGatesOmitted(milestoneId: string, sliceId: string): void {
2369
+ if (!currentDb) return;
2370
+ currentDb.prepare(
2371
+ `UPDATE quality_gates SET status = 'complete', verdict = 'omitted', evaluated_at = :now
2372
+ WHERE milestone_id = :mid AND slice_id = :sid AND status = 'pending'`,
2373
+ ).run({
2374
+ ":mid": milestoneId,
2375
+ ":sid": sliceId,
2376
+ ":now": new Date().toISOString(),
2377
+ });
2378
+ }
2379
+
2380
+ export function getPendingSliceGateCount(milestoneId: string, sliceId: string): number {
2381
+ if (!currentDb) return 0;
2382
+ const row = currentDb.prepare(
2383
+ `SELECT COUNT(*) as cnt FROM quality_gates
2384
+ WHERE milestone_id = :mid AND slice_id = :sid AND scope = 'slice' AND status = 'pending'`,
2385
+ ).get({ ":mid": milestoneId, ":sid": sliceId });
2386
+ return row ? (row["cnt"] as number) : 0;
2387
+ }
2388
+
2389
+ /**
2390
+ * Return pending gate rows owned by a specific workflow turn.
2391
+ *
2392
+ * Unlike `getPendingGates(..., scope)`, this filters by the registry's
2393
+ * `ownerTurn` metadata so callers can distinguish Q3/Q4 (owned by
2394
+ * gate-evaluate) from Q8 (owned by complete-slice) even though both are
2395
+ * scope:"slice". Pass `taskId` to narrow task-scoped results to one task.
2396
+ */
2397
+ export function getPendingGatesForTurn(
2398
+ milestoneId: string,
2399
+ sliceId: string,
2400
+ turn: OwnerTurn,
2401
+ taskId?: string,
2402
+ ): GateRow[] {
2403
+ if (!currentDb) return [];
2404
+ const ids = getGateIdsForTurn(turn);
2405
+ if (ids.size === 0) return [];
2406
+ const idList = [...ids];
2407
+ const placeholders = idList.map((_, i) => `:gid${i}`).join(",");
2408
+ const params: Record<string, unknown> = {
2409
+ ":mid": milestoneId,
2410
+ ":sid": sliceId,
2411
+ };
2412
+ idList.forEach((id, i) => {
2413
+ params[`:gid${i}`] = id;
2414
+ });
2415
+ let sql =
2416
+ `SELECT * FROM quality_gates
2417
+ WHERE milestone_id = :mid AND slice_id = :sid
2418
+ AND status = 'pending'
2419
+ AND gate_id IN (${placeholders})`;
2420
+ if (taskId !== undefined) {
2421
+ sql += ` AND task_id = :tid`;
2422
+ params[":tid"] = taskId;
2423
+ }
2424
+ return currentDb.prepare(sql).all(params).map(rowToGate);
2425
+ }
2426
+
2427
+ /**
2428
+ * Count pending gates for a turn. Convenience wrapper used by state
2429
+ * derivation to decide whether a phase transition should pause.
2430
+ */
2431
+ export function getPendingGateCountForTurn(
2432
+ milestoneId: string,
2433
+ sliceId: string,
2434
+ turn: OwnerTurn,
2435
+ ): number {
2436
+ return getPendingGatesForTurn(milestoneId, sliceId, turn).length;
2437
+ }
2438
+
2439
+ export function insertGateRun(entry: {
2440
+ traceId: string;
2441
+ turnId: string;
2442
+ gateId: string;
2443
+ gateType: string;
2444
+ unitType?: string;
2445
+ unitId?: string;
2446
+ milestoneId?: string;
2447
+ sliceId?: string;
2448
+ taskId?: string;
2449
+ outcome: "pass" | "fail" | "retry" | "manual-attention";
2450
+ failureClass: "none" | "policy" | "input" | "execution" | "artifact" | "verification" | "closeout" | "git" | "timeout" | "manual-attention" | "unknown";
2451
+ rationale?: string;
2452
+ findings?: string;
2453
+ attempt: number;
2454
+ maxAttempts: number;
2455
+ retryable: boolean;
2456
+ evaluatedAt: string;
2457
+ }): void {
2458
+ if (!currentDb) return;
2459
+ currentDb.prepare(
2460
+ `INSERT INTO gate_runs (
2461
+ trace_id, turn_id, gate_id, gate_type, unit_type, unit_id, milestone_id, slice_id, task_id,
2462
+ outcome, failure_class, rationale, findings, attempt, max_attempts, retryable, evaluated_at
2463
+ ) VALUES (
2464
+ :trace_id, :turn_id, :gate_id, :gate_type, :unit_type, :unit_id, :milestone_id, :slice_id, :task_id,
2465
+ :outcome, :failure_class, :rationale, :findings, :attempt, :max_attempts, :retryable, :evaluated_at
2466
+ )`,
2467
+ ).run({
2468
+ ":trace_id": entry.traceId,
2469
+ ":turn_id": entry.turnId,
2470
+ ":gate_id": entry.gateId,
2471
+ ":gate_type": entry.gateType,
2472
+ ":unit_type": entry.unitType ?? null,
2473
+ ":unit_id": entry.unitId ?? null,
2474
+ ":milestone_id": entry.milestoneId ?? null,
2475
+ ":slice_id": entry.sliceId ?? null,
2476
+ ":task_id": entry.taskId ?? null,
2477
+ ":outcome": entry.outcome,
2478
+ ":failure_class": entry.failureClass,
2479
+ ":rationale": entry.rationale ?? "",
2480
+ ":findings": entry.findings ?? "",
2481
+ ":attempt": entry.attempt,
2482
+ ":max_attempts": entry.maxAttempts,
2483
+ ":retryable": entry.retryable ? 1 : 0,
2484
+ ":evaluated_at": entry.evaluatedAt,
2485
+ });
2486
+ }
2487
+
2488
+ export function upsertTurnGitTransaction(entry: {
2489
+ traceId: string;
2490
+ turnId: string;
2491
+ unitType?: string;
2492
+ unitId?: string;
2493
+ stage: string;
2494
+ action: "commit" | "snapshot" | "status-only";
2495
+ push: boolean;
2496
+ status: "ok" | "failed";
2497
+ error?: string;
2498
+ metadata?: Record<string, unknown>;
2499
+ updatedAt: string;
2500
+ }): void {
2501
+ if (!currentDb) return;
2502
+ currentDb.prepare(
2503
+ `INSERT OR REPLACE INTO turn_git_transactions (
2504
+ trace_id, turn_id, unit_type, unit_id, stage, action, push, status, error, metadata_json, updated_at
2505
+ ) VALUES (
2506
+ :trace_id, :turn_id, :unit_type, :unit_id, :stage, :action, :push, :status, :error, :metadata_json, :updated_at
2507
+ )`,
2508
+ ).run({
2509
+ ":trace_id": entry.traceId,
2510
+ ":turn_id": entry.turnId,
2511
+ ":unit_type": entry.unitType ?? null,
2512
+ ":unit_id": entry.unitId ?? null,
2513
+ ":stage": entry.stage,
2514
+ ":action": entry.action,
2515
+ ":push": entry.push ? 1 : 0,
2516
+ ":status": entry.status,
2517
+ ":error": entry.error ?? null,
2518
+ ":metadata_json": JSON.stringify(entry.metadata ?? {}),
2519
+ ":updated_at": entry.updatedAt,
2520
+ });
2521
+ }
2522
+
2523
+ export function getMilestoneCommitAttributionShas(milestoneId: string): string[] {
2524
+ if (!currentDb) return [];
2525
+ const rows = currentDb.prepare(
2526
+ `SELECT commit_sha
2527
+ FROM milestone_commit_attributions
2528
+ WHERE milestone_id = :mid
2529
+ ORDER BY created_at, commit_sha`,
2530
+ ).all({ ":mid": milestoneId }) as Array<Record<string, unknown>>;
2531
+ return rows
2532
+ .map((row) => typeof row["commit_sha"] === "string" ? row["commit_sha"] : "")
2533
+ .filter(Boolean);
2534
+ }
2535
+
2536
+ export function recordMilestoneCommitAttribution(entry: {
2537
+ commitSha: string;
2538
+ milestoneId: string;
2539
+ sliceId?: string;
2540
+ taskId?: string;
2541
+ source: "recorded" | "backfill";
2542
+ confidence: number;
2543
+ files: string[];
2544
+ createdAt: string;
2545
+ }): void {
2546
+ if (!currentDb) return;
2547
+ transaction(() => {
2548
+ currentDb!.prepare(
2549
+ `INSERT OR REPLACE INTO milestone_commit_attributions (
2550
+ commit_sha, milestone_id, slice_id, task_id, source, confidence, files_json, created_at
2551
+ ) VALUES (
2552
+ :commit_sha, :milestone_id, :slice_id, :task_id, :source, :confidence, :files_json, :created_at
2553
+ )`,
2554
+ ).run({
2555
+ ":commit_sha": entry.commitSha,
2556
+ ":milestone_id": entry.milestoneId,
2557
+ ":slice_id": entry.sliceId ?? null,
2558
+ ":task_id": entry.taskId ?? null,
2559
+ ":source": entry.source,
2560
+ ":confidence": entry.confidence,
2561
+ ":files_json": JSON.stringify(entry.files),
2562
+ ":created_at": entry.createdAt,
2563
+ });
2564
+
2565
+ currentDb!.prepare(
2566
+ `INSERT OR IGNORE INTO audit_events (
2567
+ event_id, trace_id, turn_id, caused_by, category, type, ts, payload_json
2568
+ ) VALUES (
2569
+ :event_id, :trace_id, :turn_id, :caused_by, :category, :type, :ts, :payload_json
2570
+ )`,
2571
+ ).run({
2572
+ ":event_id": `milestone-commit-attribution:${entry.milestoneId}:${entry.commitSha}`,
2573
+ ":trace_id": "milestone-commit-attribution",
2574
+ ":turn_id": null,
2575
+ ":caused_by": null,
2576
+ ":category": "git",
2577
+ ":type": "milestone-commit-attribution-recorded",
2578
+ ":ts": entry.createdAt,
2579
+ ":payload_json": JSON.stringify({
2580
+ commitSha: entry.commitSha,
2581
+ milestoneId: entry.milestoneId,
2582
+ sliceId: entry.sliceId ?? null,
2583
+ taskId: entry.taskId ?? null,
2584
+ source: entry.source,
2585
+ confidence: entry.confidence,
2586
+ files: entry.files,
2587
+ }),
2588
+ });
2589
+ });
2590
+ }
2591
+
2592
+ export function insertAuditEvent(entry: {
2593
+ eventId: string;
2594
+ traceId: string;
2595
+ turnId?: string;
2596
+ causedBy?: string;
2597
+ category: string;
2598
+ type: string;
2599
+ ts: string;
2600
+ payload: Record<string, unknown>;
2601
+ }): void {
2602
+ if (!currentDb) return;
2603
+ transaction(() => {
2604
+ currentDb!.prepare(
2605
+ `INSERT OR IGNORE INTO audit_events (
2606
+ event_id, trace_id, turn_id, caused_by, category, type, ts, payload_json
2607
+ ) VALUES (
2608
+ :event_id, :trace_id, :turn_id, :caused_by, :category, :type, :ts, :payload_json
2609
+ )`,
2610
+ ).run({
2611
+ ":event_id": entry.eventId,
2612
+ ":trace_id": entry.traceId,
2613
+ ":turn_id": entry.turnId ?? null,
2614
+ ":caused_by": entry.causedBy ?? null,
2615
+ ":category": entry.category,
2616
+ ":type": entry.type,
2617
+ ":ts": entry.ts,
2618
+ ":payload_json": JSON.stringify(entry.payload ?? {}),
2619
+ });
2620
+
2621
+ if (entry.turnId) {
2622
+ const row = currentDb!.prepare(
2623
+ `SELECT event_count, first_ts, last_ts
2624
+ FROM audit_turn_index
2625
+ WHERE trace_id = :trace_id AND turn_id = :turn_id`,
2626
+ ).get({
2627
+ ":trace_id": entry.traceId,
2628
+ ":turn_id": entry.turnId,
2629
+ });
2630
+ if (row) {
2631
+ currentDb!.prepare(
2632
+ `UPDATE audit_turn_index
2633
+ SET first_ts = CASE WHEN :ts < first_ts THEN :ts ELSE first_ts END,
2634
+ last_ts = CASE WHEN :ts > last_ts THEN :ts ELSE last_ts END,
2635
+ event_count = event_count + 1
2636
+ WHERE trace_id = :trace_id AND turn_id = :turn_id`,
2637
+ ).run({
2638
+ ":trace_id": entry.traceId,
2639
+ ":turn_id": entry.turnId,
2640
+ ":ts": entry.ts,
2641
+ });
2642
+ } else {
2643
+ currentDb!.prepare(
2644
+ `INSERT INTO audit_turn_index (trace_id, turn_id, first_ts, last_ts, event_count)
2645
+ VALUES (:trace_id, :turn_id, :first_ts, :last_ts, :event_count)`,
2646
+ ).run({
2647
+ ":trace_id": entry.traceId,
2648
+ ":turn_id": entry.turnId,
2649
+ ":first_ts": entry.ts,
2650
+ ":last_ts": entry.ts,
2651
+ ":event_count": 1,
2652
+ });
2653
+ }
2654
+ }
2655
+ });
2656
+ }
2657
+
2658
+ // ─── Single-writer bypass wrappers ───────────────────────────────────────
2659
+ // These wrappers exist so modules outside this file never need to call
2660
+ // `_getAdapter()` for writes. Each one is a byte-equivalent replacement for
2661
+ // a raw prepare/run previously issued from another module. Keep them
2662
+ // minimal and direct — they exist to hold SQL text in one place, not to
2663
+ // add new behavior.
2664
+
2665
+ /** Delete a decision row by id. Used by db-writer.ts rollback on disk-write failure. */
2666
+ export function deleteDecisionById(id: string): void {
2667
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2668
+ currentDb.prepare("DELETE FROM decisions WHERE id = :id").run({ ":id": id });
2669
+ }
2670
+
2671
+ /** Delete a requirement row by id. Used by db-writer.ts rollback on disk-write failure. */
2672
+ export function deleteRequirementById(id: string): void {
2673
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2674
+ currentDb.prepare("DELETE FROM requirements WHERE id = :id").run({ ":id": id });
2675
+ }
2676
+
2677
+ /** Delete an artifact row by path. Used by db-writer.ts rollback on disk-write failure. */
2678
+ export function deleteArtifactByPath(path: string): void {
2679
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2680
+ currentDb.prepare("DELETE FROM artifacts WHERE path = :path").run({ ":path": path });
2681
+ }
2682
+
2683
+ /**
2684
+ * Drop hierarchy rows in dependency order inside a transaction. Used by
2685
+ * `gsd recover` to rebuild engine state from markdown.
2686
+ */
2687
+ export function clearEngineHierarchy(): void {
2688
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2689
+ transaction(() => {
2690
+ currentDb!.exec("DELETE FROM verification_evidence");
2691
+ currentDb!.exec("DELETE FROM quality_gates");
2692
+ currentDb!.exec("DELETE FROM slice_dependencies");
2693
+ currentDb!.exec("DELETE FROM assessments");
2694
+ currentDb!.exec("DELETE FROM replan_history");
2695
+ currentDb!.exec("DELETE FROM milestone_commit_attributions");
2696
+ currentDb!.exec("DELETE FROM tasks");
2697
+ currentDb!.exec("DELETE FROM slices");
2698
+ currentDb!.exec("DELETE FROM milestone_leases");
2699
+ currentDb!.exec("DELETE FROM milestones");
2700
+ });
2701
+ }
2702
+
2703
+ /**
2704
+ * INSERT OR IGNORE a slice during event replay (workflow-reconcile.ts).
2705
+ * Strict insert-or-ignore semantics are required here to avoid the
2706
+ * `insertSlice` ON CONFLICT path that could downgrade an already-completed
2707
+ * slice back to 'pending'.
2708
+ */
2709
+ export function insertOrIgnoreSlice(args: {
2710
+ milestoneId: string;
2711
+ sliceId: string;
2712
+ title: string;
2713
+ createdAt: string;
2714
+ }): void {
2715
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2716
+ currentDb.prepare(
2717
+ `INSERT OR IGNORE INTO slices (milestone_id, id, title, status, created_at)
2718
+ VALUES (:mid, :sid, :title, 'pending', :ts)`,
2719
+ ).run({
2720
+ ":mid": args.milestoneId,
2721
+ ":sid": args.sliceId,
2722
+ ":title": args.title,
2723
+ ":ts": args.createdAt,
2724
+ });
2725
+ }
2726
+
2727
+ /**
2728
+ * INSERT OR IGNORE a task during event replay (workflow-reconcile.ts).
2729
+ * Same rationale as `insertOrIgnoreSlice`.
2730
+ */
2731
+ export function insertOrIgnoreTask(args: {
2732
+ milestoneId: string;
2733
+ sliceId: string;
2734
+ taskId: string;
2735
+ title: string;
2736
+ createdAt: string;
2737
+ }): void {
2738
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2739
+ currentDb.prepare(
2740
+ `INSERT OR IGNORE INTO tasks (milestone_id, slice_id, id, title, status, created_at)
2741
+ VALUES (:mid, :sid, :tid, :title, 'pending', :ts)`,
2742
+ ).run({
2743
+ ":mid": args.milestoneId,
2744
+ ":sid": args.sliceId,
2745
+ ":tid": args.taskId,
2746
+ ":title": args.title,
2747
+ ":ts": args.createdAt,
2748
+ });
2749
+ }
2750
+
2751
+ /**
2752
+ * Stamp the `replan_triggered_at` column on a slice. Used by triage-resolution
2753
+ * when a user capture requests a replan so the dispatcher can detect the
2754
+ * trigger via DB in addition to the on-disk REPLAN-TRIGGER.md marker.
2755
+ */
2756
+ export function setSliceReplanTriggeredAt(milestoneId: string, sliceId: string, ts: string): void {
2757
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2758
+ currentDb.prepare(
2759
+ "UPDATE slices SET replan_triggered_at = :ts WHERE milestone_id = :mid AND id = :sid",
2760
+ ).run({ ":ts": ts, ":mid": milestoneId, ":sid": sliceId });
2761
+ }
2762
+
2763
+ /**
2764
+ * INSERT OR REPLACE a quality_gates row. Used by milestone-validation-gates.ts
2765
+ * to persist milestone-level (MV*) gate outcomes after validate-milestone runs.
2766
+ */
2767
+ export function upsertQualityGate(g: {
2768
+ milestoneId: string;
2769
+ sliceId: string;
2770
+ gateId: string;
2771
+ scope: string;
2772
+ taskId: string;
2773
+ status: string;
2774
+ verdict: string;
2775
+ rationale: string;
2776
+ findings: string;
2777
+ evaluatedAt: string;
2778
+ }): void {
2779
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2780
+ currentDb.prepare(
2781
+ `INSERT OR REPLACE INTO quality_gates
2782
+ (milestone_id, slice_id, gate_id, scope, task_id, status, verdict, rationale, findings, evaluated_at)
2783
+ VALUES (:mid, :sid, :gid, :scope, :tid, :status, :verdict, :rationale, :findings, :evaluated_at)`,
2784
+ ).run({
2785
+ ":mid": g.milestoneId,
2786
+ ":sid": g.sliceId,
2787
+ ":gid": g.gateId,
2788
+ ":scope": g.scope,
2789
+ ":tid": g.taskId,
2790
+ ":status": g.status,
2791
+ ":verdict": g.verdict,
2792
+ ":rationale": g.rationale,
2793
+ ":findings": g.findings,
2794
+ ":evaluated_at": g.evaluatedAt,
2795
+ });
2796
+ }
2797
+
2798
+ /**
2799
+ * Atomically replace all workflow state from a manifest. Lifted verbatim from
2800
+ * workflow-manifest.ts so the single-writer invariant holds. Only touches
2801
+ * engine tables + decisions. Does NOT modify artifacts or memories.
2802
+ */
2803
+ export function restoreManifest(manifest: StateManifest): void {
2804
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2805
+ const db = currentDb;
2806
+
2807
+ transaction(() => {
2808
+ // Clear engine tables (order matters for foreign-key-like consistency)
2809
+ db.exec("DELETE FROM verification_evidence");
2810
+ db.exec("DELETE FROM tasks");
2811
+ db.exec("DELETE FROM slices");
2812
+ db.exec("DELETE FROM milestone_leases");
2813
+ db.exec("DELETE FROM milestones");
2814
+ db.exec("DELETE FROM decisions WHERE 1=1");
2815
+
2816
+ // Restore milestones
2817
+ const msStmt = db.prepare(
2818
+ `INSERT INTO milestones (id, title, status, depends_on, created_at, completed_at,
2819
+ vision, success_criteria, key_risks, proof_strategy,
2820
+ verification_contract, verification_integration, verification_operational, verification_uat,
2821
+ definition_of_done, requirement_coverage, boundary_map_markdown, sequence)
2822
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
2823
+ );
2824
+ for (const m of manifest.milestones) {
2825
+ msStmt.run(
2826
+ m.id, m.title, m.status,
2827
+ JSON.stringify(m.depends_on), m.created_at, m.completed_at,
2828
+ m.vision, JSON.stringify(m.success_criteria), JSON.stringify(m.key_risks),
2829
+ JSON.stringify(m.proof_strategy),
2830
+ m.verification_contract, m.verification_integration, m.verification_operational, m.verification_uat,
2831
+ JSON.stringify(m.definition_of_done), m.requirement_coverage, m.boundary_map_markdown, m.sequence ?? 0,
2832
+ );
2833
+ }
2834
+
2835
+ // Restore slices (ADR-011 Phase 1: includes is_sketch + sketch_scope)
2836
+ const slStmt = db.prepare(
2837
+ `INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
2838
+ created_at, completed_at, full_summary_md, full_uat_md,
2839
+ goal, success_criteria, proof_level, integration_closure, observability_impact,
2840
+ target_repositories, sequence, replan_triggered_at, is_sketch, sketch_scope)
2841
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
2842
+ );
2843
+ for (const s of manifest.slices) {
2844
+ slStmt.run(
2845
+ s.milestone_id, s.id, s.title, s.status, s.risk,
2846
+ JSON.stringify(s.depends), s.demo,
2847
+ s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md,
2848
+ s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact,
2849
+ JSON.stringify(s.target_repositories ?? []),
2850
+ s.sequence, s.replan_triggered_at,
2851
+ s.is_sketch ?? 0,
2852
+ s.sketch_scope ?? "",
2853
+ );
2854
+ }
2855
+
2856
+ // Restore tasks (ADR-011 P2: includes blocker_source + escalation_* columns)
2857
+ const tkStmt = db.prepare(
2858
+ `INSERT INTO tasks (milestone_id, slice_id, id, title, status,
2859
+ one_liner, narrative, verification_result, duration, completed_at,
2860
+ blocker_discovered, deviations, known_issues, key_files, key_decisions,
2861
+ full_summary_md, description, estimate, files, verify,
2862
+ inputs, expected_output, observability_impact, target_repositories, sequence,
2863
+ blocker_source, escalation_pending, escalation_awaiting_review,
2864
+ escalation_artifact_path, escalation_override_applied_at)
2865
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
2866
+ );
2867
+ for (const t of manifest.tasks) {
2868
+ tkStmt.run(
2869
+ t.milestone_id, t.slice_id, t.id, t.title, t.status,
2870
+ t.one_liner, t.narrative, t.verification_result, t.duration, t.completed_at,
2871
+ t.blocker_discovered ? 1 : 0, t.deviations, t.known_issues,
2872
+ JSON.stringify(t.key_files), JSON.stringify(t.key_decisions),
2873
+ t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify,
2874
+ JSON.stringify(t.inputs), JSON.stringify(t.expected_output),
2875
+ t.observability_impact, JSON.stringify(t.target_repositories ?? []), t.sequence,
2876
+ t.blocker_source ?? "",
2877
+ t.escalation_pending ?? 0,
2878
+ t.escalation_awaiting_review ?? 0,
2879
+ t.escalation_artifact_path ?? null,
2880
+ t.escalation_override_applied_at ?? null,
2881
+ );
2882
+ }
2883
+
2884
+ // Restore decisions (ADR-011 P2: include source so escalation decisions survive)
2885
+ const dcStmt = db.prepare(
2886
+ `INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
2887
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
2888
+ );
2889
+ for (const d of manifest.decisions) {
2890
+ dcStmt.run(d.seq, d.id, d.when_context, d.scope, d.decision, d.choice, d.rationale, d.revisable, d.made_by, d.source ?? "discussion", d.superseded_by);
2891
+ }
2892
+
2893
+ // Restore verification evidence
2894
+ const evStmt = db.prepare(
2895
+ `INSERT INTO verification_evidence (task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at)
2896
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
2897
+ );
2898
+ for (const e of manifest.verification_evidence) {
2899
+ evStmt.run(e.task_id, e.slice_id, e.milestone_id, e.command, e.exit_code, e.verdict, e.duration_ms, e.created_at);
2900
+ }
2901
+ });
2902
+ }
2903
+
2904
+ // ─── Legacy markdown → DB bulk migration ─────────────────────────────────
2905
+
2906
+ export interface LegacyMilestoneInsert {
2907
+ id: string;
2908
+ title: string;
2909
+ status: string;
2910
+ }
2911
+
2912
+ export interface LegacySliceInsert {
2913
+ id: string;
2914
+ milestoneId: string;
2915
+ title: string;
2916
+ status: string;
2917
+ risk: string;
2918
+ sequence: number;
2919
+ }
2920
+
2921
+ export interface LegacyTaskInsert {
2922
+ id: string;
2923
+ sliceId: string;
2924
+ milestoneId: string;
2925
+ title: string;
2926
+ status: string;
2927
+ sequence: number;
2928
+ }
2929
+
2930
+ /**
2931
+ * Bulk delete + insert a legacy milestone hierarchy for markdown → DB migration.
2932
+ * Used by workflow-migration.ts to populate engine tables from parsed ROADMAP/PLAN
2933
+ * files. All operations run inside a single transaction.
2934
+ */
2935
+ export function bulkInsertLegacyHierarchy(payload: {
2936
+ milestones: LegacyMilestoneInsert[];
2937
+ slices: LegacySliceInsert[];
2938
+ tasks: LegacyTaskInsert[];
2939
+ clearMilestoneIds: string[];
2940
+ createdAt: string;
2941
+ }): void {
2942
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
2943
+ const db = currentDb;
2944
+ const { milestones, slices, tasks, clearMilestoneIds, createdAt } = payload;
2945
+
2946
+ if (clearMilestoneIds.length === 0) return;
2947
+ const placeholders = clearMilestoneIds.map(() => "?").join(",");
2948
+
2949
+ transaction(() => {
2950
+ db.prepare(`DELETE FROM tasks WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
2951
+ db.prepare(`DELETE FROM slices WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
2952
+ db.prepare(`DELETE FROM milestone_leases WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
2953
+ db.prepare(`DELETE FROM milestones WHERE id IN (${placeholders})`).run(...clearMilestoneIds);
2954
+
2955
+ const insertMilestone = db.prepare(
2956
+ "INSERT INTO milestones (id, title, status, created_at) VALUES (?, ?, ?, ?)",
2957
+ );
2958
+ for (const m of milestones) {
2959
+ insertMilestone.run(m.id, m.title, m.status, createdAt);
2960
+ }
2961
+
2962
+ const insertSliceStmt = db.prepare(
2963
+ "INSERT INTO slices (id, milestone_id, title, status, risk, depends, sequence, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
2964
+ );
2965
+ for (const s of slices) {
2966
+ insertSliceStmt.run(s.id, s.milestoneId, s.title, s.status, s.risk, "[]", s.sequence, createdAt);
2967
+ }
2968
+
2969
+ const insertTaskStmt = db.prepare(
2970
+ "INSERT INTO tasks (id, slice_id, milestone_id, title, description, status, estimate, files, sequence) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
2971
+ );
2972
+ for (const t of tasks) {
2973
+ insertTaskStmt.run(t.id, t.sliceId, t.milestoneId, t.title, "", t.status, "", "[]", t.sequence);
2974
+ }
2975
+ });
2976
+ }
2977
+
2978
+ // ─── Memory store writers ────────────────────────────────────────────────
2979
+ // All memory writes go through gsd-db.ts so the single-writer invariant
2980
+ // holds. These are direct pass-throughs to the SQL previously in
2981
+ // memory-store.ts — same bindings, same behavior.
2982
+
2983
+ export function insertMemoryRow(args: {
2984
+ id: string;
2985
+ category: string;
2986
+ content: string;
2987
+ confidence: number;
2988
+ sourceUnitType: string | null;
2989
+ sourceUnitId: string | null;
2990
+ createdAt: string;
2991
+ updatedAt: string;
2992
+ scope?: string;
2993
+ tags?: string[];
2994
+ /**
2995
+ * ADR-013 Step 2: optional structured payload preserved alongside the flat
2996
+ * `content` field. Used to retain gsd_save_decision-style fields (scope,
2997
+ * decision, choice, rationale, made_by, revisable) on architecture-category
2998
+ * memories so the cutover in Step 6 is lossless. Schema is intentionally
2999
+ * open inside the JSON; documented per category in ADR-013.
3000
+ */
3001
+ structuredFields?: Record<string, unknown> | null;
3002
+ }): void {
3003
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3004
+ currentDb.prepare(
3005
+ `INSERT INTO memories (id, category, content, confidence, source_unit_type, source_unit_id, created_at, updated_at, scope, tags, structured_fields)
3006
+ VALUES (:id, :category, :content, :confidence, :source_unit_type, :source_unit_id, :created_at, :updated_at, :scope, :tags, :structured_fields)`,
3007
+ ).run({
3008
+ ":id": args.id,
3009
+ ":category": args.category,
3010
+ ":content": args.content,
3011
+ ":confidence": args.confidence,
3012
+ ":source_unit_type": args.sourceUnitType,
3013
+ ":source_unit_id": args.sourceUnitId,
3014
+ ":created_at": args.createdAt,
3015
+ ":updated_at": args.updatedAt,
3016
+ ":scope": args.scope ?? "project",
3017
+ ":tags": JSON.stringify(args.tags ?? []),
3018
+ ":structured_fields": args.structuredFields == null ? null : JSON.stringify(args.structuredFields),
3019
+ });
3020
+ }
3021
+
3022
+ export function insertMemorySourceRow(args: {
3023
+ id: string;
3024
+ kind: string;
3025
+ uri: string | null;
3026
+ title: string | null;
3027
+ content: string;
3028
+ contentHash: string;
3029
+ importedAt: string;
3030
+ scope?: string;
3031
+ tags?: string[];
3032
+ }): void {
3033
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3034
+ currentDb.prepare(
3035
+ `INSERT OR IGNORE INTO memory_sources (id, kind, uri, title, content, content_hash, imported_at, scope, tags)
3036
+ VALUES (:id, :kind, :uri, :title, :content, :content_hash, :imported_at, :scope, :tags)`,
3037
+ ).run({
3038
+ ":id": args.id,
3039
+ ":kind": args.kind,
3040
+ ":uri": args.uri,
3041
+ ":title": args.title,
3042
+ ":content": args.content,
3043
+ ":content_hash": args.contentHash,
3044
+ ":imported_at": args.importedAt,
3045
+ ":scope": args.scope ?? "project",
3046
+ ":tags": JSON.stringify(args.tags ?? []),
3047
+ });
3048
+ }
3049
+
3050
+ export function deleteMemorySourceRow(id: string): boolean {
3051
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3052
+ const res = currentDb
3053
+ .prepare("DELETE FROM memory_sources WHERE id = :id")
3054
+ .run({ ":id": id }) as { changes?: number };
3055
+ return (res?.changes ?? 0) > 0;
3056
+ }
3057
+
3058
+ export function upsertMemoryEmbedding(args: {
3059
+ memoryId: string;
3060
+ model: string;
3061
+ dim: number;
3062
+ vector: Uint8Array;
3063
+ updatedAt: string;
3064
+ }): void {
3065
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3066
+ currentDb.prepare(
3067
+ `INSERT INTO memory_embeddings (memory_id, model, dim, vector, updated_at)
3068
+ VALUES (:memory_id, :model, :dim, :vector, :updated_at)
3069
+ ON CONFLICT(memory_id) DO UPDATE SET
3070
+ model = excluded.model,
3071
+ dim = excluded.dim,
3072
+ vector = excluded.vector,
3073
+ updated_at = excluded.updated_at`,
3074
+ ).run({
3075
+ ":memory_id": args.memoryId,
3076
+ ":model": args.model,
3077
+ ":dim": args.dim,
3078
+ ":vector": args.vector,
3079
+ ":updated_at": args.updatedAt,
3080
+ });
3081
+ }
3082
+
3083
+ export function deleteMemoryEmbedding(memoryId: string): boolean {
3084
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3085
+ const res = currentDb
3086
+ .prepare("DELETE FROM memory_embeddings WHERE memory_id = :id")
3087
+ .run({ ":id": memoryId }) as { changes?: number };
3088
+ return (res?.changes ?? 0) > 0;
3089
+ }
3090
+
3091
+ export function insertMemoryRelationRow(args: {
3092
+ fromId: string;
3093
+ toId: string;
3094
+ rel: string;
3095
+ confidence: number;
3096
+ createdAt: string;
3097
+ }): void {
3098
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3099
+ currentDb.prepare(
3100
+ `INSERT OR REPLACE INTO memory_relations (from_id, to_id, rel, confidence, created_at)
3101
+ VALUES (:from_id, :to_id, :rel, :confidence, :created_at)`,
3102
+ ).run({
3103
+ ":from_id": args.fromId,
3104
+ ":to_id": args.toId,
3105
+ ":rel": args.rel,
3106
+ ":confidence": args.confidence,
3107
+ ":created_at": args.createdAt,
3108
+ });
3109
+ }
3110
+
3111
+ export function deleteMemoryRelationsFor(memoryId: string): void {
3112
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3113
+ currentDb
3114
+ .prepare("DELETE FROM memory_relations WHERE from_id = :id OR to_id = :id")
3115
+ .run({ ":id": memoryId });
3116
+ }
3117
+
3118
+ export function rewriteMemoryId(placeholderId: string, realId: string): void {
3119
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3120
+ currentDb.prepare("UPDATE memories SET id = :real_id WHERE id = :placeholder").run({
3121
+ ":real_id": realId,
3122
+ ":placeholder": placeholderId,
3123
+ });
3124
+ }
3125
+
3126
+ export function updateMemoryContentRow(
3127
+ id: string,
3128
+ content: string,
3129
+ confidence: number | undefined,
3130
+ updatedAt: string,
3131
+ ): void {
3132
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3133
+ if (confidence != null) {
3134
+ currentDb.prepare(
3135
+ "UPDATE memories SET content = :content, confidence = :confidence, updated_at = :updated_at WHERE id = :id",
3136
+ ).run({ ":content": content, ":confidence": confidence, ":updated_at": updatedAt, ":id": id });
3137
+ } else {
3138
+ currentDb.prepare(
3139
+ "UPDATE memories SET content = :content, updated_at = :updated_at WHERE id = :id",
3140
+ ).run({ ":content": content, ":updated_at": updatedAt, ":id": id });
3141
+ }
3142
+ }
3143
+
3144
+ export function incrementMemoryHitCount(id: string, updatedAt: string): void {
3145
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3146
+ currentDb.prepare(
3147
+ "UPDATE memories SET hit_count = hit_count + 1, updated_at = :updated_at, last_hit_at = :last_hit_at WHERE id = :id",
3148
+ ).run({ ":updated_at": updatedAt, ":last_hit_at": updatedAt, ":id": id });
3149
+ }
3150
+
3151
+ export function supersedeMemoryRow(oldId: string, newId: string, updatedAt: string): void {
3152
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3153
+ currentDb.prepare(
3154
+ "UPDATE memories SET superseded_by = :new_id, updated_at = :updated_at WHERE id = :old_id",
3155
+ ).run({ ":new_id": newId, ":updated_at": updatedAt, ":old_id": oldId });
3156
+ }
3157
+
3158
+ export function markMemoryUnitProcessed(
3159
+ unitKey: string,
3160
+ activityFile: string,
3161
+ processedAt: string,
3162
+ ): void {
3163
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3164
+ currentDb.prepare(
3165
+ `INSERT OR IGNORE INTO memory_processed_units (unit_key, activity_file, processed_at)
3166
+ VALUES (:key, :file, :at)`,
3167
+ ).run({ ":key": unitKey, ":file": activityFile, ":at": processedAt });
3168
+ }
3169
+
3170
+ export function decayMemoriesBefore(cutoffTs: string, now: string): void {
3171
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3172
+ currentDb.prepare(
3173
+ `UPDATE memories
3174
+ SET confidence = MAX(0.1, confidence - 0.1), updated_at = :now
3175
+ WHERE superseded_by IS NULL AND updated_at < :cutoff AND confidence > 0.1`,
3176
+ ).run({ ":now": now, ":cutoff": cutoffTs });
3177
+ }
3178
+
3179
+ export function supersedeLowestRankedMemories(limit: number, now: string): void {
3180
+ if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
3181
+ currentDb.prepare(
3182
+ `UPDATE memories SET superseded_by = 'CAP_EXCEEDED', updated_at = :now
3183
+ WHERE id IN (
3184
+ SELECT id FROM memories
3185
+ WHERE superseded_by IS NULL
3186
+ ORDER BY (confidence * (1.0 + hit_count * 0.1)) ASC
3187
+ LIMIT :limit
3188
+ )`,
3189
+ ).run({ ":now": now, ":limit": limit });
3190
+ }