sdl-mcp 0.12.2 → 0.12.3

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 (276) hide show
  1. package/README.md +10 -0
  2. package/config/sdlmcp.config.example.json +53 -8
  3. package/config/sdlmcp.config.schema.json +530 -106
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/benchmark/external-manifest.d.ts +162 -0
  6. package/dist/benchmark/external-manifest.d.ts.map +1 -0
  7. package/dist/benchmark/external-manifest.js +336 -0
  8. package/dist/benchmark/external-manifest.js.map +1 -0
  9. package/dist/benchmark/external-runner.d.ts +100 -0
  10. package/dist/benchmark/external-runner.d.ts.map +1 -0
  11. package/dist/benchmark/external-runner.js +1171 -0
  12. package/dist/benchmark/external-runner.js.map +1 -0
  13. package/dist/benchmark/output-file.d.ts +3 -0
  14. package/dist/benchmark/output-file.d.ts.map +1 -0
  15. package/dist/benchmark/output-file.js +8 -0
  16. package/dist/benchmark/output-file.js.map +1 -0
  17. package/dist/cli/argParsing.d.ts.map +1 -1
  18. package/dist/cli/argParsing.js +6 -0
  19. package/dist/cli/argParsing.js.map +1 -1
  20. package/dist/cli/commands/benchmark.d.ts.map +1 -1
  21. package/dist/cli/commands/benchmark.js +3 -2
  22. package/dist/cli/commands/benchmark.js.map +1 -1
  23. package/dist/cli/commands/index.d.ts +1 -0
  24. package/dist/cli/commands/index.d.ts.map +1 -1
  25. package/dist/cli/commands/index.js +13 -7
  26. package/dist/cli/commands/index.js.map +1 -1
  27. package/dist/cli/commands/init.d.ts +5 -1
  28. package/dist/cli/commands/init.d.ts.map +1 -1
  29. package/dist/cli/commands/init.js +73 -3
  30. package/dist/cli/commands/init.js.map +1 -1
  31. package/dist/cli/commands/serve.d.ts.map +1 -1
  32. package/dist/cli/commands/serve.js +2 -0
  33. package/dist/cli/commands/serve.js.map +1 -1
  34. package/dist/cli/index.js +2 -0
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/transport/http.d.ts +1 -35
  37. package/dist/cli/transport/http.d.ts.map +1 -1
  38. package/dist/cli/transport/http.js +151 -175
  39. package/dist/cli/transport/http.js.map +1 -1
  40. package/dist/cli/types.d.ts +1 -0
  41. package/dist/cli/types.d.ts.map +1 -1
  42. package/dist/config/constants.d.ts +30 -0
  43. package/dist/config/constants.d.ts.map +1 -1
  44. package/dist/config/constants.js +30 -0
  45. package/dist/config/constants.js.map +1 -1
  46. package/dist/config/types.d.ts +53 -1
  47. package/dist/config/types.d.ts.map +1 -1
  48. package/dist/config/types.js +62 -14
  49. package/dist/config/types.js.map +1 -1
  50. package/dist/db/ladybug-batching.d.ts +1 -0
  51. package/dist/db/ladybug-batching.d.ts.map +1 -1
  52. package/dist/db/ladybug-batching.js +1 -0
  53. package/dist/db/ladybug-batching.js.map +1 -1
  54. package/dist/db/ladybug-core.d.ts +3 -0
  55. package/dist/db/ladybug-core.d.ts.map +1 -1
  56. package/dist/db/ladybug-core.js +72 -2
  57. package/dist/db/ladybug-core.js.map +1 -1
  58. package/dist/db/ladybug-embeddings.d.ts +6 -1
  59. package/dist/db/ladybug-embeddings.d.ts.map +1 -1
  60. package/dist/db/ladybug-embeddings.js +6 -1
  61. package/dist/db/ladybug-embeddings.js.map +1 -1
  62. package/dist/db/ladybug-file-summaries.d.ts.map +1 -1
  63. package/dist/db/ladybug-file-summaries.js +23 -0
  64. package/dist/db/ladybug-file-summaries.js.map +1 -1
  65. package/dist/db/ladybug-queries.js +1 -1
  66. package/dist/db/ladybug-queries.js.map +1 -1
  67. package/dist/db/migrations/index.d.ts.map +1 -1
  68. package/dist/db/migrations/index.js +2 -0
  69. package/dist/db/migrations/index.js.map +1 -1
  70. package/dist/db/migrations/m007-copy-embeddings-to-symbol.d.ts +5 -9
  71. package/dist/db/migrations/m007-copy-embeddings-to-symbol.d.ts.map +1 -1
  72. package/dist/db/migrations/m007-copy-embeddings-to-symbol.js +24 -126
  73. package/dist/db/migrations/m007-copy-embeddings-to-symbol.js.map +1 -1
  74. package/dist/db/migrations/m021-remediate-symbol-embeddings.d.ts +5 -0
  75. package/dist/db/migrations/m021-remediate-symbol-embeddings.d.ts.map +1 -0
  76. package/dist/db/migrations/m021-remediate-symbol-embeddings.js +7 -0
  77. package/dist/db/migrations/m021-remediate-symbol-embeddings.js.map +1 -0
  78. package/dist/db/migrations/symbol-embedding-remediation.d.ts +57 -0
  79. package/dist/db/migrations/symbol-embedding-remediation.d.ts.map +1 -0
  80. package/dist/db/migrations/symbol-embedding-remediation.js +335 -0
  81. package/dist/db/migrations/symbol-embedding-remediation.js.map +1 -0
  82. package/dist/graph/layout/force-layout.d.ts +4 -0
  83. package/dist/graph/layout/force-layout.d.ts.map +1 -0
  84. package/dist/graph/layout/force-layout.js +127 -0
  85. package/dist/graph/layout/force-layout.js.map +1 -0
  86. package/dist/graph/layout/layout-service.d.ts +37 -0
  87. package/dist/graph/layout/layout-service.d.ts.map +1 -0
  88. package/dist/graph/layout/layout-service.js +172 -0
  89. package/dist/graph/layout/layout-service.js.map +1 -0
  90. package/dist/graph/layout/native-engine.d.ts +9 -0
  91. package/dist/graph/layout/native-engine.d.ts.map +1 -0
  92. package/dist/graph/layout/native-engine.js +59 -0
  93. package/dist/graph/layout/native-engine.js.map +1 -0
  94. package/dist/graph/layout/prng.d.ts +3 -0
  95. package/dist/graph/layout/prng.d.ts.map +1 -0
  96. package/dist/graph/layout/prng.js +19 -0
  97. package/dist/graph/layout/prng.js.map +1 -0
  98. package/dist/graph/layout/serializer.d.ts +3 -0
  99. package/dist/graph/layout/serializer.d.ts.map +1 -0
  100. package/dist/graph/layout/serializer.js +20 -0
  101. package/dist/graph/layout/serializer.js.map +1 -0
  102. package/dist/graph/layout/types.d.ts +30 -0
  103. package/dist/graph/layout/types.d.ts.map +1 -0
  104. package/dist/graph/layout/types.js +2 -0
  105. package/dist/graph/layout/types.js.map +1 -0
  106. package/dist/indexer/embeddings.d.ts +7 -0
  107. package/dist/indexer/embeddings.d.ts.map +1 -1
  108. package/dist/indexer/embeddings.js +44 -4
  109. package/dist/indexer/embeddings.js.map +1 -1
  110. package/dist/indexer/file-summary-embeddings.d.ts +12 -0
  111. package/dist/indexer/file-summary-embeddings.d.ts.map +1 -1
  112. package/dist/indexer/file-summary-embeddings.js +83 -21
  113. package/dist/indexer/file-summary-embeddings.js.map +1 -1
  114. package/dist/indexer/fileWalker.d.ts.map +1 -1
  115. package/dist/indexer/fileWalker.js +2 -1
  116. package/dist/indexer/fileWalker.js.map +1 -1
  117. package/dist/indexer/metrics-updater.d.ts.map +1 -1
  118. package/dist/indexer/metrics-updater.js +27 -4
  119. package/dist/indexer/metrics-updater.js.map +1 -1
  120. package/dist/indexer/watcher.d.ts.map +1 -1
  121. package/dist/indexer/watcher.js +2 -1
  122. package/dist/indexer/watcher.js.map +1 -1
  123. package/dist/mcp/context-response-projection.d.ts.map +1 -1
  124. package/dist/mcp/context-response-projection.js +49 -13
  125. package/dist/mcp/context-response-projection.js.map +1 -1
  126. package/dist/mcp/tools/search-edit/planner.d.ts.map +1 -1
  127. package/dist/mcp/tools/search-edit/planner.js +10 -3
  128. package/dist/mcp/tools/search-edit/planner.js.map +1 -1
  129. package/dist/observability/event-tap.d.ts +2 -1
  130. package/dist/observability/event-tap.d.ts.map +1 -1
  131. package/dist/observability/event-tap.js.map +1 -1
  132. package/dist/observability/service.d.ts +11 -4
  133. package/dist/observability/service.d.ts.map +1 -1
  134. package/dist/observability/service.js +83 -13
  135. package/dist/observability/service.js.map +1 -1
  136. package/dist/observability/types.d.ts +48 -2
  137. package/dist/observability/types.d.ts.map +1 -1
  138. package/dist/ui/.tsbuildinfo +1 -0
  139. package/dist/ui/vendor/fflate.js +2692 -0
  140. package/dist/ui/vendor/jsm/controls/ArcballControls.js +3543 -0
  141. package/dist/ui/vendor/jsm/controls/DragControls.js +452 -0
  142. package/dist/ui/vendor/jsm/controls/FirstPersonControls.js +488 -0
  143. package/dist/ui/vendor/jsm/controls/FlyControls.js +384 -0
  144. package/dist/ui/vendor/jsm/controls/MapControls.js +116 -0
  145. package/dist/ui/vendor/jsm/controls/OrbitControls.js +1963 -0
  146. package/dist/ui/vendor/jsm/controls/PointerLockControls.js +264 -0
  147. package/dist/ui/vendor/jsm/controls/TrackballControls.js +1001 -0
  148. package/dist/ui/vendor/jsm/controls/TransformControls.js +2003 -0
  149. package/dist/ui/vendor/jsm/loaders/3DMLoader.js +1836 -0
  150. package/dist/ui/vendor/jsm/loaders/3MFLoader.js +1621 -0
  151. package/dist/ui/vendor/jsm/loaders/AMFLoader.js +541 -0
  152. package/dist/ui/vendor/jsm/loaders/BVHLoader.js +484 -0
  153. package/dist/ui/vendor/jsm/loaders/ColladaLoader.js +153 -0
  154. package/dist/ui/vendor/jsm/loaders/DDSLoader.js +385 -0
  155. package/dist/ui/vendor/jsm/loaders/DRACOLoader.js +772 -0
  156. package/dist/ui/vendor/jsm/loaders/EXRLoader.js +3395 -0
  157. package/dist/ui/vendor/jsm/loaders/FBXLoader.js +4580 -0
  158. package/dist/ui/vendor/jsm/loaders/FontLoader.js +260 -0
  159. package/dist/ui/vendor/jsm/loaders/GCodeLoader.js +318 -0
  160. package/dist/ui/vendor/jsm/loaders/GLTFLoader.js +4860 -0
  161. package/dist/ui/vendor/jsm/loaders/HDRCubeTextureLoader.js +164 -0
  162. package/dist/ui/vendor/jsm/loaders/HDRLoader.js +463 -0
  163. package/dist/ui/vendor/jsm/loaders/IESLoader.js +379 -0
  164. package/dist/ui/vendor/jsm/loaders/KMZLoader.js +163 -0
  165. package/dist/ui/vendor/jsm/loaders/KTX2Loader.js +1276 -0
  166. package/dist/ui/vendor/jsm/loaders/KTXLoader.js +197 -0
  167. package/dist/ui/vendor/jsm/loaders/LDrawLoader.js +2510 -0
  168. package/dist/ui/vendor/jsm/loaders/LUT3dlLoader.js +205 -0
  169. package/dist/ui/vendor/jsm/loaders/LUTCubeLoader.js +190 -0
  170. package/dist/ui/vendor/jsm/loaders/LUTImageLoader.js +190 -0
  171. package/dist/ui/vendor/jsm/loaders/LWOLoader.js +1051 -0
  172. package/dist/ui/vendor/jsm/loaders/LottieLoader.js +130 -0
  173. package/dist/ui/vendor/jsm/loaders/MD2Loader.js +435 -0
  174. package/dist/ui/vendor/jsm/loaders/MDDLoader.js +147 -0
  175. package/dist/ui/vendor/jsm/loaders/MTLLoader.js +593 -0
  176. package/dist/ui/vendor/jsm/loaders/MaterialXLoader.js +1126 -0
  177. package/dist/ui/vendor/jsm/loaders/NRRDLoader.js +718 -0
  178. package/dist/ui/vendor/jsm/loaders/OBJLoader.js +955 -0
  179. package/dist/ui/vendor/jsm/loaders/PCDLoader.js +620 -0
  180. package/dist/ui/vendor/jsm/loaders/PDBLoader.js +272 -0
  181. package/dist/ui/vendor/jsm/loaders/PLYLoader.js +968 -0
  182. package/dist/ui/vendor/jsm/loaders/PVRLoader.js +270 -0
  183. package/dist/ui/vendor/jsm/loaders/RGBELoader.js +18 -0
  184. package/dist/ui/vendor/jsm/loaders/STLLoader.js +421 -0
  185. package/dist/ui/vendor/jsm/loaders/SVGLoader.js +3319 -0
  186. package/dist/ui/vendor/jsm/loaders/TDSLoader.js +1142 -0
  187. package/dist/ui/vendor/jsm/loaders/TGALoader.js +538 -0
  188. package/dist/ui/vendor/jsm/loaders/TIFFLoader.js +59 -0
  189. package/dist/ui/vendor/jsm/loaders/TTFLoader.js +261 -0
  190. package/dist/ui/vendor/jsm/loaders/USDLoader.js +303 -0
  191. package/dist/ui/vendor/jsm/loaders/USDZLoader.js +16 -0
  192. package/dist/ui/vendor/jsm/loaders/UltraHDRLoader.js +755 -0
  193. package/dist/ui/vendor/jsm/loaders/VOXLoader.js +919 -0
  194. package/dist/ui/vendor/jsm/loaders/VRMLLoader.js +3646 -0
  195. package/dist/ui/vendor/jsm/loaders/VTKLoader.js +1293 -0
  196. package/dist/ui/vendor/jsm/loaders/XYZLoader.js +143 -0
  197. package/dist/ui/vendor/jsm/loaders/collada/ColladaComposer.js +3044 -0
  198. package/dist/ui/vendor/jsm/loaders/collada/ColladaParser.js +1977 -0
  199. package/dist/ui/vendor/jsm/loaders/lwo/IFFParser.js +1217 -0
  200. package/dist/ui/vendor/jsm/loaders/lwo/LWO2Parser.js +414 -0
  201. package/dist/ui/vendor/jsm/loaders/lwo/LWO3Parser.js +373 -0
  202. package/dist/ui/vendor/jsm/loaders/usd/USDAParser.js +901 -0
  203. package/dist/ui/vendor/jsm/loaders/usd/USDCParser.js +1878 -0
  204. package/dist/ui/vendor/jsm/loaders/usd/USDComposer.js +4627 -0
  205. package/dist/ui/vendor/jsm/utils/BufferGeometryUtils.js +1501 -0
  206. package/dist/ui/vendor/jsm/utils/CameraUtils.js +82 -0
  207. package/dist/ui/vendor/jsm/utils/ColorUtils.js +76 -0
  208. package/dist/ui/vendor/jsm/utils/GeometryCompressionUtils.js +547 -0
  209. package/dist/ui/vendor/jsm/utils/GeometryUtils.js +226 -0
  210. package/dist/ui/vendor/jsm/utils/LDrawUtils.js +211 -0
  211. package/dist/ui/vendor/jsm/utils/SceneOptimizer.js +458 -0
  212. package/dist/ui/vendor/jsm/utils/SceneUtils.js +363 -0
  213. package/dist/ui/vendor/jsm/utils/ShadowMapViewer.js +244 -0
  214. package/dist/ui/vendor/jsm/utils/ShadowMapViewerGPU.js +233 -0
  215. package/dist/ui/vendor/jsm/utils/SkeletonUtils.js +496 -0
  216. package/dist/ui/vendor/jsm/utils/SortUtils.js +175 -0
  217. package/dist/ui/vendor/jsm/utils/UVsDebug.js +173 -0
  218. package/dist/ui/vendor/jsm/utils/WebGLTextureUtils.js +115 -0
  219. package/dist/ui/vendor/jsm/utils/WebGPUTextureUtils.js +81 -0
  220. package/dist/ui/vendor/jsm/utils/WorkerPool.js +167 -0
  221. package/dist/ui/vendor/three.core.min.js +6 -0
  222. package/dist/ui/vendor/three.module.min.js +6 -0
  223. package/dist/ui/viewer/ambient.js +39 -0
  224. package/dist/ui/viewer/api.js +93 -0
  225. package/dist/ui/viewer/chrome.js +36 -0
  226. package/dist/ui/viewer/edges.js +33 -0
  227. package/dist/ui/viewer/index.html +32 -0
  228. package/dist/ui/viewer/inspector.js +23 -0
  229. package/dist/ui/viewer/lenses/activity.js +24 -0
  230. package/dist/ui/viewer/lenses/community.js +5 -0
  231. package/dist/ui/viewer/lenses/edges.js +4 -0
  232. package/dist/ui/viewer/lenses/impact.js +6 -0
  233. package/dist/ui/viewer/lenses/search.js +69 -0
  234. package/dist/ui/viewer/lod.js +100 -0
  235. package/dist/ui/viewer/main.js +92 -0
  236. package/dist/ui/viewer/picking.js +45 -0
  237. package/dist/ui/viewer/scene.js +85 -0
  238. package/dist/ui/viewer/skins/default-skin.js +15 -0
  239. package/dist/ui/viewer/skins/loader.js +44 -0
  240. package/dist/ui/viewer/skins/manifest-schema.js +30 -0
  241. package/dist/ui/viewer/state.js +44 -0
  242. package/dist/ui/viewer/theme.js +23 -0
  243. package/dist/ui/viewer/universe.js +151 -0
  244. package/dist/ui/viewer/viewer.css +85 -0
  245. package/dist/util/safeRegex.d.ts.map +1 -1
  246. package/dist/util/safeRegex.js +221 -68
  247. package/dist/util/safeRegex.js.map +1 -1
  248. package/dist/viewer/legacy-graph.d.ts +40 -0
  249. package/dist/viewer/legacy-graph.d.ts.map +1 -0
  250. package/dist/viewer/legacy-graph.js +152 -0
  251. package/dist/viewer/legacy-graph.js.map +1 -0
  252. package/dist/viewer/routes.d.ts +10 -0
  253. package/dist/viewer/routes.d.ts.map +1 -0
  254. package/dist/viewer/routes.js +221 -0
  255. package/dist/viewer/routes.js.map +1 -0
  256. package/dist/viewer/service.d.ts +44 -0
  257. package/dist/viewer/service.d.ts.map +1 -0
  258. package/dist/viewer/service.js +160 -0
  259. package/dist/viewer/service.js.map +1 -0
  260. package/dist/viewer/types.d.ts +63 -0
  261. package/dist/viewer/types.d.ts.map +1 -0
  262. package/dist/viewer/types.js +2 -0
  263. package/dist/viewer/types.js.map +1 -0
  264. package/dist/viewer/viewer-config.d.ts +12 -0
  265. package/dist/viewer/viewer-config.d.ts.map +1 -0
  266. package/dist/viewer/viewer-config.js +36 -0
  267. package/dist/viewer/viewer-config.js.map +1 -0
  268. package/package.json +18 -9
  269. package/templates/SDL.md +19 -0
  270. package/templates/claude-code.json +8 -43
  271. package/dist/ui/graph.css +0 -108
  272. package/dist/ui/graph.d.ts +0 -2
  273. package/dist/ui/graph.d.ts.map +0 -1
  274. package/dist/ui/graph.html +0 -52
  275. package/dist/ui/graph.js +0 -259
  276. package/dist/ui/graph.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdl-mcp",
