@kernlang/review 3.1.6 → 3.1.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.
- 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 +210 -121
- 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.js +23 -19
- package/dist/rules/cli.js.map +1 -1
- 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.js +53 -19
- package/dist/rules/fastapi.js.map +1 -1
- package/dist/rules/ground-layer.js +3 -3
- package/dist/rules/ground-layer.js.map +1 -1
- package/dist/rules/index.js +574 -105
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/ink.js +9 -8
- package/dist/rules/ink.js.map +1 -1
- 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.js +17 -5
- package/dist/rules/terminal.js.map +1 -1
- 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 +2 -2
package/dist/rules/fastapi.js
CHANGED
|
@@ -10,7 +10,7 @@ function lineForIndex(text, index) {
|
|
|
10
10
|
}
|
|
11
11
|
function routeNodes(concepts) {
|
|
12
12
|
return concepts.nodes
|
|
13
|
-
.filter(node => node.kind === 'entrypoint' && node.payload.kind === 'entrypoint' && node.payload.subtype === 'route')
|
|
13
|
+
.filter((node) => node.kind === 'entrypoint' && node.payload.kind === 'entrypoint' && node.payload.subtype === 'route')
|
|
14
14
|
.sort((a, b) => a.primarySpan.startLine - b.primarySpan.startLine);
|
|
15
15
|
}
|
|
16
16
|
function extractRoutes(source, concepts) {
|
|
@@ -51,7 +51,7 @@ function extractRoutes(source, concepts) {
|
|
|
51
51
|
return routes;
|
|
52
52
|
}
|
|
53
53
|
function nodesInRoute(ctx, route, kind) {
|
|
54
|
-
return ctx.concepts.nodes.filter(node => node.kind === kind &&
|
|
54
|
+
return ctx.concepts.nodes.filter((node) => node.kind === kind &&
|
|
55
55
|
node.primarySpan.startLine >= route.startLine &&
|
|
56
56
|
node.primarySpan.startLine <= route.endLine);
|
|
57
57
|
}
|
|
@@ -61,24 +61,46 @@ function bodyLine(route, index) {
|
|
|
61
61
|
// ── Rule: fastapi-missing-response-model ────────────────────────────────
|
|
62
62
|
function missingResponseModel(ctx) {
|
|
63
63
|
const findings = [];
|
|
64
|
-
const plainReturn = /\breturn\s+(?!None\b)(?!JSONResponse\b)(?!PlainTextResponse\b)(?!StreamingResponse\b)(?!FileResponse\b)(?!RedirectResponse\b)(?!HTMLResponse\b)(?!TemplateResponse\b)(?!Response\b)(?:\{|\[|[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*)/;
|
|
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
65
|
for (const route of extractRoutes(ctx.source, ctx.concepts)) {
|
|
66
66
|
if (/response_model\s*=/.test(route.decoratorText))
|
|
67
67
|
continue;
|
|
68
68
|
if (!plainReturn.test(route.body))
|
|
69
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, {
|
|
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
|
+
}));
|
|
71
73
|
}
|
|
72
74
|
return findings;
|
|
73
75
|
}
|
|
74
76
|
// ── Rule: fastapi-blocking-sync-route ───────────────────────────────────
|
|
75
77
|
const BLOCKING_PATTERNS = [
|
|
76
|
-
{
|
|
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
|
+
},
|
|
77
83
|
{ pattern: /\bopen\s*\(/g, label: 'open()', suggestion: 'Use aiofiles or move blocking file I/O off the event loop' },
|
|
78
|
-
{
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
+
},
|
|
82
104
|
];
|
|
83
105
|
function blockingSyncRoute(ctx) {
|
|
84
106
|
const findings = [];
|
|
@@ -106,7 +128,9 @@ function sharedState(ctx) {
|
|
|
106
128
|
continue;
|
|
107
129
|
if (payload.scope !== 'global' && payload.scope !== 'module')
|
|
108
130
|
continue;
|
|
109
|
-
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, {
|
|
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
|
+
}));
|
|
110
134
|
}
|
|
111
135
|
}
|
|
112
136
|
return findings;
|
|
@@ -122,26 +146,36 @@ function broadExcept(ctx) {
|
|
|
122
146
|
let match;
|
|
123
147
|
while ((match = broad.exec(route.body)) !== null) {
|
|
124
148
|
const line = bodyLine(route, match.index);
|
|
125
|
-
const conceptMatch = handlers.find(node => node.primarySpan.startLine === line);
|
|
149
|
+
const conceptMatch = handlers.find((node) => node.primarySpan.startLine === line);
|
|
126
150
|
if (!conceptMatch)
|
|
127
151
|
continue;
|
|
128
152
|
const block = route.body.slice(match.index, match.index + 220);
|
|
129
153
|
if (/\braise\s+HTTPException\b|\braise\b/.test(block))
|
|
130
154
|
continue;
|
|
131
|
-
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, {
|
|
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
|
+
}));
|
|
132
158
|
}
|
|
133
159
|
}
|
|
134
160
|
return findings;
|
|
135
161
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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];
|
|
142
176
|
export function runFastapiConceptRules(concepts, filePath, source) {
|
|
143
177
|
const ctx = { concepts, filePath, source };
|
|
144
|
-
return FASTAPI_CONCEPT_RULES.flatMap(rule => rule(ctx));
|
|
178
|
+
return FASTAPI_CONCEPT_RULES.flatMap((rule) => rule(ctx));
|
|
145
179
|
}
|
|
146
180
|
// FastAPI is executed via reviewPythonSource(), not the TS quality-rule layer.
|
|
147
181
|
// The target still needs layer registration for --list-rules / target metadata.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastapi.js","sourceRoot":"","sources":["../../src/rules/fastapi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAmBrC,SAAS,YAAY,CAAC,IAAY,EAAE,KAAa;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,QAAoB;IACtC,OAAO,QAAQ,CAAC,KAAK;SAClB,MAAM,CAAC,IAAI,
|
|
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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"}
|