sdl-mcp 0.11.6 → 0.11.8

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 (330) hide show
  1. package/README.md +17 -244
  2. package/config/sdlmcp.config.example.json +6 -1
  3. package/config/sdlmcp.config.json +1 -0
  4. package/config/sdlmcp.config.schema.json +71 -5
  5. package/dist/.tsbuildinfo +1 -1
  6. package/dist/agent/context-engine.d.ts.map +1 -1
  7. package/dist/agent/context-engine.js +4 -1
  8. package/dist/agent/context-engine.js.map +1 -1
  9. package/dist/cli/commands/index.d.ts.map +1 -1
  10. package/dist/cli/commands/index.js +4 -6
  11. package/dist/cli/commands/index.js.map +1 -1
  12. package/dist/cli/commands/init.d.ts.map +1 -1
  13. package/dist/cli/commands/init.js +26 -20
  14. package/dist/cli/commands/init.js.map +1 -1
  15. package/dist/cli/commands/tool-actions.d.ts.map +1 -1
  16. package/dist/cli/commands/tool-actions.js +27 -27
  17. package/dist/cli/commands/tool-actions.js.map +1 -1
  18. package/dist/code/hotpath.d.ts +2 -1
  19. package/dist/code/hotpath.d.ts.map +1 -1
  20. package/dist/code/hotpath.js +31 -5
  21. package/dist/code/hotpath.js.map +1 -1
  22. package/dist/code-mode/action-catalog.d.ts.map +1 -1
  23. package/dist/code-mode/action-catalog.js +18 -3
  24. package/dist/code-mode/action-catalog.js.map +1 -1
  25. package/dist/code-mode/index.d.ts.map +1 -1
  26. package/dist/code-mode/index.js +27 -10
  27. package/dist/code-mode/index.js.map +1 -1
  28. package/dist/code-mode/manual-generator.d.ts.map +1 -1
  29. package/dist/code-mode/manual-generator.js +12 -18
  30. package/dist/code-mode/manual-generator.js.map +1 -1
  31. package/dist/code-mode/transforms.d.ts.map +1 -1
  32. package/dist/code-mode/transforms.js +6 -1
  33. package/dist/code-mode/transforms.js.map +1 -1
  34. package/dist/code-mode/types.d.ts +21 -0
  35. package/dist/code-mode/types.d.ts.map +1 -1
  36. package/dist/code-mode/types.js +2 -2
  37. package/dist/code-mode/types.js.map +1 -1
  38. package/dist/code-mode/workflow-executor.d.ts.map +1 -1
  39. package/dist/code-mode/workflow-executor.js +179 -12
  40. package/dist/code-mode/workflow-executor.js.map +1 -1
  41. package/dist/code-mode/workflow-parser.d.ts +2 -2
  42. package/dist/code-mode/workflow-parser.d.ts.map +1 -1
  43. package/dist/code-mode/workflow-parser.js +2 -2
  44. package/dist/code-mode/workflow-parser.js.map +1 -1
  45. package/dist/code-mode/workflow-truncation.d.ts +1 -1
  46. package/dist/code-mode/workflow-truncation.d.ts.map +1 -1
  47. package/dist/code-mode/workflow-truncation.js +84 -18
  48. package/dist/code-mode/workflow-truncation.js.map +1 -1
  49. package/dist/config/admin-metadata.js +2 -2
  50. package/dist/config/admin-metadata.js.map +1 -1
  51. package/dist/config/loadConfig.js +4 -4
  52. package/dist/config/loadConfig.js.map +1 -1
  53. package/dist/config/types.d.ts +109 -4
  54. package/dist/config/types.d.ts.map +1 -1
  55. package/dist/config/types.js +64 -13
  56. package/dist/config/types.js.map +1 -1
  57. package/dist/db/ladybug-edges.d.ts +1 -0
  58. package/dist/db/ladybug-edges.d.ts.map +1 -1
  59. package/dist/db/ladybug-edges.js +77 -7
  60. package/dist/db/ladybug-edges.js.map +1 -1
  61. package/dist/db/ladybug-processes.d.ts +13 -0
  62. package/dist/db/ladybug-processes.d.ts.map +1 -1
  63. package/dist/db/ladybug-processes.js +34 -0
  64. package/dist/db/ladybug-processes.js.map +1 -1
  65. package/dist/db/ladybug-scip.d.ts +2 -2
  66. package/dist/db/ladybug-scip.d.ts.map +1 -1
  67. package/dist/db/ladybug-scip.js +3 -3
  68. package/dist/db/ladybug-scip.js.map +1 -1
  69. package/dist/db/ladybug-symbols.d.ts +1 -0
  70. package/dist/db/ladybug-symbols.d.ts.map +1 -1
  71. package/dist/db/ladybug-symbols.js +150 -0
  72. package/dist/db/ladybug-symbols.js.map +1 -1
  73. package/dist/db/ladybug.js +2 -2
  74. package/dist/db/ladybug.js.map +1 -1
  75. package/dist/delta/blastRadius.d.ts +6 -1
  76. package/dist/delta/blastRadius.d.ts.map +1 -1
  77. package/dist/delta/blastRadius.js +137 -29
  78. package/dist/delta/blastRadius.js.map +1 -1
  79. package/dist/domain/types.d.ts +13 -0
  80. package/dist/domain/types.d.ts.map +1 -1
  81. package/dist/gateway/descriptions.js +1 -1
  82. package/dist/gateway/descriptions.js.map +1 -1
  83. package/dist/gateway/router.d.ts.map +1 -1
  84. package/dist/gateway/router.js +1 -6
  85. package/dist/gateway/router.js.map +1 -1
  86. package/dist/gateway/schemas.d.ts +20 -10
  87. package/dist/gateway/schemas.d.ts.map +1 -1
  88. package/dist/gateway/schemas.js +54 -19
  89. package/dist/gateway/schemas.js.map +1 -1
  90. package/dist/graph/minHeap.d.ts +13 -0
  91. package/dist/graph/minHeap.d.ts.map +1 -1
  92. package/dist/graph/minHeap.js +14 -2
  93. package/dist/graph/minHeap.js.map +1 -1
  94. package/dist/graph/slice/beam-search-engine.d.ts +1 -0
  95. package/dist/graph/slice/beam-search-engine.d.ts.map +1 -1
  96. package/dist/graph/slice/beam-search-engine.js +12 -3
  97. package/dist/graph/slice/beam-search-engine.js.map +1 -1
  98. package/dist/graph/slice/start-node-resolver.d.ts.map +1 -1
  99. package/dist/graph/slice/start-node-resolver.js +8 -7
  100. package/dist/graph/slice/start-node-resolver.js.map +1 -1
  101. package/dist/graph/slice.d.ts.map +1 -1
  102. package/dist/graph/slice.js +4 -0
  103. package/dist/graph/slice.js.map +1 -1
  104. package/dist/indexer/adapter/cpp.d.ts.map +1 -1
  105. package/dist/indexer/adapter/cpp.js +4 -4
  106. package/dist/indexer/adapter/cpp.js.map +1 -1
  107. package/dist/indexer/adapter/csharp.js +1 -1
  108. package/dist/indexer/adapter/csharp.js.map +1 -1
  109. package/dist/indexer/adapter/generic-tree-sitter.d.ts +32 -0
  110. package/dist/indexer/adapter/generic-tree-sitter.d.ts.map +1 -0
  111. package/dist/indexer/adapter/generic-tree-sitter.js +138 -0
  112. package/dist/indexer/adapter/generic-tree-sitter.js.map +1 -0
  113. package/dist/indexer/adapter/go.d.ts.map +1 -1
  114. package/dist/indexer/adapter/go.js +4 -14
  115. package/dist/indexer/adapter/go.js.map +1 -1
  116. package/dist/indexer/adapter/php.d.ts.map +1 -1
  117. package/dist/indexer/adapter/php.js +8 -4
  118. package/dist/indexer/adapter/php.js.map +1 -1
  119. package/dist/indexer/adapter/python.d.ts.map +1 -1
  120. package/dist/indexer/adapter/python.js +4 -0
  121. package/dist/indexer/adapter/python.js.map +1 -1
  122. package/dist/indexer/adapter/rust.d.ts.map +1 -1
  123. package/dist/indexer/adapter/rust.js +8 -0
  124. package/dist/indexer/adapter/rust.js.map +1 -1
  125. package/dist/indexer/adapter/shell.d.ts.map +1 -1
  126. package/dist/indexer/adapter/shell.js +4 -0
  127. package/dist/indexer/adapter/shell.js.map +1 -1
  128. package/dist/indexer/derived-refresh-queue.d.ts +2 -2
  129. package/dist/indexer/derived-refresh-queue.js +3 -3
  130. package/dist/indexer/fileScanner.d.ts.map +1 -1
  131. package/dist/indexer/fileScanner.js +33 -0
  132. package/dist/indexer/fileScanner.js.map +1 -1
  133. package/dist/indexer/indexer.d.ts +17 -1
  134. package/dist/indexer/indexer.d.ts.map +1 -1
  135. package/dist/indexer/indexer.js +415 -265
  136. package/dist/indexer/indexer.js.map +1 -1
  137. package/dist/indexer/language-packs.d.ts +18 -0
  138. package/dist/indexer/language-packs.d.ts.map +1 -0
  139. package/dist/indexer/language-packs.js +435 -0
  140. package/dist/indexer/language-packs.js.map +1 -0
  141. package/dist/indexer/language.d.ts.map +1 -1
  142. package/dist/indexer/language.js +35 -0
  143. package/dist/indexer/language.js.map +1 -1
  144. package/dist/indexer/parser/early-exit.d.ts.map +1 -1
  145. package/dist/indexer/parser/early-exit.js +3 -1
  146. package/dist/indexer/parser/early-exit.js.map +1 -1
  147. package/dist/indexer/parser/rust-process-file.d.ts.map +1 -1
  148. package/dist/indexer/parser/rust-process-file.js +3 -1
  149. package/dist/indexer/parser/rust-process-file.js.map +1 -1
  150. package/dist/indexer/provider-first/executor.d.ts +38 -1
  151. package/dist/indexer/provider-first/executor.d.ts.map +1 -1
  152. package/dist/indexer/provider-first/executor.js +541 -18
  153. package/dist/indexer/provider-first/executor.js.map +1 -1
  154. package/dist/indexer/provider-first/index.d.ts +2 -2
  155. package/dist/indexer/provider-first/index.d.ts.map +1 -1
  156. package/dist/indexer/provider-first/index.js +1 -1
  157. package/dist/indexer/provider-first/index.js.map +1 -1
  158. package/dist/indexer/provider-first/lsp-normalizer.d.ts +30 -0
  159. package/dist/indexer/provider-first/lsp-normalizer.d.ts.map +1 -0
  160. package/dist/indexer/provider-first/lsp-normalizer.js +233 -0
  161. package/dist/indexer/provider-first/lsp-normalizer.js.map +1 -0
  162. package/dist/indexer/provider-first/materializer.d.ts +7 -2
  163. package/dist/indexer/provider-first/materializer.d.ts.map +1 -1
  164. package/dist/indexer/provider-first/materializer.js +91 -42
  165. package/dist/indexer/provider-first/materializer.js.map +1 -1
  166. package/dist/indexer/provider-first/planner.d.ts.map +1 -1
  167. package/dist/indexer/provider-first/planner.js +16 -12
  168. package/dist/indexer/provider-first/planner.js.map +1 -1
  169. package/dist/indexer/provider-first/scip-normalizer.d.ts.map +1 -1
  170. package/dist/indexer/provider-first/scip-normalizer.js +68 -11
  171. package/dist/indexer/provider-first/scip-normalizer.js.map +1 -1
  172. package/dist/indexer/provider-first/shadow-build.js +1 -1
  173. package/dist/indexer/provider-first/shadow-build.js.map +1 -1
  174. package/dist/indexer/provider-first/shadow-finalization.js +1 -1
  175. package/dist/indexer/provider-first/shadow-finalization.js.map +1 -1
  176. package/dist/indexer/provider-first/source-call-proof.d.ts.map +1 -1
  177. package/dist/indexer/provider-first/source-call-proof.js +110 -11
  178. package/dist/indexer/provider-first/source-call-proof.js.map +1 -1
  179. package/dist/indexer/treesitter/extractCalls.d.ts +1 -1
  180. package/dist/indexer/treesitter/extractCalls.d.ts.map +1 -1
  181. package/dist/indexer/treesitter/extractCalls.js +41 -12
  182. package/dist/indexer/treesitter/extractCalls.js.map +1 -1
  183. package/dist/indexer/treesitter/grammarLoader.d.ts +2 -1
  184. package/dist/indexer/treesitter/grammarLoader.d.ts.map +1 -1
  185. package/dist/indexer/treesitter/grammarLoader.js +43 -2
  186. package/dist/indexer/treesitter/grammarLoader.js.map +1 -1
  187. package/dist/indexer/watcher.d.ts +19 -1
  188. package/dist/indexer/watcher.d.ts.map +1 -1
  189. package/dist/indexer/watcher.js +337 -83
  190. package/dist/indexer/watcher.js.map +1 -1
  191. package/dist/indexer/watchman-binary.d.ts +22 -0
  192. package/dist/indexer/watchman-binary.d.ts.map +1 -0
  193. package/dist/indexer/watchman-binary.js +115 -0
  194. package/dist/indexer/watchman-binary.js.map +1 -0
  195. package/dist/indexer/watchman-provider.d.ts +154 -0
  196. package/dist/indexer/watchman-provider.d.ts.map +1 -0
  197. package/dist/indexer/watchman-provider.js +450 -0
  198. package/dist/indexer/watchman-provider.js.map +1 -0
  199. package/dist/indexer/worker.d.ts.map +1 -1
  200. package/dist/indexer/worker.js +6 -1
  201. package/dist/indexer/worker.js.map +1 -1
  202. package/dist/indexer/workerPool.d.ts +2 -0
  203. package/dist/indexer/workerPool.d.ts.map +1 -1
  204. package/dist/indexer/workerPool.js +6 -1
  205. package/dist/indexer/workerPool.js.map +1 -1
  206. package/dist/main.js +20 -2
  207. package/dist/main.js.map +1 -1
  208. package/dist/mcp/savings-meter.d.ts.map +1 -1
  209. package/dist/mcp/savings-meter.js +17 -1
  210. package/dist/mcp/savings-meter.js.map +1 -1
  211. package/dist/mcp/server-instructions.js +3 -3
  212. package/dist/mcp/server-instructions.js.map +1 -1
  213. package/dist/mcp/telemetry.d.ts +13 -0
  214. package/dist/mcp/telemetry.d.ts.map +1 -1
  215. package/dist/mcp/telemetry.js +3 -0
  216. package/dist/mcp/telemetry.js.map +1 -1
  217. package/dist/mcp/tool-call-formatter.d.ts.map +1 -1
  218. package/dist/mcp/tool-call-formatter.js +26 -1
  219. package/dist/mcp/tool-call-formatter.js.map +1 -1
  220. package/dist/mcp/tools/code.d.ts.map +1 -1
  221. package/dist/mcp/tools/code.js +10 -2
  222. package/dist/mcp/tools/code.js.map +1 -1
  223. package/dist/mcp/tools/context.d.ts.map +1 -1
  224. package/dist/mcp/tools/context.js +8 -0
  225. package/dist/mcp/tools/context.js.map +1 -1
  226. package/dist/mcp/tools/file-read.d.ts.map +1 -1
  227. package/dist/mcp/tools/file-read.js +23 -7
  228. package/dist/mcp/tools/file-read.js.map +1 -1
  229. package/dist/mcp/tools/repo.d.ts.map +1 -1
  230. package/dist/mcp/tools/repo.js +35 -7
  231. package/dist/mcp/tools/repo.js.map +1 -1
  232. package/dist/mcp/tools/response.d.ts.map +1 -1
  233. package/dist/mcp/tools/response.js +1 -0
  234. package/dist/mcp/tools/response.js.map +1 -1
  235. package/dist/mcp/tools/runtime-query.d.ts.map +1 -1
  236. package/dist/mcp/tools/runtime-query.js +8 -1
  237. package/dist/mcp/tools/runtime-query.js.map +1 -1
  238. package/dist/mcp/tools/runtime.d.ts.map +1 -1
  239. package/dist/mcp/tools/runtime.js +162 -129
  240. package/dist/mcp/tools/runtime.js.map +1 -1
  241. package/dist/mcp/tools/symbol.d.ts.map +1 -1
  242. package/dist/mcp/tools/symbol.js +3 -0
  243. package/dist/mcp/tools/symbol.js.map +1 -1
  244. package/dist/mcp/tools/tool-descriptors.d.ts.map +1 -1
  245. package/dist/mcp/tools/tool-descriptors.js +1 -8
  246. package/dist/mcp/tools/tool-descriptors.js.map +1 -1
  247. package/dist/mcp/tools.d.ts +91 -9
  248. package/dist/mcp/tools.d.ts.map +1 -1
  249. package/dist/mcp/tools.js +83 -25
  250. package/dist/mcp/tools.js.map +1 -1
  251. package/dist/observability/aggregator.d.ts +31 -0
  252. package/dist/observability/aggregator.d.ts.map +1 -1
  253. package/dist/observability/aggregator.js +130 -1
  254. package/dist/observability/aggregator.js.map +1 -1
  255. package/dist/observability/event-tap.d.ts +11 -0
  256. package/dist/observability/event-tap.d.ts.map +1 -1
  257. package/dist/observability/event-tap.js.map +1 -1
  258. package/dist/observability/index.d.ts +2 -2
  259. package/dist/observability/index.d.ts.map +1 -1
  260. package/dist/observability/index.js.map +1 -1
  261. package/dist/observability/service.d.ts +2 -1
  262. package/dist/observability/service.d.ts.map +1 -1
  263. package/dist/observability/service.js +16 -0
  264. package/dist/observability/service.js.map +1 -1
  265. package/dist/observability/types.d.ts +45 -0
  266. package/dist/observability/types.d.ts.map +1 -1
  267. package/dist/observability/types.js.map +1 -1
  268. package/dist/retrieval/orchestrator.d.ts.map +1 -1
  269. package/dist/retrieval/orchestrator.js +35 -7
  270. package/dist/retrieval/orchestrator.js.map +1 -1
  271. package/dist/runtime/artifacts.d.ts +32 -11
  272. package/dist/runtime/artifacts.d.ts.map +1 -1
  273. package/dist/runtime/artifacts.js +84 -11
  274. package/dist/runtime/artifacts.js.map +1 -1
  275. package/dist/runtime/response-artifacts.d.ts +1 -0
  276. package/dist/runtime/response-artifacts.d.ts.map +1 -1
  277. package/dist/runtime/response-artifacts.js +53 -0
  278. package/dist/runtime/response-artifacts.js.map +1 -1
  279. package/dist/runtime/types.d.ts +5 -0
  280. package/dist/runtime/types.d.ts.map +1 -1
  281. package/dist/scip/ingestion.d.ts +8 -38
  282. package/dist/scip/ingestion.d.ts.map +1 -1
  283. package/dist/scip/ingestion.js +61 -221
  284. package/dist/scip/ingestion.js.map +1 -1
  285. package/dist/scip/kind-mapping.d.ts +2 -0
  286. package/dist/scip/kind-mapping.d.ts.map +1 -1
  287. package/dist/scip/kind-mapping.js +20 -0
  288. package/dist/scip/kind-mapping.js.map +1 -1
  289. package/dist/scip/scip-io-runner.d.ts +4 -0
  290. package/dist/scip/scip-io-runner.d.ts.map +1 -1
  291. package/dist/scip/scip-io-runner.js +41 -11
  292. package/dist/scip/scip-io-runner.js.map +1 -1
  293. package/dist/semantic/enrichment.d.ts.map +1 -1
  294. package/dist/semantic/enrichment.js +15 -134
  295. package/dist/semantic/enrichment.js.map +1 -1
  296. package/dist/semantic/providers/lsp/client.d.ts +3 -1
  297. package/dist/semantic/providers/lsp/client.d.ts.map +1 -1
  298. package/dist/semantic/providers/lsp/client.js +231 -23
  299. package/dist/semantic/providers/lsp/client.js.map +1 -1
  300. package/dist/semantic/providers/lsp/runner.d.ts +2 -1
  301. package/dist/semantic/providers/lsp/runner.d.ts.map +1 -1
  302. package/dist/semantic/providers/lsp/runner.js +1 -0
  303. package/dist/semantic/providers/lsp/runner.js.map +1 -1
  304. package/dist/ui/config.js +2 -2
  305. package/dist/ui/config.js.map +1 -1
  306. package/dist/ui/observability.css +10 -0
  307. package/dist/ui/observability.html +30 -0
  308. package/dist/ui/observability.js +47 -0
  309. package/dist/ui/observability.js.map +1 -1
  310. package/dist/util/logger.d.ts.map +1 -1
  311. package/dist/util/logger.js +11 -3
  312. package/dist/util/logger.js.map +1 -1
  313. package/dist/util/runtime-identity.d.ts +8 -0
  314. package/dist/util/runtime-identity.d.ts.map +1 -1
  315. package/dist/util/runtime-identity.js +41 -0
  316. package/dist/util/runtime-identity.js.map +1 -1
  317. package/package.json +20 -10
  318. package/scripts/postinstall-watchman.mjs +136 -0
  319. package/scripts/postinstall.mjs +3 -2
  320. package/templates/GEMINI.md.template +6 -2
  321. package/templates/OPENCODE.md.template +7 -1
  322. package/templates/SDL.md +105 -28
  323. package/dist/mcp/tools/scip.d.ts +0 -10
  324. package/dist/mcp/tools/scip.d.ts.map +0 -1
  325. package/dist/mcp/tools/scip.js +0 -59
  326. package/dist/mcp/tools/scip.js.map +0 -1
  327. package/dist/scip/cleanup.d.ts +0 -35
  328. package/dist/scip/cleanup.d.ts.map +0 -1
  329. package/dist/scip/cleanup.js +0 -76
  330. package/dist/scip/cleanup.js.map +0 -1
