@skillsmith/core 0.2.0 → 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/__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/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 +25 -3
- package/dist/src/analysis/index.d.ts.map +1 -1
- package/dist/src/analysis/index.js +45 -3
- 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/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 +69 -6
- package/dist/src/analysis/types.d.ts.map +1 -1
- package/dist/src/analysis/types.js +23 -2
- package/dist/src/analysis/types.js.map +1 -1
- 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/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 +24 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js +50 -2
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +132 -2
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +214 -18
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +7 -0
- package/dist/src/api/index.js.map +1 -1
- 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/memory/MemoryProfiler.d.ts.map +1 -1
- package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
- 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 +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -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/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.map +1 -1
- package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
- package/dist/src/repositories/quarantine/query-builder.js +1 -1
- package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/github-import/index.js.map +1 -1
- package/dist/src/scripts/import-github-skills.js +1 -1
- package/dist/src/scripts/import-github-skills.js.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
- package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
- package/dist/src/scripts/validation/index.js +1 -2
- package/dist/src/scripts/validation/index.js.map +1 -1
- package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
- package/dist/src/scripts/validation/pipeline.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +2 -2
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- 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 +1 -1
- package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
- package/dist/src/session/SessionHealthMonitor.js +1 -1
- package/dist/src/session/SessionHealthMonitor.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +27 -5
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +20 -5
- package/dist/src/telemetry/posthog.js.map +1 -1
- 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/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/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 -6
- 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 +0 -151
- package/dist/src/security/scanner.d.ts.map +0 -1
- package/dist/src/security/scanner.js +0 -599
- package/dist/src/security/scanner.js.map +0 -1
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1304: Python Language Adapter
|
|
3
|
+
*
|
|
4
|
+
* Parses Python source files (.py, .pyi, .pyw) and extracts
|
|
5
|
+
* imports, exports, and function definitions using regex-based
|
|
6
|
+
* parsing with optional tree-sitter support for incremental parsing.
|
|
7
|
+
*
|
|
8
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
9
|
+
*/
|
|
10
|
+
import { LanguageAdapter } from './base.js';
|
|
11
|
+
/**
|
|
12
|
+
* Python adapter using regex-based parsing with optional tree-sitter
|
|
13
|
+
*
|
|
14
|
+
* The adapter provides:
|
|
15
|
+
* - Synchronous regex-based parsing for basic analysis
|
|
16
|
+
* - Async tree-sitter parsing for enhanced accuracy (when available)
|
|
17
|
+
* - Framework detection rules for Django, FastAPI, Flask, etc.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const adapter = new PythonAdapter()
|
|
22
|
+
*
|
|
23
|
+
* const result = adapter.parseFile(`
|
|
24
|
+
* import os
|
|
25
|
+
* from django.http import HttpResponse
|
|
26
|
+
*
|
|
27
|
+
* def hello(request):
|
|
28
|
+
* return HttpResponse("Hello")
|
|
29
|
+
* `, 'views.py')
|
|
30
|
+
*
|
|
31
|
+
* console.log(result.imports) // [{ module: 'os', ... }, { module: 'django.http', ... }]
|
|
32
|
+
* console.log(result.functions) // [{ name: 'hello', ... }]
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class PythonAdapter extends LanguageAdapter {
|
|
36
|
+
language = 'python';
|
|
37
|
+
extensions = ['.py', '.pyi', '.pyw'];
|
|
38
|
+
parser = null;
|
|
39
|
+
parserInitialized = false;
|
|
40
|
+
parserInitPromise = null;
|
|
41
|
+
/**
|
|
42
|
+
* Initialize the tree-sitter parser (lazy loaded)
|
|
43
|
+
*
|
|
44
|
+
* This method is called automatically when using parseFileAsync.
|
|
45
|
+
* Tree-sitter provides more accurate parsing but requires WASM modules.
|
|
46
|
+
*/
|
|
47
|
+
async initParser() {
|
|
48
|
+
if (this.parserInitialized)
|
|
49
|
+
return;
|
|
50
|
+
if (this.parserInitPromise)
|
|
51
|
+
return this.parserInitPromise;
|
|
52
|
+
this.parserInitPromise = this.doInitParser();
|
|
53
|
+
await this.parserInitPromise;
|
|
54
|
+
}
|
|
55
|
+
async doInitParser() {
|
|
56
|
+
try {
|
|
57
|
+
// Lazy load web-tree-sitter (optional dependency)
|
|
58
|
+
// @ts-expect-error - Optional dependency, may not have type declarations
|
|
59
|
+
const treeSitterModule = await import('web-tree-sitter').catch(() => null);
|
|
60
|
+
if (!treeSitterModule) {
|
|
61
|
+
// Tree-sitter not available, will use regex fallback
|
|
62
|
+
this.parserInitialized = false;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const Parser = treeSitterModule.default;
|
|
66
|
+
await Parser.init();
|
|
67
|
+
this.parser = new Parser();
|
|
68
|
+
// Load Python language WASM
|
|
69
|
+
// Note: The WASM file path would need to be provided via configuration
|
|
70
|
+
// For now, we use a relative path that works in typical setups
|
|
71
|
+
const wasmPath = 'tree-sitter-python.wasm';
|
|
72
|
+
const Python = await Parser.Language.load(wasmPath);
|
|
73
|
+
this.parser.setLanguage(Python);
|
|
74
|
+
this.parserInitialized = true;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
// Tree-sitter not available, will use regex fallback
|
|
78
|
+
console.warn('[PythonAdapter] tree-sitter initialization failed, using regex fallback:', error instanceof Error ? error.message : String(error));
|
|
79
|
+
this.parserInitialized = false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Parse a Python file using regex-based parsing
|
|
84
|
+
*
|
|
85
|
+
* @param content - Python source code
|
|
86
|
+
* @param filePath - Path to the file (for source tracking)
|
|
87
|
+
* @returns Parsed imports, exports, and functions
|
|
88
|
+
*/
|
|
89
|
+
parseFile(content, filePath) {
|
|
90
|
+
return this.parseWithRegex(content, filePath);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Parse a Python file asynchronously with tree-sitter (if available)
|
|
94
|
+
*
|
|
95
|
+
* Falls back to regex parsing if tree-sitter is not available.
|
|
96
|
+
*
|
|
97
|
+
* @param content - Python source code
|
|
98
|
+
* @param filePath - Path to the file (for source tracking)
|
|
99
|
+
* @returns Promise resolving to parsed imports, exports, and functions
|
|
100
|
+
*/
|
|
101
|
+
async parseFileAsync(content, filePath) {
|
|
102
|
+
if (!this.parserInitialized && !this.parserInitPromise) {
|
|
103
|
+
await this.initParser();
|
|
104
|
+
}
|
|
105
|
+
else if (this.parserInitPromise) {
|
|
106
|
+
await this.parserInitPromise;
|
|
107
|
+
}
|
|
108
|
+
if (this.parser && this.parserInitialized) {
|
|
109
|
+
return this.parseWithTreeSitter(content, filePath);
|
|
110
|
+
}
|
|
111
|
+
return this.parseWithRegex(content, filePath);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Parse file incrementally using previous parse tree
|
|
115
|
+
*
|
|
116
|
+
* Currently falls back to full regex parsing. Tree-sitter
|
|
117
|
+
* incremental parsing will be implemented in SMI-1309.
|
|
118
|
+
*
|
|
119
|
+
* @param content - Updated Python source code
|
|
120
|
+
* @param filePath - Path to the file
|
|
121
|
+
* @param _previousTree - Previous parse tree (not yet used)
|
|
122
|
+
* @returns Parsed imports, exports, and functions
|
|
123
|
+
*/
|
|
124
|
+
parseIncremental(content, filePath, _previousTree) {
|
|
125
|
+
// TODO: SMI-1309 - Implement incremental parsing with tree-sitter
|
|
126
|
+
return this.parseFile(content, filePath);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get Python framework detection rules
|
|
130
|
+
*
|
|
131
|
+
* Detects common Python frameworks and libraries including:
|
|
132
|
+
* - Web frameworks: Django, FastAPI, Flask
|
|
133
|
+
* - Testing: pytest
|
|
134
|
+
* - Data science: pandas, numpy
|
|
135
|
+
* - Databases: SQLAlchemy
|
|
136
|
+
* - Task queues: Celery
|
|
137
|
+
*
|
|
138
|
+
* @returns Array of framework detection rules
|
|
139
|
+
*/
|
|
140
|
+
getFrameworkRules() {
|
|
141
|
+
return [
|
|
142
|
+
{
|
|
143
|
+
name: 'Django',
|
|
144
|
+
depIndicators: ['django', 'Django'],
|
|
145
|
+
importIndicators: ['django', 'django.db', 'django.http', 'django.views', 'django.urls'],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: 'FastAPI',
|
|
149
|
+
depIndicators: ['fastapi'],
|
|
150
|
+
importIndicators: ['fastapi', 'starlette', 'pydantic'],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: 'Flask',
|
|
154
|
+
depIndicators: ['flask', 'Flask'],
|
|
155
|
+
importIndicators: ['flask', 'flask_restful', 'flask_sqlalchemy'],
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
name: 'pytest',
|
|
159
|
+
depIndicators: ['pytest'],
|
|
160
|
+
importIndicators: ['pytest', 'pytest_asyncio', '_pytest'],
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: 'pandas',
|
|
164
|
+
depIndicators: ['pandas'],
|
|
165
|
+
importIndicators: ['pandas', 'pd'],
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: 'numpy',
|
|
169
|
+
depIndicators: ['numpy'],
|
|
170
|
+
importIndicators: ['numpy', 'np'],
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: 'SQLAlchemy',
|
|
174
|
+
depIndicators: ['sqlalchemy', 'SQLAlchemy'],
|
|
175
|
+
importIndicators: ['sqlalchemy', 'sqlalchemy.orm', 'sqlalchemy.ext'],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
name: 'Celery',
|
|
179
|
+
depIndicators: ['celery'],
|
|
180
|
+
importIndicators: ['celery', 'celery.task'],
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: 'Requests',
|
|
184
|
+
depIndicators: ['requests'],
|
|
185
|
+
importIndicators: ['requests'],
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: 'aiohttp',
|
|
189
|
+
depIndicators: ['aiohttp'],
|
|
190
|
+
importIndicators: ['aiohttp'],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: 'Scrapy',
|
|
194
|
+
depIndicators: ['scrapy'],
|
|
195
|
+
importIndicators: ['scrapy'],
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: 'TensorFlow',
|
|
199
|
+
depIndicators: ['tensorflow', 'tensorflow-gpu'],
|
|
200
|
+
importIndicators: ['tensorflow', 'tf'],
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: 'PyTorch',
|
|
204
|
+
depIndicators: ['torch', 'pytorch'],
|
|
205
|
+
importIndicators: ['torch', 'torch.nn', 'torchvision'],
|
|
206
|
+
},
|
|
207
|
+
];
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Clean up resources
|
|
211
|
+
*/
|
|
212
|
+
dispose() {
|
|
213
|
+
if (this.parser && typeof this.parser.delete === 'function') {
|
|
214
|
+
;
|
|
215
|
+
this.parser.delete();
|
|
216
|
+
}
|
|
217
|
+
this.parser = null;
|
|
218
|
+
this.parserInitialized = false;
|
|
219
|
+
this.parserInitPromise = null;
|
|
220
|
+
}
|
|
221
|
+
// ============================================================
|
|
222
|
+
// Private parsing methods
|
|
223
|
+
// ============================================================
|
|
224
|
+
/**
|
|
225
|
+
* Parse Python source code using regex patterns
|
|
226
|
+
*
|
|
227
|
+
* @param content - Python source code
|
|
228
|
+
* @param filePath - Path to the file
|
|
229
|
+
* @returns Parsed result
|
|
230
|
+
*/
|
|
231
|
+
parseWithRegex(content, filePath) {
|
|
232
|
+
const imports = this.extractImports(content, filePath);
|
|
233
|
+
const exports = this.extractExports(content, filePath);
|
|
234
|
+
const functions = this.extractFunctions(content, filePath);
|
|
235
|
+
return { imports, exports, functions };
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Extract imports from Python source code
|
|
239
|
+
*
|
|
240
|
+
* Handles:
|
|
241
|
+
* - `import module`
|
|
242
|
+
* - `import module as alias`
|
|
243
|
+
* - `from module import name`
|
|
244
|
+
* - `from module import name as alias`
|
|
245
|
+
* - `from module import *`
|
|
246
|
+
* - `from module import (name1, name2)`
|
|
247
|
+
*
|
|
248
|
+
* @param content - Python source code
|
|
249
|
+
* @param filePath - Path to the file
|
|
250
|
+
* @returns Array of import information
|
|
251
|
+
*/
|
|
252
|
+
extractImports(content, filePath) {
|
|
253
|
+
const imports = [];
|
|
254
|
+
const lines = content.split('\n');
|
|
255
|
+
// Regex patterns for import statements
|
|
256
|
+
const importRegex = /^import\s+([\w.]+)(?:\s+as\s+(\w+))?$/;
|
|
257
|
+
const fromImportRegex = /^from\s+([\w.]+)\s+import\s+(.+)$/;
|
|
258
|
+
// Track multi-line imports
|
|
259
|
+
let multiLineBuffer = '';
|
|
260
|
+
let inMultiLineImport = false;
|
|
261
|
+
let multiLineModule = '';
|
|
262
|
+
for (let i = 0; i < lines.length; i++) {
|
|
263
|
+
const line = lines[i].trim();
|
|
264
|
+
// Skip comments and empty lines
|
|
265
|
+
if (line.startsWith('#') || line === '') {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
// Handle multi-line imports (with parentheses)
|
|
269
|
+
if (inMultiLineImport) {
|
|
270
|
+
multiLineBuffer += ' ' + line;
|
|
271
|
+
if (line.includes(')')) {
|
|
272
|
+
inMultiLineImport = false;
|
|
273
|
+
// Parse the complete multi-line import
|
|
274
|
+
const names = this.parseImportNames(multiLineBuffer.replace(/[()]/g, ''));
|
|
275
|
+
imports.push({
|
|
276
|
+
module: multiLineModule,
|
|
277
|
+
namedImports: names.filter((n) => n !== '*'),
|
|
278
|
+
namespaceImport: names.includes('*') ? '*' : undefined,
|
|
279
|
+
isTypeOnly: false,
|
|
280
|
+
sourceFile: filePath,
|
|
281
|
+
line: i + 1,
|
|
282
|
+
});
|
|
283
|
+
multiLineBuffer = '';
|
|
284
|
+
multiLineModule = '';
|
|
285
|
+
}
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
// Check for multi-line import start
|
|
289
|
+
const fromMatch = line.match(fromImportRegex);
|
|
290
|
+
if (fromMatch && line.includes('(') && !line.includes(')')) {
|
|
291
|
+
inMultiLineImport = true;
|
|
292
|
+
multiLineModule = fromMatch[1];
|
|
293
|
+
multiLineBuffer = fromMatch[2];
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
// Simple import: `import module`
|
|
297
|
+
const importMatch = line.match(importRegex);
|
|
298
|
+
if (importMatch) {
|
|
299
|
+
imports.push({
|
|
300
|
+
module: importMatch[1],
|
|
301
|
+
namedImports: [],
|
|
302
|
+
defaultImport: importMatch[2] || undefined, // alias becomes "default-like" import
|
|
303
|
+
isTypeOnly: false,
|
|
304
|
+
sourceFile: filePath,
|
|
305
|
+
line: i + 1,
|
|
306
|
+
});
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
// From import: `from module import name`
|
|
310
|
+
if (fromMatch) {
|
|
311
|
+
const names = this.parseImportNames(fromMatch[2]);
|
|
312
|
+
imports.push({
|
|
313
|
+
module: fromMatch[1],
|
|
314
|
+
namedImports: names.filter((n) => n !== '*'),
|
|
315
|
+
namespaceImport: names.includes('*') ? '*' : undefined,
|
|
316
|
+
isTypeOnly: false,
|
|
317
|
+
sourceFile: filePath,
|
|
318
|
+
line: i + 1,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return imports;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Parse comma-separated import names, handling aliases
|
|
326
|
+
*
|
|
327
|
+
* @param namesStr - String containing import names
|
|
328
|
+
* @returns Array of imported names (without aliases)
|
|
329
|
+
*/
|
|
330
|
+
parseImportNames(namesStr) {
|
|
331
|
+
return namesStr
|
|
332
|
+
.split(',')
|
|
333
|
+
.map((n) => n.trim())
|
|
334
|
+
.filter((n) => n !== '')
|
|
335
|
+
.map((n) => {
|
|
336
|
+
// Handle 'name as alias' - we only want the original name
|
|
337
|
+
const asMatch = n.match(/^(\w+)\s+as\s+\w+$/);
|
|
338
|
+
if (asMatch)
|
|
339
|
+
return asMatch[1];
|
|
340
|
+
return n.replace(/[()]/g, '').trim();
|
|
341
|
+
})
|
|
342
|
+
.filter((n) => n !== '');
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Extract exports from Python source code
|
|
346
|
+
*
|
|
347
|
+
* In Python, exports are determined by:
|
|
348
|
+
* 1. `__all__` list (explicit exports)
|
|
349
|
+
* 2. Top-level class/function definitions (implicit, if not starting with _)
|
|
350
|
+
*
|
|
351
|
+
* @param content - Python source code
|
|
352
|
+
* @param filePath - Path to the file
|
|
353
|
+
* @returns Array of export information
|
|
354
|
+
*/
|
|
355
|
+
extractExports(content, filePath) {
|
|
356
|
+
const exports = [];
|
|
357
|
+
const lines = content.split('\n');
|
|
358
|
+
const explicitExports = new Set();
|
|
359
|
+
// Look for __all__ definition (handle multi-line with [\s\S] instead of dotAll flag)
|
|
360
|
+
const allMatch = content.match(/__all__\s*=\s*\[([^\]]+)\]/);
|
|
361
|
+
if (allMatch) {
|
|
362
|
+
const names = allMatch[1].match(/['"](\w+)['"]/g) || [];
|
|
363
|
+
for (const name of names) {
|
|
364
|
+
const cleanName = name.replace(/['"]/g, '');
|
|
365
|
+
explicitExports.add(cleanName);
|
|
366
|
+
exports.push({
|
|
367
|
+
name: cleanName,
|
|
368
|
+
kind: 'unknown',
|
|
369
|
+
isDefault: false,
|
|
370
|
+
sourceFile: filePath,
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Find top-level class and function definitions
|
|
375
|
+
for (let i = 0; i < lines.length; i++) {
|
|
376
|
+
const line = lines[i];
|
|
377
|
+
// Skip if not at column 0 (not top-level)
|
|
378
|
+
if (line.startsWith(' ') || line.startsWith('\t')) {
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
// Class definition
|
|
382
|
+
const classMatch = line.match(/^class\s+(\w+)/);
|
|
383
|
+
if (classMatch) {
|
|
384
|
+
const name = classMatch[1];
|
|
385
|
+
// Only add if not private (starts with _) and not already in __all__
|
|
386
|
+
if (!name.startsWith('_') && !explicitExports.has(name)) {
|
|
387
|
+
exports.push({
|
|
388
|
+
name,
|
|
389
|
+
kind: 'class',
|
|
390
|
+
isDefault: false,
|
|
391
|
+
sourceFile: filePath,
|
|
392
|
+
line: i + 1,
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// Function definition (not method - those are indented)
|
|
397
|
+
const funcMatch = line.match(/^(?:async\s+)?def\s+(\w+)/);
|
|
398
|
+
if (funcMatch) {
|
|
399
|
+
const name = funcMatch[1];
|
|
400
|
+
// Only add if not private (starts with _) and not already in __all__
|
|
401
|
+
if (!name.startsWith('_') && !explicitExports.has(name)) {
|
|
402
|
+
exports.push({
|
|
403
|
+
name,
|
|
404
|
+
kind: 'function',
|
|
405
|
+
isDefault: false,
|
|
406
|
+
sourceFile: filePath,
|
|
407
|
+
line: i + 1,
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return exports;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Extract function definitions from Python source code
|
|
416
|
+
*
|
|
417
|
+
* Handles:
|
|
418
|
+
* - Regular functions: `def func():`
|
|
419
|
+
* - Async functions: `async def func():`
|
|
420
|
+
* - Methods (indented functions)
|
|
421
|
+
*
|
|
422
|
+
* @param content - Python source code
|
|
423
|
+
* @param filePath - Path to the file
|
|
424
|
+
* @returns Array of function information
|
|
425
|
+
*/
|
|
426
|
+
extractFunctions(content, filePath) {
|
|
427
|
+
const functions = [];
|
|
428
|
+
const lines = content.split('\n');
|
|
429
|
+
for (let i = 0; i < lines.length; i++) {
|
|
430
|
+
const line = lines[i];
|
|
431
|
+
// Match function definitions (both sync and async)
|
|
432
|
+
const match = line.match(/^(\s*)(async\s+)?def\s+(\w+)\s*\(([^)]*)\)/);
|
|
433
|
+
if (match) {
|
|
434
|
+
const indentation = match[1];
|
|
435
|
+
const isAsync = !!match[2];
|
|
436
|
+
const name = match[3];
|
|
437
|
+
const paramsStr = match[4];
|
|
438
|
+
// Count parameters (excluding self, cls)
|
|
439
|
+
const params = paramsStr
|
|
440
|
+
.split(',')
|
|
441
|
+
.map((p) => p.trim())
|
|
442
|
+
.filter((p) => p !== '' && p !== 'self' && p !== 'cls');
|
|
443
|
+
// Is top-level (exported) if no indentation and not private
|
|
444
|
+
const isTopLevel = indentation === '';
|
|
445
|
+
const isExported = isTopLevel && !name.startsWith('_');
|
|
446
|
+
functions.push({
|
|
447
|
+
name,
|
|
448
|
+
parameterCount: params.length,
|
|
449
|
+
isAsync,
|
|
450
|
+
isExported,
|
|
451
|
+
sourceFile: filePath,
|
|
452
|
+
line: i + 1,
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return functions;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Parse Python source code using tree-sitter for more accurate results
|
|
460
|
+
*
|
|
461
|
+
* Tree-sitter provides a full AST which enables more accurate parsing
|
|
462
|
+
* of complex Python constructs.
|
|
463
|
+
*
|
|
464
|
+
* @param content - Python source code
|
|
465
|
+
* @param filePath - Path to the file
|
|
466
|
+
* @returns Parsed result
|
|
467
|
+
*/
|
|
468
|
+
parseWithTreeSitter(content, filePath) {
|
|
469
|
+
// Tree-sitter parsing for more accurate results
|
|
470
|
+
// For now, fall back to regex until tree-sitter queries are implemented
|
|
471
|
+
// TODO: SMI-1309 - Implement tree-sitter query-based extraction
|
|
472
|
+
return this.parseWithRegex(content, filePath);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
//# sourceMappingURL=python.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../../src/analysis/adapters/python.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1306: Rust Language Adapter
|
|
3
|
+
*
|
|
4
|
+
* Parses Rust source files (.rs) and extracts imports, exports, and functions
|
|
5
|
+
* using regex-based parsing. Rust uses explicit `pub` visibility modifiers
|
|
6
|
+
* for public items.
|
|
7
|
+
*
|
|
8
|
+
* @see docs/architecture/multi-language-analysis.md
|
|
9
|
+
*/
|
|
10
|
+
import { LanguageAdapter, type SupportedLanguage } from './base.js';
|
|
11
|
+
import type { ParseResult, ExportInfo, FunctionInfo, FrameworkRule } from './base.js';
|
|
12
|
+
/**
|
|
13
|
+
* Extended ExportInfo for Rust with visibility support
|
|
14
|
+
*/
|
|
15
|
+
export interface RustExportInfo extends ExportInfo {
|
|
16
|
+
/** Rust exports via pub modifier */
|
|
17
|
+
visibility: 'public' | 'private';
|
|
18
|
+
/** Line number in source */
|
|
19
|
+
line: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extended FunctionInfo for Rust with attribute support
|
|
23
|
+
*/
|
|
24
|
+
export interface RustFunctionInfo extends FunctionInfo {
|
|
25
|
+
/** Rust attributes (e.g., #[derive], #[test]) */
|
|
26
|
+
attributes?: string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Cargo.toml dependency information
|
|
30
|
+
*/
|
|
31
|
+
export interface CargoDependency {
|
|
32
|
+
/** Crate name */
|
|
33
|
+
name: string;
|
|
34
|
+
/** Version specifier */
|
|
35
|
+
version: string;
|
|
36
|
+
/** Whether this is a dev dependency */
|
|
37
|
+
isDev: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Rust Language Adapter
|
|
41
|
+
*
|
|
42
|
+
* Parses Rust source files using regex-based parsing.
|
|
43
|
+
* Handles Rust's `pub` visibility modifiers and module system.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* const adapter = new RustAdapter()
|
|
48
|
+
* const result = adapter.parseFile(rustCode, 'lib.rs')
|
|
49
|
+
* console.log(result.exports) // Items with pub modifier
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare class RustAdapter extends LanguageAdapter {
|
|
53
|
+
readonly language: SupportedLanguage;
|
|
54
|
+
readonly extensions: string[];
|
|
55
|
+
/**
|
|
56
|
+
* Parse a Rust source file and extract information
|
|
57
|
+
*/
|
|
58
|
+
parseFile(content: string, filePath: string): ParseResult;
|
|
59
|
+
/**
|
|
60
|
+
* Parse file incrementally (currently same as full parse)
|
|
61
|
+
*/
|
|
62
|
+
parseIncremental(content: string, filePath: string, _previousTree?: unknown): ParseResult;
|
|
63
|
+
/**
|
|
64
|
+
* Get Rust framework detection rules
|
|
65
|
+
*/
|
|
66
|
+
getFrameworkRules(): FrameworkRule[];
|
|
67
|
+
/**
|
|
68
|
+
* Clean up resources (no-op for regex-based parsing)
|
|
69
|
+
*/
|
|
70
|
+
dispose(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Extract use statements from Rust source
|
|
73
|
+
*
|
|
74
|
+
* Handles:
|
|
75
|
+
* - use crate::module::item;
|
|
76
|
+
* - use std::collections::HashMap;
|
|
77
|
+
* - use super::parent;
|
|
78
|
+
* - use self::child;
|
|
79
|
+
* - use std::{io, fs};
|
|
80
|
+
* - use module::*;
|
|
81
|
+
* - extern crate foo;
|
|
82
|
+
*/
|
|
83
|
+
private extractImports;
|
|
84
|
+
/**
|
|
85
|
+
* Extract exports (pub items) from Rust source
|
|
86
|
+
*
|
|
87
|
+
* In Rust, items prefixed with `pub` are public.
|
|
88
|
+
* Handles visibility modifiers: pub, pub(crate), pub(super), pub(in path)
|
|
89
|
+
*/
|
|
90
|
+
private extractExports;
|
|
91
|
+
/**
|
|
92
|
+
* Extract function definitions from Rust source
|
|
93
|
+
*
|
|
94
|
+
* Handles:
|
|
95
|
+
* - fn name(params)
|
|
96
|
+
* - pub fn name(params)
|
|
97
|
+
* - async fn name(params)
|
|
98
|
+
* - pub async fn name(params)
|
|
99
|
+
* - Functions with generics: fn name<T>(params)
|
|
100
|
+
*/
|
|
101
|
+
private extractFunctions;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Parse Cargo.toml to extract dependencies
|
|
105
|
+
*
|
|
106
|
+
* @param content - Content of Cargo.toml file
|
|
107
|
+
* @returns Array of dependencies with name, version, and isDev flag
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* const deps = parseCargoToml(cargoTomlContent)
|
|
112
|
+
* console.log(deps) // [{ name: 'serde', version: '1.0', isDev: false }]
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export declare function parseCargoToml(content: string): CargoDependency[];
|
|
116
|
+
//# sourceMappingURL=rust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../../../src/analysis/adapters/rust.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAA;AACnE,OAAO,KAAK,EAAE,WAAW,EAAc,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEjG;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,oCAAoC;IACpC,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAA;IAChC,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,uCAAuC;IACvC,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAY,SAAQ,eAAe;IAC9C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAS;IAC7C,QAAQ,CAAC,UAAU,WAAU;IAE7B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW;IAOzD;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,WAAW;IAMzF;;OAEG;IACH,iBAAiB,IAAI,aAAa,EAAE;IAsEpC;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;IAoFtB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAmHtB;;;;;;;;;OASG;IACH,OAAO,CAAC,gBAAgB;CAqEzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CA+EjE"}
|