@kevinrabun/judges 3.73.0 → 3.75.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 (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-category.d.ts +5 -0
  6. package/dist/commands/finding-category.d.ts.map +1 -0
  7. package/dist/commands/finding-category.js +110 -0
  8. package/dist/commands/finding-category.js.map +1 -0
  9. package/dist/commands/finding-confidence-filter.d.ts +5 -0
  10. package/dist/commands/finding-confidence-filter.d.ts.map +1 -0
  11. package/dist/commands/finding-confidence-filter.js +78 -0
  12. package/dist/commands/finding-confidence-filter.js.map +1 -0
  13. package/dist/commands/finding-export-csv.d.ts +5 -0
  14. package/dist/commands/finding-export-csv.d.ts.map +1 -0
  15. package/dist/commands/finding-export-csv.js +79 -0
  16. package/dist/commands/finding-export-csv.js.map +1 -0
  17. package/dist/commands/finding-priority-queue.d.ts +5 -0
  18. package/dist/commands/finding-priority-queue.d.ts.map +1 -0
  19. package/dist/commands/finding-priority-queue.js +132 -0
  20. package/dist/commands/finding-priority-queue.js.map +1 -0
  21. package/dist/commands/finding-remediation-plan.d.ts +5 -0
  22. package/dist/commands/finding-remediation-plan.d.ts.map +1 -0
  23. package/dist/commands/finding-remediation-plan.js +108 -0
  24. package/dist/commands/finding-remediation-plan.js.map +1 -0
  25. package/dist/commands/finding-resolution.d.ts +5 -0
  26. package/dist/commands/finding-resolution.d.ts.map +1 -0
  27. package/dist/commands/finding-resolution.js +143 -0
  28. package/dist/commands/finding-resolution.js.map +1 -0
  29. package/dist/commands/review-checklist.d.ts +5 -0
  30. package/dist/commands/review-checklist.d.ts.map +1 -0
  31. package/dist/commands/review-checklist.js +145 -0
  32. package/dist/commands/review-checklist.js.map +1 -0
  33. package/dist/commands/review-config-validate.d.ts +5 -0
  34. package/dist/commands/review-config-validate.d.ts.map +1 -0
  35. package/dist/commands/review-config-validate.js +111 -0
  36. package/dist/commands/review-config-validate.js.map +1 -0
  37. package/dist/commands/review-diff-annotate.d.ts +5 -0
  38. package/dist/commands/review-diff-annotate.d.ts.map +1 -0
  39. package/dist/commands/review-diff-annotate.js +105 -0
  40. package/dist/commands/review-diff-annotate.js.map +1 -0
  41. package/dist/commands/review-lock.d.ts +5 -0
  42. package/dist/commands/review-lock.d.ts.map +1 -0
  43. package/dist/commands/review-lock.js +108 -0
  44. package/dist/commands/review-lock.js.map +1 -0
  45. package/dist/commands/review-note.d.ts +5 -0
  46. package/dist/commands/review-note.d.ts.map +1 -0
  47. package/dist/commands/review-note.js +105 -0
  48. package/dist/commands/review-note.js.map +1 -0
  49. package/dist/commands/review-owner.d.ts +5 -0
  50. package/dist/commands/review-owner.d.ts.map +1 -0
  51. package/dist/commands/review-owner.js +130 -0
  52. package/dist/commands/review-owner.js.map +1 -0
  53. package/dist/commands/review-rate-limit.d.ts +5 -0
  54. package/dist/commands/review-rate-limit.d.ts.map +1 -0
  55. package/dist/commands/review-rate-limit.js +131 -0
  56. package/dist/commands/review-rate-limit.js.map +1 -0
  57. package/dist/commands/review-skip-rule.d.ts +5 -0
  58. package/dist/commands/review-skip-rule.d.ts.map +1 -0
  59. package/dist/commands/review-skip-rule.js +106 -0
  60. package/dist/commands/review-skip-rule.js.map +1 -0
  61. package/dist/commands/review-snapshot-diff.d.ts +5 -0
  62. package/dist/commands/review-snapshot-diff.d.ts.map +1 -0
  63. package/dist/commands/review-snapshot-diff.js +101 -0
  64. package/dist/commands/review-snapshot-diff.js.map +1 -0
  65. package/dist/commands/review-timeline.d.ts +5 -0
  66. package/dist/commands/review-timeline.d.ts.map +1 -0
  67. package/dist/commands/review-timeline.js +77 -0
  68. package/dist/commands/review-timeline.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Finding-category — Categorize findings into custom groups.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const CAT_FILE = ".judges/finding-categories.json";
8
+ function loadStore() {
9
+ if (!existsSync(CAT_FILE))
10
+ return { version: "1.0.0", mappings: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(CAT_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", mappings: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(CAT_FILE), { recursive: true });
20
+ writeFileSync(CAT_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── CLI ────────────────────────────────────────────────────────────────────
23
+ export function runFindingCategory(argv) {
24
+ if (argv.includes("--help") || argv.includes("-h")) {
25
+ console.log(`
26
+ judges finding-category — Categorize findings into custom groups
27
+
28
+ Usage:
29
+ judges finding-category set --rule SEC-001 --category "auth"
30
+ judges finding-category list
31
+ judges finding-category list --category "auth"
32
+ judges finding-category remove --rule SEC-001
33
+ judges finding-category clear
34
+
35
+ Subcommands:
36
+ set Set category for a rule
37
+ list List all mappings
38
+ remove Remove a mapping
39
+ clear Clear all mappings
40
+
41
+ Options:
42
+ --rule <id> Rule ID
43
+ --category <name> Category name
44
+ --format json JSON output
45
+ --help, -h Show this help
46
+
47
+ Mappings stored in .judges/finding-categories.json.
48
+ `);
49
+ return;
50
+ }
51
+ const subcommand = argv.find((a) => ["set", "list", "remove", "clear"].includes(a));
52
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
53
+ const store = loadStore();
54
+ if (subcommand === "set") {
55
+ const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule") || "";
56
+ const category = argv.find((_a, i) => argv[i - 1] === "--category") || "";
57
+ if (!ruleId || !category) {
58
+ console.log("Specify --rule and --category.");
59
+ return;
60
+ }
61
+ const existing = store.mappings.find((m) => m.ruleId === ruleId);
62
+ if (existing) {
63
+ existing.category = category;
64
+ }
65
+ else {
66
+ store.mappings.push({ ruleId, category });
67
+ }
68
+ saveStore(store);
69
+ console.log(`${ruleId} → category "${category}"`);
70
+ return;
71
+ }
72
+ if (subcommand === "remove") {
73
+ const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule") || "";
74
+ const before = store.mappings.length;
75
+ store.mappings = store.mappings.filter((m) => m.ruleId !== ruleId);
76
+ saveStore(store);
77
+ console.log(before > store.mappings.length ? `Removed ${ruleId}.` : `${ruleId} not found.`);
78
+ return;
79
+ }
80
+ if (subcommand === "clear") {
81
+ saveStore({ version: "1.0.0", mappings: [] });
82
+ console.log("Category mappings cleared.");
83
+ return;
84
+ }
85
+ // Default: list
86
+ const categoryFilter = argv.find((_a, i) => argv[i - 1] === "--category") || "";
87
+ const mappings = categoryFilter ? store.mappings.filter((m) => m.category === categoryFilter) : store.mappings;
88
+ if (mappings.length === 0) {
89
+ console.log("No category mappings.");
90
+ return;
91
+ }
92
+ if (format === "json") {
93
+ console.log(JSON.stringify(mappings, null, 2));
94
+ return;
95
+ }
96
+ // Group by category
97
+ const groups = new Map();
98
+ for (const m of mappings) {
99
+ const list = groups.get(m.category) || [];
100
+ list.push(m.ruleId);
101
+ groups.set(m.category, list);
102
+ }
103
+ console.log("\nFinding Categories:");
104
+ console.log("─".repeat(40));
105
+ for (const [cat, rules] of groups) {
106
+ console.log(` ${cat}: ${rules.join(", ")}`);
107
+ }
108
+ console.log("─".repeat(40));
109
+ }
110
+ //# sourceMappingURL=finding-category.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-category.js","sourceRoot":"","sources":["../../src/commands/finding-category.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-confidence-filter — Filter findings by confidence level.
3
+ */
4
+ export declare function runFindingConfidenceFilter(argv: string[]): void;
5
+ //# sourceMappingURL=finding-confidence-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-confidence-filter.d.ts","sourceRoot":"","sources":["../../src/commands/finding-confidence-filter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0F/D"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Finding-confidence-filter — Filter findings by confidence level.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingConfidenceFilter(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h")) {
8
+ console.log(`
9
+ judges finding-confidence-filter — Filter findings by confidence level
10
+
11
+ Usage:
12
+ judges finding-confidence-filter --file results.json --min 0.8
13
+ judges finding-confidence-filter --file results.json --tier high
14
+ judges finding-confidence-filter --file results.json --min 0.5 --max 0.9
15
+
16
+ Options:
17
+ --file <path> Path to review result JSON
18
+ --min <n> Minimum confidence (0.0–1.0)
19
+ --max <n> Maximum confidence (0.0–1.0)
20
+ --tier <level> Filter by tier: high, medium, low
21
+ --format json JSON output
22
+ --help, -h Show this help
23
+
24
+ Filters findings from a review result file based on confidence scores.
25
+ `);
26
+ return;
27
+ }
28
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
29
+ const filePath = argv.find((_a, i) => argv[i - 1] === "--file") || "";
30
+ const minConf = parseFloat(argv.find((_a, i) => argv[i - 1] === "--min") || "0");
31
+ const maxConf = parseFloat(argv.find((_a, i) => argv[i - 1] === "--max") || "1");
32
+ const tier = argv.find((_a, i) => argv[i - 1] === "--tier") || "";
33
+ if (!filePath) {
34
+ console.log("Specify --file <path> to a review result JSON.");
35
+ return;
36
+ }
37
+ if (!existsSync(filePath)) {
38
+ console.log(`File not found: ${filePath}`);
39
+ return;
40
+ }
41
+ let data;
42
+ try {
43
+ data = JSON.parse(readFileSync(filePath, "utf-8"));
44
+ }
45
+ catch {
46
+ console.log(`Failed to parse: ${filePath}`);
47
+ return;
48
+ }
49
+ const findings = Array.isArray(data.findings) ? data.findings : [];
50
+ const filtered = findings.filter((f) => {
51
+ const finding = f;
52
+ const conf = typeof finding.confidence === "number" ? finding.confidence : 0.5;
53
+ if (tier) {
54
+ const fTier = typeof finding.confidenceTier === "string" ? finding.confidenceTier : "";
55
+ return fTier.toLowerCase() === tier.toLowerCase();
56
+ }
57
+ return conf >= minConf && conf <= maxConf;
58
+ });
59
+ if (format === "json") {
60
+ console.log(JSON.stringify({ total: findings.length, filtered: filtered.length, findings: filtered }, null, 2));
61
+ return;
62
+ }
63
+ console.log(`\nConfidence Filter: ${filtered.length} of ${findings.length} findings`);
64
+ if (tier)
65
+ console.log(` Tier: ${tier}`);
66
+ else
67
+ console.log(` Range: ${minConf.toFixed(1)} – ${maxConf.toFixed(1)}`);
68
+ console.log("─".repeat(60));
69
+ for (const f of filtered) {
70
+ const conf = typeof f.confidence === "number" ? f.confidence.toFixed(2) : "?";
71
+ console.log(` [${String(f.severity || "?").toUpperCase()}] ${f.ruleId || ""} — ${f.title || "untitled"} (conf=${conf})`);
72
+ }
73
+ if (filtered.length === 0) {
74
+ console.log(" No findings match the filter.");
75
+ }
76
+ console.log("─".repeat(60));
77
+ }
78
+ //# sourceMappingURL=finding-confidence-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-confidence-filter.js","sourceRoot":"","sources":["../../src/commands/finding-confidence-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-export-csv — Export findings as CSV.
3
+ */
4
+ export declare function runFindingExportCsv(argv: string[]): void;
5
+ //# sourceMappingURL=finding-export-csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-export-csv.d.ts","sourceRoot":"","sources":["../../src/commands/finding-export-csv.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkFxD"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Finding-export-csv — Export findings as CSV.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingExportCsv(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h")) {
8
+ console.log(`
9
+ judges finding-export-csv — Export findings as CSV
10
+
11
+ Usage:
12
+ judges finding-export-csv --file results.json
13
+ judges finding-export-csv --file results.json --out findings.csv
14
+
15
+ Options:
16
+ --file <path> Path to review result JSON
17
+ --out <path> Output CSV file (default: stdout)
18
+ --format json JSON output (metadata only)
19
+ --help, -h Show this help
20
+
21
+ Exports findings from a review result JSON file as CSV format.
22
+ `);
23
+ return;
24
+ }
25
+ const filePath = argv.find((_a, i) => argv[i - 1] === "--file") || "";
26
+ const outPath = argv.find((_a, i) => argv[i - 1] === "--out") || "";
27
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
28
+ if (!filePath) {
29
+ console.log("Specify --file <path> to a review result JSON.");
30
+ return;
31
+ }
32
+ if (!existsSync(filePath)) {
33
+ console.log(`File not found: ${filePath}`);
34
+ return;
35
+ }
36
+ let data;
37
+ try {
38
+ data = JSON.parse(readFileSync(filePath, "utf-8"));
39
+ }
40
+ catch {
41
+ console.log(`Failed to parse: ${filePath}`);
42
+ return;
43
+ }
44
+ const findings = Array.isArray(data.findings) ? data.findings : [];
45
+ if (findings.length === 0) {
46
+ console.log("No findings to export.");
47
+ return;
48
+ }
49
+ // Build CSV
50
+ const headers = ["ruleId", "severity", "title", "description", "confidence", "recommendation"];
51
+ const rows = [headers.join(",")];
52
+ for (const f of findings) {
53
+ if (typeof f !== "object" || !f)
54
+ continue;
55
+ const record = f;
56
+ const row = headers.map((h) => {
57
+ const val = record[h];
58
+ const str = val !== null && val !== undefined ? String(val) : "";
59
+ // Escape CSV: quote if contains comma, newline, or double-quote
60
+ if (str.includes(",") || str.includes("\n") || str.includes('"')) {
61
+ return `"${str.replace(/"/g, '""')}"`;
62
+ }
63
+ return str;
64
+ });
65
+ rows.push(row.join(","));
66
+ }
67
+ const csv = rows.join("\n");
68
+ if (outPath) {
69
+ writeFileSync(outPath, csv, "utf-8");
70
+ console.log(`Exported ${findings.length} findings to ${outPath}`);
71
+ return;
72
+ }
73
+ if (format === "json") {
74
+ console.log(JSON.stringify({ findingCount: findings.length, columns: headers }, null, 2));
75
+ return;
76
+ }
77
+ console.log(csv);
78
+ }
79
+ //# sourceMappingURL=finding-export-csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-export-csv.js","sourceRoot":"","sources":["../../src/commands/finding-export-csv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-priority-queue — Queue findings by priority for resolution.
3
+ */
4
+ export declare function runFindingPriorityQueue(argv: string[]): void;
5
+ //# sourceMappingURL=finding-priority-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-priority-queue.d.ts","sourceRoot":"","sources":["../../src/commands/finding-priority-queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6CH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiH5D"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Finding-priority-queue — Queue findings by priority for resolution.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const QUEUE_FILE = ".judges/priority-queue.json";
8
+ function loadStore() {
9
+ if (!existsSync(QUEUE_FILE))
10
+ return { version: "1.0.0", entries: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(QUEUE_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", entries: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(QUEUE_FILE), { recursive: true });
20
+ writeFileSync(QUEUE_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ function generateId() {
23
+ return `pq-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
24
+ }
25
+ // ─── CLI ────────────────────────────────────────────────────────────────────
26
+ export function runFindingPriorityQueue(argv) {
27
+ if (argv.includes("--help") || argv.includes("-h")) {
28
+ console.log(`
29
+ judges finding-priority-queue — Queue findings by priority
30
+
31
+ Usage:
32
+ judges finding-priority-queue add --rule SEC-001 --title "XSS risk" --priority 1
33
+ judges finding-priority-queue list
34
+ judges finding-priority-queue next
35
+ judges finding-priority-queue done --id <id>
36
+ judges finding-priority-queue remove --id <id>
37
+ judges finding-priority-queue clear
38
+
39
+ Subcommands:
40
+ add Add finding to queue
41
+ list List queued findings (sorted by priority)
42
+ next Show the next highest-priority item
43
+ done Mark an item as done
44
+ remove Remove from queue
45
+ clear Clear queue
46
+
47
+ Options:
48
+ --rule <id> Rule ID
49
+ --title <text> Finding title
50
+ --priority <n> Priority (1=highest)
51
+ --format json JSON output
52
+ --help, -h Show this help
53
+
54
+ Queue stored in .judges/priority-queue.json.
55
+ `);
56
+ return;
57
+ }
58
+ const subcommand = argv.find((a) => ["add", "list", "next", "done", "remove", "clear"].includes(a));
59
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
60
+ const store = loadStore();
61
+ if (subcommand === "add") {
62
+ const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule") || "";
63
+ const title = argv.find((_a, i) => argv[i - 1] === "--title") || "";
64
+ const priority = parseInt(argv.find((_a, i) => argv[i - 1] === "--priority") || "5", 10);
65
+ store.entries.push({
66
+ id: generateId(),
67
+ ruleId,
68
+ title,
69
+ priority,
70
+ addedAt: new Date().toISOString(),
71
+ status: "queued",
72
+ });
73
+ store.entries.sort((a, b) => a.priority - b.priority);
74
+ saveStore(store);
75
+ console.log(`Queued: ${ruleId} — ${title} (priority=${priority})`);
76
+ return;
77
+ }
78
+ if (subcommand === "next") {
79
+ const next = store.entries.find((e) => e.status === "queued");
80
+ if (!next) {
81
+ console.log("Queue is empty.");
82
+ return;
83
+ }
84
+ next.status = "in-progress";
85
+ saveStore(store);
86
+ console.log(`Next: ${next.id} ${next.ruleId} — ${next.title} (priority=${next.priority})`);
87
+ return;
88
+ }
89
+ if (subcommand === "done") {
90
+ const id = argv.find((_a, i) => argv[i - 1] === "--id") || "";
91
+ const entry = store.entries.find((e) => e.id === id);
92
+ if (!entry) {
93
+ console.log(`${id} not found.`);
94
+ return;
95
+ }
96
+ entry.status = "done";
97
+ saveStore(store);
98
+ console.log(`Done: ${entry.ruleId} — ${entry.title}`);
99
+ return;
100
+ }
101
+ if (subcommand === "remove") {
102
+ const id = argv.find((_a, i) => argv[i - 1] === "--id") || "";
103
+ const before = store.entries.length;
104
+ store.entries = store.entries.filter((e) => e.id !== id);
105
+ saveStore(store);
106
+ console.log(before > store.entries.length ? `Removed ${id}.` : `${id} not found.`);
107
+ return;
108
+ }
109
+ if (subcommand === "clear") {
110
+ saveStore({ version: "1.0.0", entries: [] });
111
+ console.log("Priority queue cleared.");
112
+ return;
113
+ }
114
+ // Default: list
115
+ if (store.entries.length === 0) {
116
+ console.log("Priority queue is empty.");
117
+ return;
118
+ }
119
+ const queued = store.entries.filter((e) => e.status !== "done");
120
+ if (format === "json") {
121
+ console.log(JSON.stringify(queued, null, 2));
122
+ return;
123
+ }
124
+ console.log(`\nPriority Queue (${queued.length} active):`);
125
+ console.log("─".repeat(60));
126
+ for (const e of queued) {
127
+ const marker = e.status === "in-progress" ? ">>>" : " ";
128
+ console.log(` ${marker} P${e.priority} ${e.id} ${e.ruleId} — ${e.title} [${e.status}]`);
129
+ }
130
+ console.log("─".repeat(60));
131
+ }
132
+ //# sourceMappingURL=finding-priority-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-priority-queue.js","sourceRoot":"","sources":["../../src/commands/finding-priority-queue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAkB/B,+EAA+E;AAE/E,MAAM,UAAU,GAAG,6BAA6B,CAAC;AAEjD,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACtE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAe,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAiB;IAClC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,uBAAuB,CAAC,IAAc;IACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Bf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,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;IAC1F,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAE1B,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpF,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACpF,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAEzG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACjB,EAAE,EAAE,UAAU,EAAE;YAChB,MAAM;YACN,KAAK;YACL,QAAQ;YACR,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtD,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,MAAM,KAAK,cAAc,QAAQ,GAAG,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;QAC5B,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK,cAAc,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC5F,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACtB,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACpC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAChE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,MAAM,WAAW,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-remediation-plan — Generate remediation plans for findings.
3
+ */
4
+ export declare function runFindingRemediationPlan(argv: string[]): void;
5
+ //# sourceMappingURL=finding-remediation-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-remediation-plan.d.ts","sourceRoot":"","sources":["../../src/commands/finding-remediation-plan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiCH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiG9D"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Finding-remediation-plan — Generate remediation plans for findings.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Helpers ────────────────────────────────────────────────────────────────
6
+ function estimateEffort(severity) {
7
+ switch (severity.toLowerCase()) {
8
+ case "critical":
9
+ return "immediate";
10
+ case "high":
11
+ return "1-2 days";
12
+ case "medium":
13
+ return "3-5 days";
14
+ case "low":
15
+ return "backlog";
16
+ default:
17
+ return "unknown";
18
+ }
19
+ }
20
+ // ─── CLI ────────────────────────────────────────────────────────────────────
21
+ export function runFindingRemediationPlan(argv) {
22
+ if (argv.includes("--help") || argv.includes("-h")) {
23
+ console.log(`
24
+ judges finding-remediation-plan — Generate remediation plans
25
+
26
+ Usage:
27
+ judges finding-remediation-plan --file results.json
28
+ judges finding-remediation-plan --file results.json --min-severity high
29
+
30
+ Options:
31
+ --file <path> Path to review result JSON
32
+ --min-severity <s> Minimum severity to include (critical, high, medium, low)
33
+ --format json JSON output
34
+ --help, -h Show this help
35
+
36
+ Generates a prioritized remediation plan from review findings.
37
+ `);
38
+ return;
39
+ }
40
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
41
+ const filePath = argv.find((_a, i) => argv[i - 1] === "--file") || "";
42
+ const minSeverity = argv.find((_a, i) => argv[i - 1] === "--min-severity") || "";
43
+ if (!filePath) {
44
+ console.log("Specify --file <path> to a review result JSON.");
45
+ return;
46
+ }
47
+ if (!existsSync(filePath)) {
48
+ console.log(`File not found: ${filePath}`);
49
+ return;
50
+ }
51
+ let data;
52
+ try {
53
+ data = JSON.parse(readFileSync(filePath, "utf-8"));
54
+ }
55
+ catch {
56
+ console.log(`Failed to parse: ${filePath}`);
57
+ return;
58
+ }
59
+ const findings = Array.isArray(data.findings) ? data.findings : [];
60
+ const severityOrder = ["critical", "high", "medium", "low", "info"];
61
+ const minIdx = minSeverity ? severityOrder.indexOf(minSeverity.toLowerCase()) : severityOrder.length - 1;
62
+ const items = [];
63
+ for (const f of findings) {
64
+ if (typeof f !== "object" || !f)
65
+ continue;
66
+ const record = f;
67
+ const severity = typeof record.severity === "string" ? record.severity.toLowerCase() : "medium";
68
+ const sevIdx = severityOrder.indexOf(severity);
69
+ if (sevIdx > minIdx)
70
+ continue;
71
+ items.push({
72
+ ruleId: typeof record.ruleId === "string" ? record.ruleId : "",
73
+ severity,
74
+ title: typeof record.title === "string" ? record.title : "",
75
+ recommendation: typeof record.recommendation === "string" ? record.recommendation : "",
76
+ effort: estimateEffort(severity),
77
+ });
78
+ }
79
+ // Sort by severity
80
+ items.sort((a, b) => severityOrder.indexOf(a.severity) - severityOrder.indexOf(b.severity));
81
+ if (format === "json") {
82
+ console.log(JSON.stringify({ totalFindings: findings.length, planItems: items.length, items }, null, 2));
83
+ return;
84
+ }
85
+ if (items.length === 0) {
86
+ console.log("No findings match the criteria.");
87
+ return;
88
+ }
89
+ console.log("\nRemediation Plan:");
90
+ console.log("═".repeat(65));
91
+ let phase = 0;
92
+ let lastSeverity = "";
93
+ for (const item of items) {
94
+ if (item.severity !== lastSeverity) {
95
+ phase++;
96
+ lastSeverity = item.severity;
97
+ console.log(`\n Phase ${phase}: ${item.severity.toUpperCase()} (${item.effort})`);
98
+ console.log(" " + "─".repeat(50));
99
+ }
100
+ console.log(` ${item.ruleId}: ${item.title}`);
101
+ if (item.recommendation) {
102
+ console.log(` → ${item.recommendation.slice(0, 80)}`);
103
+ }
104
+ }
105
+ console.log("\n═".repeat(65));
106
+ console.log(`${items.length} items across ${phase} phases.`);
107
+ }
108
+ //# sourceMappingURL=finding-remediation-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-remediation-plan.js","sourceRoot":"","sources":["../../src/commands/finding-remediation-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-resolution — Track finding resolution status.
3
+ */
4
+ export declare function runFindingResolution(argv: string[]): void;
5
+ //# sourceMappingURL=finding-resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-resolution.d.ts","sourceRoot":"","sources":["../../src/commands/finding-resolution.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkDH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2HzD"}