package/README.md CHANGED
@@ -38,33 +38,7 @@ SDL-MCP fixes this. It indexes your codebase into a searchable **symbol graph**
38
38
 
39
39
  ## How it works — in 30 seconds
40
40
 
41
- ```mermaid
42
- %%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
43
- flowchart TD
44
- Codebase["Your Codebase"]
45
- Indexer["Indexer<br/>12 languages<br/>Rust native or Tree-sitter fallback"]
46
- Graph["LadybugDB graph<br/>symbols, edges, metrics, versions"]
47
- MCP["Current MCP surfaces<br/>33 flat, 6 gateway, 4 Code Mode"]
48
- CLI["13 CLI commands"]
49
- HTTP["HTTP API and graph UI"]
50
- Agent["AI coding agent<br/>Claude Code, Claude Desktop, Cursor, Windsurf, Codex, Gemini"]
51
-
52
- Codebase e1@--> Indexer
53
- Indexer e2@--> Graph
54
- Graph e3@--> MCP
55
- Graph e4@--> CLI
56
- Graph e5@--> HTTP
57
- MCP e6@--> Agent
58
-
59
- classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
60
- classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
61
- classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
62
- classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
63
- classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
64
- classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
65
- classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
66
- class e1,e2,e3,e4,e5,e6 animate;
67
- ```
41
+ ![SDL-MCP indexing and retrieval flow](./docs/readme-assets/readme-how-it-works.webp)
68
42
 
