@kevinrabun/judges 3.1.1 → 3.2.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.
- package/README.md +16 -9
- package/dist/ast/index.d.ts +12 -1
- package/dist/ast/index.d.ts.map +1 -1
- package/dist/ast/index.js +72 -3
- package/dist/ast/index.js.map +1 -1
- package/dist/ast/tree-sitter-ast.d.ts +34 -0
- package/dist/ast/tree-sitter-ast.d.ts.map +1 -0
- package/dist/ast/tree-sitter-ast.js +747 -0
- package/dist/ast/tree-sitter-ast.js.map +1 -0
- package/dist/index.js +1 -1
- package/grammars/tree-sitter-c_sharp.wasm +0 -0
- package/grammars/tree-sitter-go.wasm +0 -0
- package/grammars/tree-sitter-java.wasm +0 -0
- package/grammars/tree-sitter-python.wasm +0 -0
- package/grammars/tree-sitter-rust.wasm +0 -0
- package/package.json +11 -2
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Judges Panel
|
|
2
2
|
|
|
3
|
-
An MCP (Model Context Protocol) server that provides a panel of **35 specialized judges** to evaluate AI-generated code — acting as an independent quality gate regardless of which project is being reviewed.
|
|
3
|
+
An MCP (Model Context Protocol) server that provides a panel of **35 specialized judges** to evaluate AI-generated code — acting as an independent quality gate regardless of which project is being reviewed. Combines **deterministic pattern matching & AST analysis** (instant, offline, zero LLM calls) with **LLM-powered deep-review prompts** that let your AI assistant perform expert-persona analysis across all 35 domains.
|
|
4
4
|
|
|
5
5
|
**Highlights:**
|
|
6
6
|
- Includes an **App Builder Workflow (3-step)** demo for release decisions, plain-language risk summaries, and prioritized fixes — see [Try the Demo](#2-try-the-demo).
|
|
@@ -11,7 +11,7 @@ An MCP (Model Context Protocol) server that provides a panel of **35 specialized
|
|
|
11
11
|
[](https://www.npmjs.com/package/@kevinrabun/judges)
|
|
12
12
|
[](https://www.npmjs.com/package/@kevinrabun/judges)
|
|
13
13
|
[](https://opensource.org/licenses/MIT)
|
|
14
|
-
[](https://github.com/KevinRabun/judges/actions)
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
@@ -24,7 +24,7 @@ AI code generators (Copilot, Cursor, Claude, ChatGPT, etc.) write code fast —
|
|
|
24
24
|
| **Scope** | Style + some bugs | Bugs + code smells | Security patterns | **35 domains**: security, cost, compliance, a11y, API design, cloud, UX, … |
|
|
25
25
|
| **AI-generated code focus** | No | No | Partial | **Purpose-built** for AI output failure modes |
|
|
26
26
|
| **Setup** | Config per project | Server + scanner | Cloud or local | **One command**: `npx @kevinrabun/judges eval file.ts` |
|
|
27
|
-
| **Auto-fix patches** | Some | No | No | **47 deterministic patches** —
|
|
27
|
+
| **Auto-fix patches** | Some | No | No | **47 deterministic patches** — instant, offline |
|
|
28
28
|
| **Non-technical output** | No | Dashboard | No | **Plain-language findings** with What/Why/Next |
|
|
29
29
|
| **MCP native** | No | No | No | **Yes** — works inside Copilot, Claude, Cursor |
|
|
30
30
|
| **SARIF output** | No | Yes | Yes | **Yes** — upload to GitHub Code Scanning |
|
|
@@ -367,24 +367,24 @@ This helps keep Copilot feedback aligned with Judges findings.
|
|
|
367
367
|
|
|
368
368
|
The tribunal operates in three layers:
|
|
369
369
|
|
|
370
|
-
1. **Pattern-Based Analysis** — All tools (`evaluate_code`, `evaluate_code_single_judge`, `evaluate_project`, `evaluate_diff`) perform heuristic analysis using regex pattern matching to catch common anti-patterns. This
|
|
370
|
+
1. **Pattern-Based Analysis** — All tools (`evaluate_code`, `evaluate_code_single_judge`, `evaluate_project`, `evaluate_diff`) perform heuristic analysis using regex pattern matching to catch common anti-patterns. This layer is instant, deterministic, and runs entirely offline with zero external API calls.
|
|
371
371
|
|
|
372
|
-
2. **AST-Based Structural Analysis** — The Code Structure judge (`STRUCT-*` rules) uses real Abstract Syntax Tree parsing to measure cyclomatic complexity, nesting depth, function length, parameter count, dead code, and type safety with precision that regex cannot achieve. JavaScript/TypeScript files are parsed via the TypeScript Compiler API
|
|
372
|
+
2. **AST-Based Structural Analysis** — The Code Structure judge (`STRUCT-*` rules) uses real Abstract Syntax Tree parsing to measure cyclomatic complexity, nesting depth, function length, parameter count, dead code, and type safety with precision that regex cannot achieve. JavaScript/TypeScript files are parsed via the TypeScript Compiler API. Python, Rust, Go, Java, and C# are parsed via **tree-sitter WASM grammars** — real syntax trees compiled to WebAssembly that run in-process with zero native dependencies. A scope-tracking structural parser is kept as a fallback when WASM grammars are unavailable. No external AST server required.
|
|
373
373
|
|
|
374
|
-
3. **LLM-Powered Deep Analysis (Prompts)** — The server exposes MCP prompts (e.g., `judge-data-security`, `full-tribunal`) that provide each judge's expert persona as a system prompt. When used by an LLM-based client,
|
|
374
|
+
3. **LLM-Powered Deep Analysis (Prompts)** — The server exposes MCP prompts (e.g., `judge-data-security`, `full-tribunal`) that provide each judge's expert persona as a system prompt. When used by an LLM-based client (Copilot, Claude, Cursor, etc.), the host LLM performs deeper, context-aware probabilistic analysis beyond what static patterns can detect. This is where the `systemPrompt` on each judge comes alive — Judges itself makes no LLM calls, but it provides the expert criteria so your AI assistant can act as 35 specialized reviewers.
|
|
375
375
|
|
|
376
376
|
---
|
|
377
377
|
|
|
378
378
|
## Composable by Design
|
|
379
379
|
|
|
380
|
-
Judges Panel
|
|
380
|
+
Judges Panel is a **dual-layer** review system: instant **deterministic tools** (offline, no API keys) for pattern and AST analysis, plus **35 expert-persona MCP prompts** that unlock LLM-powered deep analysis when connected to an AI client. It does not try to be a CVE scanner or a linter. Those capabilities belong in dedicated MCP servers that an AI agent can orchestrate alongside Judges.
|
|
381
381
|
|
|
382
382
|
### Built-in AST Analysis (v2.0.0)
|
|
383
383
|
|
|
384
384
|
Unlike earlier versions that recommended a separate AST MCP server, Judges Panel now includes **real AST-based structural analysis** out of the box:
|
|
385
385
|
|
|
386
386
|
- **JavaScript / TypeScript** — Parsed with the TypeScript Compiler API (`ts.createSourceFile`) for full-fidelity AST
|
|
387
|
-
- **Python, Rust, Go, Java, C#** —
|
|
387
|
+
- **Python, Rust, Go, Java, C#** — Parsed with **tree-sitter WASM grammars** for full syntax-tree analysis (functions, complexity, nesting, dead code, type safety). Falls back to a scope-tracking structural parser when WASM grammars are unavailable
|
|
388
388
|
|
|
389
389
|
The Code Structure judge (`STRUCT-*`) uses these parsers to accurately measure:
|
|
390
390
|
|
|
@@ -811,7 +811,8 @@ judges/
|
|
|
811
811
|
│ │ ├── index.ts # analyzeStructure() — routes to correct parser
|
|
812
812
|
│ │ ├── types.ts # FunctionInfo, CodeStructure interfaces
|
|
813
813
|
│ │ ├── typescript-ast.ts # TypeScript Compiler API parser (JS/TS)
|
|
814
|
-
│ │
|
|
814
|
+
│ │ ├── tree-sitter-ast.ts # Tree-sitter WASM parser (Python/Rust/Go/Java/C#)
|
|
815
|
+
│ │ └── structural-parser.ts # Fallback scope-tracking parser
|
|
815
816
|
│ ├── evaluators/ # Analysis engine for each judge
|
|
816
817
|
│ │ ├── index.ts # evaluateWithJudge(), evaluateWithTribunal(), evaluateProject(), etc.
|
|
817
818
|
│ │ ├── shared.ts # Scoring, verdict logic, markdown formatters
|
|
@@ -829,6 +830,12 @@ judges/
|
|
|
829
830
|
│ └── demo.ts # Run: npm run demo
|
|
830
831
|
├── tests/
|
|
831
832
|
│ └── judges.test.ts # Run: npm test
|
|
833
|
+
├── grammars/ # Tree-sitter WASM grammar files
|
|
834
|
+
│ ├── tree-sitter-python.wasm
|
|
835
|
+
│ ├── tree-sitter-go.wasm
|
|
836
|
+
│ ├── tree-sitter-rust.wasm
|
|
837
|
+
│ ├── tree-sitter-java.wasm
|
|
838
|
+
│ └── tree-sitter-c_sharp.wasm
|
|
832
839
|
├── server.json # MCP Registry manifest
|
|
833
840
|
├── package.json
|
|
834
841
|
├── tsconfig.json
|
package/dist/ast/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CodeStructure, FunctionInfo } from "./types.js";
|
|
2
2
|
export type { CodeStructure, FunctionInfo };
|
|
3
|
+
export { isTreeSitterAvailable, isTreeSitterReadySync } from "./tree-sitter-ast.js";
|
|
3
4
|
export { analyzeTaintFlows } from "./taint-tracker.js";
|
|
4
5
|
export type { TaintFlow, TaintSourceKind, TaintSinkKind } from "./taint-tracker.js";
|
|
5
6
|
export { analyzeCrossFileTaint } from "./cross-file-taint.js";
|
|
@@ -7,10 +8,20 @@ export type { CrossFileTaintFlow } from "./cross-file-taint.js";
|
|
|
7
8
|
/**
|
|
8
9
|
* Analyse source code structurally. For JavaScript/TypeScript this uses the
|
|
9
10
|
* TypeScript compiler API (full AST). For Python, Rust, Go, Java, and C# it
|
|
10
|
-
* uses
|
|
11
|
+
* uses tree-sitter (real AST via WASM) when available, falling back to the
|
|
12
|
+
* lightweight scope-tracking parser.
|
|
11
13
|
*
|
|
12
14
|
* Returns function metrics (complexity, nesting, length, params), dead code
|
|
13
15
|
* locations, deep-nesting locations, and type-safety issues.
|
|
14
16
|
*/
|
|
15
17
|
export declare function analyzeStructure(code: string, language: string): CodeStructure;
|
|
18
|
+
/**
|
|
19
|
+
* Async version of analyzeStructure that uses tree-sitter (real AST) for
|
|
20
|
+
* Python, Rust, Go, Java, and C# when WASM grammars are available.
|
|
21
|
+
* Falls back to the structural parser if tree-sitter is not available.
|
|
22
|
+
*
|
|
23
|
+
* Prefer this over analyzeStructure() for Tier 2 languages — it provides
|
|
24
|
+
* the same depth of analysis that the TS Compiler API gives JS/TS.
|
|
25
|
+
*/
|
|
26
|
+
export declare function analyzeStructureAsync(code: string, language: string): Promise<CodeStructure>;
|
|
16
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/ast/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ast/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ast/index.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AAG5C,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAahE;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAuC9E;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAsClG"}
|
package/dist/ast/index.js
CHANGED
|
@@ -1,20 +1,33 @@
|
|
|
1
1
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
2
|
// AST Analysis — Unified Entry Point
|
|
3
3
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
-
// Routes to the TypeScript compiler-based parser for JS/TS
|
|
5
|
-
//
|
|
4
|
+
// Routes to the TypeScript compiler-based parser for JS/TS, the tree-sitter
|
|
5
|
+
// real-AST parser for Python, Rust, Go, Java, and C# (when WASM grammars are
|
|
6
|
+
// available), or the lightweight structural parser as a fallback.
|
|
6
7
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
7
8
|
import { normalizeLanguage } from "../language-patterns.js";
|
|
8
9
|
import { analyzeTypeScript } from "./typescript-ast.js";
|
|
9
10
|
import { analyzeStructurally } from "./structural-parser.js";
|
|
11
|
+
import { isTreeSitterAvailable, isTreeSitterReadySync, analyzeWithTreeSitter, analyzeWithTreeSitterSync, } from "./tree-sitter-ast.js";
|
|
12
|
+
// Re-export tree-sitter availability checks
|
|
13
|
+
export { isTreeSitterAvailable, isTreeSitterReadySync } from "./tree-sitter-ast.js";
|
|
10
14
|
// Re-export taint analysis
|
|
11
15
|
export { analyzeTaintFlows } from "./taint-tracker.js";
|
|
12
16
|
// Re-export cross-file taint analysis
|
|
13
17
|
export { analyzeCrossFileTaint } from "./cross-file-taint.js";
|
|
18
|
+
// ─── Tree-sitter Warm-up ────────────────────────────────────────────────────
|
|
19
|
+
// Pre-initialize tree-sitter on module load so it's ready when needed.
|
|
20
|
+
// This is fire-and-forget; if it fails, analyzeStructure falls back silently.
|
|
21
|
+
const TREE_SITTER_LANGS = ["python", "rust", "go", "java", "csharp"];
|
|
22
|
+
const treeSitterReady = new Map();
|
|
23
|
+
for (const lang of TREE_SITTER_LANGS) {
|
|
24
|
+
treeSitterReady.set(lang, isTreeSitterAvailable(lang));
|
|
25
|
+
}
|
|
14
26
|
/**
|
|
15
27
|
* Analyse source code structurally. For JavaScript/TypeScript this uses the
|
|
16
28
|
* TypeScript compiler API (full AST). For Python, Rust, Go, Java, and C# it
|
|
17
|
-
* uses
|
|
29
|
+
* uses tree-sitter (real AST via WASM) when available, falling back to the
|
|
30
|
+
* lightweight scope-tracking parser.
|
|
18
31
|
*
|
|
19
32
|
* Returns function metrics (complexity, nesting, length, params), dead code
|
|
20
33
|
* locations, deep-nesting locations, and type-safety issues.
|
|
@@ -30,6 +43,17 @@ export function analyzeStructure(code, language) {
|
|
|
30
43
|
case "go":
|
|
31
44
|
case "java":
|
|
32
45
|
case "csharp":
|
|
46
|
+
// Use tree-sitter (real AST) if WASM runtime + grammar already loaded,
|
|
47
|
+
// otherwise fall back to the lightweight structural parser.
|
|
48
|
+
// parser.parse() is synchronous in web-tree-sitter once initialized.
|
|
49
|
+
if (isTreeSitterReadySync(lang)) {
|
|
50
|
+
try {
|
|
51
|
+
return analyzeWithTreeSitterSync(code, lang);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Tree-sitter failed at runtime — fall back silently
|
|
55
|
+
}
|
|
56
|
+
}
|
|
33
57
|
return analyzeStructurally(code, lang);
|
|
34
58
|
default:
|
|
35
59
|
// Unknown language — return a minimal structure
|
|
@@ -46,4 +70,49 @@ export function analyzeStructure(code, language) {
|
|
|
46
70
|
};
|
|
47
71
|
}
|
|
48
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Async version of analyzeStructure that uses tree-sitter (real AST) for
|
|
75
|
+
* Python, Rust, Go, Java, and C# when WASM grammars are available.
|
|
76
|
+
* Falls back to the structural parser if tree-sitter is not available.
|
|
77
|
+
*
|
|
78
|
+
* Prefer this over analyzeStructure() for Tier 2 languages — it provides
|
|
79
|
+
* the same depth of analysis that the TS Compiler API gives JS/TS.
|
|
80
|
+
*/
|
|
81
|
+
export async function analyzeStructureAsync(code, language) {
|
|
82
|
+
const lang = normalizeLanguage(language);
|
|
83
|
+
switch (lang) {
|
|
84
|
+
case "javascript":
|
|
85
|
+
case "typescript":
|
|
86
|
+
return analyzeTypeScript(code, lang);
|
|
87
|
+
case "python":
|
|
88
|
+
case "rust":
|
|
89
|
+
case "go":
|
|
90
|
+
case "java":
|
|
91
|
+
case "csharp": {
|
|
92
|
+
// Try tree-sitter first (real AST), fall back to structural parser
|
|
93
|
+
const available = await (treeSitterReady.get(lang) ?? Promise.resolve(false));
|
|
94
|
+
if (available) {
|
|
95
|
+
try {
|
|
96
|
+
return await analyzeWithTreeSitter(code, lang);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Tree-sitter failed at runtime — fall back silently
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return analyzeStructurally(code, lang);
|
|
103
|
+
}
|
|
104
|
+
default:
|
|
105
|
+
return {
|
|
106
|
+
language: lang,
|
|
107
|
+
totalLines: code.split("\n").length,
|
|
108
|
+
functions: [],
|
|
109
|
+
fileCyclomaticComplexity: 1,
|
|
110
|
+
maxNestingDepth: 0,
|
|
111
|
+
deadCodeLines: [],
|
|
112
|
+
deepNestLines: [],
|
|
113
|
+
typeAnyLines: [],
|
|
114
|
+
imports: [],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
49
118
|
//# sourceMappingURL=index.js.map
|
package/dist/ast/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ast/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,qCAAqC;AACrC,gFAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ast/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { CodeStructure } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Check whether tree-sitter analysis is available for a given language.
|
|
4
|
+
* Must be called (and awaited) before analyzeWithTreeSitter.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isTreeSitterAvailable(lang: string): Promise<boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Synchronous readiness check — returns true only if tree-sitter's WASM
|
|
9
|
+
* runtime AND the grammar for `lang` have already been loaded into memory.
|
|
10
|
+
* This is safe to call from synchronous code paths; if the async init
|
|
11
|
+
* hasn't finished yet, it simply returns false and the caller falls back
|
|
12
|
+
* to the structural parser.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isTreeSitterReadySync(lang: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Synchronous tree-sitter analysis. Can ONLY be called when
|
|
17
|
+
* isTreeSitterReadySync(lang) returns true (i.e. parser module and grammar
|
|
18
|
+
* are already loaded). parser.parse() is synchronous in web-tree-sitter
|
|
19
|
+
* once the WASM runtime and grammar are in memory.
|
|
20
|
+
*
|
|
21
|
+
* Returns the same CodeStructure interface as analyzeWithTreeSitter.
|
|
22
|
+
* Throws if preconditions are not met.
|
|
23
|
+
*/
|
|
24
|
+
export declare function analyzeWithTreeSitterSync(code: string, language: string): CodeStructure;
|
|
25
|
+
/**
|
|
26
|
+
* Analyse source code using tree-sitter's real syntax tree.
|
|
27
|
+
* Returns the same CodeStructure interface as the TypeScript and
|
|
28
|
+
* structural parsers — but with much higher precision for non-JS/TS languages.
|
|
29
|
+
*
|
|
30
|
+
* IMPORTANT: Call isTreeSitterAvailable(lang) first. If it returns false,
|
|
31
|
+
* fall back to analyzeStructurally().
|
|
32
|
+
*/
|
|
33
|
+
export declare function analyzeWithTreeSitter(code: string, language: string): Promise<CodeStructure>;
|
|
34
|
+
//# sourceMappingURL=tree-sitter-ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-sitter-ast.d.ts","sourceRoot":"","sources":["../../src/ast/tree-sitter-ast.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAC;AAkG9D;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAK1E;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAKvF;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAKlG"}
|
|
@@ -0,0 +1,747 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// Tree-sitter AST — Real syntax-tree analysis for Python, Go, Rust, Java, C#
|
|
3
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
// Uses web-tree-sitter (WASM-based, zero native deps) to parse source code
|
|
5
|
+
// into a full syntax tree, then walks the tree to extract function metrics,
|
|
6
|
+
// dead code, deep nesting, type-safety issues, and imports.
|
|
7
|
+
//
|
|
8
|
+
// This replaces the lightweight structural parser for Tier 2 languages,
|
|
9
|
+
// elevating them from regex-based heuristics to real AST analysis — the
|
|
10
|
+
// same depth the TypeScript Compiler API provides for JS/TS.
|
|
11
|
+
//
|
|
12
|
+
// Graceful degradation: if tree-sitter WASM grammars aren't available at
|
|
13
|
+
// runtime, the caller can fall back to the structural parser.
|
|
14
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
15
|
+
import { createRequire } from "node:module";
|
|
16
|
+
import { fileURLToPath } from "node:url";
|
|
17
|
+
import { dirname, join } from "node:path";
|
|
18
|
+
const require = createRequire(import.meta.url);
|
|
19
|
+
// ─── Lazy Initialization ────────────────────────────────────────────────────
|
|
20
|
+
let initPromise = null;
|
|
21
|
+
let parserModule = null;
|
|
22
|
+
// Grammar file name mapping
|
|
23
|
+
const GRAMMAR_FILES = {
|
|
24
|
+
python: "tree-sitter-python.wasm",
|
|
25
|
+
go: "tree-sitter-go.wasm",
|
|
26
|
+
rust: "tree-sitter-rust.wasm",
|
|
27
|
+
java: "tree-sitter-java.wasm",
|
|
28
|
+
csharp: "tree-sitter-c_sharp.wasm",
|
|
29
|
+
};
|
|
30
|
+
// Cached language instances
|
|
31
|
+
const languageCache = new Map();
|
|
32
|
+
// Resolve grammar directory relative to this module
|
|
33
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
34
|
+
// In development: src/ast/ → ../../grammars/
|
|
35
|
+
// In dist: dist/ast/ → ../../grammars/
|
|
36
|
+
const GRAMMAR_DIR = join(__dirname, "..", "..", "grammars");
|
|
37
|
+
async function ensureInit() {
|
|
38
|
+
if (initPromise)
|
|
39
|
+
return initPromise;
|
|
40
|
+
initPromise = (async () => {
|
|
41
|
+
try {
|
|
42
|
+
const mod = require("web-tree-sitter");
|
|
43
|
+
await mod.Parser.init();
|
|
44
|
+
parserModule = mod;
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
})();
|
|
51
|
+
return initPromise;
|
|
52
|
+
}
|
|
53
|
+
async function getLanguage(lang) {
|
|
54
|
+
if (languageCache.has(lang))
|
|
55
|
+
return languageCache.get(lang);
|
|
56
|
+
const file = GRAMMAR_FILES[lang];
|
|
57
|
+
if (!file)
|
|
58
|
+
return null;
|
|
59
|
+
try {
|
|
60
|
+
const grammar = await parserModule.Language.load(join(GRAMMAR_DIR, file));
|
|
61
|
+
languageCache.set(lang, grammar);
|
|
62
|
+
return grammar;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
69
|
+
/**
|
|
70
|
+
* Check whether tree-sitter analysis is available for a given language.
|
|
71
|
+
* Must be called (and awaited) before analyzeWithTreeSitter.
|
|
72
|
+
*/
|
|
73
|
+
export async function isTreeSitterAvailable(lang) {
|
|
74
|
+
const ready = await ensureInit();
|
|
75
|
+
if (!ready)
|
|
76
|
+
return false;
|
|
77
|
+
const grammar = await getLanguage(lang);
|
|
78
|
+
return grammar !== null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Synchronous readiness check — returns true only if tree-sitter's WASM
|
|
82
|
+
* runtime AND the grammar for `lang` have already been loaded into memory.
|
|
83
|
+
* This is safe to call from synchronous code paths; if the async init
|
|
84
|
+
* hasn't finished yet, it simply returns false and the caller falls back
|
|
85
|
+
* to the structural parser.
|
|
86
|
+
*/
|
|
87
|
+
export function isTreeSitterReadySync(lang) {
|
|
88
|
+
return parserModule !== null && languageCache.has(lang);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Synchronous tree-sitter analysis. Can ONLY be called when
|
|
92
|
+
* isTreeSitterReadySync(lang) returns true (i.e. parser module and grammar
|
|
93
|
+
* are already loaded). parser.parse() is synchronous in web-tree-sitter
|
|
94
|
+
* once the WASM runtime and grammar are in memory.
|
|
95
|
+
*
|
|
96
|
+
* Returns the same CodeStructure interface as analyzeWithTreeSitter.
|
|
97
|
+
* Throws if preconditions are not met.
|
|
98
|
+
*/
|
|
99
|
+
export function analyzeWithTreeSitterSync(code, language) {
|
|
100
|
+
if (!parserModule)
|
|
101
|
+
throw new Error("Tree-sitter not initialized");
|
|
102
|
+
const grammar = languageCache.get(language);
|
|
103
|
+
if (!grammar)
|
|
104
|
+
throw new Error(`Tree-sitter grammar for ${language} not loaded`);
|
|
105
|
+
return parseAndAnalyze(code, language, grammar);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Analyse source code using tree-sitter's real syntax tree.
|
|
109
|
+
* Returns the same CodeStructure interface as the TypeScript and
|
|
110
|
+
* structural parsers — but with much higher precision for non-JS/TS languages.
|
|
111
|
+
*
|
|
112
|
+
* IMPORTANT: Call isTreeSitterAvailable(lang) first. If it returns false,
|
|
113
|
+
* fall back to analyzeStructurally().
|
|
114
|
+
*/
|
|
115
|
+
export async function analyzeWithTreeSitter(code, language) {
|
|
116
|
+
if (!parserModule)
|
|
117
|
+
throw new Error("Tree-sitter not initialized");
|
|
118
|
+
const grammar = await getLanguage(language);
|
|
119
|
+
if (!grammar)
|
|
120
|
+
throw new Error(`Tree-sitter grammar for ${language} not available`);
|
|
121
|
+
return parseAndAnalyze(code, language, grammar);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Shared parsing + analysis logic used by both sync and async entry points.
|
|
125
|
+
*/
|
|
126
|
+
function parseAndAnalyze(code, language, grammar) {
|
|
127
|
+
const parser = new parserModule.Parser();
|
|
128
|
+
parser.setLanguage(grammar);
|
|
129
|
+
const tree = parser.parse(code);
|
|
130
|
+
const root = tree.rootNode;
|
|
131
|
+
const lines = code.split("\n");
|
|
132
|
+
// Extract all analysis data from the tree
|
|
133
|
+
const functions = extractFunctions(root, language);
|
|
134
|
+
const deadCodeLines = detectDeadCode(root, language);
|
|
135
|
+
const deepNestLines = detectDeepNesting(root, language);
|
|
136
|
+
const typeAnyLines = detectWeakTypes(root, language);
|
|
137
|
+
const imports = extractImports(root, language);
|
|
138
|
+
const classes = extractClasses(root, language);
|
|
139
|
+
// Compute file-level metrics
|
|
140
|
+
const fileCyclomaticComplexity = functions.reduce((sum, f) => sum + f.cyclomaticComplexity, 0) || 1;
|
|
141
|
+
const maxNestingDepth = functions.reduce((max, f) => Math.max(max, f.maxNestingDepth), 0);
|
|
142
|
+
return {
|
|
143
|
+
language,
|
|
144
|
+
totalLines: lines.length,
|
|
145
|
+
functions,
|
|
146
|
+
fileCyclomaticComplexity,
|
|
147
|
+
maxNestingDepth,
|
|
148
|
+
deadCodeLines,
|
|
149
|
+
deepNestLines,
|
|
150
|
+
typeAnyLines,
|
|
151
|
+
imports,
|
|
152
|
+
classes: classes.length > 0 ? classes : undefined,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// ─── Function Extraction ────────────────────────────────────────────────────
|
|
156
|
+
/** Node types that represent function/method definitions per language */
|
|
157
|
+
const FUNCTION_NODE_TYPES = {
|
|
158
|
+
python: ["function_definition"],
|
|
159
|
+
go: ["function_declaration", "method_declaration"],
|
|
160
|
+
rust: ["function_item"],
|
|
161
|
+
java: ["method_declaration", "constructor_declaration"],
|
|
162
|
+
csharp: ["method_declaration", "constructor_declaration", "local_function_statement"],
|
|
163
|
+
};
|
|
164
|
+
function extractFunctions(root, language) {
|
|
165
|
+
const funcTypes = FUNCTION_NODE_TYPES[language] || [];
|
|
166
|
+
const functions = [];
|
|
167
|
+
const classRanges = extractClassRanges(root, language);
|
|
168
|
+
walkTree(root, (node) => {
|
|
169
|
+
if (funcTypes.includes(node.type)) {
|
|
170
|
+
const info = analyzeFunctionNode(node, language, classRanges);
|
|
171
|
+
if (info)
|
|
172
|
+
functions.push(info);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
return functions;
|
|
176
|
+
}
|
|
177
|
+
function extractClassRanges(root, language) {
|
|
178
|
+
const classTypes = CLASS_NODE_TYPES[language] || [];
|
|
179
|
+
const ranges = [];
|
|
180
|
+
walkTree(root, (node) => {
|
|
181
|
+
if (classTypes.includes(node.type)) {
|
|
182
|
+
const nameNode = node.childForFieldName("name");
|
|
183
|
+
if (nameNode) {
|
|
184
|
+
ranges.push({
|
|
185
|
+
name: nameNode.text,
|
|
186
|
+
startLine: node.startPosition.row + 1,
|
|
187
|
+
endLine: node.endPosition.row + 1,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
return ranges;
|
|
193
|
+
}
|
|
194
|
+
function analyzeFunctionNode(node, language, classRanges) {
|
|
195
|
+
// Get function name
|
|
196
|
+
const nameNode = node.childForFieldName("name");
|
|
197
|
+
let name = nameNode?.text || "<anonymous>";
|
|
198
|
+
// For Go method_declaration, extract receiver type
|
|
199
|
+
if (language === "go" && node.type === "method_declaration") {
|
|
200
|
+
const receiver = node.childForFieldName("receiver");
|
|
201
|
+
if (receiver) {
|
|
202
|
+
// Extract the type from the receiver parameter list
|
|
203
|
+
const typeNode = findFirstByType(receiver, "type_identifier");
|
|
204
|
+
if (typeNode) {
|
|
205
|
+
name = `${typeNode.text}.${name}`;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Check if function is inside a class
|
|
210
|
+
const startLine = node.startPosition.row + 1;
|
|
211
|
+
const endLine = node.endPosition.row + 1;
|
|
212
|
+
const containingClass = classRanges.find((c) => startLine >= c.startLine && endLine <= c.endLine);
|
|
213
|
+
if (containingClass && language !== "go") {
|
|
214
|
+
name = `${containingClass.name}.${name}`;
|
|
215
|
+
}
|
|
216
|
+
// Count parameters
|
|
217
|
+
const paramCount = countParameters(node, language);
|
|
218
|
+
// Compute cyclomatic complexity
|
|
219
|
+
const complexity = computeCyclomaticComplexity(node, language);
|
|
220
|
+
// Compute max nesting depth
|
|
221
|
+
const maxNesting = computeMaxNesting(node, language, 0);
|
|
222
|
+
// Check for decorators (Python, Java, C#)
|
|
223
|
+
const decorators = extractDecorators(node, language);
|
|
224
|
+
// Check for async
|
|
225
|
+
const isAsync = checkIsAsync(node, language);
|
|
226
|
+
const info = {
|
|
227
|
+
name,
|
|
228
|
+
startLine,
|
|
229
|
+
endLine,
|
|
230
|
+
lineCount: endLine - startLine + 1,
|
|
231
|
+
parameterCount: paramCount,
|
|
232
|
+
cyclomaticComplexity: complexity,
|
|
233
|
+
maxNestingDepth: maxNesting,
|
|
234
|
+
};
|
|
235
|
+
if (decorators.length > 0)
|
|
236
|
+
info.decorators = decorators;
|
|
237
|
+
if (containingClass)
|
|
238
|
+
info.className = containingClass.name;
|
|
239
|
+
if (isAsync)
|
|
240
|
+
info.isAsync = true;
|
|
241
|
+
return info;
|
|
242
|
+
}
|
|
243
|
+
// ─── Parameter Counting ─────────────────────────────────────────────────────
|
|
244
|
+
function countParameters(funcNode, language) {
|
|
245
|
+
let paramsNode = null;
|
|
246
|
+
switch (language) {
|
|
247
|
+
case "python":
|
|
248
|
+
paramsNode = funcNode.childForFieldName("parameters");
|
|
249
|
+
if (!paramsNode)
|
|
250
|
+
return 0;
|
|
251
|
+
// Count identifier children, excluding 'self' and 'cls'
|
|
252
|
+
return paramsNode.namedChildren.filter((c) => {
|
|
253
|
+
if (c.type === "identifier" && (c.text === "self" || c.text === "cls"))
|
|
254
|
+
return false;
|
|
255
|
+
// Also handle typed_parameter, typed_default_parameter, etc.
|
|
256
|
+
if (c.type === "identifier" ||
|
|
257
|
+
c.type === "default_parameter" ||
|
|
258
|
+
c.type === "typed_parameter" ||
|
|
259
|
+
c.type === "typed_default_parameter" ||
|
|
260
|
+
c.type === "list_splat_pattern" ||
|
|
261
|
+
c.type === "dictionary_splat_pattern") {
|
|
262
|
+
// For typed_parameter, check if it's self/cls
|
|
263
|
+
if (c.type === "typed_parameter") {
|
|
264
|
+
const nameChild = c.namedChildren[0];
|
|
265
|
+
if (nameChild && (nameChild.text === "self" || nameChild.text === "cls"))
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
return false;
|
|
271
|
+
}).length;
|
|
272
|
+
case "go":
|
|
273
|
+
paramsNode = funcNode.childForFieldName("parameters");
|
|
274
|
+
if (!paramsNode)
|
|
275
|
+
return 0;
|
|
276
|
+
return paramsNode.namedChildren.filter((c) => c.type === "parameter_declaration").length;
|
|
277
|
+
case "rust":
|
|
278
|
+
paramsNode = funcNode.childForFieldName("parameters");
|
|
279
|
+
if (!paramsNode)
|
|
280
|
+
return 0;
|
|
281
|
+
return paramsNode.namedChildren.filter((c) => c.type === "parameter" || c.type === "self_parameter").length;
|
|
282
|
+
case "java":
|
|
283
|
+
paramsNode = funcNode.childForFieldName("parameters");
|
|
284
|
+
if (!paramsNode)
|
|
285
|
+
return 0;
|
|
286
|
+
return paramsNode.namedChildren.filter((c) => c.type === "formal_parameter" || c.type === "spread_parameter")
|
|
287
|
+
.length;
|
|
288
|
+
case "csharp":
|
|
289
|
+
paramsNode = funcNode.childForFieldName("parameters");
|
|
290
|
+
if (!paramsNode)
|
|
291
|
+
return 0;
|
|
292
|
+
return paramsNode.namedChildren.filter((c) => c.type === "parameter").length;
|
|
293
|
+
default:
|
|
294
|
+
return 0;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// ─── Cyclomatic Complexity ──────────────────────────────────────────────────
|
|
298
|
+
// CC = 1 + number of decision points
|
|
299
|
+
const DECISION_NODE_TYPES = {
|
|
300
|
+
python: new Set([
|
|
301
|
+
"if_statement",
|
|
302
|
+
"elif_clause",
|
|
303
|
+
"for_statement",
|
|
304
|
+
"while_statement",
|
|
305
|
+
"except_clause",
|
|
306
|
+
"conditional_expression",
|
|
307
|
+
"for_in_clause",
|
|
308
|
+
// Boolean operators — each 'and'/'or' is a decision point
|
|
309
|
+
"boolean_operator",
|
|
310
|
+
]),
|
|
311
|
+
go: new Set(["if_statement", "for_statement", "expression_case", "default_case", "type_case", "communication_case"]),
|
|
312
|
+
rust: new Set(["if_expression", "for_expression", "while_expression", "loop_expression", "match_arm"]),
|
|
313
|
+
java: new Set([
|
|
314
|
+
"if_statement",
|
|
315
|
+
"for_statement",
|
|
316
|
+
"enhanced_for_statement",
|
|
317
|
+
"while_statement",
|
|
318
|
+
"do_statement",
|
|
319
|
+
"catch_clause",
|
|
320
|
+
"switch_block_statement_group",
|
|
321
|
+
"ternary_expression",
|
|
322
|
+
]),
|
|
323
|
+
csharp: new Set([
|
|
324
|
+
"if_statement",
|
|
325
|
+
"for_statement",
|
|
326
|
+
"for_each_statement",
|
|
327
|
+
"while_statement",
|
|
328
|
+
"do_statement",
|
|
329
|
+
"catch_clause",
|
|
330
|
+
"switch_section",
|
|
331
|
+
"conditional_expression",
|
|
332
|
+
]),
|
|
333
|
+
};
|
|
334
|
+
// Binary operators that add to complexity (&&, ||)
|
|
335
|
+
const LOGICAL_OPS = new Set(["&&", "||", "and", "or"]);
|
|
336
|
+
function computeCyclomaticComplexity(funcNode, language) {
|
|
337
|
+
let complexity = 1; // base path
|
|
338
|
+
const decisionTypes = DECISION_NODE_TYPES[language] || new Set();
|
|
339
|
+
walkTree(funcNode, (node) => {
|
|
340
|
+
if (decisionTypes.has(node.type)) {
|
|
341
|
+
complexity++;
|
|
342
|
+
}
|
|
343
|
+
// Check binary expressions for logical operators (&&, ||)
|
|
344
|
+
if (node.type === "binary_expression") {
|
|
345
|
+
const op = node.children.find((c) => c.type === "&&" || c.type === "||" || c.text === "&&" || c.text === "||");
|
|
346
|
+
if (op)
|
|
347
|
+
complexity++;
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
return complexity;
|
|
351
|
+
}
|
|
352
|
+
// ─── Nesting Depth ──────────────────────────────────────────────────────────
|
|
353
|
+
const NESTING_NODE_TYPES = {
|
|
354
|
+
python: new Set([
|
|
355
|
+
"if_statement",
|
|
356
|
+
"for_statement",
|
|
357
|
+
"while_statement",
|
|
358
|
+
"with_statement",
|
|
359
|
+
"try_statement",
|
|
360
|
+
"except_clause",
|
|
361
|
+
"for_in_clause",
|
|
362
|
+
"function_definition",
|
|
363
|
+
"class_definition",
|
|
364
|
+
]),
|
|
365
|
+
go: new Set([
|
|
366
|
+
"if_statement",
|
|
367
|
+
"for_statement",
|
|
368
|
+
"select_statement",
|
|
369
|
+
"type_switch_statement",
|
|
370
|
+
"expression_switch_statement",
|
|
371
|
+
"func_literal",
|
|
372
|
+
]),
|
|
373
|
+
rust: new Set([
|
|
374
|
+
"if_expression",
|
|
375
|
+
"for_expression",
|
|
376
|
+
"while_expression",
|
|
377
|
+
"loop_expression",
|
|
378
|
+
"match_expression",
|
|
379
|
+
"closure_expression",
|
|
380
|
+
]),
|
|
381
|
+
java: new Set([
|
|
382
|
+
"if_statement",
|
|
383
|
+
"for_statement",
|
|
384
|
+
"enhanced_for_statement",
|
|
385
|
+
"while_statement",
|
|
386
|
+
"do_statement",
|
|
387
|
+
"try_statement",
|
|
388
|
+
"switch_expression",
|
|
389
|
+
"lambda_expression",
|
|
390
|
+
]),
|
|
391
|
+
csharp: new Set([
|
|
392
|
+
"if_statement",
|
|
393
|
+
"for_statement",
|
|
394
|
+
"for_each_statement",
|
|
395
|
+
"while_statement",
|
|
396
|
+
"do_statement",
|
|
397
|
+
"try_statement",
|
|
398
|
+
"switch_statement",
|
|
399
|
+
"lambda_expression",
|
|
400
|
+
]),
|
|
401
|
+
};
|
|
402
|
+
function computeMaxNesting(node, language, currentDepth) {
|
|
403
|
+
const nestingTypes = NESTING_NODE_TYPES[language] || new Set();
|
|
404
|
+
let maxDepth = currentDepth;
|
|
405
|
+
for (const child of node.namedChildren) {
|
|
406
|
+
let childDepth = currentDepth;
|
|
407
|
+
if (nestingTypes.has(child.type)) {
|
|
408
|
+
childDepth = currentDepth + 1;
|
|
409
|
+
if (childDepth > maxDepth)
|
|
410
|
+
maxDepth = childDepth;
|
|
411
|
+
}
|
|
412
|
+
const subMax = computeMaxNesting(child, language, childDepth);
|
|
413
|
+
if (subMax > maxDepth)
|
|
414
|
+
maxDepth = subMax;
|
|
415
|
+
}
|
|
416
|
+
return maxDepth;
|
|
417
|
+
}
|
|
418
|
+
// ─── Dead Code Detection ────────────────────────────────────────────────────
|
|
419
|
+
/** Node types that represent terminal statements (control flow never continues past them) */
|
|
420
|
+
const TERMINAL_TYPES = {
|
|
421
|
+
python: new Set(["return_statement", "raise_statement", "break_statement", "continue_statement"]),
|
|
422
|
+
go: new Set(["return_statement", "break_statement", "continue_statement"]),
|
|
423
|
+
rust: new Set(["return_expression", "break_expression", "continue_expression"]),
|
|
424
|
+
java: new Set(["return_statement", "throw_statement", "break_statement", "continue_statement"]),
|
|
425
|
+
csharp: new Set(["return_statement", "throw_statement", "break_statement", "continue_statement"]),
|
|
426
|
+
};
|
|
427
|
+
/** Node types that represent blocks containing sequential statements */
|
|
428
|
+
const BLOCK_TYPES = {
|
|
429
|
+
python: new Set(["block"]),
|
|
430
|
+
go: new Set(["block"]),
|
|
431
|
+
rust: new Set(["block"]),
|
|
432
|
+
java: new Set(["block"]),
|
|
433
|
+
csharp: new Set(["block"]),
|
|
434
|
+
};
|
|
435
|
+
function detectDeadCode(root, language) {
|
|
436
|
+
const deadLines = [];
|
|
437
|
+
const terminalTypes = TERMINAL_TYPES[language] || new Set();
|
|
438
|
+
const blockTypes = BLOCK_TYPES[language] || new Set();
|
|
439
|
+
walkTree(root, (node) => {
|
|
440
|
+
if (!blockTypes.has(node.type))
|
|
441
|
+
return;
|
|
442
|
+
const children = node.namedChildren;
|
|
443
|
+
let foundTerminal = false;
|
|
444
|
+
for (const child of children) {
|
|
445
|
+
if (foundTerminal) {
|
|
446
|
+
// Everything after a terminal statement is dead code
|
|
447
|
+
for (let line = child.startPosition.row + 1; line <= child.endPosition.row + 1; line++) {
|
|
448
|
+
deadLines.push(line);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// Check if this child IS a terminal or CONTAINS a bare terminal
|
|
452
|
+
// (only direct children, not nested in sub-blocks)
|
|
453
|
+
if (terminalTypes.has(child.type)) {
|
|
454
|
+
foundTerminal = true;
|
|
455
|
+
}
|
|
456
|
+
// For expression_statement wrapping a return (Rust)
|
|
457
|
+
if (child.type === "expression_statement") {
|
|
458
|
+
const expr = child.namedChildren[0];
|
|
459
|
+
if (expr && terminalTypes.has(expr.type)) {
|
|
460
|
+
foundTerminal = true;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
return [...new Set(deadLines)].sort((a, b) => a - b);
|
|
466
|
+
}
|
|
467
|
+
// ─── Deep Nesting Detection ─────────────────────────────────────────────────
|
|
468
|
+
function detectDeepNesting(root, language) {
|
|
469
|
+
const deepLines = [];
|
|
470
|
+
const nestingTypes = NESTING_NODE_TYPES[language] || new Set();
|
|
471
|
+
const threshold = 4; // Depth > 4 is "deep"
|
|
472
|
+
function walk(node, depth) {
|
|
473
|
+
for (const child of node.namedChildren) {
|
|
474
|
+
let childDepth = depth;
|
|
475
|
+
if (nestingTypes.has(child.type)) {
|
|
476
|
+
childDepth = depth + 1;
|
|
477
|
+
}
|
|
478
|
+
if (childDepth > threshold) {
|
|
479
|
+
// Mark all lines in this deeply-nested node
|
|
480
|
+
for (let line = child.startPosition.row + 1; line <= child.endPosition.row + 1; line++) {
|
|
481
|
+
deepLines.push(line);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
walk(child, childDepth);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
walk(root, 0);
|
|
488
|
+
return [...new Set(deepLines)].sort((a, b) => a - b);
|
|
489
|
+
}
|
|
490
|
+
// ─── Weak Type Detection ────────────────────────────────────────────────────
|
|
491
|
+
const WEAK_TYPE_PATTERNS = {
|
|
492
|
+
python: (node) => {
|
|
493
|
+
// typing.Any or just Any in type annotations
|
|
494
|
+
if (node.type === "type" || node.type === "annotation") {
|
|
495
|
+
return node.text.includes("Any");
|
|
496
|
+
}
|
|
497
|
+
return false;
|
|
498
|
+
},
|
|
499
|
+
go: (node) => {
|
|
500
|
+
// interface{} or any keyword
|
|
501
|
+
if (node.type === "interface_type") {
|
|
502
|
+
// Empty interface
|
|
503
|
+
return node.namedChildren.length === 0;
|
|
504
|
+
}
|
|
505
|
+
if (node.type === "type_identifier" && node.text === "any")
|
|
506
|
+
return true;
|
|
507
|
+
return false;
|
|
508
|
+
},
|
|
509
|
+
rust: (node) => {
|
|
510
|
+
// unsafe blocks and raw pointer casts
|
|
511
|
+
if (node.type === "unsafe_block")
|
|
512
|
+
return true;
|
|
513
|
+
if (node.type === "type_cast_expression") {
|
|
514
|
+
return node.text.includes("*const") || node.text.includes("*mut");
|
|
515
|
+
}
|
|
516
|
+
return false;
|
|
517
|
+
},
|
|
518
|
+
java: (node) => {
|
|
519
|
+
// Object type, Class<?>
|
|
520
|
+
if (node.type === "type_identifier" && node.text === "Object")
|
|
521
|
+
return true;
|
|
522
|
+
if (node.type === "generic_type" && node.text.includes("Class<?>"))
|
|
523
|
+
return true;
|
|
524
|
+
return false;
|
|
525
|
+
},
|
|
526
|
+
csharp: (node) => {
|
|
527
|
+
// dynamic, object
|
|
528
|
+
if (node.type === "predefined_type" && (node.text === "dynamic" || node.text === "object")) {
|
|
529
|
+
return true;
|
|
530
|
+
}
|
|
531
|
+
if (node.type === "identifier" && node.text === "dynamic")
|
|
532
|
+
return true;
|
|
533
|
+
return false;
|
|
534
|
+
},
|
|
535
|
+
};
|
|
536
|
+
function detectWeakTypes(root, language) {
|
|
537
|
+
const weakLines = [];
|
|
538
|
+
const checker = WEAK_TYPE_PATTERNS[language];
|
|
539
|
+
if (!checker)
|
|
540
|
+
return weakLines;
|
|
541
|
+
walkTree(root, (node) => {
|
|
542
|
+
if (checker(node)) {
|
|
543
|
+
weakLines.push(node.startPosition.row + 1);
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
return [...new Set(weakLines)].sort((a, b) => a - b);
|
|
547
|
+
}
|
|
548
|
+
// ─── Import Extraction ──────────────────────────────────────────────────────
|
|
549
|
+
const IMPORT_NODE_TYPES = {
|
|
550
|
+
python: ["import_statement", "import_from_statement"],
|
|
551
|
+
go: ["import_declaration"],
|
|
552
|
+
rust: ["use_declaration"],
|
|
553
|
+
java: ["import_declaration"],
|
|
554
|
+
csharp: ["using_directive"],
|
|
555
|
+
};
|
|
556
|
+
function extractImports(root, language) {
|
|
557
|
+
const imports = [];
|
|
558
|
+
const importTypes = IMPORT_NODE_TYPES[language] || [];
|
|
559
|
+
walkTree(root, (node) => {
|
|
560
|
+
if (!importTypes.includes(node.type))
|
|
561
|
+
return;
|
|
562
|
+
switch (language) {
|
|
563
|
+
case "python":
|
|
564
|
+
if (node.type === "import_statement") {
|
|
565
|
+
// import os, import os.path
|
|
566
|
+
for (const child of node.namedChildren) {
|
|
567
|
+
if (child.type === "dotted_name" || child.type === "aliased_import") {
|
|
568
|
+
const name = child.type === "aliased_import" ? child.childForFieldName("name")?.text || child.text : child.text;
|
|
569
|
+
if (name)
|
|
570
|
+
imports.push(name);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
else if (node.type === "import_from_statement") {
|
|
575
|
+
// from flask import Flask
|
|
576
|
+
const moduleNode = node.childForFieldName("module_name");
|
|
577
|
+
if (moduleNode)
|
|
578
|
+
imports.push(moduleNode.text);
|
|
579
|
+
}
|
|
580
|
+
break;
|
|
581
|
+
case "go":
|
|
582
|
+
// import "fmt" or import ( "fmt" "net/http" )
|
|
583
|
+
walkTree(node, (child) => {
|
|
584
|
+
if (child.type === "import_spec" || child.type === "interpreted_string_literal") {
|
|
585
|
+
const text = child.text.replace(/"/g, "");
|
|
586
|
+
if (text && text !== "(" && text !== ")")
|
|
587
|
+
imports.push(text);
|
|
588
|
+
}
|
|
589
|
+
});
|
|
590
|
+
break;
|
|
591
|
+
case "rust":
|
|
592
|
+
// use std::io; use crate::module_name;
|
|
593
|
+
{
|
|
594
|
+
const pathNode = node.namedChildren.find((c) => c.type === "scoped_identifier" ||
|
|
595
|
+
c.type === "identifier" ||
|
|
596
|
+
c.type === "use_wildcard" ||
|
|
597
|
+
c.type === "use_list" ||
|
|
598
|
+
c.type === "scoped_use_list");
|
|
599
|
+
if (pathNode) {
|
|
600
|
+
// Extract the root crate/module name
|
|
601
|
+
const fullPath = pathNode.text;
|
|
602
|
+
const rootModule = fullPath.split("::")[0];
|
|
603
|
+
if (rootModule)
|
|
604
|
+
imports.push(rootModule);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
break;
|
|
608
|
+
case "java":
|
|
609
|
+
// import com.example.Foo;
|
|
610
|
+
{
|
|
611
|
+
const nameNode = node.namedChildren.find((c) => c.type === "scoped_identifier" || c.type === "identifier");
|
|
612
|
+
if (nameNode)
|
|
613
|
+
imports.push(nameNode.text);
|
|
614
|
+
}
|
|
615
|
+
break;
|
|
616
|
+
case "csharp":
|
|
617
|
+
// using System.IO;
|
|
618
|
+
{
|
|
619
|
+
const nameNode = node.namedChildren.find((c) => c.type === "qualified_name" || c.type === "identifier");
|
|
620
|
+
if (nameNode)
|
|
621
|
+
imports.push(nameNode.text);
|
|
622
|
+
}
|
|
623
|
+
break;
|
|
624
|
+
}
|
|
625
|
+
});
|
|
626
|
+
return imports;
|
|
627
|
+
}
|
|
628
|
+
// ─── Class Extraction ───────────────────────────────────────────────────────
|
|
629
|
+
const CLASS_NODE_TYPES = {
|
|
630
|
+
python: ["class_definition"],
|
|
631
|
+
go: ["type_declaration"],
|
|
632
|
+
rust: ["struct_item", "enum_item"],
|
|
633
|
+
java: ["class_declaration", "interface_declaration", "enum_declaration"],
|
|
634
|
+
csharp: ["class_declaration", "struct_declaration", "interface_declaration", "enum_declaration"],
|
|
635
|
+
};
|
|
636
|
+
function extractClasses(root, language) {
|
|
637
|
+
const classes = [];
|
|
638
|
+
const classTypes = CLASS_NODE_TYPES[language] || [];
|
|
639
|
+
walkTree(root, (node) => {
|
|
640
|
+
if (!classTypes.includes(node.type))
|
|
641
|
+
return;
|
|
642
|
+
if (language === "go" && node.type === "type_declaration") {
|
|
643
|
+
// Only count struct types: type Foo struct { ... }
|
|
644
|
+
const spec = node.namedChildren.find((c) => c.type === "type_spec");
|
|
645
|
+
if (spec) {
|
|
646
|
+
const typeBody = spec.childForFieldName("type");
|
|
647
|
+
if (typeBody && typeBody.type === "struct_type") {
|
|
648
|
+
const nameNode = spec.childForFieldName("name");
|
|
649
|
+
if (nameNode)
|
|
650
|
+
classes.push(nameNode.text);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
655
|
+
const nameNode = node.childForFieldName("name");
|
|
656
|
+
if (nameNode)
|
|
657
|
+
classes.push(nameNode.text);
|
|
658
|
+
});
|
|
659
|
+
return classes;
|
|
660
|
+
}
|
|
661
|
+
// ─── Decorator / Annotation Extraction ──────────────────────────────────────
|
|
662
|
+
function extractDecorators(funcNode, language) {
|
|
663
|
+
const decorators = [];
|
|
664
|
+
switch (language) {
|
|
665
|
+
case "python": {
|
|
666
|
+
// Decorators are siblings before the function_definition, but in the
|
|
667
|
+
// tree-sitter grammar they're children of a decorated_definition parent.
|
|
668
|
+
const parent = funcNode.parent;
|
|
669
|
+
if (parent && parent.type === "decorated_definition") {
|
|
670
|
+
for (const child of parent.namedChildren) {
|
|
671
|
+
if (child.type === "decorator") {
|
|
672
|
+
// Extract decorator name (without the @)
|
|
673
|
+
const text = child.text.replace(/^@/, "").split("(")[0];
|
|
674
|
+
decorators.push(text);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
break;
|
|
679
|
+
}
|
|
680
|
+
case "java": {
|
|
681
|
+
// Annotations are modifiers before the method
|
|
682
|
+
const modifiers = funcNode.childForFieldName("modifiers") || funcNode.childForFieldName("modifier");
|
|
683
|
+
if (modifiers) {
|
|
684
|
+
for (const child of modifiers.namedChildren) {
|
|
685
|
+
if (child.type === "marker_annotation" || child.type === "annotation") {
|
|
686
|
+
decorators.push(child.text.replace(/^@/, "").split("(")[0]);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
break;
|
|
691
|
+
}
|
|
692
|
+
case "csharp": {
|
|
693
|
+
// Attribute lists before the method
|
|
694
|
+
const parent = funcNode.parent;
|
|
695
|
+
if (parent) {
|
|
696
|
+
for (const child of parent.namedChildren) {
|
|
697
|
+
if (child.type === "attribute_list" && child.endPosition.row < funcNode.startPosition.row) {
|
|
698
|
+
decorators.push(child.text.replace(/[\[\]]/g, "").split("(")[0]);
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
break;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
return decorators;
|
|
706
|
+
}
|
|
707
|
+
// ─── Async Detection ────────────────────────────────────────────────────────
|
|
708
|
+
function checkIsAsync(funcNode, language) {
|
|
709
|
+
switch (language) {
|
|
710
|
+
case "python":
|
|
711
|
+
// In Python tree-sitter, async functions have type "function_definition"
|
|
712
|
+
// but the parent is a "decorated_definition" or the text starts with "async"
|
|
713
|
+
return funcNode.text.trimStart().startsWith("async ");
|
|
714
|
+
case "rust":
|
|
715
|
+
// async fn
|
|
716
|
+
return funcNode.text.trimStart().startsWith("async ");
|
|
717
|
+
case "java":
|
|
718
|
+
case "csharp": {
|
|
719
|
+
// Check modifiers for 'async' keyword
|
|
720
|
+
const modifiers = funcNode.childForFieldName("modifiers");
|
|
721
|
+
if (modifiers) {
|
|
722
|
+
return modifiers.children.some((c) => c.text === "async");
|
|
723
|
+
}
|
|
724
|
+
return false;
|
|
725
|
+
}
|
|
726
|
+
default:
|
|
727
|
+
return false;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
// ─── Tree Walking Helper ────────────────────────────────────────────────────
|
|
731
|
+
function walkTree(node, callback) {
|
|
732
|
+
callback(node);
|
|
733
|
+
for (const child of node.children) {
|
|
734
|
+
walkTree(child, callback);
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
function findFirstByType(node, type) {
|
|
738
|
+
if (node.type === type)
|
|
739
|
+
return node;
|
|
740
|
+
for (const child of node.children) {
|
|
741
|
+
const found = findFirstByType(child, type);
|
|
742
|
+
if (found)
|
|
743
|
+
return found;
|
|
744
|
+
}
|
|
745
|
+
return null;
|
|
746
|
+
}
|
|
747
|
+
//# sourceMappingURL=tree-sitter-ast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-sitter-ast.js","sourceRoot":"","sources":["../../src/ast/tree-sitter-ast.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kevinrabun/judges",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "35 specialized judges that evaluate AI-generated code for security, cost, and quality.",
|
|
5
5
|
"mcpName": "io.github.KevinRabun/judges",
|
|
6
6
|
"type": "module",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"files": [
|
|
30
30
|
"dist",
|
|
31
|
+
"grammars",
|
|
31
32
|
"server.json",
|
|
32
33
|
"README.md",
|
|
33
34
|
"LICENSE"
|
|
@@ -59,7 +60,8 @@
|
|
|
59
60
|
"tribunal",
|
|
60
61
|
"ai-code-review",
|
|
61
62
|
"code-quality",
|
|
62
|
-
"static-analysis"
|
|
63
|
+
"static-analysis",
|
|
64
|
+
"dual-layer-analysis"
|
|
63
65
|
],
|
|
64
66
|
"repository": {
|
|
65
67
|
"type": "git",
|
|
@@ -80,6 +82,7 @@
|
|
|
80
82
|
"dependencies": {
|
|
81
83
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
82
84
|
"typescript": "^5.9.3",
|
|
85
|
+
"web-tree-sitter": "^0.25.10",
|
|
83
86
|
"zod": "^4.3.6"
|
|
84
87
|
},
|
|
85
88
|
"devDependencies": {
|
|
@@ -93,6 +96,12 @@
|
|
|
93
96
|
"husky": "^9.1.7",
|
|
94
97
|
"lint-staged": "^16.2.7",
|
|
95
98
|
"prettier": "^3.8.1",
|
|
99
|
+
"tree-sitter-c-sharp": "^0.23.1",
|
|
100
|
+
"tree-sitter-cli": "^0.25.5",
|
|
101
|
+
"tree-sitter-go": "^0.23.4",
|
|
102
|
+
"tree-sitter-java": "^0.23.5",
|
|
103
|
+
"tree-sitter-python": "^0.23.6",
|
|
104
|
+
"tree-sitter-rust": "^0.23.2",
|
|
96
105
|
"tsx": "^4.19.4"
|
|
97
106
|
},
|
|
98
107
|
"overrides": {
|
package/server.json
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/kevinrabun/judges",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "3.
|
|
10
|
+
"version": "3.2.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "@kevinrabun/judges",
|
|
15
|
-
"version": "3.
|
|
15
|
+
"version": "3.2.0",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
}
|