@kernlang/review 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/concept-rules/boundary-mutation.d.ts +13 -0
  2. package/dist/concept-rules/boundary-mutation.js +40 -0
  3. package/dist/concept-rules/boundary-mutation.js.map +1 -0
  4. package/dist/concept-rules/ignored-error.d.ts +13 -0
  5. package/dist/concept-rules/ignored-error.js +40 -0
  6. package/dist/concept-rules/ignored-error.js.map +1 -0
  7. package/dist/concept-rules/illegal-dependency.d.ts +13 -0
  8. package/dist/concept-rules/illegal-dependency.js +49 -0
  9. package/dist/concept-rules/illegal-dependency.js.map +1 -0
  10. package/dist/concept-rules/index.d.ts +15 -0
  11. package/dist/concept-rules/index.js +27 -0
  12. package/dist/concept-rules/index.js.map +1 -0
  13. package/dist/concept-rules/unguarded-effect.d.ts +13 -0
  14. package/dist/concept-rules/unguarded-effect.js +58 -0
  15. package/dist/concept-rules/unguarded-effect.js.map +1 -0
  16. package/dist/concept-rules/unrecovered-effect.d.ts +13 -0
  17. package/dist/concept-rules/unrecovered-effect.js +61 -0
  18. package/dist/concept-rules/unrecovered-effect.js.map +1 -0
  19. package/dist/confidence.d.ts +92 -0
  20. package/dist/confidence.js +263 -0
  21. package/dist/confidence.js.map +1 -0
  22. package/dist/differ.js +4 -2
  23. package/dist/differ.js.map +1 -1
  24. package/dist/external-tools.js +7 -3
  25. package/dist/external-tools.js.map +1 -1
  26. package/dist/file-role.d.ts +10 -0
  27. package/dist/file-role.js +80 -0
  28. package/dist/file-role.js.map +1 -0
  29. package/dist/graph.d.ts +11 -0
  30. package/dist/graph.js +152 -0
  31. package/dist/graph.js.map +1 -0
  32. package/dist/index.d.ts +46 -3
  33. package/dist/index.js +313 -27
  34. package/dist/index.js.map +1 -1
  35. package/dist/inferrer.js +123 -25
  36. package/dist/inferrer.js.map +1 -1
  37. package/dist/kern-lint.d.ts +18 -0
  38. package/dist/kern-lint.js +24 -0
  39. package/dist/kern-lint.js.map +1 -0
  40. package/dist/llm-bridge.d.ts +42 -0
  41. package/dist/llm-bridge.js +176 -0
  42. package/dist/llm-bridge.js.map +1 -0
  43. package/dist/llm-review.d.ts +8 -1
  44. package/dist/llm-review.js +20 -7
  45. package/dist/llm-review.js.map +1 -1
  46. package/dist/mappers/ts-concepts.d.ts +9 -0
  47. package/dist/mappers/ts-concepts.js +512 -0
  48. package/dist/mappers/ts-concepts.js.map +1 -0
  49. package/dist/quality-rules.d.ts +3 -3
  50. package/dist/quality-rules.js +3 -11
  51. package/dist/quality-rules.js.map +1 -1
  52. package/dist/reporter.d.ts +19 -3
  53. package/dist/reporter.js +232 -20
  54. package/dist/reporter.js.map +1 -1
  55. package/dist/rules/base.js +164 -15
  56. package/dist/rules/base.js.map +1 -1
  57. package/dist/rules/confidence.d.ts +37 -0
  58. package/dist/rules/confidence.js +159 -0
  59. package/dist/rules/confidence.js.map +1 -0
  60. package/dist/rules/dead-logic.d.ts +13 -0
  61. package/dist/rules/dead-logic.js +386 -0
  62. package/dist/rules/dead-logic.js.map +1 -0
  63. package/dist/rules/express.js +69 -2
  64. package/dist/rules/express.js.map +1 -1
  65. package/dist/rules/ground-layer.d.ts +23 -0
  66. package/dist/rules/ground-layer.js +132 -0
  67. package/dist/rules/ground-layer.js.map +1 -0
  68. package/dist/rules/index.d.ts +1 -1
  69. package/dist/rules/index.js +8 -2
  70. package/dist/rules/index.js.map +1 -1
  71. package/dist/rules/kern-source.d.ts +16 -0
  72. package/dist/rules/kern-source.js +726 -0
  73. package/dist/rules/kern-source.js.map +1 -0
  74. package/dist/rules/nextjs.js +38 -10
  75. package/dist/rules/nextjs.js.map +1 -1
  76. package/dist/rules/null-safety.d.ts +12 -0
  77. package/dist/rules/null-safety.js +121 -0
  78. package/dist/rules/null-safety.js.map +1 -0
  79. package/dist/rules/react.js +64 -1
  80. package/dist/rules/react.js.map +1 -1
  81. package/dist/rules/security-v2.d.ts +12 -0
  82. package/dist/rules/security-v2.js +415 -0
  83. package/dist/rules/security-v2.js.map +1 -0
  84. package/dist/rules/security-v3.d.ts +12 -0
  85. package/dist/rules/security-v3.js +397 -0
  86. package/dist/rules/security-v3.js.map +1 -0
  87. package/dist/rules/security-v4.d.ts +22 -0
  88. package/dist/rules/security-v4.js +688 -0
  89. package/dist/rules/security-v4.js.map +1 -0
  90. package/dist/rules/security.d.ts +12 -0
  91. package/dist/rules/security.js +286 -0
  92. package/dist/rules/security.js.map +1 -0
  93. package/dist/rules/utils.d.ts +7 -0
  94. package/dist/rules/utils.js +21 -0
  95. package/dist/rules/utils.js.map +1 -0
  96. package/dist/rules/vue.js +1 -1
  97. package/dist/rules/vue.js.map +1 -1
  98. package/dist/spec-checker.d.ts +83 -0
  99. package/dist/spec-checker.js +405 -0
  100. package/dist/spec-checker.js.map +1 -0
  101. package/dist/suppression/apply-suppression.d.ts +17 -0
  102. package/dist/suppression/apply-suppression.js +94 -0
  103. package/dist/suppression/apply-suppression.js.map +1 -0
  104. package/dist/suppression/index.d.ts +6 -0
  105. package/dist/suppression/index.js +6 -0
  106. package/dist/suppression/index.js.map +1 -0
  107. package/dist/suppression/parse-directives.d.ts +25 -0
  108. package/dist/suppression/parse-directives.js +161 -0
  109. package/dist/suppression/parse-directives.js.map +1 -0
  110. package/dist/suppression/types.d.ts +32 -0
  111. package/dist/suppression/types.js +5 -0
  112. package/dist/suppression/types.js.map +1 -0
  113. package/dist/taint.d.ts +115 -0
  114. package/dist/taint.js +1052 -0
  115. package/dist/taint.js.map +1 -0
  116. package/dist/types.d.ts +71 -0
  117. package/dist/types.js.map +1 -1
  118. package/package.json +6 -3
