@kevinrabun/judges 3.79.0 → 3.81.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 (74) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +119 -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-cwe-map.d.ts +5 -0
  14. package/dist/commands/finding-cwe-map.d.ts.map +1 -0
  15. package/dist/commands/finding-cwe-map.js +134 -0
  16. package/dist/commands/finding-cwe-map.js.map +1 -0
  17. package/dist/commands/finding-false-neg-check.d.ts +9 -0
  18. package/dist/commands/finding-false-neg-check.d.ts.map +1 -0
  19. package/dist/commands/finding-false-neg-check.js +140 -0
  20. package/dist/commands/finding-false-neg-check.js.map +1 -0
  21. package/dist/commands/finding-merge-results.d.ts +5 -0
  22. package/dist/commands/finding-merge-results.d.ts.map +1 -0
  23. package/dist/commands/finding-merge-results.js +111 -0
  24. package/dist/commands/finding-merge-results.js.map +1 -0
  25. package/dist/commands/finding-pattern-match.d.ts +5 -0
  26. package/dist/commands/finding-pattern-match.d.ts.map +1 -0
  27. package/dist/commands/finding-pattern-match.js +166 -0
  28. package/dist/commands/finding-pattern-match.js.map +1 -0
  29. package/dist/commands/finding-risk-matrix.d.ts +5 -0
  30. package/dist/commands/finding-risk-matrix.d.ts.map +1 -0
  31. package/dist/commands/finding-risk-matrix.js +127 -0
  32. package/dist/commands/finding-risk-matrix.js.map +1 -0
  33. package/dist/commands/finding-severity-trend.d.ts +5 -0
  34. package/dist/commands/finding-severity-trend.d.ts.map +1 -0
  35. package/dist/commands/finding-severity-trend.js +128 -0
  36. package/dist/commands/finding-severity-trend.js.map +1 -0
  37. package/dist/commands/review-batch-files.d.ts +5 -0
  38. package/dist/commands/review-batch-files.d.ts.map +1 -0
  39. package/dist/commands/review-batch-files.js +83 -0
  40. package/dist/commands/review-batch-files.js.map +1 -0
  41. package/dist/commands/review-blame-map.d.ts +5 -0
  42. package/dist/commands/review-blame-map.d.ts.map +1 -0
  43. package/dist/commands/review-blame-map.js +101 -0
  44. package/dist/commands/review-blame-map.js.map +1 -0
  45. package/dist/commands/review-config-diff.d.ts +5 -0
  46. package/dist/commands/review-config-diff.d.ts.map +1 -0
  47. package/dist/commands/review-config-diff.js +109 -0
  48. package/dist/commands/review-config-diff.js.map +1 -0
  49. package/dist/commands/review-dependency-graph.d.ts +5 -0
  50. package/dist/commands/review-dependency-graph.d.ts.map +1 -0
  51. package/dist/commands/review-dependency-graph.js +95 -0
  52. package/dist/commands/review-dependency-graph.js.map +1 -0
  53. package/dist/commands/review-diff-stats.d.ts +5 -0
  54. package/dist/commands/review-diff-stats.d.ts.map +1 -0
  55. package/dist/commands/review-diff-stats.js +91 -0
  56. package/dist/commands/review-diff-stats.js.map +1 -0
  57. package/dist/commands/review-exclude-vendor.d.ts +5 -0
  58. package/dist/commands/review-exclude-vendor.d.ts.map +1 -0
  59. package/dist/commands/review-exclude-vendor.js +159 -0
  60. package/dist/commands/review-exclude-vendor.js.map +1 -0
  61. package/dist/commands/review-file-stats.d.ts +5 -0
  62. package/dist/commands/review-file-stats.d.ts.map +1 -0
  63. package/dist/commands/review-file-stats.js +131 -0
  64. package/dist/commands/review-file-stats.js.map +1 -0
  65. package/dist/commands/review-output-format.d.ts +5 -0
  66. package/dist/commands/review-output-format.d.ts.map +1 -0
  67. package/dist/commands/review-output-format.js +145 -0
  68. package/dist/commands/review-output-format.js.map +1 -0
  69. package/dist/commands/review-rule-filter.d.ts +5 -0
  70. package/dist/commands/review-rule-filter.d.ts.map +1 -0
  71. package/dist/commands/review-rule-filter.js +117 -0
  72. package/dist/commands/review-rule-filter.js.map +1 -0
  73. package/package.json +1 -1
  74. package/server.json +2 -2
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Finding-merge-results — Merge findings from multiple review result files.
3
+ */
4
+ import { readFileSync, existsSync, writeFileSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingMergeResults(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
8
+ console.log(`
9
+ judges finding-merge-results — Merge results from multiple review runs
10
+
11
+ Usage:
12
+ judges finding-merge-results --files <f1,f2,...> [options]
13
+
14
+ Options:
15
+ --files <list> Comma-separated result files (required)
16
+ --output <path> Output file for merged results (optional)
17
+ --dedup Deduplicate findings by ruleId (default: false)
18
+ --format json JSON output
19
+ --help, -h Show this help
20
+
21
+ Merges findings from multiple result files into a single consolidated result.
22
+ `);
23
+ return;
24
+ }
25
+ const filesStr = argv.find((_a, i) => argv[i - 1] === "--files");
26
+ if (!filesStr) {
27
+ console.error("Error: --files required");
28
+ process.exitCode = 1;
29
+ return;
30
+ }
31
+ const files = filesStr
32
+ .split(",")
33
+ .map((f) => f.trim())
34
+ .filter(Boolean);
35
+ const output = argv.find((_a, i) => argv[i - 1] === "--output");
36
+ const dedup = argv.includes("--dedup");
37
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
38
+ const allFindings = [];
39
+ const loadedFiles = [];
40
+ for (const file of files) {
41
+ if (!existsSync(file)) {
42
+ console.error(`Warning: file not found: ${file}`);
43
+ continue;
44
+ }
45
+ try {
46
+ const data = JSON.parse(readFileSync(file, "utf-8"));
47
+ const findings = data.findings || (Array.isArray(data) ? data : []);
48
+ for (const f of findings) {
49
+ allFindings.push({
50
+ ruleId: f.ruleId || "unknown",
51
+ severity: f.severity || "medium",
52
+ title: f.title || "",
53
+ description: f.description || "",
54
+ source: file,
55
+ });
56
+ }
57
+ loadedFiles.push(file);
58
+ }
59
+ catch {
60
+ console.error(`Warning: could not parse: ${file}`);
61
+ }
62
+ }
63
+ let merged = allFindings;
64
+ let duplicatesRemoved = 0;
65
+ if (dedup) {
66
+ const seen = new Set();
67
+ const deduped = [];
68
+ for (const f of merged) {
69
+ const key = `${f.ruleId}:${f.title}`;
70
+ if (!seen.has(key)) {
71
+ seen.add(key);
72
+ deduped.push(f);
73
+ }
74
+ }
75
+ duplicatesRemoved = merged.length - deduped.length;
76
+ merged = deduped;
77
+ }
78
+ // Write output if requested
79
+ if (output) {
80
+ const result = {
81
+ mergedAt: new Date().toISOString(),
82
+ sources: loadedFiles,
83
+ totalFindings: merged.length,
84
+ duplicatesRemoved,
85
+ findings: merged,
86
+ };
87
+ writeFileSync(output, JSON.stringify(result, null, 2));
88
+ console.log(`Merged results written to: ${output}`);
89
+ }
90
+ if (format === "json") {
91
+ console.log(JSON.stringify({ sources: loadedFiles.length, total: allFindings.length, merged: merged.length, duplicatesRemoved }, null, 2));
92
+ return;
93
+ }
94
+ console.log(`\nMerged Results:`);
95
+ console.log("═".repeat(60));
96
+ console.log(` Sources: ${loadedFiles.length} files`);
97
+ console.log(` Total findings: ${allFindings.length}`);
98
+ if (dedup)
99
+ console.log(` After dedup: ${merged.length} (${duplicatesRemoved} removed)`);
100
+ console.log("─".repeat(60));
101
+ // Summary by severity
102
+ const bySev = new Map();
103
+ for (const f of merged) {
104
+ bySev.set(f.severity, (bySev.get(f.severity) || 0) + 1);
105
+ }
106
+ for (const [sev, count] of [...bySev.entries()].sort((a, b) => b[1] - a[1])) {
107
+ console.log(` ${sev.toUpperCase().padEnd(12)} ${count}`);
108
+ }
109
+ console.log("═".repeat(60));
110
+ }
111
+ //# sourceMappingURL=finding-merge-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-merge-results.js","sourceRoot":"","sources":["../../src/commands/finding-merge-results.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-pattern-match — Match findings against custom patterns.
3
+ */
4
+ export declare function runFindingPatternMatch(argv: string[]): void;
5
+ //# sourceMappingURL=finding-pattern-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-pattern-match.d.ts","sourceRoot":"","sources":["../../src/commands/finding-pattern-match.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgDH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiI3D"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Finding-pattern-match — Match findings against custom patterns.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname, join } from "path";
6
+ // ─── Helpers ────────────────────────────────────────────────────────────────
7
+ function patternsFile() {
8
+ return join(process.cwd(), ".judges", "match-patterns.json");
9
+ }
10
+ function loadPatterns() {
11
+ const f = patternsFile();
12
+ if (!existsSync(f))
13
+ return [];
14
+ try {
15
+ return JSON.parse(readFileSync(f, "utf-8"));
16
+ }
17
+ catch {
18
+ return [];
19
+ }
20
+ }
21
+ function savePatterns(patterns) {
22
+ const f = patternsFile();
23
+ const d = dirname(f);
24
+ if (!existsSync(d))
25
+ mkdirSync(d, { recursive: true });
26
+ writeFileSync(f, JSON.stringify(patterns, null, 2));
27
+ }
28
+ function matchFinding(finding, pattern) {
29
+ if (pattern.rulePattern && !finding.ruleId.includes(pattern.rulePattern))
30
+ return false;
31
+ if (pattern.titlePattern && !finding.title.toLowerCase().includes(pattern.titlePattern.toLowerCase()))
32
+ return false;
33
+ if (pattern.severities.length > 0 && !pattern.severities.includes(finding.severity))
34
+ return false;
35
+ return true;
36
+ }
37
+ // ─── CLI ────────────────────────────────────────────────────────────────────
38
+ export function runFindingPatternMatch(argv) {
39
+ const sub = argv[0];
40
+ if (!sub || sub === "--help" || sub === "-h") {
41
+ console.log(`
42
+ judges finding-pattern-match — Match findings against custom patterns
43
+
44
+ Usage:
45
+ judges finding-pattern-match apply --file <results.json> [--format json]
46
+ judges finding-pattern-match add --name <name> [--rule <pattern>] [--title <pattern>] [--severity <list>] [--action <act>]
47
+ judges finding-pattern-match list
48
+ judges finding-pattern-match remove --name <name>
49
+ judges finding-pattern-match clear
50
+
51
+ Options:
52
+ --name <name> Pattern name
53
+ --rule <pattern> Substring to match in ruleId
54
+ --title <pattern> Substring to match in title
55
+ --severity <list> Comma-separated severities
56
+ --action <act> Action: flag, suppress, escalate (default: flag)
57
+ --format json JSON output
58
+ --help, -h Show this help
59
+ `);
60
+ return;
61
+ }
62
+ const args = argv.slice(1);
63
+ const patterns = loadPatterns();
64
+ if (sub === "apply") {
65
+ const file = args.find((_a, i) => args[i - 1] === "--file");
66
+ const format = args.find((_a, i) => args[i - 1] === "--format") || "text";
67
+ if (!file) {
68
+ console.error("Error: --file required");
69
+ process.exitCode = 1;
70
+ return;
71
+ }
72
+ if (!existsSync(file)) {
73
+ console.error(`Error: file not found: ${file}`);
74
+ process.exitCode = 1;
75
+ return;
76
+ }
77
+ let verdict;
78
+ try {
79
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
80
+ }
81
+ catch {
82
+ console.error("Error: could not parse file");
83
+ process.exitCode = 1;
84
+ return;
85
+ }
86
+ const findings = verdict.findings || [];
87
+ const matches = findings.map((f) => {
88
+ const matched = patterns.filter((p) => matchFinding(f, p));
89
+ return { ...f, matchedPatterns: matched.map((p) => p.name), actions: matched.map((p) => p.action) };
90
+ });
91
+ const withMatches = matches.filter((m) => m.matchedPatterns.length > 0);
92
+ if (format === "json") {
93
+ console.log(JSON.stringify({ total: findings.length, matched: withMatches.length, findings: matches }, null, 2));
94
+ return;
95
+ }
96
+ console.log(`\nPattern Match Results:`);
97
+ console.log("═".repeat(65));
98
+ console.log(` ${withMatches.length} of ${findings.length} findings matched ${patterns.length} patterns`);
99
+ console.log("─".repeat(65));
100
+ for (const m of withMatches.slice(0, 20)) {
101
+ const acts = [...new Set(m.actions)].join(", ");
102
+ console.log(` ${m.ruleId.padEnd(22)} [${acts}] patterns: ${m.matchedPatterns.join(", ")}`);
103
+ }
104
+ if (withMatches.length > 20)
105
+ console.log(` ... and ${withMatches.length - 20} more`);
106
+ console.log("═".repeat(65));
107
+ }
108
+ else if (sub === "add") {
109
+ const name = args.find((_a, i) => args[i - 1] === "--name");
110
+ if (!name) {
111
+ console.error("Error: --name required");
112
+ process.exitCode = 1;
113
+ return;
114
+ }
115
+ const ruleP = args.find((_a, i) => args[i - 1] === "--rule") || "";
116
+ const titleP = args.find((_a, i) => args[i - 1] === "--title") || "";
117
+ const sevStr = args.find((_a, i) => args[i - 1] === "--severity") || "";
118
+ const action = args.find((_a, i) => args[i - 1] === "--action") || "flag";
119
+ patterns.push({
120
+ name,
121
+ rulePattern: ruleP,
122
+ titlePattern: titleP,
123
+ severities: sevStr ? sevStr.split(",") : [],
124
+ action,
125
+ });
126
+ savePatterns(patterns);
127
+ console.log(`Added pattern: ${name}`);
128
+ }
129
+ else if (sub === "list") {
130
+ if (patterns.length === 0) {
131
+ console.log("No patterns defined.");
132
+ return;
133
+ }
134
+ console.log(`\nMatch Patterns (${patterns.length}):`);
135
+ console.log("═".repeat(55));
136
+ for (const p of patterns) {
137
+ console.log(` ${p.name.padEnd(18)} [${p.action}] rule:${p.rulePattern || "*"} title:${p.titlePattern || "*"}`);
138
+ }
139
+ console.log("═".repeat(55));
140
+ }
141
+ else if (sub === "remove") {
142
+ const name = args.find((_a, i) => args[i - 1] === "--name");
143
+ if (!name) {
144
+ console.error("Error: --name required");
145
+ process.exitCode = 1;
146
+ return;
147
+ }
148
+ const filtered = patterns.filter((p) => p.name !== name);
149
+ if (filtered.length === patterns.length) {
150
+ console.error(`Pattern "${name}" not found.`);
151
+ process.exitCode = 1;
152
+ return;
153
+ }
154
+ savePatterns(filtered);
155
+ console.log(`Removed pattern: ${name}`);
156
+ }
157
+ else if (sub === "clear") {
158
+ savePatterns([]);
159
+ console.log("All patterns cleared.");
160
+ }
161
+ else {
162
+ console.error(`Unknown subcommand: ${sub}. Use --help for usage.`);
163
+ process.exitCode = 1;
164
+ }
165
+ }
166
+ //# sourceMappingURL=finding-pattern-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-pattern-match.js","sourceRoot":"","sources":["../../src/commands/finding-pattern-match.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-risk-matrix — Generate risk matrices from findings.
3
+ */
4
+ export declare function runFindingRiskMatrix(argv: string[]): void;
5
+ //# sourceMappingURL=finding-risk-matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-risk-matrix.d.ts","sourceRoot":"","sources":["../../src/commands/finding-risk-matrix.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwEH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2EzD"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Finding-risk-matrix — Generate risk matrices from findings.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Constants ──────────────────────────────────────────────────────────────
6
+ const SEVERITY_LEVELS = ["critical", "high", "medium", "low", "info"];
7
+ const CONFIDENCE_LEVELS = ["high", "medium", "low"];
8
+ // ─── Helpers ────────────────────────────────────────────────────────────────
9
+ function loadVerdict(filePath) {
10
+ if (!existsSync(filePath))
11
+ return null;
12
+ try {
13
+ return JSON.parse(readFileSync(filePath, "utf-8"));
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ function buildMatrix(verdict) {
20
+ const cells = [];
21
+ for (const sev of SEVERITY_LEVELS) {
22
+ for (const conf of CONFIDENCE_LEVELS) {
23
+ const matching = verdict.findings.filter((f) => {
24
+ const fSev = (f.severity || "medium").toLowerCase();
25
+ const fConf = f.confidence !== undefined && f.confidence !== null
26
+ ? f.confidence >= 0.8
27
+ ? "high"
28
+ : f.confidence >= 0.5
29
+ ? "medium"
30
+ : "low"
31
+ : "medium";
32
+ return fSev === sev && fConf === conf;
33
+ });
34
+ if (matching.length > 0) {
35
+ cells.push({
36
+ severity: sev,
37
+ confidence: conf,
38
+ count: matching.length,
39
+ findings: matching.map((f) => f.title),
40
+ });
41
+ }
42
+ }
43
+ }
44
+ return cells;
45
+ }
46
+ function riskScore(severity, confidence) {
47
+ const sevWeight = { critical: 5, high: 4, medium: 3, low: 2, info: 1 };
48
+ const confWeight = { high: 3, medium: 2, low: 1 };
49
+ const score = (sevWeight[severity] || 1) * (confWeight[confidence] || 1);
50
+ if (score >= 12)
51
+ return "CRITICAL";
52
+ if (score >= 8)
53
+ return "HIGH";
54
+ if (score >= 4)
55
+ return "MEDIUM";
56
+ return "LOW";
57
+ }
58
+ // ─── CLI ────────────────────────────────────────────────────────────────────
59
+ export function runFindingRiskMatrix(argv) {
60
+ const fileIdx = argv.indexOf("--file");
61
+ const formatIdx = argv.indexOf("--format");
62
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
63
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
64
+ if (argv.includes("--help") || argv.includes("-h")) {
65
+ console.log(`
66
+ judges finding-risk-matrix — Generate risk matrix from findings
67
+
68
+ Usage:
69
+ judges finding-risk-matrix --file <verdict.json> [--format table|json|markdown]
70
+
71
+ Options:
72
+ --file <path> Path to verdict JSON file (required)
73
+ --format <fmt> Output format: table (default), json, markdown
74
+ --help, -h Show this help
75
+ `);
76
+ return;
77
+ }
78
+ if (!filePath) {
79
+ console.error("Error: --file required");
80
+ process.exitCode = 1;
81
+ return;
82
+ }
83
+ const verdict = loadVerdict(filePath);
84
+ if (!verdict) {
85
+ console.error(`Error: cannot load ${filePath}`);
86
+ process.exitCode = 1;
87
+ return;
88
+ }
89
+ const cells = buildMatrix(verdict);
90
+ if (format === "json") {
91
+ console.log(JSON.stringify(cells, null, 2));
92
+ return;
93
+ }
94
+ if (format === "markdown") {
95
+ console.log("| Severity | Confidence | Count | Risk Level |");
96
+ console.log("|----------|------------|-------|------------|");
97
+ for (const c of cells) {
98
+ console.log(`| ${c.severity} | ${c.confidence} | ${c.count} | ${riskScore(c.severity, c.confidence)} |`);
99
+ }
100
+ return;
101
+ }
102
+ // Table format
103
+ console.log("\nRisk Matrix");
104
+ console.log("═".repeat(60));
105
+ console.log(`${"Severity".padEnd(12)} ${"Confidence".padEnd(12)} ${"Count".padEnd(8)} Risk Level`);
106
+ console.log("─".repeat(60));
107
+ const sorted = [...cells].sort((a, b) => {
108
+ const sevOrder = SEVERITY_LEVELS.indexOf(a.severity) - SEVERITY_LEVELS.indexOf(b.severity);
109
+ if (sevOrder !== 0)
110
+ return sevOrder;
111
+ return CONFIDENCE_LEVELS.indexOf(a.confidence) - CONFIDENCE_LEVELS.indexOf(b.confidence);
112
+ });
113
+ for (const c of sorted) {
114
+ const risk = riskScore(c.severity, c.confidence);
115
+ console.log(`${c.severity.padEnd(12)} ${c.confidence.padEnd(12)} ${String(c.count).padEnd(8)} ${risk}`);
116
+ for (const t of c.findings.slice(0, 3)) {
117
+ console.log(` → ${t}`);
118
+ }
119
+ if (c.findings.length > 3)
120
+ console.log(` … and ${c.findings.length - 3} more`);
121
+ }
122
+ console.log("─".repeat(60));
123
+ const total = cells.reduce((s, c) => s + c.count, 0);
124
+ console.log(`Total findings: ${total}`);
125
+ console.log("═".repeat(60));
126
+ }
127
+ //# sourceMappingURL=finding-risk-matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-risk-matrix.js","sourceRoot":"","sources":["../../src/commands/finding-risk-matrix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-severity-trend — Track severity distribution trends over time.
3
+ */
4
+ export declare function runFindingSeverityTrend(argv: string[]): void;
5
+ //# sourceMappingURL=finding-severity-trend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-severity-trend.d.ts","sourceRoot":"","sources":["../../src/commands/finding-severity-trend.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0CH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8G5D"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Finding-severity-trend — Track severity distribution trends over time.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname, join } from "path";
6
+ // ─── Helpers ────────────────────────────────────────────────────────────────
7
+ function trendFile() {
8
+ return join(process.cwd(), ".judges", "severity-trend.json");
9
+ }
10
+ function loadTrend() {
11
+ const f = trendFile();
12
+ if (!existsSync(f))
13
+ return [];
14
+ try {
15
+ return JSON.parse(readFileSync(f, "utf-8"));
16
+ }
17
+ catch {
18
+ return [];
19
+ }
20
+ }
21
+ function saveTrend(data) {
22
+ const f = trendFile();
23
+ const d = dirname(f);
24
+ if (!existsSync(d))
25
+ mkdirSync(d, { recursive: true });
26
+ writeFileSync(f, JSON.stringify(data.slice(-200), null, 2));
27
+ }
28
+ // ─── CLI ────────────────────────────────────────────────────────────────────
29
+ export function runFindingSeverityTrend(argv) {
30
+ const sub = argv[0];
31
+ if (!sub || sub === "--help" || sub === "-h") {
32
+ console.log(`
33
+ judges finding-severity-trend — Track severity trends over time
34
+
35
+ Usage:
36
+ judges finding-severity-trend record --file <results.json>
37
+ judges finding-severity-trend show [--last <n>] [--format json]
38
+ judges finding-severity-trend clear
39
+
40
+ Subcommands:
41
+ record Record severity distribution from a result file
42
+ show Show trend data
43
+ clear Clear trend history
44
+
45
+ Options:
46
+ --file <path> Result file to record from
47
+ --last <n> Show last N snapshots (default: 10)
48
+ --format json JSON output
49
+ --help, -h Show this help
50
+ `);
51
+ return;
52
+ }
53
+ const args = argv.slice(1);
54
+ if (sub === "record") {
55
+ const file = args.find((_a, i) => args[i - 1] === "--file");
56
+ if (!file) {
57
+ console.error("Error: --file required");
58
+ process.exitCode = 1;
59
+ return;
60
+ }
61
+ if (!existsSync(file)) {
62
+ console.error(`Error: file not found: ${file}`);
63
+ process.exitCode = 1;
64
+ return;
65
+ }
66
+ let data;
67
+ try {
68
+ data = JSON.parse(readFileSync(file, "utf-8"));
69
+ }
70
+ catch {
71
+ console.error("Error: could not parse file");
72
+ process.exitCode = 1;
73
+ return;
74
+ }
75
+ const findings = data.findings || [];
76
+ const counts = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
77
+ for (const f of findings) {
78
+ const sev = (f.severity || "medium").toLowerCase();
79
+ if (sev in counts)
80
+ counts[sev]++;
81
+ }
82
+ const snapshot = {
83
+ timestamp: new Date().toISOString(),
84
+ critical: counts.critical,
85
+ high: counts.high,
86
+ medium: counts.medium,
87
+ low: counts.low,
88
+ info: counts.info,
89
+ total: findings.length,
90
+ };
91
+ const trend = loadTrend();
92
+ trend.push(snapshot);
93
+ saveTrend(trend);
94
+ console.log(`Recorded: ${findings.length} findings (C:${counts.critical} H:${counts.high} M:${counts.medium} L:${counts.low} I:${counts.info})`);
95
+ }
96
+ else if (sub === "show") {
97
+ const lastStr = args.find((_a, i) => args[i - 1] === "--last");
98
+ const last = lastStr ? parseInt(lastStr, 10) : 10;
99
+ const format = args.find((_a, i) => args[i - 1] === "--format") || "text";
100
+ const trend = loadTrend();
101
+ const display = trend.slice(-last);
102
+ if (format === "json") {
103
+ console.log(JSON.stringify({ snapshots: display.length, trend: display }, null, 2));
104
+ return;
105
+ }
106
+ if (display.length === 0) {
107
+ console.log("No trend data recorded yet.");
108
+ return;
109
+ }
110
+ console.log(`\nSeverity Trend (last ${display.length} snapshots):`);
111
+ console.log("═".repeat(70));
112
+ console.log(` ${"Date".padEnd(12)} ${"Total".padStart(6)} ${"Crit".padStart(5)} ${"High".padStart(5)} ${"Med".padStart(5)} ${"Low".padStart(5)} ${"Info".padStart(5)}`);
113
+ console.log("─".repeat(70));
114
+ for (const s of display) {
115
+ console.log(` ${s.timestamp.slice(0, 10).padEnd(12)} ${String(s.total).padStart(6)} ${String(s.critical).padStart(5)} ${String(s.high).padStart(5)} ${String(s.medium).padStart(5)} ${String(s.low).padStart(5)} ${String(s.info).padStart(5)}`);
116
+ }
117
+ console.log("═".repeat(70));
118
+ }
119
+ else if (sub === "clear") {
120
+ saveTrend([]);
121
+ console.log("Severity trend data cleared.");
122
+ }
123
+ else {
124
+ console.error(`Unknown subcommand: ${sub}. Use --help for usage.`);
125
+ process.exitCode = 1;
126
+ }
127
+ }
128
+ //# sourceMappingURL=finding-severity-trend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-severity-trend.js","sourceRoot":"","sources":["../../src/commands/finding-severity-trend.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAcrC,+EAA+E;AAE/E,SAAS,SAAS;IAChB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAwB;IACzC,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,uBAAuB,CAAC,IAAc;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;CAkBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,IAAiD,CAAC;QACtD,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QACrC,MAAM,MAAM,GAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5F,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,GAAG,IAAI,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,QAAQ,GAAqB;YACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,QAAQ,CAAC,MAAM;SACvB,CAAC;QAEF,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,aAAa,QAAQ,CAAC,MAAM,gBAAgB,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,GAAG,CACpI,CAAC;IACJ,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;QAE1F,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAEnC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CACT,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAC5J,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CACrO,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,yBAAyB,CAAC,CAAC;QACnE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-batch-files — Batch-review multiple files in a single command.
3
+ */
4
+ export declare function runReviewBatchFiles(argv: string[]): void;
5
+ //# sourceMappingURL=review-batch-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-batch-files.d.ts","sourceRoot":"","sources":["../../src/commands/review-batch-files.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqFxD"}