69
43
  1. **Index once** — SDL-MCP parses every symbol in your repo and stores it as a compact metadata record (a "Symbol Card") in a graph database
70
44
  2. **Query efficiently** — Agents use MCP tools to search, slice, and retrieve exactly the context they need
@@ -117,27 +91,7 @@ Point your MCP client at the server and the agent gains access to SDL-MCP's curr
117
91
 
118
92
  The core innovation. Named after the adjustable aperture that controls light flow in optics, the Iris Gate Ladder lets agents dial their context "aperture" from a pinhole to wide-open.
119
93
 
120
- ```mermaid
121
- %%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
122
- flowchart TB
123
- R1["~100 tokens<br/>Rung 1: Symbol Card<br/>Name, signature, summary, dependencies, metrics"]
124
- R2["~300 tokens<br/>Rung 2: Skeleton IR<br/>Signatures and control flow with bodies elided"]
125
- R3["~600 tokens<br/>Rung 3: Hot-Path Excerpt<br/>Identifier-focused lines with context"]
126
- R4["~2,000 tokens<br/>Rung 4: Raw Code Window<br/>Policy-gated full source"]
127
-
128
- R1 e1@--> R2
129
- R2 e2@--> R3
130
- R3 e3@--> R4
131
-
132
- classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
133
- classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
134
- classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
135
- classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
136
- classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
137
- classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
138
- classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
139
- class e1,e2,e3 animate;
140
- ```
94
+ ![Iris Gate Ladder context escalation tiers](./docs/readme-assets/readme-iris-ladder.webp)
141
95
 