package/dist/index.d.ts CHANGED
@@ -8,19 +8,46 @@
8
8
  *
9
9
  * v2: Unified ReviewFinding pipeline. All findings merged into single array.
10
10
  */
11
+ import type { GraphOptions } from './types.js';
11
12
  import type { ReviewReport, ReviewConfig } from './types.js';
12
13
  export type { ReviewReport, InferResult, TemplateMatch, ReviewFinding, SourceSpan } from './types.js';
13
14
  export type { ReviewStats, Confidence, ReviewConfig, EnforceResult, RuleContext, ReviewRule } from './types.js';
15
+ export type { GraphFile, GraphResult, GraphOptions } from './types.js';
16
+ export type { FileRole, AnalysisContext } from './types.js';
17
+ export { resolveImportGraph } from './graph.js';
14
18
  export { createFingerprint } from './types.js';
15
19
  export { inferFromSource, inferFromFile } from './inferrer.js';
20
+ export { classifyFileRole } from './file-role.js';
16
21
  export { detectTemplates } from './template-detector.js';
17
22
  export { structuralDiff } from './differ.js';
18
23
  export { runQualityRules } from './quality-rules.js';
19
- export { calculateStats, formatReport, formatReportJSON, formatSummary, checkEnforcement, formatEnforcement, dedup } from './reporter.js';
24
+ export { calculateStats, formatReport, formatReportJSON, formatSARIF, formatSARIFWithSuppressions, formatSummary, checkEnforcement, formatEnforcement, dedup, sortAndDedup, sortFindings } from './reporter.js';
20
25
  export { exportKernIR, buildLLMPrompt, parseLLMResponse } from './llm-review.js';
26
+ export type { LLMGraphContext } from './llm-review.js';
21
27
  export { runESLint, runTSCDiagnostics, runTSCDiagnosticsFromPaths, linkToNodes } from './external-tools.js';
