sdl-mcp 0.8.2 → 0.8.4
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.
- package/README.md +93 -97
- package/config/benchmark.ci.config.json +2 -2
- package/config/benchmark.ci.windows.config.json +2 -2
- package/config/sdlmcp.config.example.json +1 -1
- package/config/sdlmcp.config.json +1 -1
- package/config/sdlmcp.config.json.sample +1 -1
- package/config/sdlmcp.config.schema.json +12 -40
- package/dist/agent/orchestrator.js +5 -5
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/cli/commands/benchmark.js +12 -12
- package/dist/cli/commands/benchmark.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +87 -65
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/health.js +2 -2
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/index.js +7 -7
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +12 -12
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/serve.js +6 -6
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/transport/http.js +16 -16
- package/dist/cli/transport/http.js.map +1 -1
- package/dist/code/gate.js +6 -6
- package/dist/code/gate.js.map +1 -1
- package/dist/code/hotpath.d.ts.map +1 -1
- package/dist/code/hotpath.js +55 -14
- package/dist/code/hotpath.js.map +1 -1
- package/dist/code/redact.d.ts.map +1 -1
- package/dist/code/redact.js +8 -4
- package/dist/code/redact.js.map +1 -1
- package/dist/code/skeleton.d.ts.map +1 -1
- package/dist/code/skeleton.js +271 -47
- package/dist/code/skeleton.js.map +1 -1
- package/dist/code/windows.js +6 -6
- package/dist/code/windows.js.map +1 -1
- package/dist/config/constants.d.ts +2 -2
- package/dist/config/constants.js +2 -2
- package/dist/config/types.d.ts +1 -1
- package/dist/config/types.js +1 -1
- package/dist/db/graph-db-path.d.ts +1 -1
- package/dist/db/graph-db-path.js +1 -1
- package/dist/db/initGraphDb.js +2 -2
- package/dist/db/initGraphDb.js.map +1 -1
- package/dist/db/{kuzu-clusters.d.ts → ladybug-clusters.d.ts} +3 -3
- package/dist/db/ladybug-clusters.d.ts.map +1 -0
- package/dist/db/{kuzu-clusters.js → ladybug-clusters.js} +2 -2
- package/dist/db/ladybug-clusters.js.map +1 -0
- package/dist/db/{kuzu-config.d.ts → ladybug-config.d.ts} +3 -3
- package/dist/db/ladybug-config.d.ts.map +1 -0
- package/dist/db/{kuzu-config.js → ladybug-config.js} +2 -2
- package/dist/db/ladybug-config.js.map +1 -0
- package/dist/db/{kuzu-core.d.ts → ladybug-core.d.ts} +3 -5
- package/dist/db/ladybug-core.d.ts.map +1 -0
- package/dist/db/{kuzu-core.js → ladybug-core.js} +5 -19
- package/dist/db/ladybug-core.js.map +1 -0
- package/dist/db/{kuzu-edges.d.ts → ladybug-edges.d.ts} +3 -3
- package/dist/db/ladybug-edges.d.ts.map +1 -0
- package/dist/db/{kuzu-edges.js → ladybug-edges.js} +3 -3
- package/dist/db/ladybug-edges.js.map +1 -0
- package/dist/db/{kuzu-embeddings.d.ts → ladybug-embeddings.d.ts} +3 -3
- package/dist/db/ladybug-embeddings.d.ts.map +1 -0
- package/dist/db/{kuzu-embeddings.js → ladybug-embeddings.js} +2 -2
- package/dist/db/ladybug-embeddings.js.map +1 -0
- package/dist/db/{kuzu-feedback.d.ts → ladybug-feedback.d.ts} +3 -3
- package/dist/db/ladybug-feedback.d.ts.map +1 -0
- package/dist/db/{kuzu-feedback.js → ladybug-feedback.js} +5 -3
- package/dist/db/ladybug-feedback.js.map +1 -0
- package/dist/db/{kuzu-metrics.d.ts → ladybug-metrics.d.ts} +9 -4
- package/dist/db/ladybug-metrics.d.ts.map +1 -0
- package/dist/db/{kuzu-metrics.js → ladybug-metrics.js} +30 -3
- package/dist/db/ladybug-metrics.js.map +1 -0
- package/dist/db/{kuzu-processes.d.ts → ladybug-processes.d.ts} +3 -3
- package/dist/db/ladybug-processes.d.ts.map +1 -0
- package/dist/db/{kuzu-processes.js → ladybug-processes.js} +2 -2
- package/dist/db/ladybug-processes.js.map +1 -0
- package/dist/db/ladybug-queries.d.ts +33 -0
- package/dist/db/ladybug-queries.d.ts.map +1 -0
- package/dist/db/ladybug-queries.js +45 -0
- package/dist/db/ladybug-queries.js.map +1 -0
- package/dist/db/{kuzu-repos.d.ts → ladybug-repos.d.ts} +3 -3
- package/dist/db/ladybug-repos.d.ts.map +1 -0
- package/dist/db/{kuzu-repos.js → ladybug-repos.js} +2 -2
- package/dist/db/ladybug-repos.js.map +1 -0
- package/dist/db/{kuzu-schema.d.ts → ladybug-schema.d.ts} +5 -5
- package/dist/db/ladybug-schema.d.ts.map +1 -0
- package/dist/db/{kuzu-schema.js → ladybug-schema.js} +11 -24
- package/dist/db/ladybug-schema.js.map +1 -0
- package/dist/db/{kuzu-slices.d.ts → ladybug-slices.d.ts} +3 -3
- package/dist/db/ladybug-slices.d.ts.map +1 -0
- package/dist/db/{kuzu-slices.js → ladybug-slices.js} +2 -2
- package/dist/db/ladybug-slices.js.map +1 -0
- package/dist/db/{kuzu-symbols.d.ts → ladybug-symbols.d.ts} +3 -3
- package/dist/db/ladybug-symbols.d.ts.map +1 -0
- package/dist/db/{kuzu-symbols.js → ladybug-symbols.js} +2 -2
- package/dist/db/ladybug-symbols.js.map +1 -0
- package/dist/db/{kuzu-versions.d.ts → ladybug-versions.d.ts} +3 -3
- package/dist/db/ladybug-versions.d.ts.map +1 -0
- package/dist/db/{kuzu-versions.js → ladybug-versions.js} +2 -2
- package/dist/db/ladybug-versions.js.map +1 -0
- package/dist/db/ladybug.d.ts +11 -0
- package/dist/db/ladybug.d.ts.map +1 -0
- package/dist/db/ladybug.js +260 -0
- package/dist/db/ladybug.js.map +1 -0
- package/dist/delta/blastRadius.js +1 -1
- package/dist/delta/blastRadius.js.map +1 -1
- package/dist/delta/diff.d.ts +2 -2
- package/dist/delta/diff.d.ts.map +1 -1
- package/dist/delta/diff.js +5 -5
- package/dist/delta/diff.js.map +1 -1
- package/dist/delta/versioning.d.ts +6 -6
- package/dist/delta/versioning.d.ts.map +1 -1
- package/dist/delta/versioning.js +17 -17
- package/dist/delta/versioning.js.map +1 -1
- package/dist/graph/buildGraph.d.ts +1 -1
- package/dist/graph/buildGraph.d.ts.map +1 -1
- package/dist/graph/buildGraph.js +1 -64
- package/dist/graph/buildGraph.js.map +1 -1
- package/dist/graph/cluster.js +5 -5
- package/dist/graph/cluster.js.map +1 -1
- package/dist/graph/metrics.d.ts +1 -1
- package/dist/graph/metrics.d.ts.map +1 -1
- package/dist/graph/metrics.js +55 -16
- package/dist/graph/metrics.js.map +1 -1
- package/dist/graph/overview.js +17 -17
- package/dist/graph/overview.js.map +1 -1
- package/dist/graph/prefetch.d.ts.map +1 -1
- package/dist/graph/prefetch.js +17 -10
- package/dist/graph/prefetch.js.map +1 -1
- package/dist/graph/process.d.ts.map +1 -1
- package/dist/graph/process.js +9 -10
- package/dist/graph/process.js.map +1 -1
- package/dist/graph/slice/beam-search-engine.d.ts +1 -1
- package/dist/graph/slice/beam-search-engine.d.ts.map +1 -1
- package/dist/graph/slice/beam-search-engine.js +11 -11
- package/dist/graph/slice/beam-search-engine.js.map +1 -1
- package/dist/graph/slice/start-node-resolver.d.ts +1 -1
- package/dist/graph/slice/start-node-resolver.d.ts.map +1 -1
- package/dist/graph/slice/start-node-resolver.js +112 -22
- package/dist/graph/slice/start-node-resolver.js.map +1 -1
- package/dist/graph/slice.d.ts +1 -1
- package/dist/graph/slice.d.ts.map +1 -1
- package/dist/graph/slice.js +43 -25
- package/dist/graph/slice.js.map +1 -1
- package/dist/indexer/adapter/kotlin.d.ts.map +1 -1
- package/dist/indexer/adapter/kotlin.js +11 -1
- package/dist/indexer/adapter/kotlin.js.map +1 -1
- package/dist/indexer/adapter/plugin/loader.d.ts +1 -1
- package/dist/indexer/adapter/plugin/loader.d.ts.map +1 -1
- package/dist/indexer/adapter/plugin/loader.js +19 -2
- package/dist/indexer/adapter/plugin/loader.js.map +1 -1
- package/dist/indexer/ann-index.d.ts +3 -3
- package/dist/indexer/ann-index.d.ts.map +1 -1
- package/dist/indexer/ann-index.js +9 -9
- package/dist/indexer/ann-index.js.map +1 -1
- package/dist/indexer/cluster-orchestrator.js +10 -10
- package/dist/indexer/cluster-orchestrator.js.map +1 -1
- package/dist/indexer/configEdges.d.ts +2 -2
- package/dist/indexer/configEdges.d.ts.map +1 -1
- package/dist/indexer/configEdges.js.map +1 -1
- package/dist/indexer/edge-builder/cleanup.js +5 -5
- package/dist/indexer/edge-builder/cleanup.js.map +1 -1
- package/dist/indexer/edge-builder/import-resolution.js +5 -5
- package/dist/indexer/edge-builder/import-resolution.js.map +1 -1
- package/dist/indexer/edge-builder/pass2.d.ts.map +1 -1
- package/dist/indexer/edge-builder/pass2.js +26 -15
- package/dist/indexer/edge-builder/pass2.js.map +1 -1
- package/dist/indexer/edge-builder/pending.js +4 -4
- package/dist/indexer/edge-builder/pending.js.map +1 -1
- package/dist/indexer/edge-builder/symbol-index.js +4 -4
- package/dist/indexer/edge-builder/symbol-index.js.map +1 -1
- package/dist/indexer/embeddings.d.ts +4 -4
- package/dist/indexer/embeddings.d.ts.map +1 -1
- package/dist/indexer/embeddings.js +9 -9
- package/dist/indexer/embeddings.js.map +1 -1
- package/dist/indexer/fileScanner.d.ts.map +1 -1
- package/dist/indexer/fileScanner.js +1 -0
- package/dist/indexer/fileScanner.js.map +1 -1
- package/dist/indexer/indexer.d.ts +1 -1
- package/dist/indexer/indexer.d.ts.map +1 -1
- package/dist/indexer/indexer.js +63 -18
- package/dist/indexer/indexer.js.map +1 -1
- package/dist/indexer/metrics-updater.js +4 -4
- package/dist/indexer/metrics-updater.js.map +1 -1
- package/dist/indexer/parser/helpers.d.ts +21 -1
- package/dist/indexer/parser/helpers.d.ts.map +1 -1
- package/dist/indexer/parser/helpers.js +29 -4
- package/dist/indexer/parser/helpers.js.map +1 -1
- package/dist/indexer/parser/process-file.d.ts +2 -2
- package/dist/indexer/parser/process-file.d.ts.map +1 -1
- package/dist/indexer/parser/process-file.js +83 -107
- package/dist/indexer/parser/process-file.js.map +1 -1
- package/dist/indexer/parser/rust-process-file.d.ts +2 -2
- package/dist/indexer/parser/rust-process-file.d.ts.map +1 -1
- package/dist/indexer/parser/rust-process-file.js +56 -21
- package/dist/indexer/parser/rust-process-file.js.map +1 -1
- package/dist/indexer/pass2/resolvers/go-pass2-resolver.d.ts.map +1 -1
- package/dist/indexer/pass2/resolvers/go-pass2-resolver.js +25 -15
- package/dist/indexer/pass2/resolvers/go-pass2-resolver.js.map +1 -1
- package/dist/indexer/rustIndexer.d.ts.map +1 -1
- package/dist/indexer/rustIndexer.js +10 -3
- package/dist/indexer/rustIndexer.js.map +1 -1
- package/dist/indexer/scanner.d.ts +2 -2
- package/dist/indexer/scanner.d.ts.map +1 -1
- package/dist/indexer/scanner.js +5 -5
- package/dist/indexer/scanner.js.map +1 -1
- package/dist/indexer/summary-generator.js +9 -9
- package/dist/indexer/summary-generator.js.map +1 -1
- package/dist/indexer/treesitter/grammarLoader.d.ts +18 -0
- package/dist/indexer/treesitter/grammarLoader.d.ts.map +1 -1
- package/dist/indexer/treesitter/grammarLoader.js +50 -3
- package/dist/indexer/treesitter/grammarLoader.js.map +1 -1
- package/dist/indexer/treesitter/tsTreesitter.d.ts.map +1 -1
- package/dist/indexer/treesitter/tsTreesitter.js +50 -3
- package/dist/indexer/treesitter/tsTreesitter.js.map +1 -1
- package/dist/indexer/watcher.d.ts.map +1 -1
- package/dist/indexer/watcher.js +25 -16
- package/dist/indexer/watcher.js.map +1 -1
- package/dist/live-index/coordinator.js +4 -4
- package/dist/live-index/coordinator.js.map +1 -1
- package/dist/live-index/dependency-frontier.js +6 -6
- package/dist/live-index/dependency-frontier.js.map +1 -1
- package/dist/live-index/draft-parser.d.ts +1 -1
- package/dist/live-index/draft-parser.d.ts.map +1 -1
- package/dist/live-index/draft-parser.js +5 -5
- package/dist/live-index/draft-parser.js.map +1 -1
- package/dist/live-index/file-patcher.js +13 -13
- package/dist/live-index/file-patcher.js.map +1 -1
- package/dist/live-index/overlay-merge.d.ts +1 -1
- package/dist/live-index/overlay-merge.d.ts.map +1 -1
- package/dist/live-index/overlay-reader.d.ts +1 -1
- package/dist/live-index/overlay-reader.d.ts.map +1 -1
- package/dist/live-index/overlay-reader.js +5 -5
- package/dist/live-index/overlay-reader.js.map +1 -1
- package/dist/live-index/reconcile-worker.js +4 -4
- package/dist/live-index/reconcile-worker.js.map +1 -1
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/mcp/health.d.ts.map +1 -1
- package/dist/mcp/health.js +19 -9
- package/dist/mcp/health.js.map +1 -1
- package/dist/mcp/resources.js +14 -14
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/summary.js +13 -13
- package/dist/mcp/summary.js.map +1 -1
- package/dist/mcp/telemetry.js +6 -6
- package/dist/mcp/telemetry.js.map +1 -1
- package/dist/mcp/token-usage.js +4 -4
- package/dist/mcp/token-usage.js.map +1 -1
- package/dist/mcp/tools/agent-feedback.js +11 -11
- package/dist/mcp/tools/agent-feedback.js.map +1 -1
- package/dist/mcp/tools/code.js +15 -15
- package/dist/mcp/tools/code.js.map +1 -1
- package/dist/mcp/tools/delta.js +5 -5
- package/dist/mcp/tools/delta.js.map +1 -1
- package/dist/mcp/tools/policy.d.ts.map +1 -1
- package/dist/mcp/tools/policy.js +29 -9
- package/dist/mcp/tools/policy.js.map +1 -1
- package/dist/mcp/tools/prRisk.js +2 -2
- package/dist/mcp/tools/prRisk.js.map +1 -1
- package/dist/mcp/tools/repo.d.ts.map +1 -1
- package/dist/mcp/tools/repo.js +34 -23
- package/dist/mcp/tools/repo.js.map +1 -1
- package/dist/mcp/tools/slice.js +22 -22
- package/dist/mcp/tools/slice.js.map +1 -1
- package/dist/mcp/tools/symbol-utils.d.ts +1 -1
- package/dist/mcp/tools/symbol-utils.d.ts.map +1 -1
- package/dist/mcp/tools/symbol.js +18 -18
- package/dist/mcp/tools/symbol.js.map +1 -1
- package/dist/mcp/tools.d.ts +241 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +41 -13
- package/dist/mcp/tools.js.map +1 -1
- package/dist/sync/pull.js +4 -4
- package/dist/sync/pull.js.map +1 -1
- package/dist/sync/sync.js +24 -24
- package/dist/sync/sync.js.map +1 -1
- package/dist/ts/diagnostics.d.ts.map +1 -1
- package/dist/ts/diagnostics.js +19 -5
- package/dist/ts/diagnostics.js.map +1 -1
- package/dist/ts/mapping.d.ts.map +1 -1
- package/dist/ts/mapping.js +10 -9
- package/dist/ts/mapping.js.map +1 -1
- package/dist/util/pidfile.d.ts +1 -1
- package/dist/util/pidfile.js +1 -1
- package/dist/util/safeRegex.d.ts.map +1 -1
- package/dist/util/safeRegex.js +19 -9
- package/dist/util/safeRegex.js.map +1 -1
- package/dist/util/shutdown.d.ts +2 -2
- package/dist/util/shutdown.js +2 -2
- package/package.json +4 -4
- package/dist/db/kuzu-clusters.d.ts.map +0 -1
- package/dist/db/kuzu-clusters.js.map +0 -1
- package/dist/db/kuzu-config.d.ts.map +0 -1
- package/dist/db/kuzu-config.js.map +0 -1
- package/dist/db/kuzu-core.d.ts.map +0 -1
- package/dist/db/kuzu-core.js.map +0 -1
- package/dist/db/kuzu-edges.d.ts.map +0 -1
- package/dist/db/kuzu-edges.js.map +0 -1
- package/dist/db/kuzu-embeddings.d.ts.map +0 -1
- package/dist/db/kuzu-embeddings.js.map +0 -1
- package/dist/db/kuzu-feedback.d.ts.map +0 -1
- package/dist/db/kuzu-feedback.js.map +0 -1
- package/dist/db/kuzu-metrics.d.ts.map +0 -1
- package/dist/db/kuzu-metrics.js.map +0 -1
- package/dist/db/kuzu-processes.d.ts.map +0 -1
- package/dist/db/kuzu-processes.js.map +0 -1
- package/dist/db/kuzu-queries.d.ts +0 -33
- package/dist/db/kuzu-queries.d.ts.map +0 -1
- package/dist/db/kuzu-queries.js +0 -45
- package/dist/db/kuzu-queries.js.map +0 -1
- package/dist/db/kuzu-repos.d.ts.map +0 -1
- package/dist/db/kuzu-repos.js.map +0 -1
- package/dist/db/kuzu-schema.d.ts.map +0 -1
- package/dist/db/kuzu-schema.js.map +0 -1
- package/dist/db/kuzu-slices.d.ts.map +0 -1
- package/dist/db/kuzu-slices.js.map +0 -1
- package/dist/db/kuzu-symbols.d.ts.map +0 -1
- package/dist/db/kuzu-symbols.js.map +0 -1
- package/dist/db/kuzu-versions.d.ts.map +0 -1
- package/dist/db/kuzu-versions.js.map +0 -1
- package/dist/db/kuzu.d.ts +0 -11
- package/dist/db/kuzu.d.ts.map +0 -1
- package/dist/db/kuzu.js +0 -217
- package/dist/db/kuzu.js.map +0 -1
package/README.md
CHANGED
|
@@ -7,11 +7,7 @@
|
|
|
7
7
|
# SDL-MCP
|
|
8
8
|
|
|
9
9
|
  
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
 
