@kernlang/review 3.1.5 → 3.1.7
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.
- package/LICENSE +17 -0
- package/dist/cache.d.ts +1 -1
- package/dist/cache.js +5 -3
- package/dist/cache.js.map +1 -1
- package/dist/call-graph.d.ts +63 -0
- package/dist/call-graph.js +380 -0
- package/dist/call-graph.js.map +1 -0
- package/dist/concept-rules/boundary-mutation.d.ts +1 -1
- package/dist/concept-rules/boundary-mutation.js.map +1 -1
- package/dist/concept-rules/ignored-error.d.ts +1 -1
- package/dist/concept-rules/ignored-error.js.map +1 -1
- package/dist/concept-rules/illegal-dependency.d.ts +1 -1
- package/dist/concept-rules/illegal-dependency.js.map +1 -1
- package/dist/concept-rules/index.js +1 -6
- package/dist/concept-rules/index.js.map +1 -1
- package/dist/concept-rules/unguarded-effect.d.ts +1 -1
- package/dist/concept-rules/unguarded-effect.js.map +1 -1
- package/dist/concept-rules/unrecovered-effect.d.ts +1 -1
- package/dist/concept-rules/unrecovered-effect.js +2 -1
- package/dist/concept-rules/unrecovered-effect.js.map +1 -1
- package/dist/confidence.js +12 -8
- package/dist/confidence.js.map +1 -1
- package/dist/differ.js +3 -7
- package/dist/differ.js.map +1 -1
- package/dist/external-tools.js +5 -6
- package/dist/external-tools.js.map +1 -1
- package/dist/file-context.d.ts +21 -0
- package/dist/file-context.js +234 -0
- package/dist/file-context.js.map +1 -0
- package/dist/file-role.js +14 -7
- package/dist/file-role.js.map +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/graph.js +24 -16
- package/dist/graph.js.map +1 -1
- package/dist/index.d.ts +44 -35
- package/dist/index.js +221 -68
- package/dist/index.js.map +1 -1
- package/dist/inferrer.d.ts +8 -2
- package/dist/inferrer.js +80 -47
- package/dist/inferrer.js.map +1 -1
- package/dist/kern-lint.d.ts +3 -4
- package/dist/kern-lint.js +7 -5
- package/dist/kern-lint.js.map +1 -1
- package/dist/llm-bridge.d.ts +23 -7
- package/dist/llm-bridge.js +267 -31
- package/dist/llm-bridge.js.map +1 -1
- package/dist/llm-review.d.ts +16 -2
- package/dist/llm-review.js +240 -35
- package/dist/llm-review.js.map +1 -1
- package/dist/mappers/ts-concepts.d.ts +1 -1
- package/dist/mappers/ts-concepts.js +303 -32
- package/dist/mappers/ts-concepts.js.map +1 -1
- package/dist/norm-miner.d.ts +31 -0
- package/dist/norm-miner.js +119 -0
- package/dist/norm-miner.js.map +1 -0
- package/dist/obligations.d.ts +63 -0
- package/dist/obligations.js +158 -0
- package/dist/obligations.js.map +1 -0
- package/dist/quality-rules.d.ts +3 -3
- package/dist/quality-rules.js +4 -2
- package/dist/quality-rules.js.map +1 -1
- package/dist/reporter.d.ts +7 -2
- package/dist/reporter.js +82 -51
- package/dist/reporter.js.map +1 -1
- package/dist/rule-eval.d.ts +1 -2
- package/dist/rule-eval.js +5 -9
- package/dist/rule-eval.js.map +1 -1
- package/dist/rule-loader.js +16 -14
- package/dist/rule-loader.js.map +1 -1
- package/dist/rules/base.js +153 -69
- package/dist/rules/base.js.map +1 -1
- package/dist/rules/cli.d.ts +7 -0
- package/dist/rules/cli.js +99 -0
- package/dist/rules/cli.js.map +1 -0
- package/dist/rules/confidence.d.ts +1 -1
- package/dist/rules/confidence.js +5 -5
- package/dist/rules/confidence.js.map +1 -1
- package/dist/rules/dead-code.d.ts +10 -0
- package/dist/rules/dead-code.js +75 -0
- package/dist/rules/dead-code.js.map +1 -0
- package/dist/rules/dead-logic.js +35 -31
- package/dist/rules/dead-logic.js.map +1 -1
- package/dist/rules/express.d.ts +2 -1
- package/dist/rules/express.js +380 -126
- package/dist/rules/express.js.map +1 -1
- package/dist/rules/fastapi.d.ts +10 -0
- package/dist/rules/fastapi.js +183 -0
- package/dist/rules/fastapi.js.map +1 -0
- package/dist/rules/ground-layer.js +3 -3
- package/dist/rules/ground-layer.js.map +1 -1
- package/dist/rules/index.d.ts +5 -1
- package/dist/rules/index.js +602 -84
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/ink.d.ts +8 -0
- package/dist/rules/ink.js +88 -0
- package/dist/rules/ink.js.map +1 -0
- package/dist/rules/kern-source.js +202 -63
- package/dist/rules/kern-source.js.map +1 -1
- package/dist/rules/nextjs.js +88 -33
- package/dist/rules/nextjs.js.map +1 -1
- package/dist/rules/null-safety.js +52 -26
- package/dist/rules/null-safety.js.map +1 -1
- package/dist/rules/nuxt.js +24 -29
- package/dist/rules/nuxt.js.map +1 -1
- package/dist/rules/react.js +355 -69
- package/dist/rules/react.js.map +1 -1
- package/dist/rules/security-v2.js +71 -57
- package/dist/rules/security-v2.js.map +1 -1
- package/dist/rules/security-v3.js.map +1 -1
- package/dist/rules/security-v4.js +54 -27
- package/dist/rules/security-v4.js.map +1 -1
- package/dist/rules/security.js +35 -5
- package/dist/rules/security.js.map +1 -1
- package/dist/rules/terminal.d.ts +8 -0
- package/dist/rules/terminal.js +139 -0
- package/dist/rules/terminal.js.map +1 -0
- package/dist/rules/vue.js +162 -107
- package/dist/rules/vue.js.map +1 -1
- package/dist/semantic-diff.d.ts +52 -0
- package/dist/semantic-diff.js +342 -0
- package/dist/semantic-diff.js.map +1 -0
- package/dist/spec-checker.js +11 -10
- package/dist/spec-checker.js.map +1 -1
- package/dist/suppression/apply-suppression.d.ts +2 -3
- package/dist/suppression/apply-suppression.js +3 -3
- package/dist/suppression/apply-suppression.js.map +1 -1
- package/dist/suppression/index.d.ts +2 -2
- package/dist/suppression/index.js +1 -1
- package/dist/suppression/index.js.map +1 -1
- package/dist/suppression/parse-directives.d.ts +1 -1
- package/dist/suppression/parse-directives.js +9 -4
- package/dist/suppression/parse-directives.js.map +1 -1
- package/dist/taint-ast.d.ts +20 -0
- package/dist/taint-ast.js +427 -0
- package/dist/taint-ast.js.map +1 -0
- package/dist/taint-crossfile.d.ts +28 -0
- package/dist/taint-crossfile.js +174 -0
- package/dist/taint-crossfile.js.map +1 -0
- package/dist/taint-findings.d.ts +17 -0
- package/dist/taint-findings.js +131 -0
- package/dist/taint-findings.js.map +1 -0
- package/dist/taint-regex.d.ts +61 -0
- package/dist/taint-regex.js +379 -0
- package/dist/taint-regex.js.map +1 -0
- package/dist/taint-types.d.ts +128 -0
- package/dist/taint-types.js +174 -0
- package/dist/taint-types.js.map +1 -0
- package/dist/taint.d.ts +13 -107
- package/dist/taint.js +16 -1067
- package/dist/taint.js.map +1 -1
- package/dist/template-detector.d.ts +2 -2
- package/dist/template-detector.js +11 -16
- package/dist/template-detector.js.map +1 -1
- package/dist/types.d.ts +35 -0
- package/dist/types.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FastAPI review rules — active when target = fastapi.
|
|
3
|
+
*
|
|
4
|
+
* FastAPI uses the Python concept pipeline, so the real checks live in
|
|
5
|
+
* runFastapiConceptRules() below and operate on ConceptMap + source text.
|
|
6
|
+
*/
|
|
7
|
+
import { finding } from './utils.js';
|
|
8
|
+
function lineForIndex(text, index) {
|
|
9
|
+
return text.slice(0, index).split('\n').length;
|
|
10
|
+
}
|
|
11
|
+
function routeNodes(concepts) {
|
|
12
|
+
return concepts.nodes
|
|
13
|
+
.filter((node) => node.kind === 'entrypoint' && node.payload.kind === 'entrypoint' && node.payload.subtype === 'route')
|
|
14
|
+
.sort((a, b) => a.primarySpan.startLine - b.primarySpan.startLine);
|
|
15
|
+
}
|
|
16
|
+
function extractRoutes(source, concepts) {
|
|
17
|
+
const lines = source.split('\n');
|
|
18
|
+
const routes = [];
|
|
19
|
+
for (const node of routeNodes(concepts)) {
|
|
20
|
+
const startIdx = node.primarySpan.startLine - 1;
|
|
21
|
+
for (let i = startIdx; i < lines.length; i++) {
|
|
22
|
+
const match = lines[i].match(/^(\s*)(async\s+def|def)\s+([A-Za-z_]\w*)\s*\(/);
|
|
23
|
+
if (!match)
|
|
24
|
+
continue;
|
|
25
|
+
const defIndent = match[1].length;
|
|
26
|
+
let endLine = lines.length;
|
|
27
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
28
|
+
const line = lines[j];
|
|
29
|
+
const trimmed = line.trim();
|
|
30
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
31
|
+
continue;
|
|
32
|
+
const indent = line.match(/^(\s*)/)?.[1].length ?? 0;
|
|
33
|
+
if (indent <= defIndent) {
|
|
34
|
+
endLine = j;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
routes.push({
|
|
39
|
+
startLine: node.primarySpan.startLine,
|
|
40
|
+
headerLine: i + 1,
|
|
41
|
+
endLine,
|
|
42
|
+
name: match[3],
|
|
43
|
+
method: node.payload.kind === 'entrypoint' ? node.payload.httpMethod : undefined,
|
|
44
|
+
isAsync: match[2].startsWith('async'),
|
|
45
|
+
decoratorText: node.evidence,
|
|
46
|
+
body: lines.slice(i + 1, endLine).join('\n'),
|
|
47
|
+
});
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return routes;
|
|
52
|
+
}
|
|
53
|
+
function nodesInRoute(ctx, route, kind) {
|
|
54
|
+
return ctx.concepts.nodes.filter((node) => node.kind === kind &&
|
|
55
|
+
node.primarySpan.startLine >= route.startLine &&
|
|
56
|
+
node.primarySpan.startLine <= route.endLine);
|
|
57
|
+
}
|
|
58
|
+
function bodyLine(route, index) {
|
|
59
|
+
return route.headerLine + lineForIndex(route.body, index);
|
|
60
|
+
}
|
|
61
|
+
// ── Rule: fastapi-missing-response-model ────────────────────────────────
|
|
62
|
+
function missingResponseModel(ctx) {
|
|
63
|
+
const findings = [];
|
|
64
|
+
const plainReturn = /\breturn\s+(?!None\b)(?!JSONResponse\b)(?!ORJSONResponse\b)(?!UJSONResponse\b)(?!PlainTextResponse\b)(?!StreamingResponse\b)(?!FileResponse\b)(?!RedirectResponse\b)(?!HTMLResponse\b)(?!TemplateResponse\b)(?!Response\b)(?:\{|\[|[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*)/;
|
|
65
|
+
for (const route of extractRoutes(ctx.source, ctx.concepts)) {
|
|
66
|
+
if (/response_model\s*=/.test(route.decoratorText))
|
|
67
|
+
continue;
|
|
68
|
+
if (!plainReturn.test(route.body))
|
|
69
|
+
continue;
|
|
70
|
+
findings.push(finding('fastapi-missing-response-model', 'warning', 'pattern', `FastAPI route '${route.name}' returns data without response_model — response shape is undocumented and easy to over-expose`, ctx.filePath, route.startLine, 1, {
|
|
71
|
+
suggestion: 'Declare response_model=YourSchema on the route decorator so FastAPI validates and filters outbound data',
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
return findings;
|
|
75
|
+
}
|
|
76
|
+
// ── Rule: fastapi-blocking-sync-route ───────────────────────────────────
|
|
77
|
+
const BLOCKING_PATTERNS = [
|
|
78
|
+
{
|
|
79
|
+
pattern: /\brequests\.(?:get|post|put|patch|delete|head|options|request)\s*\(/g,
|
|
80
|
+
label: 'requests.*',
|
|
81
|
+
suggestion: 'Use httpx.AsyncClient/aiohttp or move the blocking call to a threadpool',
|
|
82
|
+
},
|
|
83
|
+
{ pattern: /\bopen\s*\(/g, label: 'open()', suggestion: 'Use aiofiles or move blocking file I/O off the event loop' },
|
|
84
|
+
{
|
|
85
|
+
pattern: /\b(?:sqlite3|psycopg2)\./g,
|
|
86
|
+
label: 'sync DB client',
|
|
87
|
+
suggestion: 'Use an async database driver inside async FastAPI routes',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
pattern: /\bcursor\.execute\s*\(/g,
|
|
91
|
+
label: 'cursor.execute()',
|
|
92
|
+
suggestion: 'Use an async database client or execute the query in a worker thread',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
pattern: /\bsubprocess\.(?:run|call|check_call|check_output)\s*\(/g,
|
|
96
|
+
label: 'subprocess.*',
|
|
97
|
+
suggestion: 'Use asyncio.create_subprocess_exec() or a worker thread from async routes',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
pattern: /\btime\.sleep\s*\(/g,
|
|
101
|
+
label: 'time.sleep()',
|
|
102
|
+
suggestion: 'Use await asyncio.sleep() in async FastAPI routes',
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
function blockingSyncRoute(ctx) {
|
|
106
|
+
const findings = [];
|
|
107
|
+
for (const route of extractRoutes(ctx.source, ctx.concepts)) {
|
|
108
|
+
if (!route.isAsync)
|
|
109
|
+
continue;
|
|
110
|
+
for (const { pattern, label, suggestion } of BLOCKING_PATTERNS) {
|
|
111
|
+
pattern.lastIndex = 0;
|
|
112
|
+
const match = pattern.exec(route.body);
|
|
113
|
+
if (!match)
|
|
114
|
+
continue;
|
|
115
|
+
findings.push(finding('fastapi-blocking-sync-route', 'warning', 'bug', `Async FastAPI route '${route.name}' uses blocking ${label} — the event loop will stall under load`, ctx.filePath, bodyLine(route, match.index), 1, { suggestion }));
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return findings;
|
|
120
|
+
}
|
|
121
|
+
// ── Rule: fastapi-shared-state ──────────────────────────────────────────
|
|
122
|
+
function sharedState(ctx) {
|
|
123
|
+
const findings = [];
|
|
124
|
+
for (const route of extractRoutes(ctx.source, ctx.concepts)) {
|
|
125
|
+
for (const mutation of nodesInRoute(ctx, route, 'state_mutation')) {
|
|
126
|
+
const payload = mutation.payload;
|
|
127
|
+
if (payload.kind !== 'state_mutation')
|
|
128
|
+
continue;
|
|
129
|
+
if (payload.scope !== 'global' && payload.scope !== 'module')
|
|
130
|
+
continue;
|
|
131
|
+
findings.push(finding('fastapi-shared-state', 'error', 'bug', `FastAPI route '${route.name}' mutates ${payload.scope} state '${payload.target}' — concurrent requests can race and leak state across users`, ctx.filePath, mutation.primarySpan.startLine, 1, {
|
|
132
|
+
suggestion: 'Move per-request data into function scope, a dependency, or a database/cache with explicit concurrency control',
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return findings;
|
|
137
|
+
}
|
|
138
|
+
// ── Rule: fastapi-broad-except ──────────────────────────────────────────
|
|
139
|
+
function broadExcept(ctx) {
|
|
140
|
+
const findings = [];
|
|
141
|
+
const broad = /^\s*except(?:\s+Exception(?:\s+as\s+\w+)?)?\s*:/gm;
|
|
142
|
+
for (const route of extractRoutes(ctx.source, ctx.concepts)) {
|
|
143
|
+
const handlers = nodesInRoute(ctx, route, 'error_handle');
|
|
144
|
+
if (handlers.length === 0)
|
|
145
|
+
continue;
|
|
146
|
+
let match;
|
|
147
|
+
while ((match = broad.exec(route.body)) !== null) {
|
|
148
|
+
const line = bodyLine(route, match.index);
|
|
149
|
+
const conceptMatch = handlers.find((node) => node.primarySpan.startLine === line);
|
|
150
|
+
if (!conceptMatch)
|
|
151
|
+
continue;
|
|
152
|
+
const block = route.body.slice(match.index, match.index + 220);
|
|
153
|
+
if (/\braise\s+HTTPException\b|\braise\b/.test(block))
|
|
154
|
+
continue;
|
|
155
|
+
findings.push(finding('fastapi-broad-except', 'warning', 'bug', `FastAPI route '${route.name}' catches broad exceptions without re-raising — real failures get flattened into generic responses`, ctx.filePath, line, 1, {
|
|
156
|
+
suggestion: "Catch specific exceptions and re-raise HTTPException (or let FastAPI's exception handlers deal with them)",
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return findings;
|
|
161
|
+
}
|
|
162
|
+
// ── Rule: fastapi-broad-cors ──────────────────────────────────────────────
|
|
163
|
+
function broadCors(ctx) {
|
|
164
|
+
const findings = [];
|
|
165
|
+
const corsRegex = /allow_origins\s*=\s*\[([^\]]*)\]/g;
|
|
166
|
+
let match;
|
|
167
|
+
while ((match = corsRegex.exec(ctx.source)) !== null) {
|
|
168
|
+
if (!match[1].includes('"*"') && !match[1].includes("'*'"))
|
|
169
|
+
continue;
|
|
170
|
+
const line = lineForIndex(ctx.source, match.index);
|
|
171
|
+
findings.push(finding('fastapi-broad-cors', 'warning', 'pattern', 'CORSMiddleware uses allow_origins=["*"] — any origin can make credentialed requests if allow_credentials is also True', ctx.filePath, line, 1, { suggestion: 'Restrict allow_origins to specific trusted domains instead of wildcard' }));
|
|
172
|
+
}
|
|
173
|
+
return findings;
|
|
174
|
+
}
|
|
175
|
+
const FASTAPI_CONCEPT_RULES = [missingResponseModel, blockingSyncRoute, sharedState, broadExcept, broadCors];
|
|
176
|
+
export function runFastapiConceptRules(concepts, filePath, source) {
|
|
177
|
+
const ctx = { concepts, filePath, source };
|
|
178
|
+
return FASTAPI_CONCEPT_RULES.flatMap((rule) => rule(ctx));
|
|
179
|
+
}
|
|
180
|
+
// FastAPI is executed via reviewPythonSource(), not the TS quality-rule layer.
|
|
181
|
+
// The target still needs layer registration for --list-rules / target metadata.
|
|
182
|
+
export const fastapiRules = [];
|
|
183
|
+
//# sourceMappingURL=fastapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastapi.js","sourceRoot":"","sources":["../../src/rules/fastapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ function props(node) {
|
|
|
12
12
|
}
|
|
13
13
|
function children(node, type) {
|
|
14
14
|
const c = node.children || [];
|
|
15
|
-
return type ? c.filter(n => n.type === type) : c;
|
|
15
|
+
return type ? c.filter((n) => n.type === type) : c;
|
|
16
16
|
}
|
|
17
17
|
function loc(node) {
|
|
18
18
|
return { line: node.loc?.line || 0, col: node.loc?.col || 1 };
|
|
@@ -109,9 +109,9 @@ export const expectRangeInverted = (nodes) => {
|
|
|
109
109
|
if (node.type === 'expect') {
|
|
110
110
|
const p = props(node);
|
|
111
111
|
const within = p.within;
|
|
112
|
-
if (within
|
|
112
|
+
if (within?.includes('..')) {
|
|
113
113
|
const [lo, hi] = within.split('..').map(Number);
|
|
114
|
-
if (!isNaN(lo) && !isNaN(hi) && lo > hi) {
|
|
114
|
+
if (!Number.isNaN(lo) && !Number.isNaN(hi) && lo > hi) {
|
|
115
115
|
findings.push(finding('expect-range-inverted', 'warning', 'bug', `Expect '${p.name || 'unnamed'}' has inverted range: ${lo} > ${hi}`, node));
|
|
116
116
|
}
|
|
117
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ground-layer.js","sourceRoot":"","sources":["../../src/rules/ground-layer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"ground-layer.js","sourceRoot":"","sources":["../../src/rules/ground-layer.ts"],"names":[],"mappings":"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"}
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -3,9 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Layers:
|
|
5
5
|
* [base] Always active — universal TS/KERN rules
|
|
6
|
-
* [react] Active when target = nextjs | tailwind | web | native
|
|
6
|
+
* [react] Active when target = nextjs | tailwind | web | native | ink
|
|
7
|
+
* [ink] Active when target = ink (on top of react)
|
|
7
8
|
* [vue] Active when target = vue | nuxt
|
|
8
9
|
* [express] Active when target = express
|
|
10
|
+
* [cli] Active when target = cli
|
|
11
|
+
* [terminal] Active when target = terminal
|
|
12
|
+
* [fastapi] Active when target = fastapi (Python concept layer)
|
|
9
13
|
* [nextjs] Active when target = nextjs (on top of react)
|
|
10
14
|
* [nuxt] Active when target = nuxt (on top of vue)
|
|
11
15
|
*/
|