@kevinrabun/judges 3.85.0 → 3.87.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 (78) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +126 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-code-smell.d.ts +5 -0
  6. package/dist/commands/finding-code-smell.d.ts.map +1 -0
  7. package/dist/commands/finding-code-smell.js +114 -0
  8. package/dist/commands/finding-code-smell.js.map +1 -0
  9. package/dist/commands/finding-context-window.d.ts +5 -0
  10. package/dist/commands/finding-context-window.d.ts.map +1 -0
  11. package/dist/commands/finding-context-window.js +127 -0
  12. package/dist/commands/finding-context-window.js.map +1 -0
  13. package/dist/commands/finding-owner-assign.d.ts +5 -0
  14. package/dist/commands/finding-owner-assign.d.ts.map +1 -0
  15. package/dist/commands/finding-owner-assign.js +134 -0
  16. package/dist/commands/finding-owner-assign.js.map +1 -0
  17. package/dist/commands/finding-pattern-library.d.ts +5 -0
  18. package/dist/commands/finding-pattern-library.d.ts.map +1 -0
  19. package/dist/commands/finding-pattern-library.js +146 -0
  20. package/dist/commands/finding-pattern-library.js.map +1 -0
  21. package/dist/commands/finding-quality-gate.d.ts +5 -0
  22. package/dist/commands/finding-quality-gate.d.ts.map +1 -0
  23. package/dist/commands/finding-quality-gate.js +108 -0
  24. package/dist/commands/finding-quality-gate.js.map +1 -0
  25. package/dist/commands/finding-reachability.d.ts +5 -0
  26. package/dist/commands/finding-reachability.d.ts.map +1 -0
  27. package/dist/commands/finding-reachability.js +132 -0
  28. package/dist/commands/finding-reachability.js.map +1 -0
  29. package/dist/commands/finding-related-rules.d.ts +5 -0
  30. package/dist/commands/finding-related-rules.d.ts.map +1 -0
  31. package/dist/commands/finding-related-rules.js +152 -0
  32. package/dist/commands/finding-related-rules.js.map +1 -0
  33. package/dist/commands/finding-rule-explain.d.ts +5 -0
  34. package/dist/commands/finding-rule-explain.d.ts.map +1 -0
  35. package/dist/commands/finding-rule-explain.js +141 -0
  36. package/dist/commands/finding-rule-explain.js.map +1 -0
  37. package/dist/commands/finding-severity-dist.d.ts +5 -0
  38. package/dist/commands/finding-severity-dist.d.ts.map +1 -0
  39. package/dist/commands/finding-severity-dist.js +106 -0
  40. package/dist/commands/finding-severity-dist.js.map +1 -0
  41. package/dist/commands/review-ignore-pattern.d.ts +6 -0
  42. package/dist/commands/review-ignore-pattern.d.ts.map +1 -0
  43. package/dist/commands/review-ignore-pattern.js +140 -0
  44. package/dist/commands/review-ignore-pattern.js.map +1 -0
  45. package/dist/commands/review-lock-file.d.ts +5 -0
  46. package/dist/commands/review-lock-file.d.ts.map +1 -0
  47. package/dist/commands/review-lock-file.js +154 -0
  48. package/dist/commands/review-lock-file.js.map +1 -0
  49. package/dist/commands/review-merge-check.d.ts +5 -0
  50. package/dist/commands/review-merge-check.d.ts.map +1 -0
  51. package/dist/commands/review-merge-check.js +102 -0
  52. package/dist/commands/review-merge-check.js.map +1 -0
  53. package/dist/commands/review-plugin-config.d.ts +5 -0
  54. package/dist/commands/review-plugin-config.d.ts.map +1 -0
  55. package/dist/commands/review-plugin-config.js +168 -0
  56. package/dist/commands/review-plugin-config.js.map +1 -0
  57. package/dist/commands/review-plugin-list.d.ts +5 -0
  58. package/dist/commands/review-plugin-list.d.ts.map +1 -0
  59. package/dist/commands/review-plugin-list.js +100 -0
  60. package/dist/commands/review-plugin-list.js.map +1 -0
  61. package/dist/commands/review-report-merge.d.ts +5 -0
  62. package/dist/commands/review-report-merge.d.ts.map +1 -0
  63. package/dist/commands/review-report-merge.js +91 -0
  64. package/dist/commands/review-report-merge.js.map +1 -0
  65. package/dist/commands/review-status-badge.d.ts +5 -0
  66. package/dist/commands/review-status-badge.d.ts.map +1 -0
  67. package/dist/commands/review-status-badge.js +121 -0
  68. package/dist/commands/review-status-badge.js.map +1 -0
  69. package/dist/commands/review-token-budget.d.ts +5 -0
  70. package/dist/commands/review-token-budget.d.ts.map +1 -0
  71. package/dist/commands/review-token-budget.js +118 -0
  72. package/dist/commands/review-token-budget.js.map +1 -0
  73. package/dist/commands/review-workspace-scan.d.ts +5 -0
  74. package/dist/commands/review-workspace-scan.d.ts.map +1 -0
  75. package/dist/commands/review-workspace-scan.js +145 -0
  76. package/dist/commands/review-workspace-scan.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Finding-code-smell — Detect code-smell indicators among findings.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Patterns ───────────────────────────────────────────────────────────────
