@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,288 @@
|
|
|
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
|
+
import { createHash } from 'crypto';
|
|
14
|
+
/**
|
|
15
|
+
* LRU cache for parsed AST trees
|
|
16
|
+
*
|
|
17
|
+
* Manages tree-sitter tree instances with proper lifecycle handling.
|
|
18
|
+
* Trees require explicit deletion to free native memory.
|
|
19
|
+
*
|
|
20
|
+
* Separate from ParseCache because:
|
|
21
|
+
* 1. Trees have native resources requiring explicit cleanup
|
|
22
|
+
* 2. Tree reuse enables incremental parsing
|
|
23
|
+
* 3. Different eviction strategies may be optimal
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const cache = new TreeCache({ maxTrees: 50 })
|
|
28
|
+
*
|
|
29
|
+
* // Store tree after initial parse
|
|
30
|
+
* const tree = parser.parse(content)
|
|
31
|
+
* cache.set('src/main.ts', tree, hashContent(content))
|
|
32
|
+
*
|
|
33
|
+
* // Later, check if tree is valid for incremental parse
|
|
34
|
+
* if (cache.isValid('src/main.ts', hashContent(newContent))) {
|
|
35
|
+
* // Use cached tree as base
|
|
36
|
+
* const oldTree = cache.get('src/main.ts')
|
|
37
|
+
* oldTree.edit(editInfo)
|
|
38
|
+
* const newTree = parser.parse(newContent, oldTree)
|
|
39
|
+
* }
|
|
40
|
+
*
|
|
41
|
+
* // Cleanup
|
|
42
|
+
* cache.dispose()
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export class TreeCache {
|
|
46
|
+
trees = new Map();
|
|
47
|
+
maxTrees;
|
|
48
|
+
version = 0;
|
|
49
|
+
hits = 0;
|
|
50
|
+
misses = 0;
|
|
51
|
+
constructor(options = {}) {
|
|
52
|
+
this.maxTrees = options.maxTrees ?? 100;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get cached tree for a file
|
|
56
|
+
*
|
|
57
|
+
* Returns null if no tree is cached for the path.
|
|
58
|
+
* Updates hit/miss statistics.
|
|
59
|
+
*
|
|
60
|
+
* @param filePath - Path to look up
|
|
61
|
+
* @returns Cached tree or null
|
|
62
|
+
*/
|
|
63
|
+
get(filePath) {
|
|
64
|
+
const entry = this.trees.get(filePath);
|
|
65
|
+
if (entry) {
|
|
66
|
+
this.hits++;
|
|
67
|
+
return entry.tree;
|
|
68
|
+
}
|
|
69
|
+
this.misses++;
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get full cache entry with metadata
|
|
74
|
+
*
|
|
75
|
+
* @param filePath - Path to look up
|
|
76
|
+
* @returns Full cache entry or undefined
|
|
77
|
+
*/
|
|
78
|
+
getEntry(filePath) {
|
|
79
|
+
return this.trees.get(filePath);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check if cached tree is valid for content
|
|
83
|
+
*
|
|
84
|
+
* Compares content hash to detect if the cached tree
|
|
85
|
+
* can be used as a base for incremental parsing.
|
|
86
|
+
*
|
|
87
|
+
* @param filePath - Path to check
|
|
88
|
+
* @param contentHash - Hash of current content
|
|
89
|
+
* @returns True if tree matches content
|
|
90
|
+
*/
|
|
91
|
+
isValid(filePath, contentHash) {
|
|
92
|
+
const entry = this.trees.get(filePath);
|
|
93
|
+
return entry?.contentHash === contentHash;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get version number for a cached tree
|
|
97
|
+
*
|
|
98
|
+
* @param filePath - Path to look up
|
|
99
|
+
* @returns Version number or null if not cached
|
|
100
|
+
*/
|
|
101
|
+
getVersion(filePath) {
|
|
102
|
+
return this.trees.get(filePath)?.version ?? null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Store a tree in cache
|
|
106
|
+
*
|
|
107
|
+
* Evicts oldest entry if at capacity.
|
|
108
|
+
* Properly deletes existing tree before replacement.
|
|
109
|
+
*
|
|
110
|
+
* @param filePath - File path as cache key
|
|
111
|
+
* @param tree - Tree-sitter tree to cache
|
|
112
|
+
* @param contentHash - Hash of content tree was parsed from
|
|
113
|
+
*/
|
|
114
|
+
set(filePath, tree, contentHash) {
|
|
115
|
+
// Evict oldest if at capacity and this is a new entry
|
|
116
|
+
if (this.trees.size >= this.maxTrees && !this.trees.has(filePath)) {
|
|
117
|
+
this.evictOldest();
|
|
118
|
+
}
|
|
119
|
+
// Delete existing tree to free native memory
|
|
120
|
+
const existing = this.trees.get(filePath);
|
|
121
|
+
if (existing) {
|
|
122
|
+
this.deleteTree(existing.tree);
|
|
123
|
+
}
|
|
124
|
+
this.version++;
|
|
125
|
+
this.trees.set(filePath, {
|
|
126
|
+
tree,
|
|
127
|
+
version: this.version,
|
|
128
|
+
contentHash,
|
|
129
|
+
createdAt: Date.now(),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
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) {
|
|
140
|
+
const entry = this.trees.get(filePath);
|
|
141
|
+
if (entry) {
|
|
142
|
+
this.deleteTree(entry.tree);
|
|
143
|
+
this.trees.delete(filePath);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Invalidate multiple files
|
|
148
|
+
*
|
|
149
|
+
* @param filePaths - Paths to invalidate
|
|
150
|
+
*/
|
|
151
|
+
invalidateMany(filePaths) {
|
|
152
|
+
for (const filePath of filePaths) {
|
|
153
|
+
this.invalidate(filePath);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Invalidate files matching a pattern
|
|
158
|
+
*
|
|
159
|
+
* @param pattern - Regex pattern to match file paths
|
|
160
|
+
* @returns Number of entries invalidated
|
|
161
|
+
*/
|
|
162
|
+
invalidatePattern(pattern) {
|
|
163
|
+
let count = 0;
|
|
164
|
+
for (const filePath of this.trees.keys()) {
|
|
165
|
+
if (pattern.test(filePath)) {
|
|
166
|
+
this.invalidate(filePath);
|
|
167
|
+
count++;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return count;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check if a file has a cached tree
|
|
174
|
+
*
|
|
175
|
+
* @param filePath - Path to check
|
|
176
|
+
* @returns True if tree is cached
|
|
177
|
+
*/
|
|
178
|
+
has(filePath) {
|
|
179
|
+
return this.trees.has(filePath);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get current cache size
|
|
183
|
+
*/
|
|
184
|
+
get size() {
|
|
185
|
+
return this.trees.size;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get cache statistics
|
|
189
|
+
*
|
|
190
|
+
* @returns Current cache statistics
|
|
191
|
+
*/
|
|
192
|
+
getStats() {
|
|
193
|
+
let oldestVersion = Infinity;
|
|
194
|
+
let newestVersion = 0;
|
|
195
|
+
for (const entry of this.trees.values()) {
|
|
196
|
+
if (entry.version < oldestVersion)
|
|
197
|
+
oldestVersion = entry.version;
|
|
198
|
+
if (entry.version > newestVersion)
|
|
199
|
+
newestVersion = entry.version;
|
|
200
|
+
}
|
|
201
|
+
const total = this.hits + this.misses;
|
|
202
|
+
return {
|
|
203
|
+
size: this.trees.size,
|
|
204
|
+
maxSize: this.maxTrees,
|
|
205
|
+
hitRate: total > 0 ? this.hits / total : 0,
|
|
206
|
+
oldestVersion: oldestVersion === Infinity ? 0 : oldestVersion,
|
|
207
|
+
newestVersion,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Reset hit/miss counters
|
|
212
|
+
*/
|
|
213
|
+
resetStats() {
|
|
214
|
+
this.hits = 0;
|
|
215
|
+
this.misses = 0;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Clear all cached trees
|
|
219
|
+
*
|
|
220
|
+
* Properly deletes all trees to free native resources.
|
|
221
|
+
*/
|
|
222
|
+
clear() {
|
|
223
|
+
for (const entry of this.trees.values()) {
|
|
224
|
+
this.deleteTree(entry.tree);
|
|
225
|
+
}
|
|
226
|
+
this.trees.clear();
|
|
227
|
+
this.hits = 0;
|
|
228
|
+
this.misses = 0;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Dispose of cache and free all resources
|
|
232
|
+
*
|
|
233
|
+
* Call this when the cache is no longer needed.
|
|
234
|
+
*/
|
|
235
|
+
dispose() {
|
|
236
|
+
this.clear();
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get list of all cached file paths
|
|
240
|
+
*/
|
|
241
|
+
keys() {
|
|
242
|
+
return Array.from(this.trees.keys());
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Hash content for cache validation
|
|
246
|
+
*
|
|
247
|
+
* @param content - Content to hash
|
|
248
|
+
* @returns SHA-256 hash prefix (16 chars)
|
|
249
|
+
*/
|
|
250
|
+
static hashContent(content) {
|
|
251
|
+
return createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Evict the oldest entry from cache
|
|
255
|
+
*/
|
|
256
|
+
evictOldest() {
|
|
257
|
+
let oldestPath = null;
|
|
258
|
+
let oldestVersion = Infinity;
|
|
259
|
+
for (const [path, entry] of this.trees) {
|
|
260
|
+
if (entry.version < oldestVersion) {
|
|
261
|
+
oldestVersion = entry.version;
|
|
262
|
+
oldestPath = path;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (oldestPath) {
|
|
266
|
+
this.invalidate(oldestPath);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Safely delete a tree object
|
|
271
|
+
*
|
|
272
|
+
* Handles trees that may or may not have a delete method.
|
|
273
|
+
*/
|
|
274
|
+
deleteTree(tree) {
|
|
275
|
+
if (tree && typeof tree === 'object') {
|
|
276
|
+
const maybeTree = tree;
|
|
277
|
+
if (typeof maybeTree.delete === 'function') {
|
|
278
|
+
try {
|
|
279
|
+
maybeTree.delete();
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
// Ignore errors during cleanup
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=tree-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-cache.js","sourceRoot":"","sources":["../../../src/analysis/tree-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1303: Tree-sitter Parser Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages tree-sitter parser instances with lazy loading.
|
|
5
|
+
* Uses web-tree-sitter (WASM) to avoid native module conflicts.
|
|
6
|
+
*
|
|
7
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
8
|
+
* @see ADR-002: Docker glibc Requirement
|
|
9
|
+
* @module analysis/tree-sitter/manager
|
|
10
|
+
*/
|
|
11
|
+
import type { SupportedLanguage } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Parser interface (matches web-tree-sitter API)
|
|
14
|
+
*/
|
|
15
|
+
export interface TreeSitterParser {
|
|
16
|
+
parse(input: string, previousTree?: TreeSitterTree): TreeSitterTree;
|
|
17
|
+
setLanguage(language: TreeSitterLanguage): void;
|
|
18
|
+
delete(): void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Tree interface (matches web-tree-sitter API)
|
|
22
|
+
*/
|
|
23
|
+
export interface TreeSitterTree {
|
|
24
|
+
rootNode: TreeSitterNode;
|
|
25
|
+
delete(): void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Node interface (matches web-tree-sitter API)
|
|
29
|
+
*/
|
|
30
|
+
export interface TreeSitterNode {
|
|
31
|
+
type: string;
|
|
32
|
+
text: string;
|
|
33
|
+
startPosition: {
|
|
34
|
+
row: number;
|
|
35
|
+
column: number;
|
|
36
|
+
};
|
|
37
|
+
endPosition: {
|
|
38
|
+
row: number;
|
|
39
|
+
column: number;
|
|
40
|
+
};
|
|
41
|
+
children: TreeSitterNode[];
|
|
42
|
+
namedChildren: TreeSitterNode[];
|
|
43
|
+
childCount: number;
|
|
44
|
+
namedChildCount: number;
|
|
45
|
+
child(index: number): TreeSitterNode | null;
|
|
46
|
+
namedChild(index: number): TreeSitterNode | null;
|
|
47
|
+
childForFieldName(fieldName: string): TreeSitterNode | null;
|
|
48
|
+
descendantsOfType(types: string | string[]): TreeSitterNode[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Language module interface
|
|
52
|
+
*/
|
|
53
|
+
export interface TreeSitterLanguage {
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Options for TreeSitterManager
|
|
57
|
+
*/
|
|
58
|
+
export interface TreeSitterManagerOptions {
|
|
59
|
+
/** Maximum parsers to cache (default: 6, one per language) */
|
|
60
|
+
maxParsers?: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Manages tree-sitter parser instances with lazy loading
|
|
64
|
+
*
|
|
65
|
+
* Parsers are loaded on-demand and cached for reuse.
|
|
66
|
+
* Uses WASM-based web-tree-sitter to avoid native module issues.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const manager = new TreeSitterManager()
|
|
71
|
+
* const parser = await manager.getParser('python')
|
|
72
|
+
* const tree = parser.parse('def main(): pass')
|
|
73
|
+
* manager.dispose()
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare class TreeSitterManager {
|
|
77
|
+
private parsers;
|
|
78
|
+
private loading;
|
|
79
|
+
private readonly maxParsers;
|
|
80
|
+
private initialized;
|
|
81
|
+
private initPromise;
|
|
82
|
+
private ParserClass;
|
|
83
|
+
private accessOrder;
|
|
84
|
+
constructor(options?: TreeSitterManagerOptions);
|
|
85
|
+
/**
|
|
86
|
+
* SMI-1333: Update access order for LRU tracking
|
|
87
|
+
* Moves the accessed language to the end (most recently used)
|
|
88
|
+
*/
|
|
89
|
+
private updateAccessOrder;
|
|
90
|
+
/**
|
|
91
|
+
* Initialize web-tree-sitter (must be called before first use)
|
|
92
|
+
*
|
|
93
|
+
* This initializes the WASM runtime. Called automatically by getParser().
|
|
94
|
+
*/
|
|
95
|
+
initialize(): Promise<void>;
|
|
96
|
+
private doInitialize;
|
|
97
|
+
/**
|
|
98
|
+
* Get parser for a language, loading if necessary
|
|
99
|
+
*
|
|
100
|
+
* Parsers are cached for reuse. If the maximum number of
|
|
101
|
+
* parsers is reached, the least recently used is evicted.
|
|
102
|
+
*
|
|
103
|
+
* @param language - Language to get parser for
|
|
104
|
+
* @returns Configured parser instance
|
|
105
|
+
* @throws Error if language is not supported or tree-sitter unavailable
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* const parser = await manager.getParser('python')
|
|
110
|
+
* const tree = parser.parse(pythonCode)
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
getParser(language: SupportedLanguage): Promise<TreeSitterParser>;
|
|
114
|
+
/**
|
|
115
|
+
* Load a parser for a specific language
|
|
116
|
+
*/
|
|
117
|
+
private loadParser;
|
|
118
|
+
/**
|
|
119
|
+
* Load the language module for tree-sitter
|
|
120
|
+
*/
|
|
121
|
+
private loadLanguageModule;
|
|
122
|
+
/**
|
|
123
|
+
* Check if a language is available
|
|
124
|
+
*
|
|
125
|
+
* @param language - Language to check
|
|
126
|
+
* @returns True if the language can be loaded
|
|
127
|
+
*/
|
|
128
|
+
isLanguageAvailable(language: SupportedLanguage): Promise<boolean>;
|
|
129
|
+
/**
|
|
130
|
+
* Get list of currently loaded languages
|
|
131
|
+
*/
|
|
132
|
+
getLoadedLanguages(): SupportedLanguage[];
|
|
133
|
+
/**
|
|
134
|
+
* Clean up all parser resources
|
|
135
|
+
*
|
|
136
|
+
* Call this when the manager is no longer needed
|
|
137
|
+
* to free memory and WASM resources.
|
|
138
|
+
*/
|
|
139
|
+
dispose(): void;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,cAAc,GAAG,cAAc,CAAA;IACnE,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAC/C,MAAM,IAAI,IAAI,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,IAAI,IAAI,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,aAAa,EAAE,cAAc,EAAE,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAC3C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAChD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAC3D,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAA;CAC9D;AAED;;GAEG;AAEH,MAAM,WAAW,kBAAkB;CAElC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAsD;IACrE,OAAO,CAAC,OAAO,CAA+D;IAC9E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAA4C;IAE/D,OAAO,CAAC,WAAW,CAA0B;gBAEjC,OAAO,GAAE,wBAA6B;IAIlD;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAYnB,YAAY;IAuB1B;;;;;;;;;;;;;;;OAeG;IACG,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4CvE;;OAEG;YACW,UAAU;IAYxB;;OAEG;YACW,kBAAkB;IA0ChC;;;;;OAKG;IACG,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IASxE;;OAEG;IACH,kBAAkB,IAAI,iBAAiB,EAAE;IAIzC;;;;;OAKG;IACH,OAAO,IAAI,IAAI;CAgBhB"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1303: Tree-sitter Parser Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages tree-sitter parser instances with lazy loading.
|
|
5
|
+
* Uses web-tree-sitter (WASM) to avoid native module conflicts.
|
|
6
|
+
*
|
|
7
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
8
|
+
* @see ADR-002: Docker glibc Requirement
|
|
9
|
+
* @module analysis/tree-sitter/manager
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Manages tree-sitter parser instances with lazy loading
|
|
13
|
+
*
|
|
14
|
+
* Parsers are loaded on-demand and cached for reuse.
|
|
15
|
+
* Uses WASM-based web-tree-sitter to avoid native module issues.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const manager = new TreeSitterManager()
|
|
20
|
+
* const parser = await manager.getParser('python')
|
|
21
|
+
* const tree = parser.parse('def main(): pass')
|
|
22
|
+
* manager.dispose()
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export class TreeSitterManager {
|
|
26
|
+
parsers = new Map();
|
|
27
|
+
loading = new Map();
|
|
28
|
+
maxParsers;
|
|
29
|
+
initialized = false;
|
|
30
|
+
initPromise = null;
|
|
31
|
+
ParserClass = null;
|
|
32
|
+
// SMI-1333: Track access order for proper LRU eviction
|
|
33
|
+
accessOrder = [];
|
|
34
|
+
constructor(options = {}) {
|
|
35
|
+
this.maxParsers = options.maxParsers ?? 6;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* SMI-1333: Update access order for LRU tracking
|
|
39
|
+
* Moves the accessed language to the end (most recently used)
|
|
40
|
+
*/
|
|
41
|
+
updateAccessOrder(language) {
|
|
42
|
+
const index = this.accessOrder.indexOf(language);
|
|
43
|
+
if (index > -1) {
|
|
44
|
+
this.accessOrder.splice(index, 1);
|
|
45
|
+
}
|
|
46
|
+
this.accessOrder.push(language);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Initialize web-tree-sitter (must be called before first use)
|
|
50
|
+
*
|
|
51
|
+
* This initializes the WASM runtime. Called automatically by getParser().
|
|
52
|
+
*/
|
|
53
|
+
async initialize() {
|
|
54
|
+
if (this.initialized)
|
|
55
|
+
return;
|
|
56
|
+
if (this.initPromise) {
|
|
57
|
+
await this.initPromise;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.initPromise = this.doInitialize();
|
|
61
|
+
await this.initPromise;
|
|
62
|
+
}
|
|
63
|
+
async doInitialize() {
|
|
64
|
+
try {
|
|
65
|
+
// Dynamic import for web-tree-sitter (WASM-based)
|
|
66
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
67
|
+
const TreeSitter = await import('web-tree-sitter');
|
|
68
|
+
await TreeSitter.default.init();
|
|
69
|
+
this.ParserClass = TreeSitter.default;
|
|
70
|
+
this.initialized = true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Fallback: try native tree-sitter if WASM unavailable
|
|
74
|
+
try {
|
|
75
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
76
|
+
const TreeSitterNative = await import('tree-sitter');
|
|
77
|
+
this.ParserClass = TreeSitterNative.default;
|
|
78
|
+
this.initialized = true;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
throw new Error('tree-sitter is not available. Install web-tree-sitter or tree-sitter to enable multi-language analysis.');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get parser for a language, loading if necessary
|
|
87
|
+
*
|
|
88
|
+
* Parsers are cached for reuse. If the maximum number of
|
|
89
|
+
* parsers is reached, the least recently used is evicted.
|
|
90
|
+
*
|
|
91
|
+
* @param language - Language to get parser for
|
|
92
|
+
* @returns Configured parser instance
|
|
93
|
+
* @throws Error if language is not supported or tree-sitter unavailable
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* const parser = await manager.getParser('python')
|
|
98
|
+
* const tree = parser.parse(pythonCode)
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
async getParser(language) {
|
|
102
|
+
// Ensure initialized
|
|
103
|
+
await this.initialize();
|
|
104
|
+
// Return cached parser
|
|
105
|
+
const cached = this.parsers.get(language);
|
|
106
|
+
if (cached) {
|
|
107
|
+
// SMI-1333: Update access order on cache hit
|
|
108
|
+
this.updateAccessOrder(language);
|
|
109
|
+
return cached;
|
|
110
|
+
}
|
|
111
|
+
// Return in-progress load
|
|
112
|
+
const loading = this.loading.get(language);
|
|
113
|
+
if (loading) {
|
|
114
|
+
return loading;
|
|
115
|
+
}
|
|
116
|
+
// Start new load
|
|
117
|
+
const loadPromise = this.loadParser(language);
|
|
118
|
+
this.loading.set(language, loadPromise);
|
|
119
|
+
try {
|
|
120
|
+
const parser = await loadPromise;
|
|
121
|
+
// SMI-1333: Evict LRU (first in accessOrder) if at capacity
|
|
122
|
+
if (this.parsers.size >= this.maxParsers) {
|
|
123
|
+
const lru = this.accessOrder.shift();
|
|
124
|
+
if (lru) {
|
|
125
|
+
const oldParser = this.parsers.get(lru);
|
|
126
|
+
oldParser?.delete();
|
|
127
|
+
this.parsers.delete(lru);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
this.parsers.set(language, parser);
|
|
131
|
+
// SMI-1333: Track new parser in access order
|
|
132
|
+
this.updateAccessOrder(language);
|
|
133
|
+
return parser;
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
this.loading.delete(language);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Load a parser for a specific language
|
|
141
|
+
*/
|
|
142
|
+
async loadParser(language) {
|
|
143
|
+
if (!this.ParserClass) {
|
|
144
|
+
throw new Error('TreeSitterManager not initialized. Call initialize() first.');
|
|
145
|
+
}
|
|
146
|
+
const parser = new this.ParserClass();
|
|
147
|
+
const languageModule = await this.loadLanguageModule(language);
|
|
148
|
+
parser.setLanguage(languageModule);
|
|
149
|
+
return parser;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Load the language module for tree-sitter
|
|
153
|
+
*/
|
|
154
|
+
async loadLanguageModule(language) {
|
|
155
|
+
try {
|
|
156
|
+
switch (language) {
|
|
157
|
+
case 'typescript':
|
|
158
|
+
case 'javascript': {
|
|
159
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
160
|
+
const mod = await import('tree-sitter-typescript');
|
|
161
|
+
// tree-sitter-typescript exports { typescript, tsx }
|
|
162
|
+
return mod.typescript;
|
|
163
|
+
}
|
|
164
|
+
case 'python': {
|
|
165
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
166
|
+
const mod = await import('tree-sitter-python');
|
|
167
|
+
return mod.default;
|
|
168
|
+
}
|
|
169
|
+
case 'go': {
|
|
170
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
171
|
+
const mod = await import('tree-sitter-go');
|
|
172
|
+
return mod.default;
|
|
173
|
+
}
|
|
174
|
+
case 'rust': {
|
|
175
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
176
|
+
const mod = await import('tree-sitter-rust');
|
|
177
|
+
return mod.default;
|
|
178
|
+
}
|
|
179
|
+
case 'java': {
|
|
180
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
181
|
+
const mod = await import('tree-sitter-java');
|
|
182
|
+
return mod.default;
|
|
183
|
+
}
|
|
184
|
+
default:
|
|
185
|
+
throw new Error(`Unsupported language: ${language}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
const err = error;
|
|
190
|
+
throw new Error(`Failed to load tree-sitter language module for ${language}: ${err.message}. ` +
|
|
191
|
+
`Make sure tree-sitter-${language} is installed.`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Check if a language is available
|
|
196
|
+
*
|
|
197
|
+
* @param language - Language to check
|
|
198
|
+
* @returns True if the language can be loaded
|
|
199
|
+
*/
|
|
200
|
+
async isLanguageAvailable(language) {
|
|
201
|
+
try {
|
|
202
|
+
await this.loadLanguageModule(language);
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get list of currently loaded languages
|
|
211
|
+
*/
|
|
212
|
+
getLoadedLanguages() {
|
|
213
|
+
return Array.from(this.parsers.keys());
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Clean up all parser resources
|
|
217
|
+
*
|
|
218
|
+
* Call this when the manager is no longer needed
|
|
219
|
+
* to free memory and WASM resources.
|
|
220
|
+
*/
|
|
221
|
+
dispose() {
|
|
222
|
+
for (const parser of this.parsers.values()) {
|
|
223
|
+
try {
|
|
224
|
+
parser.delete();
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Ignore errors during cleanup
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
this.parsers.clear();
|
|
231
|
+
this.loading.clear();
|
|
232
|
+
// SMI-1333: Clear access order
|
|
233
|
+
this.accessOrder = [];
|
|
234
|
+
this.initialized = false;
|
|
235
|
+
this.initPromise = null;
|
|
236
|
+
this.ParserClass = null;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/manager.ts"],"names":[],"mappings":"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"}
|