@kernlang/review 3.3.9 → 3.4.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 (97) hide show
  1. package/dist/call-graph.d.ts +10 -0
  2. package/dist/call-graph.js +138 -9
  3. package/dist/call-graph.js.map +1 -1
  4. package/dist/concept-rules/auth-drift.js +2 -0
  5. package/dist/concept-rules/auth-drift.js.map +1 -1
  6. package/dist/concept-rules/auth-propagation-drift.js +2 -0
  7. package/dist/concept-rules/auth-propagation-drift.js.map +1 -1
  8. package/dist/concept-rules/body-shape-drift.d.ts +1 -1
  9. package/dist/concept-rules/body-shape-drift.js +5 -3
  10. package/dist/concept-rules/body-shape-drift.js.map +1 -1
  11. package/dist/concept-rules/contract-drift.js +3 -1
  12. package/dist/concept-rules/contract-drift.js.map +1 -1
  13. package/dist/concept-rules/contract-method-drift.js +2 -0
  14. package/dist/concept-rules/contract-method-drift.js.map +1 -1
  15. package/dist/concept-rules/index.js +2 -33
  16. package/dist/concept-rules/index.js.map +1 -1
  17. package/dist/concept-rules/request-validation-drift.js +3 -0
  18. package/dist/concept-rules/request-validation-drift.js.map +1 -1
  19. package/dist/concept-rules/root-cause.d.ts +4 -0
  20. package/dist/concept-rules/root-cause.js +31 -0
  21. package/dist/concept-rules/root-cause.js.map +1 -0
  22. package/dist/concept-rules/unbounded-collection-query.js +2 -0
  23. package/dist/concept-rules/unbounded-collection-query.js.map +1 -1
  24. package/dist/concept-rules/unhandled-api-error-shape.js +2 -0
  25. package/dist/concept-rules/unhandled-api-error-shape.js.map +1 -1
  26. package/dist/default-export.d.ts +41 -0
  27. package/dist/default-export.js +76 -0
  28. package/dist/default-export.js.map +1 -0
  29. package/dist/eval.d.ts +67 -0
  30. package/dist/eval.js +177 -0
  31. package/dist/eval.js.map +1 -0
  32. package/dist/file-context.js +32 -13
  33. package/dist/file-context.js.map +1 -1
  34. package/dist/file-role.d.ts +6 -0
  35. package/dist/file-role.js +27 -0
  36. package/dist/file-role.js.map +1 -1
  37. package/dist/framework-seeds.d.ts +46 -0
  38. package/dist/framework-seeds.js +245 -0
  39. package/dist/framework-seeds.js.map +1 -0
  40. package/dist/git-env.d.ts +1 -0
  41. package/dist/git-env.js +25 -0
  42. package/dist/git-env.js.map +1 -0
  43. package/dist/graph.js +246 -21
  44. package/dist/graph.js.map +1 -1
  45. package/dist/index.d.ts +10 -2
  46. package/dist/index.js +200 -56
  47. package/dist/index.js.map +1 -1
  48. package/dist/mappers/ts-concepts.js +87 -20
  49. package/dist/mappers/ts-concepts.js.map +1 -1
  50. package/dist/path-canonical.d.ts +34 -0
  51. package/dist/path-canonical.js +85 -0
  52. package/dist/path-canonical.js.map +1 -0
  53. package/dist/policy.d.ts +22 -0
  54. package/dist/policy.js +47 -0
  55. package/dist/policy.js.map +1 -0
  56. package/dist/project-context.d.ts +135 -0
  57. package/dist/project-context.js +563 -0
  58. package/dist/project-context.js.map +1 -0
  59. package/dist/public-api.d.ts +21 -0
  60. package/dist/public-api.js +17 -2
  61. package/dist/public-api.js.map +1 -1
  62. package/dist/reporter.js +22 -0
  63. package/dist/reporter.js.map +1 -1
  64. package/dist/rule-quality.d.ts +58 -0
  65. package/dist/rule-quality.js +357 -0
  66. package/dist/rule-quality.js.map +1 -0
  67. package/dist/rules/dead-code.d.ts +2 -2
  68. package/dist/rules/dead-code.js +88 -4
  69. package/dist/rules/dead-code.js.map +1 -1
  70. package/dist/rules/index.d.ts +22 -0
  71. package/dist/rules/index.js +32 -0
  72. package/dist/rules/index.js.map +1 -1
  73. package/dist/rules/kern-source.d.ts +4 -0
  74. package/dist/rules/kern-source.js +183 -0
  75. package/dist/rules/kern-source.js.map +1 -1
  76. package/dist/rules/react.js +52 -3
  77. package/dist/rules/react.js.map +1 -1
  78. package/dist/rules/suggest-kern-primitive.js +0 -1
  79. package/dist/rules/suggest-kern-primitive.js.map +1 -1
  80. package/dist/semantic-diff.js +2 -0
  81. package/dist/semantic-diff.js.map +1 -1
  82. package/dist/suppression/apply-suppression.js +2 -0
  83. package/dist/suppression/apply-suppression.js.map +1 -1
  84. package/dist/suppression/parse-directives.d.ts +13 -5
  85. package/dist/suppression/parse-directives.js +62 -8
  86. package/dist/suppression/parse-directives.js.map +1 -1
  87. package/dist/suppression/types.d.ts +9 -0
  88. package/dist/suppression/types.js +6 -1
  89. package/dist/suppression/types.js.map +1 -1
  90. package/dist/taint-crossfile.js +15 -8
  91. package/dist/taint-crossfile.js.map +1 -1
  92. package/dist/telemetry.d.ts +126 -0
  93. package/dist/telemetry.js +303 -0
  94. package/dist/telemetry.js.map +1 -0
  95. package/dist/types.d.ts +165 -1
  96. package/dist/types.js.map +1 -1
  97. package/package.json +4 -3
