@kevinrabun/judges 3.71.0 → 3.73.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-deduplicate.d.ts +5 -0
  6. package/dist/commands/finding-deduplicate.d.ts.map +1 -0
  7. package/dist/commands/finding-deduplicate.js +142 -0
  8. package/dist/commands/finding-deduplicate.js.map +1 -0
  9. package/dist/commands/finding-false-positive.d.ts +5 -0
  10. package/dist/commands/finding-false-positive.d.ts.map +1 -0
  11. package/dist/commands/finding-false-positive.js +135 -0
  12. package/dist/commands/finding-false-positive.js.map +1 -0
  13. package/dist/commands/finding-link.d.ts +5 -0
  14. package/dist/commands/finding-link.d.ts.map +1 -0
  15. package/dist/commands/finding-link.js +129 -0
  16. package/dist/commands/finding-link.js.map +1 -0
  17. package/dist/commands/finding-severity-override.d.ts +5 -0
  18. package/dist/commands/finding-severity-override.d.ts.map +1 -0
  19. package/dist/commands/finding-severity-override.js +132 -0
  20. package/dist/commands/finding-severity-override.js.map +1 -0
  21. package/dist/commands/review-approval.d.ts +5 -0
  22. package/dist/commands/review-approval.d.ts.map +1 -0
  23. package/dist/commands/review-approval.js +134 -0
  24. package/dist/commands/review-approval.js.map +1 -0
  25. package/dist/commands/review-bulk-action.d.ts +5 -0
  26. package/dist/commands/review-bulk-action.d.ts.map +1 -0
  27. package/dist/commands/review-bulk-action.js +110 -0
  28. package/dist/commands/review-bulk-action.js.map +1 -0
  29. package/dist/commands/review-compare-version.d.ts +5 -0
  30. package/dist/commands/review-compare-version.d.ts.map +1 -0
  31. package/dist/commands/review-compare-version.js +109 -0
  32. package/dist/commands/review-compare-version.js.map +1 -0
  33. package/dist/commands/review-config-export.d.ts +5 -0
  34. package/dist/commands/review-config-export.d.ts.map +1 -0
  35. package/dist/commands/review-config-export.js +125 -0
  36. package/dist/commands/review-config-export.js.map +1 -0
  37. package/dist/commands/review-depth.d.ts +5 -0
  38. package/dist/commands/review-depth.d.ts.map +1 -0
  39. package/dist/commands/review-depth.js +143 -0
  40. package/dist/commands/review-depth.js.map +1 -0
  41. package/dist/commands/review-feedback.d.ts +5 -0
  42. package/dist/commands/review-feedback.d.ts.map +1 -0
  43. package/dist/commands/review-feedback.js +146 -0
  44. package/dist/commands/review-feedback.js.map +1 -0
  45. package/dist/commands/review-ignore-path.d.ts +5 -0
  46. package/dist/commands/review-ignore-path.d.ts.map +1 -0
  47. package/dist/commands/review-ignore-path.js +148 -0
  48. package/dist/commands/review-ignore-path.js.map +1 -0
  49. package/dist/commands/review-pr-comment.d.ts +5 -0
  50. package/dist/commands/review-pr-comment.d.ts.map +1 -0
  51. package/dist/commands/review-pr-comment.js +107 -0
  52. package/dist/commands/review-pr-comment.js.map +1 -0
  53. package/dist/commands/review-retry.d.ts +5 -0
  54. package/dist/commands/review-retry.d.ts.map +1 -0
  55. package/dist/commands/review-retry.js +92 -0
  56. package/dist/commands/review-retry.js.map +1 -0
  57. package/dist/commands/review-score-history.d.ts +5 -0
  58. package/dist/commands/review-score-history.d.ts.map +1 -0
  59. package/dist/commands/review-score-history.js +138 -0
  60. package/dist/commands/review-score-history.js.map +1 -0
  61. package/dist/commands/review-session.d.ts +5 -0
  62. package/dist/commands/review-session.d.ts.map +1 -0
  63. package/dist/commands/review-session.js +151 -0
  64. package/dist/commands/review-session.js.map +1 -0
  65. package/dist/commands/review-summary-email.d.ts +5 -0
  66. package/dist/commands/review-summary-email.d.ts.map +1 -0
  67. package/dist/commands/review-summary-email.js +103 -0
  68. package/dist/commands/review-summary-email.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Review-approval — Approval workflows for review results.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const APPROVAL_FILE = join(".judges", "approvals.json");