142
96
  > **Most questions are answered at Rungs 1-2** without ever reading raw code. That's where the token savings come from.
143
97
 
@@ -168,41 +122,7 @@ flowchart TB
168
122
 
169
123
  Every function, class, interface, type, and variable becomes a **Symbol Card**: a compact metadata record (~100 tokens) containing everything an agent needs to _understand_ a symbol without reading its code.
170
124
 
171
- ```mermaid
172
- %%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
173
- flowchart TB
174
- Card["Symbol Card: validateToken"]
175
- Kind["Kind: function (exported)"]
176
- File["File: src/auth/jwt.ts:42-67"]
177
- Signature["Signature: (token: string, opts?: ValidateOpts) -> Promise<DecodedToken>"]
178
- Summary["Summary: validates JWT signature and expiration"]
179
- Invariants["Invariants: throws on expired token"]
180
- SideEffects["Side effects: logs to audit trail"]
181
- Deps["Dependencies: verifySignature, checkExpiry, jsonwebtoken, AuditLogger"]
182
- Metrics["Metrics: fan-in 12, fan-out 4, churn 3/30d"]
183
- Context["Context: auth-module, request-pipeline, auth.test.ts"]
184
- ETag["ETag: a7f3c2..."]
185
-
186
- Card e1@--> Kind
187
- Kind e2@--> File
188
- File e3@--> Signature
189
- Signature e4@--> Summary
190
- Summary e5@--> Invariants
191
- Invariants e6@--> SideEffects
192
- SideEffects e7@--> Deps
193
- Deps e8@--> Metrics
194
- Metrics e9@--> Context
195
- Context e10@--> ETag
196
-
197
- classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
198
- classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
199
- classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
200
- classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
201
- classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
202
- classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
203
- classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
204
- class e1,e2,e3,e4,e5,e6,e7,e8,e9,e10 animate;
205
- ```
125
+ ![Symbol Card fields and relationships](./docs/readme-assets/readme-symbol-card.webp)
206
126
 
