@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,407 @@
1
+ /**
2
+ * SMI-1307: Java Language Adapter
3
+ *
4
+ * Parses Java source files and extracts imports, exports, and functions
5
+ * using regex-based parsing. Handles Java-specific features including:
6
+ * - Visibility modifiers (public, private, protected, package-private)
7
+ * - Annotations (@Override, @Test, @Autowired, etc.)
8
+ * - Generics in class and method declarations
9
+ * - Interfaces, abstract classes, enums, and annotation types
10
+ *
11
+ * @see docs/architecture/multi-language-analysis.md
12
+ */
13
+ import { LanguageAdapter } from './base.js';
14
+ /**
15
+ * Java Language Adapter
16
+ *
17
+ * Parses Java source files using regex-based parsing.
18
+ * Handles Java's explicit visibility modifiers and annotation system.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const adapter = new JavaAdapter()
23
+ * const result = adapter.parseFile(javaCode, 'Main.java')
24
+ * console.log(result.exports) // public classes, interfaces, enums
25
+ * console.log(result.functions) // public/protected methods
26
+ * ```
27
+ */
28
+ export class JavaAdapter extends LanguageAdapter {
29
+ language = 'java';
30
+ extensions = ['.java'];
31
+ /**
32
+ * Parse a Java source file and extract information
33
+ */
34
+ parseFile(content, filePath) {
35
+ const imports = this.extractImports(content, filePath);
36
+ const exports = this.extractExports(content, filePath);
37
+ const functions = this.extractFunctions(content, filePath);
38
+ return { imports, exports, functions };
39
+ }
40
+ /**
41
+ * Parse file incrementally (currently same as full parse)
42
+ */
43
+ parseIncremental(content, filePath, _previousTree) {
44
+ // Incremental parsing not yet implemented for Java
45
+ // Will be added with tree-sitter integration
46
+ return this.parseFile(content, filePath);
47
+ }
48
+ /**
49
+ * Get Java framework detection rules
50
+ */
51
+ getFrameworkRules() {
52
+ return [
53
+ {
54
+ name: 'Spring Boot',
55
+ depIndicators: ['spring-boot', 'org.springframework.boot'],
56
+ importIndicators: ['org.springframework.boot', 'org.springframework.web'],
57
+ },
58
+ {
59
+ name: 'Spring',
60
+ depIndicators: ['spring-core', 'org.springframework'],
61
+ importIndicators: ['org.springframework'],
62
+ },
63
+ {
64
+ name: 'Quarkus',
65
+ depIndicators: ['io.quarkus'],
66
+ importIndicators: ['io.quarkus', 'javax.enterprise'],
67
+ },
68
+ {
69
+ name: 'Micronaut',
70
+ depIndicators: ['io.micronaut'],
71
+ importIndicators: ['io.micronaut'],
72
+ },
73
+ {
74
+ name: 'Jakarta EE',
75
+ depIndicators: ['jakarta.'],
76
+ importIndicators: ['jakarta.'],
77
+ },
78
+ {
79
+ name: 'JUnit',
80
+ depIndicators: ['junit', 'org.junit'],
81
+ importIndicators: ['org.junit', 'junit.framework'],
82
+ },
83
+ {
84
+ name: 'Hibernate',
85
+ depIndicators: ['hibernate', 'org.hibernate'],
86
+ importIndicators: ['org.hibernate', 'javax.persistence', 'jakarta.persistence'],
87
+ },
88
+ {
89
+ name: 'Lombok',
90
+ depIndicators: ['lombok', 'org.projectlombok'],
91
+ importIndicators: ['lombok'],
92
+ },
93
+ {
94
+ name: 'Maven',
95
+ depIndicators: ['maven', 'org.apache.maven'],
96
+ importIndicators: [],
97
+ },
98
+ {
99
+ name: 'Gradle',
100
+ depIndicators: ['gradle', 'org.gradle'],
101
+ importIndicators: [],
102
+ },
103
+ {
104
+ name: 'TestNG',
105
+ depIndicators: ['testng', 'org.testng'],
106
+ importIndicators: ['org.testng'],
107
+ },
108
+ {
109
+ name: 'Mockito',
110
+ depIndicators: ['mockito', 'org.mockito'],
111
+ importIndicators: ['org.mockito'],
112
+ },
113
+ {
114
+ name: 'Jackson',
115
+ depIndicators: ['jackson', 'com.fasterxml.jackson'],
116
+ importIndicators: ['com.fasterxml.jackson'],
117
+ },
118
+ {
119
+ name: 'Gson',
120
+ depIndicators: ['gson', 'com.google.gson'],
121
+ importIndicators: ['com.google.gson'],
122
+ },
123
+ {
124
+ name: 'Apache Commons',
125
+ depIndicators: ['commons-', 'org.apache.commons'],
126
+ importIndicators: ['org.apache.commons'],
127
+ },
128
+ {
129
+ name: 'SLF4J',
130
+ depIndicators: ['slf4j', 'org.slf4j'],
131
+ importIndicators: ['org.slf4j'],
132
+ },
133
+ {
134
+ name: 'Log4j',
135
+ depIndicators: ['log4j', 'org.apache.logging.log4j'],
136
+ importIndicators: ['org.apache.logging.log4j', 'org.apache.log4j'],
137
+ },
138
+ ];
139
+ }
140
+ /**
141
+ * Clean up resources (no-op for regex-based parsing)
142
+ */
143
+ dispose() {
144
+ // No resources to clean up for regex-based parsing
145
+ }
146
+ /**
147
+ * Extract import statements from Java source
148
+ *
149
+ * Handles:
150
+ * - Regular imports: import com.example.Class;
151
+ * - Static imports: import static com.example.Class.method;
152
+ * - Wildcard imports: import com.example.*;
153
+ */
154
+ extractImports(content, filePath) {
155
+ const imports = [];
156
+ const lines = content.split('\n');
157
+ for (let i = 0; i < lines.length; i++) {
158
+ const line = lines[i].trim();
159
+ // Match: import com.example.Class;
160
+ // Match: import static com.example.Class.method;
161
+ // Match: import com.example.*;
162
+ const importMatch = line.match(/^import\s+(static\s+)?([\w.]+(?:\.\*)?);/);
163
+ if (importMatch) {
164
+ const isStatic = !!importMatch[1];
165
+ const fullPath = importMatch[2];
166
+ const isWildcard = fullPath.endsWith('.*');
167
+ const module = isWildcard ? fullPath.slice(0, -2) : fullPath;
168
+ // Extract the simple name from the full path
169
+ const parts = fullPath.split('.');
170
+ const simpleName = isWildcard ? undefined : parts[parts.length - 1];
171
+ imports.push({
172
+ module,
173
+ namedImports: simpleName && !isWildcard ? [simpleName] : [],
174
+ namespaceImport: isWildcard ? '*' : undefined,
175
+ isTypeOnly: !isStatic, // Java imports are type-only unless static
176
+ sourceFile: filePath,
177
+ line: i + 1,
178
+ });
179
+ }
180
+ }
181
+ return imports;
182
+ }
183
+ /**
184
+ * Extract exports (public declarations) from Java source
185
+ *
186
+ * In Java, exports are determined by visibility modifiers:
187
+ * - public: accessible from anywhere
188
+ * - protected: accessible from subclasses
189
+ * - package-private (default): accessible within package
190
+ * - private: not exported
191
+ */
192
+ extractExports(content, filePath) {
193
+ const exports = [];
194
+ const lines = content.split('\n');
195
+ for (let i = 0; i < lines.length; i++) {
196
+ const line = lines[i];
197
+ // Match class/interface/enum/@interface declarations
198
+ // Supports: public, protected, private, abstract, final, static modifiers
199
+ const classMatch = line.match(/^\s*(public|protected|private)?\s*(abstract\s+)?(final\s+)?(static\s+)?(class|interface|enum|@interface)\s+(\w+)(?:<[^>]+>)?/);
200
+ if (classMatch) {
201
+ const visibility = classMatch[1] || 'package';
202
+ const _isAbstract = !!classMatch[2];
203
+ const type = classMatch[5];
204
+ const name = classMatch[6];
205
+ let kind = 'class';
206
+ if (type === 'interface' || type === '@interface')
207
+ kind = 'interface';
208
+ if (type === 'enum')
209
+ kind = 'enum';
210
+ exports.push({
211
+ name,
212
+ kind,
213
+ isDefault: false,
214
+ sourceFile: filePath,
215
+ visibility: visibility === 'package'
216
+ ? 'internal'
217
+ : visibility,
218
+ line: i + 1,
219
+ });
220
+ }
221
+ }
222
+ return exports;
223
+ }
224
+ /**
225
+ * Extract function definitions from Java source
226
+ *
227
+ * Handles:
228
+ * - Regular methods: public void foo(String s, int n)
229
+ * - Generic methods: public <T> List<T> bar(T item)
230
+ * - Abstract methods: protected abstract void baz();
231
+ * - Static methods: public static void main(String[] args)
232
+ * - Annotated methods: @Override public String toString()
233
+ */
234
+ extractFunctions(content, filePath) {
235
+ const functions = [];
236
+ const lines = content.split('\n');
237
+ for (let i = 0; i < lines.length; i++) {
238
+ const line = lines[i];
239
+ // Match method declarations:
240
+ // public void foo(String s, int n)
241
+ // private static <T> List<T> bar(T item)
242
+ // protected abstract void baz();
243
+ // @Override public String toString()
244
+ const methodMatch = line.match(/^\s*(public|protected|private)?\s*(static\s+)?(abstract\s+)?(final\s+)?(synchronized\s+)?(native\s+)?(<[^>]+>\s+)?(\w+(?:<[^>]+>)?(?:\[\])*)\s+(\w+)\s*\(([^)]*)\)/);
245
+ if (methodMatch) {
246
+ const visibility = methodMatch[1] || 'package';
247
+ const _isStatic = !!methodMatch[2];
248
+ const _isAbstract = !!methodMatch[3];
249
+ const _returnType = methodMatch[8];
250
+ const name = methodMatch[9];
251
+ const paramsStr = methodMatch[10];
252
+ // Skip constructors (return type matches class name pattern - would need context)
253
+ // Skip if the "return type" looks like a class name being constructed
254
+ // A simple heuristic: constructors have no return type in the regex
255
+ // In practice, our regex captures return type, so constructors won't match
256
+ // Count parameters - handle generics in parameters like List<String>
257
+ let paramCount = 0;
258
+ if (paramsStr.trim()) {
259
+ // Remove generic brackets to avoid splitting on commas inside them
260
+ let depth = 0;
261
+ let cleanedParams = '';
262
+ for (const char of paramsStr) {
263
+ if (char === '<')
264
+ depth++;
265
+ else if (char === '>')
266
+ depth--;
267
+ else if (char === ',' && depth === 0)
268
+ cleanedParams += ',';
269
+ else if (depth === 0)
270
+ cleanedParams += char;
271
+ }
272
+ paramCount = cleanedParams.split(',').filter((p) => p.trim()).length;
273
+ }
274
+ // Look for annotations above the method
275
+ const decorators = [];
276
+ for (let j = i - 1; j >= 0; j--) {
277
+ const prevLine = lines[j].trim();
278
+ if (prevLine.startsWith('@')) {
279
+ const annoMatch = prevLine.match(/@(\w+)/);
280
+ if (annoMatch) {
281
+ decorators.unshift(annoMatch[1]);
282
+ }
283
+ }
284
+ else if (prevLine && !prevLine.startsWith('//') && !prevLine.startsWith('*')) {
285
+ break;
286
+ }
287
+ }
288
+ functions.push({
289
+ name,
290
+ parameterCount: paramCount,
291
+ isAsync: false, // Java doesn't have async keyword
292
+ isExported: visibility === 'public' || visibility === 'protected',
293
+ sourceFile: filePath,
294
+ line: i + 1,
295
+ decorators: decorators.length > 0 ? decorators : undefined,
296
+ });
297
+ }
298
+ }
299
+ return functions;
300
+ }
301
+ }
302
+ /**
303
+ * Parse pom.xml to extract Maven dependencies
304
+ *
305
+ * @param content - Content of pom.xml file
306
+ * @returns Array of dependency information
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * const deps = parsePomXml(pomXmlContent)
311
+ * console.log(deps) // [{ name: "org.springframework:spring-core", version: "5.3.0", ... }]
312
+ * ```
313
+ */
314
+ export function parsePomXml(content) {
315
+ const deps = [];
316
+ // Remove XML comments to avoid false matches
317
+ const contentWithoutComments = content.replace(/<!--[\s\S]*?-->/g, '');
318
+ // Match dependency blocks first, then extract individual elements
319
+ const depBlockRegex = /<dependency>([\s\S]*?)<\/dependency>/g;
320
+ let blockMatch;
321
+ while ((blockMatch = depBlockRegex.exec(contentWithoutComments)) !== null) {
322
+ const block = blockMatch[1];
323
+ // Extract individual elements from the dependency block
324
+ const groupIdMatch = block.match(/<groupId>([^<]+)<\/groupId>/);
325
+ const artifactIdMatch = block.match(/<artifactId>([^<]+)<\/artifactId>/);
326
+ const versionMatch = block.match(/<version>([^<]+)<\/version>/);
327
+ const scopeMatch = block.match(/<scope>([^<]+)<\/scope>/);
328
+ if (groupIdMatch && artifactIdMatch) {
329
+ const groupId = groupIdMatch[1].trim();
330
+ const artifactId = artifactIdMatch[1].trim();
331
+ const version = versionMatch ? versionMatch[1].trim() : 'unspecified';
332
+ const scope = scopeMatch ? scopeMatch[1].trim() : 'compile';
333
+ deps.push({
334
+ name: `${groupId}:${artifactId}`,
335
+ version,
336
+ isDev: scope === 'test' || scope === 'provided',
337
+ });
338
+ }
339
+ }
340
+ return deps;
341
+ }
342
+ /**
343
+ * Parse build.gradle or build.gradle.kts to extract Gradle dependencies
344
+ *
345
+ * @param content - Content of build.gradle file
346
+ * @returns Array of dependency information
347
+ *
348
+ * @example
349
+ * ```typescript
350
+ * const deps = parseBuildGradle(gradleContent)
351
+ * console.log(deps) // [{ name: "org.springframework:spring-core", version: "5.3.0", ... }]
352
+ * ```
353
+ */
354
+ export function parseBuildGradle(content) {
355
+ const deps = [];
356
+ let match;
357
+ // Configuration names to match
358
+ const configs = 'implementation|api|testImplementation|testCompileOnly|compileOnly|runtimeOnly|testRuntimeOnly|annotationProcessor|kapt';
359
+ // Pattern 1: Groovy style with quotes: implementation 'group:artifact:version'
360
+ const groovyQuoteRegex = new RegExp(`(${configs})\\s+['"]([^'"]+)['"]`, 'g');
361
+ while ((match = groovyQuoteRegex.exec(content)) !== null) {
362
+ const config = match[1];
363
+ const depStr = match[2].trim();
364
+ addDependency(deps, config, depStr);
365
+ }
366
+ // Pattern 2: Kotlin DSL style with parens and quotes: implementation("group:artifact:version")
367
+ const kotlinStringRegex = new RegExp(`(${configs})\\s*\\(\\s*["']([^"']+)["']\\s*\\)`, 'g');
368
+ while ((match = kotlinStringRegex.exec(content)) !== null) {
369
+ const config = match[1];
370
+ const depStr = match[2].trim();
371
+ addDependency(deps, config, depStr);
372
+ }
373
+ // Pattern 3: Kotlin DSL with named parameters
374
+ // implementation(group = "com.example", name = "library", version = "1.0")
375
+ const kotlinNamedRegex = new RegExp(`(${configs})\\s*\\(\\s*group\\s*=\\s*"([^"]+)"\\s*,\\s*name\\s*=\\s*"([^"]+)"(?:\\s*,\\s*version\\s*=\\s*"([^"]+)")?\\s*\\)`, 'g');
376
+ while ((match = kotlinNamedRegex.exec(content)) !== null) {
377
+ const config = match[1];
378
+ const group = match[2];
379
+ const name = match[3];
380
+ const version = match[4] || 'unspecified';
381
+ deps.push({
382
+ name: `${group}:${name}`,
383
+ version,
384
+ isDev: config.startsWith('test'),
385
+ });
386
+ }
387
+ return deps;
388
+ }
389
+ /**
390
+ * Helper function to add a dependency from a colon-separated string
391
+ */
392
+ function addDependency(deps, config, depStr) {
393
+ // Skip project references
394
+ if (depStr.startsWith(':') || depStr.includes('project(')) {
395
+ return;
396
+ }
397
+ // Parse group:artifact:version format
398
+ const parts = depStr.split(':');
399
+ if (parts.length >= 2) {
400
+ deps.push({
401
+ name: `${parts[0]}:${parts[1]}`,
402
+ version: parts[2] || 'unspecified',
403
+ isDev: config.startsWith('test') || config === 'annotationProcessor' || config === 'kapt',
404
+ });
405
+ }
406
+ }
407
+ //# sourceMappingURL=java.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"java.js","sourceRoot":"","sources":["../../../../src/analysis/adapters/java.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
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, type SupportedLanguage, type FrameworkRule } from './base.js';
11
+ import type { ParseResult } from '../types.js';
12
+ /**
13
+ * Python adapter using regex-based parsing with optional tree-sitter
14
+ *
15
+ * The adapter provides:
16
+ * - Synchronous regex-based parsing for basic analysis
17
+ * - Async tree-sitter parsing for enhanced accuracy (when available)
18
+ * - Framework detection rules for Django, FastAPI, Flask, etc.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const adapter = new PythonAdapter()
23
+ *
24
+ * const result = adapter.parseFile(`
25
+ * import os
26
+ * from django.http import HttpResponse
27
+ *
28
+ * def hello(request):
29
+ * return HttpResponse("Hello")
30
+ * `, 'views.py')
31
+ *
32
+ * console.log(result.imports) // [{ module: 'os', ... }, { module: 'django.http', ... }]
33
+ * console.log(result.functions) // [{ name: 'hello', ... }]
34
+ * ```
35
+ */
36
+ export declare class PythonAdapter extends LanguageAdapter {
37
+ readonly language: SupportedLanguage;
38
+ readonly extensions: string[];
39
+ private parser;
40
+ private parserInitialized;
41
+ private parserInitPromise;
42
+ /**
43
+ * Initialize the tree-sitter parser (lazy loaded)
44
+ *
45
+ * This method is called automatically when using parseFileAsync.
46
+ * Tree-sitter provides more accurate parsing but requires WASM modules.
47
+ */
48
+ initParser(): Promise<void>;
49
+ private doInitParser;
50
+ /**
51
+ * Parse a Python file using regex-based parsing
52
+ *
53
+ * @param content - Python source code
54
+ * @param filePath - Path to the file (for source tracking)
55
+ * @returns Parsed imports, exports, and functions
56
+ */
57
+ parseFile(content: string, filePath: string): ParseResult;
58
+ /**
59
+ * Parse a Python file asynchronously with tree-sitter (if available)
60
+ *
61
+ * Falls back to regex parsing if tree-sitter is not available.
62
+ *
63
+ * @param content - Python source code
64
+ * @param filePath - Path to the file (for source tracking)
65
+ * @returns Promise resolving to parsed imports, exports, and functions
66
+ */
67
+ parseFileAsync(content: string, filePath: string): Promise<ParseResult>;
68
+ /**
69
+ * Parse file incrementally using previous parse tree
70
+ *
71
+ * Currently falls back to full regex parsing. Tree-sitter
72
+ * incremental parsing will be implemented in SMI-1309.
73
+ *
74
+ * @param content - Updated Python source code
75
+ * @param filePath - Path to the file
76
+ * @param _previousTree - Previous parse tree (not yet used)
77
+ * @returns Parsed imports, exports, and functions
78
+ */
79
+ parseIncremental(content: string, filePath: string, _previousTree?: unknown): ParseResult;
80
+ /**
81
+ * Get Python framework detection rules
82
+ *
83
+ * Detects common Python frameworks and libraries including:
84
+ * - Web frameworks: Django, FastAPI, Flask
85
+ * - Testing: pytest
86
+ * - Data science: pandas, numpy
87
+ * - Databases: SQLAlchemy
88
+ * - Task queues: Celery
89
+ *
90
+ * @returns Array of framework detection rules
91
+ */
92
+ getFrameworkRules(): FrameworkRule[];
93
+ /**
94
+ * Clean up resources
95
+ */
96
+ dispose(): void;
97
+ /**
98
+ * Parse Python source code using regex patterns
99
+ *
100
+ * @param content - Python source code
101
+ * @param filePath - Path to the file
102
+ * @returns Parsed result
103
+ */
104
+ private parseWithRegex;
105
+ /**
106
+ * Extract imports from Python source code
107
+ *
108
+ * Handles:
109
+ * - `import module`
110
+ * - `import module as alias`
111
+ * - `from module import name`
112
+ * - `from module import name as alias`
113
+ * - `from module import *`
114
+ * - `from module import (name1, name2)`
115
+ *
116
+ * @param content - Python source code
117
+ * @param filePath - Path to the file
118
+ * @returns Array of import information
119
+ */
120
+ private extractImports;
121
+ /**
122
+ * Parse comma-separated import names, handling aliases
123
+ *
124
+ * @param namesStr - String containing import names
125
+ * @returns Array of imported names (without aliases)
126
+ */
127
+ private parseImportNames;
128
+ /**
129
+ * Extract exports from Python source code
130
+ *
131
+ * In Python, exports are determined by:
132
+ * 1. `__all__` list (explicit exports)
133
+ * 2. Top-level class/function definitions (implicit, if not starting with _)
134
+ *
135
+ * @param content - Python source code
136
+ * @param filePath - Path to the file
137
+ * @returns Array of export information
138
+ */
139
+ private extractExports;
140
+ /**
141
+ * Extract function definitions from Python source code
142
+ *
143
+ * Handles:
144
+ * - Regular functions: `def func():`
145
+ * - Async functions: `async def func():`
146
+ * - Methods (indented functions)
147
+ *
148
+ * @param content - Python source code
149
+ * @param filePath - Path to the file
150
+ * @returns Array of function information
151
+ */
152
+ private extractFunctions;
153
+ /**
154
+ * Parse Python source code using tree-sitter for more accurate results
155
+ *
156
+ * Tree-sitter provides a full AST which enables more accurate parsing
157
+ * of complex Python constructs.
158
+ *
159
+ * @param content - Python source code
160
+ * @param filePath - Path to the file
161
+ * @returns Parsed result
162
+ */
163
+ private parseWithTreeSitter;
164
+ }
165
+ //# sourceMappingURL=python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../../src/analysis/adapters/python.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAA;AACvF,OAAO,KAAK,EAAE,WAAW,EAAwC,MAAM,aAAa,CAAA;AAEpF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,aAAc,SAAQ,eAAe;IAChD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAW;IAC/C,QAAQ,CAAC,UAAU,WAA0B;IAE7C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,iBAAiB,CAA6B;IAEtD;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAQnB,YAAY;IAkC1B;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW;IAIzD;;;;;;;;OAQG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAc7E;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,WAAW;IAKzF;;;;;;;;;;;OAWG;IACH,iBAAiB,IAAI,aAAa,EAAE;IAsEpC;;OAEG;IACH,OAAO,IAAI,IAAI;IAaf;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAOtB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,cAAc;IAkFtB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,cAAc;IAkEtB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;CAM5B"}