3
- "version": "0.12.2",
3
+ "version": "0.12.3",
4
4
  "description": "Symbol Delta Ledger MCP Server - Cards-first code context for polyglot repositories",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
@@ -32,7 +32,7 @@
32
32
  "scripts": {
33
33
  "postinstall": "node scripts/postinstall.mjs",
34
34
  "clean:dist": "node scripts/clean-dist.mjs",
35
- "build": "tsc -p tsconfig.build.json && node scripts/copy-ui-assets.mjs",
35
+ "build": "tsc -p tsconfig.build.json && tsc -p tsconfig.ui.json && node scripts/copy-ui-assets.mjs && node scripts/copy-vendor-assets.mjs",
36
36
  "build:scripts": "tsc -p tsconfig.scripts.json && node scripts/fix-imports.ts",
37
37
  "build:runtime": "npm run clean:dist && npm run build",
38
38
  "build:all": "npm run clean:dist && npm run build && npm run build:scripts",
@@ -45,7 +45,7 @@
45
45
  "test:unit": "node scripts/run-tests.mjs --group=unit",
46
46
  "test:integration": "node scripts/run-tests.mjs --group=integration",
47
47
  "test:property": "node scripts/run-tests.mjs --group=property",
48
- "test:native": "npm run build:all && npm run test:native-parity && npm run test:native-index-smoke && npm run test:parity",
48
+ "test:native": "npm run build:all && npm run test:native-parity && npm run test:layout-parity && npm run test:native-index-smoke && npm run test:parity",
49
49
  "test:benchmark": "node scripts/run-tests.mjs --group=benchmark",
50
50
  "test:root": "node scripts/run-tests.mjs --group=root",
51
51
  "test:golden-files": "node scripts/run-tests.mjs --group=golden",
@@ -68,6 +68,8 @@
68
68
  "benchmark:provider-first-fallback": "node scripts/provider-first-fallback-benchmark.ts",
69
69
  "benchmark:record-trace": "node scripts/record-trace.ts",
70
70
  "benchmark:setup-external": "node scripts/setup-external-benchmark-repos.ts",
71
+ "benchmark:external": "node scripts/external-benchmark-runner.mjs",
72
+ "benchmark:external:verify": "node scripts/verify-external-benchmark-evidence.mjs",
71
73
  "benchmark:v067": "node scripts/benchmark/v067-baseline.ts",
72
74
  "benchmark:v067:check": "node scripts/benchmark/v067-baseline.ts --check devdocs/benchmarks/v067-baseline.json",
73
75
  "benchmark:v067:save": "node scripts/benchmark/v067-baseline.ts --out devdocs/benchmarks/v067-baseline.json",
@@ -82,7 +84,8 @@
82
84
  "test:native-parity": "node tests/native/parity-test.ts",
83
85
  "test:parity": "node --experimental-strip-types --test-concurrency=1 --test tests/integration/engine-parity.test.ts",
84
86
  "check:config-sync": "node scripts/check-config-sync.ts",
85
- "check:schema-sync": "node scripts/check-schema-sync.mjs",
87
+ "check:schema-sync": "node scripts/check-schema-sync.mjs && node scripts/check-skin-template-sync.mjs",
88
+ "check:skin-template-sync": "node scripts/check-skin-template-sync.mjs",
86
89
  "check:provider-first-graph": "node --experimental-strip-types scripts/check-provider-first-graph.ts",
87
90
  "docs:language-support:check": "node --experimental-strip-types scripts/check-language-provider-support.ts",
88
91
  "docs:tools:generate": "node --experimental-strip-types scripts/generate-tool-inventory.ts",
@@ -95,7 +98,10 @@
95
98
  "test:mutation": "stryker run stryker.conf.cjs",
96
99
  "test:coverage": "node --experimental-test-coverage scripts/run-tests.mjs",
97
100
  "test:native-index-smoke": "node --experimental-strip-types scripts/native-index-smoke.ts",
98
- "typecheck:scripts": "tsc -p tsconfig.scripts.json --noEmit"
101
+ "typecheck:scripts": "tsc -p tsconfig.scripts.json --noEmit",
102
+ "build:ui": "tsc -p tsconfig.ui.json",
103
+ "typecheck:ui": "tsc -p tsconfig.ui.json --noEmit",
104
+ "test:layout-parity": "node tests/native/layout-parity-test.ts"
99
105
  },