|
|
15
11
|
|
|
16
12
|
<div align="right">
|
|
17
13
|
<details>
|
|
@@ -33,143 +29,143 @@
|
|
|
33
29
|
## Claude Opus 4.6 High Overview
|
|
34
30
|
|
|
35
31
|
Question: "Review the code for SDL-MCP and explain to potential new users what this MCP server does and the benefits of
|
|
36
|
-
|
|
32
|
+
using it."
|
|
37
33
|
|
|
38
34
|
Response: "# What is SDL-MCP?
|
|
39
35
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
**SDL-MCP** (Symbol Delta Ledger - Model Context Protocol) is an MCP server that gives AI coding agents a structured,
|
|
37
|
+
token-efficient way to understand your codebase. Instead of feeding entire files into the context window, SDL-MCP
|
|
38
|
+
indexes your repository into a **searchable knowledge graph** of symbols and their relationships, then serves exactly
|
|
39
|
+
the right amount of context through a controlled escalation path.
|
|
44
40
|
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
It ships as an npm package (`npm install -g sdl-mcp`) with a CLI for setup and a server that any MCP-compatible client
|
|
42
|
+
(Claude Code, Claude Desktop, etc.) can connect to.
|
|
47
43
|
|
|
48
|
-
|
|
44
|
+
---
|
|
49
45
|
|
|
50
|
-
|
|
46
|
+
## The Problem It Solves
|
|
51
47
|
|
|
52
|
-
|
|
53
|
-
|
|
48
|
+
When AI assistants work with code, they typically read whole files — often many of them — to gather enough context.
|
|
49
|
+
This has three costs:
|
|
54
50
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
1. **Context windows fill up fast.** A modest codebase can exceed token limits quickly.
|
|
52
|
+
2. **Irrelevant code dilutes focus.** Tokens are spent on code unrelated to the task.
|
|
53
|
+
3. **No incremental understanding.** Every interaction starts fresh with no memory of what was already analyzed.
|
|
58
54
|
|
|
59
|
-
|
|
60
|
-
|
|
55
|
+
SDL-MCP addresses all three by maintaining a **persistent, indexed graph** of your codebase and controlling context
|
|
56
|
+
retrieval through the **Iris Gate Ladder**.
|
|
61
57
|
|
|
62
|
-
|
|
58
|
+
---
|
|
63
59
|
|
|
64
|
-
|
|
60
|
+
## How It Works
|
|
65
61
|
|
|
66
|
-
|
|
62
|
+
### 1. Repository Indexing
|
|
67
63
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
64
|
+
SDL-MCP parses your codebase using either a **native Rust indexer** (default, fast, multi-threaded) or a **tree-sitter
|
|
65
|
+
TypeScript fallback**, and extracts every function, class, interface, type, and variable into **Symbol Cards** —
|
|
66
|
+
compact metadata records containing signatures, summaries, dependency edges, and metrics like fan-in/out.
|
|
71
67
|
|
|
72
|
-
|
|
68
|
+
**12 languages supported:** TypeScript, JavaScript, Python, Go, Java, C#, C, C++, PHP, Rust, Kotlin, and Shell.
|
|
73
69
|
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
Indexing happens once and is persisted in a **LadybugDB embedded graph database**. Incremental re-indexing picks up only
|
|
71
|
+
what changed.
|
|
76
72
|
|
|
77
|
-
|
|
73
|
+
### 2. The Iris Gate Ladder (4 Rungs)
|
|
78
74
|
|
|
79
|
-
|
|
75
|
+
Context is served in escalating detail — agents start small and only request more when needed:
|
|
80
76
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
77
|
+
| Rung | Tool | ~Tokens | What It Provides |
|
|
78
|
+
| :---------------------- | :--------------------- | :---------- | :---------------------------------------------- |
|
|
79
|
+
| **1. Symbol Cards** | `sdl.symbol.getCard` | 50–150 | Name, signature, summary, dependencies, metrics |
|
|
80
|
+
| **2. Skeleton IR** | `sdl.code.getSkeleton` | 200–400 | Signatures + control flow, bodies elided |
|
|
81
|
+
| **3. Hot-Path Excerpt** | `sdl.code.getHotPath` | 400–800 | Lines matching specific identifiers + context |
|
|
82
|
+
| **4. Raw Code Window** | `sdl.code.needWindow` | 1,000–4,000 | Full source code (policy-gated, requires |
|
|
83
|
+
| justification) |
|
|
88
84
|
|
|
89
|
-
|
|
90
|
-
|
|
85
|
+
> [!TIP]
|
|
86
|
+
> Most questions are answered at rungs 1–2 without ever reading raw code.
|
|
91
87
|
|
|
92
|
-
|
|
88
|
+
### 3. Graph Slices
|
|
93
89
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
90
|
+
When the agent needs broader context for a task, `sdl.slice.build` performs a **BFS/beam search** from entry symbols
|
|
91
|
+
across weighted dependency edges (call > config > import), bounded by a token budget. The result is the 20–30 most
|
|
92
|
+
relevant symbols for the task — not an arbitrary directory listing.
|
|
97
93
|
|
|
98
|
-
|
|
94
|
+
### 4. Delta Packs & Blast Radius
|
|
99
95
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
96
|
+
When code changes, SDL-MCP computes **semantic diffs at the symbol level** — not line-level diffs, but changes to
|
|
97
|
+
signatures, invariants, and side effects. It also computes a **blast radius**: which other symbols are affected,
|
|
98
|
+
ranked by proximity, fan-in, and test coverage.
|
|
103
99
|
|
|
104
|
-
|
|
100
|
+
### 5. Proof-of-Need Gating
|
|
105
101
|
|
|
106
|
-
|
|
107
|
-
|
|
102
|
+
Raw code access (rung 4) requires the agent to justify _why_ it needs the code, _what identifiers_ it expects to find,
|
|
103
|
+
and _how many lines_. Requests are audited. This enforces disciplined token usage.
|
|
108
104
|
|
|
109
|
-
|
|
105
|
+
---
|
|
110
106
|
|
|
111
|
-
|
|
107
|
+
## Key Benefits
|
|
112
108
|
|
|
113
|
-
|
|
109
|
+
### Token Efficiency
|
|
114
110
|
|
|
115
|
-
|
|
116
|
-
|
|
111
|
+
- **10–50x fewer tokens** per coding task compared to reading raw files
|
|
112
|
+
- **2,782x compression ratio** for a repository overview vs. a full card dump
|
|
117
113
|
|
|
118
|
-
|
|
114
|
+
### Better Relevance
|
|
119
115
|
|
|
120
|
-
|
|
121
|
-
|
|
116
|
+
- Graph-based slicing finds related code that directory-based approaches miss
|
|
117
|
+
- Confidence-scored call resolution filters noise from low-confidence edges
|
|
122
118
|
|
|
123
|
-
|
|
119
|
+
### Incremental Understanding
|
|
124
120
|
|
|
125
|
-
|
|
126
|
-
|
|
121
|
+
- Delta packs mean the agent doesn't re-read unchanged code
|
|
122
|
+
- Slice handles with leases and refresh support avoid rebuilding context from scratch
|
|
127
123
|
|
|
128
|
-
|
|
124
|
+
### Governance & Auditability
|
|
129
125
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
126
|
+
- Configurable policies control what agents can access
|
|
127
|
+
- Every raw code request is logged with justification
|
|
128
|
+
- Blast radius analysis shows ripple effects before changes land
|
|
133
129
|
|
|
134
|
-
|
|
130
|
+
### Multi-Language
|
|
135
131
|
|
|
136
|
-
|
|
132
|
+
- 12 language adapters with a generalized pass-2 resolver for cross-file semantic resolution
|
|
137
133
|
|
|
138
|
-
|
|
134
|
+
---
|
|
139
135
|
|
|
140
|
-
|
|
136
|
+
## Feature Summary
|
|
141
137
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
138
|
+
| Category | Features |
|
|
139
|
+
| :------------------ | :-------------------------------------------------------------------------------------------------- |
|
|
140
|
+
| **Indexing** | Native Rust + tree-sitter fallback, incremental indexing, live editor-buffer overlay, file watching |
|
|
141
|
+
| **Context** | Symbol cards, skeleton IR, hot-path excerpts, gated raw windows |
|
|
142
|
+
| **Graph** | Slices with handles/leases/refresh/spillover, cluster detection, call-chain tracing |
|
|
143
|
+
| **Change Tracking** | Delta packs, blast radius analysis, PR risk scoring |
|
|
144
|
+
| **Intelligence** | Semantic search reranking, LLM-generated summaries, predictive prefetch |
|
|
145
|
+
| **Governance** | Policy engine, proof-of-need gating, audit logging |
|
|
146
|
+
| **Agent Support** | `sdl.agent.orchestrate` autopilot, `sdl.context.summary` for copy/paste context |
|
|
147
|
+
| **Tools** | 17+ MCP tools, 10 CLI commands, HTTP API with graph explorer UI |
|
|
148
|
+
| **Integrations** | VSCode extension, Claude Code/Desktop, any MCP client |
|
|
153
149
|
|
|
154
|
-
|
|
150
|
+
---
|
|
155
151
|
|
|
156
|
-
|
|
152
|
+
## Getting Started
|
|
157
153
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
154
|
+
```bash
|
|
155
|
+
# Install globally
|
|
156
|
+
npm install -g sdl-mcp
|
|
161
157
|
|
|
162
|
-
|
|
163
|
-
|
|
158
|
+
# Initialize config + index your repo
|
|
159
|
+
sdl-mcp init -y --auto-index
|
|
164
160
|
|
|
165
|
-
|
|
166
|
-
|
|
161
|
+
# Start the MCP server
|
|
162
|
+
sdl-mcp serve --stdio
|
|
167
163
|
|
|
168
|
-
|
|
169
|
-
|
|
164
|
+
Then point your MCP client at the server — the agent gains access to all SDL-MCP tools and can navigate your codebase
|
|
165
|
+
through the Iris Gate Ladder instead of bulk file reads.
|
|
170
166
|
|
|
171
|
-
|
|
172
|
-
|
|
167
|
+
[!NOTE]
|
|
168
|
+
See the full ./docs/getting-started.md and ./docs/mcp-tools-reference.md for detailed setup and usage instructions.
|
|
173
169
|
|
|
174
170
|
```
|
|
175
171
|
|
|
@@ -177,7 +173,7 @@ Response: "# What is SDL-MCP?
|
|
|
177
173
|
|
|
178
174
|
- Multi-language repository indexing with tree-sitter adapters
|
|
179
175
|
- Native Rust pass-1 indexing engine by default (`indexing.engine: "rust"`, with TypeScript fallback)
|
|
180
|
-
- Live editor-buffer indexing with draft-aware symbol/search/slice reads, save-time
|
|
176
|
+
- Live editor-buffer indexing with draft-aware symbol/search/slice reads, save-time LadybugDB patching, background reconciliation, and automatic checkpoint compaction (`liveIndex.*`)
|
|
181
177
|
- Symbol cards with signatures, deps, metrics, and versioning
|
|
182
178
|
- Graph slices with handles, leases, refresh, and spillover
|
|
183
179
|
- Graph enrichment: clusters (community detection) + processes (call-chain traces) surfaced in cards/slices/overview/blast radius
|
|
@@ -266,6 +262,6 @@ Phase A benchmark lockfile:
|
|
|
266
262
|
This project is **source-available**.
|
|
267
263
|
|
|
268
264
|
- **Free Use (Community License):** You may use, run, and modify this software for any purpose, including **internal business use**, under the terms in [`LICENSE`](./LICENSE).
|
|
269
|
-
- **Commercial Distribution / Embedding:** You must obtain a **commercial license**
|
|
265
|
+
- **Commercial Distribution / Embedding:** You must obtain a **commercial license** _before_ you **sell, license, sublicense, bundle, embed, or distribute** this software (or a modified version) **as part of a for-sale or monetized product or offering**. See [`COMMERCIAL_LICENSE.md`](./COMMERCIAL_LICENSE.md).
|
|
270
266
|
|
|
271
267
|
If you're unsure whether your use is "Commercial Distribution / Embedding", contact **gmullins.gkc@gmail.com**.
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
"maxMs": 2500,
|
|
8
8
|
"trend": "lower-is-better",
|
|
9
9
|
"allowableIncreasePercent": 30,
|
|
10
|
-
"_comment": "Raised for
|
|
10
|
+
"_comment": "Raised for LadybugDB graph backend: graph writes are inherently slower than SQLite inserts. CI runners see ~1500-1700ms per file."
|
|
11
11
|
},
|
|
12
12
|
"indexTimePerSymbol": {
|
|
13
13
|
"maxMs": 150,
|
|
14
14
|
"trend": "lower-is-better",
|
|
15
15
|
"allowableIncreasePercent": 30,
|
|
16
|
-
"_comment": "Raised for
|
|
16
|
+
"_comment": "Raised for LadybugDB graph backend: per-symbol graph operations cost more than SQLite row inserts."
|
|
17
17
|
}
|
|
18
18
|
},
|
|
19
19
|
"quality": {
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
"maxMs": 8000,
|
|
8
8
|
"trend": "lower-is-better",
|
|
9
9
|
"allowableIncreasePercent": 30,
|
|
10
|
-
"_comment": "Raised for
|
|
10
|
+
"_comment": "Raised for LadybugDB graph backend: Windows CI runners see ~4500-6000ms per file."
|
|
11
11
|
},
|
|
12
12
|
"indexTimePerSymbol": {
|
|
13
13
|
"maxMs": 500,
|
|
14
14
|
"trend": "lower-is-better",
|
|
15
15
|
"allowableIncreasePercent": 30,
|
|
16
|
-
"_comment": "Raised for
|
|
16
|
+
"_comment": "Raised for LadybugDB graph backend: Windows graph operations cost more."
|
|
17
17
|
}
|
|
18
18
|
},
|
|
19
19
|
"quality": {
|
|
@@ -3,20 +3,14 @@
|
|
|
3
3
|
"title": "SDL-MCP Configuration",
|
|
4
4
|
"description": "Configuration schema for SDL-MCP (Symbol Delta Ledger MCP Server)",
|
|
5
5
|
"type": "object",
|
|
6
|
-
"required": [
|
|
7
|
-
"repos",
|
|
8
|
-
"policy"
|
|
9
|
-
],
|
|
6
|
+
"required": ["repos", "policy"],
|
|
10
7
|
"properties": {
|
|
11
8
|
"repos": {
|
|
12
9
|
"type": "array",
|
|
13
10
|
"description": "List of repositories to index",
|
|
14
11
|
"items": {
|
|
15
12
|
"type": "object",
|
|
16
|
-
"required": [
|
|
17
|
-
"repoId",
|
|
18
|
-
"rootPath"
|
|
19
|
-
],
|
|
13
|
+
"required": ["repoId", "rootPath"],
|
|
20
14
|
"properties": {
|
|
21
15
|
"repoId": {
|
|
22
16
|
"type": "string",
|
|
@@ -111,7 +105,7 @@
|
|
|
111
105
|
},
|
|
112
106
|
"dbPath": {
|
|
113
107
|
"type": "string",
|
|
114
|
-
"description": "Deprecated legacy SQLite database path (v0.7.x). Only used by the one-time SQLite→
|
|
108
|
+
"description": "Deprecated legacy SQLite database path (v0.7.x). Only used by the one-time SQLite→LadybugDB migration script in v0.8.",
|
|
115
109
|
"minLength": 1
|
|
116
110
|
},
|
|
117
111
|
"policy": {
|
|
@@ -173,9 +167,7 @@
|
|
|
173
167
|
"description": "Custom redaction patterns",
|
|
174
168
|
"items": {
|
|
175
169
|
"type": "object",
|
|
176
|
-
"required": [
|
|
177
|
-
"pattern"
|
|
178
|
-
],
|
|
170
|
+
"required": ["pattern"],
|
|
179
171
|
"properties": {
|
|
180
172
|
"name": {
|
|
181
173
|
"type": "string",
|
|
@@ -232,10 +224,7 @@
|
|
|
232
224
|
"engine": {
|
|
233
225
|
"type": "string",
|
|
234
226
|
"description": "Pass-1 indexing engine implementation",
|
|
235
|
-
"enum": [
|
|
236
|
-
"typescript",
|
|
237
|
-
"rust"
|
|
238
|
-
],
|
|
227
|
+
"enum": ["typescript", "rust"],
|
|
239
228
|
"default": "rust"
|
|
240
229
|
},
|
|
241
230
|
"watchDebounceMs": {
|
|
@@ -376,10 +365,7 @@
|
|
|
376
365
|
"mode": {
|
|
377
366
|
"type": "string",
|
|
378
367
|
"description": "Diagnostics mode",
|
|
379
|
-
"enum": [
|
|
380
|
-
"tsLS",
|
|
381
|
-
"tsc"
|
|
382
|
-
],
|
|
368
|
+
"enum": ["tsLS", "tsc"],
|
|
383
369
|
"default": "tsLS"
|
|
384
370
|
},
|
|
385
371
|
"maxErrors": {
|
|
@@ -397,10 +383,7 @@
|
|
|
397
383
|
"scope": {
|
|
398
384
|
"type": "string",
|
|
399
385
|
"description": "Diagnostics scope",
|
|
400
|
-
"enum": [
|
|
401
|
-
"changedFiles",
|
|
402
|
-
"workspace"
|
|
403
|
-
],
|
|
386
|
+
"enum": ["changedFiles", "workspace"],
|
|
404
387
|
"default": "changedFiles"
|
|
405
388
|
}
|
|
406
389
|
},
|
|
@@ -500,11 +483,7 @@
|
|
|
500
483
|
},
|
|
501
484
|
"provider": {
|
|
502
485
|
"type": "string",
|
|
503
|
-
"enum": [
|
|
504
|
-
"api",
|
|
505
|
-
"local",
|
|
506
|
-
"mock"
|
|
507
|
-
],
|
|
486
|
+
"enum": ["api", "local", "mock"],
|
|
508
487
|
"default": "mock"
|
|
509
488
|
},
|
|
510
489
|
"model": {
|
|
@@ -650,11 +629,7 @@
|
|
|
650
629
|
"exporterType": {
|
|
651
630
|
"type": "string",
|
|
652
631
|
"description": "Exporter type for traces",
|
|
653
|
-
"enum": [
|
|
654
|
-
"console",
|
|
655
|
-
"otlp",
|
|
656
|
-
"memory"
|
|
657
|
-
],
|
|
632
|
+
"enum": ["console", "otlp", "memory"],
|
|
658
633
|
"default": "console"
|
|
659
634
|
},
|
|
660
635
|
"otlpEndpoint": {
|
|
@@ -704,14 +679,11 @@
|
|
|
704
679
|
},
|
|
705
680
|
"graphDatabase": {
|
|
706
681
|
"type": "object",
|
|
707
|
-
"description": "
|
|
682
|
+
"description": "LadybugDB graph database configuration for advanced graph queries",
|
|
708
683
|
"properties": {
|
|
709
684
|
"path": {
|
|
710
|
-
"type": [
|
|
711
|
-
|
|
712
|
-
"null"
|
|
713
|
-
],
|
|
714
|
-
"description": "Path to the KuzuDB database file",
|
|
685
|
+
"type": ["string", "null"],
|
|
686
|
+
"description": "Path to the LadybugDB database file",
|
|
715
687
|
"default": null
|
|
716
688
|
}
|
|
717
689
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Planner } from "./planner.js";
|
|
2
2
|
import { Executor } from "./executor.js";
|
|
3
3
|
import { PolicyEngine } from "../policy/engine.js";
|
|
4
|
-
import {
|
|
5
|
-
import * as
|
|
4
|
+
import { getLadybugConn } from "../db/ladybug.js";
|
|
5
|
+
import * as ladybugDb from "../db/ladybug-queries.js";
|
|
6
6
|
import { ValidationError } from "../domain/errors.js";
|
|
7
7
|
export class Orchestrator {
|
|
8
8
|
planner;
|
|
@@ -121,8 +121,8 @@ export class Orchestrator {
|
|
|
121
121
|
return { expandedContext: context, clusterExpandedCount: 0 };
|
|
122
122
|
}
|
|
123
123
|
try {
|
|
124
|
-
const conn = await
|
|
125
|
-
const clustersBySymbol = await
|
|
124
|
+
const conn = await getLadybugConn();
|
|
125
|
+
const clustersBySymbol = await ladybugDb.getClustersForSymbols(conn, symbolIds);
|
|
126
126
|
const clusterIds = new Set();
|
|
127
127
|
for (const row of clustersBySymbol.values()) {
|
|
128
128
|
clusterIds.add(row.clusterId);
|
|
@@ -130,7 +130,7 @@ export class Orchestrator {
|
|
|
130
130
|
if (clusterIds.size === 0) {
|
|
131
131
|
return { expandedContext: context, clusterExpandedCount: 0 };
|
|
132
132
|
}
|
|
133
|
-
const memberLists = await Promise.all(Array.from(clusterIds).map((clusterId) =>
|
|
133
|
+
const memberLists = await Promise.all(Array.from(clusterIds).map((clusterId) => ladybugDb.getClusterMembers(conn, clusterId)));
|
|
134
134
|
const already = new Set(context);
|
|
135
135
|
const additional = [];
|
|
136
136
|
for (const members of memberLists) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/agent/orchestrator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/agent/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@ import { dirname, resolve } from "path";
|
|
|
4
4
|
import { loadConfig } from "../../config/loadConfig.js";
|
|
5
5
|
import { activateCliConfigPath } from "../../config/configPath.js";
|
|
6
6
|
import { initGraphDb } from "../../db/initGraphDb.js";
|
|
7
|
-
import {
|
|
8
|
-
import * as
|
|
7
|
+
import { getLadybugConn } from "../../db/ladybug.js";
|
|
8
|
+
import * as ladybugDb from "../../db/ladybug-queries.js";
|
|
9
9
|
import { indexRepo } from "../../indexer/indexer.js";
|
|
10
10
|
import { buildSlice } from "../../graph/slice.js";
|
|
11
11
|
import { generateSymbolSkeleton } from "../../code/skeleton.js";
|
|
@@ -85,9 +85,9 @@ function estimateTokens(text) {
|
|
|
85
85
|
async function buildCardFromSymbol(conn, repoId, symbol, fileRelPath) {
|
|
86
86
|
if (!fileRelPath)
|
|
87
87
|
return null;
|
|
88
|
-
const latestVersion = await
|
|
89
|
-
const edgesFrom = await
|
|
90
|
-
const metrics = await
|
|
88
|
+
const latestVersion = await ladybugDb.getLatestVersion(conn, repoId);
|
|
89
|
+
const edgesFrom = await ladybugDb.getEdgesFrom(conn, symbol.symbolId);
|
|
90
|
+
const metrics = await ladybugDb.getMetrics(conn, symbol.symbolId);
|
|
91
91
|
const signature = symbol.signatureJson
|
|
92
92
|
? JSON.parse(symbol.signatureJson)
|
|
93
93
|
: undefined;
|
|
@@ -153,9 +153,9 @@ async function collectBenchmarkMetrics(conn, repoId, _repoPath, skipIndexing) {
|
|
|
153
153
|
filesIndexed = indexResult.filesProcessed;
|
|
154
154
|
}
|
|
155
155
|
const [allSymbols, edges, files] = await Promise.all([
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
ladybugDb.getSymbolsByRepo(conn, repoId),
|
|
157
|
+
ladybugDb.getEdgesByRepo(conn, repoId),
|
|
158
|
+
ladybugDb.getFilesByRepo(conn, repoId),
|
|
159
159
|
]);
|
|
160
160
|
const filesById = new Map(files.map((file) => [file.fileId, file.relPath]));
|
|
161
161
|
// Ensure benchmark symbol sampling is deterministic across platforms/runs.
|
|
@@ -220,7 +220,7 @@ async function collectBenchmarkMetrics(conn, repoId, _repoPath, skipIndexing) {
|
|
|
220
220
|
}) ??
|
|
221
221
|
seedCandidates[0] ??
|
|
222
222
|
sortedSymbols[0];
|
|
223
|
-
const latestVersion = await
|
|
223
|
+
const latestVersion = await ladybugDb.getLatestVersion(conn, repoId);
|
|
224
224
|
const versionId = latestVersion?.versionId ?? "current";
|
|
225
225
|
try {
|
|
226
226
|
const sliceStart = performance.now();
|
|
@@ -315,13 +315,13 @@ export async function benchmarkCICommand(options) {
|
|
|
315
315
|
console.warn(`[WARN] Falling back to current working directory: ${repoPath}`);
|
|
316
316
|
}
|
|
317
317
|
await initGraphDb(config, configPath);
|
|
318
|
-
const conn = await
|
|
318
|
+
const conn = await getLadybugConn();
|
|
319
319
|
const { runtimeConfigJson: repoRuntimeConfigJson, addedScopePatterns } = buildBenchmarkRuntimeRepoConfig(repoConfig);
|
|
320
320
|
if (addedScopePatterns.length > 0) {
|
|
321
321
|
console.log(`[benchmark:ci] Locked benchmark scope by adding ignore patterns: ${addedScopePatterns.join(", ")}`);
|
|
322
322
|
}
|
|
323
|
-
const persistedRepo = await
|
|
324
|
-
await
|
|
323
|
+
const persistedRepo = await ladybugDb.getRepo(conn, repoId);
|
|
324
|
+
await ladybugDb.upsertRepo(conn, {
|
|
325
325
|
repoId,
|
|
326
326
|
rootPath: repoPath,
|
|
327
327
|
configJson: repoRuntimeConfigJson,
|