6
+ const SMELL_KEYWORDS = [
7
+ { keywords: ["duplicate", "copy", "clone", "repeated"], label: "duplication" },
8
+ { keywords: ["complex", "nested", "cyclomatic", "branch"], label: "complexity" },
9
+ { keywords: ["long", "large", "big", "oversized", "bloat"], label: "bloat" },
10
+ { keywords: ["magic", "hardcod", "literal", "constant"], label: "magic-values" },
11
+ { keywords: ["dead", "unused", "unreachable", "orphan"], label: "dead-code" },
12
+ { keywords: ["coupling", "depend", "import", "circular"], label: "coupling" },
13
+ { keywords: ["naming", "convention", "inconsistent", "style"], label: "naming" },
14
+ { keywords: ["comment", "todo", "fixme", "hack", "workaround"], label: "tech-debt" },
15
+ ];
16
+ function detectSmell(title, desc) {
17
+ const combined = `${title} ${desc}`.toLowerCase();
18
+ for (const s of SMELL_KEYWORDS) {
19
+ const matches = s.keywords.filter((k) => combined.includes(k));
20
+ if (matches.length > 0) {
21
+ return { label: s.label, confidence: Math.min(1, 0.5 + matches.length * 0.2) };
22
+ }
23
+ }
24
+ return { label: "general", confidence: 0.3 };
25
+ }
26
+ // ─── Analysis ───────────────────────────────────────────────────────────────
27
+ function analyzeSmells(verdict) {
28
+ const results = [];
29
+ for (const f of verdict.findings) {
30
+ const { label, confidence } = detectSmell(f.title, f.description);
31
+ results.push({
32
+ ruleId: f.ruleId,
33
+ title: f.title,
34
+ severity: (f.severity || "medium").toLowerCase(),
35
+ smellType: label,
36
+ confidence,
37
+ });
38
+ }
39
+ return results;
40
+ }
41
+ // ─── CLI ────────────────────────────────────────────────────────────────────
42
+ export function runFindingCodeSmell(argv) {
43
+ const fileIdx = argv.indexOf("--file");
44
+ const formatIdx = argv.indexOf("--format");
45
+ const minIdx = argv.indexOf("--min-confidence");
46
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
47
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
48
+ const minConf = minIdx >= 0 ? parseFloat(argv[minIdx + 1]) : 0;
49
+ if (argv.includes("--help") || argv.includes("-h")) {
50
+ console.log(`
51
+ judges finding-code-smell — Detect code-smell indicators
52
+
53
+ Usage:
54
+ judges finding-code-smell --file <verdict.json> [--format table|json]
55
+ [--min-confidence <0-1>]
56
+
57
+ Options:
58
+ --file <path> Path to verdict JSON file (required)
59
+ --format <fmt> Output format: table (default), json
60
+ --min-confidence <n> Minimum confidence threshold (0-1)
61
+ --help, -h Show this help
62
+ `);
63
+ return;
64
+ }
65
+ if (!filePath) {
66
+ console.error("Error: --file required");
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ if (!existsSync(filePath)) {
71
+ console.error(`Error: not found: ${filePath}`);
72
+ process.exitCode = 1;
73
+ return;
74
+ }
75
+ let verdict;
76
+ try {
77
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
78
+ }
79
+ catch {
80
+ console.error("Error: invalid JSON");
81
+ process.exitCode = 1;
82
+ return;
83
+ }
84
+ let results = analyzeSmells(verdict);
85
+ if (minConf > 0) {
86
+ results = results.filter((r) => r.confidence >= minConf);
87
+ }
88
+ if (format === "json") {
89
+ console.log(JSON.stringify(results, null, 2));
90
+ return;
91
+ }
92
+ // group by smell type
93
+ const byType = new Map();
94
+ for (const r of results) {
95
+ const arr = byType.get(r.smellType) || [];
96
+ arr.push(r);
97
+ byType.set(r.smellType, arr);
98
+ }
99
+ console.log(`\nCode Smell Analysis (${results.length} findings)`);
100
+ console.log("═".repeat(70));
101
+ console.log(`${"Type".padEnd(16)} ${"Count".padEnd(8)} ${"Severity".padEnd(10)} ${"Avg Conf".padEnd(10)}`);
102
+ console.log("─".repeat(70));
103
+ for (const [type, items] of byType) {
104
+ const avgConf = items.reduce((s, i) => s + i.confidence, 0) / items.length;
105
+ const topSev = items.some((i) => i.severity === "critical")
106
+ ? "critical"
107
+ : items.some((i) => i.severity === "high")
108
+ ? "high"
109
+ : "medium";
110
+ console.log(`${type.padEnd(16)} ${String(items.length).padEnd(8)} ${topSev.padEnd(10)} ${avgConf.toFixed(2).padEnd(10)}`);
111
+ }
112
+ console.log("═".repeat(70));
113
+ }
114
+ //# sourceMappingURL=finding-code-smell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-code-smell.js","sourceRoot":"","sources":["../../src/commands/finding-code-smell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-context-window — Show findings with surrounding code context.
3
+ */
4
+ export declare function runFindingContextWindow(argv: string[]): void;
5
+ //# sourceMappingURL=finding-context-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-context-window.d.ts","sourceRoot":"","sources":["../../src/commands/finding-context-window.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqEH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqF5D"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Finding-context-window — Show findings with surrounding code context.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Helpers ────────────────────────────────────────────────────────────────
6
+ function buildContext(verdict, sourceFile, windowSize) {
7
+ const source = readFileSync(sourceFile, "utf-8");
8
+ const sourceLines = source.split("\n");
9
+ const results = [];
10
+ for (const f of verdict.findings) {
11
+ const lineNums = f.lineNumbers || [];
12
+ if (lineNums.length === 0) {
13
+ results.push({
14
+ ruleId: f.ruleId,
15
+ title: f.title,
16
+ severity: (f.severity || "medium").toLowerCase(),
17
+ lines: [],
18
+ context: [],
19
+ });
20
+ continue;
21
+ }
22
+ const contextLines = [];
23
+ const addedLines = new Set();
24
+ for (const ln of lineNums) {
25
+ const start = Math.max(1, ln - windowSize);
26
+ const end = Math.min(sourceLines.length, ln + windowSize);
27
+ for (let i = start; i <= end; i++) {
28
+ if (addedLines.has(i))
29
+ continue;
30
+ addedLines.add(i);
31
+ contextLines.push({
32
+ lineNumber: i,
33
+ code: sourceLines[i - 1],
34
+ isFinding: lineNums.includes(i),
35
+ });
36
+ }
37
+ }
38
+ contextLines.sort((a, b) => a.lineNumber - b.lineNumber);
39
+ results.push({
40
+ ruleId: f.ruleId,
41
+ title: f.title,
42
+ severity: (f.severity || "medium").toLowerCase(),
43
+ lines: lineNums,
44
+ context: contextLines,
45
+ });
46
+ }
47
+ return results;
48
+ }
49
+ // ─── CLI ────────────────────────────────────────────────────────────────────
50
+ export function runFindingContextWindow(argv) {
51
+ const fileIdx = argv.indexOf("--file");
52
+ const sourceIdx = argv.indexOf("--source");
53
+ const windowIdx = argv.indexOf("--window");
54
+ const formatIdx = argv.indexOf("--format");
55
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
56
+ const sourceFile = sourceIdx >= 0 ? argv[sourceIdx + 1] : undefined;
57
+ const windowSize = windowIdx >= 0 ? parseInt(argv[windowIdx + 1], 10) : 3;
58
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
59
+ if (argv.includes("--help") || argv.includes("-h")) {
60
+ console.log(`
61
+ judges finding-context-window — Show findings with code context
62
+
63
+ Usage:
64
+ judges finding-context-window --file <verdict.json> --source <src.ts>
65
+ [--window <n>] [--format table|json]
66
+
67
+ Options:
68
+ --file <path> Path to verdict JSON file (required)
69
+ --source <path> Source file for context (required)
70
+ --window <n> Context lines before/after (default: 3)
71
+ --format <fmt> Output format: table (default), json
72
+ --help, -h Show this help
73
+ `);
74
+ return;
75
+ }
76
+ if (!filePath) {
77
+ console.error("Error: --file required");
78
+ process.exitCode = 1;
79
+ return;
80
+ }
81
+ if (!sourceFile) {
82
+ console.error("Error: --source required");
83
+ process.exitCode = 1;
84
+ return;
85
+ }
86
+ if (!existsSync(filePath)) {
87
+ console.error(`Error: not found: ${filePath}`);
88
+ process.exitCode = 1;
89
+ return;
90
+ }
91
+ if (!existsSync(sourceFile)) {
92
+ console.error(`Error: not found: ${sourceFile}`);
93
+ process.exitCode = 1;
94
+ return;
95
+ }
96
+ let verdict;
97
+ try {
98
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
99
+ }
100
+ catch {
101
+ console.error("Error: invalid JSON");
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ const results = buildContext(verdict, sourceFile, windowSize);
106
+ if (format === "json") {
107
+ console.log(JSON.stringify(results, null, 2));
108
+ return;
109
+ }
110
+ console.log(`\nFinding Context (${results.length} findings, window=${windowSize})`);
111
+ for (const r of results) {
112
+ console.log("\n" + "═".repeat(70));
113
+ console.log(`[${r.severity}] ${r.ruleId}: ${r.title}`);
114
+ if (r.context.length === 0) {
115
+ console.log(" (no line number data)");
116
+ continue;
117
+ }
118
+ console.log("─".repeat(70));
119
+ for (const c of r.context) {
120
+ const marker = c.isFinding ? ">>>" : " ";
121
+ const lineStr = String(c.lineNumber).padStart(5);
122
+ console.log(`${marker} ${lineStr} | ${c.code}`);
123
+ }
124
+ }
125
+ console.log("\n" + "═".repeat(70));
126
+ }
127
+ //# sourceMappingURL=finding-context-window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-context-window.js","sourceRoot":"","sources":["../../src/commands/finding-context-window.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-owner-assign — Assign ownership of findings based on configurable rules.
3
+ */
4
+ export declare function runFindingOwnerAssign(argv: string[]): void;
5
+ //# sourceMappingURL=finding-owner-assign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-owner-assign.d.ts","sourceRoot":"","sources":["../../src/commands/finding-owner-assign.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6EH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwF1D"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Finding-owner-assign — Assign ownership of findings based on configurable rules.
3
+ */
4
+ import { readFileSync, existsSync, writeFileSync } from "fs";
5
+ // ─── Helpers ────────────────────────────────────────────────────────────────
6
+ function loadOwnerRules(configPath) {
7
+ if (!existsSync(configPath))
8
+ return [];
9
+ try {
10
+ const data = JSON.parse(readFileSync(configPath, "utf-8"));
11
+ if (Array.isArray(data.rules)) {
12
+ return data.rules;
13
+ }
14
+ return [];
15
+ }
16
+ catch {
17
+ return [];
18
+ }
19
+ }
20
+ function assignOwners(verdict, rules) {
21
+ const assignments = [];
22
+ for (const f of verdict.findings) {
23
+ let owner = "unassigned";
24
+ let matchedPattern = "";
25
+ for (const rule of rules) {
26
+ const ruleIdLower = f.ruleId.toLowerCase();
27
+ const titleLower = f.title.toLowerCase();
28
+ const patLower = rule.pattern.toLowerCase();
29
+ if (ruleIdLower.includes(patLower) || titleLower.includes(patLower)) {
30
+ owner = rule.owner;
31
+ matchedPattern = rule.pattern;
32
+ break;
33
+ }
34
+ }
35
+ // fallback: assign by severity
36
+ if (owner === "unassigned") {
37
+ const sev = (f.severity || "medium").toLowerCase();
38
+ if (sev === "critical" || sev === "high") {
39
+ owner = "security-team";
40
+ matchedPattern = `severity:${sev}`;
41
+ }
42
+ }
43
+ assignments.push({
44
+ ruleId: f.ruleId,
45
+ title: f.title,
46
+ severity: (f.severity || "medium").toLowerCase(),
47
+ owner,
48
+ matchedPattern,
49
+ });
50
+ }
51
+ return assignments;
52
+ }
53
+ // ─── CLI ────────────────────────────────────────────────────────────────────
54
+ export function runFindingOwnerAssign(argv) {
55
+ const fileIdx = argv.indexOf("--file");
56
+ const configIdx = argv.indexOf("--config");
57
+ const formatIdx = argv.indexOf("--format");
58
+ const outIdx = argv.indexOf("--output");
59
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
60
+ const configPath = configIdx >= 0 ? argv[configIdx + 1] : ".judges-owners.json";
61
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
62
+ const outputPath = outIdx >= 0 ? argv[outIdx + 1] : undefined;
63
+ if (argv.includes("--help") || argv.includes("-h")) {
64
+ console.log(`
65
+ judges finding-owner-assign — Assign finding owners
66
+
67
+ Usage:
68
+ judges finding-owner-assign --file <verdict.json> [--config <owners.json>]
69
+ [--format table|json] [--output <file>]
70
+
71
+ Options:
72
+ --file <path> Path to verdict JSON file (required)
73
+ --config <path> Owner rules config (default: .judges-owners.json)
74
+ --format <fmt> Output format: table (default), json
75
+ --output <path> Write assignments to file
76
+ --help, -h Show this help
77
+
78
+ Config format:
79
+ { "rules": [{ "pattern": "AUTH", "owner": "security-team" }] }
80
+ `);
81
+ return;
82
+ }
83
+ if (!filePath) {
84
+ console.error("Error: --file required");
85
+ process.exitCode = 1;
86
+ return;
87
+ }
88
+ if (!existsSync(filePath)) {
89
+ console.error(`Error: not found: ${filePath}`);
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ let verdict;
94
+ try {
95
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
96
+ }
97
+ catch {
98
+ console.error("Error: invalid JSON");
99
+ process.exitCode = 1;
100
+ return;
101
+ }
102
+ const rules = loadOwnerRules(configPath);
103
+ const assignments = assignOwners(verdict, rules);
104
+ if (outputPath) {
105
+ writeFileSync(outputPath, JSON.stringify(assignments, null, 2));
106
+ console.log(`Wrote ${assignments.length} assignments to ${outputPath}`);
107
+ return;
108
+ }
109
+ if (format === "json") {
110
+ console.log(JSON.stringify(assignments, null, 2));
111
+ return;
112
+ }
113
+ // group by owner
114
+ const byOwner = new Map();
115
+ for (const a of assignments) {
116
+ const arr = byOwner.get(a.owner) || [];
117
+ arr.push(a);
118
+ byOwner.set(a.owner, arr);
119
+ }
120
+ console.log(`\nFinding Owner Assignments (${assignments.length} findings)`);
121
+ console.log("═".repeat(75));
122
+ for (const [owner, items] of byOwner) {
123
+ console.log(`\n Owner: ${owner} (${items.length} findings)`);
124
+ console.log(" " + "─".repeat(70));
125
+ console.log(` ${"Rule".padEnd(20)} ${"Severity".padEnd(10)} Title`);
126
+ for (const a of items) {
127
+ const rule = a.ruleId.length > 18 ? a.ruleId.slice(0, 18) + "…" : a.ruleId;
128
+ const title = a.title.length > 35 ? a.title.slice(0, 35) + "…" : a.title;
129
+ console.log(` ${rule.padEnd(20)} ${a.severity.padEnd(10)} ${title}`);
130
+ }
131
+ }
132
+ console.log("\n" + "═".repeat(75));
133
+ }
134
+ //# sourceMappingURL=finding-owner-assign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-owner-assign.js","sourceRoot":"","sources":["../../src/commands/finding-owner-assign.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-pattern-library — Manage a local library of finding patterns for reuse.
3
+ */
4
+ export declare function runFindingPatternLibrary(argv: string[]): void;
5
+ //# sourceMappingURL=finding-pattern-library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-pattern-library.d.ts","sourceRoot":"","sources":["../../src/commands/finding-pattern-library.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0EH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6G7D"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Finding-pattern-library — Manage a local library of finding patterns for reuse.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Helpers ────────────────────────────────────────────────────────────────
7
+ function loadLibrary(libPath) {
8
+ if (!existsSync(libPath)) {
9
+ return { version: 1, patterns: [] };
10
+ }
11
+ try {
12
+ return JSON.parse(readFileSync(libPath, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: 1, patterns: [] };
16
+ }
17
+ }
18
+ function saveLibrary(libPath, lib) {
19
+ const dir = dirname(libPath);
20
+ if (!existsSync(dir)) {
21
+ mkdirSync(dir, { recursive: true });
22
+ }
23
+ writeFileSync(libPath, JSON.stringify(lib, null, 2));
24
+ }
25
+ function importPatterns(lib, verdict) {
26
+ const now = new Date().toISOString();
27
+ let added = 0;
28
+ for (const f of verdict.findings) {
29
+ const existing = lib.patterns.find((p) => p.ruleId === f.ruleId);
30
+ if (existing) {
31
+ existing.occurrences++;
32
+ existing.lastSeen = now;
33
+ }
34
+ else {
35
+ lib.patterns.push({
36
+ ruleId: f.ruleId,
37
+ title: f.title,
38
+ severity: (f.severity || "medium").toLowerCase(),
39
+ description: f.description,
40
+ recommendation: f.recommendation,
41
+ occurrences: 1,
42
+ firstSeen: now,
43
+ lastSeen: now,
44
+ });
45
+ added++;
46
+ }
47
+ }
48
+ return added;
49
+ }
50
+ // ─── CLI ────────────────────────────────────────────────────────────────────
51
+ export function runFindingPatternLibrary(argv) {
52
+ const actionIdx = argv.indexOf("--action");
53
+ const fileIdx = argv.indexOf("--file");
54
+ const libIdx = argv.indexOf("--library");
55
+ const formatIdx = argv.indexOf("--format");
56
+ const searchIdx = argv.indexOf("--search");
57
+ const action = actionIdx >= 0 ? argv[actionIdx + 1] : "list";
58
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
59
+ const libPath = libIdx >= 0 ? argv[libIdx + 1] : ".judges-patterns.json";
60
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
61
+ const searchTerm = searchIdx >= 0 ? argv[searchIdx + 1] : undefined;
62
+ if (argv.includes("--help") || argv.includes("-h")) {
63
+ console.log(`
64
+ judges finding-pattern-library — Manage finding pattern library
65
+
66
+ Usage:
67
+ judges finding-pattern-library --action <action> [options]
68
+
69
+ Actions:
70
+ list List patterns in library (default)
71
+ import Import patterns from verdict file
72
+ search Search patterns by keyword
73
+
74
+ Options:
75
+ --action <act> Action: list, import, search
76
+ --file <path> Verdict JSON file (required for import)
77
+ --library <path> Library file (default: .judges-patterns.json)
78
+ --search <term> Search term (for search action)
79
+ --format <fmt> Output format: table (default), json
80
+ --help, -h Show this help
81
+ `);
82
+ return;
83
+ }
84
+ const lib = loadLibrary(libPath);
85
+ if (action === "import") {
86
+ if (!filePath) {
87
+ console.error("Error: --file required for import");
88
+ process.exitCode = 1;
89
+ return;
90
+ }
91
+ if (!existsSync(filePath)) {
92
+ console.error(`Error: not found: ${filePath}`);
93
+ process.exitCode = 1;
94
+ return;
95
+ }
96
+ let verdict;
97
+ try {
98
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
99
+ }
100
+ catch {
101
+ console.error("Error: invalid JSON");
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ const added = importPatterns(lib, verdict);
106
+ saveLibrary(libPath, lib);
107
+ console.log(`Imported ${added} new patterns (${lib.patterns.length} total in library)`);
108
+ return;
109
+ }
110
+ if (action === "search") {
111
+ const term = (searchTerm || "").toLowerCase();
112
+ const matches = lib.patterns.filter((p) => p.ruleId.toLowerCase().includes(term) ||
113
+ p.title.toLowerCase().includes(term) ||
114
+ p.description.toLowerCase().includes(term));
115
+ if (format === "json") {
116
+ console.log(JSON.stringify(matches, null, 2));
117
+ return;
118
+ }
119
+ console.log(`\nPattern Search: "${searchTerm}" (${matches.length} matches)`);
120
+ console.log("═".repeat(70));
121
+ for (const p of matches) {
122
+ console.log(` ${p.ruleId.padEnd(20)} ${p.title}`);
123
+ console.log(` Severity: ${p.severity} | Occurrences: ${p.occurrences}`);
124
+ }
125
+ console.log("═".repeat(70));
126
+ return;
127
+ }
128
+ // default: list
129
+ if (format === "json") {
130
+ console.log(JSON.stringify(lib, null, 2));
131
+ return;
132
+ }
133
+ console.log(`\nPattern Library (${lib.patterns.length} patterns)`);
134
+ console.log("═".repeat(75));
135
+ console.log(`${"Rule".padEnd(20)} ${"Severity".padEnd(10)} ${"Seen".padEnd(6)} ${"Last Seen".padEnd(22)} Title`);
136
+ console.log("─".repeat(75));
137
+ const sorted = [...lib.patterns].sort((a, b) => b.occurrences - a.occurrences);
138
+ for (const p of sorted) {
139
+ const rule = p.ruleId.length > 18 ? p.ruleId.slice(0, 18) + "…" : p.ruleId;
140
+ const title = p.title.length > 20 ? p.title.slice(0, 20) + "…" : p.title;
141
+ const lastSeen = p.lastSeen.slice(0, 19);
142
+ console.log(`${rule.padEnd(20)} ${p.severity.padEnd(10)} ${String(p.occurrences).padEnd(6)} ${lastSeen.padEnd(22)} ${title}`);
143
+ }
144
+ console.log("═".repeat(75));
145
+ }
146
+ //# sourceMappingURL=finding-pattern-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-pattern-library.js","sourceRoot":"","sources":["../../src/commands/finding-pattern-library.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-quality-gate — Define and enforce quality gates on findings.
3
+ */
4
+ export declare function runFindingQualityGate(argv: string[]): void;
5
+ //# sourceMappingURL=finding-quality-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-quality-gate.d.ts","sourceRoot":"","sources":["../../src/commands/finding-quality-gate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8G1D"}