@kevinrabun/judges-cli 3.127.1 → 3.127.3
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
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @kevinrabun/judges-cli
|
|
2
2
|
|
|
3
|
-
Standalone CLI package for Judges.
|
|
3
|
+
Standalone CLI package for the [Judges Panel](https://github.com/KevinRabun/judges) — 45 specialized judges that evaluate code for security, quality, compliance, and 40 more dimensions.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -11,14 +11,46 @@ npm install -g @kevinrabun/judges-cli
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
+
# Evaluate code
|
|
14
15
|
judges eval src/app.ts
|
|
16
|
+
judges eval src/ --format sarif --output report.sarif
|
|
17
|
+
judges eval src/app.ts --judge cybersecurity
|
|
18
|
+
judges eval src/app.ts --preset strict --fail-on-findings
|
|
19
|
+
|
|
20
|
+
# List judges and regulatory frameworks
|
|
15
21
|
judges list
|
|
16
|
-
judges
|
|
22
|
+
judges list --frameworks
|
|
23
|
+
|
|
24
|
+
# Auto-fix findings
|
|
25
|
+
judges fix src/app.ts --apply
|
|
17
26
|
|
|
18
27
|
# Agentic skills
|
|
19
28
|
judges skill ai-code-review --file src/app.ts
|
|
20
29
|
judges skill security-review --file src/api.ts --format json
|
|
21
|
-
judges skills
|
|
30
|
+
judges skills
|
|
31
|
+
|
|
32
|
+
# Self-teaching
|
|
33
|
+
judges codify-amendments # bake benchmark amendments into judge files
|
|
34
|
+
judges codify-amendments --dry-run
|
|
22
35
|
```
|
|
23
36
|
|
|
24
|
-
|
|
37
|
+
## Configuration
|
|
38
|
+
|
|
39
|
+
Create a `.judgesrc.json` in your project root:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"preset": "strict",
|
|
44
|
+
"regulatoryScope": ["GDPR", "PCI-DSS"],
|
|
45
|
+
"disabledJudges": ["accessibility"],
|
|
46
|
+
"failOnFindings": true
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
See the [full configuration reference](https://github.com/KevinRabun/judges#configuration) for all options.
|
|
51
|
+
|
|
52
|
+
## Packages
|
|
53
|
+
|
|
54
|
+
- **`@kevinrabun/judges-cli`** — This package. Binary `judges` for CI/CD pipelines.
|
|
55
|
+
- **`@kevinrabun/judges`** — Programmatic API + MCP server.
|
|
56
|
+
- **VS Code extension** — [`kevinrabun.judges-panel`](https://marketplace.visualstudio.com/items?itemName=kevinrabun.judges-panel).
|
|
@@ -153,7 +153,7 @@ export function parseLlmRuleIds(response) {
|
|
|
153
153
|
// IDs mentioned in rationale text or findings tables of "clean" judge sections
|
|
154
154
|
// from being counted as detections.
|
|
155
155
|
const sections = response.split(/(?:^|\n)---\s*\n|(?=^## )/m);
|
|
156
|
-
const zeroFindingsPattern =
|
|
156
|
+
const zeroFindingsPattern = /(?:ZERO|zero|0|no) findings?|findings?[:\s]*(?:none|0|zero)|no (?:issues|findings|problems|concerns) (?:found|detected|identified|reported)|reporting? zero|Score[|: ]*100/i;
|
|
157
157
|
for (const section of sections) {
|
|
158
158
|
// If this section explicitly declares zero/no findings or a perfect score,
|
|
159
159
|
// skip rule ID extraction — any rule IDs are explanatory references
|
package/dist/evaluators/index.js
CHANGED
|
@@ -504,7 +504,7 @@ function synthesizeHumanFocusGuide(findings, code, language) {
|
|
|
504
504
|
});
|
|
505
505
|
}
|
|
506
506
|
// State machines / workflow
|
|
507
|
-
const hasStateMachine = /state\s*[=:]\s*['"][^'"]+['"]|status\s*===?\s*['"]|transition|workflow|step
|
|
507
|
+
const hasStateMachine = /state\s*[=:]\s*['"][^'"]+['"]|status\s*===?\s*['"]|transition|workflow|step[\w\s]{0,20}next/i.test(code);
|
|
508
508
|
if (hasStateMachine) {
|
|
509
509
|
blindSpots.push({
|
|
510
510
|
area: "State Management / Workflow Logic",
|
|
@@ -5,7 +5,10 @@ const SEVERITY_SET = new Set(["critical", "high", "medium", "low", "info"]);
|
|
|
5
5
|
* Attempt to parse a JSON payload embedded in LLM output. Supports fenced code blocks and raw JSON.
|
|
6
6
|
*/
|
|
7
7
|
function parseJsonBlock(text) {
|
|
8
|
-
|
|
8
|
+
// Extract JSON from fenced code blocks — limit search to first 50KB to prevent ReDoS on large input
|
|
9
|
+
const searchText = text.length > 50_000 ? text.slice(0, 50_000) : text;
|
|
10
|
+
const fenceMatch = searchText.match(/```(?:json)?\s*\n([\s\S]{0,20000}?)\n\s*```/i) ??
|
|
11
|
+
searchText.match(/```(?:json)?\s*([\s\S]{0,20000}?)```/i);
|
|
9
12
|
if (fenceMatch) {
|
|
10
13
|
try {
|
|
11
14
|
return JSON.parse(fenceMatch[1]);
|
|
@@ -216,13 +216,9 @@ function compileExcludeRegexes(patterns) {
|
|
|
216
216
|
if (!patterns || patterns.length === 0)
|
|
217
217
|
return [];
|
|
218
218
|
return patterns.map((pattern) => {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
catch {
|
|
223
|
-
// Invalid regex from user input — treat as literal string match
|
|
224
|
-
return new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i");
|
|
225
|
-
}
|
|
219
|
+
// Always escape user input to prevent regex injection, then compile
|
|
220
|
+
const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
221
|
+
return new RegExp(escaped, "i");
|
|
226
222
|
});
|
|
227
223
|
}
|
|
228
224
|
function isLikelyNonProductionPath(path) {
|
package/dist/skill-loader.js
CHANGED