package/dist/graph.js CHANGED
@@ -8,8 +8,9 @@
8
8
  * Codex contributions: extension fallback, shortest-distance tracking, skip counters.
9
9
  */
10
10
  import { existsSync } from 'fs';
11
- import { resolve } from 'path';
12
- import { Project } from 'ts-morph';
11
+ import { dirname, relative, resolve } from 'path';
12
+ import { Project, SyntaxKind } from 'ts-morph';
13
+ import { createPathCanonicalizer } from './path-canonical.js';
13
14
  /** Extension fallback map: .js→.ts, .jsx→.tsx (Codex idea) */
14
15
  const EXT_FALLBACK = {
15
16
  '.js': ['.ts', '.tsx'],
@@ -36,28 +37,54 @@ export function resolveImportGraph(entryFiles, options = {}) {
36
37
  const visited = new Set();
37
38
  const queue = [];
38
39
  let skipped = 0;
40
+ // Producer 1 (unresolved named re-export → blocker on importing file's
41
+ // localName) and Producer 2 (non-literal dynamic import → telemetry).
42
+ // Both accumulate across the BFS walk and ride out on GraphResult.
43
+ const blockers = [];
44
+ let unmappedDynamicImports = 0;
45
+ let malformedImports = 0;
46
+ // Path canonicalisation (red-team #9). Every path that becomes a fileMap
47
+ // KEY or is fed to ts-morph's `addSourceFileAtPath` runs through this
48
+ // memoised canonicaliser so two display paths pointing at the same
49
+ // physical file (pnpm symlinks, macOS /var → /private/var) collapse to
50
+ // a single GraphFile. Display paths are preserved on `gf.path` —
51
+ // the canonicalisation only affects internal identity keys.
52
+ const canonicalize = createPathCanonicalizer();
39
53
  // Seed BFS with entry files
40
54
  for (const entry of entryFiles) {
41
- let sf = project.getSourceFile(entry);
55
+ const canonicalEntry = canonicalize(entry);
56
+ // Feed the canonical form to ts-morph so its internal SourceFile
57
+ // store is keyed canonically. When a barrel reachable via a symlink
58
+ // imports the same file via realpath, ts-morph's resolution uses
59
+ // dirname(canonical) and lands on the canonical form too — keeping
60
+ // the project consistent without any other intervention.
61
+ let sf = project.getSourceFile(canonicalEntry);
42
62
  if (!sf) {
43
63
  try {
44
- sf = project.addSourceFileAtPath(entry);
64
+ sf = project.addSourceFileAtPath(canonicalEntry);
45
65
  }
46
66
  catch {
47
- const entryPath = resolve(entry);
67
+ const entryPath = resolve(canonicalEntry);
48
68
  if (!existsSync(entryPath)) {
49
69
  skipped++;
50
70
  continue;
51
71
  }
52
72
  if (!fileMap.has(entryPath)) {
53
- fileMap.set(entryPath, makeGraphFile(entryPath, 0));
73
+ // Fallback path — rare, only when ts-morph rejects but the file
74
+ // exists on disk. We can't get a SourceFile so we synthesise a
75
+ // GraphFile entry with display = caller's input.
76
+ fileMap.set(entryPath, makeGraphFile(entry, entryPath, 0));
54
77
  }
55
78
  continue;
56
79
  }
57
80
  }
58
- const p = sf.getFilePath();
81
+ const p = canonicalize(sf.getFilePath());
59
82
  if (!fileMap.has(p)) {
60
- fileMap.set(p, makeGraphFile(p, 0));
83
+ // Display = caller's original entry path (so `report.filePath`
84
+ // matches what the user passed in, even when the entry sits behind
85
+ // a symlinked tmpdir — the regression-repo-shapes fixtures rely on
86
+ // this).
87
+ fileMap.set(p, makeGraphFile(entry, p, 0));
61
88
  queue.push({ path: p, distance: 0 });
62
89
  }
63
90
  }
@@ -74,14 +101,44 @@ export function resolveImportGraph(entryFiles, options = {}) {
74
101
  continue;
75
102
  const current = fileMap.get(filePath);
76
103
  // Collect module references from imports and re-exports (barrel file support)
77
- const refs = collectModuleEdgeRefs(sf);
78
- for (const ref of refs) {
79
- const { sourceFile: resolvedFile, via } = resolveModuleReference(project, sf, ref.specifier, ref.resolved);
104
+ const scan = collectModuleEdgeRefs(sf, canonicalize);
105
+ unmappedDynamicImports += scan.unmappedDynamicImports;
106
+ malformedImports += scan.malformedImports;
107
+ for (const ref of scan.refs) {
108
+ const { sourceFile: resolvedFile, via } = resolveModuleReference(project, sf, ref.specifier, ref.resolved, canonicalize);
80
109
  if (!resolvedFile) {
110
+ // Producer 1: a re-export with a relative specifier that even the
111
+ // extension-fallback couldn't resolve becomes a symbol-scoped
112
+ // blocker on the IMPORTING file's localName. Symbol scope only —
113
+ // never file scope (see ReachabilityBlocker jsdoc and red-team v3).
114
+ //
115
+ // Two re-export shapes carry a concrete local name and qualify:
116
+ // - `named-reexport` — `export { foo } from './x'`
117
+ // - `namespace-reexport` — `export * as ns from './x'`
118
+ // Bare `export *` (kind `export-all`) is excluded because there is
119
+ // no symbol to pin. Bare specifiers (`react`, `lodash/get`) are
120
+ // also excluded: unresolved bare specifiers mean a missing dep,
121
+ // not an unknowable target, and dead-export's package-public-API
122
+ // logic already shields those callers.
123
+ if ((ref.kind === 'named-reexport' || ref.kind === 'namespace-reexport') &&
124
+ ref.localName &&
125
+ (ref.specifier.startsWith('.') || ref.specifier.startsWith('/'))) {
126
+ blockers.push({
127
+ reason: 'unresolved-re-export',
128
+ filePath,
129
+ exportName: ref.localName,
130
+ site: { file: filePath, line: ref.line ?? 0 },
131
+ });
132
+ }
81
133
  skipped++;
82
134
  continue;
83
135
  }
84
- const resolvedPath = resolvedFile.getFilePath();
136
+ // Canonical-key the resolved file. ts-morph's getFilePath() is
137
+ // verbatim from the parent's path; if we fed canonical above, it
138
+ // returns canonical here too, so this is usually a no-op. Run it
139
+ // anyway so any externally-supplied `options.project` (which may
140
+ // not have been seeded canonical) still produces a clean key.
141
+ const resolvedPath = canonicalize(resolvedFile.getFilePath());
85
142
  // Skip .d.ts and node_modules (even if resolved via path alias)
86
143
  if (resolvedPath.endsWith('.d.ts')) {
87
144
  skipped++;
@@ -105,7 +162,17 @@ export function resolveImportGraph(entryFiles, options = {}) {
105
162
  current.imports.push(resolvedPath);
106
163
  }
107
164
  if (!fileMap.has(resolvedPath)) {
108
- const nextFile = makeGraphFile(resolvedPath, distance + 1);
165
+ // Derive a DISPLAY path for the reached file from the parent's
166
+ // display path (red-team #9, multi-AI brainstorm Option B + 4th
167
+ // option). The relative form between parent's canonical dir and
168
+ // the resolved canonical path applied to the parent's display
169
+ // dir reproduces the symlink view the user sees: a barrel
170
+ // imported from `/var/folders/.../entry.ts` resolves its './worker'
171
+ // import to `/var/folders/.../worker.ts`, not the realpath form.
172
+ const parentCanonicalDir = dirname(filePath);
173
+ const relFromCanonical = relative(parentCanonicalDir, resolvedPath);
174
+ const displayPath = resolve(dirname(current.path), relFromCanonical);
175
+ const nextFile = makeGraphFile(displayPath, resolvedPath, distance + 1);
109
176
  nextFile.importedBy.push(filePath);
110
177
  nextFile.incomingEdges.push(edge);
111
178
  fileMap.set(resolvedPath, nextFile);
@@ -131,20 +198,26 @@ export function resolveImportGraph(entryFiles, options = {}) {
131
198
  totalFiles: files.length,
132
199
  skipped,
133
200
  project,
201
+ blockers,
202
+ unmappedDynamicImports,
203
+ malformedImports,
134
204
  };
135
205
  }
136
206
  /**
137
207
  * Extension fallback: when ts-morph can't resolve ./foo.js, try ./foo.ts and ./foo.tsx.
138
208
  * Common in ESM projects where imports use .js but source files are .ts.
139
209
  */
140
- function tryExtensionFallback(project, fromFile, specifier) {
210
+ function tryExtensionFallback(project, fromFile, specifier, canonicalize) {
141
211
  for (const [jsExt, tsExts] of Object.entries(EXT_FALLBACK)) {
142
212
  if (!specifier.endsWith(jsExt))
143
213
  continue;
144
214
  const base = specifier.slice(0, -jsExt.length);
145
215
  for (const tsExt of tsExts) {
146
216
  const candidate = base + tsExt;
147
- const fullPath = resolve(fromFile.getDirectoryPath(), candidate);
217
+ // Canonicalise before adding so ts-morph stores the realpath form.
218
+ // Same physical file reachable via two display paths collapses to
219
+ // a single SourceFile, preventing duplicate entries (red-team #9).
220
+ const fullPath = canonicalize(resolve(fromFile.getDirectoryPath(), candidate));
148
221
  const existing = project.getSourceFile(fullPath);
149
222
  if (existing)
150
223
  return existing;
@@ -160,9 +233,10 @@ function tryExtensionFallback(project, fromFile, specifier) {
160
233
  }
161
234
  return undefined;
162
235
  }
163
- function makeGraphFile(path, distance) {
236
+ function makeGraphFile(path, canonicalPath, distance) {
164
237
  return {
165
238
  path,
239
+ canonicalPath,
166
240
  distance,
167
241
  imports: [],
168
242
  importedBy: [],
@@ -170,20 +244,28 @@ function makeGraphFile(path, distance) {
170
244
  incomingEdges: [],
171
245
  };
172
246
  }
173
- function resolveModuleReference(project, fromFile, specifier, resolved) {
247
+ function resolveModuleReference(project, fromFile, specifier, resolved, canonicalize) {
174
248
  if (resolved)
175
249
  return { sourceFile: resolved, via: 'ts-morph' };
176
250
  if (specifier.startsWith('.') || specifier.startsWith('/')) {
177
- const fallback = tryExtensionFallback(project, fromFile, specifier);
251
+ const fallback = tryExtensionFallback(project, fromFile, specifier, canonicalize);
178
252
  if (fallback)
179
253
  return { sourceFile: fallback, via: 'extension-fallback' };
180
254
  }
181
255
  return { sourceFile: undefined, via: 'ts-morph' };
182
256
  }
183
- function collectModuleEdgeRefs(sourceFile) {
257
+ function collectModuleEdgeRefs(sourceFile, canonicalize) {
184
258
  const refs = [];
259
+ let unmappedDynamicImports = 0;
260
+ let malformedImports = 0;
185
261
  for (const decl of sourceFile.getImportDeclarations()) {
186
262
  try {
263
+ // `import type { X } from './m'` and `import type Foo from './m'` are
264
+ // erased at compile time. They MUST NOT contribute caller edges,
265
+ // otherwise dead-export reachability counts type-only references as
266
+ // proof a runtime symbol is alive — a category of FP red-team flagged.
267
+ if (decl.isTypeOnly())
268
+ continue;
187
269
  const specifier = decl.getModuleSpecifierValue();
188
270
  const resolved = decl.getModuleSpecifierSourceFile();
189
271
  let recorded = false;
@@ -199,6 +281,9 @@ function collectModuleEdgeRefs(sourceFile) {
199
281
  recorded = true;
200
282
  }
201
283
  for (const named of decl.getNamedImports()) {
284
+ // Mixed form: `import { Foo, type Bar } from './m'` — Bar is erased.
285
+ if (named.isTypeOnly())
286
+ continue;
202
287
  refs.push({
203
288
  specifier,
204
289
  resolved,
@@ -223,11 +308,71 @@ function collectModuleEdgeRefs(sourceFile) {
223
308
  refs.push({ specifier, resolved, kind: 'side-effect-import' });
224
309
  }
225
310
  }
311
+ catch (err) {
312
+ // ts-morph threw while reading this static-import declaration.
313
+ // Causes seen in the wild: malformed AST after a parse-error file,
314
+ // transient FS race during watch-mode, an internal ts-morph
315
+ // assertion. Swallowing silently was a bug — operators had no way
316
+ // to know analysis was incomplete. Now we count, surface via
317
+ // review-health, and log under KERN_DEBUG so the failure is
318
+ // recoverable AND observable.
319
+ malformedImports++;
320
+ if (process.env.KERN_DEBUG) {
321
+ const msg = err instanceof Error ? err.message : String(err);
322
+ console.error(`graph: failed to read import declaration in ${sourceFile.getFilePath()}: ${msg}`);
323
+ }
324
+ }
325
+ }
326
+ // Dynamic imports — `import('./mod')` / `await import('./mod')`. ts-morph
327
+ // models the call's expression as `SyntaxKind.ImportKeyword` (NOT an
328
+ // identifier whose text is "import"), so this is the correct discriminator
329
+ // — red-team #5 specifically called out the identifier-based check as a
330
+ // bug that would silently skip every dynamic import.
331
+ //
332
+ // Only LITERAL specifiers produce an edge here. A non-literal argument
333
+ // (e.g. `import(routes[role])`) is left untouched: step 9b will record a
334
+ // symbol-scoped ReachabilityBlocker for that case so the resulting
335
+ // dead-export confidence is capped — never silently suppressed.
336
+ for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
337
+ const callee = call.getExpression();
338
+ if (callee.getKind() !== SyntaxKind.ImportKeyword)
339
+ continue;
340
+ const args = call.getArguments();
341
+ if (args.length === 0)
342
+ continue;
343
+ const first = args[0];
344
+ if (!first)
345
+ continue;
346
+ const argKind = first.getKind();
347
+ if (argKind !== SyntaxKind.StringLiteral && argKind !== SyntaxKind.NoSubstitutionTemplateLiteral) {
348
+ // Producer 2 (telemetry-only): the specifier isn't a literal so we can't
349
+ // derive a target file or export name. Step 9b's invariant #5 — NEVER
350
+ // produce a blocker here. The exportName cannot be inferred and falling
351
+ // back to file scope re-introduces red-team CRITICAL #1 (one dynamic
352
+ // import silenced 50 unrelated symbols). Counter only.
353
+ unmappedDynamicImports++;
354
+ continue;
355
+ }
356
+ let specifier;
357
+ try {
358
+ specifier = first.getLiteralValue();
359
+ }
226
360
  catch {
227
- /* skip dynamic imports with non-literal specifiers */
361
+ continue;
228
362
  }
363
+ const resolved = resolveDynamicImportTarget(sourceFile, specifier, canonicalize);
364
+ refs.push({
365
+ specifier,
366
+ resolved,
367
+ kind: 'dynamic-import',
368
+ });
229
369
  }
230
370
  for (const decl of sourceFile.getExportDeclarations()) {
371
+ // `export type { X } from './m'` is erased at compile time and must not
372
+ // contribute a re-export edge. Same reasoning as the import side: a
373
+ // type-only re-export is not evidence the runtime symbol is alive.
374
+ if (decl.isTypeOnly())
375
+ continue;
231
376
  let specifier;
232
377
  let resolved;
233
378
  try {
@@ -239,22 +384,102 @@ function collectModuleEdgeRefs(sourceFile) {
239
384
  catch {
240
385
  continue;
241
386
  }
387
+ // `export * as ns from './m'` — ts-morph models this distinctly from
388
+ // bare `export *` (which has no namespace export node). The namespace
389
+ // alias is a concrete local name we can scope a Producer 1 blocker
390
+ // against when the target is unresolved. Bare `export *` stays under
391
+ // `export-all` and never produces a blocker (no symbol to pin).
392
+ const namespaceExport = decl.getNamespaceExport();
393
+ if (namespaceExport) {
394
+ refs.push({
395
+ specifier,
396
+ resolved,
397
+ kind: 'namespace-reexport',
398
+ importedName: '*',
399
+ localName: namespaceExport.getName(),
400
+ line: namespaceExport.getStartLineNumber(),
401
+ });
402
+ continue;
403
+ }
242
404
  const namedExports = decl.getNamedExports();
243
405
  if (namedExports.length === 0) {
244
406
  refs.push({ specifier, resolved, kind: 'export-all' });
245
407
  continue;
246
408
  }
247
409
  for (const named of namedExports) {
410
+ // Mixed form: `export { foo, type Bar } from './m'`.
411
+ if (named.isTypeOnly())
412
+ continue;
248
413
  refs.push({
249
414
  specifier,
250
415
  resolved,
251
416
  kind: 'named-reexport',
252
417
  importedName: named.getName(),
253
418
  localName: named.getAliasNode()?.getText() ?? named.getName(),
419
+ line: named.getStartLineNumber(),
254
420
  });
255
421
  }
256
422
  }
257
- return refs;
423
+ return { refs, unmappedDynamicImports, malformedImports };
424
+ }
425
+ /**
426
+ * Resolve a literal dynamic-import specifier to a SourceFile in the project.
427
+ * ts-morph's CallExpression has no `getModuleSpecifierSourceFile()` analogue,
428
+ * so this mirrors the resolution shape that static imports get for free:
429
+ *
430
+ * 1. Direct hit on the joined absolute path (already a `.ts(x)` file).
431
+ * 2. Extension probe: append `.ts`, `.tsx`, `.js`, `.jsx`.
432
+ * 3. Directory probe: `<spec>/index.ts(x)`.
433
+ *
434
+ * Returns undefined for relative specifiers that don't land on any source
435
+ * file under the project — those become unresolved dynamic-import edges,
436
+ * which step 9b's blocker logic distinguishes from non-literal cases.
437
+ *
438
+ * Bare/package specifiers (e.g. `import('react')`) are intentionally NOT
439
+ * resolved; the import-graph already skips node_modules at the BFS level.
440
+ */
441
+ function resolveDynamicImportTarget(fromFile, specifier, canonicalize) {
442
+ if (!specifier.startsWith('.') && !specifier.startsWith('/'))
443
+ return undefined;
444
+ const project = fromFile.getProject();
445
+ const fromDir = fromFile.getDirectoryPath();
446
+ // Canonicalise the joined path so dynamic-import targets that traverse
447
+ // a symlink (pnpm `node_modules/.pnpm/...`) collapse to the same key
448
+ // ts-morph already has for the realpath form.
449
+ const abs = canonicalize(resolve(fromDir, specifier));
450
+ const direct = project.getSourceFile(abs);
451
+ if (direct)
452
+ return direct;
453
+ const extensionCandidates = ['.ts', '.tsx', '.js', '.jsx'];
454
+ for (const ext of extensionCandidates) {
455
+ const cand = canonicalize(abs + ext);
456
+ const known = project.getSourceFile(cand);
457
+ if (known)
458
+ return known;
459
+ if (existsSync(cand)) {
460
+ try {
461
+ return project.addSourceFileAtPath(cand);
462
+ }
463
+ catch {
464
+ /* unreadable candidate — fall through */
465
+ }
466
+ }
467
+ }
468
+ for (const ext of ['.ts', '.tsx']) {
469
+ const cand = canonicalize(resolve(abs, `index${ext}`));
470
+ const known = project.getSourceFile(cand);
471
+ if (known)
472
+ return known;
473
+ if (existsSync(cand)) {
474
+ try {
475
+ return project.addSourceFileAtPath(cand);
476
+ }
477
+ catch {
478
+ /* unreadable candidate — fall through */
479
+ }
480
+ }
481
+ }
482
+ return undefined;
258
483
  }
259
484
  function pushUniqueEdge(edges, edge) {
260
485
  const exists = edges.some((existing) => existing.from === edge.from &&
package/dist/graph.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -18,9 +18,10 @@ export { runConceptRules } from './concept-rules/index.js';
18
18
  export type { ConfidenceGraph, ConfidenceNode, ConfidenceSpec, ConfidenceSummary, DuplicateNameEntry, MultiFileConfidenceGraph, NeedsEntry, SerializedConfidenceGraph, } from './confidence.js';
19
19
  export { buildConfidenceGraph, buildMultiFileConfidenceGraph, computeConfidenceSummary, parseConfidence, propagateConfidence, resolveBaseConfidence, serializeGraph, } from './confidence.js';
20
20
  export { structuralDiff } from './differ.js';
21
+ export { evaluateReviewReports, formatReviewEvalSummary, normalizeReviewEvalManifest, type ReviewEvalCase, type ReviewEvalCaseConfig, type ReviewEvalCaseResult, type ReviewEvalExpectations, type ReviewEvalFindingExpectation, type ReviewEvalManifest, type ReviewEvalRunMetadata, type ReviewEvalSummary, summarizeReviewEvalResults, } from './eval.js';
21
22
  export { linkToNodes, runESLint, runTSCDiagnostics, runTSCDiagnosticsFromPaths } from './external-tools.js';
22
23
  export { buildFileContextMap, clearFileContextCache } from './file-context.js';
23
- export { classifyFileRole } from './file-role.js';
24
+ export { classifyFileRole, classifyFileRoleByPath } from './file-role.js';
24
25
  export { resolveImportGraph } from './graph.js';
25
26
  export { findTsConfig, inferFromFile, inferFromSource } from './inferrer.js';
26
27
  export type { KernLintRule } from './kern-lint.js';
@@ -34,11 +35,13 @@ export type { NormViolation } from './norm-miner.js';
34
35
  export { mineNorms } from './norm-miner.js';
35
36
  export type { ObligationType, ProofObligation } from './obligations.js';
36
37
  export { obligationsFromNorms, obligationsFromStructure, synthesizeObligations } from './obligations.js';
38
+ export { applyReviewPolicyDefaults, getReviewPolicyProfile, inferReviewPolicy, type ReviewPolicyExplicitOptions, type ReviewPolicyProfile, } from './policy.js';
37
39
  export type { PublicApiMap, PublicApiOverrides } from './public-api.js';
38
40
  export { buildPublicApiMap, EMPTY_PUBLIC_API, expandPublicApiThroughReExports, isPublicApi, resolvePackageEntryFiles, resolveSpecifierToSrc, } from './public-api.js';
39
41
  export { runQualityRules } from './quality-rules.js';
40
42
  export { assignDefaultConfidence, calculateStats, checkEnforcement, dedup, formatEnforcement, formatReport, formatReportJSON, formatSARIF, formatSARIFWithMetadata, formatSARIFWithSuppressions, formatSummary, sortAndDedup, sortFindings, } from './reporter.js';
41
43
  export { debugDetail, ReviewHealthBuilder } from './review-health.js';
44
+ export { applyRuleQualityCalibration, applyRuleSupersession, getRuleQualityProfile, isRulePromotedForCi, type RuleCiDefault, type RuleLifecycle, type RulePrecision, type RuleQualityIssue, type RuleQualityProfile, validateRuleQualityRegistry, } from './rule-quality.js';
42
45
  export { CONFIDENCE_RULES, lintConfidenceGraph, lintMultiFileConfidenceGraph } from './rules/confidence.js';
43
46
  export { actionMissingIdempotent, assumeLowTrust, branchNonExhaustive, collectUnbounded, expectRangeInverted, GROUND_LAYER_RULES, guardWithoutElse, reasonWithoutBasis, } from './rules/ground-layer.js';
44
47
  export type { RuleInfo } from './rules/index.js';
@@ -52,8 +55,9 @@ export type { StrictMode, SuppressionDirective, SuppressionResult } from './supp
52
55
  export { applySuppression, configDirectives, isConceptRule, parseDirectives } from './suppression/index.js';
53
56
  export type { CrossFileTaintResult, ExportedFunction, TaintPath, TaintResult, TaintSink, TaintSource, } from './taint.js';
54
57
  export { analyzeTaint, analyzeTaintCrossFile, buildExportMap, buildImportMap, crossFileTaintToFindings, isSanitizerSufficient, taintToFindings, } from './taint.js';
58
+ export { buildReviewTelemetry, formatReviewTelemetrySummary, parseReviewTelemetryJsonl, type ReviewTelemetryFinding, type ReviewTelemetryOptions, type ReviewTelemetryRule, type ReviewTelemetryRuleSummary, type ReviewTelemetrySnapshot, type ReviewTelemetrySummary, readReviewTelemetrySnapshots, summarizeReviewTelemetry, type WriteReviewTelemetryOptions, type WriteReviewTelemetryResult, writeReviewTelemetrySnapshot, } from './telemetry.js';
55
59
  export { detectTemplates } from './template-detector.js';
56
- export type { AnalysisContext, Confidence, EnforceResult, FileContext, FileRole, GraphEdge, GraphEdgeKind, GraphFile, GraphOptions, GraphResult, InferResult, ReviewConfig, ReviewFinding, ReviewHealth, ReviewHealthEntry, ReviewHealthKind, ReviewHealthSubsystem, ReviewReport, ReviewRule, ReviewStats, RuleContext, RuntimeBoundary, SourceSpan, TemplateMatch, } from './types.js';
60
+ export type { AnalysisContext, CalibrationStage, Confidence, EnforceResult, FileContext, FileRole, GraphEdge, GraphEdgeKind, GraphFile, GraphOptions, GraphResult, InferResult, ReviewConfig, ReviewFinding, ReviewHealth, ReviewHealthEntry, ReviewHealthKind, ReviewHealthSubsystem, ReviewPolicy, ReviewReport, ReviewRule, ReviewStats, ReviewTelemetryConfig, RootCause, RuleContext, RuntimeBoundary, SourceSpan, TemplateMatch, } from './types.js';
57
61
  export { createFingerprint } from './types.js';
58
62
  import { clearReviewCache } from './cache.js';
59
63
  export type { ImplRoute, SpecCheckResult, SpecContract, SpecViolation, ViolationKind } from './spec-checker.js';
@@ -119,6 +123,10 @@ export declare function reviewKernSource(source: string, filePath?: string, _con
119
123
  export declare function reviewPythonSource(source: string, filePath?: string, config?: ReviewConfig): ReviewReport;
120
124
  /**
121
125
  * Review all .ts/.tsx/.py files in a directory.
126
+ *
127
+ * Honors the project's .gitignore by skipping untracked-and-ignored files —
128
+ * tracked artifacts are always reviewed even when their directory matches
129
+ * .gitignore, so published `dist/*.gen.ts` and similar do not slip through.
122
130
  */
123
131
  export declare function reviewDirectory(dirPath: string, recursive?: boolean, config?: ReviewConfig): ReviewReport[];
124
132
  /**