@kevinrabun/judges 3.93.0 → 3.94.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 (42) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +63 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-code-context.d.ts +5 -0
  6. package/dist/commands/finding-code-context.d.ts.map +1 -0
  7. package/dist/commands/finding-code-context.js +97 -0
  8. package/dist/commands/finding-code-context.js.map +1 -0
  9. package/dist/commands/finding-explain.d.ts +5 -0
  10. package/dist/commands/finding-explain.d.ts.map +1 -0
  11. package/dist/commands/finding-explain.js +94 -0
  12. package/dist/commands/finding-explain.js.map +1 -0
  13. package/dist/commands/finding-filter-view.d.ts +5 -0
  14. package/dist/commands/finding-filter-view.d.ts.map +1 -0
  15. package/dist/commands/finding-filter-view.js +108 -0
  16. package/dist/commands/finding-filter-view.js.map +1 -0
  17. package/dist/commands/finding-resolution-track.d.ts +5 -0
  18. package/dist/commands/finding-resolution-track.d.ts.map +1 -0
  19. package/dist/commands/finding-resolution-track.js +151 -0
  20. package/dist/commands/finding-resolution-track.js.map +1 -0
  21. package/dist/commands/review-ide-sync.d.ts +5 -0
  22. package/dist/commands/review-ide-sync.d.ts.map +1 -0
  23. package/dist/commands/review-ide-sync.js +92 -0
  24. package/dist/commands/review-ide-sync.js.map +1 -0
  25. package/dist/commands/review-interactive.d.ts +5 -0
  26. package/dist/commands/review-interactive.d.ts.map +1 -0
  27. package/dist/commands/review-interactive.js +86 -0
  28. package/dist/commands/review-interactive.js.map +1 -0
  29. package/dist/commands/review-onboard-checklist.d.ts +5 -0
  30. package/dist/commands/review-onboard-checklist.d.ts.map +1 -0
  31. package/dist/commands/review-onboard-checklist.js +120 -0
  32. package/dist/commands/review-onboard-checklist.js.map +1 -0
  33. package/dist/commands/review-quickstart.d.ts +5 -0
  34. package/dist/commands/review-quickstart.d.ts.map +1 -0
  35. package/dist/commands/review-quickstart.js +108 -0
  36. package/dist/commands/review-quickstart.js.map +1 -0
  37. package/dist/commands/review-tenant-config.d.ts +5 -0
  38. package/dist/commands/review-tenant-config.d.ts.map +1 -0
  39. package/dist/commands/review-tenant-config.js +117 -0
  40. package/dist/commands/review-tenant-config.js.map +1 -0
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-code-context — Show surrounding code context for each finding.
3
+ */
4
+ export declare function runFindingCodeContext(argv: string[]): void;
5
+ //# sourceMappingURL=finding-code-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-code-context.d.ts","sourceRoot":"","sources":["../../src/commands/finding-code-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuCH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkF1D"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Finding-code-context — Show surrounding code context for each finding.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ function extractContext(sourceFile, lineNumbers, contextLines) {
6
+ if (!existsSync(sourceFile)) {
7
+ return [`(source file not found: ${sourceFile})`];
8
+ }
9
+ const allLines = readFileSync(sourceFile, "utf-8").split("\n");
10
+ const result = [];
11
+ for (const ln of lineNumbers) {
12
+ const start = Math.max(0, ln - contextLines - 1);
13
+ const end = Math.min(allLines.length, ln + contextLines);
14
+ result.push(`--- Line ${ln} ---`);
15
+ for (let i = start; i < end; i++) {
16
+ const marker = i === ln - 1 ? ">>>" : " ";
17
+ result.push(`${marker} ${String(i + 1).padStart(4)}: ${allLines[i]}`);
18
+ }
19
+ }
20
+ return result;
21
+ }
22
+ // ─── CLI ────────────────────────────────────────────────────────────────────
23
+ export function runFindingCodeContext(argv) {
24
+ const fileIdx = argv.indexOf("--file");
25
+ const sourceIdx = argv.indexOf("--source");
26
+ const linesIdx = argv.indexOf("--context-lines");
27
+ const formatIdx = argv.indexOf("--format");
28
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
29
+ const sourceFile = sourceIdx >= 0 ? argv[sourceIdx + 1] : undefined;
30
+ const contextLines = linesIdx >= 0 ? parseInt(argv[linesIdx + 1], 10) : 3;
31
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
32
+ if (argv.includes("--help") || argv.includes("-h")) {
33
+ console.log(`
34
+ judges finding-code-context — Show code context for findings
35
+
36
+ Usage:
37
+ judges finding-code-context --file <review.json> --source <file>
38
+ [--context-lines <n>] [--format table|json]
39
+
40
+ Options:
41
+ --file <path> Review result JSON file
42
+ --source <file> Original source code file
43
+ --context-lines <n> Lines of context around finding (default: 3)
44
+ --format <fmt> Output format: table (default), json
45
+ --help, -h Show this help
46
+ `);
47
+ return;
48
+ }
49
+ if (!filePath) {
50
+ console.error("Error: --file is required");
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ if (!existsSync(filePath)) {
55
+ console.error(`Error: file not found: ${filePath}`);
56
+ process.exitCode = 1;
57
+ return;
58
+ }
59
+ let verdict;
60
+ try {
61
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
62
+ }
63
+ catch {
64
+ console.error(`Error: failed to parse review file: ${filePath}`);
65
+ process.exitCode = 1;
66
+ return;
67
+ }
68
+ const findings = verdict.findings.filter((f) => f.lineNumbers !== undefined && f.lineNumbers.length > 0);
69
+ const result = findings.map((f) => ({
70
+ ruleId: f.ruleId,
71
+ severity: f.severity,
72
+ title: f.title,
73
+ lineNumbers: f.lineNumbers !== undefined ? f.lineNumbers : [],
74
+ context: sourceFile
75
+ ? extractContext(sourceFile, f.lineNumbers !== undefined ? f.lineNumbers : [], contextLines)
76
+ : ["(no --source provided)"],
77
+ recommendation: f.recommendation,
78
+ }));
79
+ if (format === "json") {
80
+ console.log(JSON.stringify(result, null, 2));
81
+ return;
82
+ }
83
+ console.log(`\nCode Context: ${result.length} finding(s) with line references`);
84
+ console.log("═".repeat(70));
85
+ for (const item of result) {
86
+ console.log(`\n── ${item.ruleId} [${item.severity}] ──`);
87
+ console.log(` ${item.title}`);
88
+ if (item.context.length > 0) {
89
+ for (const line of item.context) {
90
+ console.log(` ${line}`);
91
+ }
92
+ }
93
+ console.log(` Fix: ${item.recommendation}`);
94
+ }
95
+ console.log("\n" + "═".repeat(70));
96
+ }
97
+ //# sourceMappingURL=finding-code-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-code-context.js","sourceRoot":"","sources":["../../src/commands/finding-code-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-explain — Explain findings in natural language with context and examples.
3
+ */
4
+ export declare function runFindingExplain(argv: string[]): void;
5
+ //# sourceMappingURL=finding-explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-explain.d.ts","sourceRoot":"","sources":["../../src/commands/finding-explain.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+CH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuEtD"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Finding-explain — Explain findings in natural language with context and examples.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ import { defaultRegistry } from "../judge-registry.js";
6
+ function explainFinding(f) {
7
+ const judges = defaultRegistry.getJudges();
8
+ const prefix = f.ruleId.split("-")[0];
9
+ const judge = judges.find((j) => j.rulePrefix === prefix);
10
+ const domain = judge !== undefined ? judge.domain : "general";
11
+ const impactMap = {
12
+ critical: "Immediate risk — can lead to security breach, data loss, or system failure",
13
+ high: "Significant risk — may cause serious issues if left unaddressed",
14
+ medium: "Moderate concern — should be addressed in normal development cycle",
15
+ low: "Minor concern — consider fixing during refactoring",
16
+ info: "Informational — awareness item with no immediate risk",
17
+ };
18
+ return {
19
+ ruleId: f.ruleId,
20
+ severity: f.severity,
21
+ title: f.title,
22
+ why: f.description,
23
+ impact: impactMap[f.severity] !== undefined ? impactMap[f.severity] : "Unknown impact level",
24
+ howToFix: f.recommendation,
25
+ example: f.suggestedFix !== undefined ? f.suggestedFix : "No code example available — see recommendation above.",
26
+ judgeDomain: domain,
27
+ };
28
+ }
29
+ // ─── CLI ────────────────────────────────────────────────────────────────────
30
+ export function runFindingExplain(argv) {
31
+ const fileIdx = argv.indexOf("--file");
32
+ const ruleIdx = argv.indexOf("--rule");
33
+ const formatIdx = argv.indexOf("--format");
34
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
35
+ const ruleFilter = ruleIdx >= 0 ? argv[ruleIdx + 1] : undefined;
36
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
37
+ if (argv.includes("--help") || argv.includes("-h")) {
38
+ console.log(`
39
+ judges finding-explain — Explain findings in detail
40
+
41
+ Usage:
42
+ judges finding-explain --file <review.json> [--rule <ruleId>]
43
+ [--format table|json]
44
+
45
+ Options:
46
+ --file <path> Review result JSON file
47
+ --rule <id> Filter to specific rule ID
48
+ --format <fmt> Output format: table (default), json
49
+ --help, -h Show this help
50
+ `);
51
+ return;
52
+ }
53
+ if (!filePath) {
54
+ console.error("Error: --file is required");
55
+ process.exitCode = 1;
56
+ return;
57
+ }
58
+ if (!existsSync(filePath)) {
59
+ console.error(`Error: file not found: ${filePath}`);
60
+ process.exitCode = 1;
61
+ return;
62
+ }
63
+ let verdict;
64
+ try {
65
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
66
+ }
67
+ catch {
68
+ console.error(`Error: failed to parse review file: ${filePath}`);
69
+ process.exitCode = 1;
70
+ return;
71
+ }
72
+ let findings = verdict.findings;
73
+ if (ruleFilter) {
74
+ findings = findings.filter((f) => f.ruleId === ruleFilter);
75
+ }
76
+ const explanations = findings.map((f) => explainFinding(f));
77
+ if (format === "json") {
78
+ console.log(JSON.stringify(explanations, null, 2));
79
+ return;
80
+ }
81
+ console.log(`\nFinding Explanations: ${explanations.length} finding(s)`);
82
+ console.log("═".repeat(65));
83
+ for (const exp of explanations) {
84
+ console.log(`\n── ${exp.ruleId} [${exp.severity}] ──`);
85
+ console.log(` Title: ${exp.title}`);
86
+ console.log(` Domain: ${exp.judgeDomain}`);
87
+ console.log(` Why: ${exp.why}`);
88
+ console.log(` Impact: ${exp.impact}`);
89
+ console.log(` Fix: ${exp.howToFix}`);
90
+ console.log(` Example: ${exp.example}`);
91
+ }
92
+ console.log("\n" + "═".repeat(65));
93
+ }
94
+ //# sourceMappingURL=finding-explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-explain.js","sourceRoot":"","sources":["../../src/commands/finding-explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-filter-view — Filter and view findings by multiple criteria.
3
+ */
4
+ export declare function runFindingFilterView(argv: string[]): void;
5
+ //# sourceMappingURL=finding-filter-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-filter-view.d.ts","sourceRoot":"","sources":["../../src/commands/finding-filter-view.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkHzD"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Finding-filter-view — Filter and view findings by multiple criteria.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingFilterView(argv) {
7
+ const fileIdx = argv.indexOf("--file");
8
+ const severityIdx = argv.indexOf("--severity");
9
+ const ruleIdx = argv.indexOf("--rule");
10
+ const minConfIdx = argv.indexOf("--min-confidence");
11
+ const lineIdx = argv.indexOf("--line-range");
12
+ const formatIdx = argv.indexOf("--format");
13
+ const limitIdx = argv.indexOf("--limit");
14
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
15
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
16
+ if (argv.includes("--help") || argv.includes("-h")) {
17
+ console.log(`
18
+ judges finding-filter-view — Filter findings by multiple criteria
19
+
20
+ Usage:
21
+ judges finding-filter-view --file <review.json> [options]
22
+
23
+ Options:
24
+ --file <path> Review result JSON file
25
+ --severity <level> Filter by severity (critical, high, medium, low, info)
26
+ --rule <prefix> Filter by rule ID prefix
27
+ --min-confidence <n> Minimum confidence (0.0-1.0)
28
+ --line-range <s-e> Filter by line range (e.g., 10-50)
29
+ --limit <n> Maximum findings to show
30
+ --format <fmt> Output format: table (default), json
31
+ --help, -h Show this help
32
+ `);
33
+ return;
34
+ }
35
+ if (!filePath) {
36
+ console.error("Error: --file is required");
37
+ process.exitCode = 1;
38
+ return;
39
+ }
40
+ if (!existsSync(filePath)) {
41
+ console.error(`Error: file not found: ${filePath}`);
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ let verdict;
46
+ try {
47
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
48
+ }
49
+ catch {
50
+ console.error(`Error: failed to parse review file: ${filePath}`);
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ let findings = [...verdict.findings];
55
+ // Apply severity filter
56
+ if (severityIdx >= 0) {
57
+ const sev = argv[severityIdx + 1];
58
+ findings = findings.filter((f) => f.severity === sev);
59
+ }
60
+ // Apply rule prefix filter
61
+ if (ruleIdx >= 0) {
62
+ const prefix = argv[ruleIdx + 1];
63
+ findings = findings.filter((f) => f.ruleId.startsWith(prefix));
64
+ }
65
+ // Apply min confidence filter
66
+ if (minConfIdx >= 0) {
67
+ const minConf = parseFloat(argv[minConfIdx + 1]);
68
+ findings = findings.filter((f) => f.confidence !== undefined && f.confidence >= minConf);
69
+ }
70
+ // Apply line range filter
71
+ if (lineIdx >= 0) {
72
+ const rangeStr = argv[lineIdx + 1];
73
+ const parts = rangeStr.split("-");
74
+ if (parts.length === 2) {
75
+ const start = parseInt(parts[0], 10);
76
+ const end = parseInt(parts[1], 10);
77
+ findings = findings.filter((f) => {
78
+ if (f.lineNumbers === undefined || f.lineNumbers.length === 0)
79
+ return false;
80
+ return f.lineNumbers.some((ln) => ln >= start && ln <= end);
81
+ });
82
+ }
83
+ }
84
+ // Apply limit
85
+ if (limitIdx >= 0) {
86
+ const limit = parseInt(argv[limitIdx + 1], 10);
87
+ findings = findings.slice(0, limit);
88
+ }
89
+ if (format === "json") {
90
+ console.log(JSON.stringify({ total: findings.length, findings }, null, 2));
91
+ return;
92
+ }
93
+ console.log(`\nFiltered Findings: ${findings.length} of ${verdict.findings.length}`);
94
+ console.log("═".repeat(70));
95
+ if (findings.length === 0) {
96
+ console.log(" No findings match the current filters.");
97
+ console.log("═".repeat(70));
98
+ return;
99
+ }
100
+ for (const f of findings) {
101
+ const conf = f.confidence !== undefined ? ` (${(f.confidence * 100).toFixed(0)}%)` : "";
102
+ const lines = f.lineNumbers !== undefined && f.lineNumbers.length > 0 ? ` L${f.lineNumbers.join(",")}` : "";
103
+ console.log(` [${f.severity.toUpperCase().padEnd(8)}] ${f.ruleId}${lines}${conf}`);
104
+ console.log(` ${f.title}`);
105
+ }
106
+ console.log("═".repeat(70));
107
+ }
108
+ //# sourceMappingURL=finding-filter-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-filter-view.js","sourceRoot":"","sources":["../../src/commands/finding-filter-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-resolution-track — Track finding resolution status over time.
3
+ */
4
+ export declare function runFindingResolutionTrack(argv: string[]): void;
5
+ //# sourceMappingURL=finding-resolution-track.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-resolution-track.d.ts","sourceRoot":"","sources":["../../src/commands/finding-resolution-track.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0J9D"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Finding-resolution-track — Track finding resolution status over time.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingResolutionTrack(argv) {
7
+ const fileIdx = argv.indexOf("--file");
8
+ const storeIdx = argv.indexOf("--store");
9
+ const resolveIdx = argv.indexOf("--resolve");
10
+ const deferIdx = argv.indexOf("--defer");
11
+ const wontfixIdx = argv.indexOf("--wontfix");
12
+ const formatIdx = argv.indexOf("--format");
13
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
14
+ const storePath = storeIdx >= 0 ? argv[storeIdx + 1] : ".judges-resolutions.json";
15
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
16
+ if (argv.includes("--help") || argv.includes("-h")) {
17
+ console.log(`
18
+ judges finding-resolution-track — Track finding resolution status
19
+
20
+ Usage:
21
+ judges finding-resolution-track [--file <review.json>] [--store <path>]
22
+ [--resolve <ruleId>] [--defer <ruleId>]
23
+ [--wontfix <ruleId>] [--format table|json]
24
+
25
+ Options:
26
+ --file <path> Import findings from review result
27
+ --store <path> Resolution store file (default: .judges-resolutions.json)
28
+ --resolve <ruleId> Mark a rule as resolved
29
+ --defer <ruleId> Mark a rule as deferred
30
+ --wontfix <ruleId> Mark a rule as wontfix
31
+ --format <fmt> Output format: table (default), json
32
+ --help, -h Show this help
33
+ `);
34
+ return;
35
+ }
36
+ // Load or init store
37
+ let store;
38
+ if (existsSync(storePath)) {
39
+ store = JSON.parse(readFileSync(storePath, "utf-8"));
40
+ }
41
+ else {
42
+ store = { entries: [], lastUpdated: new Date().toISOString().split("T")[0] };
43
+ }
44
+ const today = new Date().toISOString().split("T")[0];
45
+ // Mark resolved
46
+ if (resolveIdx >= 0) {
47
+ const ruleId = argv[resolveIdx + 1];
48
+ const entry = store.entries.find((e) => e.ruleId === ruleId && e.status === "open");
49
+ if (entry) {
50
+ entry.status = "resolved";
51
+ entry.resolvedAt = today;
52
+ store.lastUpdated = today;
53
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
54
+ console.log(`Marked ${ruleId} as resolved.`);
55
+ }
56
+ else {
57
+ console.error(`No open entry found for ${ruleId}`);
58
+ process.exitCode = 1;
59
+ }
60
+ return;
61
+ }
62
+ // Mark deferred
63
+ if (deferIdx >= 0) {
64
+ const ruleId = argv[deferIdx + 1];
65
+ const entry = store.entries.find((e) => e.ruleId === ruleId && e.status === "open");
66
+ if (entry) {
67
+ entry.status = "deferred";
68
+ store.lastUpdated = today;
69
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
70
+ console.log(`Marked ${ruleId} as deferred.`);
71
+ }
72
+ else {
73
+ console.error(`No open entry found for ${ruleId}`);
74
+ process.exitCode = 1;
75
+ }
76
+ return;
77
+ }
78
+ // Mark wontfix
79
+ if (wontfixIdx >= 0) {
80
+ const ruleId = argv[wontfixIdx + 1];
81
+ const entry = store.entries.find((e) => e.ruleId === ruleId && e.status === "open");
82
+ if (entry) {
83
+ entry.status = "wontfix";
84
+ store.lastUpdated = today;
85
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
86
+ console.log(`Marked ${ruleId} as wontfix.`);
87
+ }
88
+ else {
89
+ console.error(`No open entry found for ${ruleId}`);
90
+ process.exitCode = 1;
91
+ }
92
+ return;
93
+ }
94
+ // Import findings from review
95
+ if (filePath) {
96
+ if (!existsSync(filePath)) {
97
+ console.error(`Error: file not found: ${filePath}`);
98
+ process.exitCode = 1;
99
+ return;
100
+ }
101
+ let verdict;
102
+ try {
103
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
104
+ }
105
+ catch {
106
+ console.error(`Error: failed to parse review file: ${filePath}`);
107
+ process.exitCode = 1;
108
+ return;
109
+ }
110
+ let added = 0;
111
+ for (const f of verdict.findings) {
112
+ const existing = store.entries.find((e) => e.ruleId === f.ruleId && e.title === f.title);
113
+ if (existing) {
114
+ existing.lastSeen = today;
115
+ }
116
+ else {
117
+ store.entries.push({
118
+ ruleId: f.ruleId,
119
+ severity: f.severity,
120
+ title: f.title,
121
+ status: "open",
122
+ firstSeen: today,
123
+ lastSeen: today,
124
+ });
125
+ added++;
126
+ }
127
+ }
128
+ store.lastUpdated = today;
129
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
130
+ console.log(`Imported ${added} new finding(s), updated ${verdict.findings.length - added} existing.`);
131
+ return;
132
+ }
133
+ // Display current state
134
+ if (format === "json") {
135
+ console.log(JSON.stringify(store, null, 2));
136
+ return;
137
+ }
138
+ const open = store.entries.filter((e) => e.status === "open");
139
+ const resolved = store.entries.filter((e) => e.status === "resolved");
140
+ const deferred = store.entries.filter((e) => e.status === "deferred");
141
+ console.log(`\nResolution Tracking: ${store.entries.length} total`);
142
+ console.log(` Open: ${open.length} Resolved: ${resolved.length} Deferred: ${deferred.length}`);
143
+ console.log("═".repeat(65));
144
+ for (const e of store.entries) {
145
+ const statusBadge = e.status === "open" ? "[ ]" : e.status === "resolved" ? "[✓]" : e.status === "deferred" ? "[~]" : "[x]";
146
+ console.log(` ${statusBadge} ${e.ruleId.padEnd(20)} [${e.severity}] ${e.title}`);
147
+ console.log(` First: ${e.firstSeen} Last: ${e.lastSeen}${e.resolvedAt ? ` Resolved: ${e.resolvedAt}` : ""}`);
148
+ }
149
+ console.log("═".repeat(65));
150
+ }
151
+ //# sourceMappingURL=finding-resolution-track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-resolution-track.js","sourceRoot":"","sources":["../../src/commands/finding-resolution-track.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-ide-sync — Sync review results to IDE-compatible formats.
3
+ */
4
+ export declare function runReviewIdeSync(argv: string[]): void;
5
+ //# sourceMappingURL=review-ide-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-ide-sync.d.ts","sourceRoot":"","sources":["../../src/commands/review-ide-sync.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+CH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkErD"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Review-ide-sync — Sync review results to IDE-compatible formats.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ function toVscodeDiagnostics(findings, sourceFile) {
6
+ return findings.map((f) => ({
7
+ file: sourceFile,
8
+ line: f.lineNumbers !== undefined && f.lineNumbers.length > 0 ? f.lineNumbers[0] : 1,
9
+ severity: f.severity === "critical" || f.severity === "high"
10
+ ? "error"
11
+ : f.severity === "medium"
12
+ ? "warning"
13
+ : "information",
14
+ message: `${f.title}: ${f.recommendation}`,
15
+ source: "judges",
16
+ code: f.ruleId,
17
+ }));
18
+ }
19
+ function toJetbrainsDiagnostics(findings, sourceFile) {
20
+ return {
21
+ format: "jetbrains-inspections",
22
+ inspections: findings.map((f) => ({
23
+ file: sourceFile,
24
+ line: f.lineNumbers !== undefined && f.lineNumbers.length > 0 ? f.lineNumbers[0] : 1,
25
+ severity: f.severity === "critical" ? "ERROR" : f.severity === "high" ? "WARNING" : "WEAK WARNING",
26
+ description: `[${f.ruleId}] ${f.title} — ${f.recommendation}`,
27
+ category: "Judges Review",
28
+ })),
29
+ };
30
+ }
31
+ // ─── CLI ────────────────────────────────────────────────────────────────────
32
+ export function runReviewIdeSync(argv) {
33
+ const fileIdx = argv.indexOf("--file");
34
+ const targetIdx = argv.indexOf("--target");
35
+ const outputIdx = argv.indexOf("--output");
36
+ const sourceIdx = argv.indexOf("--source");
37
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
38
+ const target = targetIdx >= 0 ? argv[targetIdx + 1] : "vscode";
39
+ const outputPath = outputIdx >= 0 ? argv[outputIdx + 1] : undefined;
40
+ const sourceFile = sourceIdx >= 0 ? argv[sourceIdx + 1] : "unknown";
41
+ if (argv.includes("--help") || argv.includes("-h")) {
42
+ console.log(`
43
+ judges review-ide-sync — Sync review results to IDE format
44
+
45
+ Usage:
46
+ judges review-ide-sync --file <review.json> [--target vscode|jetbrains]
47
+ [--source <file>] [--output <path>]
48
+
49
+ Options:
50
+ --file <path> Review result JSON file
51
+ --target <ide> IDE format: vscode (default), jetbrains
52
+ --source <file> Original source file path for diagnostics
53
+ --output <path> Write output to file
54
+ --help, -h Show this help
55
+ `);
56
+ return;
57
+ }
58
+ if (!filePath) {
59
+ console.error("Error: --file is required");
60
+ process.exitCode = 1;
61
+ return;
62
+ }
63
+ if (!existsSync(filePath)) {
64
+ console.error(`Error: file not found: ${filePath}`);
65
+ process.exitCode = 1;
66
+ return;
67
+ }
68
+ let verdict;
69
+ try {
70
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
71
+ }
72
+ catch {
73
+ console.error(`Error: failed to parse review file: ${filePath}`);
74
+ process.exitCode = 1;
75
+ return;
76
+ }
77
+ let result;
78
+ if (target === "jetbrains") {
79
+ result = toJetbrainsDiagnostics(verdict.findings, sourceFile);
80
+ }
81
+ else {
82
+ result = toVscodeDiagnostics(verdict.findings, sourceFile);
83
+ }
84
+ const output = JSON.stringify(result, null, 2);
85
+ if (outputPath) {
86
+ writeFileSync(outputPath, output);
87
+ console.log(`IDE diagnostics written to ${outputPath} (${target} format)`);
88
+ return;
89
+ }
90
+ console.log(output);
91
+ }
92
+ //# sourceMappingURL=review-ide-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-ide-sync.js","sourceRoot":"","sources":["../../src/commands/review-ide-sync.ts"],"names":[],"mappings":"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"}