28
+ export { extractTsConcepts } from './mappers/ts-concepts.js';
29
+ export { runConceptRules } from './concept-rules/index.js';
30
+ export type { ConceptRule, ConceptRuleContext } from './concept-rules/index.js';
31
+ export { applySuppression, parseDirectives, configDirectives, isConceptRule } from './suppression/index.js';
32
+ export type { SuppressionDirective, SuppressionResult, StrictMode } from './suppression/index.js';
33
+ export { lintKernIR, flattenIR } from './kern-lint.js';
34
+ export type { KernLintRule } from './kern-lint.js';
35
+ export { GROUND_LAYER_RULES } from './rules/ground-layer.js';
36
+ export { lintKernSourceIR, KERN_SOURCE_RULES, undefinedReference, typeModelMismatch, unusedState, handlerHeavy, missingConfidence } from './rules/kern-source.js';
37
+ export type { KernSourceRule } from './rules/kern-source.js';
38
+ export { guardWithoutElse, actionMissingIdempotent, branchNonExhaustive, collectUnbounded, reasonWithoutBasis, assumeLowTrust, expectRangeInverted, } from './rules/ground-layer.js';
39
+ export { parseConfidence, buildConfidenceGraph, buildMultiFileConfidenceGraph, propagateConfidence, resolveBaseConfidence, serializeGraph, computeConfidenceSummary, } from './confidence.js';
40
+ export type { ConfidenceSpec, ConfidenceNode, NeedsEntry, DuplicateNameEntry, ConfidenceGraph, MultiFileConfidenceGraph, SerializedConfidenceGraph, ConfidenceSummary, } from './confidence.js';
41
+ export { lintConfidenceGraph, lintMultiFileConfidenceGraph, CONFIDENCE_RULES } from './rules/confidence.js';
42
+ export { analyzeTaint, taintToFindings, analyzeTaintCrossFile, crossFileTaintToFindings, buildExportMap, buildImportMap, isSanitizerSufficient } from './taint.js';
43
+ export type { TaintSource, TaintSink, TaintPath, TaintResult, CrossFileTaintResult, ExportedFunction } from './taint.js';
44
+ export { runLLMReview, isLLMAvailable } from './llm-bridge.js';
45
+ export type { LLMBridgeConfig, LLMReviewInput } from './llm-bridge.js';
46
+ export { checkSpec, checkSpecFiles, extractSpecContracts, extractImplRoutes, matchRoutes, verifyRouteContract, specViolationsToFindings } from './spec-checker.js';
47
+ export type { SpecContract, ImplRoute, SpecViolation, SpecCheckResult, ViolationKind } from './spec-checker.js';
22
48
  /**
23
- * Review a single TypeScript file.
49
+ * Review a single file. Auto-detects language from extension.
50
+ * Supports: .ts, .tsx, .py, .kern
24
51
  */
25
52
  export declare function reviewFile(filePath: string, config?: ReviewConfig): ReviewReport;
26
53
  /**
@@ -28,6 +55,22 @@ export declare function reviewFile(filePath: string, config?: ReviewConfig): Rev
28
55
  */
29
56
  export declare function reviewSource(source: string, filePath?: string, config?: ReviewConfig): ReviewReport;
30
57
  /**
31
- * Review all .ts/.tsx files in a directory.
58
+ * Review .kern source code (native KERN IR).
59
+ * Parses directly to IR — skips TS inference, templates, diff, AST quality rules.
60
+ * Runs: ground-layer rules, confidence rules, LLM review.
61
+ */
62
+ export declare function reviewKernSource(source: string, filePath?: string, _config?: ReviewConfig): ReviewReport;
63
+ /**
64
+ * Review Python source code (string).
65
+ * Concept-only pipeline — no KERN IR inference, no ts-morph AST rules.
66
+ */
67
+ export declare function reviewPythonSource(source: string, filePath?: string, config?: ReviewConfig): ReviewReport;
68
+ /**
69
+ * Review all .ts/.tsx/.py files in a directory.
32
70
  */
33
71
  export declare function reviewDirectory(dirPath: string, recursive?: boolean, config?: ReviewConfig): ReviewReport[];
72
+ /**
73
+ * Review files with full import graph context.
74
+ * Entry files get normal findings, upstream dependencies get origin='upstream'.
75
+ */
76
+ export declare function reviewGraph(entryFiles: string[], config?: ReviewConfig, graphOptions?: GraphOptions): ReviewReport[];
package/dist/index.js CHANGED
@@ -8,26 +8,67 @@
8
8
  *
