@codeledger/cli 0.6.7 → 0.6.8

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 (111) hide show
  1. package/dist/architecture-graph/dependency-scanner.d.ts +16 -0
  2. package/dist/architecture-graph/dependency-scanner.d.ts.map +1 -0
  3. package/dist/architecture-graph/dependency-scanner.js +96 -0
  4. package/dist/architecture-graph/dependency-scanner.js.map +1 -0
  5. package/dist/architecture-graph/graph-builder.d.ts +70 -0
  6. package/dist/architecture-graph/graph-builder.d.ts.map +1 -0
  7. package/dist/architecture-graph/graph-builder.js +231 -0
  8. package/dist/architecture-graph/graph-builder.js.map +1 -0
  9. package/dist/architecture-graph/index.d.ts +4 -0
  10. package/dist/architecture-graph/index.d.ts.map +1 -0
  11. package/dist/architecture-graph/index.js +7 -0
  12. package/dist/architecture-graph/index.js.map +1 -0
  13. package/dist/architecture-graph/service-scanner.d.ts +22 -0
  14. package/dist/architecture-graph/service-scanner.d.ts.map +1 -0
  15. package/dist/architecture-graph/service-scanner.js +181 -0
  16. package/dist/architecture-graph/service-scanner.js.map +1 -0
  17. package/dist/commands/audit-export.d.ts +8 -0
  18. package/dist/commands/audit-export.d.ts.map +1 -0
  19. package/dist/commands/audit-export.js +190 -0
  20. package/dist/commands/audit-export.js.map +1 -0
  21. package/dist/commands/fix.d.ts +7 -0
  22. package/dist/commands/fix.d.ts.map +1 -0
  23. package/dist/commands/fix.js +107 -0
  24. package/dist/commands/fix.js.map +1 -0
  25. package/dist/commands/graph.d.ts +8 -0
  26. package/dist/commands/graph.d.ts.map +1 -0
  27. package/dist/commands/graph.js +29 -0
  28. package/dist/commands/graph.js.map +1 -0
  29. package/dist/commands/learn.d.ts +8 -0
  30. package/dist/commands/learn.d.ts.map +1 -0
  31. package/dist/commands/learn.js +33 -0
  32. package/dist/commands/learn.js.map +1 -0
  33. package/dist/commands/pack.d.ts +12 -0
  34. package/dist/commands/pack.d.ts.map +1 -0
  35. package/dist/commands/pack.js +75 -0
  36. package/dist/commands/pack.js.map +1 -0
  37. package/dist/commands/serve.d.ts +13 -0
  38. package/dist/commands/serve.d.ts.map +1 -0
  39. package/dist/commands/serve.js +179 -0
  40. package/dist/commands/serve.js.map +1 -0
  41. package/dist/commands/setup-ci.d.ts +6 -4
  42. package/dist/commands/setup-ci.d.ts.map +1 -1
  43. package/dist/commands/setup-ci.js +216 -23
  44. package/dist/commands/setup-ci.js.map +1 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +82 -3
  47. package/dist/index.js.map +1 -1
  48. package/dist/review-intelligence/detectors/cjs-named-import.d.ts +13 -0
  49. package/dist/review-intelligence/detectors/cjs-named-import.d.ts.map +1 -0
  50. package/dist/review-intelligence/detectors/cjs-named-import.js +134 -0
  51. package/dist/review-intelligence/detectors/cjs-named-import.js.map +1 -0
  52. package/dist/review-intelligence/detectors/exact-count-assertion.d.ts +17 -0
  53. package/dist/review-intelligence/detectors/exact-count-assertion.d.ts.map +1 -0
  54. package/dist/review-intelligence/detectors/exact-count-assertion.js +93 -0
  55. package/dist/review-intelligence/detectors/exact-count-assertion.js.map +1 -0
  56. package/dist/review-intelligence/detectors/exports-map-missing.d.ts +14 -0
  57. package/dist/review-intelligence/detectors/exports-map-missing.d.ts.map +1 -0
  58. package/dist/review-intelligence/detectors/exports-map-missing.js +131 -0
  59. package/dist/review-intelligence/detectors/exports-map-missing.js.map +1 -0
  60. package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts +12 -0
  61. package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts.map +1 -0
  62. package/dist/review-intelligence/detectors/fixture-keyword-drift.js +82 -0
  63. package/dist/review-intelligence/detectors/fixture-keyword-drift.js.map +1 -0
  64. package/dist/review-intelligence/detectors/optional-infra-crash.d.ts +12 -0
  65. package/dist/review-intelligence/detectors/optional-infra-crash.d.ts.map +1 -0
  66. package/dist/review-intelligence/detectors/optional-infra-crash.js +97 -0
  67. package/dist/review-intelligence/detectors/optional-infra-crash.js.map +1 -0
  68. package/dist/review-intelligence/detectors/undeclared-dependency.d.ts +11 -0
  69. package/dist/review-intelligence/detectors/undeclared-dependency.d.ts.map +1 -0
  70. package/dist/review-intelligence/detectors/undeclared-dependency.js +100 -0
  71. package/dist/review-intelligence/detectors/undeclared-dependency.js.map +1 -0
  72. package/dist/review-intelligence/engine/ast-parser.d.ts +90 -0
  73. package/dist/review-intelligence/engine/ast-parser.d.ts.map +1 -0
  74. package/dist/review-intelligence/engine/ast-parser.js +266 -0
  75. package/dist/review-intelligence/engine/ast-parser.js.map +1 -0
  76. package/dist/review-intelligence/engine/dataflow.d.ts +34 -0
  77. package/dist/review-intelligence/engine/dataflow.d.ts.map +1 -0
  78. package/dist/review-intelligence/engine/dataflow.js +115 -0
  79. package/dist/review-intelligence/engine/dataflow.js.map +1 -0
  80. package/dist/review-intelligence/engine/index.d.ts +7 -0
  81. package/dist/review-intelligence/engine/index.d.ts.map +1 -0
  82. package/dist/review-intelligence/engine/index.js +7 -0
  83. package/dist/review-intelligence/engine/index.js.map +1 -0
  84. package/dist/review-intelligence/engine/symbol-resolver.d.ts +34 -0
  85. package/dist/review-intelligence/engine/symbol-resolver.d.ts.map +1 -0
  86. package/dist/review-intelligence/engine/symbol-resolver.js +106 -0
  87. package/dist/review-intelligence/engine/symbol-resolver.js.map +1 -0
  88. package/dist/review-intelligence/fixes/index.d.ts +36 -0
  89. package/dist/review-intelligence/fixes/index.d.ts.map +1 -0
  90. package/dist/review-intelligence/fixes/index.js +157 -0
  91. package/dist/review-intelligence/fixes/index.js.map +1 -0
  92. package/dist/review-intelligence/index.d.ts.map +1 -1
  93. package/dist/review-intelligence/index.js +2 -0
  94. package/dist/review-intelligence/index.js.map +1 -1
  95. package/dist/review-intelligence/invariants.d.ts.map +1 -1
  96. package/dist/review-intelligence/invariants.js +14 -1
  97. package/dist/review-intelligence/invariants.js.map +1 -1
  98. package/dist/review-intelligence/learning/index.d.ts +39 -0
  99. package/dist/review-intelligence/learning/index.d.ts.map +1 -0
  100. package/dist/review-intelligence/learning/index.js +265 -0
  101. package/dist/review-intelligence/learning/index.js.map +1 -0
  102. package/dist/review-intelligence/packs/index.d.ts +69 -0
  103. package/dist/review-intelligence/packs/index.d.ts.map +1 -0
  104. package/dist/review-intelligence/packs/index.js +168 -0
  105. package/dist/review-intelligence/packs/index.js.map +1 -0
  106. package/dist/review-intelligence/repair-guidance.d.ts.map +1 -1
  107. package/dist/review-intelligence/repair-guidance.js +46 -0
  108. package/dist/review-intelligence/repair-guidance.js.map +1 -1
  109. package/dist/review-intelligence/types.d.ts +6 -1
  110. package/dist/review-intelligence/types.d.ts.map +1 -1
  111. package/package.json +9 -9
