@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.
Files changed (233) hide show
  1. package/README.md +233 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
  4. package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
  5. package/dist/src/analysis/__tests__/incremental.test.js +515 -0
  6. package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
  7. package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
  8. package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
  9. package/dist/src/analysis/__tests__/integration.test.js +1059 -0
  10. package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
  11. package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
  12. package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
  13. package/dist/src/analysis/__tests__/metrics.test.js +369 -0
  14. package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
  15. package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
  16. package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
  17. package/dist/src/analysis/__tests__/performance.test.js +402 -0
  18. package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
  19. package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
  20. package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
  21. package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
  22. package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
  23. package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
  24. package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
  25. package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
  26. package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
  27. package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
  28. package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
  29. package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
  30. package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
  31. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
  32. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
  33. package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
  34. package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
  35. package/dist/src/analysis/adapters/base.d.ts +83 -0
  36. package/dist/src/analysis/adapters/base.d.ts.map +1 -0
  37. package/dist/src/analysis/adapters/base.js +40 -0
  38. package/dist/src/analysis/adapters/base.js.map +1 -0
  39. package/dist/src/analysis/adapters/factory.d.ts +150 -0
  40. package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
  41. package/dist/src/analysis/adapters/factory.js +244 -0
  42. package/dist/src/analysis/adapters/factory.js.map +1 -0
  43. package/dist/src/analysis/adapters/go.d.ts +131 -0
  44. package/dist/src/analysis/adapters/go.d.ts.map +1 -0
  45. package/dist/src/analysis/adapters/go.js +414 -0
  46. package/dist/src/analysis/adapters/go.js.map +1 -0
  47. package/dist/src/analysis/adapters/index.d.ts +20 -0
  48. package/dist/src/analysis/adapters/index.d.ts.map +1 -0
  49. package/dist/src/analysis/adapters/index.js +23 -0
  50. package/dist/src/analysis/adapters/index.js.map +1 -0
  51. package/dist/src/analysis/adapters/java.d.ts +154 -0
  52. package/dist/src/analysis/adapters/java.d.ts.map +1 -0
  53. package/dist/src/analysis/adapters/java.js +407 -0
  54. package/dist/src/analysis/adapters/java.js.map +1 -0
  55. package/dist/src/analysis/adapters/python.d.ts +165 -0
  56. package/dist/src/analysis/adapters/python.d.ts.map +1 -0
  57. package/dist/src/analysis/adapters/python.js +475 -0
  58. package/dist/src/analysis/adapters/python.js.map +1 -0
  59. package/dist/src/analysis/adapters/rust.d.ts +116 -0
  60. package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
  61. package/dist/src/analysis/adapters/rust.js +476 -0
  62. package/dist/src/analysis/adapters/rust.js.map +1 -0
  63. package/dist/src/analysis/adapters/typescript.d.ts +68 -0
  64. package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
  65. package/dist/src/analysis/adapters/typescript.js +79 -0
  66. package/dist/src/analysis/adapters/typescript.js.map +1 -0
  67. package/dist/src/analysis/aggregator.d.ts +193 -0
  68. package/dist/src/analysis/aggregator.d.ts.map +1 -0
  69. package/dist/src/analysis/aggregator.js +283 -0
  70. package/dist/src/analysis/aggregator.js.map +1 -0
  71. package/dist/src/analysis/cache.d.ts +180 -0
  72. package/dist/src/analysis/cache.d.ts.map +1 -0
  73. package/dist/src/analysis/cache.js +279 -0
  74. package/dist/src/analysis/cache.js.map +1 -0
  75. package/dist/src/analysis/file-streamer.d.ts +136 -0
  76. package/dist/src/analysis/file-streamer.d.ts.map +1 -0
  77. package/dist/src/analysis/file-streamer.js +291 -0
  78. package/dist/src/analysis/file-streamer.js.map +1 -0
  79. package/dist/src/analysis/incremental-parser.d.ts +186 -0
  80. package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
  81. package/dist/src/analysis/incremental-parser.js +291 -0
  82. package/dist/src/analysis/incremental-parser.js.map +1 -0
  83. package/dist/src/analysis/incremental.d.ts +186 -0
  84. package/dist/src/analysis/incremental.d.ts.map +1 -0
  85. package/dist/src/analysis/incremental.js +247 -0
  86. package/dist/src/analysis/incremental.js.map +1 -0
  87. package/dist/src/analysis/index.d.ts +25 -3
  88. package/dist/src/analysis/index.d.ts.map +1 -1
  89. package/dist/src/analysis/index.js +45 -3
  90. package/dist/src/analysis/index.js.map +1 -1
  91. package/dist/src/analysis/language-detector.d.ts +92 -0
  92. package/dist/src/analysis/language-detector.d.ts.map +1 -0
  93. package/dist/src/analysis/language-detector.js +602 -0
  94. package/dist/src/analysis/language-detector.js.map +1 -0
  95. package/dist/src/analysis/memory-monitor.d.ts +199 -0
  96. package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
  97. package/dist/src/analysis/memory-monitor.js +271 -0
  98. package/dist/src/analysis/memory-monitor.js.map +1 -0
  99. package/dist/src/analysis/metrics.d.ts +300 -0
  100. package/dist/src/analysis/metrics.d.ts.map +1 -0
  101. package/dist/src/analysis/metrics.js +537 -0
  102. package/dist/src/analysis/metrics.js.map +1 -0
  103. package/dist/src/analysis/router.d.ts +264 -0
  104. package/dist/src/analysis/router.d.ts.map +1 -0
  105. package/dist/src/analysis/router.js +398 -0
  106. package/dist/src/analysis/router.js.map +1 -0
  107. package/dist/src/analysis/tree-cache.d.ts +208 -0
  108. package/dist/src/analysis/tree-cache.d.ts.map +1 -0
  109. package/dist/src/analysis/tree-cache.js +288 -0
  110. package/dist/src/analysis/tree-cache.js.map +1 -0
  111. package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
  112. package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
  113. package/dist/src/analysis/tree-sitter/manager.js +239 -0
  114. package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
  115. package/dist/src/analysis/types.d.ts +69 -6
  116. package/dist/src/analysis/types.d.ts.map +1 -1
  117. package/dist/src/analysis/types.js +23 -2
  118. package/dist/src/analysis/types.js.map +1 -1
  119. package/dist/src/analysis/worker-pool.d.ts +141 -0
  120. package/dist/src/analysis/worker-pool.d.ts.map +1 -0
  121. package/dist/src/analysis/worker-pool.js +418 -0
  122. package/dist/src/analysis/worker-pool.js.map +1 -0
  123. package/dist/src/analytics/schema.d.ts +1 -1
  124. package/dist/src/analytics/schema.d.ts.map +1 -1
  125. package/dist/src/analytics/schema.js +72 -0
  126. package/dist/src/analytics/schema.js.map +1 -1
  127. package/dist/src/api/cache.d.ts +24 -1
  128. package/dist/src/api/cache.d.ts.map +1 -1
  129. package/dist/src/api/cache.js +50 -2
  130. package/dist/src/api/cache.js.map +1 -1
  131. package/dist/src/api/client.d.ts +132 -2
  132. package/dist/src/api/client.d.ts.map +1 -1
  133. package/dist/src/api/client.js +214 -18
  134. package/dist/src/api/client.js.map +1 -1
  135. package/dist/src/api/index.d.ts +2 -0
  136. package/dist/src/api/index.d.ts.map +1 -1
  137. package/dist/src/api/index.js +7 -0
  138. package/dist/src/api/index.js.map +1 -1
  139. package/dist/src/api/types.d.ts +251 -0
  140. package/dist/src/api/types.d.ts.map +1 -0
  141. package/dist/src/api/types.js +9 -0
  142. package/dist/src/api/types.js.map +1 -0
  143. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
  144. package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
  145. package/dist/src/embeddings/index.d.ts.map +1 -1
  146. package/dist/src/embeddings/index.js.map +1 -1
  147. package/dist/src/errors.d.ts +1 -0
  148. package/dist/src/errors.d.ts.map +1 -1
  149. package/dist/src/errors.js +1 -0
  150. package/dist/src/errors.js.map +1 -1
  151. package/dist/src/index.d.ts +3 -3
  152. package/dist/src/index.d.ts.map +1 -1
  153. package/dist/src/index.js +4 -4
  154. package/dist/src/index.js.map +1 -1
  155. package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
  156. package/dist/src/repositories/IndexerRepository.js +1 -0
  157. package/dist/src/repositories/IndexerRepository.js.map +1 -1
  158. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  159. package/dist/src/repositories/SkillRepository.js +1 -0
  160. package/dist/src/repositories/SkillRepository.js.map +1 -1
  161. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
  162. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
  163. package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
  164. package/dist/src/repositories/quarantine/query-builder.js +1 -1
  165. package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
  166. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
  167. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  168. package/dist/src/scripts/github-import/index.js.map +1 -1
  169. package/dist/src/scripts/import-github-skills.js +1 -1
  170. package/dist/src/scripts/import-github-skills.js.map +1 -1
  171. package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
  172. package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
  173. package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
  174. package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
  175. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
  176. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
  177. package/dist/src/scripts/validation/index.js +1 -2
  178. package/dist/src/scripts/validation/index.js.map +1 -1
  179. package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
  180. package/dist/src/scripts/validation/pipeline.js.map +1 -1
  181. package/dist/src/scripts/validation/types.d.ts +2 -2
  182. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  183. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  184. package/dist/src/services/SearchService.d.ts.map +1 -1
  185. package/dist/src/services/SearchService.js +1 -0
  186. package/dist/src/services/SearchService.js.map +1 -1
  187. package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
  188. package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
  189. package/dist/src/session/SessionHealthMonitor.js +1 -1
  190. package/dist/src/session/SessionHealthMonitor.js.map +1 -1
  191. package/dist/src/telemetry/index.d.ts +1 -1
  192. package/dist/src/telemetry/index.d.ts.map +1 -1
  193. package/dist/src/telemetry/index.js +2 -2
  194. package/dist/src/telemetry/index.js.map +1 -1
  195. package/dist/src/telemetry/posthog.d.ts +27 -5
  196. package/dist/src/telemetry/posthog.d.ts.map +1 -1
  197. package/dist/src/telemetry/posthog.js +20 -5
  198. package/dist/src/telemetry/posthog.js.map +1 -1
  199. package/dist/src/types/skill.d.ts +3 -0
  200. package/dist/src/types/skill.d.ts.map +1 -1
  201. package/dist/src/types.d.ts +2 -1
  202. package/dist/src/types.d.ts.map +1 -1
  203. package/dist/src/types.js +2 -2
  204. package/dist/src/types.js.map +1 -1
  205. package/dist/tests/adapters-factory.test.d.ts +13 -0
  206. package/dist/tests/adapters-factory.test.d.ts.map +1 -0
  207. package/dist/tests/adapters-factory.test.js +308 -0
  208. package/dist/tests/adapters-factory.test.js.map +1 -0
  209. package/dist/tests/adapters-java.test.d.ts +13 -0
  210. package/dist/tests/adapters-java.test.d.ts.map +1 -0
  211. package/dist/tests/adapters-java.test.js +925 -0
  212. package/dist/tests/adapters-java.test.js.map +1 -0
  213. package/dist/tests/api/client.validation.test.d.ts +7 -0
  214. package/dist/tests/api/client.validation.test.d.ts.map +1 -0
  215. package/dist/tests/api/client.validation.test.js +183 -0
  216. package/dist/tests/api/client.validation.test.js.map +1 -0
  217. package/dist/tests/language-detector.test.d.ts +13 -0
  218. package/dist/tests/language-detector.test.d.ts.map +1 -0
  219. package/dist/tests/language-detector.test.js +674 -0
  220. package/dist/tests/language-detector.test.js.map +1 -0
  221. package/dist/tests/telemetry/posthog.test.d.ts +13 -0
  222. package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
  223. package/dist/tests/telemetry/posthog.test.js +600 -0
  224. package/dist/tests/telemetry/posthog.test.js.map +1 -0
  225. package/package.json +5 -6
  226. package/dist/src/security/RateLimiter.d.ts +0 -337
  227. package/dist/src/security/RateLimiter.d.ts.map +0 -1
  228. package/dist/src/security/RateLimiter.js +0 -782
  229. package/dist/src/security/RateLimiter.js.map +0 -1
  230. package/dist/src/security/scanner.d.ts +0 -151
  231. package/dist/src/security/scanner.d.ts.map +0 -1
  232. package/dist/src/security/scanner.js +0 -599
  233. 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"}