@skillsmith/core 0.1.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +233 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.d.ts +4 -134
- package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.js +7 -315
- package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
- package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
- package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/incremental.test.js +515 -0
- package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
- package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/integration.test.js +1059 -0
- package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
- package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/metrics.test.js +369 -0
- package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
- package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
- package/dist/src/analysis/__tests__/performance.test.js +402 -0
- package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
- package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
- package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
- package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
- package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
- package/dist/src/analysis/adapters/base.d.ts +83 -0
- package/dist/src/analysis/adapters/base.d.ts.map +1 -0
- package/dist/src/analysis/adapters/base.js +40 -0
- package/dist/src/analysis/adapters/base.js.map +1 -0
- package/dist/src/analysis/adapters/factory.d.ts +150 -0
- package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
- package/dist/src/analysis/adapters/factory.js +244 -0
- package/dist/src/analysis/adapters/factory.js.map +1 -0
- package/dist/src/analysis/adapters/go.d.ts +131 -0
- package/dist/src/analysis/adapters/go.d.ts.map +1 -0
- package/dist/src/analysis/adapters/go.js +414 -0
- package/dist/src/analysis/adapters/go.js.map +1 -0
- package/dist/src/analysis/adapters/index.d.ts +20 -0
- package/dist/src/analysis/adapters/index.d.ts.map +1 -0
- package/dist/src/analysis/adapters/index.js +23 -0
- package/dist/src/analysis/adapters/index.js.map +1 -0
- package/dist/src/analysis/adapters/java.d.ts +154 -0
- package/dist/src/analysis/adapters/java.d.ts.map +1 -0
- package/dist/src/analysis/adapters/java.js +407 -0
- package/dist/src/analysis/adapters/java.js.map +1 -0
- package/dist/src/analysis/adapters/python.d.ts +165 -0
- package/dist/src/analysis/adapters/python.d.ts.map +1 -0
- package/dist/src/analysis/adapters/python.js +475 -0
- package/dist/src/analysis/adapters/python.js.map +1 -0
- package/dist/src/analysis/adapters/rust.d.ts +116 -0
- package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
- package/dist/src/analysis/adapters/rust.js +476 -0
- package/dist/src/analysis/adapters/rust.js.map +1 -0
- package/dist/src/analysis/adapters/typescript.d.ts +68 -0
- package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
- package/dist/src/analysis/adapters/typescript.js +79 -0
- package/dist/src/analysis/adapters/typescript.js.map +1 -0
- package/dist/src/analysis/aggregator.d.ts +193 -0
- package/dist/src/analysis/aggregator.d.ts.map +1 -0
- package/dist/src/analysis/aggregator.js +283 -0
- package/dist/src/analysis/aggregator.js.map +1 -0
- package/dist/src/analysis/cache.d.ts +180 -0
- package/dist/src/analysis/cache.d.ts.map +1 -0
- package/dist/src/analysis/cache.js +279 -0
- package/dist/src/analysis/cache.js.map +1 -0
- package/dist/src/analysis/file-streamer.d.ts +136 -0
- package/dist/src/analysis/file-streamer.d.ts.map +1 -0
- package/dist/src/analysis/file-streamer.js +291 -0
- package/dist/src/analysis/file-streamer.js.map +1 -0
- package/dist/src/analysis/framework-detector.d.ts +47 -0
- package/dist/src/analysis/framework-detector.d.ts.map +1 -0
- package/dist/src/analysis/framework-detector.js +151 -0
- package/dist/src/analysis/framework-detector.js.map +1 -0
- package/dist/src/analysis/incremental-parser.d.ts +186 -0
- package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
- package/dist/src/analysis/incremental-parser.js +291 -0
- package/dist/src/analysis/incremental-parser.js.map +1 -0
- package/dist/src/analysis/incremental.d.ts +186 -0
- package/dist/src/analysis/incremental.d.ts.map +1 -0
- package/dist/src/analysis/incremental.js +247 -0
- package/dist/src/analysis/incremental.js.map +1 -0
- package/dist/src/analysis/index.d.ts +29 -2
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +53 -2
- package/dist/src/analysis/index.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +92 -0
- package/dist/src/analysis/language-detector.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.js +602 -0
- package/dist/src/analysis/language-detector.js.map +1 -0
- package/dist/src/analysis/memory-monitor.d.ts +199 -0
- package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
- package/dist/src/analysis/memory-monitor.js +271 -0
- package/dist/src/analysis/memory-monitor.js.map +1 -0
- package/dist/src/analysis/metrics.d.ts +300 -0
- package/dist/src/analysis/metrics.d.ts.map +1 -0
- package/dist/src/analysis/metrics.js +537 -0
- package/dist/src/analysis/metrics.js.map +1 -0
- package/dist/src/analysis/parsers.d.ts +43 -0
- package/dist/src/analysis/parsers.d.ts.map +1 -0
- package/dist/src/analysis/parsers.js +219 -0
- package/dist/src/analysis/parsers.js.map +1 -0
- package/dist/src/analysis/router.d.ts +264 -0
- package/dist/src/analysis/router.d.ts.map +1 -0
- package/dist/src/analysis/router.js +398 -0
- package/dist/src/analysis/router.js.map +1 -0
- package/dist/src/analysis/tree-cache.d.ts +208 -0
- package/dist/src/analysis/tree-cache.d.ts.map +1 -0
- package/dist/src/analysis/tree-cache.js +288 -0
- package/dist/src/analysis/tree-cache.js.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
- package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
- package/dist/src/analysis/tree-sitter/manager.js +239 -0
- package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
- package/dist/src/analysis/types.d.ts +201 -0
- package/dist/src/analysis/types.d.ts.map +1 -0
- package/dist/src/analysis/types.js +46 -0
- package/dist/src/analysis/types.js.map +1 -0
- package/dist/src/analysis/worker-pool.d.ts +141 -0
- package/dist/src/analysis/worker-pool.d.ts.map +1 -0
- package/dist/src/analysis/worker-pool.js +418 -0
- package/dist/src/analysis/worker-pool.js.map +1 -0
- package/dist/src/analytics/AnalyticsRepository.d.ts.map +1 -1
- package/dist/src/analytics/AnalyticsRepository.js +4 -4
- package/dist/src/analytics/AnalyticsRepository.js.map +1 -1
- package/dist/src/analytics/schema.d.ts +1 -1
- package/dist/src/analytics/schema.d.ts.map +1 -1
- package/dist/src/analytics/schema.js +72 -0
- package/dist/src/analytics/schema.js.map +1 -1
- package/dist/src/api/cache.d.ts +131 -0
- package/dist/src/api/cache.d.ts.map +1 -0
- package/dist/src/api/cache.js +264 -0
- package/dist/src/api/cache.js.map +1 -0
- package/dist/src/api/client.d.ts +282 -0
- package/dist/src/api/client.d.ts.map +1 -0
- package/dist/src/api/client.js +417 -0
- package/dist/src/api/client.js.map +1 -0
- package/dist/src/api/index.d.ts +12 -0
- package/dist/src/api/index.d.ts.map +1 -0
- package/dist/src/api/index.js +17 -0
- package/dist/src/api/index.js.map +1 -0
- package/dist/src/api/types.d.ts +251 -0
- package/dist/src/api/types.d.ts.map +1 -0
- package/dist/src/api/types.js +9 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/benchmarks/BenchmarkRunner.d.ts +6 -175
- package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
- package/dist/src/benchmarks/BenchmarkRunner.js +6 -123
- package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
- package/dist/src/benchmarks/MemoryProfiler.d.ts +4 -262
- package/dist/src/benchmarks/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/MemoryProfiler.js +4 -400
- package/dist/src/benchmarks/MemoryProfiler.js.map +1 -1
- package/dist/src/benchmarks/comparator.d.ts +38 -0
- package/dist/src/benchmarks/comparator.d.ts.map +1 -0
- package/dist/src/benchmarks/comparator.js +81 -0
- package/dist/src/benchmarks/comparator.js.map +1 -0
- package/dist/src/benchmarks/formatters.d.ts +30 -0
- package/dist/src/benchmarks/formatters.d.ts.map +1 -0
- package/dist/src/benchmarks/formatters.js +88 -0
- package/dist/src/benchmarks/formatters.js.map +1 -0
- package/dist/src/benchmarks/index.d.ts +5 -1
- package/dist/src/benchmarks/index.d.ts.map +1 -1
- package/dist/src/benchmarks/index.js +9 -2
- package/dist/src/benchmarks/index.js.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts +165 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.js +312 -0
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -0
- package/dist/src/benchmarks/memory/baseline-manager.d.ts +64 -0
- package/dist/src/benchmarks/memory/baseline-manager.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/baseline-manager.js +95 -0
- package/dist/src/benchmarks/memory/baseline-manager.js.map +1 -0
- package/dist/src/benchmarks/memory/index.d.ts +12 -0
- package/dist/src/benchmarks/memory/index.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/index.js +12 -0
- package/dist/src/benchmarks/memory/index.js.map +1 -0
- package/dist/src/benchmarks/memory/leak-detector.d.ts +23 -0
- package/dist/src/benchmarks/memory/leak-detector.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/leak-detector.js +46 -0
- package/dist/src/benchmarks/memory/leak-detector.js.map +1 -0
- package/dist/src/benchmarks/memory/regression-detector.d.ts +17 -0
- package/dist/src/benchmarks/memory/regression-detector.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/regression-detector.js +56 -0
- package/dist/src/benchmarks/memory/regression-detector.js.map +1 -0
- package/dist/src/benchmarks/memory/types.d.ts +111 -0
- package/dist/src/benchmarks/memory/types.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/types.js +7 -0
- package/dist/src/benchmarks/memory/types.js.map +1 -0
- package/dist/src/benchmarks/memory/utils.d.ts +17 -0
- package/dist/src/benchmarks/memory/utils.d.ts.map +1 -0
- package/dist/src/benchmarks/memory/utils.js +29 -0
- package/dist/src/benchmarks/memory/utils.js.map +1 -0
- package/dist/src/benchmarks/types.d.ts +175 -0
- package/dist/src/benchmarks/types.d.ts.map +1 -0
- package/dist/src/benchmarks/types.js +20 -0
- package/dist/src/benchmarks/types.js.map +1 -0
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +5 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +1 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/QuarantineRepository.d.ts +4 -251
- package/dist/src/repositories/QuarantineRepository.d.ts.map +1 -1
- package/dist/src/repositories/QuarantineRepository.js +4 -441
- package/dist/src/repositories/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +1 -0
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts +168 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.js +341 -0
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -0
- package/dist/src/repositories/quarantine/index.d.ts +10 -0
- package/dist/src/repositories/quarantine/index.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/index.js +10 -0
- package/dist/src/repositories/quarantine/index.js.map +1 -0
- package/dist/src/repositories/quarantine/queries.d.ts +58 -0
- package/dist/src/repositories/quarantine/queries.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/queries.js +88 -0
- package/dist/src/repositories/quarantine/queries.js.map +1 -0
- package/dist/src/repositories/quarantine/query-builder.d.ts +44 -0
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/query-builder.js +87 -0
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -0
- package/dist/src/repositories/quarantine/types.d.ts +155 -0
- package/dist/src/repositories/quarantine/types.d.ts.map +1 -0
- package/dist/src/repositories/quarantine/types.js +13 -0
- package/dist/src/repositories/quarantine/types.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.d.ts.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +7 -43
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/checkpoint.d.ts +21 -0
- package/dist/src/scripts/github-import/checkpoint.d.ts.map +1 -0
- package/dist/src/scripts/github-import/checkpoint.js +52 -0
- package/dist/src/scripts/github-import/checkpoint.js.map +1 -0
- package/dist/src/scripts/github-import/deduplication.d.ts +15 -0
- package/dist/src/scripts/github-import/deduplication.d.ts.map +1 -0
- package/dist/src/scripts/github-import/deduplication.js +33 -0
- package/dist/src/scripts/github-import/deduplication.js.map +1 -0
- package/dist/src/scripts/github-import/github-client.d.ts +29 -0
- package/dist/src/scripts/github-import/github-client.d.ts.map +1 -0
- package/dist/src/scripts/github-import/github-client.js +184 -0
- package/dist/src/scripts/github-import/github-client.js.map +1 -0
- package/dist/src/scripts/github-import/index.d.ts +29 -0
- package/dist/src/scripts/github-import/index.d.ts.map +1 -0
- package/dist/src/scripts/github-import/index.js +198 -0
- package/dist/src/scripts/github-import/index.js.map +1 -0
- package/dist/src/scripts/github-import/output.d.ts +12 -0
- package/dist/src/scripts/github-import/output.d.ts.map +1 -0
- package/dist/src/scripts/github-import/output.js +34 -0
- package/dist/src/scripts/github-import/output.js.map +1 -0
- package/dist/src/scripts/github-import/types.d.ts +108 -0
- package/dist/src/scripts/github-import/types.d.ts.map +1 -0
- package/dist/src/scripts/github-import/types.js +44 -0
- package/dist/src/scripts/github-import/types.js.map +1 -0
- package/dist/src/scripts/github-import/utils.d.ts +13 -0
- package/dist/src/scripts/github-import/utils.d.ts.map +1 -0
- package/dist/src/scripts/github-import/utils.js +28 -0
- package/dist/src/scripts/github-import/utils.js.map +1 -0
- package/dist/src/scripts/import-github-skills.d.ts +3 -12
- package/dist/src/scripts/import-github-skills.d.ts.map +1 -1
- package/dist/src/scripts/import-github-skills.js +18 -398
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/scan-imported-skills.d.ts +7 -7
- package/dist/src/scripts/scan-imported-skills.d.ts.map +1 -1
- package/dist/src/scripts/scan-imported-skills.js +8 -397
- package/dist/src/scripts/scan-imported-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/categorizer.d.ts +43 -0
- package/dist/src/scripts/skill-scanner/categorizer.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/categorizer.js +61 -0
- package/dist/src/scripts/skill-scanner/categorizer.js.map +1 -0
- package/dist/src/scripts/skill-scanner/file-scanner.d.ts +43 -0
- package/dist/src/scripts/skill-scanner/file-scanner.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/file-scanner.js +90 -0
- package/dist/src/scripts/skill-scanner/file-scanner.js.map +1 -0
- package/dist/src/scripts/skill-scanner/index.d.ts +22 -0
- package/dist/src/scripts/skill-scanner/index.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/index.js +43 -0
- package/dist/src/scripts/skill-scanner/index.js.map +1 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts +59 -0
- package/dist/src/scripts/skill-scanner/logger.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/logger.js +104 -0
- package/dist/src/scripts/skill-scanner/logger.js.map +1 -0
- package/dist/src/scripts/skill-scanner/reporter.d.ts +56 -0
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/reporter.js +166 -0
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -0
- package/dist/src/scripts/skill-scanner/scanner.d.ts +44 -0
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/scanner.js +140 -0
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts +59 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js +62 -0
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -0
- package/dist/src/scripts/skill-scanner/types.d.ts +98 -0
- package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -0
- package/dist/src/scripts/skill-scanner/types.js +7 -0
- package/dist/src/scripts/skill-scanner/types.js.map +1 -0
- package/dist/src/scripts/validate-skills.d.ts +3 -172
- package/dist/src/scripts/validate-skills.d.ts.map +1 -1
- package/dist/src/scripts/validate-skills.js +6 -519
- package/dist/src/scripts/validate-skills.js.map +1 -1
- package/dist/src/scripts/validation/deduplication.d.ts +23 -0
- package/dist/src/scripts/validation/deduplication.d.ts.map +1 -0
- package/dist/src/scripts/validation/deduplication.js +127 -0
- package/dist/src/scripts/validation/deduplication.js.map +1 -0
- package/dist/src/scripts/validation/field-validators.d.ts +9 -0
- package/dist/src/scripts/validation/field-validators.d.ts.map +1 -0
- package/dist/src/scripts/validation/field-validators.js +135 -0
- package/dist/src/scripts/validation/field-validators.js.map +1 -0
- package/dist/src/scripts/validation/index.d.ts +29 -0
- package/dist/src/scripts/validation/index.d.ts.map +1 -0
- package/dist/src/scripts/validation/index.js +83 -0
- package/dist/src/scripts/validation/index.js.map +1 -0
- package/dist/src/scripts/validation/normalizers.d.ts +29 -0
- package/dist/src/scripts/validation/normalizers.d.ts.map +1 -0
- package/dist/src/scripts/validation/normalizers.js +79 -0
- package/dist/src/scripts/validation/normalizers.js.map +1 -0
- package/dist/src/scripts/validation/pipeline.d.ts +13 -0
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -0
- package/dist/src/scripts/validation/pipeline.js +126 -0
- package/dist/src/scripts/validation/pipeline.js.map +1 -0
- package/dist/src/scripts/validation/types.d.ts +128 -0
- package/dist/src/scripts/validation/types.d.ts.map +1 -0
- package/dist/src/scripts/validation/types.js +43 -0
- package/dist/src/scripts/validation/types.js.map +1 -0
- package/dist/src/security/index.d.ts +5 -4
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +8 -2
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/rate-limiter/RateLimiter.d.ts +86 -0
- package/dist/src/security/rate-limiter/RateLimiter.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/RateLimiter.js +260 -0
- package/dist/src/security/rate-limiter/RateLimiter.js.map +1 -0
- package/dist/src/security/rate-limiter/constants.d.ts +15 -0
- package/dist/src/security/rate-limiter/constants.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/constants.js +15 -0
- package/dist/src/security/rate-limiter/constants.js.map +1 -0
- package/dist/src/security/rate-limiter/errors.d.ts +22 -0
- package/dist/src/security/rate-limiter/errors.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/errors.js +32 -0
- package/dist/src/security/rate-limiter/errors.js.map +1 -0
- package/dist/src/security/rate-limiter/index.d.ts +12 -0
- package/dist/src/security/rate-limiter/index.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/index.js +16 -0
- package/dist/src/security/rate-limiter/index.js.map +1 -0
- package/dist/src/security/rate-limiter/metrics-manager.d.ts +55 -0
- package/dist/src/security/rate-limiter/metrics-manager.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/metrics-manager.js +144 -0
- package/dist/src/security/rate-limiter/metrics-manager.js.map +1 -0
- package/dist/src/security/rate-limiter/presets.d.ts +52 -0
- package/dist/src/security/rate-limiter/presets.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/presets.js +53 -0
- package/dist/src/security/rate-limiter/presets.js.map +1 -0
- package/dist/src/security/rate-limiter/queue-manager.d.ts +59 -0
- package/dist/src/security/rate-limiter/queue-manager.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/queue-manager.js +189 -0
- package/dist/src/security/rate-limiter/queue-manager.js.map +1 -0
- package/dist/src/security/rate-limiter/storage.d.ts +34 -0
- package/dist/src/security/rate-limiter/storage.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/storage.js +80 -0
- package/dist/src/security/rate-limiter/storage.js.map +1 -0
- package/dist/src/security/rate-limiter/token-bucket.d.ts +44 -0
- package/dist/src/security/rate-limiter/token-bucket.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/token-bucket.js +99 -0
- package/dist/src/security/rate-limiter/token-bucket.js.map +1 -0
- package/dist/src/security/rate-limiter/types.d.ts +104 -0
- package/dist/src/security/rate-limiter/types.d.ts.map +1 -0
- package/dist/src/security/rate-limiter/types.js +7 -0
- package/dist/src/security/rate-limiter/types.js.map +1 -0
- package/dist/src/security/{scanner.d.ts → scanner/SecurityScanner.d.ts} +5 -62
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -0
- package/dist/src/security/{scanner.js → scanner/SecurityScanner.js} +6 -202
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +11 -0
- package/dist/src/security/scanner/index.d.ts.map +1 -0
- package/dist/src/security/scanner/index.js +14 -0
- package/dist/src/security/scanner/index.js.map +1 -0
- package/dist/src/security/scanner/patterns.d.ts +14 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -0
- package/dist/src/security/scanner/patterns.js +147 -0
- package/dist/src/security/scanner/patterns.js.map +1 -0
- package/dist/src/security/scanner/regex-utils.d.ts +33 -0
- package/dist/src/security/scanner/regex-utils.d.ts.map +1 -0
- package/dist/src/security/scanner/regex-utils.js +41 -0
- package/dist/src/security/scanner/regex-utils.js.map +1 -0
- package/dist/src/security/scanner/types.d.ts +63 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -0
- package/dist/src/security/scanner/types.js +7 -0
- package/dist/src/security/scanner/types.js.map +1 -0
- package/dist/src/security/scanner/weights.d.ts +15 -0
- package/dist/src/security/scanner/weights.d.ts.map +1 -0
- package/dist/src/security/scanner/weights.js +28 -0
- package/dist/src/security/scanner/weights.js.map +1 -0
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +1 -0
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts +5 -168
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +22 -91
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/session/health-checks.d.ts +37 -0
- package/dist/src/session/health-checks.d.ts.map +1 -0
- package/dist/src/session/health-checks.js +64 -0
- package/dist/src/session/health-checks.js.map +1 -0
- package/dist/src/session/health-types.d.ts +78 -0
- package/dist/src/session/health-types.d.ts.map +1 -0
- package/dist/src/session/health-types.js +16 -0
- package/dist/src/session/health-types.js.map +1 -0
- package/dist/src/session/index.d.ts +5 -1
- package/dist/src/session/index.d.ts.map +1 -1
- package/dist/src/session/index.js +9 -0
- package/dist/src/session/index.js.map +1 -1
- package/dist/src/session/metrics-collector.d.ts +23 -0
- package/dist/src/session/metrics-collector.d.ts.map +1 -0
- package/dist/src/session/metrics-collector.js +44 -0
- package/dist/src/session/metrics-collector.js.map +1 -0
- package/dist/src/session/typed-event-emitter.d.ts +70 -0
- package/dist/src/session/typed-event-emitter.d.ts.map +1 -0
- package/dist/src/session/typed-event-emitter.js +79 -0
- package/dist/src/session/typed-event-emitter.js.map +1 -0
- package/dist/src/sources/BaseSourceAdapter.d.ts +1 -1
- package/dist/src/sources/BaseSourceAdapter.d.ts.map +1 -1
- package/dist/src/sources/BaseSourceAdapter.js +2 -2
- package/dist/src/sources/BaseSourceAdapter.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -0
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -0
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +147 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -0
- package/dist/src/telemetry/posthog.js +213 -0
- package/dist/src/telemetry/posthog.js.map +1 -0
- package/dist/src/types/skill.d.ts +3 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +2 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tests/RateLimiter.test.js +4 -4
- package/dist/tests/RateLimiter.test.js.map +1 -1
- package/dist/tests/adapters-factory.test.d.ts +13 -0
- package/dist/tests/adapters-factory.test.d.ts.map +1 -0
- package/dist/tests/adapters-factory.test.js +308 -0
- package/dist/tests/adapters-factory.test.js.map +1 -0
- package/dist/tests/adapters-java.test.d.ts +13 -0
- package/dist/tests/adapters-java.test.d.ts.map +1 -0
- package/dist/tests/adapters-java.test.js +925 -0
- package/dist/tests/adapters-java.test.js.map +1 -0
- package/dist/tests/api/client.validation.test.d.ts +7 -0
- package/dist/tests/api/client.validation.test.d.ts.map +1 -0
- package/dist/tests/api/client.validation.test.js +183 -0
- package/dist/tests/api/client.validation.test.js.map +1 -0
- package/dist/tests/e2e/security/security.e2e.test.js +3 -3
- package/dist/tests/e2e/security/security.e2e.test.js.map +1 -1
- package/dist/tests/language-detector.test.d.ts +13 -0
- package/dist/tests/language-detector.test.d.ts.map +1 -0
- package/dist/tests/language-detector.test.js +674 -0
- package/dist/tests/language-detector.test.js.map +1 -0
- package/dist/tests/telemetry/posthog.test.d.ts +13 -0
- package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
- package/dist/tests/telemetry/posthog.test.js +600 -0
- package/dist/tests/telemetry/posthog.test.js.map +1 -0
- package/package.json +5 -5
- package/dist/src/security/RateLimiter.d.ts +0 -337
- package/dist/src/security/RateLimiter.d.ts.map +0 -1
- package/dist/src/security/RateLimiter.js +0 -782
- package/dist/src/security/RateLimiter.js.map +0 -1
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js.map +0 -1
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1303: Language Router
|
|
3
|
+
* SMI-1337: Added metrics integration
|
|
4
|
+
* SMI-1339: Added factory pattern integration
|
|
5
|
+
* SMI-1340: Added language detection for extensionless files
|
|
6
|
+
*
|
|
7
|
+
* Detects file language and dispatches to appropriate adapter.
|
|
8
|
+
* Manages adapter registry and provides unified access to framework rules.
|
|
9
|
+
*
|
|
10
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
11
|
+
* @module analysis/router
|
|
12
|
+
*/
|
|
13
|
+
import path from 'path';
|
|
14
|
+
import { AdapterFactory } from './adapters/factory.js';
|
|
15
|
+
import { getAnalysisMetrics } from './metrics.js';
|
|
16
|
+
import { LanguageDetector } from './language-detector.js';
|
|
17
|
+
/**
|
|
18
|
+
* Routes files to appropriate language adapters
|
|
19
|
+
*
|
|
20
|
+
* Manages a registry of language adapters and provides:
|
|
21
|
+
* - File extension to adapter mapping
|
|
22
|
+
* - Aggregated framework detection rules
|
|
23
|
+
* - Unified parsing interface
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const router = new LanguageRouter()
|
|
28
|
+
*
|
|
29
|
+
* // Register adapters
|
|
30
|
+
* router.registerAdapter(new TypeScriptAdapter())
|
|
31
|
+
* router.registerAdapter(new PythonAdapter())
|
|
32
|
+
*
|
|
33
|
+
* // Route files to appropriate adapter
|
|
34
|
+
* const adapter = router.getAdapter('src/main.py')
|
|
35
|
+
* const result = adapter.parseFile(content, 'src/main.py')
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export class LanguageRouter {
|
|
39
|
+
adapters = new Map();
|
|
40
|
+
extensionMap = new Map();
|
|
41
|
+
throwOnUnsupported;
|
|
42
|
+
metrics;
|
|
43
|
+
languageDetector;
|
|
44
|
+
enableLanguageDetection;
|
|
45
|
+
constructor(options = {}) {
|
|
46
|
+
this.throwOnUnsupported = options.throwOnUnsupported ?? false;
|
|
47
|
+
this.metrics = options.metrics ?? getAnalysisMetrics();
|
|
48
|
+
this.enableLanguageDetection = options.enableLanguageDetection ?? true;
|
|
49
|
+
// Initialize language detector if enabled
|
|
50
|
+
if (this.enableLanguageDetection) {
|
|
51
|
+
this.languageDetector = new LanguageDetector({
|
|
52
|
+
minConfidence: options.detectionMinConfidence ?? 0.5,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.languageDetector = null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create a LanguageRouter with all adapters pre-registered
|
|
61
|
+
*
|
|
62
|
+
* Uses AdapterFactory to create adapters for all supported languages.
|
|
63
|
+
*
|
|
64
|
+
* @param options - Router options
|
|
65
|
+
* @returns Configured LanguageRouter
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* // Create router with all language adapters
|
|
70
|
+
* const router = LanguageRouter.createWithAllAdapters()
|
|
71
|
+
*
|
|
72
|
+
* // Create router with specific languages only
|
|
73
|
+
* const router2 = LanguageRouter.createWithAllAdapters({
|
|
74
|
+
* languages: ['typescript', 'python']
|
|
75
|
+
* })
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
static createWithAllAdapters(options = {}) {
|
|
79
|
+
const router = new LanguageRouter(options);
|
|
80
|
+
// Determine which languages to register
|
|
81
|
+
const languages = options.languages ?? AdapterFactory.getSupportedLanguages();
|
|
82
|
+
// Create and register adapters using factory
|
|
83
|
+
const adapters = AdapterFactory.createAdapters(languages);
|
|
84
|
+
for (const adapter of adapters.values()) {
|
|
85
|
+
router.registerAdapter(adapter);
|
|
86
|
+
}
|
|
87
|
+
return router;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a LanguageRouter using cached adapters from factory
|
|
91
|
+
*
|
|
92
|
+
* Reuses adapter instances from the factory cache for efficiency.
|
|
93
|
+
*
|
|
94
|
+
* @param options - Router options
|
|
95
|
+
* @returns Configured LanguageRouter
|
|
96
|
+
*/
|
|
97
|
+
static createWithCachedAdapters(options = {}) {
|
|
98
|
+
const router = new LanguageRouter(options);
|
|
99
|
+
// Determine which languages to register
|
|
100
|
+
const languages = options.languages ?? AdapterFactory.getSupportedLanguages();
|
|
101
|
+
// Use cached adapters from factory
|
|
102
|
+
for (const language of languages) {
|
|
103
|
+
const adapter = AdapterFactory.createCachedAdapter(language);
|
|
104
|
+
router.registerAdapter(adapter);
|
|
105
|
+
}
|
|
106
|
+
return router;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Register a language adapter
|
|
110
|
+
*
|
|
111
|
+
* The adapter's extensions are mapped for fast lookup.
|
|
112
|
+
* If an adapter for the same language exists, it is replaced.
|
|
113
|
+
*
|
|
114
|
+
* @param adapter - Adapter to register
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* router.registerAdapter(new PythonAdapter())
|
|
119
|
+
* // Now handles .py, .pyi, .pyw files
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
registerAdapter(adapter) {
|
|
123
|
+
// Store by language
|
|
124
|
+
const existing = this.adapters.get(adapter.language);
|
|
125
|
+
if (existing) {
|
|
126
|
+
// Remove old extension mappings
|
|
127
|
+
for (const ext of existing.extensions) {
|
|
128
|
+
this.extensionMap.delete(ext.toLowerCase());
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
this.adapters.set(adapter.language, adapter);
|
|
132
|
+
// Map extensions to adapter
|
|
133
|
+
for (const ext of adapter.extensions) {
|
|
134
|
+
this.extensionMap.set(ext.toLowerCase(), adapter);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Unregister a language adapter
|
|
139
|
+
*
|
|
140
|
+
* @param language - Language to unregister
|
|
141
|
+
* @returns True if adapter was found and removed
|
|
142
|
+
*/
|
|
143
|
+
unregisterAdapter(language) {
|
|
144
|
+
const adapter = this.adapters.get(language);
|
|
145
|
+
if (!adapter)
|
|
146
|
+
return false;
|
|
147
|
+
// Remove extension mappings
|
|
148
|
+
for (const ext of adapter.extensions) {
|
|
149
|
+
this.extensionMap.delete(ext.toLowerCase());
|
|
150
|
+
}
|
|
151
|
+
this.adapters.delete(language);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get adapter for a file path
|
|
156
|
+
*
|
|
157
|
+
* @param filePath - Path to the file
|
|
158
|
+
* @returns Adapter that can handle the file
|
|
159
|
+
* @throws Error if no adapter found and throwOnUnsupported is true
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```typescript
|
|
163
|
+
* const adapter = router.getAdapter('src/main.py')
|
|
164
|
+
* // Returns PythonAdapter
|
|
165
|
+
*
|
|
166
|
+
* const adapter2 = router.getAdapter('unknown.xyz')
|
|
167
|
+
* // Throws if throwOnUnsupported, otherwise returns null
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
getAdapter(filePath) {
|
|
171
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
172
|
+
const adapter = this.extensionMap.get(ext);
|
|
173
|
+
if (!adapter) {
|
|
174
|
+
if (this.throwOnUnsupported) {
|
|
175
|
+
throw new Error(`No adapter registered for extension: ${ext}. ` +
|
|
176
|
+
`Supported extensions: ${this.getSupportedExtensions().join(', ')}`);
|
|
177
|
+
}
|
|
178
|
+
// Return a no-op adapter for unsupported files
|
|
179
|
+
throw new Error(`No adapter registered for extension: ${ext}`);
|
|
180
|
+
}
|
|
181
|
+
return adapter;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Try to get adapter for a file path (returns null instead of throwing)
|
|
185
|
+
*
|
|
186
|
+
* SMI-1340: For extensionless files, attempts language detection
|
|
187
|
+
* from content if provided and detection is enabled.
|
|
188
|
+
*
|
|
189
|
+
* @param filePath - Path to the file
|
|
190
|
+
* @param content - Optional file content for language detection
|
|
191
|
+
* @returns Adapter or null if not supported
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```typescript
|
|
195
|
+
* // With extension - uses extension mapping
|
|
196
|
+
* const adapter = router.tryGetAdapter('main.py')
|
|
197
|
+
*
|
|
198
|
+
* // Without extension - attempts content detection
|
|
199
|
+
* const adapter2 = router.tryGetAdapter('Makefile', 'package main\n...')
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
tryGetAdapter(filePath, content) {
|
|
203
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
204
|
+
// Try extension-based lookup first
|
|
205
|
+
const adapter = this.extensionMap.get(ext);
|
|
206
|
+
if (adapter) {
|
|
207
|
+
return adapter;
|
|
208
|
+
}
|
|
209
|
+
// For extensionless files, try language detection if content provided
|
|
210
|
+
if (!ext && content && this.languageDetector) {
|
|
211
|
+
const detection = this.detectLanguageFromContent(content);
|
|
212
|
+
if (detection.language) {
|
|
213
|
+
return this.adapters.get(detection.language) ?? null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Detect language from file content
|
|
220
|
+
*
|
|
221
|
+
* Uses heuristics to determine the language of a file:
|
|
222
|
+
* - Shebang analysis (#!/usr/bin/python, etc.)
|
|
223
|
+
* - Content patterns (import statements, syntax markers)
|
|
224
|
+
* - Statistical keyword analysis
|
|
225
|
+
*
|
|
226
|
+
* @param content - File content to analyze
|
|
227
|
+
* @returns Detection result with language and confidence
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```typescript
|
|
231
|
+
* const result = router.detectLanguageFromContent('#!/usr/bin/env python3\nprint("hello")')
|
|
232
|
+
* // { language: 'python', confidence: 1.0, method: 'shebang', evidence: [...] }
|
|
233
|
+
* ```
|
|
234
|
+
*/
|
|
235
|
+
detectLanguageFromContent(content) {
|
|
236
|
+
if (!this.languageDetector) {
|
|
237
|
+
return {
|
|
238
|
+
language: null,
|
|
239
|
+
confidence: 0,
|
|
240
|
+
method: 'none',
|
|
241
|
+
evidence: ['Language detection disabled'],
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
return this.languageDetector.detect(content);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Try to get adapter using content detection
|
|
248
|
+
*
|
|
249
|
+
* Specifically for extensionless files where content-based
|
|
250
|
+
* detection is required.
|
|
251
|
+
*
|
|
252
|
+
* @param content - File content to analyze
|
|
253
|
+
* @returns Object with adapter and detection result
|
|
254
|
+
*/
|
|
255
|
+
tryGetAdapterFromContent(content) {
|
|
256
|
+
const detection = this.detectLanguageFromContent(content);
|
|
257
|
+
if (detection.language) {
|
|
258
|
+
const adapter = this.adapters.get(detection.language) ?? null;
|
|
259
|
+
return { adapter, detection };
|
|
260
|
+
}
|
|
261
|
+
return { adapter: null, detection };
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Check if a file can be handled
|
|
265
|
+
*
|
|
266
|
+
* @param filePath - Path to check
|
|
267
|
+
* @returns True if an adapter is registered for this file type
|
|
268
|
+
*
|
|
269
|
+
* @example
|
|
270
|
+
* ```typescript
|
|
271
|
+
* router.canHandle('main.py') // true (if Python adapter registered)
|
|
272
|
+
* router.canHandle('main.xyz') // false
|
|
273
|
+
* ```
|
|
274
|
+
*/
|
|
275
|
+
canHandle(filePath) {
|
|
276
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
277
|
+
return this.extensionMap.has(ext);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Get language for a file path
|
|
281
|
+
*
|
|
282
|
+
* @param filePath - Path to check
|
|
283
|
+
* @returns Language or null if not supported
|
|
284
|
+
*/
|
|
285
|
+
getLanguage(filePath) {
|
|
286
|
+
const adapter = this.tryGetAdapter(filePath);
|
|
287
|
+
return adapter?.language ?? null;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Parse a file using the appropriate adapter
|
|
291
|
+
*
|
|
292
|
+
* Convenience method that combines getAdapter and parseFile.
|
|
293
|
+
* SMI-1337: Records metrics for file parsing.
|
|
294
|
+
*
|
|
295
|
+
* @param content - File content
|
|
296
|
+
* @param filePath - Path to the file
|
|
297
|
+
* @returns Parse result
|
|
298
|
+
* @throws Error if no adapter for file type
|
|
299
|
+
*/
|
|
300
|
+
parseFile(content, filePath) {
|
|
301
|
+
const adapter = this.getAdapter(filePath);
|
|
302
|
+
const language = adapter.language;
|
|
303
|
+
const start = performance.now();
|
|
304
|
+
try {
|
|
305
|
+
const result = adapter.parseFile(content, filePath);
|
|
306
|
+
this.metrics.recordFileParsed(language);
|
|
307
|
+
return result;
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
this.metrics.recordError('parse_error', language);
|
|
311
|
+
throw error;
|
|
312
|
+
}
|
|
313
|
+
finally {
|
|
314
|
+
const duration = performance.now() - start;
|
|
315
|
+
this.metrics.recordParseDuration(language, duration);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get list of supported languages
|
|
320
|
+
*
|
|
321
|
+
* @returns Array of registered languages
|
|
322
|
+
*/
|
|
323
|
+
getSupportedLanguages() {
|
|
324
|
+
return Array.from(this.adapters.keys());
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Get list of supported file extensions
|
|
328
|
+
*
|
|
329
|
+
* @returns Array of extensions (with dot)
|
|
330
|
+
*/
|
|
331
|
+
getSupportedExtensions() {
|
|
332
|
+
return Array.from(this.extensionMap.keys());
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Get adapter for a specific language
|
|
336
|
+
*
|
|
337
|
+
* @param language - Language to get adapter for
|
|
338
|
+
* @returns Adapter or undefined if not registered
|
|
339
|
+
*/
|
|
340
|
+
getAdapterByLanguage(language) {
|
|
341
|
+
return this.adapters.get(language);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Get all framework detection rules from all adapters
|
|
345
|
+
*
|
|
346
|
+
* Aggregates rules from all registered adapters for
|
|
347
|
+
* comprehensive framework detection.
|
|
348
|
+
*
|
|
349
|
+
* @returns Combined array of framework rules
|
|
350
|
+
*
|
|
351
|
+
* @example
|
|
352
|
+
* ```typescript
|
|
353
|
+
* const rules = router.getAllFrameworkRules()
|
|
354
|
+
* // Includes rules for React, Django, Gin, Actix, etc.
|
|
355
|
+
* ```
|
|
356
|
+
*/
|
|
357
|
+
getAllFrameworkRules() {
|
|
358
|
+
const rules = [];
|
|
359
|
+
for (const adapter of this.adapters.values()) {
|
|
360
|
+
rules.push(...adapter.getFrameworkRules());
|
|
361
|
+
}
|
|
362
|
+
return rules;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Get framework rules for a specific language
|
|
366
|
+
*
|
|
367
|
+
* @param language - Language to get rules for
|
|
368
|
+
* @returns Framework rules or empty array
|
|
369
|
+
*/
|
|
370
|
+
getFrameworkRules(language) {
|
|
371
|
+
const adapter = this.adapters.get(language);
|
|
372
|
+
return adapter?.getFrameworkRules() ?? [];
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get number of registered adapters
|
|
376
|
+
*/
|
|
377
|
+
get adapterCount() {
|
|
378
|
+
return this.adapters.size;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Clean up all adapters
|
|
382
|
+
*
|
|
383
|
+
* Disposes all registered adapters and clears the registry.
|
|
384
|
+
*/
|
|
385
|
+
dispose() {
|
|
386
|
+
for (const adapter of this.adapters.values()) {
|
|
387
|
+
try {
|
|
388
|
+
adapter.dispose();
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
// Ignore errors during cleanup
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
this.adapters.clear();
|
|
395
|
+
this.extensionMap.clear();
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/analysis/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1309: Tree Cache for Incremental Parsing
|
|
3
|
+
*
|
|
4
|
+
* LRU cache for parsed AST trees to enable fast incremental updates.
|
|
5
|
+
* Manages tree lifecycle independently from parse result caching.
|
|
6
|
+
*
|
|
7
|
+
* Tree-sitter trees hold native resources and must be explicitly
|
|
8
|
+
* deleted to free memory. This cache handles that lifecycle.
|
|
9
|
+
*
|
|
10
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
11
|
+
* @module analysis/tree-cache
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Cached tree entry with metadata
|
|
15
|
+
*/
|
|
16
|
+
export interface CachedTree {
|
|
17
|
+
/** Tree-sitter Tree object (typed as unknown for flexibility) */
|
|
18
|
+
tree: unknown;
|
|
19
|
+
/** Version number for LRU tracking */
|
|
20
|
+
version: number;
|
|
21
|
+
/** SHA-256 hash prefix of content (for validation) */
|
|
22
|
+
contentHash: string;
|
|
23
|
+
/** Timestamp when entry was created */
|
|
24
|
+
createdAt: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Cache statistics for monitoring
|
|
28
|
+
*/
|
|
29
|
+
export interface TreeCacheStats {
|
|
30
|
+
/** Current number of cached trees */
|
|
31
|
+
size: number;
|
|
32
|
+
/** Maximum trees allowed */
|
|
33
|
+
maxSize: number;
|
|
34
|
+
/** Hit rate (0-1) since last reset */
|
|
35
|
+
hitRate: number;
|
|
36
|
+
/** Oldest tree version in cache */
|
|
37
|
+
oldestVersion: number;
|
|
38
|
+
/** Newest tree version in cache */
|
|
39
|
+
newestVersion: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Options for TreeCache
|
|
43
|
+
*/
|
|
44
|
+
export interface TreeCacheOptions {
|
|
45
|
+
/** Maximum number of trees to cache (default: 100) */
|
|
46
|
+
maxTrees?: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* LRU cache for parsed AST trees
|
|
50
|
+
*
|
|
51
|
+
* Manages tree-sitter tree instances with proper lifecycle handling.
|
|
52
|
+
* Trees require explicit deletion to free native memory.
|
|
53
|
+
*
|
|
54
|
+
* Separate from ParseCache because:
|
|
55
|
+
* 1. Trees have native resources requiring explicit cleanup
|
|
56
|
+
* 2. Tree reuse enables incremental parsing
|
|
57
|
+
* 3. Different eviction strategies may be optimal
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const cache = new TreeCache({ maxTrees: 50 })
|
|
62
|
+
*
|
|
63
|
+
* // Store tree after initial parse
|
|
64
|
+
* const tree = parser.parse(content)
|
|
65
|
+
* cache.set('src/main.ts', tree, hashContent(content))
|
|
66
|
+
*
|
|
67
|
+
* // Later, check if tree is valid for incremental parse
|
|
68
|
+
* if (cache.isValid('src/main.ts', hashContent(newContent))) {
|
|
69
|
+
* // Use cached tree as base
|
|
70
|
+
* const oldTree = cache.get('src/main.ts')
|
|
71
|
+
* oldTree.edit(editInfo)
|
|
72
|
+
* const newTree = parser.parse(newContent, oldTree)
|
|
73
|
+
* }
|
|
74
|
+
*
|
|
75
|
+
* // Cleanup
|
|
76
|
+
* cache.dispose()
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare class TreeCache {
|
|
80
|
+
private trees;
|
|
81
|
+
private readonly maxTrees;
|
|
82
|
+
private version;
|
|
83
|
+
private hits;
|
|
84
|
+
private misses;
|
|
85
|
+
constructor(options?: TreeCacheOptions);
|
|
86
|
+
/**
|
|
87
|
+
* Get cached tree for a file
|
|
88
|
+
*
|
|
89
|
+
* Returns null if no tree is cached for the path.
|
|
90
|
+
* Updates hit/miss statistics.
|
|
91
|
+
*
|
|
92
|
+
* @param filePath - Path to look up
|
|
93
|
+
* @returns Cached tree or null
|
|
94
|
+
*/
|
|
95
|
+
get(filePath: string): unknown | null;
|
|
96
|
+
/**
|
|
97
|
+
* Get full cache entry with metadata
|
|
98
|
+
*
|
|
99
|
+
* @param filePath - Path to look up
|
|
100
|
+
* @returns Full cache entry or undefined
|
|
101
|
+
*/
|
|
102
|
+
getEntry(filePath: string): CachedTree | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Check if cached tree is valid for content
|
|
105
|
+
*
|
|
106
|
+
* Compares content hash to detect if the cached tree
|
|
107
|
+
* can be used as a base for incremental parsing.
|
|
108
|
+
*
|
|
109
|
+
* @param filePath - Path to check
|
|
110
|
+
* @param contentHash - Hash of current content
|
|
111
|
+
* @returns True if tree matches content
|
|
112
|
+
*/
|
|
113
|
+
isValid(filePath: string, contentHash: string): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Get version number for a cached tree
|
|
116
|
+
*
|
|
117
|
+
* @param filePath - Path to look up
|
|
118
|
+
* @returns Version number or null if not cached
|
|
119
|
+
*/
|
|
120
|
+
getVersion(filePath: string): number | null;
|
|
121
|
+
/**
|
|
122
|
+
* Store a tree in cache
|
|
123
|
+
*
|
|
124
|
+
* Evicts oldest entry if at capacity.
|
|
125
|
+
* Properly deletes existing tree before replacement.
|
|
126
|
+
*
|
|
127
|
+
* @param filePath - File path as cache key
|
|
128
|
+
* @param tree - Tree-sitter tree to cache
|
|
129
|
+
* @param contentHash - Hash of content tree was parsed from
|
|
130
|
+
*/
|
|
131
|
+
set(filePath: string, tree: unknown, contentHash: string): void;
|
|
132
|
+
/**
|
|
133
|
+
* Invalidate cached tree for a file
|
|
134
|
+
*
|
|
135
|
+
* Deletes tree to free native memory.
|
|
136
|
+
*
|
|
137
|
+
* @param filePath - Path to invalidate
|
|
138
|
+
*/
|
|
139
|
+
invalidate(filePath: string): void;
|
|
140
|
+
/**
|
|
141
|
+
* Invalidate multiple files
|
|
142
|
+
*
|
|
143
|
+
* @param filePaths - Paths to invalidate
|
|
144
|
+
*/
|
|
145
|
+
invalidateMany(filePaths: string[]): void;
|
|
146
|
+
/**
|
|
147
|
+
* Invalidate files matching a pattern
|
|
148
|
+
*
|
|
149
|
+
* @param pattern - Regex pattern to match file paths
|
|
150
|
+
* @returns Number of entries invalidated
|
|
151
|
+
*/
|
|
152
|
+
invalidatePattern(pattern: RegExp): number;
|
|
153
|
+
/**
|
|
154
|
+
* Check if a file has a cached tree
|
|
155
|
+
*
|
|
156
|
+
* @param filePath - Path to check
|
|
157
|
+
* @returns True if tree is cached
|
|
158
|
+
*/
|
|
159
|
+
has(filePath: string): boolean;
|
|
160
|
+
/**
|
|
161
|
+
* Get current cache size
|
|
162
|
+
*/
|
|
163
|
+
get size(): number;
|
|
164
|
+
/**
|
|
165
|
+
* Get cache statistics
|
|
166
|
+
*
|
|
167
|
+
* @returns Current cache statistics
|
|
168
|
+
*/
|
|
169
|
+
getStats(): TreeCacheStats;
|
|
170
|
+
/**
|
|
171
|
+
* Reset hit/miss counters
|
|
172
|
+
*/
|
|
173
|
+
resetStats(): void;
|
|
174
|
+
/**
|
|
175
|
+
* Clear all cached trees
|
|
176
|
+
*
|
|
177
|
+
* Properly deletes all trees to free native resources.
|
|
178
|
+
*/
|
|
179
|
+
clear(): void;
|
|
180
|
+
/**
|
|
181
|
+
* Dispose of cache and free all resources
|
|
182
|
+
*
|
|
183
|
+
* Call this when the cache is no longer needed.
|
|
184
|
+
*/
|
|
185
|
+
dispose(): void;
|
|
186
|
+
/**
|
|
187
|
+
* Get list of all cached file paths
|
|
188
|
+
*/
|
|
189
|
+
keys(): string[];
|
|
190
|
+
/**
|
|
191
|
+
* Hash content for cache validation
|
|
192
|
+
*
|
|
193
|
+
* @param content - Content to hash
|
|
194
|
+
* @returns SHA-256 hash prefix (16 chars)
|
|
195
|
+
*/
|
|
196
|
+
static hashContent(content: string): string;
|
|
197
|
+
/**
|
|
198
|
+
* Evict the oldest entry from cache
|
|
199
|
+
*/
|
|
200
|
+
private evictOldest;
|
|
201
|
+
/**
|
|
202
|
+
* Safely delete a tree object
|
|
203
|
+
*
|
|
204
|
+
* Handles trees that may or may not have a delete method.
|
|
205
|
+
*/
|
|
206
|
+
private deleteTree;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=tree-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-cache.d.ts","sourceRoot":"","sources":["../../../src/analysis/tree-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,IAAI,EAAE,OAAO,CAAA;IACb,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,IAAI,CAAI;IAChB,OAAO,CAAC,MAAM,CAAI;gBAEN,OAAO,GAAE,gBAAqB;IAI1C;;;;;;;;OAQG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAUrC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIlD;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAKvD;;;;;OAKG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI3C;;;;;;;;;OASG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAqB/D;;;;;;OAMG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQlC;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAMzC;;;;;OAKG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAW1C;;;;;OAKG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;OAIG;IACH,QAAQ,IAAI,cAAc;IAmB1B;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;;;OAIG;IACH,KAAK,IAAI,IAAI;IASb;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI3C;;OAEG;IACH,OAAO,CAAC,WAAW;IAgBnB;;;;OAIG;IACH,OAAO,CAAC,UAAU;CAYnB"}
|