100
106
  "keywords": [
101
107
  "mcp",
@@ -117,6 +123,8 @@
117
123
  "@opentelemetry/api": "^1.9.0",
118
124
  "@opentelemetry/sdk-trace-base": "^2.8.0",
119
125
  "@opentelemetry/sdk-trace-node": "^2.8.0",
126
+ "fflate": "0.8.3",
127
+ "three": "0.185.1",
120
128
  "tree-sitter": "npm:@keqingmoe/tree-sitter@0.26.2",
121
129
  "tree-sitter-bash": "npm:sdl-mcp-tree-sitter-bash@^1.0.1",
122
130
  "tree-sitter-c": "npm:sdl-mcp-tree-sitter-c@^1.0.1",
@@ -147,10 +155,10 @@
147
155
  "fb-watchman": "^2.0.2",
148
156
  "kuzu": "npm:@ladybugdb/core@0.16.1",
149
157
  "onnxruntime-node": "^1.24.3",
150
- "sdl-mcp-native": "0.12.2",
151
- "sdl-mcp-watchman": "0.12.2",
152
- "sdl-mcp-watchman-linux-x64": "0.12.2",
153
- "sdl-mcp-watchman-win32-x64": "0.12.2",
158
+ "sdl-mcp-native": "0.12.3",
159
+ "sdl-mcp-watchman": "0.12.3",
160
+ "sdl-mcp-watchman-linux-x64": "0.12.3",
161
+ "sdl-mcp-watchman-win32-x64": "0.12.3",
154
162
  "tokenizers": "npm:@anush008/tokenizers@^0.6.0"
155
163
  },
156
164
  "devDependencies": {
@@ -160,6 +168,7 @@
160
168
  "@stryker-mutator/core": "^9.6.0",
161
169
  "@types/fb-watchman": "^2.0.6",
162
170
  "@types/node": "^24.0.0",
171
+ "@types/three": "0.185.0",
163
172
  "eslint": "^10.1.0",
164
173
  "eslint-plugin-import-x": "^4.16.2",
165
174
  "fast-check": "^4.6.0",
package/templates/SDL.md CHANGED
@@ -187,6 +187,8 @@ Use the cheapest rung that answers the task. Static price tags in `sdl.manual` a
187
187
  - Answer first: for explain/debug, call `sdl.context` with `options.answerFirst: true`; expand with `symbol.getCard` or a normal context call on the returned evidence IDs only if needed.
188
188
  - Targeted files: if `file.read` returns the large-read hint, retry with `search` plus `searchContext`, `offset` plus `limit`, `jsonPath`, `maxTokens`, or `maxBytes`.
189
189
 
190
+ For document-heavy planning, locate the relevant README, ADR, specification, or plan and use targeted `sdl.file` `op: "read"` with `search`, bounded ranges, or `jsonPath`. If broad `sdl.context` returns irrelevant symbol evidence, switch retrieval surfaces instead of widening symbol budgets.
191
+
190
192
  ---
191
193
 
192
194
  ## 3. File And Edit Rules
@@ -208,6 +210,23 @@ Use SDL file and edit tools instead of native read/write paths.
208
210
 
209
211
  ### Non-Indexed Reads
210
212
 
213
+ Use this direct targeted document read when repository prose drives the task:
214
+
215
+ ```json
216
+ {
217
+ "op": "read",
218
+ "repoId": "sdl-mcp",
219
+ "filePath": "docs/feature-deep-dives/agent-context.md",
220
+ "search": "## When To Use It",
221
+ "searchContext": 8,
222
+ "limit": 4
223
+ }
224
+ ```
225
+
226
+ `searchContext` and `limit` bound the result.
227
+
228
+ Use a multi-file workflow when one task needs several non-indexed files:
229
+
211
230
  ```json
212
231
  {
213
232
  "repoId": "<repoId>",
@@ -1,54 +1,19 @@
1
1
  {
2
2
  "_comment": "Claude Code MCP Configuration Template for SDL-MCP",
3
3
  "_documentation": {
4
- "purpose": "Configure SDL-MCP as an MCP server for Claude Code",
5
- "placement": "Use `claude mcp add-json` or merge into ~/.claude.json under `mcpServers`",
6
- "windowsNotes": {
7
- "paths": "Use forward slashes (/) or escaped backslashes (\\\\)",
8
- "npx": "npx works cross-platform. For global install, use 'node' with full path",
9
- "environment": "SDL_CONFIG_PATH or SDL_CONFIG must be set to point to your sdlmcp.config.json"
4
+ "purpose": "Configure SDL-MCP as a stdio MCP server for Claude Code",
5
+ "destinations": {
6
+ "project": "Save the full mcpServers document as .mcp.json in the repository root.",
7
+ "cli": "For local or user scope, pass only mcpServers.sdl-mcp to claude mcp add-json; use --scope local or --scope user."
10
8
  },
11
- "quoting": {
12
- "powerShell": "Single quotes work for paths, double quotes for variable expansion",
13
- "cmd": "Use double quotes for all paths with spaces"
14
- },
15
- "workspaceFolder": {
16
- "description": "Replaced by Claude Code with the current workspace root",
17
- "windows": "Resolves to forward-slash path on all platforms"
18
- }
9
+ "windows": "Use the emitted PowerShell snippet. cmd.exe users should use the project .mcp.json form or run the PowerShell snippet."
19
10
  },
20
11
  "mcpServers": {
21
12
  "sdl-mcp": {
13
+ "type": "stdio",
22
14
  "command": "npx",
23
- "args": ["--yes", "sdl-mcp@latest", "serve", "--stdio"],
24
- "env": {
25
- "SDL_CONFIG": "${workspaceFolder}/sdlmcp.config.json",
26
- "_comment_env": "Alternative: Set SDL_CONFIG_PATH if you prefer environment variable name"
27
- }
28
- }
29
- },
30
- "_alternative_global_install": {
31
- "description": "If you installed SDL-MCP globally with 'npm install -g sdl-mcp':",
32
- "mcpServers": {
33
- "sdl-mcp": {
34
- "command": "sdl-mcp",
35
- "args": ["serve", "--stdio"],
36
- "env": {
37
- "SDL_CONFIG": "${workspaceFolder}/sdlmcp.config.json"
38
- }
39
- }
40
- }
41
- },
42
- "_alternative_windows_direct_node": {
43
- "description": "Windows alternative using direct Node invocation (if npx is unavailable):",
44
- "mcpServers": {
45
- "sdl-mcp": {
46
- "command": "node",
47
- "args": ["F:/path/to/sdl-mcp/dist/main.js", "serve", "--stdio"],
48
- "env": {
49
- "SDL_CONFIG": "${workspaceFolder}/sdlmcp.config.json"
50
- }
51
- }
15
+ "args": ["-y", "sdl-mcp"],
16
+ "env": {}
52
17
  }
53
18
  }
54
19
  }
package/dist/ui/graph.css DELETED
@@ -1,108 +0,0 @@
1
- :root {
2
- --bg: #f5f7fb;
3
- --panel: #ffffff;
4
- --text: #1f2937;
5
- --muted: #6b7280;
6
- --accent: #0d9488;
7
- --edge-call: #fb923c;
8
- --edge-import: #60a5fa;
9
- --edge-config: #c084fc;
10
- }
11
-
12
- * {
13
- box-sizing: border-box;
14
- }
15
-
16
- body {
17
- margin: 0;
18
- font-family: "IBM Plex Sans", "Segoe UI", sans-serif;
19
- color: var(--text);
20
- background: radial-gradient(circle at top right, #dbeafe, transparent 45%),
21
- radial-gradient(circle at top left, #ccfbf1, transparent 40%),
22
- var(--bg);
23
- }
24
-
25
- header {
26
- padding: 14px 16px;
27
- border-bottom: 1px solid #d1d5db;
28
- background: rgba(255, 255, 255, 0.9);
29
- backdrop-filter: blur(4px);
30
- }
31
-
32
- h1 {
33
- margin: 0 0 8px 0;
34
- font-size: 20px;
35
- }
36
-
37
- .controls {
38
- display: flex;
39
- gap: 8px;
40
- flex-wrap: wrap;
41
- margin-bottom: 8px;
42
- }
43
-
44
- label {
45
- display: flex;
46
- flex-direction: column;
47
- font-size: 12px;
48
- color: var(--muted);
49
- }
50
-
51
- input,
52
- button {
53
- font: inherit;
54
- border: 1px solid #d1d5db;
55
- border-radius: 8px;
56
- padding: 6px 10px;
57
- background: #fff;
58
- }
59
-
60
- button {
61
- cursor: pointer;
62
- color: #0f172a;
63
- }
64
-
65
- button:hover {
66
- border-color: var(--accent);
67
- }
68
-
69
- main {
70
- display: grid;
71
- grid-template-columns: minmax(0, 1fr) 320px;
72
- gap: 10px;
73
- padding: 10px;
74
- }
75
-
76
- #graph {
77
- width: 100%;
78
- min-height: 70vh;
79
- border-radius: 12px;
80
- background: linear-gradient(180deg, #ffffff, #f8fafc);
81
- border: 1px solid #d1d5db;
82
- }
83
-
84
- #details {
85
- background: var(--panel);
86
- border-radius: 12px;
87
- border: 1px solid #d1d5db;
88
- padding: 12px;
89
- }
90
-
91
- #details h2 {
92
- margin: 0 0 8px 0;
93
- font-size: 16px;
94
- }
95
-
96
- #nodeDetails {
97
- margin: 0;
98
- max-height: 70vh;
99
- overflow: auto;
100
- white-space: pre-wrap;
101
- font-size: 12px;
102
- }
103
-
104
- @media (max-width: 980px) {
105
- main {
106
- grid-template-columns: 1fr;
107
- }
108
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=graph.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/ui/graph.js"],"names":[],"mappings":""}
@@ -1,52 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>SDL Graph Explorer</title>
7
- <link rel="stylesheet" href="/ui/graph.css" />
8
- </head>
9
- <body>
10
- <header>
11
- <h1>SDL Graph Explorer</h1>
12
- <div class="controls">
13
- <label>
14
- Repo
15
- <input id="repoId" value="sdl-mcp" />
16
- </label>
17
- <label>
18
- Symbol
19
- <input id="symbolId" placeholder="optional symbol id" />
20
- </label>
21
- <label>
22
- Max Nodes
23
- <input id="maxNodes" type="number" min="20" max="500" value="200" />
24
- </label>
25
- <button id="loadBtn">Load</button>
26
- <button id="exportSvgBtn">Export SVG</button>
27
- <button id="exportPngBtn">Export PNG</button>
28
- </div>
29
- <div class="controls">
30
- <label>
31
- From Version
32
- <input id="fromVersion" placeholder="v123" />
33
- </label>
34
- <label>
35
- To Version
36
- <input id="toVersion" placeholder="v124" />
37
- </label>
38
- <button id="blastBtn">Blast Radius</button>
39
- <input id="filter" placeholder="Filter nodes" />
40
- </div>
41
- </header>
42
- <main>
43
- <svg id="graph" width="1200" height="760" aria-label="Graph visualization"></svg>
44
- <aside id="details">
45
- <h2>Node</h2>
46
- <pre id="nodeDetails">Select a node</pre>
47
- </aside>
48
- </main>
49
- <script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
50
- <script type="module" src="/ui/graph.js"></script>
51
- </body>
52
- </html>
package/dist/ui/graph.js DELETED
@@ -1,259 +0,0 @@
1
- const svg = d3.select("#graph");
2
- const rootG = svg.append("g");
3
- const linksG = rootG.append("g");
4
- const nodesG = rootG.append("g");
5
-
6
- const state = {
7
- nodes: [],
8
- links: [],
9
- simulation: null,
10
- maxNodes: 200,
11
- };
12
-
13
- const colorByKind = {
14
- function: "#0d9488",
15
- method: "#0284c7",
16
- class: "#2563eb",
17
- interface: "#0891b2",
18
- type: "#16a34a",
19
- module: "#64748b",
20
- constructor: "#f59e0b",
21
- variable: "#7c3aed",
22
- };
23
-
24
- const edgeColor = {
25
- call: "#fb923c",
26
- import: "#60a5fa",
27
- config: "#c084fc",
28
- };
29
-
30
- function setNodeDetails(node) {
31
- const details = document.getElementById("nodeDetails");
32
- details.textContent = node
33
- ? JSON.stringify(node, null, 2)
34
- : "Select a node";
35
- }
36
-
37
- function dedupeGraph(nodes, links) {
38
- const maxNodes = Number(document.getElementById("maxNodes").value || "200");
39
- const nodeMap = new Map();
40
- for (const node of nodes) {
41
- if (!node || !node.id) continue;
42
- if (!nodeMap.has(node.id)) {
43
- nodeMap.set(node.id, node);
44
- }
45
- if (nodeMap.size >= maxNodes) break;
46
- }
47
- const nodeIds = new Set(nodeMap.keys());
48
- const edgeMap = new Map();
49
- for (const link of links) {
50
- const key = `${link.source}->${link.target}:${link.type}`;
51
- if (edgeMap.has(key)) continue;
52
- if (!nodeIds.has(link.source) || !nodeIds.has(link.target)) continue;
53
- edgeMap.set(key, link);
54
- }
55
- return {
56
- nodes: Array.from(nodeMap.values()),
57
- links: Array.from(edgeMap.values()),
58
- };
59
- }
60
-
61
- function renderGraph() {
62
- const graph = dedupeGraph(state.nodes, state.links);
63
- state.nodes = graph.nodes;
64
- state.links = graph.links;
65
-
66
- if (state.simulation) {
67
- state.simulation.stop();
68
- }
69
-
70
- linksG.selectAll("*").remove();
71
- nodesG.selectAll("*").remove();
72
-
73
- const link = linksG
74
- .selectAll("line")
75
- .data(state.links, (d) => `${d.source}:${d.target}:${d.type}`)
76
- .join("line")
77
- .attr("stroke", (d) => edgeColor[d.type] || "#94a3b8")
78
- .attr("stroke-opacity", 0.65)
79
- .attr("stroke-width", (d) => Math.max(1, Math.min(4, d.weight || 1)));
80
-
81
- const node = nodesG
82
- .selectAll("circle")
83
- .data(state.nodes, (d) => d.id)
84
- .join("circle")
85
- .attr("r", (d) => Math.max(5, Math.min(20, d.size || 8)))
86
- .attr("fill", (d) => colorByKind[d.kind] || "#64748b")
87
- .attr("stroke", "#ffffff")
88
- .attr("stroke-width", 1.3)
89
- .on("click", async (_, d) => {
90
- setNodeDetails(d);
91
- await expandNode(d.id);
92
- });
93
-
94
- node.append("title").text((d) => `${d.label} (${d.kind})`);
95
-
96
- const label = nodesG
97
- .selectAll("text")
98
- .data(state.nodes, (d) => `label:${d.id}`)
99
- .join("text")
100
- .text((d) => d.label)
101
- .attr("font-size", 10)
102
- .attr("fill", "#334155");
103
-
104
- const skipAnimation = state.nodes.length > 100;
105
- state.simulation = d3
106
- .forceSimulation(state.nodes)
107
- .force(
108
- "link",
109
- d3
110
- .forceLink(state.links)
111
- .id((d) => d.id)
112
- .distance(skipAnimation ? 65 : 95),
113
- )
114
- .force("charge", d3.forceManyBody().strength(skipAnimation ? -80 : -140))
115
- .force(
116
- "center",
117
- d3.forceCenter(
118
- Number(svg.attr("width")) / 2,
119
- Number(svg.attr("height")) / 2,
120
- ),
121
- )
122
- .on("tick", () => {
123
- link
124
- .attr("x1", (d) => d.source.x)
125
- .attr("y1", (d) => d.source.y)
126
- .attr("x2", (d) => d.target.x)
127
- .attr("y2", (d) => d.target.y);
128
- node.attr("cx", (d) => d.x).attr("cy", (d) => d.y);
129
- label.attr("x", (d) => d.x + 8).attr("y", (d) => d.y + 3);
130
- });
131
-
132
- if (skipAnimation) {
133
- for (let i = 0; i < 80; i += 1) {
134
- state.simulation.tick();
135
- }
136
- state.simulation.stop();
137
- }
138
- }
139
-
140
- async function requestJson(url) {
141
- const response = await fetch(url);
142
- if (!response.ok) {
143
- throw new Error(await response.text());
144
- }
145
- return response.json();
146
- }
147
-
148
- async function loadGraph() {
149
- const repoId = document.getElementById("repoId").value.trim();
150
- const symbolId = document.getElementById("symbolId").value.trim();
151
- const maxNodes = document.getElementById("maxNodes").value.trim() || "200";
152
- state.maxNodes = Number(maxNodes);
153
-
154
- const endpoint = symbolId
155
- ? `/api/graph/${encodeURIComponent(repoId)}/symbol/${encodeURIComponent(symbolId)}/neighborhood?maxNodes=${encodeURIComponent(maxNodes)}`
156
- : `/api/graph/${encodeURIComponent(repoId)}/slice/preview?maxNodes=${encodeURIComponent(maxNodes)}`;
157
-
158
- const data = await requestJson(endpoint);
159
- state.nodes = data.nodes || [];
160
- state.links = data.links || [];
161
- renderGraph();
162
- }
163
-
164
- async function loadBlastRadius() {
165
- const repoId = document.getElementById("repoId").value.trim();
166
- const fromVersion = document.getElementById("fromVersion").value.trim();
167
- const toVersion = document.getElementById("toVersion").value.trim();
168
- const maxNodes = document.getElementById("maxNodes").value.trim() || "200";
169
- if (!fromVersion || !toVersion) return;
170
- const data = await requestJson(
171
- `/api/graph/${encodeURIComponent(repoId)}/blast-radius/${encodeURIComponent(fromVersion)}/${encodeURIComponent(toVersion)}?maxNodes=${encodeURIComponent(maxNodes)}`,
172
- );
173
- state.nodes = (data.nodes || []).map((node) => ({
174
- ...node,
175
- blast: true,
176
- }));
177
- state.links = data.links || [];
178
- renderGraph();
179
- }
180
-
181
- async function expandNode(symbolId) {
182
- const repoId = document.getElementById("repoId").value.trim();
183
- const maxNodes = document.getElementById("maxNodes").value.trim() || "200";
184
- const data = await requestJson(
185
- `/api/graph/${encodeURIComponent(repoId)}/symbol/${encodeURIComponent(symbolId)}/neighborhood?maxNodes=${encodeURIComponent(maxNodes)}`,
186
- );
187
- state.nodes = state.nodes.concat(data.nodes || []);
188
- state.links = state.links.concat(data.links || []);
189
- renderGraph();
190
- }
191
-
192
- function applyFilter() {
193
- const query = document.getElementById("filter").value.trim().toLowerCase();
194
- nodesG.selectAll("circle").attr("opacity", (d) => {
195
- if (!query) return 1;
196
- return d.label.toLowerCase().includes(query) ? 1 : 0.2;
197
- });
198
- nodesG.selectAll("text").attr("opacity", (d) => {
199
- if (!query) return 1;
200
- return d.label.toLowerCase().includes(query) ? 1 : 0.15;
201
- });
202
- }
203
-
204
- function exportSvg() {
205
- const serializer = new XMLSerializer();
206
- const raw = serializer.serializeToString(svg.node());
207
- const blob = new Blob([raw], { type: "image/svg+xml;charset=utf-8" });
208
- const url = URL.createObjectURL(blob);
209
- const a = document.createElement("a");
210
- a.href = url;
211
- a.download = "sdl-graph.svg";
212
- a.click();
213
- URL.revokeObjectURL(url);
214
- }
215
-
216
- function exportPng() {
217
- const serializer = new XMLSerializer();
218
- const raw = serializer.serializeToString(svg.node());
219
- const encoded = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(raw)}`;
220
- const image = new Image();
221
- image.onload = () => {
222
- const canvas = document.createElement("canvas");
223
- canvas.width = Number(svg.attr("width"));
224
- canvas.height = Number(svg.attr("height"));
225
- const ctx = canvas.getContext("2d");
226
- ctx.fillStyle = "#ffffff";
227
- ctx.fillRect(0, 0, canvas.width, canvas.height);
228
- ctx.drawImage(image, 0, 0);
229
- const a = document.createElement("a");
230
- a.href = canvas.toDataURL("image/png");
231
- a.download = "sdl-graph.png";
232
- a.click();
233
- };
234
- image.src = encoded;
235
- }
236
-
237
- svg.call(
238
- d3.zoom().scaleExtent([0.2, 4]).on("zoom", (event) => {
239
- rootG.attr("transform", event.transform);
240
- }),
241
- );
242
-
243
- document.getElementById("loadBtn").addEventListener("click", () => {
244
- loadGraph().catch((error) => {
245
- setNodeDetails({ error: String(error) });
246
- });
247
- });
248
- document.getElementById("blastBtn").addEventListener("click", () => {
249
- loadBlastRadius().catch((error) => {
250
- setNodeDetails({ error: String(error) });
251
- });
252
- });
253
- document.getElementById("filter").addEventListener("input", applyFilter);
254
- document.getElementById("exportSvgBtn").addEventListener("click", exportSvg);
255
- document.getElementById("exportPngBtn").addEventListener("click", exportPng);
256
-
257
- loadGraph().catch((error) => {
258
- setNodeDetails({ error: String(error) });
259
- });
@@ -1 +0,0 @@
1
- {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/ui/graph.js"],"names":[],"mappings":"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"}