9
9
  * v2: Unified ReviewFinding pipeline. All findings merged into single array.
10
10
  */
11
- import { readFileSync, readdirSync, statSync } from 'fs';
11
+ import { readFileSync, readdirSync, statSync, existsSync } from 'fs';
12
12
  import { relative, join } from 'path';
13
- import { inferFromSource, createInMemoryProject } from './inferrer.js';
13
+ import { parse as parseKern, countTokens, serializeIR } from '@kernlang/core';
14
+ import { inferFromSourceFile, createInMemoryProject } from './inferrer.js';
15
+ import { resolveImportGraph } from './graph.js';
14
16
  import { detectTemplates } from './template-detector.js';
15
17
  import { structuralDiff } from './differ.js';
16
18
  import { runQualityRules } from './quality-rules.js';
17
- import { calculateStats, dedup } from './reporter.js';
19
+ import { calculateStats, sortAndDedup, sortFindings } from './reporter.js';
20
+ import { classifyFileRole } from './file-role.js';
21
+ import { runTSCDiagnostics } from './external-tools.js';
22
+ import { extractTsConcepts } from './mappers/ts-concepts.js';
23
+ import { runConceptRules } from './concept-rules/index.js';
24
+ import { lintConfidenceGraph } from './rules/confidence.js';
25
+ import { lintKernIR, flattenIR } from './kern-lint.js';
26
+ import { lintKernSourceIR, KERN_SOURCE_RULES } from './rules/kern-source.js';
27
+ import { GROUND_LAYER_RULES } from './rules/ground-layer.js';
28
+ import { buildConfidenceGraph, serializeGraph, computeConfidenceSummary } from './confidence.js';
29
+ import { analyzeTaint, taintToFindings, analyzeTaintCrossFile, crossFileTaintToFindings } from './taint.js';
30
+ import { applySuppression } from './suppression/index.js';
31
+ import { createFingerprint } from './types.js';
32
+ export { resolveImportGraph } from './graph.js';
18
33
  export { createFingerprint } from './types.js';
19
34
  export { inferFromSource, inferFromFile } from './inferrer.js';
35
+ export { classifyFileRole } from './file-role.js';
20
36
  export { detectTemplates } from './template-detector.js';
21
37
  export { structuralDiff } from './differ.js';
22
38
  export { runQualityRules } from './quality-rules.js';
23
- export { calculateStats, formatReport, formatReportJSON, formatSummary, checkEnforcement, formatEnforcement, dedup } from './reporter.js';
39
+ export { calculateStats, formatReport, formatReportJSON, formatSARIF, formatSARIFWithSuppressions, formatSummary, checkEnforcement, formatEnforcement, dedup, sortAndDedup, sortFindings } from './reporter.js';
24
40
  export { exportKernIR, buildLLMPrompt, parseLLMResponse } from './llm-review.js';
25
41
  export { runESLint, runTSCDiagnostics, runTSCDiagnosticsFromPaths, linkToNodes } from './external-tools.js';
42
+ export { extractTsConcepts } from './mappers/ts-concepts.js';
43
+ export { runConceptRules } from './concept-rules/index.js';
44
+ // Suppression
45
+ export { applySuppression, parseDirectives, configDirectives, isConceptRule } from './suppression/index.js';
46
+ // KERN-IR lint pipeline (ground layer)
47
+ export { lintKernIR, flattenIR } from './kern-lint.js';
48
+ export { GROUND_LAYER_RULES } from './rules/ground-layer.js';
49
+ export { lintKernSourceIR, KERN_SOURCE_RULES, undefinedReference, typeModelMismatch, unusedState, handlerHeavy, missingConfidence } from './rules/kern-source.js';
50
+ export { guardWithoutElse, actionMissingIdempotent, branchNonExhaustive, collectUnbounded, reasonWithoutBasis, assumeLowTrust, expectRangeInverted, } from './rules/ground-layer.js';
51
+ // Confidence layer
52
+ export { parseConfidence, buildConfidenceGraph, buildMultiFileConfidenceGraph, propagateConfidence, resolveBaseConfidence, serializeGraph, computeConfidenceSummary, } from './confidence.js';
53
+ export { lintConfidenceGraph, lintMultiFileConfidenceGraph, CONFIDENCE_RULES } from './rules/confidence.js';
54
+ // Taint tracking (Phase 2 + cross-file)
55
+ export { analyzeTaint, taintToFindings, analyzeTaintCrossFile, crossFileTaintToFindings, buildExportMap, buildImportMap, isSanitizerSufficient } from './taint.js';
56
+ // LLM bridge (Phase 3)
57
+ export { runLLMReview, isLLMAvailable } from './llm-bridge.js';
58
+ // Spec checker — .kern contract vs .ts implementation
59
+ export { checkSpec, checkSpecFiles, extractSpecContracts, extractImplRoutes, matchRoutes, verifyRouteContract, specViolationsToFindings } from './spec-checker.js';
26
60
  /**
27
- * Review a single TypeScript file.
61
+ * Review a single file. Auto-detects language from extension.
62
+ * Supports: .ts, .tsx, .py, .kern
28
63
  */