207
127
  Cards include **confidence-scored call resolution** (the pass-2 resolver traces imports, aliases, barrel re-exports, and tagged templates to produce accurate dependency edges), **community detection** (cluster membership), and **call-chain tracing** (process participation with entry/intermediate/exit roles).
208
128
 
@@ -222,27 +142,7 @@ Cards include **confidence-scored call resolution** (the pass-2 resolver traces
222
142
 
223
143
  Instead of reading files in the same directory, SDL-MCP follows the _dependency graph_. Starting from symbols relevant to your task, it traverses weighted edges (call: 1.0, config: 0.8, import: 0.6), scores each symbol by relevance, and returns the N most important within a token budget.
224
144
 
225
- ```mermaid
226
- %%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
227
- flowchart TD
228
- Task["Task: Fix the auth middleware"] e1@--> Slice["sdl.slice.build"]
229
- Slice e2@--> Auth["authenticate"]
230
- Slice e3@--> Validate["validateToken"]
231
- Slice e4@--> Config["JwtConfig"]
232
- Auth e5@--> Hash["hashPassword"]
233
- Validate e6@--> User["getUserById"]
234
- Config e7@--> Env["envLoader"]
235
- Env e8@-. frontier outside budget .-> Frontier["spillover frontier"]
236
-
237
- classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
238
- classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
239
- classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
240
- classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
241
- classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
242
- classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
243
- classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
244
- class e1,e2,e3,e4,e5,e6,e7,e8 animate;
245
- ```
145
+ ![Graph slicing dependency selection flow](./docs/readme-assets/readme-graph-slicing.webp)
246
146
 
247
147
  Slices have handles, leases, refresh (delta-only updates), and spillover (paged overflow). You can also skip the symbol search entirely — pass a `taskText` string and SDL-MCP auto-discovers the relevant entry symbols.
248
148
 
@@ -261,39 +161,7 @@ Slices have handles, leases, refresh (delta-only updates), and spillover (paged
261
161
 
262
162
  `git diff` tells you what lines changed. SDL-MCP tells you what that change _means_ and who's affected.
263
163
 
264
- ```mermaid
265
- %%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
266
- flowchart TD
267
- Change["Modified validateToken() signature"]
268
- Sig["signatureDiff<br/>added options?: object"]
269
- Inv["invariantDiff<br/>added throws on expired"]
270
- Fx["sideEffectDiff<br/>added logs to audit trail"]
271
- Blast["Blast radius"]
272
- A1["authenticate()<br/>distance 1"]
273
- A2["refreshSession()<br/>distance 1"]
274
- A3["AuthMiddleware<br/>distance 2"]
275
- A4["auth.test.ts<br/>re-run recommended"]
276
-
277
- Change e1@--> Sig
278
- Change e2@--> Inv
279
- Change e3@--> Fx
280
- Sig e4@--> Blast
281
- Inv e5@--> Blast
282
- Fx e6@--> Blast
283
- Blast e7@--> A1
284
- Blast e8@--> A2
285
- Blast e9@--> A3
286
- Blast e10@--> A4
287
-
288
- classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
289
- classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
290
- classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
291
- classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
292
- classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
293
- classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
294
- classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
295
- class e1,e2,e3,e4,e5,e6,e7,e8,e9,e10 animate;
296
- ```
164
+ ![Delta Packs semantic diff and blast radius flow](./docs/readme-assets/readme-delta-packs.webp)
297
165
 
298
166
  **PR risk analysis** (`sdl.pr.risk.analyze`) wraps this into a scored assessment with findings, evidence, and test recommendations. **Fan-in trend analysis** detects "amplifier" symbols whose growing dependency count means changes ripple further over time.
299
167
 
@@ -312,24 +180,7 @@ flowchart TD
312
180
 
313
181
  SDL-MCP doesn't wait for you to save. As you type in your editor, buffer updates are pushed to an in-memory overlay store, parsed in the background, and merged with the durable database. Search, cards, and slices reflect your _current_ code, not your last save.
314
182
 
315
- ```mermaid
316
- %%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
317
- flowchart LR
318
- Editor["Editor keystrokes"] e1@--> Push["sdl.buffer.push"]
319
- Push e2@--> Overlay["Overlay store"]
320
- Overlay e3@--> Reads["Merged reads<br/>search, cards, slices"]
321
- Overlay e4@--> Persist["save / idle checkpoint"]
322
- Persist e5@--> DB["LadybugDB durable graph"]
323
-
324
- classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
325
- classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
326
- classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
327
- classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
328
- classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
329
- classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
330
- classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
331
- class e1,e2,e3,e4,e5 animate;
332
- ```
183
+ ![Live indexing buffer overlay flow](./docs/readme-assets/readme-live-indexing.webp)
333
184
 
334
185
  **Why it matters:**
335
186
 
@@ -404,27 +255,7 @@ Run tests, linters, and scripts through SDL-MCP's governance layer instead of un
404
255
 
405
256
  Agents forget everything between sessions. SDL-MCP fixes this with an **opt-in graph-backed memory system** that lets agents store decisions, bugfix context, and task notes linked directly to the symbols and files they relate to. Memory is **disabled by default** and must be explicitly enabled in the configuration. When enabled, memories are stored both in the graph database (for fast querying) and as checked-in markdown files (for version control and team sharing).
406
257
 
407
- ```mermaid
408
- %%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
409
- flowchart LR
410
- Session1["Agent session 1<br/>records bugfix memory"] e1@--> Store["sdl.memory.store"]
411
- Store e2@--> Graph["LadybugDB memory node"]
412
- Store e3@--> Files[".sdl-memory/bugfixes/<id>.md"]
413
- Graph e4@--> Link1["MEMORY_OF -> authenticate()"]
414
- Graph e5@--> Link2["HAS_MEMORY -> repo"]
415
- Session2["Agent session 2"] e6@--> Surface["sdl.memory.surface"]
416
- Surface e7@--> Graph
417
- Graph e8@--> Recall["Relevant memory surfaced<br/>race condition fix in authenticate()"]
418
-
419
- classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
420
- classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
421
- classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
422
- classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
423
- classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
424
- classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
425
- classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
426
- class e1,e2,e3,e4,e5,e6,e7,e8 animate;
427
- ```
258
+ ![Development Memories storage and surfacing cycle](./docs/readme-assets/readme-development-memories.webp)
428
259
 
429
260
  When enabled, memories are **automatically surfaced** inside graph slices — when an agent builds a slice touching symbols with linked memories, those memories appear alongside the cards. During re-indexing, memories linked to changed symbols are **flagged as stale**, prompting agents to review and update them. Four MCP tools (`store`, `query`, `remove`, `surface`) provide full CRUD plus intelligent ranking by confidence, recency, and symbol overlap. Memory tools are only available when memory is enabled in the configuration.
430
261
 
@@ -442,33 +273,16 @@ When enabled, memories are **automatically surfaced** inside graph slices — wh
442
273
 
443
274
  ### SCIP Integration — Compiler-Grade Cross-References
444
275
 
445
- Tree-sitter gives SDL-MCP fast, syntax-level symbol extraction across the supported TypeScript/JavaScript, Python, Go, Java, C#, C/C++, PHP, Rust, Kotlin, and Shell surface. SCIP (Source Code Intelligence Protocol) supplements this with **compiler-grade cross-references** from tools like scip-typescript, scip-go, and rust-analyzer. Generate a `.scip` index file, point SDL-MCP at it, and heuristic edges are upgraded to exact compiler-verified edges, external dependency symbols become first-class graph nodes, and new `implements` edges reveal interface/trait relationships that syntax analysis cannot discover.
446
-
447
- ```mermaid
448
- %%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
449
- flowchart LR
450
- Compiler["Compiler / Type Checker"] e1@--> SCIP[".scip index file"]
451
- SCIP e2@--> Ingest["sdl.scip.ingest"]
452
- Ingest e3@--> Upgrade["Heuristic edges → exact edges"]
453
- Ingest e4@--> External["External dependency nodes"]
454
- Ingest e5@--> Implements["implements edges"]
455
-
456
- classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
457
- classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
458
- classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
459
- classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
460
- classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
461
- classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
462
- classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
463
- class e1,e2,e3,e4,e5 animate;
464
- ```
276
+ Tree-sitter gives SDL-MCP fast, syntax-level symbol extraction across the built-in TypeScript/JavaScript, Python, Go, Java, C#, C/C++, Rust, and Kotlin surface. PHP and Shell/Bash are explicit opt-in language packs for LSP provider-first work and are not enabled by default. SCIP (Source Code Intelligence Protocol) supplies **compiler-grade cross-references** from tools like scip-typescript, scip-go, and rust-analyzer. When `scip.enabled` is true, SDL-MCP uses provider-first indexing to materialize those facts directly, with legacy parsing retained only for uncovered or provider-unusable files.
277
+
278
+ ![SCIP integration compiler cross-reference ingestion flow](./docs/readme-assets/readme-scip-integration.webp)
465
279
 
466
280
  **Why it matters:**
467
281
 
468
282
  - Upgrades heuristic call resolution to **compiler-verified exact edges** (confidence 0.95)
469
283
  - External dependencies (npm packages, Go modules, crate deps) become searchable graph nodes
470
284
  - Interface/trait implementations tracked via `implements` edges
471
- - Auto-ingest on `sdl.index.refresh` keeps SCIP data current with zero manual steps
285
+ - Provider-first indexing keeps SCIP/LSP facts owned by the provider path; legacy indexing does not ingest `.scip` overlays
472
286
  - Complementary: tree-sitter provides structure, SCIP provides semantic precision
473
287
 
474
288
  [SCIP Integration Deep Dive →](./docs/feature-deep-dives/scip-integration.md)
@@ -515,21 +329,7 @@ Features include typed argument coercion (string, number, boolean, string[], jso
515
329
 
516
330
  The tool gateway projects the 35 gateway-routable SDL actions into **4 namespace-scoped tools** (`sdl.query`, `sdl.code`, `sdl.repo`, `sdl.agent`), reducing `tools/list` overhead from the full flat schema surface to a compact gateway surface.
517
331
 
518
- ```mermaid
519
- %%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
520
- flowchart LR
521
- Before["Flat mode<br/>38 tools<br/>2 universal + 36 flat"] e1@--> After["Gateway mode<br/>6 tools<br/>2 universal + 4 gateway"]
522
- After e2@--> Savings["Smaller tools/list payload<br/>lower agent startup overhead"]
523
-
524
- classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
525
- classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
526
- classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
527
- classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
528
- classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
529
- classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
530
- classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
531
- class e1,e2 animate;
532
- ```
332
+ ![Tool Gateway compact registration flow](./docs/readme-assets/readme-tool-gateway.webp)
533
333
 
534
334
  Each gateway tool accepts an `action` discriminator field (e.g., `{ action: "symbol.search", repoId: "x", query: "auth" }`) and routes to the same handlers with double Zod validation. Thin wire schemas in `tools/list` keep the registration compact while full validation happens server-side. The flat-only `sdl.file.write` action remains outside gateway mode today.
535
335
 
@@ -622,9 +422,6 @@ The generated source of truth is [`docs/generated/tool-inventory.md`](./docs/gen
622
422
  <tr><td><code>sdl.workflow</code></td><td>Multi-step operations with budget tracking, ETag caching, and transforms</td></tr>
623
423
  <tr><td><code>sdl.manual</code></td><td>Self-documentation — query usage guide, action schemas, output format reference</td></tr>
624
424
 
625
- <tr><td><strong>SCIP</strong></td>
626
- <td><code>sdl.scip.ingest</code></td><td>Ingest a pre-built SCIP index for compiler-grade cross-references (with dry-run support)</td></tr>
627
-
628
425
  <tr><td rowspan="2"><strong>File</strong></td>
629
426
  <td><code>sdl.file.read</code></td><td>Read non-indexed files (configs, docs, templates) with line-range, search, or JSON-path modes</td></tr>
630
427
  <tr><td><code>sdl.file.write</code></td><td>Policy-aware write helper for non-indexed files and templates</td></tr>
@@ -655,7 +452,7 @@ The generated source of truth is [`docs/generated/tool-inventory.md`](./docs/gen
655
452
  | `sdl-mcp info` | Runtime diagnostics — version, Node.js, platform, database, config |
656
453
  | `sdl-mcp summary` | Generate copy/paste context summaries from the CLI |
657
454
  | `sdl-mcp health` | Compute composite health score with badge/JSON output |
658
- | `sdl-mcp benchmark` | Run CI regression benchmarks |
455
+ | `sdl-mcp benchmark:ci` | Run CI regression benchmarks |
659
456
  | `sdl-mcp export` | Export sync artifact |
660
457
  | `sdl-mcp import` | Import sync artifact |
661
458
  | `sdl-mcp pull` | Pull by version/commit with fallback |
@@ -712,32 +509,7 @@ A **VSCode extension** (`sdl-mcp-vscode/`) provides live buffer integration for
712
509
 
713
510
  ## System Architecture
714
511
 
715
- ```mermaid
716
- %%{init: {"theme":"base","themeVariables":{"background":"#ffffff","primaryColor":"#E7F8F2","primaryBorderColor":"#0F766E","primaryTextColor":"#102A43","secondaryColor":"#E8F1FF","secondaryBorderColor":"#2563EB","secondaryTextColor":"#102A43","tertiaryColor":"#FFF4D6","tertiaryBorderColor":"#B45309","tertiaryTextColor":"#102A43","lineColor":"#0F766E","textColor":"#102A43","fontFamily":"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"},"flowchart":{"curve":"basis","htmlLabels":true}}}%%
717
- flowchart TD
718
- Clients["MCP clients<br/>Claude Code, Claude Desktop, Cursor, Windsurf, Codex, Gemini"]
719
- Gateway["Tool gateway<br/>sdl.query, sdl.code, sdl.repo, sdl.agent"]
720
- Flat["Flat tools and optional code-mode surfaces"]
721
- Policy["Policy engine<br/>proof-of-need, budgets, audit logging"]
722
- Graph["LadybugDB graph<br/>symbols, edges, files, versions, memories"]
723
- Indexer["Indexer pipeline<br/>Rust native or Tree-sitter fallback<br/>pass 1, pass 2, semantic enrichment"]
724
-
725
- Clients e1@--> Gateway
726
- Clients e2@--> Flat
727
- Gateway e3@--> Policy
728
- Flat e4@--> Policy
729
- Policy e5@--> Graph
730
- Indexer e6@--> Graph
731
-
732
- classDef source fill:#E7F8F2,stroke:#0F766E,stroke-width:2px,color:#102A43;
733
- classDef process fill:#E8F1FF,stroke:#2563EB,stroke-width:2px,color:#102A43;
734
- classDef decision fill:#FFF4D6,stroke:#B45309,stroke-width:2px,color:#102A43;
735
- classDef storage fill:#F2E8FF,stroke:#7C3AED,stroke-width:2px,color:#102A43;
736
- classDef output fill:#FFE8EF,stroke:#BE123C,stroke-width:2px,color:#102A43;
737
- classDef muted fill:#F8FAFC,stroke:#64748B,stroke-width:1px,color:#102A43;
738
- classDef animate stroke:#0F766E,stroke-width:2px,stroke-dasharray:10\,5,stroke-dashoffset:900,animation:dash 22s linear infinite;
739
- class e1,e2,e3,e4,e5,e6 animate;
740
- ```
512
+ ![SDL-MCP system architecture](./docs/readme-assets/readme-system-architecture.webp)
741
513
 
742
514
  [Full Architecture Documentation →](./docs/architecture.md)
743
515
 
@@ -771,7 +543,8 @@ flowchart TD
771
543
  | [Governance & Policy](./docs/feature-deep-dives/governance-policy.md) | Proof-of-need gating, audit logging, runtime sandboxing |
772
544
  | [Agent Context](./docs/feature-deep-dives/agent-context.md) | Task-shaped context retrieval, feedback loops, portable context summaries |
773
545
  | [Context Modes](./docs/feature-deep-dives/context-modes.md) | Precise vs broad retrieval, adaptive symbol ranking, benchmark trade-offs |
774
- | [Indexing & Languages](./docs/feature-deep-dives/indexing-languages.md) | Rust/TS engines, two-pass architecture, 12-language support |
546
+ | [Indexing & Languages](./docs/feature-deep-dives/indexing-languages.md) | Rust/TS engines, two-pass architecture, built-in and opt-in language support |
547
+ | [Language Provider Support](./docs/feature-deep-dives/language-provider-support.md) | Language chart for adapters, parser install mode, SCIP/LSP status, and validation |
775
548
  | [Provider-First Indexing](./docs/feature-deep-dives/provider-first-indexing.md) | SCIP/LSP-first planning, provider facts, shadow DB readiness, fallback boundaries |
776
549
  | [Runtime Execution](./docs/feature-deep-dives/runtime-execution.md) | Sandboxed subprocess execution with governance |
777
550
  | [CLI Tool Access](./docs/feature-deep-dives/cli-tool-access.md) | Direct CLI access to 36 action aliases, output formats, stdin piping, scripting |
@@ -780,7 +553,7 @@ flowchart TD
780
553
  | [Semantic Embeddings Setup](./docs/feature-deep-dives/semantic-embeddings-setup.md) | Dependencies, model installation, provider configuration, tier-by-tier setup |
781
554
  | [Code Mode](./docs/feature-deep-dives/code-mode.md) | `sdl.context`, `sdl.workflow`, action discovery, manual reference, one-call workflows |
782
555
  | [Development Memories](./docs/feature-deep-dives/development-memories.md) | Graph-backed cross-session memory, file sync, staleness detection, auto-surfacing |
783
- | [SCIP Integration](./docs/feature-deep-dives/scip-integration.md) | Compiler-grade cross-references, external deps, implements edges, auto-ingest |
556
+ | [SCIP Integration](./docs/feature-deep-dives/scip-integration.md) | Provider-first compiler-grade cross-references, external deps, implements edges |
784
557
  | [Token Savings Meter](./docs/feature-deep-dives/token-savings-meter.md) | Per-call meter, session summaries, lifetime tracking, `sdl.usage.stats` |
785
558
 
786
559
  <br/>
@@ -86,10 +86,15 @@
86
86
  "mode": "primaryWithCaps",
87
87
  "workspaceSymbolLimit": 5000,
88
88
  "documentSymbolFileLimit": 500,
89
+ "documentSymbolTimeoutMs": 10000,
90
+ "documentSymbolFailureLimit": 20,
91
+ "documentSymbolCollectionTimeoutMs": 120000,
89
92
  "referenceCandidateLimit": 200,
90
- "diagnosticsLimit": 5000
93
+ "diagnosticsLimit": 5000,
94
+ "diagnosticsTimeoutMs": 5000
91
95
  }
92
96
  },
97
+ "watchProvider": "auto",
93
98
  "concurrency": 8,
94
99
  "enableFileWatching": true,
95
100
  "maxWatchedFiles": 25000,
@@ -121,6 +121,7 @@
121
121
  "indexing": {
122
122
  "concurrency": 4,
123
123
  "enableFileWatching": true,
124
+ "watchProvider": "auto",
124
125
  "maxWatchedFiles": 25000
125
126
  },
126
127
  "slice": {
@@ -70,7 +70,12 @@
70
70
  "php",
71
71
  "rs",
72
72
  "kt",
73
- "sh"
73
+ "sh",
74
+ "powershell",
75
+ "ruby",
76
+ "lua",
77
+ "dart",
78
+ "swift"
74
79
  ]
75
80
  },
76
81
  "default": [
@@ -333,6 +338,24 @@
333
338
  "maximum": 50000,
334
339
  "default": 500
335
340
  },
341
+ "documentSymbolTimeoutMs": {
342
+ "type": "integer",
343
+ "minimum": 500,
344
+ "maximum": 300000,
345
+ "default": 10000
346
+ },
347
+ "documentSymbolFailureLimit": {
348
+ "type": "integer",
349
+ "minimum": 1,
350
+ "maximum": 100000,
351
+ "default": 20
352
+ },
353
+ "documentSymbolCollectionTimeoutMs": {
354
+ "type": "integer",
355
+ "minimum": 1000,
356
+ "maximum": 1800000,
357
+ "default": 120000
358
+ },
336
359
  "referenceCandidateLimit": {
337
360
  "type": "integer",
338
361
  "minimum": 0,
@@ -344,14 +367,24 @@
344
367
  "minimum": 0,
345
368
  "maximum": 100000,
346
369
  "default": 5000
370
+ },
371
+ "diagnosticsTimeoutMs": {
372
+ "type": "integer",
373
+ "minimum": 500,
374
+ "maximum": 300000,
375
+ "default": 5000
347
376
  }
348
377
  },
349
378
  "default": {
350
379
  "mode": "primaryWithCaps",
351
380
  "workspaceSymbolLimit": 5000,
352
381
  "documentSymbolFileLimit": 500,
382
+ "documentSymbolTimeoutMs": 10000,
383
+ "documentSymbolFailureLimit": 20,
384
+ "documentSymbolCollectionTimeoutMs": 120000,
353
385
  "referenceCandidateLimit": 200,
354
- "diagnosticsLimit": 5000
386
+ "diagnosticsLimit": 5000,
387
+ "diagnosticsTimeoutMs": 5000
355
388
  }
356
389
  }
357
390
  },
@@ -363,11 +396,21 @@
363
396
  "mode": "primaryWithCaps",
364
397
  "workspaceSymbolLimit": 5000,
365
398
  "documentSymbolFileLimit": 500,
399
+ "documentSymbolTimeoutMs": 10000,
400
+ "documentSymbolFailureLimit": 20,
401
+ "documentSymbolCollectionTimeoutMs": 120000,
366
402
  "referenceCandidateLimit": 200,
367
- "diagnosticsLimit": 5000
403
+ "diagnosticsLimit": 5000,
404
+ "diagnosticsTimeoutMs": 5000
368
405
  }
369
406
  }
370
407
  },
408
+ "watchProvider": {
409
+ "type": "string",
410
+ "description": "File watcher event source. auto tries Watchman, then Chokidar, then fs.watch. Explicit providers fail visibly when unavailable.",
411
+ "enum": ["auto", "watchman", "chokidar", "fsWatch"],
412
+ "default": "auto"
413
+ },
371
414
  "concurrency": {
372
415
  "type": "integer",
373
416
  "description": "Number of concurrent indexing workers",
@@ -474,10 +517,15 @@
474
517
  "mode": "primaryWithCaps",
475
518
  "workspaceSymbolLimit": 5000,
476
519
  "documentSymbolFileLimit": 500,
520
+ "documentSymbolTimeoutMs": 10000,
521
+ "documentSymbolFailureLimit": 20,
522
+ "documentSymbolCollectionTimeoutMs": 120000,
477
523
  "referenceCandidateLimit": 200,
478
- "diagnosticsLimit": 5000
524
+ "diagnosticsLimit": 5000,
525
+ "diagnosticsTimeoutMs": 5000
479
526
  }
480
527
  },
528
+ "watchProvider": "auto",
481
529
  "concurrency": 8,
482
530
  "enableFileWatching": true,
483
531
  "maxWatchedFiles": 25000,
@@ -1160,6 +1208,24 @@
1160
1208
  "default": []
1161
1209
  },
1162
1210
  "readiness": { "type": "string" },
1211
+ "documentSessionMode": {
1212
+ "type": "string",
1213
+ "enum": ["workspace", "document"]
1214
+ },
1215
+ "documentSymbolRetryCount": {
1216
+ "type": "integer",
1217
+ "minimum": 0,
1218
+ "maximum": 10
1219
+ },
1220
+ "documentSymbolRetryDelayMs": {
1221
+ "type": "integer",
1222
+ "minimum": 0,
1223
+ "maximum": 120000
1224
+ },
1225
+ "env": {
1226
+ "type": "object",
1227
+ "additionalProperties": { "type": "string" }
1228
+ },
1163
1229
  "initializationOptions": { "type": "object" }
1164
1230
  }
1165
1231
  },
@@ -1778,7 +1844,7 @@
1778
1844
  },
1779
1845
  "cleanupAfterIngest": {
1780
1846
  "type": "boolean",
1781
- "description": "Delete <repoRoot>/index.scip after the post-refresh ingest consumes it. The file is regenerated every refresh, so keeping it just clutters the working tree. Only the default output location is cleaned up — passing --output via args opts you out of cleanup automatically.",
1847
+ "description": "Deprecated compatibility field for legacy post-refresh SCIP ingest cleanup. Provider-first does not delete generated indexes after collection.",
1782
1848
  "default": true
1783
1849
  },
1784
1850
  "cacheGeneratedIndexes": {