@@ -0,0 +1,266 @@
1
+ // ─── AST Parser ─────────────────────────────────────────────────────────────
2
+ //
3
+ // Lightweight TypeScript AST analysis using regex-based pattern matching
4
+ // with structural awareness. Provides the foundation for detecting
5
+ // call expressions, import declarations, generics, and variable references
6
+ // without requiring ts-morph or the full TypeScript compiler API as a
7
+ // runtime dependency.
8
+ //
9
+ // For non-TS files (Dockerfiles, YAML, JSON, shell), use the regex-based
10
+ // detectors directly.
11
+ const ANALYZABLE_EXTENSIONS = /\.(?:ts|tsx|js|jsx|mts|mjs|cts|cjs)$/;
12
+ /**
13
+ * Check if a file path is analyzable by the AST engine.
14
+ */
15
+ export function isAnalyzableFile(filePath) {
16
+ return ANALYZABLE_EXTENSIONS.test(filePath);
17
+ }
18
+ /**
19
+ * Parse all import declarations from TypeScript/JavaScript source.
20
+ */
21
+ export function parseImports(content) {
22
+ const imports = [];
23
+ const lines = content.split('\n');
24
+ for (let i = 0; i < lines.length; i++) {
25
+ const line = lines[i];
26
+ const trimmed = line.trim();
27
+ // Skip comments
28
+ if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) {
29
+ continue;
30
+ }
31
+ // Static imports: import { x } from 'y'; import x from 'y'; import * as x from 'y'
32
+ const staticImportMatch = /^import\s+(type\s+)?(.+?)\s+from\s+['"]([^'"]+)['"]/
33
+ .exec(trimmed);
34
+ if (staticImportMatch) {
35
+ const isTypeOnly = !!staticImportMatch[1];
36
+ const importClause = staticImportMatch[2];
37
+ const source = staticImportMatch[3];
38
+ const info = {
39
+ source,
40
+ namedImports: [],
41
+ isTypeOnly,
42
+ line: i + 1,
43
+ isDynamic: false,
44
+ };
45
+ // Namespace import: import * as X from '...'
46
+ const nsMatch = /^\*\s+as\s+(\w+)$/.exec(importClause);
47
+ if (nsMatch) {
48
+ info.namespaceImport = nsMatch[1];
49
+ }
50
+ // Named imports: import { a, b } from '...'
51
+ else if (importClause.includes('{')) {
52
+ const namedMatch = /\{([^}]+)\}/.exec(importClause);
53
+ if (namedMatch) {
54
+ info.namedImports = namedMatch[1]
55
+ .split(',')
56
+ .map((n) => n.trim().replace(/\s+as\s+\w+/, '').replace(/^type\s+/, ''))
57
+ .filter((n) => n.length > 0);
58
+ }
59
+ // Also check for default import before the braces: import X, { a, b } from '...'
60
+ const defaultBeforeBrace = /^(\w+)\s*,\s*\{/.exec(importClause);
61
+ if (defaultBeforeBrace) {
62
+ info.defaultImport = defaultBeforeBrace[1];
63
+ }
64
+ }
65
+ // Default import: import X from '...'
66
+ else {
67
+ const defaultMatch = /^(\w+)$/.exec(importClause.trim());
68
+ if (defaultMatch) {
69
+ info.defaultImport = defaultMatch[1];
70
+ }
71
+ }
72
+ imports.push(info);
73
+ continue;
74
+ }
75
+ // Side-effect imports: import 'module'
76
+ const sideEffectMatch = /^import\s+['"]([^'"]+)['"]/.exec(trimmed);
77
+ if (sideEffectMatch) {
78
+ imports.push({
79
+ source: sideEffectMatch[1],
80
+ namedImports: [],
81
+ isTypeOnly: false,
82
+ line: i + 1,
83
+ isDynamic: false,
84
+ });
85
+ continue;
86
+ }
87
+ // Dynamic imports: import('module') or await import('module')
88
+ const dynamicMatch = /\bimport\s*\(\s*['"]([^'"]+)['"]\s*\)/.exec(trimmed);
89
+ if (dynamicMatch && !trimmed.startsWith('import ')) {
90
+ imports.push({
91
+ source: dynamicMatch[1],
92
+ namedImports: [],
93
+ isTypeOnly: false,
94
+ line: i + 1,
95
+ isDynamic: true,
96
+ });
97
+ }
98
+ // require() calls
99
+ const requireMatch = /\brequire\s*\(\s*['"]([^'"]+)['"]\s*\)/.exec(trimmed);
100
+ if (requireMatch) {
101
+ imports.push({
102
+ source: requireMatch[1],
103
+ namedImports: [],
104
+ isTypeOnly: false,
105
+ line: i + 1,
106
+ isDynamic: true,
107
+ });
108
+ }
109
+ }
110
+ return imports;
111
+ }
112
+ /**
113
+ * Parse call expressions from source code.
114
+ */
115
+ export function parseCallExpressions(content) {
116
+ const calls = [];
117
+ const lines = content.split('\n');
118
+ for (let i = 0; i < lines.length; i++) {
119
+ const line = lines[i];
120
+ const trimmed = line.trim();
121
+ // Skip comments and imports
122
+ if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*'))
123
+ continue;
124
+ if (trimmed.startsWith('import '))
125
+ continue;
126
+ // Member calls
127
+ const memberPattern = /\b(\w+)\s*\.\s*(\w+)\s*(<[^>]*>)?\s*\(/g;
128
+ let match;
129
+ while ((match = memberPattern.exec(line)) !== null) {
130
+ const obj = match[1];
131
+ const method = match[2];
132
+ // Skip common non-calls
133
+ if (['if', 'for', 'while', 'switch', 'catch', 'return', 'typeof', 'class'].includes(obj))
134
+ continue;
135
+ calls.push({
136
+ callee: `${obj}.${method}`,
137
+ object: obj,
138
+ method,
139
+ line: i + 1,
140
+ rawText: match[0],
141
+ hasGenerics: !!match[3],
142
+ });
143
+ }
144
+ // Standalone function calls (not already captured as member calls)
145
+ const standalonePattern = /(?:^|[^.\w])(\w+)\s*(<[^>]*>)?\s*\(/g;
146
+ while ((match = standalonePattern.exec(line)) !== null) {
147
+ const name = match[1];
148
+ // Skip keywords and common false positives
149
+ if (['if', 'for', 'while', 'switch', 'catch', 'return', 'typeof', 'class', 'new', 'function', 'import', 'export', 'const', 'let', 'var', 'async', 'await'].includes(name))
150
+ continue;
151
+ calls.push({
152
+ callee: name,
153
+ line: i + 1,
154
+ rawText: match[0],
155
+ hasGenerics: !!match[2],
156
+ });
157
+ }
158
+ }
159
+ return calls;
160
+ }
161
+ /**
162
+ * Parse generic type usages from source code.
163
+ */
164
+ export function parseGenerics(content) {
165
+ const generics = [];
166
+ const lines = content.split('\n');
167
+ const genericPattern = /\b(\w+)\s*<([^>]+)>/g;
168
+ for (let i = 0; i < lines.length; i++) {
169
+ const line = lines[i];
170
+ const trimmed = line.trim();
171
+ if (trimmed.startsWith('//') || trimmed.startsWith('*'))
172
+ continue;
173
+ let match;
174
+ while ((match = genericPattern.exec(line)) !== null) {
175
+ const name = match[1];
176
+ // Skip common HTML-like tags and comparison operators
177
+ if (['return', 'const', 'let', 'var'].includes(name))
178
+ continue;
179
+ generics.push({
180
+ name,
181
+ typeArgs: match[2].trim(),
182
+ line: i + 1,
183
+ });
184
+ }
185
+ }
186
+ return generics;
187
+ }
188
+ /**
189
+ * Parse all exports from source code.
190
+ */
191
+ export function parseExports(content) {
192
+ const exports = [];
193
+ const lines = content.split('\n');
194
+ for (let i = 0; i < lines.length; i++) {
195
+ const line = lines[i];
196
+ const trimmed = line.trim();
197
+ // export default
198
+ if (/^export\s+default\s+/.test(trimmed)) {
199
+ const kindMatch = /^export\s+default\s+(?:async\s+)?(\w+)/.exec(trimmed);
200
+ const kind = kindMatch?.[1];
201
+ let exportKind = 'const';
202
+ if (kind === 'function')
203
+ exportKind = 'function';
204
+ else if (kind === 'class')
205
+ exportKind = 'class';
206
+ exports.push({
207
+ name: 'default',
208
+ kind: exportKind,
209
+ isDefault: true,
210
+ line: i + 1,
211
+ });
212
+ continue;
213
+ }
214
+ // export function/const/class/type/interface/enum
215
+ const namedExportMatch = /^export\s+(?:async\s+)?(function|const|let|class|type|interface|enum)\s+(\w+)/.exec(trimmed);
216
+ if (namedExportMatch) {
217
+ const rawKind = namedExportMatch[1];
218
+ const kind = rawKind === 'let' ? 'const' : rawKind;
219
+ exports.push({
220
+ name: namedExportMatch[2],
221
+ kind,
222
+ isDefault: false,
223
+ line: i + 1,
224
+ });
225
+ continue;
226
+ }
227
+ // export { a, b, c }
228
+ const reExportMatch = /^export\s*\{([^}]+)\}/.exec(trimmed);
229
+ if (reExportMatch) {
230
+ const names = reExportMatch[1].split(',').map((n) => n.trim().split(/\s+as\s+/).pop().trim());
231
+ for (const name of names) {
232
+ if (name) {
233
+ exports.push({
234
+ name,
235
+ kind: 'reexport',
236
+ isDefault: false,
237
+ line: i + 1,
238
+ });
239
+ }
240
+ }
241
+ }
242
+ }
243
+ return exports;
244
+ }
245
+ /**
246
+ * Perform full file analysis: imports, calls, generics, exports.
247
+ */
248
+ export function analyzeFile(filePath, content) {
249
+ if (!isAnalyzableFile(filePath)) {
250
+ return {
251
+ imports: [],
252
+ calls: [],
253
+ generics: [],
254
+ exports: [],
255
+ analyzable: false,
256
+ };
257
+ }
258
+ return {
259
+ imports: parseImports(content),
260
+ calls: parseCallExpressions(content),
261
+ generics: parseGenerics(content),
262
+ exports: parseExports(content),
263
+ analyzable: true,
264
+ };
265
+ }
266
+ //# sourceMappingURL=ast-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-parser.js","sourceRoot":"","sources":["../../../src/review-intelligence/engine/ast-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /** Represents a scope block (try/catch, if, function) */
2
+ export interface ScopeBlock {
3
+ kind: 'try' | 'catch' | 'if' | 'function' | 'arrow' | 'block';
4
+ startLine: number;
5
+ endLine: number;
6
+ }
7
+ /** Result of checking if a line is wrapped in try/catch */
8
+ export interface TryCatchInfo {
9
+ isWrapped: boolean;
10
+ tryStartLine?: number;
11
+ catchStartLine?: number;
12
+ }
13
+ /**
14
+ * Find all try/catch blocks in source code.
15
+ * Returns pairs of (try start line, catch start line, block end line).
16
+ */
17
+ export declare function findTryCatchBlocks(content: string): ScopeBlock[];
18
+ /**
19
+ * Check if a specific line is inside a try/catch block.
20
+ */
21
+ export declare function isInsideTryCatch(content: string, targetLine: number): TryCatchInfo;
22
+ /**
23
+ * Check if a variable assigned on one line is used in a function call nearby.
24
+ * Useful for detecting patterns like:
25
+ * const result = schema.safeParse(body);
26
+ * if (!result.success) return sendInvalidRequest(reply);
27
+ */
28
+ export declare function tracksVariableUsage(content: string, variableName: string, nearLine: number, windowSize?: number): boolean;
29
+ /**
30
+ * Detect guard-return patterns: if (condition) return/throw before a target line.
31
+ * This helps detect validation patterns that guard subsequent code.
32
+ */
33
+ export declare function hasGuardBefore(content: string, targetLine: number, guardPattern: RegExp, windowSize?: number): boolean;
34
+ //# sourceMappingURL=dataflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataflow.d.ts","sourceRoot":"","sources":["../../../src/review-intelligence/engine/dataflow.ts"],"names":[],"mappings":"AAOA,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CA6ChE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAoBlF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,MAAW,GACtB,OAAO,CAaT;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,GAAE,MAAW,GACtB,OAAO,CAqBT"}
@@ -0,0 +1,115 @@
1
+ // ─── Dataflow Analysis ──────────────────────────────────────────────────────
2
+ //
3
+ // Lightweight dataflow analysis for detecting patterns like:
4
+ // - try/catch wrapping around specific calls
5
+ // - variable assignments flowing into function arguments
6
+ // - guard patterns (if-return before usage)
7
+ /**
8
+ * Find all try/catch blocks in source code.
9
+ * Returns pairs of (try start line, catch start line, block end line).
10
+ */
11
+ export function findTryCatchBlocks(content) {
12
+ const blocks = [];
13
+ const lines = content.split('\n');
14
+ const braceStack = [];
15
+ for (let i = 0; i < lines.length; i++) {
16
+ const line = lines[i];
17
+ const trimmed = line.trim();
18
+ if (/^\s*try\s*\{/.test(line) || trimmed === 'try {') {
19
+ braceStack.push({ kind: 'try', startLine: i + 1 });
20
+ }
21
+ else if (/^\s*catch\s*/.test(line)) {
22
+ braceStack.push({ kind: 'catch', startLine: i + 1 });
23
+ }
24
+ // Count braces to track block ends
25
+ const opens = (line.match(/\{/g) ?? []).length;
26
+ const closes = (line.match(/\}/g) ?? []).length;
27
+ for (let c = 0; c < closes; c++) {
28
+ if (braceStack.length > 0) {
29
+ const top = braceStack.pop();
30
+ blocks.push({
31
+ kind: top.kind,
32
+ startLine: top.startLine,
33
+ endLine: i + 1,
34
+ });
35
+ }
36
+ }
37
+ // Re-push opens (minus the ones that also close on the same line)
38
+ // This is a simplified heuristic — for precise analysis, we'd need
39
+ // a real parser, but this works for common patterns
40
+ for (let o = 0; o < opens - closes; o++) {
41
+ if (/^\s*try\s*\{/.test(line) || trimmed === 'try {') {
42
+ // Already pushed above
43
+ }
44
+ else if (/^\s*catch\s*/.test(line)) {
45
+ // Already pushed above
46
+ }
47
+ else {
48
+ braceStack.push({ kind: 'block', startLine: i + 1 });
49
+ }
50
+ }
51
+ }
52
+ return blocks;
53
+ }
54
+ /**
55
+ * Check if a specific line is inside a try/catch block.
56
+ */
57
+ export function isInsideTryCatch(content, targetLine) {
58
+ const blocks = findTryCatchBlocks(content);
59
+ const tryBlocks = blocks.filter((b) => b.kind === 'try');
60
+ for (const tryBlock of tryBlocks) {
61
+ if (targetLine >= tryBlock.startLine && targetLine <= tryBlock.endLine) {
62
+ // Find the corresponding catch block
63
+ const catchBlock = blocks.find((b) => b.kind === 'catch' && b.startLine > tryBlock.endLine - 2 && b.startLine <= tryBlock.endLine + 1);
64
+ return {
65
+ isWrapped: true,
66
+ tryStartLine: tryBlock.startLine,
67
+ catchStartLine: catchBlock?.startLine,
68
+ };
69
+ }
70
+ }
71
+ return { isWrapped: false };
72
+ }
73
+ /**
74
+ * Check if a variable assigned on one line is used in a function call nearby.
75
+ * Useful for detecting patterns like:
76
+ * const result = schema.safeParse(body);
77
+ * if (!result.success) return sendInvalidRequest(reply);
78
+ */
79
+ export function tracksVariableUsage(content, variableName, nearLine, windowSize = 10) {
80
+ const lines = content.split('\n');
81
+ const start = Math.max(0, nearLine - 1 - windowSize);
82
+ const end = Math.min(lines.length, nearLine - 1 + windowSize);
83
+ for (let i = start; i < end; i++) {
84
+ const line = lines[i];
85
+ if (line && new RegExp(`\\b${variableName}\\b`).test(line)) {
86
+ return true;
87
+ }
88
+ }
89
+ return false;
90
+ }
91
+ /**
92
+ * Detect guard-return patterns: if (condition) return/throw before a target line.
93
+ * This helps detect validation patterns that guard subsequent code.
94
+ */
95
+ export function hasGuardBefore(content, targetLine, guardPattern, windowSize = 15) {
96
+ const lines = content.split('\n');
97
+ const start = Math.max(0, targetLine - 1 - windowSize);
98
+ const end = targetLine - 1;
99
+ for (let i = start; i < end; i++) {
100
+ const line = lines[i];
101
+ if (line && guardPattern.test(line)) {
102
+ // Check if this guard includes a return/throw
103
+ if (/\b(?:return|throw)\b/.test(line)) {
104
+ return true;
105
+ }
106
+ // Check next line for return/throw
107
+ const nextLine = lines[i + 1];
108
+ if (nextLine && /\b(?:return|throw)\b/.test(nextLine)) {
109
+ return true;
110
+ }
111
+ }
112
+ }
113
+ return false;
114
+ }
115
+ //# sourceMappingURL=dataflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataflow.js","sourceRoot":"","sources":["../../../src/review-intelligence/engine/dataflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { isAnalyzableFile, parseImports, parseCallExpressions, parseGenerics, parseExports, analyzeFile, } from './ast-parser.js';
2
+ export type { ImportInfo, CallExpressionInfo, GenericInfo, ExportInfo, FileAnalysis, } from './ast-parser.js';
3
+ export { findTryCatchBlocks, isInsideTryCatch, tracksVariableUsage, hasGuardBefore, } from './dataflow.js';
4
+ export type { ScopeBlock, TryCatchInfo } from './dataflow.js';
5
+ export { resolveModule, isWorkspacePackage, extractExternalPackages, isNamedCjsImport, } from './symbol-resolver.js';
6
+ export type { ModuleKind, ResolvedModule } from './symbol-resolver.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/review-intelligence/engine/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // ─── AST Engine ─────────────────────────────────────────────────────────────
2
+ //
3
+ // Re-exports for the AST analysis engine.
4
+ export { isAnalyzableFile, parseImports, parseCallExpressions, parseGenerics, parseExports, analyzeFile, } from './ast-parser.js';
5
+ export { findTryCatchBlocks, isInsideTryCatch, tracksVariableUsage, hasGuardBefore, } from './dataflow.js';
6
+ export { resolveModule, isWorkspacePackage, extractExternalPackages, isNamedCjsImport, } from './symbol-resolver.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/review-intelligence/engine/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,0CAA0C;AAE1C,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,iBAAiB,CAAC;AASzB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /** Classification of an import source */
2
+ export type ModuleKind = 'builtin' | 'local' | 'external' | 'workspace';
3
+ /** Resolved module information */
4
+ export interface ResolvedModule {
5
+ /** Original import specifier */
6
+ source: string;
7
+ /** Classification */
8
+ kind: ModuleKind;
9
+ /** Bare package name (e.g. 'lodash' from 'lodash/fp') */
10
+ packageName?: string;
11
+ /** Subpath (e.g. '/fp' from 'lodash/fp') */
12
+ subpath?: string;
13
+ }
14
+ /**
15
+ * Resolve an import source to its module classification.
16
+ */
17
+ export declare function resolveModule(source: string): ResolvedModule;
18
+ /**
19
+ * Check if a package name looks like a workspace package.
20
+ * Common patterns: @org/package where org matches the monorepo scope.
21
+ */
22
+ export declare function isWorkspacePackage(packageName: string, workspaceScopes: string[]): boolean;
23
+ /**
24
+ * Extract all unique external package names from a list of imports.
25
+ */
26
+ export declare function extractExternalPackages(imports: Array<{
27
+ source: string;
28
+ }>): Set<string>;
29
+ /**
30
+ * Check if a CJS module is being imported with named imports.
31
+ * This is a common ESM/CJS interop issue.
32
+ */
33
+ export declare function isNamedCjsImport(namedImports: string[], source: string, knownCjsPackages: Set<string>): boolean;
34
+ //# sourceMappingURL=symbol-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-resolver.d.ts","sourceRoot":"","sources":["../../../src/review-intelligence/engine/symbol-resolver.ts"],"names":[],"mappings":"AAQA,yCAAyC;AACzC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;AAExE,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAaD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAqD5D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GACjC,GAAG,CAAC,MAAM,CAAC,CAWb;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC5B,OAAO,CAOT"}
@@ -0,0 +1,106 @@
1
+ // ─── Symbol Resolver ────────────────────────────────────────────────────────
2
+ //
3
+ // Resolves import sources to determine:
4
+ // - Whether a module is a Node.js builtin
5
+ // - Whether a module is a local file (relative import)
6
+ // - Whether a module is an external package
7
+ // - The bare package name (for dependency checking)
8
+ /** Well-known Node.js builtin modules */
9
+ const NODE_BUILTINS = new Set([
10
+ 'assert', 'async_hooks', 'buffer', 'child_process', 'cluster', 'console',
11
+ 'constants', 'crypto', 'dgram', 'diagnostics_channel', 'dns', 'domain',
12
+ 'events', 'fs', 'http', 'http2', 'https', 'inspector', 'module', 'net',
13
+ 'os', 'path', 'perf_hooks', 'process', 'punycode', 'querystring', 'readline',
14
+ 'repl', 'stream', 'string_decoder', 'sys', 'timers', 'tls', 'trace_events',
15
+ 'tty', 'url', 'util', 'v8', 'vm', 'wasi', 'worker_threads', 'zlib',
16
+ 'test', 'sqlite',
17
+ ]);
18
+ /**
19
+ * Resolve an import source to its module classification.
20
+ */
21
+ export function resolveModule(source) {
22
+ // node: protocol builtins
23
+ if (source.startsWith('node:')) {
24
+ return {
25
+ source,
26
+ kind: 'builtin',
27
+ packageName: source,
28
+ };
29
+ }
30
+ // Bare builtin names
31
+ const bareName = source.split('/')[0];
32
+ if (NODE_BUILTINS.has(bareName)) {
33
+ return {
34
+ source,
35
+ kind: 'builtin',
36
+ packageName: bareName,
37
+ };
38
+ }
39
+ // Relative imports
40
+ if (source.startsWith('.') || source.startsWith('/')) {
41
+ return {
42
+ source,
43
+ kind: 'local',
44
+ };
45
+ }
46
+ // Scoped packages: @scope/package or @scope/package/subpath
47
+ if (source.startsWith('@')) {
48
+ const parts = source.split('/');
49
+ const packageName = parts.length >= 2 ? `${parts[0]}/${parts[1]}` : source;
50
+ const subpath = parts.length > 2 ? '/' + parts.slice(2).join('/') : undefined;
51
+ return {
52
+ source,
53
+ kind: 'external',
54
+ packageName,
55
+ subpath,
56
+ };
57
+ }
58
+ // Regular external packages: package or package/subpath
59
+ const parts = source.split('/');
60
+ const packageName = parts[0];
61
+ const subpath = parts.length > 1 ? '/' + parts.slice(1).join('/') : undefined;
62
+ return {
63
+ source,
64
+ kind: 'external',
65
+ packageName,
66
+ subpath,
67
+ };
68
+ }
69
+ /**
70
+ * Check if a package name looks like a workspace package.
71
+ * Common patterns: @org/package where org matches the monorepo scope.
72
+ */
73
+ export function isWorkspacePackage(packageName, workspaceScopes) {
74
+ for (const scope of workspaceScopes) {
75
+ if (packageName.startsWith(scope + '/')) {
76
+ return true;
77
+ }
78
+ }
79
+ return false;
80
+ }
81
+ /**
82
+ * Extract all unique external package names from a list of imports.
83
+ */
84
+ export function extractExternalPackages(imports) {
85
+ const packages = new Set();
86
+ for (const imp of imports) {
87
+ const resolved = resolveModule(imp.source);
88
+ if (resolved.kind === 'external' && resolved.packageName) {
89
+ packages.add(resolved.packageName);
90
+ }
91
+ }
92
+ return packages;
93
+ }
94
+ /**
95
+ * Check if a CJS module is being imported with named imports.
96
+ * This is a common ESM/CJS interop issue.
97
+ */
98
+ export function isNamedCjsImport(namedImports, source, knownCjsPackages) {
99
+ if (namedImports.length === 0)
100
+ return false;
101
+ const resolved = resolveModule(source);
102
+ if (resolved.kind !== 'external')
103
+ return false;
104
+ return knownCjsPackages.has(resolved.packageName ?? source);
105
+ }
106
+ //# sourceMappingURL=symbol-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-resolver.js","sourceRoot":"","sources":["../../../src/review-intelligence/engine/symbol-resolver.ts"],"names":[],"mappings":"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"}