29
64
  export function reviewFile(filePath, config) {
30
65
  const source = readFileSync(filePath, 'utf-8');
66
+ if (filePath.endsWith('.kern')) {
67
+ return reviewKernSource(source, filePath, config);
68
+ }
69
+ if (filePath.endsWith('.py')) {
70
+ return reviewPythonSource(source, filePath, config);
71
+ }
31
72
  return reviewSource(source, filePath, config);
32
73
  }
33
74
  /**
@@ -35,26 +76,63 @@ export function reviewFile(filePath, config) {
35
76
  */
36
77
  export function reviewSource(source, filePath = 'input.ts', config) {
37
78
  const totalLines = source.split('\n').length;
38
- // Phase 1+2: Infer KERN constructs (with nodeIds + sourceSpans)
39
- const inferred = inferFromSource(source, filePath);
40
- // Phase 3: Template detection (config-aware)
79
+ // ── Shared context: single AST parse, shared across all phases ──
41
80
  const project = createInMemoryProject();
42
81
  const sourceFile = project.createSourceFile(filePath, source);
43
- const templateMatches = detectTemplates(sourceFile, config);
82
+ const fileRole = classifyFileRole(sourceFile, filePath);
83
+ // Helper: run a phase safely, collect findings even if a phase throws
84
+ const allFindings = [];
85
+ function safePhase(name, fn, fallback) {
86
+ try {
87
+ return fn();
88
+ }
89
+ catch (err) {
90
+ allFindings.push({
91
+ source: 'kern', ruleId: 'internal-error', severity: 'info', category: 'structure',
92
+ message: `Review phase '${name}' failed: ${err.message}`,
93
+ primarySpan: { file: filePath, startLine: 1, startCol: 1, endLine: 1, endCol: 1 },
94
+ fingerprint: createFingerprint('internal-error', 1, name.charCodeAt(0)),
95
+ });
96
+ return fallback;
97
+ }
98
+ }
99
+ // Phase 1: Infer KERN constructs (reuse existing SourceFile)
100
+ const inferred = safePhase('infer', () => inferFromSourceFile(sourceFile), []);
101
+ // Phase 2: Taint tracking (AST-based when SourceFile is available)
102
+ allFindings.push(...safePhase('taint', () => {
103
+ const taintResults = analyzeTaint(inferred, filePath, sourceFile);
104
+ return taintToFindings(taintResults);
105
+ }, []));
106
+ // Phase 3: Template detection (config-aware)
107
+ const templateMatches = safePhase('templates', () => detectTemplates(sourceFile, config), []);
44
108
  // Phase 4: Structural diff → unified findings
45
- const diffFindings = structuralDiff(source, inferred, filePath);
46
- // Phase 5: Quality rules → unified findings
47
- const qualityFindings = runQualityRules(sourceFile, inferred, templateMatches, config);
48
- // Merge all findings into single unified array
49
- const findings = dedup([...diffFindings, ...qualityFindings]);
50
- // Sort: severity (error > warning > info), then by line
51
- const severityOrder = { error: 0, warning: 1, info: 2 };
52
- findings.sort((a, b) => {
53
- const sd = severityOrder[a.severity] - severityOrder[b.severity];
54
- if (sd !== 0)
55
- return sd;
56
- return a.primarySpan.startLine - b.primarySpan.startLine;
57
- });
109
+ allFindings.push(...safePhase('diff', () => structuralDiff(source, inferred, filePath), []));
110
+ // Phase 5: Quality rules → unified findings (receives fileRole)
111
+ allFindings.push(...safePhase('quality', () => runQualityRules(sourceFile, inferred, templateMatches, config, fileRole), []));
112
+ // Phase 6: Concept extraction + concept rules (universal, cross-language)
113
+ const emptyConcepts = { filePath, language: 'typescript', nodes: [], edges: [], extractorVersion: '0' };
114
+ const concepts = safePhase('concepts', () => extractTsConcepts(sourceFile, filePath), emptyConcepts);
115
+ allFindings.push(...safePhase('concept-rules', () => runConceptRules(concepts, filePath), []));
116
+ // Phase 7: KERN-IR lint (ground layer + confidence rules on inferred nodes)
117
+ const irNodes = inferred.map(r => r.node);
118
+ allFindings.push(...safePhase('ground-lint', () => lintKernIR(irNodes, GROUND_LAYER_RULES), []));
119
+ allFindings.push(...safePhase('confidence-lint', () => lintConfidenceGraph(irNodes), []));
120
+ // Phase 8: TSC diagnostics — native TypeScript compiler errors
121
+ allFindings.push(...safePhase('tsc', () => runTSCDiagnostics(project), []));
122
+ // Build confidence graph if any nodes have confidence props
123
+ let confidenceGraph;
124
+ let confidenceSummary;
125
+ const hasConfidence = irNodes.some(n => n.props?.confidence !== undefined);
126
+ if (hasConfidence) {
127
+ const graph = buildConfidenceGraph(irNodes);
128
+ confidenceGraph = serializeGraph(graph);
129
+ confidenceSummary = computeConfidenceSummary(graph);
130
+ }
131
+ // Merge, dedup, sort — single shared utility
132
+ const dedupedFindings = sortAndDedup(allFindings);
133
+ // Apply suppression (inline comments + config disabledRules)
134
+ const suppression = applySuppression(dedupedFindings, source, filePath, config, config?.strict ?? false);
135
+ const findings = sortAndDedup(suppression.findings);
58
136
  // Calculate stats
59
137
  const stats = calculateStats(inferred, templateMatches, findings, totalLines);
60
138
  return {
@@ -63,14 +141,159 @@ export function reviewSource(source, filePath = 'input.ts', config) {
63
141
  templateMatches,
64
142
  findings,
65
143
  stats,
144
+ ...(confidenceGraph ? { confidenceGraph } : {}),
145
+ ...(confidenceSummary ? { confidenceSummary } : {}),
146
+ };
147
+ }
148
+ /**
149
+ * Review .kern source code (native KERN IR).
150
+ * Parses directly to IR — skips TS inference, templates, diff, AST quality rules.
151
+ * Runs: ground-layer rules, confidence rules, LLM review.
152
+ */
153
+ export function reviewKernSource(source, filePath = 'input.kern', _config) {
154
+ const totalLines = source.split('\n').length;
155
+ const allFindings = [];
156
+ function safePhase(name, fn, fallback) {
157
+ try {
158
+ return fn();
159
+ }
160
+ catch (err) {
161
+ allFindings.push({
162
+ source: 'kern', ruleId: 'internal-error', severity: 'info', category: 'structure',
163
+ message: `Review phase '${name}' failed: ${err.message}`,
164
+ primarySpan: { file: filePath, startLine: 1, startCol: 1, endLine: 1, endCol: 1 },
165
+ fingerprint: createFingerprint('internal-error', 1, name.charCodeAt(0)),
166
+ });
167
+ return fallback;
168
+ }
169
+ }
170
+ // Parse .kern → IR tree
171
+ const root = safePhase('parse', () => parseKern(source), { type: 'document' });
172
+ // Flatten IR tree for rule consumption
173
+ const flatNodes = flattenIR(root).filter(n => n.type !== 'document');
174
+ // Ground-layer rules on IR nodes
175
+ const groundFindings = safePhase('ground-lint', () => lintKernIR(flatNodes, GROUND_LAYER_RULES), []);
176
+ // Attach filePath to findings (ground rules may leave file empty)
177
+ for (const f of groundFindings) {
178
+ if (!f.primarySpan.file)
179
+ f.primarySpan.file = filePath;
180
+ }
181
+ allFindings.push(...groundFindings);
182
+ // Confidence rules on IR nodes
183
+ const confFindings = safePhase('confidence-lint', () => lintConfidenceGraph(flatNodes), []);
184
+ for (const f of confFindings) {
185
+ if (!f.primarySpan.file)
186
+ f.primarySpan.file = filePath;
187
+ }
188
+ allFindings.push(...confFindings);
189
+ // File-aware .kern review rules on flattened IR nodes
190
+ const kernSourceFindings = safePhase('kern-source-lint', () => lintKernSourceIR(flatNodes, filePath, KERN_SOURCE_RULES), []);
191
+ allFindings.push(...kernSourceFindings);
192
+ // Confidence graph
193
+ let confidenceGraph;
194
+ let confidenceSummary;
195
+ if (flatNodes.some(n => n.props?.confidence !== undefined)) {
196
+ const graph = buildConfidenceGraph(flatNodes);
197
+ confidenceGraph = serializeGraph(graph);
198
+ confidenceSummary = computeConfidenceSummary(graph);
199
+ }
200
+ // Build InferResult[] adapter for compatibility with report/LLM pipeline
201
+ const inferred = flatNodes.map((node, i) => {
202
+ const line = node.loc?.line ?? 1;
203
+ const endLine = node.loc?.endLine ?? line;
204
+ const name = node.props?.name || node.type;
205
+ const shallowNode = { ...node, children: undefined };
206
+ const rendered = serializeIR(shallowNode);
207
+ return {
208
+ node,
209
+ nodeId: `${filePath}#${node.type}:${name}@L${line}`,
210
+ promptAlias: `N${i + 1}`,
211
+ startLine: line,
212
+ endLine,
213
+ sourceSpans: [{
214
+ file: filePath, startLine: line, startCol: node.loc?.col ?? 1,
215
+ endLine, endCol: node.loc?.endCol ?? 1,
216
+ }],
217
+ summary: `${node.type}${name !== node.type ? ` ${name}` : ''}`,
218
+ confidence: 'high',
219
+ confidencePct: 100,
220
+ kernTokens: countTokens(rendered),
221
+ tsTokens: countTokens(rendered),
222
+ };
223
+ });
224
+ const dedupedFindings = sortAndDedup(allFindings);
225
+ const suppression = applySuppression(dedupedFindings, source, filePath, _config, _config?.strict ?? false);
226
+ const findings = sortAndDedup(suppression.findings);
227
+ const kernTokens = countTokens(source);
228
+ return {
229
+ filePath,
230
+ inferred,
231
+ templateMatches: [],
232
+ findings,
233
+ stats: {
234
+ totalLines,
235
+ coveredLines: totalLines,
236
+ coveragePct: 100,
237
+ totalTsTokens: kernTokens,
238
+ totalKernTokens: kernTokens,
239
+ reductionPct: 0,
240
+ constructCount: flatNodes.length,
241
+ },
242
+ ...(confidenceGraph ? { confidenceGraph } : {}),
243
+ ...(confidenceSummary ? { confidenceSummary } : {}),
66
244
  };
67
245
  }
68
246
  /**
69
- * Review all .ts/.tsx files in a directory.
247
+ * Review Python source code (string).
248
+ * Concept-only pipeline — no KERN IR inference, no ts-morph AST rules.
249
+ */
250
+ export function reviewPythonSource(source, filePath = 'input.py', config) {
251
+ const totalLines = source.split('\n').length;
252
+ // Python: concept extraction + concept rules only
253
+ let conceptFindings = [];
254
+ try {
255
+ // Dynamic import — @kernlang/review-python is optional
256
+ const { extractPythonConcepts } = require('@kernlang/review-python');
257
+ const concepts = extractPythonConcepts(source, filePath);
258
+ conceptFindings = runConceptRules(concepts, filePath);
259
+ }
260
+ catch (_err) {
261
+ // @kernlang/review-python not installed — skip concept extraction
262
+ conceptFindings = [{
263
+ source: 'kern',
264
+ ruleId: 'missing-python-support',
265
+ severity: 'info',
266
+ category: 'structure',
267
+ message: 'Install @kernlang/review-python for Python concept analysis',
268
+ primarySpan: { file: filePath, startLine: 1, startCol: 1, endLine: 1, endCol: 1 },
269
+ fingerprint: 'missing-python-0',
270
+ }];
271
+ }
272
+ const dedupedFindings = sortAndDedup(conceptFindings);
273
+ const suppression = applySuppression(dedupedFindings, source, filePath, config, config?.strict ?? false);
274
+ const findings = sortAndDedup(suppression.findings);
275
+ return {
276
+ filePath,
277
+ inferred: [],
278
+ templateMatches: [],
279
+ findings,
280
+ stats: {
281
+ totalLines,
282
+ coveredLines: 0,
283
+ coveragePct: 0,
284
+ totalTsTokens: 0,
285
+ totalKernTokens: 0,
286
+ reductionPct: 0,
287
+ constructCount: 0,
288
+ },
289
+ };
290
+ }
291
+ /**
292
+ * Review all .ts/.tsx/.py files in a directory.
70
293
  */
71
294
  export function reviewDirectory(dirPath, recursive = false, config) {
72
295
  const reports = [];
73
- const files = collectTsFiles(dirPath, recursive);
296
+ const files = collectReviewableFiles(dirPath, recursive);
74
297
  for (const file of files) {
75
298
  try {
76
299
  reports.push(reviewFile(file, config));
@@ -81,17 +304,80 @@ export function reviewDirectory(dirPath, recursive = false, config) {
81
304
  }
82
305
  return reports;
83
306
  }
84
- function collectTsFiles(dirPath, recursive) {
307
+ /**
308
+ * Review files with full import graph context.
309
+ * Entry files get normal findings, upstream dependencies get origin='upstream'.
310
+ */
311
+ export function reviewGraph(entryFiles, config, graphOptions) {
312
+ const graph = resolveImportGraph(entryFiles, graphOptions);
313
+ const entrySet = new Set(graph.entryFiles);
314
+ const reports = [];
315
+ for (const gf of graph.files) {
316
+ if (!existsSync(gf.path))
317
+ continue;
318
+ try {
319
+ const report = reviewFile(gf.path, config);
320
+ const isEntry = entrySet.has(gf.path);
321
+ // Tag every finding with provenance
322
+ for (const f of report.findings) {
323
+ f.origin = isEntry ? 'changed' : 'upstream';
324
+ f.distance = gf.distance;
325
+ // Upstream findings: keep severity for errors on the live path (distance 1),
326
+ // downgrade to info only for distant dependencies (distance 2+)
327
+ if (!isEntry && f.severity !== 'info') {
328
+ if (gf.distance >= 2 || f.severity !== 'error') {
329
+ f.severity = 'info';
330
+ }
331
+ }
332
+ }
333
+ // Re-sort after severity mutations
334
+ sortFindings(report.findings);
335
+ reports.push(report);
336
+ }
337
+ catch (err) {
338
+ console.error(` Skipping ${relative(process.cwd(), gf.path)}: ${err.message}`);
339
+ }
340
+ }
341
+ // Cross-file taint analysis — trace tainted data across import boundaries
342
+ const inferredPerFile = new Map();
343
+ const graphImports = new Map();
344
+ for (const report of reports) {
345
+ inferredPerFile.set(report.filePath, report.inferred);
346
+ }
347
+ for (const gf of graph.files) {
348
+ graphImports.set(gf.path, gf.imports);
349
+ }
350
+ const crossFileResults = analyzeTaintCrossFile(inferredPerFile, graphImports);
351
+ if (crossFileResults.length > 0) {
352
+ const crossFileFindings = crossFileTaintToFindings(crossFileResults);
353
+ // Add cross-file findings to the caller's report
354
+ for (const f of crossFileFindings) {
355
+ const callerReport = reports.find(r => r.filePath === f.primarySpan.file);
356
+ if (callerReport) {
357
+ callerReport.findings.push(f);
358
+ callerReport.findings = sortAndDedup(callerReport.findings);
359
+ }
360
+ }
361
+ }
362
+ return reports;
363
+ }
364
+ function collectReviewableFiles(dirPath, recursive) {
85
365
  const files = [];
86
366
  for (const entry of readdirSync(dirPath)) {
87
367
  const full = join(dirPath, entry);
88
368
  const stat = statSync(full);
89
- if (stat.isDirectory() && recursive && !entry.startsWith('.') && entry !== 'node_modules' && entry !== 'dist') {
90
- files.push(...collectTsFiles(full, true));
369
+ if (stat.isDirectory() && recursive && !entry.startsWith('.') && entry !== 'node_modules' && entry !== 'dist' && entry !== '__pycache__' && entry !== '.venv' && entry !== 'venv') {
370
+ files.push(...collectReviewableFiles(full, true));
91
371
  }
92
372
  else if ((entry.endsWith('.ts') || entry.endsWith('.tsx')) && !entry.endsWith('.d.ts') && !entry.endsWith('.test.ts') && !entry.endsWith('.test.tsx')) {
93
373
  files.push(full);
94
374
  }
375
+ else if (entry.endsWith('.py') && !entry.startsWith('test_') && !entry.endsWith('_test.py')) {
376
+ files.push(full);
377
+ }
378
+ else if (entry.endsWith('.kern')) {
379
+ files.push(full);
380
+ }
95
381
  }
96
382
  return files;
97
383
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}