@kevinrabun/judges 3.79.0 → 3.80.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-autofix-preview.d.ts +5 -0
  6. package/dist/commands/finding-autofix-preview.d.ts.map +1 -0
  7. package/dist/commands/finding-autofix-preview.js +87 -0
  8. package/dist/commands/finding-autofix-preview.js.map +1 -0
  9. package/dist/commands/finding-context-expand.d.ts +5 -0
  10. package/dist/commands/finding-context-expand.d.ts.map +1 -0
  11. package/dist/commands/finding-context-expand.js +103 -0
  12. package/dist/commands/finding-context-expand.js.map +1 -0
  13. package/dist/commands/finding-merge-results.d.ts +5 -0
  14. package/dist/commands/finding-merge-results.d.ts.map +1 -0
  15. package/dist/commands/finding-merge-results.js +111 -0
  16. package/dist/commands/finding-merge-results.js.map +1 -0
  17. package/dist/commands/finding-severity-trend.d.ts +5 -0
  18. package/dist/commands/finding-severity-trend.d.ts.map +1 -0
  19. package/dist/commands/finding-severity-trend.js +128 -0
  20. package/dist/commands/finding-severity-trend.js.map +1 -0
  21. package/dist/commands/review-batch-files.d.ts +5 -0
  22. package/dist/commands/review-batch-files.d.ts.map +1 -0
  23. package/dist/commands/review-batch-files.js +83 -0
  24. package/dist/commands/review-batch-files.js.map +1 -0
  25. package/dist/commands/review-blame-map.d.ts +5 -0
  26. package/dist/commands/review-blame-map.d.ts.map +1 -0
  27. package/dist/commands/review-blame-map.js +101 -0
  28. package/dist/commands/review-blame-map.js.map +1 -0
  29. package/dist/commands/review-config-diff.d.ts +5 -0
  30. package/dist/commands/review-config-diff.d.ts.map +1 -0
  31. package/dist/commands/review-config-diff.js +109 -0
  32. package/dist/commands/review-config-diff.js.map +1 -0
  33. package/dist/commands/review-output-format.d.ts +5 -0
  34. package/dist/commands/review-output-format.d.ts.map +1 -0
  35. package/dist/commands/review-output-format.js +145 -0
  36. package/dist/commands/review-output-format.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Review-blame-map — Map findings to git blame authors for accountability.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ import { execSync } from "child_process";
