@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 hook install
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 # list available 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
- Use `@kevinrabun/judges` when you need the MCP server or programmatic API.
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 = /\*?\*?(?:ZERO|zero|0|no)\s+findings?\*?\*?|(?:findings?|issues?)[\s:]*\*?\*?(?:none|0|zero)\*?\*?|no\s+(?:issues?|findings?|problems?|concerns?)\s+(?:found|detected|identified|reported)|report(?:ing)?\s+zero|Score\s*[|:]\s*\*?\*?100\s*\/?\s*100\*?\*?/i;
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
@@ -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.*next/i.test(code);
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
- const fenceMatch = text.match(/```(?:json)?[ \t]*\n([\s\S]*?)\n[ \t]*```/i) ?? text.match(/```(?:json)?[ \t]*([\s\S]*?)```/i);
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
- try {
220
- return new RegExp(pattern, "i");
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) {
@@ -25,7 +25,7 @@ export function parseSkillFrontmatter(raw) {
25
25
  i++;
26
26
  continue;
27
27
  }
28
- const kv = line.match(/^([a-zA-Z_][a-zA-Z0-9_-]*)[ \t]*:[ \t]*(.*)$/);
28
+ const kv = line.match(/^([a-zA-Z_][a-zA-Z0-9_-]*)[ \t]*:[ \t]*(.*?)$/s);
29
29
  if (!kv) {
30
30
  i++;
31
31
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges-cli",
3
- "version": "3.127.1",
3
+ "version": "3.127.3",
4
4
  "description": "CLI wrapper for the Judges code review toolkit.",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",