@defai.digital/ax-cli 3.4.6 → 3.5.4

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 (223) hide show
  1. package/LICENSE +2 -6
  2. package/README.md +109 -2
  3. package/dist/analyzers/ast/index.d.ts +9 -0
  4. package/dist/analyzers/ast/index.js +10 -0
  5. package/dist/analyzers/ast/index.js.map +1 -0
  6. package/dist/analyzers/ast/node-helpers.d.ts +81 -0
  7. package/dist/analyzers/ast/node-helpers.js +128 -0
  8. package/dist/analyzers/ast/node-helpers.js.map +1 -0
  9. package/dist/analyzers/ast/parser.d.ts +59 -0
  10. package/dist/analyzers/ast/parser.js +293 -0
  11. package/dist/analyzers/ast/parser.js.map +1 -0
  12. package/dist/analyzers/ast/traverser.d.ts +67 -0
  13. package/dist/analyzers/ast/traverser.js +156 -0
  14. package/dist/analyzers/ast/traverser.js.map +1 -0
  15. package/dist/analyzers/ast/types.d.ts +107 -0
  16. package/dist/analyzers/ast/types.js +7 -0
  17. package/dist/analyzers/ast/types.js.map +1 -0
  18. package/dist/analyzers/best-practices/index.d.ts +10 -0
  19. package/dist/analyzers/best-practices/index.js +11 -0
  20. package/dist/analyzers/best-practices/index.js.map +1 -0
  21. package/dist/analyzers/code-smells/base-smell-detector.d.ts +30 -0
  22. package/dist/analyzers/code-smells/base-smell-detector.js +44 -0
  23. package/dist/analyzers/code-smells/base-smell-detector.js.map +1 -0
  24. package/dist/analyzers/code-smells/code-smell-analyzer.d.ts +30 -0
  25. package/dist/analyzers/code-smells/code-smell-analyzer.js +167 -0
  26. package/dist/analyzers/code-smells/code-smell-analyzer.js.map +1 -0
  27. package/dist/analyzers/code-smells/detectors/data-clumps-detector.d.ts +11 -0
  28. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js +66 -0
  29. package/dist/analyzers/code-smells/detectors/data-clumps-detector.js.map +1 -0
  30. package/dist/analyzers/code-smells/detectors/dead-code-detector.d.ts +11 -0
  31. package/dist/analyzers/code-smells/detectors/dead-code-detector.js +53 -0
  32. package/dist/analyzers/code-smells/detectors/dead-code-detector.js.map +1 -0
  33. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.d.ts +11 -0
  34. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +51 -0
  35. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +1 -0
  36. package/dist/analyzers/code-smells/detectors/feature-envy-detector.d.ts +11 -0
  37. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js +64 -0
  38. package/dist/analyzers/code-smells/detectors/feature-envy-detector.js.map +1 -0
  39. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.d.ts +11 -0
  40. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js +56 -0
  41. package/dist/analyzers/code-smells/detectors/inappropriate-intimacy-detector.js.map +1 -0
  42. package/dist/analyzers/code-smells/detectors/large-class-detector.d.ts +13 -0
  43. package/dist/analyzers/code-smells/detectors/large-class-detector.js +58 -0
  44. package/dist/analyzers/code-smells/detectors/large-class-detector.js.map +1 -0
  45. package/dist/analyzers/code-smells/detectors/long-method-detector.d.ts +12 -0
  46. package/dist/analyzers/code-smells/detectors/long-method-detector.js +52 -0
  47. package/dist/analyzers/code-smells/detectors/long-method-detector.js.map +1 -0
  48. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.d.ts +12 -0
  49. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js +50 -0
  50. package/dist/analyzers/code-smells/detectors/long-parameter-list-detector.js.map +1 -0
  51. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.d.ts +12 -0
  52. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js +54 -0
  53. package/dist/analyzers/code-smells/detectors/magic-numbers-detector.js.map +1 -0
  54. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.d.ts +13 -0
  55. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js +71 -0
  56. package/dist/analyzers/code-smells/detectors/nested-conditionals-detector.js.map +1 -0
  57. package/dist/analyzers/code-smells/index.d.ts +16 -0
  58. package/dist/analyzers/code-smells/index.js +19 -0
  59. package/dist/analyzers/code-smells/index.js.map +1 -0
  60. package/dist/analyzers/code-smells/types.d.ts +82 -0
  61. package/dist/analyzers/code-smells/types.js +30 -0
  62. package/dist/analyzers/code-smells/types.js.map +1 -0
  63. package/dist/analyzers/dependency/circular-detector.d.ts +17 -0
  64. package/dist/analyzers/dependency/circular-detector.js +71 -0
  65. package/dist/analyzers/dependency/circular-detector.js.map +1 -0
  66. package/dist/analyzers/dependency/coupling-calculator.d.ts +24 -0
  67. package/dist/analyzers/dependency/coupling-calculator.js +86 -0
  68. package/dist/analyzers/dependency/coupling-calculator.js.map +1 -0
  69. package/dist/analyzers/dependency/dependency-analyzer.d.ts +40 -0
  70. package/dist/analyzers/dependency/dependency-analyzer.js +214 -0
  71. package/dist/analyzers/dependency/dependency-analyzer.js.map +1 -0
  72. package/dist/analyzers/dependency/dependency-graph.d.ts +57 -0
  73. package/dist/analyzers/dependency/dependency-graph.js +186 -0
  74. package/dist/analyzers/dependency/dependency-graph.js.map +1 -0
  75. package/dist/analyzers/dependency/index.d.ts +8 -0
  76. package/dist/analyzers/dependency/index.js +8 -0
  77. package/dist/analyzers/dependency/index.js.map +1 -0
  78. package/dist/analyzers/dependency/types.d.ts +105 -0
  79. package/dist/analyzers/dependency/types.js +5 -0
  80. package/dist/analyzers/dependency/types.js.map +1 -0
  81. package/dist/analyzers/git/churn-calculator.d.ts +34 -0
  82. package/dist/analyzers/git/churn-calculator.js +214 -0
  83. package/dist/analyzers/git/churn-calculator.js.map +1 -0
  84. package/dist/analyzers/git/git-analyzer.d.ts +19 -0
  85. package/dist/analyzers/git/git-analyzer.js +71 -0
  86. package/dist/analyzers/git/git-analyzer.js.map +1 -0
  87. package/dist/analyzers/git/hotspot-detector.d.ts +34 -0
  88. package/dist/analyzers/git/hotspot-detector.js +170 -0
  89. package/dist/analyzers/git/hotspot-detector.js.map +1 -0
  90. package/dist/analyzers/git/index.d.ts +7 -0
  91. package/dist/analyzers/git/index.js +7 -0
  92. package/dist/analyzers/git/index.js.map +1 -0
  93. package/dist/analyzers/git/types.d.ts +88 -0
  94. package/dist/analyzers/git/types.js +5 -0
  95. package/dist/analyzers/git/types.js.map +1 -0
  96. package/dist/analyzers/metrics/halstead-calculator.d.ts +30 -0
  97. package/dist/analyzers/metrics/halstead-calculator.js +150 -0
  98. package/dist/analyzers/metrics/halstead-calculator.js.map +1 -0
  99. package/dist/analyzers/metrics/index.d.ts +9 -0
  100. package/dist/analyzers/metrics/index.js +9 -0
  101. package/dist/analyzers/metrics/index.js.map +1 -0
  102. package/dist/analyzers/metrics/maintainability-calculator.d.ts +17 -0
  103. package/dist/analyzers/metrics/maintainability-calculator.js +46 -0
  104. package/dist/analyzers/metrics/maintainability-calculator.js.map +1 -0
  105. package/dist/analyzers/metrics/metrics-analyzer.d.ts +32 -0
  106. package/dist/analyzers/metrics/metrics-analyzer.js +140 -0
  107. package/dist/analyzers/metrics/metrics-analyzer.js.map +1 -0
  108. package/dist/analyzers/metrics/types.d.ts +67 -0
  109. package/dist/analyzers/metrics/types.js +5 -0
  110. package/dist/analyzers/metrics/types.js.map +1 -0
  111. package/dist/analyzers/security/base-detector.d.ts +58 -0
  112. package/dist/analyzers/security/base-detector.js +104 -0
  113. package/dist/analyzers/security/base-detector.js.map +1 -0
  114. package/dist/analyzers/security/detectors/command-injection-detector.d.ts +12 -0
  115. package/dist/analyzers/security/detectors/command-injection-detector.js +84 -0
  116. package/dist/analyzers/security/detectors/command-injection-detector.js.map +1 -0
  117. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.d.ts +16 -0
  118. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js +140 -0
  119. package/dist/analyzers/security/detectors/hardcoded-secrets-detector.js.map +1 -0
  120. package/dist/analyzers/security/detectors/insecure-deserialization-detector.d.ts +12 -0
  121. package/dist/analyzers/security/detectors/insecure-deserialization-detector.js +109 -0
  122. package/dist/analyzers/security/detectors/insecure-deserialization-detector.js.map +1 -0
  123. package/dist/analyzers/security/detectors/insecure-random-detector.d.ts +12 -0
  124. package/dist/analyzers/security/detectors/insecure-random-detector.js +61 -0
  125. package/dist/analyzers/security/detectors/insecure-random-detector.js.map +1 -0
  126. package/dist/analyzers/security/detectors/path-traversal-detector.d.ts +12 -0
  127. package/dist/analyzers/security/detectors/path-traversal-detector.js +82 -0
  128. package/dist/analyzers/security/detectors/path-traversal-detector.js.map +1 -0
  129. package/dist/analyzers/security/detectors/sql-injection-detector.d.ts +12 -0
  130. package/dist/analyzers/security/detectors/sql-injection-detector.js +88 -0
  131. package/dist/analyzers/security/detectors/sql-injection-detector.js.map +1 -0
  132. package/dist/analyzers/security/detectors/weak-crypto-detector.d.ts +12 -0
  133. package/dist/analyzers/security/detectors/weak-crypto-detector.js +104 -0
  134. package/dist/analyzers/security/detectors/weak-crypto-detector.js.map +1 -0
  135. package/dist/analyzers/security/detectors/xss-detector.d.ts +12 -0
  136. package/dist/analyzers/security/detectors/xss-detector.js +90 -0
  137. package/dist/analyzers/security/detectors/xss-detector.js.map +1 -0
  138. package/dist/analyzers/security/index.d.ts +16 -0
  139. package/dist/analyzers/security/index.js +18 -0
  140. package/dist/analyzers/security/index.js.map +1 -0
  141. package/dist/analyzers/security/security-analyzer.d.ts +38 -0
  142. package/dist/analyzers/security/security-analyzer.js +215 -0
  143. package/dist/analyzers/security/security-analyzer.js.map +1 -0
  144. package/dist/analyzers/security/types.d.ts +95 -0
  145. package/dist/analyzers/security/types.js +7 -0
  146. package/dist/analyzers/security/types.js.map +1 -0
  147. package/dist/hooks/use-enhanced-input.d.ts +0 -1
  148. package/dist/hooks/use-enhanced-input.js.map +1 -1
  149. package/dist/index.js +0 -0
  150. package/dist/mcp/validation.js +12 -6
  151. package/dist/mcp/validation.js.map +1 -1
  152. package/dist/tools/analysis-tools.d.ts +73 -0
  153. package/dist/tools/analysis-tools.js +422 -0
  154. package/dist/tools/analysis-tools.js.map +1 -0
  155. package/dist/tools/bash.js +2 -1
  156. package/dist/tools/bash.js.map +1 -1
  157. package/dist/ui/components/toast-notification.js +0 -1
  158. package/dist/ui/components/toast-notification.js.map +1 -1
  159. package/dist/ui/components/welcome-panel.js +1 -1
  160. package/dist/ui/components/welcome-panel.js.map +1 -1
  161. package/dist/ui/hooks/use-input-history.d.ts +9 -0
  162. package/dist/ui/hooks/use-input-history.js +117 -0
  163. package/dist/ui/hooks/use-input-history.js.map +1 -0
  164. package/dist/utils/parallel-analyzer.js +30 -17
  165. package/dist/utils/parallel-analyzer.js.map +1 -1
  166. package/eslint.config.js +3 -0
  167. package/package.json +5 -5
  168. package/vitest.config.ts +1 -0
  169. package/.ax-cli/checkpoints/2025-11-20/checkpoint-11e9e0ba-c39d-4fd2-aa77-bc818811c921.json +0 -69
  170. package/.ax-cli/checkpoints/2025-11-20/checkpoint-2b260b98-b418-4c7c-9694-e2b94967e662.json +0 -24
  171. package/.ax-cli/checkpoints/2025-11-20/checkpoint-7e03601e-e8ab-4cd7-9841-a74b66adf78f.json +0 -69
  172. package/.ax-cli/checkpoints/2025-11-20/checkpoint-7f9c6562-771f-4fd0-adcf-9e7e9ac34ae8.json +0 -44
  173. package/.ax-cli/checkpoints/2025-11-20/checkpoint-e1ebe666-4c3a-4367-ba5c-27fe512a9c70.json +0 -24
  174. package/.ax-cli/checkpoints/2025-11-21/checkpoint-15743e7d-430c-4d76-b6fc-955d7a5c250c.json +0 -44
  175. package/.ax-cli/checkpoints/2025-11-21/checkpoint-25cf7679-0b3f-4988-83d7-704548fbba91.json +0 -69
  176. package/.ax-cli/checkpoints/2025-11-21/checkpoint-54aedbac-6db0-464e-8ebb-dbb3979e6dca.json +0 -24
  177. package/.ax-cli/checkpoints/2025-11-21/checkpoint-7658aed8-fe5d-4222-903f-1a7c63717ea7.json +0 -24
  178. package/.ax-cli/checkpoints/2025-11-21/checkpoint-c9c13497-40dc-4294-a327-6a5fc854eaa1.json +0 -69
  179. package/automatosx.config.json +0 -333
  180. package/config/messages.yaml +0 -75
  181. package/config/models.yaml +0 -66
  182. package/config/prompts.yaml +0 -156
  183. package/config/settings.yaml +0 -86
  184. package/dist/commands/weather.d.ts +0 -8
  185. package/dist/commands/weather.js +0 -160
  186. package/dist/commands/weather.js.map +0 -1
  187. package/dist/grok/client.d.ts +0 -144
  188. package/dist/grok/client.js +0 -237
  189. package/dist/grok/client.js.map +0 -1
  190. package/dist/grok/tools.d.ts +0 -8
  191. package/dist/grok/tools.js +0 -318
  192. package/dist/grok/tools.js.map +0 -1
  193. package/dist/grok/types.d.ts +0 -291
  194. package/dist/grok/types.js +0 -127
  195. package/dist/grok/types.js.map +0 -1
  196. package/dist/tools/morph-editor.d.ts +0 -36
  197. package/dist/tools/morph-editor.js +0 -308
  198. package/dist/tools/morph-editor.js.map +0 -1
  199. package/dist/ui/components/session-recovery.d.ts +0 -12
  200. package/dist/ui/components/session-recovery.js +0 -93
  201. package/dist/ui/components/session-recovery.js.map +0 -1
  202. package/dist/utils/model-config.d.ts +0 -28
  203. package/dist/utils/model-config.js +0 -43
  204. package/dist/utils/model-config.js.map +0 -1
  205. package/dist/utils/tool-helpers.d.ts +0 -25
  206. package/dist/utils/tool-helpers.js +0 -79
  207. package/dist/utils/tool-helpers.js.map +0 -1
  208. package/packages/schemas/dist/index.d.ts +0 -14
  209. package/packages/schemas/dist/index.d.ts.map +0 -1
  210. package/packages/schemas/dist/index.js +0 -19
  211. package/packages/schemas/dist/index.js.map +0 -1
  212. package/packages/schemas/dist/public/core/brand-types.d.ts +0 -308
  213. package/packages/schemas/dist/public/core/brand-types.d.ts.map +0 -1
  214. package/packages/schemas/dist/public/core/brand-types.js +0 -243
  215. package/packages/schemas/dist/public/core/brand-types.js.map +0 -1
  216. package/packages/schemas/dist/public/core/enums.d.ts +0 -227
  217. package/packages/schemas/dist/public/core/enums.d.ts.map +0 -1
  218. package/packages/schemas/dist/public/core/enums.js +0 -222
  219. package/packages/schemas/dist/public/core/enums.js.map +0 -1
  220. package/packages/schemas/dist/public/core/id-types.d.ts +0 -286
  221. package/packages/schemas/dist/public/core/id-types.d.ts.map +0 -1
  222. package/packages/schemas/dist/public/core/id-types.js +0 -136
  223. package/packages/schemas/dist/public/core/id-types.js.map +0 -1