6
+ // ─── CLI ────────────────────────────────────────────────────────────────────
7
+ export function runReviewBlameMap(argv) {
8
+ if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
9
+ console.log(`
10
+ judges review-blame-map — Map findings to git blame authors
11
+
12
+ Usage:
13
+ judges review-blame-map --file <results.json> --source <path> [options]
14
+
15
+ Options:
16
+ --file <path> Result file (required)
17
+ --source <path> Source file for blame lookup (required)
18
+ --format json JSON output
19
+ --help, -h Show this help
20
+
21
+ Associates findings with the author who wrote the related code via git blame.
22
+ `);
23
+ return;
24
+ }
25
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
26
+ const source = argv.find((_a, i) => argv[i - 1] === "--source");
27
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
28
+ if (!file) {
29
+ console.error("Error: --file required");
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ if (!source) {
34
+ console.error("Error: --source required");
35
+ process.exitCode = 1;
36
+ return;
37
+ }
38
+ if (!existsSync(file)) {
39
+ console.error(`Error: file not found: ${file}`);
40
+ process.exitCode = 1;
41
+ return;
42
+ }
43
+ if (!existsSync(source)) {
44
+ console.error(`Error: source not found: ${source}`);
45
+ process.exitCode = 1;
46
+ return;
47
+ }
48
+ let verdict;
49
+ try {
50
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
51
+ }
52
+ catch {
53
+ console.error("Error: could not parse file");
54
+ process.exitCode = 1;
55
+ return;
56
+ }
57
+ // Parse git blame
58
+ const authorMap = new Map();
59
+ try {
60
+ const blame = execSync(`git blame --porcelain "${source}"`, { encoding: "utf-8" });
61
+ let currentLine = 0;
62
+ for (const line of blame.split("\n")) {
63
+ const lineMatch = /^[0-9a-f]{40}\s+\d+\s+(\d+)/.exec(line);
64
+ if (lineMatch)
65
+ currentLine = parseInt(lineMatch[1], 10);
66
+ if (line.startsWith("author ") && currentLine > 0) {
67
+ authorMap.set(currentLine, line.slice(7));
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ console.error("Warning: could not run git blame on source file");
73
+ }
74
+ const findings = verdict.findings || [];
75
+ const authorFindings = new Map();
76
+ for (const f of findings) {
77
+ const lines = f.lineNumbers || [];
78
+ for (const ln of lines) {
79
+ const author = authorMap.get(ln) || "unknown";
80
+ authorFindings.set(author, (authorFindings.get(author) || 0) + 1);
81
+ }
82
+ }
83
+ const sorted = [...authorFindings.entries()].sort((a, b) => b[1] - a[1]);
84
+ if (format === "json") {
85
+ console.log(JSON.stringify({
86
+ totalFindings: findings.length,
87
+ authors: sorted.map(([author, count]) => ({ author, findingCount: count })),
88
+ }, null, 2));
89
+ return;
90
+ }
91
+ console.log(`\nBlame Map:`);
92
+ console.log("═".repeat(55));
93
+ console.log(` ${findings.length} findings mapped across ${sorted.length} authors`);
94
+ console.log("─".repeat(55));
95
+ for (const [author, count] of sorted) {
96
+ const bar = "█".repeat(Math.min(count, 30));
97
+ console.log(` ${author.padEnd(25)} ${String(count).padStart(4)} ${bar}`);
98
+ }
99
+ console.log("═".repeat(55));
100
+ }
101
+ //# sourceMappingURL=review-blame-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-blame-map.js","sourceRoot":"","sources":["../../src/commands/review-blame-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-config-diff — Diff two review configurations to see what changed.
3
+ */
4
+ export declare function runReviewConfigDiff(argv: string[]): void;
5
+ //# sourceMappingURL=review-config-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-config-diff.d.ts","sourceRoot":"","sources":["../../src/commands/review-config-diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0GxD"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Review-config-diff — Diff two review configurations to see what changed.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewConfigDiff(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
8
+ console.log(`
9
+ judges review-config-diff — Diff two review configurations
10
+
11
+ Usage:
12
+ judges review-config-diff --left <path> --right <path> [options]
13
+
14
+ Options:
15
+ --left <path> First config file (required)
16
+ --right <path> Second config file (required)
17
+ --format json JSON output
18
+ --help, -h Show this help
19
+
20
+ Compares two configuration files and shows added, removed, and changed settings.
21
+ `);
22
+ return;
23
+ }
24
+ const left = argv.find((_a, i) => argv[i - 1] === "--left");
25
+ const right = argv.find((_a, i) => argv[i - 1] === "--right");
26
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
27
+ if (!left || !right) {
28
+ console.error("Error: --left and --right required");
29
+ process.exitCode = 1;
30
+ return;
31
+ }
32
+ if (!existsSync(left)) {
33
+ console.error(`Error: file not found: ${left}`);
34
+ process.exitCode = 1;
35
+ return;
36
+ }
37
+ if (!existsSync(right)) {
38
+ console.error(`Error: file not found: ${right}`);
39
+ process.exitCode = 1;
40
+ return;
41
+ }
42
+ let leftConfig;
43
+ let rightConfig;
44
+ try {
45
+ leftConfig = JSON.parse(readFileSync(left, "utf-8"));
46
+ }
47
+ catch {
48
+ console.error("Error: could not parse left file");
49
+ process.exitCode = 1;
50
+ return;
51
+ }
52
+ try {
53
+ rightConfig = JSON.parse(readFileSync(right, "utf-8"));
54
+ }
55
+ catch {
56
+ console.error("Error: could not parse right file");
57
+ process.exitCode = 1;
58
+ return;
59
+ }
60
+ const allKeys = new Set([...Object.keys(leftConfig), ...Object.keys(rightConfig)]);
61
+ const added = [];
62
+ const removed = [];
63
+ const changed = [];
64
+ const unchanged = [];
65
+ for (const key of allKeys) {
66
+ const inLeft = key in leftConfig;
67
+ const inRight = key in rightConfig;
68
+ if (!inLeft && inRight) {
69
+ added.push(key);
70
+ }
71
+ else if (inLeft && !inRight) {
72
+ removed.push(key);
73
+ }
74
+ else if (JSON.stringify(leftConfig[key]) !== JSON.stringify(rightConfig[key])) {
75
+ changed.push({ key, from: leftConfig[key], to: rightConfig[key] });
76
+ }
77
+ else {
78
+ unchanged.push(key);
79
+ }
80
+ }
81
+ if (format === "json") {
82
+ console.log(JSON.stringify({ added, removed, changed, unchanged: unchanged.length }, null, 2));
83
+ return;
84
+ }
85
+ console.log(`\nConfig Diff:`);
86
+ console.log("═".repeat(65));
87
+ console.log(` Added: ${added.length} Removed: ${removed.length} Changed: ${changed.length} Unchanged: ${unchanged.length}`);
88
+ console.log("─".repeat(65));
89
+ if (added.length > 0) {
90
+ console.log("\n + Added:");
91
+ for (const k of added)
92
+ console.log(` + ${k}: ${JSON.stringify(rightConfig[k])}`);
93
+ }
94
+ if (removed.length > 0) {
95
+ console.log("\n - Removed:");
96
+ for (const k of removed)
97
+ console.log(` - ${k}: ${JSON.stringify(leftConfig[k])}`);
98
+ }
99
+ if (changed.length > 0) {
100
+ console.log("\n ~ Changed:");
101
+ for (const c of changed) {
102
+ console.log(` ~ ${c.key}:`);
103
+ console.log(` from: ${JSON.stringify(c.from)}`);
104
+ console.log(` to: ${JSON.stringify(c.to)}`);
105
+ }
106
+ }
107
+ console.log("\n" + "═".repeat(65));
108
+ }
109
+ //# sourceMappingURL=review-config-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-config-diff.js","sourceRoot":"","sources":["../../src/commands/review-config-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-output-format — Configure and manage output format preferences.
3
+ */
4
+ export declare function runReviewOutputFormat(argv: string[]): void;
5
+ //# sourceMappingURL=review-output-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-output-format.d.ts","sourceRoot":"","sources":["../../src/commands/review-output-format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiDH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqG1D"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Review-output-format — Configure and manage output format preferences.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname, join } from "path";
6
+ // ─── Helpers ────────────────────────────────────────────────────────────────
7
+ function configFile() {
8
+ return join(process.cwd(), ".judges", "output-format.json");
9
+ }
10
+ function loadConfig() {
11
+ const f = configFile();
12
+ const defaults = {
13
+ defaultFormat: "text",
14
+ includeTimestamps: true,
15
+ colorOutput: true,
16
+ maxWidth: 80,
17
+ verbosity: "normal",
18
+ customFormats: {},
19
+ };
20
+ if (!existsSync(f))
21
+ return defaults;
22
+ try {
23
+ return { ...defaults, ...JSON.parse(readFileSync(f, "utf-8")) };
24
+ }
25
+ catch {
26
+ return defaults;
27
+ }
28
+ }
29
+ function saveConfig(config) {
30
+ const f = configFile();
31
+ const d = dirname(f);
32
+ if (!existsSync(d))
33
+ mkdirSync(d, { recursive: true });
34
+ writeFileSync(f, JSON.stringify(config, null, 2));
35
+ }
36
+ // ─── CLI ────────────────────────────────────────────────────────────────────
37
+ export function runReviewOutputFormat(argv) {
38
+ const sub = argv[0];
39
+ if (!sub || sub === "--help" || sub === "-h") {
40
+ console.log(`
41
+ judges review-output-format — Configure output format preferences
42
+
43
+ Usage:
44
+ judges review-output-format show
45
+ judges review-output-format set --key <key> --value <value>
46
+ judges review-output-format add-format --name <name> --template <tmpl> [--description <desc>]
47
+ judges review-output-format remove-format --name <name>
48
+ judges review-output-format reset
49
+
50
+ Options:
51
+ --key <key> Setting key (defaultFormat, includeTimestamps, colorOutput, maxWidth, verbosity)
52
+ --value <value> Setting value
53
+ --name <name> Custom format name
54
+ --template <tmpl> Custom format template string
55
+ --description <desc> Format description
56
+ --help, -h Show this help
57
+ `);
58
+ return;
59
+ }
60
+ const args = argv.slice(1);
61
+ const config = loadConfig();
62
+ if (sub === "show") {
63
+ console.log(`\nOutput Format Configuration:`);
64
+ console.log("═".repeat(50));
65
+ console.log(` Default format: ${config.defaultFormat}`);
66
+ console.log(` Timestamps: ${config.includeTimestamps}`);
67
+ console.log(` Color output: ${config.colorOutput}`);
68
+ console.log(` Max width: ${config.maxWidth}`);
69
+ console.log(` Verbosity: ${config.verbosity}`);
70
+ const fmtCount = Object.keys(config.customFormats).length;
71
+ console.log(` Custom formats: ${fmtCount}`);
72
+ if (fmtCount > 0) {
73
+ for (const [name, fmt] of Object.entries(config.customFormats)) {
74
+ console.log(` - ${name}: ${fmt.description || fmt.template.slice(0, 40)}`);
75
+ }
76
+ }
77
+ console.log("═".repeat(50));
78
+ }
79
+ else if (sub === "set") {
80
+ const key = args.find((_a, i) => args[i - 1] === "--key");
81
+ const value = args.find((_a, i) => args[i - 1] === "--value");
82
+ if (!key || !value) {
83
+ console.error("Error: --key and --value required");
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+ if (key === "defaultFormat")
88
+ config.defaultFormat = value;
89
+ else if (key === "includeTimestamps")
90
+ config.includeTimestamps = value === "true";
91
+ else if (key === "colorOutput")
92
+ config.colorOutput = value === "true";
93
+ else if (key === "maxWidth")
94
+ config.maxWidth = parseInt(value, 10);
95
+ else if (key === "verbosity")
96
+ config.verbosity = value;
97
+ else {
98
+ console.error(`Unknown key: ${key}`);
99
+ process.exitCode = 1;
100
+ return;
101
+ }
102
+ saveConfig(config);
103
+ console.log(`Set ${key} = ${value}`);
104
+ }
105
+ else if (sub === "add-format") {
106
+ const name = args.find((_a, i) => args[i - 1] === "--name");
107
+ const template = args.find((_a, i) => args[i - 1] === "--template");
108
+ if (!name || !template) {
109
+ console.error("Error: --name and --template required");
110
+ process.exitCode = 1;
111
+ return;
112
+ }
113
+ const desc = args.find((_a, i) => args[i - 1] === "--description") || "";
114
+ config.customFormats[name] = { template, description: desc };
115
+ saveConfig(config);
116
+ console.log(`Added custom format: ${name}`);
117
+ }
118
+ else if (sub === "remove-format") {
119
+ const name = args.find((_a, i) => args[i - 1] === "--name");
120
+ if (!name) {
121
+ console.error("Error: --name required");
122
+ process.exitCode = 1;
123
+ return;
124
+ }
125
+ if (!config.customFormats[name]) {
126
+ console.error(`Format "${name}" not found.`);
127
+ process.exitCode = 1;
128
+ return;
129
+ }
130
+ delete config.customFormats[name];
131
+ saveConfig(config);
132
+ console.log(`Removed format: ${name}`);
133
+ }
134
+ else if (sub === "reset") {
135
+ const f = configFile();
136
+ if (existsSync(f))
137
+ writeFileSync(f, "{}");
138
+ console.log("Output format reset to defaults.");
139
+ }
140
+ else {
141
+ console.error(`Unknown subcommand: ${sub}. Use --help for usage.`);
142
+ process.exitCode = 1;
143
+ }
144
+ }
145
+ //# sourceMappingURL=review-output-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-output-format.js","sourceRoot":"","sources":["../../src/commands/review-output-format.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.79.0",
3
+ "version": "3.80.0",
4
4
  "description": "45 specialized judges that evaluate AI-generated code for security, cost, and quality.",
5
5
  "mcpName": "io.github.KevinRabun/judges",
6
6
  "type": "module",
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.79.0",
10
+ "version": "3.80.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.79.0",
15
+ "version": "3.80.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }