sdl-mcp 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +132 -0
- package/config/benchmark.ci.config.json +86 -0
- package/config/benchmark.ci.windows.config.json +86 -0
- package/config/benchmark.config.example.json +86 -0
- package/config/benchmark.config.json +86 -0
- package/config/sdlmcp.config.example.json +139 -0
- package/config/sdlmcp.config.json +48 -0
- package/config/sdlmcp.config.schema.json +381 -0
- package/dist/agent/evidence.d.ts +18 -0
- package/dist/agent/evidence.d.ts.map +1 -0
- package/dist/agent/evidence.js +107 -0
- package/dist/agent/evidence.js.map +1 -0
- package/dist/agent/executor.d.ts +28 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +261 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/agent/index.d.ts +6 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +6 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +14 -0
- package/dist/agent/orchestrator.d.ts.map +1 -0
- package/dist/agent/orchestrator.js +108 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/planner.d.ts +21 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js +153 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/types.d.ts +86 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/benchmark/index.d.ts +4 -0
- package/dist/benchmark/index.d.ts.map +1 -0
- package/dist/benchmark/index.js +4 -0
- package/dist/benchmark/index.js.map +1 -0
- package/dist/benchmark/regression.d.ts +40 -0
- package/dist/benchmark/regression.d.ts.map +1 -0
- package/dist/benchmark/regression.js +199 -0
- package/dist/benchmark/regression.js.map +1 -0
- package/dist/benchmark/smoothing.d.ts +40 -0
- package/dist/benchmark/smoothing.d.ts.map +1 -0
- package/dist/benchmark/smoothing.js +121 -0
- package/dist/benchmark/smoothing.js.map +1 -0
- package/dist/benchmark/threshold.d.ts +64 -0
- package/dist/benchmark/threshold.d.ts.map +1 -0
- package/dist/benchmark/threshold.js +173 -0
- package/dist/benchmark/threshold.js.map +1 -0
- package/dist/cli/argParsing.d.ts +34 -0
- package/dist/cli/argParsing.d.ts.map +1 -0
- package/dist/cli/argParsing.js +329 -0
- package/dist/cli/argParsing.js.map +1 -0
- package/dist/cli/commands/benchmark.d.ts +16 -0
- package/dist/cli/commands/benchmark.d.ts.map +1 -0
- package/dist/cli/commands/benchmark.js +412 -0
- package/dist/cli/commands/benchmark.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +218 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export.d.ts +12 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +70 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/import.d.ts +10 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +40 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/index.d.ts +3 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +89 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +221 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/pull.d.ts +11 -0
- package/dist/cli/commands/pull.d.ts.map +1 -0
- package/dist/cli/commands/pull.js +47 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +72 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/version.d.ts +3 -0
- package/dist/cli/commands/version.d.ts.map +1 -0
- package/dist/cli/commands/version.js +24 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +213 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/logging.d.ts +10 -0
- package/dist/cli/logging.d.ts.map +1 -0
- package/dist/cli/logging.js +48 -0
- package/dist/cli/logging.js.map +1 -0
- package/dist/cli/transport/http.d.ts +3 -0
- package/dist/cli/transport/http.d.ts.map +1 -0
- package/dist/cli/transport/http.js +106 -0
- package/dist/cli/transport/http.js.map +1 -0
- package/dist/cli/transport/stdio.d.ts +3 -0
- package/dist/cli/transport/stdio.d.ts.map +1 -0
- package/dist/cli/transport/stdio.js +6 -0
- package/dist/cli/transport/stdio.js.map +1 -0
- package/dist/cli/types.d.ts +41 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/code/gate.d.ts +11 -0
- package/dist/code/gate.d.ts.map +1 -0
- package/dist/code/gate.js +134 -0
- package/dist/code/gate.js.map +1 -0
- package/dist/code/hotpath.d.ts +17 -0
- package/dist/code/hotpath.d.ts.map +1 -0
- package/dist/code/hotpath.js +200 -0
- package/dist/code/hotpath.js.map +1 -0
- package/dist/code/redact.d.ts +19 -0
- package/dist/code/redact.d.ts.map +1 -0
- package/dist/code/redact.js +92 -0
- package/dist/code/redact.js.map +1 -0
- package/dist/code/skeleton.d.ts +32 -0
- package/dist/code/skeleton.d.ts.map +1 -0
- package/dist/code/skeleton.js +610 -0
- package/dist/code/skeleton.js.map +1 -0
- package/dist/code/windows.d.ts +18 -0
- package/dist/code/windows.d.ts.map +1 -0
- package/dist/code/windows.js +236 -0
- package/dist/code/windows.js.map +1 -0
- package/dist/config/constants.d.ts +340 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +379 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/loadConfig.d.ts +3 -0
- package/dist/config/loadConfig.d.ts.map +1 -0
- package/dist/config/loadConfig.js +71 -0
- package/dist/config/loadConfig.js.map +1 -0
- package/dist/config/types.d.ts +509 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +139 -0
- package/dist/config/types.js.map +1 -0
- package/dist/db/db.d.ts +4 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +47 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/migrations.d.ts +15 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +81 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/queries.d.ts +440 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +1054 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.d.ts +132 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +2 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/delta/blastRadius.d.ts +24 -0
- package/dist/delta/blastRadius.d.ts.map +1 -0
- package/dist/delta/blastRadius.js +239 -0
- package/dist/delta/blastRadius.js.map +1 -0
- package/dist/delta/diff.d.ts +16 -0
- package/dist/delta/diff.d.ts.map +1 -0
- package/dist/delta/diff.js +236 -0
- package/dist/delta/diff.js.map +1 -0
- package/dist/delta/versioning.d.ts +11 -0
- package/dist/delta/versioning.d.ts.map +1 -0
- package/dist/delta/versioning.js +68 -0
- package/dist/delta/versioning.js.map +1 -0
- package/dist/graph/buildGraph.d.ts +12 -0
- package/dist/graph/buildGraph.d.ts.map +1 -0
- package/dist/graph/buildGraph.js +81 -0
- package/dist/graph/buildGraph.js.map +1 -0
- package/dist/graph/cache.d.ts +111 -0
- package/dist/graph/cache.d.ts.map +1 -0
- package/dist/graph/cache.js +237 -0
- package/dist/graph/cache.js.map +1 -0
- package/dist/graph/metrics.d.ts +12 -0
- package/dist/graph/metrics.d.ts.map +1 -0
- package/dist/graph/metrics.js +253 -0
- package/dist/graph/metrics.js.map +1 -0
- package/dist/graph/minHeap.d.ts +91 -0
- package/dist/graph/minHeap.d.ts.map +1 -0
- package/dist/graph/minHeap.js +159 -0
- package/dist/graph/minHeap.js.map +1 -0
- package/dist/graph/overview.d.ts +22 -0
- package/dist/graph/overview.d.ts.map +1 -0
- package/dist/graph/overview.js +379 -0
- package/dist/graph/overview.js.map +1 -0
- package/dist/graph/score.d.ts +27 -0
- package/dist/graph/score.d.ts.map +1 -0
- package/dist/graph/score.js +214 -0
- package/dist/graph/score.js.map +1 -0
- package/dist/graph/slice.d.ts +51 -0
- package/dist/graph/slice.d.ts.map +1 -0
- package/dist/graph/slice.js +1047 -0
- package/dist/graph/slice.js.map +1 -0
- package/dist/graph/sliceCache.d.ts +33 -0
- package/dist/graph/sliceCache.d.ts.map +1 -0
- package/dist/graph/sliceCache.js +140 -0
- package/dist/graph/sliceCache.js.map +1 -0
- package/dist/indexer/adapter/BaseAdapter.d.ts +29 -0
- package/dist/indexer/adapter/BaseAdapter.d.ts.map +1 -0
- package/dist/indexer/adapter/BaseAdapter.js +97 -0
- package/dist/indexer/adapter/BaseAdapter.js.map +1 -0
- package/dist/indexer/adapter/LanguageAdapter.d.ts +20 -0
- package/dist/indexer/adapter/LanguageAdapter.d.ts.map +1 -0
- package/dist/indexer/adapter/LanguageAdapter.js +2 -0
- package/dist/indexer/adapter/LanguageAdapter.js.map +1 -0
- package/dist/indexer/adapter/adapters.d.ts +57 -0
- package/dist/indexer/adapter/adapters.d.ts.map +1 -0
- package/dist/indexer/adapter/adapters.js +129 -0
- package/dist/indexer/adapter/adapters.js.map +1 -0
- package/dist/indexer/adapter/c.d.ts +18 -0
- package/dist/indexer/adapter/c.d.ts.map +1 -0
- package/dist/indexer/adapter/c.js +443 -0
- package/dist/indexer/adapter/c.js.map +1 -0
- package/dist/indexer/adapter/cpp.d.ts +18 -0
- package/dist/indexer/adapter/cpp.d.ts.map +1 -0
- package/dist/indexer/adapter/cpp.js +493 -0
- package/dist/indexer/adapter/cpp.js.map +1 -0
- package/dist/indexer/adapter/csharp.d.ts +48 -0
- package/dist/indexer/adapter/csharp.d.ts.map +1 -0
- package/dist/indexer/adapter/csharp.js +638 -0
- package/dist/indexer/adapter/csharp.js.map +1 -0
- package/dist/indexer/adapter/go.d.ts +14 -0
- package/dist/indexer/adapter/go.d.ts.map +1 -0
- package/dist/indexer/adapter/go.js +400 -0
- package/dist/indexer/adapter/go.js.map +1 -0
- package/dist/indexer/adapter/index.d.ts +14 -0
- package/dist/indexer/adapter/index.d.ts.map +1 -0
- package/dist/indexer/adapter/index.js +13 -0
- package/dist/indexer/adapter/index.js.map +1 -0
- package/dist/indexer/adapter/java.d.ts +14 -0
- package/dist/indexer/adapter/java.d.ts.map +1 -0
- package/dist/indexer/adapter/java.js +391 -0
- package/dist/indexer/adapter/java.js.map +1 -0
- package/dist/indexer/adapter/kotlin.d.ts +18 -0
- package/dist/indexer/adapter/kotlin.d.ts.map +1 -0
- package/dist/indexer/adapter/kotlin.js +599 -0
- package/dist/indexer/adapter/kotlin.js.map +1 -0
- package/dist/indexer/adapter/php.d.ts +18 -0
- package/dist/indexer/adapter/php.d.ts.map +1 -0
- package/dist/indexer/adapter/php.js +574 -0
- package/dist/indexer/adapter/php.js.map +1 -0
- package/dist/indexer/adapter/plugin/index.d.ts +3 -0
- package/dist/indexer/adapter/plugin/index.d.ts.map +1 -0
- package/dist/indexer/adapter/plugin/index.js +3 -0
- package/dist/indexer/adapter/plugin/index.js.map +1 -0
- package/dist/indexer/adapter/plugin/loader.d.ts +13 -0
- package/dist/indexer/adapter/plugin/loader.d.ts.map +1 -0
- package/dist/indexer/adapter/plugin/loader.js +154 -0
- package/dist/indexer/adapter/plugin/loader.js.map +1 -0
- package/dist/indexer/adapter/plugin/types.d.ts +76 -0
- package/dist/indexer/adapter/plugin/types.d.ts.map +1 -0
- package/dist/indexer/adapter/plugin/types.js +47 -0
- package/dist/indexer/adapter/plugin/types.js.map +1 -0
- package/dist/indexer/adapter/python.d.ts +14 -0
- package/dist/indexer/adapter/python.d.ts.map +1 -0
- package/dist/indexer/adapter/python.js +511 -0
- package/dist/indexer/adapter/python.js.map +1 -0
- package/dist/indexer/adapter/registry.d.ts +17 -0
- package/dist/indexer/adapter/registry.d.ts.map +1 -0
- package/dist/indexer/adapter/registry.js +134 -0
- package/dist/indexer/adapter/registry.js.map +1 -0
- package/dist/indexer/adapter/rust.d.ts +18 -0
- package/dist/indexer/adapter/rust.d.ts.map +1 -0
- package/dist/indexer/adapter/rust.js +709 -0
- package/dist/indexer/adapter/rust.js.map +1 -0
- package/dist/indexer/adapter/shell.d.ts +18 -0
- package/dist/indexer/adapter/shell.d.ts.map +1 -0
- package/dist/indexer/adapter/shell.js +345 -0
- package/dist/indexer/adapter/shell.js.map +1 -0
- package/dist/indexer/adapter/typescript.d.ts +14 -0
- package/dist/indexer/adapter/typescript.d.ts.map +1 -0
- package/dist/indexer/adapter/typescript.js +31 -0
- package/dist/indexer/adapter/typescript.js.map +1 -0
- package/dist/indexer/configEdges.d.ts +30 -0
- package/dist/indexer/configEdges.d.ts.map +1 -0
- package/dist/indexer/configEdges.js +260 -0
- package/dist/indexer/configEdges.js.map +1 -0
- package/dist/indexer/fileScanner.d.ts +16 -0
- package/dist/indexer/fileScanner.d.ts.map +1 -0
- package/dist/indexer/fileScanner.js +90 -0
- package/dist/indexer/fileScanner.js.map +1 -0
- package/dist/indexer/fingerprints.d.ts +23 -0
- package/dist/indexer/fingerprints.d.ts.map +1 -0
- package/dist/indexer/fingerprints.js +97 -0
- package/dist/indexer/fingerprints.js.map +1 -0
- package/dist/indexer/indexer.d.ts +58 -0
- package/dist/indexer/indexer.d.ts.map +1 -0
- package/dist/indexer/indexer.js +1229 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/indexer/summaries.d.ts +5 -0
- package/dist/indexer/summaries.d.ts.map +1 -0
- package/dist/indexer/summaries.js +331 -0
- package/dist/indexer/summaries.js.map +1 -0
- package/dist/indexer/treesitter/extractCalls.d.ts +40 -0
- package/dist/indexer/treesitter/extractCalls.d.ts.map +1 -0
- package/dist/indexer/treesitter/extractCalls.js +561 -0
- package/dist/indexer/treesitter/extractCalls.js.map +1 -0
- package/dist/indexer/treesitter/extractImports.d.ts +12 -0
- package/dist/indexer/treesitter/extractImports.d.ts.map +1 -0
- package/dist/indexer/treesitter/extractImports.js +184 -0
- package/dist/indexer/treesitter/extractImports.js.map +1 -0
- package/dist/indexer/treesitter/extractSymbols.d.ts +24 -0
- package/dist/indexer/treesitter/extractSymbols.d.ts.map +1 -0
- package/dist/indexer/treesitter/extractSymbols.js +389 -0
- package/dist/indexer/treesitter/extractSymbols.js.map +1 -0
- package/dist/indexer/treesitter/grammarLoader.d.ts +6 -0
- package/dist/indexer/treesitter/grammarLoader.d.ts.map +1 -0
- package/dist/indexer/treesitter/grammarLoader.js +125 -0
- package/dist/indexer/treesitter/grammarLoader.js.map +1 -0
- package/dist/indexer/treesitter/symbolUtils.d.ts +4 -0
- package/dist/indexer/treesitter/symbolUtils.d.ts.map +1 -0
- package/dist/indexer/treesitter/symbolUtils.js +26 -0
- package/dist/indexer/treesitter/symbolUtils.js.map +1 -0
- package/dist/indexer/treesitter/tsTreesitter.d.ts +9 -0
- package/dist/indexer/treesitter/tsTreesitter.d.ts.map +1 -0
- package/dist/indexer/treesitter/tsTreesitter.js +54 -0
- package/dist/indexer/treesitter/tsTreesitter.js.map +1 -0
- package/dist/indexer/treesitter/types.d.ts +19 -0
- package/dist/indexer/treesitter/types.d.ts.map +1 -0
- package/dist/indexer/treesitter/types.js +7 -0
- package/dist/indexer/treesitter/types.js.map +1 -0
- package/dist/indexer/ts/tsParser.d.ts +20 -0
- package/dist/indexer/ts/tsParser.d.ts.map +1 -0
- package/dist/indexer/ts/tsParser.js +114 -0
- package/dist/indexer/ts/tsParser.js.map +1 -0
- package/dist/indexer/worker.d.ts +2 -0
- package/dist/indexer/worker.d.ts.map +1 -0
- package/dist/indexer/worker.js +59 -0
- package/dist/indexer/worker.js.map +1 -0
- package/dist/indexer/workerPool.d.ts +20 -0
- package/dist/indexer/workerPool.d.ts.map +1 -0
- package/dist/indexer/workerPool.js +93 -0
- package/dist/indexer/workerPool.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +111 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/errors.d.ts +40 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +66 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/resources.d.ts +24 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +140 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/telemetry.d.ts +67 -0
- package/dist/mcp/telemetry.d.ts.map +1 -0
- package/dist/mcp/telemetry.js +128 -0
- package/dist/mcp/telemetry.js.map +1 -0
- package/dist/mcp/tools/agent.d.ts +241 -0
- package/dist/mcp/tools/agent.d.ts.map +1 -0
- package/dist/mcp/tools/agent.js +113 -0
- package/dist/mcp/tools/agent.js.map +1 -0
- package/dist/mcp/tools/code.d.ts +32 -0
- package/dist/mcp/tools/code.d.ts.map +1 -0
- package/dist/mcp/tools/code.js +388 -0
- package/dist/mcp/tools/code.js.map +1 -0
- package/dist/mcp/tools/delta.d.ts +12 -0
- package/dist/mcp/tools/delta.d.ts.map +1 -0
- package/dist/mcp/tools/delta.js +82 -0
- package/dist/mcp/tools/delta.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +3 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +35 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/policy.d.ts +20 -0
- package/dist/mcp/tools/policy.d.ts.map +1 -0
- package/dist/mcp/tools/policy.js +67 -0
- package/dist/mcp/tools/policy.js.map +1 -0
- package/dist/mcp/tools/prRisk.d.ts +34 -0
- package/dist/mcp/tools/prRisk.d.ts.map +1 -0
- package/dist/mcp/tools/prRisk.js +304 -0
- package/dist/mcp/tools/prRisk.js.map +1 -0
- package/dist/mcp/tools/repo.d.ts +46 -0
- package/dist/mcp/tools/repo.d.ts.map +1 -0
- package/dist/mcp/tools/repo.js +224 -0
- package/dist/mcp/tools/repo.js.map +1 -0
- package/dist/mcp/tools/slice.d.ts +44 -0
- package/dist/mcp/tools/slice.d.ts.map +1 -0
- package/dist/mcp/tools/slice.js +688 -0
- package/dist/mcp/tools/slice.js.map +1 -0
- package/dist/mcp/tools/symbol.d.ts +21 -0
- package/dist/mcp/tools/symbol.d.ts.map +1 -0
- package/dist/mcp/tools/symbol.js +416 -0
- package/dist/mcp/tools/symbol.js.map +1 -0
- package/dist/mcp/tools.d.ts +6003 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +932 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +500 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/policy/engine.d.ts +21 -0
- package/dist/policy/engine.d.ts.map +1 -0
- package/dist/policy/engine.js +477 -0
- package/dist/policy/engine.js.map +1 -0
- package/dist/policy/types.d.ts +73 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +12 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +136 -0
- package/dist/server.js.map +1 -0
- package/dist/sync/pull.d.ts +4 -0
- package/dist/sync/pull.d.ts.map +1 -0
- package/dist/sync/pull.js +113 -0
- package/dist/sync/pull.js.map +1 -0
- package/dist/sync/sync.d.ts +6 -0
- package/dist/sync/sync.d.ts.map +1 -0
- package/dist/sync/sync.js +244 -0
- package/dist/sync/sync.js.map +1 -0
- package/dist/sync/types.d.ts +136 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +2 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/ts/diagnostics.d.ts +61 -0
- package/dist/ts/diagnostics.d.ts.map +1 -0
- package/dist/ts/diagnostics.js +259 -0
- package/dist/ts/diagnostics.js.map +1 -0
- package/dist/ts/mapping.d.ts +27 -0
- package/dist/ts/mapping.d.ts.map +1 -0
- package/dist/ts/mapping.js +68 -0
- package/dist/ts/mapping.js.map +1 -0
- package/dist/util/asyncFs.d.ts +103 -0
- package/dist/util/asyncFs.d.ts.map +1 -0
- package/dist/util/asyncFs.js +133 -0
- package/dist/util/asyncFs.js.map +1 -0
- package/dist/util/concurrency.d.ts +77 -0
- package/dist/util/concurrency.d.ts.map +1 -0
- package/dist/util/concurrency.js +146 -0
- package/dist/util/concurrency.js.map +1 -0
- package/dist/util/depLabels.d.ts +3 -0
- package/dist/util/depLabels.d.ts.map +1 -0
- package/dist/util/depLabels.js +19 -0
- package/dist/util/depLabels.js.map +1 -0
- package/dist/util/findPackageRoot.d.ts +7 -0
- package/dist/util/findPackageRoot.d.ts.map +1 -0
- package/dist/util/findPackageRoot.js +21 -0
- package/dist/util/findPackageRoot.js.map +1 -0
- package/dist/util/hashing.d.ts +9 -0
- package/dist/util/hashing.d.ts.map +1 -0
- package/dist/util/hashing.js +37 -0
- package/dist/util/hashing.js.map +1 -0
- package/dist/util/logger.d.ts +14 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +51 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/paths.d.ts +6 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +79 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.d.ts.map +1 -0
- package/dist/util/time.js +20 -0
- package/dist/util/time.js.map +1 -0
- package/dist/util/tokenize.d.ts +5 -0
- package/dist/util/tokenize.d.ts.map +1 -0
- package/dist/util/tokenize.js +30 -0
- package/dist/util/tokenize.js.map +1 -0
- package/dist/util/truncation.d.ts +38 -0
- package/dist/util/truncation.d.ts.map +1 -0
- package/dist/util/truncation.js +259 -0
- package/dist/util/truncation.js.map +1 -0
- package/migrations/.gitkeep +1 -0
- package/migrations/0001_init.sql +61 -0
- package/migrations/0002_edges_indexes.sql +2 -0
- package/migrations/0003_versions.sql +22 -0
- package/migrations/0004_metrics_audit.sql +23 -0
- package/migrations/0005_slice_handles.sql +15 -0
- package/migrations/0006_content_addressed.sql +29 -0
- package/migrations/0007_add_language_to_symbols.sql +28 -0
- package/migrations/0008_performance_indexes.sql +21 -0
- package/migrations/0009_fix_edge_fks.sql +37 -0
- package/migrations/0010_standardize_fks.sql +35 -0
- package/migrations/0011_add_directory_column.sql +20 -0
- package/migrations/0012_symbol_references.sql +16 -0
- package/migrations/0013_sync_artifacts.sql +17 -0
- package/package.json +107 -0
- package/templates/CLAUDE.md.template +179 -0
- package/templates/README.md +228 -0
- package/templates/claude-code.json +54 -0
- package/templates/codex.json +55 -0
- package/templates/gemini.json +66 -0
- package/templates/opencode.json +90 -0
- package/templates/plugin-template/LICENSE +21 -0
- package/templates/plugin-template/README.md +309 -0
- package/templates/plugin-template/index.ts +160 -0
- package/templates/plugin-template/package.json +31 -0
- package/templates/plugin-template/test/plugin.test.ts +186 -0
- package/templates/plugin-template/tsconfig.json +21 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { writeFileSync, mkdirSync, existsSync } from "fs";
|
|
3
|
+
import { dirname, resolve } from "path";
|
|
4
|
+
import { getDb } from "../../db/db.js";
|
|
5
|
+
import { runMigrations } from "../../db/migrations.js";
|
|
6
|
+
import { loadConfig } from "../../config/loadConfig.js";
|
|
7
|
+
import * as db from "../../db/queries.js";
|
|
8
|
+
import { indexRepo } from "../../indexer/indexer.js";
|
|
9
|
+
import { buildSlice } from "../../graph/slice.js";
|
|
10
|
+
import { generateSymbolSkeleton } from "../../code/skeleton.js";
|
|
11
|
+
import { ThresholdEvaluator, loadThresholdConfig, loadBaselineMetrics, saveBaselineMetrics, } from "../../benchmark/threshold.js";
|
|
12
|
+
import { RegressionReportGenerator } from "../../benchmark/regression.js";
|
|
13
|
+
import { runBenchmarkWithSmoothing, } from "../../benchmark/smoothing.js";
|
|
14
|
+
function formatNumber(n) {
|
|
15
|
+
return n.toLocaleString();
|
|
16
|
+
}
|
|
17
|
+
function formatPercent(n) {
|
|
18
|
+
return `${n.toFixed(1)}%`;
|
|
19
|
+
}
|
|
20
|
+
function estimateTokens(text) {
|
|
21
|
+
return Math.ceil(text.length / 4);
|
|
22
|
+
}
|
|
23
|
+
function buildCardFromSymbol(repoId, symbol) {
|
|
24
|
+
const file = db.getFile(symbol.file_id);
|
|
25
|
+
if (!file)
|
|
26
|
+
return null;
|
|
27
|
+
const latestVersion = db.getLatestVersion(repoId);
|
|
28
|
+
const edgesFrom = db.getEdgesFrom(symbol.symbol_id);
|
|
29
|
+
const metrics = db.getMetrics(symbol.symbol_id);
|
|
30
|
+
const signature = symbol.signature_json
|
|
31
|
+
? JSON.parse(symbol.signature_json)
|
|
32
|
+
: undefined;
|
|
33
|
+
const invariants = symbol.invariants_json
|
|
34
|
+
? JSON.parse(symbol.invariants_json)
|
|
35
|
+
: undefined;
|
|
36
|
+
const sideEffects = symbol.side_effects_json
|
|
37
|
+
? JSON.parse(symbol.side_effects_json)
|
|
38
|
+
: undefined;
|
|
39
|
+
const deps = {
|
|
40
|
+
imports: edgesFrom
|
|
41
|
+
.filter((e) => e.type === "import")
|
|
42
|
+
.map((e) => e.to_symbol_id),
|
|
43
|
+
calls: edgesFrom
|
|
44
|
+
.filter((e) => e.type === "call")
|
|
45
|
+
.map((e) => e.to_symbol_id),
|
|
46
|
+
};
|
|
47
|
+
const cardMetrics = metrics
|
|
48
|
+
? {
|
|
49
|
+
fanIn: metrics.fan_in,
|
|
50
|
+
fanOut: metrics.fan_out,
|
|
51
|
+
churn30d: metrics.churn_30d,
|
|
52
|
+
testRefs: metrics.test_refs_json
|
|
53
|
+
? JSON.parse(metrics.test_refs_json)
|
|
54
|
+
: undefined,
|
|
55
|
+
}
|
|
56
|
+
: undefined;
|
|
57
|
+
const card = {
|
|
58
|
+
symbolId: symbol.symbol_id,
|
|
59
|
+
repoId: symbol.repo_id,
|
|
60
|
+
file: file.rel_path,
|
|
61
|
+
range: {
|
|
62
|
+
startLine: symbol.range_start_line,
|
|
63
|
+
startCol: symbol.range_start_col,
|
|
64
|
+
endLine: symbol.range_end_line,
|
|
65
|
+
endCol: symbol.range_end_col,
|
|
66
|
+
},
|
|
67
|
+
kind: symbol.kind,
|
|
68
|
+
name: symbol.name,
|
|
69
|
+
exported: symbol.exported === 1,
|
|
70
|
+
visibility: symbol.visibility,
|
|
71
|
+
signature,
|
|
72
|
+
summary: symbol.summary ?? undefined,
|
|
73
|
+
invariants,
|
|
74
|
+
sideEffects,
|
|
75
|
+
deps,
|
|
76
|
+
metrics: cardMetrics,
|
|
77
|
+
version: {
|
|
78
|
+
ledgerVersion: latestVersion?.version_id ?? "current",
|
|
79
|
+
astFingerprint: symbol.ast_fingerprint,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
const tokens = estimateTokens(JSON.stringify(card));
|
|
83
|
+
return { card, tokens };
|
|
84
|
+
}
|
|
85
|
+
async function collectBenchmarkMetrics(repoId, _repoPath, skipIndexing) {
|
|
86
|
+
const config = loadConfig();
|
|
87
|
+
const database = getDb(config.dbPath);
|
|
88
|
+
runMigrations(database);
|
|
89
|
+
let indexTimeMs = 0;
|
|
90
|
+
let filesIndexed = 0;
|
|
91
|
+
if (!skipIndexing) {
|
|
92
|
+
const indexStart = performance.now();
|
|
93
|
+
const indexResult = await indexRepo(repoId, "full");
|
|
94
|
+
indexTimeMs = performance.now() - indexStart;
|
|
95
|
+
filesIndexed = indexResult.filesProcessed;
|
|
96
|
+
}
|
|
97
|
+
const allSymbols = db.getSymbolsByRepo(repoId);
|
|
98
|
+
const edges = db.getEdgesByRepo(repoId);
|
|
99
|
+
const filesById = new Map(db.getFilesByRepo(repoId).map((file) => [file.file_id, file.rel_path]));
|
|
100
|
+
// Ensure benchmark symbol sampling is deterministic across platforms/runs.
|
|
101
|
+
const sortedSymbols = [...allSymbols].sort((a, b) => {
|
|
102
|
+
const pathA = filesById.get(a.file_id) ?? "";
|
|
103
|
+
const pathB = filesById.get(b.file_id) ?? "";
|
|
104
|
+
return (pathA.localeCompare(pathB) ||
|
|
105
|
+
a.range_start_line - b.range_start_line ||
|
|
106
|
+
a.range_start_col - b.range_start_col ||
|
|
107
|
+
a.kind.localeCompare(b.kind) ||
|
|
108
|
+
a.name.localeCompare(b.name) ||
|
|
109
|
+
a.symbol_id.localeCompare(b.symbol_id));
|
|
110
|
+
});
|
|
111
|
+
const srcSymbols = sortedSymbols.filter((symbol) => (filesById.get(symbol.file_id) ?? "").startsWith("src/"));
|
|
112
|
+
const samplingPool = srcSymbols.length > 0 ? srcSymbols : sortedSymbols;
|
|
113
|
+
const sampleSize = Math.min(20, samplingPool.length);
|
|
114
|
+
const sampleSymbols = samplingPool.slice(0, sampleSize);
|
|
115
|
+
let totalCardTokens = 0;
|
|
116
|
+
let totalSkeletonTokens = 0;
|
|
117
|
+
let skeletonCount = 0;
|
|
118
|
+
let skeletonTimeMs = 0;
|
|
119
|
+
for (const symbol of sampleSymbols) {
|
|
120
|
+
try {
|
|
121
|
+
const cardResult = buildCardFromSymbol(repoId, symbol);
|
|
122
|
+
if (cardResult) {
|
|
123
|
+
totalCardTokens += cardResult.tokens;
|
|
124
|
+
}
|
|
125
|
+
if (symbol.kind === "function" || symbol.kind === "method") {
|
|
126
|
+
const skelStart = performance.now();
|
|
127
|
+
try {
|
|
128
|
+
const skeleton = generateSymbolSkeleton(repoId, symbol.symbol_id);
|
|
129
|
+
skeletonTimeMs += performance.now() - skelStart;
|
|
130
|
+
if (skeleton?.skeleton) {
|
|
131
|
+
totalSkeletonTokens += estimateTokens(skeleton.skeleton);
|
|
132
|
+
skeletonCount++;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
skeletonTimeMs += performance.now() - skelStart;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Skip problematic symbols
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const avgCardTokens = sampleSize > 0 ? totalCardTokens / sampleSize : 0;
|
|
145
|
+
const avgSkeletonTokens = skeletonCount > 0 ? totalSkeletonTokens / skeletonCount : 0;
|
|
146
|
+
let sliceBuildTimeMs = 0;
|
|
147
|
+
if (sortedSymbols.length > 0) {
|
|
148
|
+
const outDegreeBySymbol = edges.reduce((counts, edge) => {
|
|
149
|
+
counts.set(edge.from_symbol_id, (counts.get(edge.from_symbol_id) ?? 0) + 1);
|
|
150
|
+
return counts;
|
|
151
|
+
}, new Map());
|
|
152
|
+
const srcFunctionSymbols = srcSymbols.filter((s) => s.kind === "function" || s.kind === "method");
|
|
153
|
+
const allFunctionSymbols = sortedSymbols.filter((s) => s.kind === "function" || s.kind === "method");
|
|
154
|
+
const seedCandidates = srcFunctionSymbols.length > 0 ? srcFunctionSymbols : allFunctionSymbols;
|
|
155
|
+
const seedSymbol = seedCandidates.find((sym) => {
|
|
156
|
+
const outDegree = outDegreeBySymbol.get(sym.symbol_id) ?? 0;
|
|
157
|
+
return outDegree >= 3 && outDegree <= 40;
|
|
158
|
+
}) ??
|
|
159
|
+
seedCandidates[0] ??
|
|
160
|
+
sortedSymbols[0];
|
|
161
|
+
const latestVersion = db.getLatestVersion(repoId);
|
|
162
|
+
const versionId = latestVersion?.version_id ?? "current";
|
|
163
|
+
try {
|
|
164
|
+
const sliceStart = performance.now();
|
|
165
|
+
await buildSlice({
|
|
166
|
+
repoId,
|
|
167
|
+
versionId,
|
|
168
|
+
entrySymbols: [seedSymbol.symbol_id],
|
|
169
|
+
taskText: "understand implementation",
|
|
170
|
+
budget: { maxCards: 20, maxEstimatedTokens: 4000 },
|
|
171
|
+
});
|
|
172
|
+
sliceBuildTimeMs = performance.now() - sliceStart;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Slice build errors are non-critical for metrics
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const exportedCount = allSymbols.filter((s) => s.exported === 1).length;
|
|
179
|
+
const functionMethodCount = allSymbols.filter((s) => s.kind === "function" || s.kind === "method").length;
|
|
180
|
+
const indexedSymbolIds = new Set(allSymbols.map((s) => s.symbol_id));
|
|
181
|
+
const symbolsWithInternalEdges = new Set(edges
|
|
182
|
+
.flatMap((e) => [e.from_symbol_id, e.to_symbol_id])
|
|
183
|
+
.filter((id) => indexedSymbolIds.has(id))).size;
|
|
184
|
+
const graphConnectivity = allSymbols.length > 0 ? symbolsWithInternalEdges / allSymbols.length : 0;
|
|
185
|
+
const edgeTypes = edges.reduce((acc, e) => {
|
|
186
|
+
acc[e.type] = (acc[e.type] || 0) + 1;
|
|
187
|
+
return acc;
|
|
188
|
+
}, {});
|
|
189
|
+
if (filesIndexed === 0) {
|
|
190
|
+
filesIndexed = filesById.size;
|
|
191
|
+
}
|
|
192
|
+
const totalSymbols = allSymbols.length;
|
|
193
|
+
const totalFiles = filesIndexed > 0 ? filesIndexed : 1;
|
|
194
|
+
return {
|
|
195
|
+
indexTimePerFile: totalFiles > 0 ? indexTimeMs / totalFiles : 0,
|
|
196
|
+
indexTimePerSymbol: totalSymbols > 0 ? indexTimeMs / totalSymbols : 0,
|
|
197
|
+
symbolsPerFile: totalFiles > 0 ? totalSymbols / totalFiles : 0,
|
|
198
|
+
edgesPerSymbol: totalSymbols > 0 ? edges.length / totalSymbols : 0,
|
|
199
|
+
graphConnectivity,
|
|
200
|
+
exportedSymbolRatio: totalSymbols > 0 ? exportedCount / totalSymbols : 0,
|
|
201
|
+
sliceBuildTimeMs,
|
|
202
|
+
avgSkeletonTimeMs: skeletonCount > 0 ? skeletonTimeMs / skeletonCount : 0,
|
|
203
|
+
avgCardTokens,
|
|
204
|
+
avgSkeletonTokens,
|
|
205
|
+
functionMethodRatio: totalSymbols > 0 ? functionMethodCount / totalSymbols : 0,
|
|
206
|
+
avgDepsPerSymbol: totalSymbols > 0 ? edges.length / totalSymbols : 0,
|
|
207
|
+
callEdgeCount: edgeTypes.call ?? 0,
|
|
208
|
+
importEdgeCount: edgeTypes.import ?? 0,
|
|
209
|
+
totalSymbols,
|
|
210
|
+
totalFiles,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export async function benchmarkCICommand(options) {
|
|
214
|
+
console.log("Benchmark CI: Running benchmark guardrails...\n");
|
|
215
|
+
const config = loadConfig();
|
|
216
|
+
const repoConfig = options.repoId
|
|
217
|
+
? config.repos.find((r) => r.repoId === options.repoId)
|
|
218
|
+
: config.repos[0];
|
|
219
|
+
if (!repoConfig) {
|
|
220
|
+
console.error(`Repository not found: ${options.repoId || "default"}`);
|
|
221
|
+
return 1;
|
|
222
|
+
}
|
|
223
|
+
const repoId = repoConfig.repoId;
|
|
224
|
+
const configuredRepoPath = resolve(repoConfig.rootPath);
|
|
225
|
+
const repoPath = existsSync(configuredRepoPath)
|
|
226
|
+
? configuredRepoPath
|
|
227
|
+
: process.cwd();
|
|
228
|
+
if (!existsSync(configuredRepoPath)) {
|
|
229
|
+
console.warn(`[WARN] Configured repository path does not exist: ${configuredRepoPath}`);
|
|
230
|
+
console.warn(`[WARN] Falling back to current working directory: ${repoPath}`);
|
|
231
|
+
}
|
|
232
|
+
const database = getDb(config.dbPath);
|
|
233
|
+
runMigrations(database);
|
|
234
|
+
const repoRuntimeConfigJson = JSON.stringify({
|
|
235
|
+
ignore: repoConfig.ignore,
|
|
236
|
+
languages: repoConfig.languages,
|
|
237
|
+
maxFileBytes: repoConfig.maxFileBytes,
|
|
238
|
+
packageJsonPath: repoConfig.packageJsonPath,
|
|
239
|
+
tsconfigPath: repoConfig.tsconfigPath,
|
|
240
|
+
workspaceGlobs: repoConfig.workspaceGlobs,
|
|
241
|
+
});
|
|
242
|
+
const persistedRepo = db.getRepo(repoId);
|
|
243
|
+
if (!persistedRepo) {
|
|
244
|
+
db.createRepo({
|
|
245
|
+
repo_id: repoId,
|
|
246
|
+
root_path: repoPath,
|
|
247
|
+
config_json: repoRuntimeConfigJson,
|
|
248
|
+
created_at: new Date().toISOString(),
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
const repoUpdates = {};
|
|
253
|
+
if (persistedRepo.root_path !== repoPath) {
|
|
254
|
+
repoUpdates.root_path = repoPath;
|
|
255
|
+
}
|
|
256
|
+
if (persistedRepo.config_json !== repoRuntimeConfigJson) {
|
|
257
|
+
repoUpdates.config_json = repoRuntimeConfigJson;
|
|
258
|
+
}
|
|
259
|
+
if (Object.keys(repoUpdates).length > 0) {
|
|
260
|
+
db.updateRepo(repoId, repoUpdates);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const thresholdPath = options.thresholdPath ??
|
|
264
|
+
resolve(process.cwd(), "config/benchmark.config.json");
|
|
265
|
+
const outputPath = options.outputPath ?? resolve(process.cwd(), ".benchmark/latest.json");
|
|
266
|
+
let thresholds;
|
|
267
|
+
try {
|
|
268
|
+
thresholds = loadThresholdConfig(thresholdPath);
|
|
269
|
+
console.log(`✓ Loaded threshold config from: ${thresholdPath}`);
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
console.warn(`⚠ Could not load threshold config: ${error}`);
|
|
273
|
+
console.warn(" Continuing without threshold evaluation...");
|
|
274
|
+
}
|
|
275
|
+
const baselinePath = options.baselinePath ??
|
|
276
|
+
resolve(process.cwd(), thresholds?.baseline.filePath ?? ".benchmark/baseline.json");
|
|
277
|
+
console.log(`\nBenchmarking repository: ${repoId}`);
|
|
278
|
+
console.log(`Repository path: ${repoPath}`);
|
|
279
|
+
if (thresholds) {
|
|
280
|
+
console.log(`\nSmoothing config: ${thresholds.smoothing.sampleRuns} sample runs, ${thresholds.smoothing.warmupRuns} warmup runs`);
|
|
281
|
+
}
|
|
282
|
+
let benchmarkMetrics;
|
|
283
|
+
if (thresholds) {
|
|
284
|
+
console.log(`\nRunning benchmark with smoothing...`);
|
|
285
|
+
const { smoothed } = await runBenchmarkWithSmoothing(thresholds.smoothing, () => collectBenchmarkMetrics(repoId, repoPath, options.skipIndexing ?? false).then((m) => m));
|
|
286
|
+
benchmarkMetrics = smoothed;
|
|
287
|
+
console.log(`✓ Benchmark complete with smoothing`);
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
console.log(`\nRunning benchmark (single run)...`);
|
|
291
|
+
benchmarkMetrics = await collectBenchmarkMetrics(repoId, repoPath, options.skipIndexing ?? false);
|
|
292
|
+
console.log(`✓ Benchmark complete`);
|
|
293
|
+
}
|
|
294
|
+
console.log("\n=== Benchmark Metrics ===");
|
|
295
|
+
console.log(`Indexing:`);
|
|
296
|
+
console.log(` Time per file: ${formatNumber(benchmarkMetrics.indexTimePerFile)}ms`);
|
|
297
|
+
console.log(` Time per symbol: ${formatNumber(benchmarkMetrics.indexTimePerSymbol)}ms`);
|
|
298
|
+
console.log(`Quality:`);
|
|
299
|
+
console.log(` Symbols per file: ${formatNumber(benchmarkMetrics.symbolsPerFile)}`);
|
|
300
|
+
console.log(` Edges per symbol: ${formatNumber(benchmarkMetrics.edgesPerSymbol)}`);
|
|
301
|
+
console.log(` Graph connectivity: ${formatPercent(benchmarkMetrics.graphConnectivity * 100)}`);
|
|
302
|
+
console.log(` Exported ratio: ${formatPercent(benchmarkMetrics.exportedSymbolRatio * 100)}`);
|
|
303
|
+
console.log(`Performance:`);
|
|
304
|
+
console.log(` Slice build: ${formatNumber(benchmarkMetrics.sliceBuildTimeMs)}ms`);
|
|
305
|
+
console.log(` Skeleton time: ${formatNumber(benchmarkMetrics.avgSkeletonTimeMs)}ms`);
|
|
306
|
+
console.log(`Token Efficiency:`);
|
|
307
|
+
console.log(` Avg card tokens: ${formatNumber(benchmarkMetrics.avgCardTokens)}`);
|
|
308
|
+
console.log(` Avg skeleton tokens:${formatNumber(benchmarkMetrics.avgSkeletonTokens)}`);
|
|
309
|
+
console.log(`Coverage:`);
|
|
310
|
+
console.log(` Call edges: ${formatNumber(benchmarkMetrics.callEdgeCount)}`);
|
|
311
|
+
console.log(` Import edges: ${formatNumber(benchmarkMetrics.importEdgeCount)}`);
|
|
312
|
+
let baselineMetrics;
|
|
313
|
+
try {
|
|
314
|
+
baselineMetrics = loadBaselineMetrics(baselinePath);
|
|
315
|
+
if (baselineMetrics) {
|
|
316
|
+
console.log(`\n✓ Loaded baseline from: ${baselinePath}`);
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
console.log(`\n⚠ No baseline found at: ${baselinePath}`);
|
|
320
|
+
console.log(` Use --update-baseline to create one`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
console.warn(`\n⚠ Could not load baseline: ${error}`);
|
|
325
|
+
}
|
|
326
|
+
let thresholdResult;
|
|
327
|
+
let regressionReport;
|
|
328
|
+
if (thresholds) {
|
|
329
|
+
const evaluator = new ThresholdEvaluator(thresholds);
|
|
330
|
+
const currentMetrics = {
|
|
331
|
+
indexTimePerFile: benchmarkMetrics.indexTimePerFile,
|
|
332
|
+
indexTimePerSymbol: benchmarkMetrics.indexTimePerSymbol,
|
|
333
|
+
symbolsPerFile: benchmarkMetrics.symbolsPerFile,
|
|
334
|
+
edgesPerSymbol: benchmarkMetrics.edgesPerSymbol,
|
|
335
|
+
graphConnectivity: benchmarkMetrics.graphConnectivity,
|
|
336
|
+
exportedSymbolRatio: benchmarkMetrics.exportedSymbolRatio,
|
|
337
|
+
sliceBuildTimeMs: benchmarkMetrics.sliceBuildTimeMs,
|
|
338
|
+
avgSkeletonTimeMs: benchmarkMetrics.avgSkeletonTimeMs,
|
|
339
|
+
avgCardTokens: benchmarkMetrics.avgCardTokens,
|
|
340
|
+
avgSkeletonTokens: benchmarkMetrics.avgSkeletonTokens,
|
|
341
|
+
};
|
|
342
|
+
thresholdResult = evaluator.evaluate(currentMetrics, baselineMetrics);
|
|
343
|
+
console.log(`\n=== Threshold Evaluation ===`);
|
|
344
|
+
console.log(`Status: ${thresholdResult.passed ? "✅ PASSED" : "❌ FAILED"}`);
|
|
345
|
+
console.log(`Total: ${thresholdResult.summary.total}`);
|
|
346
|
+
console.log(`Passed: ${thresholdResult.summary.passed}`);
|
|
347
|
+
console.log(`Failed: ${thresholdResult.summary.failed}`);
|
|
348
|
+
const failed = thresholdResult.evaluations.filter((e) => !e.passed);
|
|
349
|
+
if (failed.length > 0) {
|
|
350
|
+
console.log(`\nFailed thresholds:`);
|
|
351
|
+
for (const evaluation of failed) {
|
|
352
|
+
console.log(` - ${evaluation.category}.${evaluation.metricName}: ${evaluation.message}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (baselineMetrics) {
|
|
356
|
+
const reportGenerator = new RegressionReportGenerator();
|
|
357
|
+
regressionReport = reportGenerator.generate({
|
|
358
|
+
timestamp: new Date().toISOString(),
|
|
359
|
+
repoId,
|
|
360
|
+
currentMetrics,
|
|
361
|
+
baselineMetrics,
|
|
362
|
+
thresholds: thresholds.thresholds,
|
|
363
|
+
evaluations: thresholdResult.evaluations,
|
|
364
|
+
});
|
|
365
|
+
console.log(`\n=== Regression Summary ===`);
|
|
366
|
+
console.log(`Status: ${regressionReport.summary.passed ? "✅ PASSED" : "❌ FAILED"}`);
|
|
367
|
+
console.log(`Improved: ${regressionReport.summary.improved}`);
|
|
368
|
+
console.log(`Degraded: ${regressionReport.summary.degraded}`);
|
|
369
|
+
console.log(`Neutral: ${regressionReport.summary.neutral}`);
|
|
370
|
+
if (regressionReport.recommendations.length > 0) {
|
|
371
|
+
console.log(`\nRecommendations:`);
|
|
372
|
+
for (const rec of regressionReport.recommendations) {
|
|
373
|
+
console.log(` ${rec}`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
const result = {
|
|
379
|
+
timestamp: new Date().toISOString(),
|
|
380
|
+
repoId,
|
|
381
|
+
repoPath,
|
|
382
|
+
metrics: benchmarkMetrics,
|
|
383
|
+
thresholdResult,
|
|
384
|
+
regressionReport,
|
|
385
|
+
config: {
|
|
386
|
+
thresholdPath,
|
|
387
|
+
baselinePath,
|
|
388
|
+
smoothing: thresholds?.smoothing ?? {
|
|
389
|
+
warmupRuns: 0,
|
|
390
|
+
sampleRuns: 1,
|
|
391
|
+
outlierMethod: "none",
|
|
392
|
+
iqrMultiplier: 1.5,
|
|
393
|
+
},
|
|
394
|
+
},
|
|
395
|
+
};
|
|
396
|
+
const outputDir = dirname(outputPath);
|
|
397
|
+
if (!existsSync(outputDir)) {
|
|
398
|
+
mkdirSync(outputDir, { recursive: true });
|
|
399
|
+
}
|
|
400
|
+
writeFileSync(outputPath, JSON.stringify(result, null, 2), "utf-8");
|
|
401
|
+
console.log(`\n✓ Results saved to: ${outputPath}`);
|
|
402
|
+
if (options.jsonOutput) {
|
|
403
|
+
console.log(`\n${JSON.stringify(result, null, 2)}`);
|
|
404
|
+
}
|
|
405
|
+
if (options.updateBaseline) {
|
|
406
|
+
saveBaselineMetrics(baselinePath, result);
|
|
407
|
+
console.log(`\n✓ Baseline updated: ${baselinePath}`);
|
|
408
|
+
}
|
|
409
|
+
const exitCode = thresholdResult?.passed !== false ? 0 : 1;
|
|
410
|
+
return exitCode;
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../../src/cli/commands/benchmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2B5C,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCzE"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { access, constants, existsSync } from "fs";
|
|
2
|
+
import { resolve } from "path";
|
|
3
|
+
import { getDb } from "../../db/db.js";
|
|
4
|
+
import { NODE_MIN_MAJOR_VERSION } from "../../config/constants.js";
|
|
5
|
+
import Parser from "tree-sitter";
|
|
6
|
+
import TypeScript from "tree-sitter-typescript";
|
|
7
|
+
import C from "tree-sitter-c";
|
|
8
|
+
import Cpp from "tree-sitter-cpp";
|
|
9
|
+
import PHP from "tree-sitter-php";
|
|
10
|
+
import Rust from "tree-sitter-rust";
|
|
11
|
+
import Kotlin from "tree-sitter-kotlin";
|
|
12
|
+
import Bash from "tree-sitter-bash";
|
|
13
|
+
const DOCTOR_CHECKS = [
|
|
14
|
+
{ name: "Node.js version", check: checkNodeVersion },
|
|
15
|
+
{ name: "Config file exists", check: checkConfigExists },
|
|
16
|
+
{ name: "Config file readable", check: checkConfigReadable },
|
|
17
|
+
{ name: "Database path writable", check: checkDatabaseWritable },
|
|
18
|
+
{ name: "Tree-sitter grammars available", check: checkTreeSitterGrammar },
|
|
19
|
+
{ name: "Repo paths accessible", check: checkRepoPaths },
|
|
20
|
+
];
|
|
21
|
+
export async function doctorCommand(options) {
|
|
22
|
+
console.log("Running SDL-MCP environment checks...\n");
|
|
23
|
+
const results = [];
|
|
24
|
+
for (const { name, check } of DOCTOR_CHECKS) {
|
|
25
|
+
try {
|
|
26
|
+
const result = await check(options);
|
|
27
|
+
results.push({ name, ...result });
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
results.push({
|
|
31
|
+
name,
|
|
32
|
+
status: "fail",
|
|
33
|
+
message: error instanceof Error ? error.message : String(error),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
displayResults(results);
|
|
38
|
+
const failed = results.filter((r) => r.status === "fail").length;
|
|
39
|
+
if (failed > 0) {
|
|
40
|
+
console.log(`\n✗ ${failed} check(s) failed. Please fix the issues above.`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const warned = results.filter((r) => r.status === "warn").length;
|
|
44
|
+
if (warned > 0) {
|
|
45
|
+
console.log(`\n⚠ ${warned} warning(s). SDL-MCP may work but with limitations.`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log("\n✓ All checks passed!");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function checkNodeVersion(_options) {
|
|
52
|
+
const version = process.version;
|
|
53
|
+
const major = parseInt(version.slice(1).split(".")[0], 10);
|
|
54
|
+
if (major >= NODE_MIN_MAJOR_VERSION) {
|
|
55
|
+
return {
|
|
56
|
+
status: "pass",
|
|
57
|
+
message: `Node.js ${version} (>= ${NODE_MIN_MAJOR_VERSION}.0.0)`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
status: "fail",
|
|
62
|
+
message: `Node.js ${version} (requires >= ${NODE_MIN_MAJOR_VERSION}.0.0)`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async function checkConfigExists(options) {
|
|
66
|
+
const configPath = options.config ?? resolve("./config/sdlmcp.config.json");
|
|
67
|
+
process.env.SDL_CONFIG = configPath;
|
|
68
|
+
if (existsSync(configPath)) {
|
|
69
|
+
return { status: "pass", message: configPath };
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
status: "fail",
|
|
73
|
+
message: `Config not found: ${configPath}\n Run: sdl-mcp init`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function checkConfigReadable(options) {
|
|
77
|
+
const configPath = options.config ?? resolve("./config/sdlmcp.config.json");
|
|
78
|
+
if (!existsSync(configPath)) {
|
|
79
|
+
return { status: "warn", message: "Config file not found (skip)" };
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
await new Promise((resolve_, reject) => {
|
|
83
|
+
access(configPath, constants.R_OK, (err) => {
|
|
84
|
+
if (err)
|
|
85
|
+
reject(err);
|
|
86
|
+
else
|
|
87
|
+
resolve_();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
return { status: "pass", message: configPath };
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return {
|
|
94
|
+
status: "fail",
|
|
95
|
+
message: `Cannot read config: ${configPath}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function checkDatabaseWritable(_options) {
|
|
100
|
+
try {
|
|
101
|
+
const db = getDb(":memory:");
|
|
102
|
+
db.close();
|
|
103
|
+
return { status: "pass", message: "SQLite database initialization works" };
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return {
|
|
107
|
+
status: "fail",
|
|
108
|
+
message: `SQLite error: ${error instanceof Error ? error.message : String(error)}`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function checkTreeSitterGrammar(_options) {
|
|
113
|
+
const grammars = [
|
|
114
|
+
{ name: "TypeScript", module: TypeScript, langProp: "typescript" },
|
|
115
|
+
{ name: "C", module: C, langProp: null },
|
|
116
|
+
{ name: "C++", module: Cpp, langProp: null },
|
|
117
|
+
{ name: "PHP", module: PHP, langProp: "php" },
|
|
118
|
+
{ name: "Rust", module: Rust, langProp: null },
|
|
119
|
+
{ name: "Kotlin", module: Kotlin, langProp: null },
|
|
120
|
+
{ name: "Bash", module: Bash, langProp: null },
|
|
121
|
+
];
|
|
122
|
+
const results = [];
|
|
123
|
+
try {
|
|
124
|
+
for (const grammar of grammars) {
|
|
125
|
+
try {
|
|
126
|
+
let language;
|
|
127
|
+
if (grammar.langProp) {
|
|
128
|
+
language = grammar.module[grammar.langProp];
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
language = grammar.module;
|
|
132
|
+
}
|
|
133
|
+
const parser = new Parser();
|
|
134
|
+
parser.setLanguage(language);
|
|
135
|
+
results.push({ name: grammar.name, success: true });
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
results.push({
|
|
139
|
+
name: grammar.name,
|
|
140
|
+
success: false,
|
|
141
|
+
error: error instanceof Error ? error.message : String(error),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const failed = results.filter((r) => !r.success);
|
|
146
|
+
if (failed.length === 0) {
|
|
147
|
+
return {
|
|
148
|
+
status: "pass",
|
|
149
|
+
message: `All ${grammars.length} grammars loaded (${grammars.map((g) => g.name).join(", ")})`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const failedList = failed.map((f) => `${f.name}: ${f.error}`).join("\n ");
|
|
153
|
+
const failedPkgs = failed
|
|
154
|
+
.map((f) => {
|
|
155
|
+
const grammar = grammars.find((g) => g.name === f.name);
|
|
156
|
+
const pkgMap = {
|
|
157
|
+
TypeScript: "tree-sitter-typescript",
|
|
158
|
+
C: "tree-sitter-c",
|
|
159
|
+
"C++": "tree-sitter-cpp",
|
|
160
|
+
PHP: "tree-sitter-php",
|
|
161
|
+
Rust: "tree-sitter-rust",
|
|
162
|
+
Kotlin: "tree-sitter-kotlin",
|
|
163
|
+
Bash: "tree-sitter-bash",
|
|
164
|
+
};
|
|
165
|
+
return grammar ? pkgMap[grammar.name] : "";
|
|
166
|
+
})
|
|
167
|
+
.filter(Boolean);
|
|
168
|
+
return {
|
|
169
|
+
status: "fail",
|
|
170
|
+
message: `Failed to load ${failed.length} grammar(s):\n ${failedList}\n\n Install missing grammars: npm install ${failedPkgs.join(" ")}`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
return {
|
|
175
|
+
status: "fail",
|
|
176
|
+
message: `Cannot load tree-sitter: ${error instanceof Error ? error.message : String(error)}`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function checkRepoPaths(options) {
|
|
181
|
+
const configPath = options.config ?? resolve("./config/sdlmcp.config.json");
|
|
182
|
+
if (!existsSync(configPath)) {
|
|
183
|
+
return { status: "warn", message: "Config not found (skip repo checks)" };
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
const { loadConfig } = await import("../../config/loadConfig.js");
|
|
187
|
+
const config = loadConfig(configPath);
|
|
188
|
+
const inaccessible = [];
|
|
189
|
+
for (const repo of config.repos) {
|
|
190
|
+
if (!existsSync(repo.rootPath)) {
|
|
191
|
+
inaccessible.push(repo.rootPath);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (inaccessible.length === 0) {
|
|
195
|
+
return {
|
|
196
|
+
status: "pass",
|
|
197
|
+
message: `All ${config.repos.length} repo(s) accessible`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
status: "fail",
|
|
202
|
+
message: `Inaccessible repos:\n${inaccessible.map((p) => ` - ${p}`).join("\n")}`,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
return {
|
|
207
|
+
status: "warn",
|
|
208
|
+
message: `Cannot verify repo paths: ${error instanceof Error ? error.message : String(error)}`,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function displayResults(results) {
|
|
213
|
+
for (const result of results) {
|
|
214
|
+
const icon = result.status === "pass" ? "✓" : result.status === "fail" ? "✗" : "⚠";
|
|
215
|
+
console.log(`${icon} ${result.name}: ${result.message}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=doctor.js.map
|