@kevinrabun/judges 3.74.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 (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -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-priority-queue.d.ts +5 -0
  10. package/dist/commands/finding-priority-queue.d.ts.map +1 -0
  11. package/dist/commands/finding-priority-queue.js +132 -0
  12. package/dist/commands/finding-priority-queue.js.map +1 -0
  13. package/dist/commands/finding-remediation-plan.d.ts +5 -0
  14. package/dist/commands/finding-remediation-plan.d.ts.map +1 -0
  15. package/dist/commands/finding-remediation-plan.js +108 -0
  16. package/dist/commands/finding-remediation-plan.js.map +1 -0
  17. package/dist/commands/review-checklist.d.ts +5 -0
  18. package/dist/commands/review-checklist.d.ts.map +1 -0
  19. package/dist/commands/review-checklist.js +145 -0
  20. package/dist/commands/review-checklist.js.map +1 -0
  21. package/dist/commands/review-config-validate.d.ts +5 -0
  22. package/dist/commands/review-config-validate.d.ts.map +1 -0
  23. package/dist/commands/review-config-validate.js +111 -0
  24. package/dist/commands/review-config-validate.js.map +1 -0
  25. package/dist/commands/review-diff-annotate.d.ts +5 -0
  26. package/dist/commands/review-diff-annotate.d.ts.map +1 -0
  27. package/dist/commands/review-diff-annotate.js +105 -0
  28. package/dist/commands/review-diff-annotate.js.map +1 -0
  29. package/dist/commands/review-lock.d.ts +5 -0
  30. package/dist/commands/review-lock.d.ts.map +1 -0
  31. package/dist/commands/review-lock.js +108 -0
  32. package/dist/commands/review-lock.js.map +1 -0
  33. package/dist/commands/review-rate-limit.d.ts +5 -0
  34. package/dist/commands/review-rate-limit.d.ts.map +1 -0
  35. package/dist/commands/review-rate-limit.js +131 -0
  36. package/dist/commands/review-rate-limit.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-category.d.ts","sourceRoot":"","sources":["../../src/commands/finding-category.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqCH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6FvD"}
@@ -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-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":"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"}
@@ -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
+ * Review-checklist — Pre/post-review checklists for consistency.
3
+ */
4
+ export declare function runReviewChecklist(argv: string[]): void;
5
+ //# sourceMappingURL=review-checklist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-checklist.d.ts","sourceRoot":"","sources":["../../src/commands/review-checklist.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2CH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+HvD"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Review-checklist — Pre/post-review checklists for consistency.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const CL_FILE = ".judges/checklists.json";
8
+ function loadStore() {
9
+ if (!existsSync(CL_FILE))
10
+ return { version: "1.0.0", checklists: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(CL_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", checklists: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(CL_FILE), { recursive: true });
20
+ writeFileSync(CL_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── CLI ────────────────────────────────────────────────────────────────────
23
+ export function runReviewChecklist(argv) {
24
+ if (argv.includes("--help") || argv.includes("-h")) {
25
+ console.log(`
26
+ judges review-checklist — Pre/post-review checklists
27
+
28
+ Usage:
29
+ judges review-checklist create --name pre-review --items "check tests,check lint,check types"
30
+ judges review-checklist show --name pre-review
31
+ judges review-checklist check --name pre-review --item 0
32
+ judges review-checklist reset --name pre-review
33
+ judges review-checklist list
34
+ judges review-checklist remove --name pre-review
35
+
36
+ Subcommands:
37
+ create Create a checklist
38
+ show Show a checklist
39
+ check Toggle a checklist item
40
+ reset Reset all items to unchecked
41
+ list List all checklists
42
+ remove Remove a checklist
43
+
44
+ Options:
45
+ --name <text> Checklist name
46
+ --items <csv> Comma-separated checklist items
47
+ --item <n> Item index (0-based)
48
+ --format json JSON output
49
+ --help, -h Show this help
50
+
51
+ Checklists stored in .judges/checklists.json.
52
+ `);
53
+ return;
54
+ }
55
+ const subcommand = argv.find((a) => ["create", "show", "check", "reset", "list", "remove"].includes(a));
56
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
57
+ const store = loadStore();
58
+ const name = argv.find((_a, i) => argv[i - 1] === "--name") || "";
59
+ if (subcommand === "create") {
60
+ const itemsRaw = argv.find((_a, i) => argv[i - 1] === "--items") || "";
61
+ const items = itemsRaw
62
+ .split(",")
63
+ .map((s) => s.trim())
64
+ .filter(Boolean)
65
+ .map((label) => ({ label, checked: false }));
66
+ if (!name || items.length === 0) {
67
+ console.log("Specify --name and --items.");
68
+ return;
69
+ }
70
+ store.checklists = store.checklists.filter((c) => c.name !== name);
71
+ store.checklists.push({ version: "1.0.0", name, items });
72
+ saveStore(store);
73
+ console.log(`Checklist "${name}" created with ${items.length} items.`);
74
+ return;
75
+ }
76
+ if (subcommand === "show") {
77
+ const cl = store.checklists.find((c) => c.name === name);
78
+ if (!cl) {
79
+ console.log(`Checklist "${name}" not found.`);
80
+ return;
81
+ }
82
+ if (format === "json") {
83
+ console.log(JSON.stringify(cl, null, 2));
84
+ return;
85
+ }
86
+ console.log(`\nChecklist: ${cl.name}`);
87
+ console.log("─".repeat(40));
88
+ cl.items.forEach((item, i) => {
89
+ console.log(` ${i}. [${item.checked ? "x" : " "}] ${item.label}`);
90
+ });
91
+ const done = cl.items.filter((i) => i.checked).length;
92
+ console.log(`\n ${done}/${cl.items.length} complete`);
93
+ return;
94
+ }
95
+ if (subcommand === "check") {
96
+ const cl = store.checklists.find((c) => c.name === name);
97
+ if (!cl) {
98
+ console.log(`Checklist "${name}" not found.`);
99
+ return;
100
+ }
101
+ const idx = parseInt(argv.find((_a, i) => argv[i - 1] === "--item") || "-1", 10);
102
+ if (idx < 0 || idx >= cl.items.length) {
103
+ console.log(`Invalid item index.`);
104
+ return;
105
+ }
106
+ cl.items[idx].checked = !cl.items[idx].checked;
107
+ saveStore(store);
108
+ console.log(`${cl.items[idx].checked ? "Checked" : "Unchecked"}: ${cl.items[idx].label}`);
109
+ return;
110
+ }
111
+ if (subcommand === "reset") {
112
+ const cl = store.checklists.find((c) => c.name === name);
113
+ if (!cl) {
114
+ console.log(`Checklist "${name}" not found.`);
115
+ return;
116
+ }
117
+ for (const item of cl.items)
118
+ item.checked = false;
119
+ saveStore(store);
120
+ console.log(`Checklist "${name}" reset.`);
121
+ return;
122
+ }
123
+ if (subcommand === "remove") {
124
+ const before = store.checklists.length;
125
+ store.checklists = store.checklists.filter((c) => c.name !== name);
126
+ saveStore(store);
127
+ console.log(before > store.checklists.length ? `Removed "${name}".` : `"${name}" not found.`);
128
+ return;
129
+ }
130
+ // Default: list
131
+ if (store.checklists.length === 0) {
132
+ console.log("No checklists. Use 'judges review-checklist create' to add one.");
133
+ return;
134
+ }
135
+ if (format === "json") {
136
+ console.log(JSON.stringify(store.checklists, null, 2));
137
+ return;
138
+ }
139
+ console.log("\nChecklists:");
140
+ for (const cl of store.checklists) {
141
+ const done = cl.items.filter((i) => i.checked).length;
142
+ console.log(` ${cl.name}: ${done}/${cl.items.length} complete`);
143
+ }
144
+ }
145
+ //# sourceMappingURL=review-checklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-checklist.js","sourceRoot":"","sources":["../../src/commands/review-checklist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-config-validate — Validate review configuration files.
3
+ */
4
+ export declare function runReviewConfigValidate(argv: string[]): void;
5
+ //# sourceMappingURL=review-config-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-config-validate.d.ts","sourceRoot":"","sources":["../../src/commands/review-config-validate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyH5D"}