8
+ function loadStore() {
9
+ if (!existsSync(APPROVAL_FILE))
10
+ return { version: "1.0.0", entries: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(APPROVAL_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", entries: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(APPROVAL_FILE), { recursive: true });
20
+ writeFileSync(APPROVAL_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ function generateId() {
23
+ return `apr-${Date.now().toString(36)}`;
24
+ }
25
+ // ─── CLI ────────────────────────────────────────────────────────────────────
26
+ export function runReviewApproval(argv) {
27
+ if (argv.includes("--help") || argv.includes("-h")) {
28
+ console.log(`
29
+ judges review-approval — Approval workflows for review results
30
+
31
+ Usage:
32
+ judges review-approval request --review rev-123 --approver alice
33
+ judges review-approval approve --id apr-abc --comment "Looks good"
34
+ judges review-approval reject --id apr-abc --comment "Needs fixes"
35
+ judges review-approval list
36
+ judges review-approval clear
37
+
38
+ Subcommands:
39
+ request Request approval for a review
40
+ approve Approve a pending request
41
+ reject Reject a pending request
42
+ list List all approval entries
43
+ clear Clear all approval data
44
+
45
+ Options:
46
+ --review <id> Review ID
47
+ --approver <name> Approver name
48
+ --id <id> Approval entry ID
49
+ --comment <text> Approval/rejection comment
50
+ --score <n> Review score
51
+ --format json JSON output
52
+ --help, -h Show this help
53
+
54
+ Approval data stored locally in .judges/approvals.json.
55
+ `);
56
+ return;
57
+ }
58
+ const subcommand = argv.find((a) => ["request", "approve", "reject", "list", "clear"].includes(a)) || "list";
59
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
60
+ const store = loadStore();
61
+ if (subcommand === "request") {
62
+ const reviewId = argv.find((_a, i) => argv[i - 1] === "--review") || "";
63
+ const approver = argv.find((_a, i) => argv[i - 1] === "--approver") || "";
64
+ const score = parseFloat(argv.find((_a, i) => argv[i - 1] === "--score") || "0");
65
+ if (!reviewId || !approver) {
66
+ console.error("Error: --review and --approver are required.");
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ const id = generateId();
71
+ store.entries.push({
72
+ id,
73
+ reviewId,
74
+ approver,
75
+ status: "pending",
76
+ comment: "",
77
+ timestamp: new Date().toISOString(),
78
+ score,
79
+ });
80
+ saveStore(store);
81
+ console.log(`Approval request ${id} created for review ${reviewId} (approver: ${approver}).`);
82
+ return;
83
+ }
84
+ if (subcommand === "approve" || subcommand === "reject") {
85
+ const id = argv.find((_a, i) => argv[i - 1] === "--id");
86
+ const comment = argv.find((_a, i) => argv[i - 1] === "--comment") || "";
87
+ if (!id) {
88
+ console.error("Error: --id is required.");
89
+ process.exitCode = 1;
90
+ return;
91
+ }
92
+ const entry = store.entries.find((e) => e.id === id);
93
+ if (!entry) {
94
+ console.error(`Error: Approval "${id}" not found.`);
95
+ process.exitCode = 1;
96
+ return;
97
+ }
98
+ entry.status = subcommand === "approve" ? "approved" : "rejected";
99
+ entry.comment = comment;
100
+ entry.timestamp = new Date().toISOString();
101
+ saveStore(store);
102
+ console.log(`${subcommand === "approve" ? "Approved" : "Rejected"} ${id}.`);
103
+ return;
104
+ }
105
+ if (subcommand === "clear") {
106
+ saveStore({ version: "1.0.0", entries: [] });
107
+ console.log("Approval data cleared.");
108
+ return;
109
+ }
110
+ // list
111
+ if (store.entries.length === 0) {
112
+ console.log("No approval entries. Use 'judges review-approval request' to start.");
113
+ return;
114
+ }
115
+ if (format === "json") {
116
+ console.log(JSON.stringify(store.entries, null, 2));
117
+ return;
118
+ }
119
+ const pending = store.entries.filter((e) => e.status === "pending");
120
+ const approved = store.entries.filter((e) => e.status === "approved");
121
+ const rejected = store.entries.filter((e) => e.status === "rejected");
122
+ console.log("\nApproval Dashboard:");
123
+ console.log("═".repeat(60));
124
+ console.log(` Pending: ${pending.length} Approved: ${approved.length} Rejected: ${rejected.length}`);
125
+ console.log("═".repeat(60));
126
+ for (const e of store.entries) {
127
+ const icon = e.status === "approved" ? "✓" : e.status === "rejected" ? "✗" : "○";
128
+ console.log(` ${icon} ${e.id} review=${e.reviewId} approver=${e.approver} ${e.status}`);
129
+ if (e.comment)
130
+ console.log(` Comment: ${e.comment}`);
131
+ }
132
+ console.log("═".repeat(60));
133
+ }
134
+ //# sourceMappingURL=review-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-approval.js","sourceRoot":"","sources":["../../src/commands/review-approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-bulk-action — Apply bulk actions across multiple findings.
3
+ */
4
+ export declare function runReviewBulkAction(argv: string[]): void;
5
+ //# sourceMappingURL=review-bulk-action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-bulk-action.d.ts","sourceRoot":"","sources":["../../src/commands/review-bulk-action.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4CH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0FxD"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Review-bulk-action — Apply bulk actions across multiple findings.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const BULK_FILE = ".judges/bulk-actions.json";
8
+ function loadStore() {
9
+ if (!existsSync(BULK_FILE))
10
+ return { version: "1.0.0", actions: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(BULK_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", actions: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(BULK_FILE), { recursive: true });
20
+ writeFileSync(BULK_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ function generateId() {
23
+ return `ba-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
24
+ }
25
+ // ─── CLI ────────────────────────────────────────────────────────────────────
26
+ export function runReviewBulkAction(argv) {
27
+ if (argv.includes("--help") || argv.includes("-h")) {
28
+ console.log(`
29
+ judges review-bulk-action — Apply bulk actions across multiple findings
30
+
31
+ Usage:
32
+ judges review-bulk-action dismiss --rules SEC-001,SEC-002
33
+ judges review-bulk-action suppress --rules "PERF-*"
34
+ judges review-bulk-action approve --rules SEC-001
35
+ judges review-bulk-action history
36
+ judges review-bulk-action undo --id <id>
37
+ judges review-bulk-action clear
38
+
39
+ Subcommands:
40
+ dismiss Dismiss findings by rule IDs
41
+ suppress Suppress findings by rule pattern
42
+ approve Mark findings as approved
43
+ history Show bulk action history
44
+ undo Undo a bulk action
45
+ clear Clear bulk action history
46
+
47
+ Options:
48
+ --rules <ids> Comma-separated rule IDs or pattern
49
+ --format json JSON output
50
+ --help, -h Show this help
51
+
52
+ History stored in .judges/bulk-actions.json.
53
+ `);
54
+ return;
55
+ }
56
+ const subcommand = argv.find((a) => ["dismiss", "suppress", "approve", "history", "undo", "clear"].includes(a));
57
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
58
+ const store = loadStore();
59
+ if (subcommand === "dismiss" || subcommand === "suppress" || subcommand === "approve") {
60
+ const rulesRaw = argv.find((_a, i) => argv[i - 1] === "--rules") || "";
61
+ const ruleIds = rulesRaw
62
+ .split(",")
63
+ .map((r) => r.trim())
64
+ .filter(Boolean);
65
+ if (ruleIds.length === 0) {
66
+ console.log("No rules specified. Use --rules SEC-001,SEC-002");
67
+ return;
68
+ }
69
+ const record = {
70
+ id: generateId(),
71
+ action: subcommand,
72
+ ruleIds,
73
+ appliedAt: new Date().toISOString(),
74
+ count: ruleIds.length,
75
+ };
76
+ store.actions.push(record);
77
+ saveStore(store);
78
+ console.log(`Bulk ${subcommand}: ${ruleIds.length} rule(s) — ${ruleIds.join(", ")}`);
79
+ return;
80
+ }
81
+ if (subcommand === "undo") {
82
+ const id = argv.find((_a, i) => argv[i - 1] === "--id") || "";
83
+ const before = store.actions.length;
84
+ store.actions = store.actions.filter((a) => a.id !== id);
85
+ saveStore(store);
86
+ console.log(before > store.actions.length ? `Undone ${id}.` : `${id} not found.`);
87
+ return;
88
+ }
89
+ if (subcommand === "clear") {
90
+ saveStore({ version: "1.0.0", actions: [] });
91
+ console.log("Bulk action history cleared.");
92
+ return;
93
+ }
94
+ // Default: history
95
+ if (store.actions.length === 0) {
96
+ console.log("No bulk actions recorded.");
97
+ return;
98
+ }
99
+ if (format === "json") {
100
+ console.log(JSON.stringify(store.actions, null, 2));
101
+ return;
102
+ }
103
+ console.log("\nBulk Action History:");
104
+ console.log("─".repeat(60));
105
+ for (const a of store.actions) {
106
+ console.log(` ${a.id} ${a.action} ${a.appliedAt.slice(0, 10)} rules: ${a.ruleIds.join(", ")}`);
107
+ }
108
+ console.log("─".repeat(60));
109
+ }
110
+ //# sourceMappingURL=review-bulk-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-bulk-action.js","sourceRoot":"","sources":["../../src/commands/review-bulk-action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-compare-version — Compare review results between code versions.
3
+ */
4
+ export declare function runReviewCompareVersion(argv: string[]): void;
5
+ //# sourceMappingURL=review-compare-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-compare-version.d.ts","sourceRoot":"","sources":["../../src/commands/review-compare-version.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4DH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+E5D"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Review-compare-version — Compare review results between code versions.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Helpers ────────────────────────────────────────────────────────────────
6
+ function loadResult(filePath) {
7
+ if (!existsSync(filePath))
8
+ return null;
9
+ try {
10
+ const data = JSON.parse(readFileSync(filePath, "utf-8"));
11
+ const findings = Array.isArray(data.findings)
12
+ ? data.findings.map((f) => `${f.ruleId || ""}:${f.title || ""}`)
13
+ : [];
14
+ return {
15
+ score: typeof data.overallScore === "number" ? data.overallScore : 0,
16
+ findingCount: findings.length,
17
+ criticalCount: typeof data.criticalCount === "number" ? data.criticalCount : 0,
18
+ highCount: typeof data.highCount === "number" ? data.highCount : 0,
19
+ findings,
20
+ };
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ function compare(before, after) {
27
+ const beforeSet = new Set(before.findings);
28
+ const afterSet = new Set(after.findings);
29
+ const newFindings = after.findings.filter((f) => !beforeSet.has(f));
30
+ const resolvedFindings = before.findings.filter((f) => !afterSet.has(f));
31
+ return {
32
+ before,
33
+ after,
34
+ scoreDelta: after.score - before.score,
35
+ newFindings,
36
+ resolvedFindings,
37
+ };
38
+ }
39
+ // ─── CLI ────────────────────────────────────────────────────────────────────
40
+ export function runReviewCompareVersion(argv) {
41
+ if (argv.includes("--help") || argv.includes("-h")) {
42
+ console.log(`
43
+ judges review-compare-version — Compare review results between code versions
44
+
45
+ Usage:
46
+ judges review-compare-version --before results-v1.json --after results-v2.json
47
+
48
+ Options:
49
+ --before <path> Path to the earlier review result (JSON)
50
+ --after <path> Path to the later review result (JSON)
51
+ --format json JSON output
52
+ --help, -h Show this help
53
+
54
+ Compares two review result files and shows:
55
+ - Score change
56
+ - New findings introduced
57
+ - Findings resolved
58
+ - Critical/high count changes
59
+ `);
60
+ return;
61
+ }
62
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
63
+ const beforePath = argv.find((_a, i) => argv[i - 1] === "--before") || "";
64
+ const afterPath = argv.find((_a, i) => argv[i - 1] === "--after") || "";
65
+ if (!beforePath || !afterPath) {
66
+ console.log("Specify --before and --after result file paths.");
67
+ return;
68
+ }
69
+ const before = loadResult(beforePath);
70
+ const after = loadResult(afterPath);
71
+ if (!before) {
72
+ console.log(`Cannot load before file: ${beforePath}`);
73
+ return;
74
+ }
75
+ if (!after) {
76
+ console.log(`Cannot load after file: ${afterPath}`);
77
+ return;
78
+ }
79
+ const result = compare(before, after);
80
+ if (format === "json") {
81
+ console.log(JSON.stringify(result, null, 2));
82
+ return;
83
+ }
84
+ const arrow = result.scoreDelta > 0 ? "↗" : result.scoreDelta < 0 ? "↘" : "→";
85
+ console.log("\nVersion Comparison:");
86
+ console.log("═".repeat(55));
87
+ console.log(` Score: ${before.score.toFixed(1)} → ${after.score.toFixed(1)} (${result.scoreDelta > 0 ? "+" : ""}${result.scoreDelta.toFixed(1)} ${arrow})`);
88
+ console.log(` Findings: ${before.findingCount} → ${after.findingCount}`);
89
+ console.log(` Critical: ${before.criticalCount} → ${after.criticalCount}`);
90
+ console.log(` High: ${before.highCount} → ${after.highCount}`);
91
+ if (result.newFindings.length > 0) {
92
+ console.log(`\n New Findings (${result.newFindings.length}):`);
93
+ for (const f of result.newFindings.slice(0, 10)) {
94
+ console.log(` + ${f}`);
95
+ }
96
+ if (result.newFindings.length > 10)
97
+ console.log(` ... and ${result.newFindings.length - 10} more`);
98
+ }
99
+ if (result.resolvedFindings.length > 0) {
100
+ console.log(`\n Resolved Findings (${result.resolvedFindings.length}):`);
101
+ for (const f of result.resolvedFindings.slice(0, 10)) {
102
+ console.log(` - ${f}`);
103
+ }
104
+ if (result.resolvedFindings.length > 10)
105
+ console.log(` ... and ${result.resolvedFindings.length - 10} more`);
106
+ }
107
+ console.log("═".repeat(55));
108
+ }
109
+ //# sourceMappingURL=review-compare-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-compare-version.js","sourceRoot":"","sources":["../../src/commands/review-compare-version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-config-export — Export and import review configurations.
3
+ */
4
+ export declare function runReviewConfigExport(argv: string[]): void;
5
+ //# sourceMappingURL=review-config-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-config-export.d.ts","sourceRoot":"","sources":["../../src/commands/review-config-export.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4BH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsH1D"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Review-config-export — Export and import review configurations.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Config Discovery ───────────────────────────────────────────────────────
7
+ const CONFIG_FILES = [".judgesrc", ".judgesrc.json", "judgesrc.json"];
8
+ function findConfigFile() {
9
+ for (const f of CONFIG_FILES) {
10
+ if (existsSync(f))
11
+ return f;
12
+ }
13
+ return null;
14
+ }
15
+ // ─── CLI ────────────────────────────────────────────────────────────────────
16
+ export function runReviewConfigExport(argv) {
17
+ if (argv.includes("--help") || argv.includes("-h")) {
18
+ console.log(`
19
+ judges review-config-export — Export and import review configurations
20
+
21
+ Usage:
22
+ judges review-config-export export --out config-bundle.json
23
+ judges review-config-export import --file config-bundle.json
24
+ judges review-config-export show
25
+
26
+ Subcommands:
27
+ export Export current config as a shareable bundle
28
+ import Import a config bundle
29
+ show Show current config
30
+
31
+ Options:
32
+ --out <path> Output path for export
33
+ --file <path> Config bundle to import
34
+ --config <path> Config file path (auto-detected)
35
+ --name <text> Bundle name
36
+ --desc <text> Bundle description
37
+ --format json JSON output
38
+ --help, -h Show this help
39
+
40
+ Enables sharing review configurations between projects and team members.
41
+ `);
42
+ return;
43
+ }
44
+ const subcommand = argv.find((a) => ["export", "import", "show"].includes(a)) || "show";
45
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
46
+ if (subcommand === "export") {
47
+ const configArg = argv.find((_a, i) => argv[i - 1] === "--config");
48
+ const configFile = configArg || findConfigFile();
49
+ const outPath = argv.find((_a, i) => argv[i - 1] === "--out") || "judges-config-bundle.json";
50
+ const name = argv.find((_a, i) => argv[i - 1] === "--name") || "Judges Config";
51
+ const desc = argv.find((_a, i) => argv[i - 1] === "--desc") || "";
52
+ if (!configFile || !existsSync(configFile)) {
53
+ console.error("Error: No config file found. Use --config to specify.");
54
+ process.exitCode = 1;
55
+ return;
56
+ }
57
+ let config;
58
+ try {
59
+ config = JSON.parse(readFileSync(configFile, "utf-8"));
60
+ }
61
+ catch {
62
+ console.error("Error: Could not parse config file.");
63
+ process.exitCode = 1;
64
+ return;
65
+ }
66
+ const bundle = {
67
+ version: "1.0.0",
68
+ exportedAt: new Date().toISOString(),
69
+ source: configFile,
70
+ config,
71
+ metadata: { name, description: desc },
72
+ };
73
+ mkdirSync(dirname(outPath), { recursive: true });
74
+ writeFileSync(outPath, JSON.stringify(bundle, null, 2), "utf-8");
75
+ console.log(`Exported config to "${outPath}".`);
76
+ return;
77
+ }
78
+ if (subcommand === "import") {
79
+ const filePath = argv.find((_a, i) => argv[i - 1] === "--file");
80
+ if (!filePath || !existsSync(filePath)) {
81
+ console.error("Error: --file is required and must exist.");
82
+ process.exitCode = 1;
83
+ return;
84
+ }
85
+ let bundle;
86
+ try {
87
+ bundle = JSON.parse(readFileSync(filePath, "utf-8"));
88
+ }
89
+ catch {
90
+ console.error("Error: Could not parse config bundle.");
91
+ process.exitCode = 1;
92
+ return;
93
+ }
94
+ if (!bundle.config) {
95
+ console.error("Error: Invalid config bundle (missing 'config' field).");
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ const targetFile = findConfigFile() || ".judgesrc.json";
100
+ mkdirSync(dirname(targetFile), { recursive: true });
101
+ writeFileSync(targetFile, JSON.stringify(bundle.config, null, 2), "utf-8");
102
+ console.log(`Imported config from "${filePath}" to "${targetFile}".`);
103
+ if (bundle.metadata.name)
104
+ console.log(` Bundle: ${bundle.metadata.name}`);
105
+ if (bundle.metadata.description)
106
+ console.log(` Description: ${bundle.metadata.description}`);
107
+ return;
108
+ }
109
+ // show
110
+ const configFile = findConfigFile();
111
+ if (!configFile || !existsSync(configFile)) {
112
+ console.log("No config file found.");
113
+ return;
114
+ }
115
+ const content = readFileSync(configFile, "utf-8");
116
+ if (format === "json") {
117
+ console.log(content);
118
+ return;
119
+ }
120
+ console.log(`\nCurrent Config (${configFile}):`);
121
+ console.log("─".repeat(50));
122
+ console.log(content);
123
+ console.log("─".repeat(50));
124
+ }
125
+ //# sourceMappingURL=review-config-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-config-export.js","sourceRoot":"","sources":["../../src/commands/review-config-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-depth — Control review depth (shallow, normal, deep).
3
+ */
4
+ export declare function runReviewDepth(argv: string[]): void;
5
+ //# sourceMappingURL=review-depth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-depth.d.ts","sourceRoot":"","sources":["../../src/commands/review-depth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqEH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsGnD"}