@@ -0,0 +1,293 @@
1
+ /**
2
+ * AST Parser
3
+ *
4
+ * Provides TypeScript/JavaScript AST parsing using ts-morph
5
+ */
6
+ import { Project, ScriptTarget, ModuleKind, SyntaxKind } from 'ts-morph';
7
+ export class ASTParser {
8
+ project;
9
+ constructor() {
10
+ this.project = new Project({
11
+ compilerOptions: {
12
+ target: ScriptTarget.Latest,
13
+ module: ModuleKind.CommonJS,
14
+ allowJs: true,
15
+ skipLibCheck: true,
16
+ },
17
+ skipAddingFilesFromTsConfig: true,
18
+ });
19
+ }
20
+ /**
21
+ * Parse a TypeScript/JavaScript file
22
+ */
23
+ parseFile(filePath) {
24
+ const sourceFile = this.project.addSourceFileAtPath(filePath);
25
+ try {
26
+ const functions = this.extractFunctions(sourceFile);
27
+ const classes = this.extractClasses(sourceFile);
28
+ const imports = this.extractImports(sourceFile);
29
+ const exports = this.extractExports(sourceFile);
30
+ return Object.freeze({
31
+ filePath,
32
+ functions: Object.freeze(functions),
33
+ classes: Object.freeze(classes),
34
+ imports: Object.freeze(imports),
35
+ exports: Object.freeze(exports),
36
+ totalLines: sourceFile.getEndLineNumber(),
37
+ });
38
+ }
39
+ finally {
40
+ // Clean up to prevent memory leaks
41
+ this.project.removeSourceFile(sourceFile);
42
+ }
43
+ }
44
+ /**
45
+ * Parse file content directly
46
+ */
47
+ parseContent(content, filePath = 'temp.ts') {
48
+ const sourceFile = this.project.createSourceFile(filePath, content, { overwrite: true });
49
+ try {
50
+ const functions = this.extractFunctions(sourceFile);
51
+ const classes = this.extractClasses(sourceFile);
52
+ const imports = this.extractImports(sourceFile);
53
+ const exports = this.extractExports(sourceFile);
54
+ return Object.freeze({
55
+ filePath,
56
+ functions: Object.freeze(functions),
57
+ classes: Object.freeze(classes),
58
+ imports: Object.freeze(imports),
59
+ exports: Object.freeze(exports),
60
+ totalLines: sourceFile.getEndLineNumber(),
61
+ });
62
+ }
63
+ finally {
64
+ this.project.removeSourceFile(sourceFile);
65
+ }
66
+ }
67
+ /**
68
+ * Extract all functions from source file
69
+ */
70
+ extractFunctions(sourceFile) {
71
+ const functions = [];
72
+ sourceFile.getFunctions().forEach(func => {
73
+ const name = func.getName() || '<anonymous>';
74
+ const parameters = this.extractParameters(func);
75
+ const startLine = func.getStartLineNumber();
76
+ const endLine = func.getEndLineNumber();
77
+ functions.push(Object.freeze({
78
+ name,
79
+ parameters: Object.freeze(parameters),
80
+ returnType: func.getReturnType().getText(),
81
+ startLine,
82
+ endLine,
83
+ complexity: this.calculateCyclomaticComplexity(func.getBody()?.getText() || ''),
84
+ length: endLine - startLine + 1,
85
+ isAsync: func.isAsync(),
86
+ isExported: func.isExported(),
87
+ }));
88
+ });
89
+ return functions;
90
+ }
91
+ /**
92
+ * Extract all classes from source file
93
+ */
94
+ extractClasses(sourceFile) {
95
+ const classes = [];
96
+ sourceFile.getClasses().forEach(cls => {
97
+ const name = cls.getName() || '<anonymous>';
98
+ const methods = this.extractMethods(cls);
99
+ const properties = this.extractProperties(cls);
100
+ const startLine = cls.getStartLineNumber();
101
+ const endLine = cls.getEndLineNumber();
102
+ classes.push(Object.freeze({
103
+ name,
104
+ methods: Object.freeze(methods),
105
+ properties: Object.freeze(properties),
106
+ startLine,
107
+ endLine,
108
+ length: endLine - startLine + 1,
109
+ isExported: cls.isExported(),
110
+ extendsClass: cls.getExtends()?.getText(),
111
+ implementsInterfaces: Object.freeze(cls.getImplements().map(i => i.getText())),
112
+ }));
113
+ });
114
+ return classes;
115
+ }
116
+ /**
117
+ * Extract methods from a class
118
+ */
119
+ extractMethods(cls) {
120
+ const methods = [];
121
+ cls.getMethods().forEach((method) => {
122
+ const name = method.getName();
123
+ const parameters = this.extractParameters(method);
124
+ const startLine = method.getStartLineNumber();
125
+ const endLine = method.getEndLineNumber();
126
+ // Determine visibility
127
+ let visibility = 'public';
128
+ if (method.hasModifier(SyntaxKind.PrivateKeyword)) {
129
+ visibility = 'private';
130
+ }
131
+ else if (method.hasModifier(SyntaxKind.ProtectedKeyword)) {
132
+ visibility = 'protected';
133
+ }
134
+ methods.push(Object.freeze({
135
+ name,
136
+ parameters: Object.freeze(parameters),
137
+ returnType: method.getReturnType().getText(),
138
+ visibility,
139
+ isStatic: method.isStatic(),
140
+ isAsync: method.isAsync(),
141
+ complexity: this.calculateCyclomaticComplexity(method.getBody()?.getText() || ''),
142
+ length: endLine - startLine + 1,
143
+ startLine,
144
+ endLine,
145
+ }));
146
+ });
147
+ return methods;
148
+ }
149
+ /**
150
+ * Extract properties from a class
151
+ */
152
+ extractProperties(cls) {
153
+ const properties = [];
154
+ cls.getProperties().forEach((prop) => {
155
+ const name = prop.getName();
156
+ // Determine visibility
157
+ let visibility = 'public';
158
+ if (prop.hasModifier(SyntaxKind.PrivateKeyword)) {
159
+ visibility = 'private';
160
+ }
161
+ else if (prop.hasModifier(SyntaxKind.ProtectedKeyword)) {
162
+ visibility = 'protected';
163
+ }
164
+ properties.push(Object.freeze({
165
+ name,
166
+ type: prop.getType().getText(),
167
+ visibility,
168
+ isReadonly: prop.isReadonly(),
169
+ isStatic: prop.isStatic(),
170
+ hasInitializer: prop.hasInitializer(),
171
+ }));
172
+ });
173
+ return properties;
174
+ }
175
+ /**
176
+ * Extract parameters from a function or method
177
+ */
178
+ extractParameters(func) {
179
+ const parameters = [];
180
+ func.getParameters().forEach((param) => {
181
+ parameters.push(Object.freeze({
182
+ name: param.getName(),
183
+ type: param.getType().getText(),
184
+ isOptional: param.isOptional(),
185
+ hasDefault: param.hasInitializer(),
186
+ }));
187
+ });
188
+ return parameters;
189
+ }
190
+ /**
191
+ * Extract imports from source file
192
+ */
193
+ extractImports(sourceFile) {
194
+ const imports = [];
195
+ sourceFile.getImportDeclarations().forEach(imp => {
196
+ const moduleSpecifier = imp.getModuleSpecifierValue();
197
+ const namedImports = imp.getNamedImports().map(n => n.getName());
198
+ const defaultImport = imp.getDefaultImport()?.getText();
199
+ const namespaceImport = imp.getNamespaceImport()?.getText();
200
+ // Determine if external (starts with letter, not './' or '../')
201
+ const isExternal = !moduleSpecifier.startsWith('.') && !moduleSpecifier.startsWith('/');
202
+ // Check if type-only import
203
+ const isTypeOnly = imp.isTypeOnly();
204
+ imports.push(Object.freeze({
205
+ moduleSpecifier,
206
+ namedImports: Object.freeze(namedImports),
207
+ defaultImport,
208
+ namespaceImport,
209
+ isExternal,
210
+ isTypeOnly,
211
+ }));
212
+ });
213
+ return imports;
214
+ }
215
+ /**
216
+ * Extract exports from source file
217
+ */
218
+ extractExports(sourceFile) {
219
+ const exports = [];
220
+ // Named exports
221
+ sourceFile.getExportDeclarations().forEach(exp => {
222
+ exp.getNamedExports().forEach(named => {
223
+ exports.push(Object.freeze({
224
+ name: named.getName(),
225
+ isDefault: false,
226
+ type: 'variable',
227
+ }));
228
+ });
229
+ });
230
+ // Exported functions
231
+ sourceFile.getFunctions().forEach(func => {
232
+ if (func.isExported()) {
233
+ exports.push(Object.freeze({
234
+ name: func.getName() || '<anonymous>',
235
+ isDefault: func.isDefaultExport(),
236
+ type: 'function',
237
+ }));
238
+ }
239
+ });
240
+ // Exported classes
241
+ sourceFile.getClasses().forEach(cls => {
242
+ if (cls.isExported()) {
243
+ exports.push(Object.freeze({
244
+ name: cls.getName() || '<anonymous>',
245
+ isDefault: cls.isDefaultExport(),
246
+ type: 'class',
247
+ }));
248
+ }
249
+ });
250
+ return exports;
251
+ }
252
+ /**
253
+ * Calculate cyclomatic complexity (simplified)
254
+ */
255
+ calculateCyclomaticComplexity(code) {
256
+ let complexity = 1;
257
+ // Count decision points
258
+ const patterns = [
259
+ /\bif\b/g,
260
+ /\belse\s+if\b/g,
261
+ /\bfor\b/g,
262
+ /\bwhile\b/g,
263
+ /\bcase\b/g,
264
+ /\bcatch\b/g,
265
+ /&&/g,
266
+ /\|\|/g,
267
+ /\?/g,
268
+ ];
269
+ for (const pattern of patterns) {
270
+ const matches = code.match(pattern);
271
+ if (matches) {
272
+ complexity += matches.length;
273
+ }
274
+ }
275
+ return complexity;
276
+ }
277
+ /**
278
+ * Get raw source file for advanced operations
279
+ */
280
+ getSourceFile(filePath) {
281
+ return this.project.addSourceFileAtPath(filePath);
282
+ }
283
+ /**
284
+ * Clear project cache
285
+ */
286
+ clear() {
287
+ const sourceFiles = this.project.getSourceFiles();
288
+ for (const sourceFile of sourceFiles) {
289
+ this.project.removeSourceFile(sourceFile);
290
+ }
291
+ }
292
+ }
293
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/analyzers/ast/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * AST Traverser
3
+ *
4
+ * Utilities for traversing and visiting AST nodes
5
+ */
6
+ import type { FileASTInfo, FunctionInfo, ClassInfo, MethodInfo, NodeVisitor } from './types.js';
7
+ /**
8
+ * Visit all functions in a file AST
9
+ */
10
+ export declare function visitFunctions(ast: FileASTInfo, visitor: NodeVisitor<FunctionInfo>): void;
11
+ /**
12
+ * Visit all classes in a file AST
13
+ */
14
+ export declare function visitClasses(ast: FileASTInfo, visitor: NodeVisitor<ClassInfo>): void;
15
+ /**
16
+ * Visit all methods in all classes
17
+ */
18
+ export declare function visitMethods(ast: FileASTInfo, visitor: NodeVisitor<MethodInfo>): void;
19
+ /**
20
+ * Find first function matching predicate
21
+ */
22
+ export declare function findFunction(ast: FileASTInfo, predicate: (func: FunctionInfo) => boolean): FunctionInfo | undefined;
23
+ /**
24
+ * Find all functions matching predicate
25
+ */
26
+ export declare function findFunctions(ast: FileASTInfo, predicate: (func: FunctionInfo) => boolean): FunctionInfo[];
27
+ /**
28
+ * Find first class matching predicate
29
+ */
30
+ export declare function findClass(ast: FileASTInfo, predicate: (cls: ClassInfo) => boolean): ClassInfo | undefined;
31
+ /**
32
+ * Find all classes matching predicate
33
+ */
34
+ export declare function findClasses(ast: FileASTInfo, predicate: (cls: ClassInfo) => boolean): ClassInfo[];
35
+ /**
36
+ * Find method by name in a specific class
37
+ */
38
+ export declare function findMethodInClass(cls: ClassInfo, methodName: string): MethodInfo | undefined;
39
+ /**
40
+ * Collect all items matching a condition
41
+ */
42
+ export declare function collect<T>(items: readonly T[], predicate: (item: T) => boolean): T[];
43
+ /**
44
+ * Map over all functions and classes
45
+ */
46
+ export declare function mapAllCallables<T>(ast: FileASTInfo, funcMapper: (func: FunctionInfo) => T, methodMapper: (method: MethodInfo, className: string) => T): T[];
47
+ /**
48
+ * Count total callables (functions + methods)
49
+ */
50
+ export declare function countCallables(ast: FileASTInfo): number;
51
+ /**
52
+ * Get all callable names (functions and methods)
53
+ */
54
+ export declare function getAllCallableNames(ast: FileASTInfo): string[];
55
+ /**
56
+ * Check if file has any high-complexity functions/methods
57
+ */
58
+ export declare function hasHighComplexity(ast: FileASTInfo, threshold?: number): boolean;
59
+ /**
60
+ * Get complexity statistics
61
+ */
62
+ export declare function getComplexityStats(ast: FileASTInfo): {
63
+ min: number;
64
+ max: number;
65
+ average: number;
66
+ total: number;
67
+ };
@@ -0,0 +1,156 @@
1
+ /**
2
+ * AST Traverser
3
+ *
4
+ * Utilities for traversing and visiting AST nodes
5
+ */
6
+ /**
7
+ * Visit all functions in a file AST
8
+ */
9
+ export function visitFunctions(ast, visitor) {
10
+ for (const func of ast.functions) {
11
+ const result = visitor(func);
12
+ if (result === false)
13
+ break; // Early exit if visitor returns false
14
+ }
15
+ }
16
+ /**
17
+ * Visit all classes in a file AST
18
+ */
19
+ export function visitClasses(ast, visitor) {
20
+ for (const cls of ast.classes) {
21
+ const result = visitor(cls);
22
+ if (result === false)
23
+ break;
24
+ }
25
+ }
26
+ /**
27
+ * Visit all methods in all classes
28
+ */
29
+ export function visitMethods(ast, visitor) {
30
+ for (const cls of ast.classes) {
31
+ for (const method of cls.methods) {
32
+ const result = visitor(method);
33
+ if (result === false)
34
+ return; // Early exit
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * Find first function matching predicate
40
+ */
41
+ export function findFunction(ast, predicate) {
42
+ return ast.functions.find(predicate);
43
+ }
44
+ /**
45
+ * Find all functions matching predicate
46
+ */
47
+ export function findFunctions(ast, predicate) {
48
+ return ast.functions.filter(predicate);
49
+ }
50
+ /**
51
+ * Find first class matching predicate
52
+ */
53
+ export function findClass(ast, predicate) {
54
+ return ast.classes.find(predicate);
55
+ }
56
+ /**
57
+ * Find all classes matching predicate
58
+ */
59
+ export function findClasses(ast, predicate) {
60
+ return ast.classes.filter(predicate);
61
+ }
62
+ /**
63
+ * Find method by name in a specific class
64
+ */
65
+ export function findMethodInClass(cls, methodName) {
66
+ return cls.methods.find(m => m.name === methodName);
67
+ }
68
+ /**
69
+ * Collect all items matching a condition
70
+ */
71
+ export function collect(items, predicate) {
72
+ return items.filter(predicate);
73
+ }
74
+ /**
75
+ * Map over all functions and classes
76
+ */
77
+ export function mapAllCallables(ast, funcMapper, methodMapper) {
78
+ const results = [];
79
+ // Map functions
80
+ for (const func of ast.functions) {
81
+ results.push(funcMapper(func));
82
+ }
83
+ // Map methods
84
+ for (const cls of ast.classes) {
85
+ for (const method of cls.methods) {
86
+ results.push(methodMapper(method, cls.name));
87
+ }
88
+ }
89
+ return results;
90
+ }
91
+ /**
92
+ * Count total callables (functions + methods)
93
+ */
94
+ export function countCallables(ast) {
95
+ const functionCount = ast.functions.length;
96
+ const methodCount = ast.classes.reduce((sum, cls) => sum + cls.methods.length, 0);
97
+ return functionCount + methodCount;
98
+ }
99
+ /**
100
+ * Get all callable names (functions and methods)
101
+ */
102
+ export function getAllCallableNames(ast) {
103
+ const names = [];
104
+ for (const func of ast.functions) {
105
+ names.push(func.name);
106
+ }
107
+ for (const cls of ast.classes) {
108
+ for (const method of cls.methods) {
109
+ names.push(`${cls.name}.${method.name}`);
110
+ }
111
+ }
112
+ return names;
113
+ }
114
+ /**
115
+ * Check if file has any high-complexity functions/methods
116
+ */
117
+ export function hasHighComplexity(ast, threshold = 10) {
118
+ // Check functions
119
+ for (const func of ast.functions) {
120
+ if (func.complexity > threshold)
121
+ return true;
122
+ }
123
+ // Check methods
124
+ for (const cls of ast.classes) {
125
+ for (const method of cls.methods) {
126
+ if (method.complexity > threshold)
127
+ return true;
128
+ }
129
+ }
130
+ return false;
131
+ }
132
+ /**
133
+ * Get complexity statistics
134
+ */
135
+ export function getComplexityStats(ast) {
136
+ const complexities = [];
137
+ // Collect function complexities
138
+ for (const func of ast.functions) {
139
+ complexities.push(func.complexity);
140
+ }
141
+ // Collect method complexities
142
+ for (const cls of ast.classes) {
143
+ for (const method of cls.methods) {
144
+ complexities.push(method.complexity);
145
+ }
146
+ }
147
+ if (complexities.length === 0) {
148
+ return { min: 0, max: 0, average: 0, total: 0 };
149
+ }
150
+ const total = complexities.reduce((sum, c) => sum + c, 0);
151
+ const min = Math.min(...complexities);
152
+ const max = Math.max(...complexities);
153
+ const average = total / complexities.length;
154
+ return { min, max, average, total };
155
+ }
156
+ //# sourceMappingURL=traverser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverser.js","sourceRoot":"","sources":["../../../src/analyzers/ast/traverser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAgB,EAAE,OAAkC;IACjF,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,MAAM,KAAK,KAAK;YAAE,MAAM,CAAC,sCAAsC;IACrE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,OAA+B;IAC5E,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,KAAK;YAAE,MAAM;IAC9B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,OAAgC;IAC7E,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,MAAM,KAAK,KAAK;gBAAE,OAAO,CAAC,aAAa;QAC7C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,GAAgB,EAChB,SAA0C;IAE1C,OAAO,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAgB,EAChB,SAA0C;IAE1C,OAAO,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,GAAgB,EAChB,SAAsC;IAEtC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,GAAgB,EAChB,SAAsC;IAEtC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAc,EAAE,UAAkB;IAClE,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,KAAmB,EACnB,SAA+B;IAE/B,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAgB,EAChB,UAAqC,EACrC,YAA0D;IAE1D,MAAM,OAAO,GAAQ,EAAE,CAAC;IAExB,gBAAgB;IAChB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,cAAc;IACd,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAgB;IAC7C,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;IAC3C,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAClF,OAAO,aAAa,GAAG,WAAW,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAgB,EAAE,YAAoB,EAAE;IACxE,kBAAkB;IAClB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,UAAU,GAAG,SAAS;YAAE,OAAO,IAAI,CAAC;IAC/C,CAAC;IAED,gBAAgB;IAChB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,UAAU,GAAG,SAAS;gBAAE,OAAO,IAAI,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAgB;IAMjD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,gCAAgC;IAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACjC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,8BAA8B;IAC9B,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACjC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC;IAE5C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * AST Parser Types
3
+ *
4
+ * Type definitions for AST-based analysis
5
+ */
6
+ import type { SourceFile, FunctionDeclaration, ClassDeclaration, MethodDeclaration, ImportDeclaration, ExportDeclaration } from 'ts-morph';
7
+ /**
8
+ * Function information extracted from AST
9
+ */
10
+ export interface FunctionInfo {
11
+ readonly name: string;
12
+ readonly parameters: ReadonlyArray<ParameterInfo>;
13
+ readonly returnType?: string;
14
+ readonly startLine: number;
15
+ readonly endLine: number;
16
+ readonly complexity: number;
17
+ readonly length: number;
18
+ readonly isAsync: boolean;
19
+ readonly isExported: boolean;
20
+ }
21
+ /**
22
+ * Parameter information
23
+ */
24
+ export interface ParameterInfo {
25
+ readonly name: string;
26
+ readonly type?: string;
27
+ readonly isOptional: boolean;
28
+ readonly hasDefault: boolean;
29
+ }
30
+ /**
31
+ * Class information extracted from AST
32
+ */
33
+ export interface ClassInfo {
34
+ readonly name: string;
35
+ readonly methods: ReadonlyArray<MethodInfo>;
36
+ readonly properties: ReadonlyArray<PropertyInfo>;
37
+ readonly startLine: number;
38
+ readonly endLine: number;
39
+ readonly length: number;
40
+ readonly isExported: boolean;
41
+ readonly extendsClass?: string;
42
+ readonly implementsInterfaces: ReadonlyArray<string>;
43
+ }
44
+ /**
45
+ * Method information
46
+ */
47
+ export interface MethodInfo {
48
+ readonly name: string;
49
+ readonly parameters: ReadonlyArray<ParameterInfo>;
50
+ readonly returnType?: string;
51
+ readonly visibility: 'public' | 'private' | 'protected';
52
+ readonly isStatic: boolean;
53
+ readonly isAsync: boolean;
54
+ readonly complexity: number;
55
+ readonly length: number;
56
+ readonly startLine: number;
57
+ readonly endLine: number;
58
+ }
59
+ /**
60
+ * Property information
61
+ */
62
+ export interface PropertyInfo {
63
+ readonly name: string;
64
+ readonly type?: string;
65
+ readonly visibility: 'public' | 'private' | 'protected';
66
+ readonly isReadonly: boolean;
67
+ readonly isStatic: boolean;
68
+ readonly hasInitializer: boolean;
69
+ }
70
+ /**
71
+ * Import information
72
+ */
73
+ export interface ImportInfo {
74
+ readonly moduleSpecifier: string;
75
+ readonly namedImports: ReadonlyArray<string>;
76
+ readonly defaultImport?: string;
77
+ readonly namespaceImport?: string;
78
+ readonly isExternal: boolean;
79
+ readonly isTypeOnly: boolean;
80
+ }
81
+ /**
82
+ * Export information
83
+ */
84
+ export interface ExportInfo {
85
+ readonly name: string;
86
+ readonly isDefault: boolean;
87
+ readonly type: 'function' | 'class' | 'variable' | 'type';
88
+ }
89
+ /**
90
+ * File AST information
91
+ */
92
+ export interface FileASTInfo {
93
+ readonly filePath: string;
94
+ readonly functions: ReadonlyArray<FunctionInfo>;
95
+ readonly classes: ReadonlyArray<ClassInfo>;
96
+ readonly imports: ReadonlyArray<ImportInfo>;
97
+ readonly exports: ReadonlyArray<ExportInfo>;
98
+ readonly totalLines: number;
99
+ }
100
+ /**
101
+ * AST node visitor callback
102
+ */
103
+ export type NodeVisitor<T> = (node: T) => void | boolean;
104
+ /**
105
+ * Re-export ts-morph types for convenience
106
+ */
107
+ export type { SourceFile, FunctionDeclaration, ClassDeclaration, MethodDeclaration, ImportDeclaration, ExportDeclaration };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * AST Parser Types
3
+ *
4
+ * Type definitions for AST-based analysis
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analyzers/ast/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Best Practice Analyzer Module
3
+ *
4
+ * Exports all best practice validation components
5
+ */
6
+ export { BestPracticeValidator } from './best-practice-validator.js';
7
+ export { BaseValidationRule } from './base-rule.js';
8
+ export { getRuleRegistry } from './rules/index.js';
9
+ export * from './rules/typescript/index.js';
10
+ export type { ValidationRule, RuleCategory, RuleConfig, ValidationOptions, RuleRegistry, ViolationFix, TextEdit, TextRange, Position, } from './types.js';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Best Practice Analyzer Module
3
+ *
4
+ * Exports all best practice validation components
5
+ */
6
+ export { BestPracticeValidator } from './best-practice-validator.js';
7
+ export { BaseValidationRule } from './base-rule.js';
8
+ export { getRuleRegistry } from './rules/index.js';
9
+ // Export all TypeScript rules
10
+ export * from './rules/typescript/index.js';
11
+ //# sourceMappingURL=index.js.map