@kevinrabun/judges 3.74.0 → 3.76.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 (74) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +119 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-age-report.d.ts +5 -0
  6. package/dist/commands/finding-age-report.d.ts.map +1 -0
  7. package/dist/commands/finding-age-report.js +155 -0
  8. package/dist/commands/finding-age-report.js.map +1 -0
  9. package/dist/commands/finding-batch-resolve.d.ts +5 -0
  10. package/dist/commands/finding-batch-resolve.d.ts.map +1 -0
  11. package/dist/commands/finding-batch-resolve.js +166 -0
  12. package/dist/commands/finding-batch-resolve.js.map +1 -0
  13. package/dist/commands/finding-category.d.ts +5 -0
  14. package/dist/commands/finding-category.d.ts.map +1 -0
  15. package/dist/commands/finding-category.js +110 -0
  16. package/dist/commands/finding-category.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-snippet.d.ts +5 -0
  26. package/dist/commands/finding-snippet.d.ts.map +1 -0
  27. package/dist/commands/finding-snippet.js +103 -0
  28. package/dist/commands/finding-snippet.js.map +1 -0
  29. package/dist/commands/finding-trend.d.ts +5 -0
  30. package/dist/commands/finding-trend.d.ts.map +1 -0
  31. package/dist/commands/finding-trend.js +119 -0
  32. package/dist/commands/finding-trend.js.map +1 -0
  33. package/dist/commands/review-checklist.d.ts +5 -0
  34. package/dist/commands/review-checklist.d.ts.map +1 -0
  35. package/dist/commands/review-checklist.js +145 -0
  36. package/dist/commands/review-checklist.js.map +1 -0
  37. package/dist/commands/review-config-validate.d.ts +5 -0
  38. package/dist/commands/review-config-validate.d.ts.map +1 -0
  39. package/dist/commands/review-config-validate.js +111 -0
  40. package/dist/commands/review-config-validate.js.map +1 -0
  41. package/dist/commands/review-diff-annotate.d.ts +5 -0
  42. package/dist/commands/review-diff-annotate.d.ts.map +1 -0
  43. package/dist/commands/review-diff-annotate.js +105 -0
  44. package/dist/commands/review-diff-annotate.js.map +1 -0
  45. package/dist/commands/review-env-check.d.ts +5 -0
  46. package/dist/commands/review-env-check.d.ts.map +1 -0
  47. package/dist/commands/review-env-check.js +116 -0
  48. package/dist/commands/review-env-check.js.map +1 -0
  49. package/dist/commands/review-health-check.d.ts +5 -0
  50. package/dist/commands/review-health-check.d.ts.map +1 -0
  51. package/dist/commands/review-health-check.js +149 -0
  52. package/dist/commands/review-health-check.js.map +1 -0
  53. package/dist/commands/review-integration-test.d.ts +5 -0
  54. package/dist/commands/review-integration-test.d.ts.map +1 -0
  55. package/dist/commands/review-integration-test.js +146 -0
  56. package/dist/commands/review-integration-test.js.map +1 -0
  57. package/dist/commands/review-lock.d.ts +5 -0
  58. package/dist/commands/review-lock.d.ts.map +1 -0
  59. package/dist/commands/review-lock.js +108 -0
  60. package/dist/commands/review-lock.js.map +1 -0
  61. package/dist/commands/review-parallel-diff.d.ts +5 -0
  62. package/dist/commands/review-parallel-diff.d.ts.map +1 -0
  63. package/dist/commands/review-parallel-diff.js +147 -0
  64. package/dist/commands/review-parallel-diff.js.map +1 -0
  65. package/dist/commands/review-rate-limit.d.ts +5 -0
  66. package/dist/commands/review-rate-limit.d.ts.map +1 -0
  67. package/dist/commands/review-rate-limit.js +131 -0
  68. package/dist/commands/review-rate-limit.js.map +1 -0
  69. package/dist/commands/review-rule-stats.d.ts +5 -0
  70. package/dist/commands/review-rule-stats.d.ts.map +1 -0
  71. package/dist/commands/review-rule-stats.js +162 -0
  72. package/dist/commands/review-rule-stats.js.map +1 -0
  73. package/package.json +1 -1
  74. package/server.json +2 -2
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Review-config-validate — Validate review configuration files.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewConfigValidate(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h")) {
8
+ console.log(`
9
+ judges review-config-validate — Validate review configuration files
10
+
11
+ Usage:
12
+ judges review-config-validate
13
+ judges review-config-validate --file .judgesrc
14
+ judges review-config-validate --strict
15
+
16
+ Options:
17
+ --file <path> Config file to validate (default: .judgesrc)
18
+ --strict Enable strict validation
19
+ --format json JSON output
20
+ --help, -h Show this help
21
+
22
+ Checks configuration for common errors and best practices.
23
+ `);
24
+ return;
25
+ }
26
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
27
+ const configPath = argv.find((_a, i) => argv[i - 1] === "--file") || ".judgesrc";
28
+ const strict = argv.includes("--strict");
29
+ if (!existsSync(configPath)) {
30
+ console.log(`Config file not found: ${configPath}`);
31
+ console.log("Create one with 'judges init' or specify --file.");
32
+ return;
33
+ }
34
+ let config;
35
+ try {
36
+ config = JSON.parse(readFileSync(configPath, "utf-8"));
37
+ }
38
+ catch {
39
+ console.log(`Failed to parse config: ${configPath}`);
40
+ return;
41
+ }
42
+ const issues = [];
43
+ // Check preset
44
+ const validPresets = [
45
+ "strict",
46
+ "lenient",
47
+ "security-only",
48
+ "startup",
49
+ "compliance",
50
+ "performance",
51
+ "react",
52
+ "express",
53
+ "fastapi",
54
+ "django",
55
+ "spring-boot",
56
+ "rails",
57
+ "nextjs",
58
+ ];
59
+ if (config.preset && typeof config.preset === "string" && !validPresets.includes(config.preset)) {
60
+ issues.push({ field: "preset", message: `Unknown preset "${config.preset}"`, severity: "warning" });
61
+ }
62
+ // Check disabledJudges
63
+ if (config.disabledJudges && !Array.isArray(config.disabledJudges)) {
64
+ issues.push({ field: "disabledJudges", message: "Should be an array of judge IDs", severity: "error" });
65
+ }
66
+ // Check disabledRules
67
+ if (config.disabledRules && !Array.isArray(config.disabledRules)) {
68
+ issues.push({ field: "disabledRules", message: "Should be an array of rule IDs", severity: "error" });
69
+ }
70
+ // Check minSeverity
71
+ const validSeverities = ["critical", "high", "medium", "low", "info"];
72
+ if (config.minSeverity && typeof config.minSeverity === "string" && !validSeverities.includes(config.minSeverity)) {
73
+ issues.push({ field: "minSeverity", message: `Invalid severity "${config.minSeverity}"`, severity: "error" });
74
+ }
75
+ // Check ruleOverrides
76
+ if (config.ruleOverrides && typeof config.ruleOverrides !== "object") {
77
+ issues.push({ field: "ruleOverrides", message: "Should be an object", severity: "error" });
78
+ }
79
+ // Strict checks
80
+ if (strict) {
81
+ if (!config.preset) {
82
+ issues.push({ field: "preset", message: "No preset specified (recommended)", severity: "warning" });
83
+ }
84
+ if (Array.isArray(config.disabledJudges) && config.disabledJudges.length > 10) {
85
+ issues.push({
86
+ field: "disabledJudges",
87
+ message: "Many judges disabled — consider using a preset instead",
88
+ severity: "warning",
89
+ });
90
+ }
91
+ }
92
+ const errors = issues.filter((i) => i.severity === "error");
93
+ const warnings = issues.filter((i) => i.severity === "warning");
94
+ if (format === "json") {
95
+ console.log(JSON.stringify({ valid: errors.length === 0, errors: errors.length, warnings: warnings.length, issues }, null, 2));
96
+ return;
97
+ }
98
+ if (issues.length === 0) {
99
+ console.log(`Config valid: ${configPath}`);
100
+ return;
101
+ }
102
+ console.log(`\nConfig Validation: ${configPath}`);
103
+ console.log("─".repeat(50));
104
+ for (const i of issues) {
105
+ const icon = i.severity === "error" ? "ERROR" : "WARN";
106
+ console.log(` [${icon}] ${i.field}: ${i.message}`);
107
+ }
108
+ console.log("─".repeat(50));
109
+ console.log(`${errors.length} error(s), ${warnings.length} warning(s).`);
110
+ }
111
+ //# sourceMappingURL=review-config-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-config-validate.js","sourceRoot":"","sources":["../../src/commands/review-config-validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-diff-annotate — Annotate diff hunks with review findings.
3
+ */
4
+ export declare function runReviewDiffAnnotate(argv: string[]): void;
5
+ //# sourceMappingURL=review-diff-annotate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-diff-annotate.d.ts","sourceRoot":"","sources":["../../src/commands/review-diff-annotate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0H1D"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Review-diff-annotate — Annotate diff hunks with review findings.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewDiffAnnotate(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h")) {
8
+ console.log(`
9
+ judges review-diff-annotate — Annotate diff hunks with review findings
10
+
11
+ Usage:
12
+ judges review-diff-annotate --diff changes.diff --results results.json
13
+
14
+ Options:
15
+ --diff <path> Path to unified diff file
16
+ --results <path> Path to review result JSON
17
+ --format json JSON output
18
+ --help, -h Show this help
19
+
20
+ Overlays review findings onto diff output, showing which changed
21
+ lines have associated findings.
22
+ `);
23
+ return;
24
+ }
25
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
26
+ const diffPath = argv.find((_a, i) => argv[i - 1] === "--diff") || "";
27
+ const resultsPath = argv.find((_a, i) => argv[i - 1] === "--results") || "";
28
+ if (!diffPath || !resultsPath) {
29
+ console.log("Specify --diff and --results paths.");
30
+ return;
31
+ }
32
+ if (!existsSync(diffPath)) {
33
+ console.log(`Diff file not found: ${diffPath}`);
34
+ return;
35
+ }
36
+ if (!existsSync(resultsPath)) {
37
+ console.log(`Results file not found: ${resultsPath}`);
38
+ return;
39
+ }
40
+ const diffContent = readFileSync(diffPath, "utf-8");
41
+ let data;
42
+ try {
43
+ data = JSON.parse(readFileSync(resultsPath, "utf-8"));
44
+ }
45
+ catch {
46
+ console.log(`Failed to parse results: ${resultsPath}`);
47
+ return;
48
+ }
49
+ const findings = Array.isArray(data.findings) ? data.findings : [];
50
+ const lineMap = new Map();
51
+ for (const f of findings) {
52
+ if (Array.isArray(f.lineNumbers)) {
53
+ for (const ln of f.lineNumbers) {
54
+ const existing = lineMap.get(ln) || [];
55
+ existing.push(f);
56
+ lineMap.set(ln, existing);
57
+ }
58
+ }
59
+ }
60
+ // Parse diff and annotate
61
+ const diffLines = diffContent.split("\n");
62
+ const annotated = [];
63
+ let currentLine = 0;
64
+ for (const line of diffLines) {
65
+ // Parse hunk header for line numbers
66
+ const hunkMatch = line.match(/^@@\s+-\d+(?:,\d+)?\s+\+(\d+)/);
67
+ if (hunkMatch) {
68
+ currentLine = parseInt(hunkMatch[1], 10) - 1;
69
+ }
70
+ if (line.startsWith("+") && !line.startsWith("+++")) {
71
+ currentLine++;
72
+ const matched = lineMap.get(currentLine) || [];
73
+ annotated.push({ line, findings: matched });
74
+ }
75
+ else if (line.startsWith("-") && !line.startsWith("---")) {
76
+ annotated.push({ line, findings: [] });
77
+ }
78
+ else {
79
+ if (!line.startsWith("---") && !line.startsWith("+++") && !line.startsWith("@@")) {
80
+ currentLine++;
81
+ }
82
+ annotated.push({ line, findings: [] });
83
+ }
84
+ }
85
+ const annotatedCount = annotated.filter((a) => a.findings.length > 0).length;
86
+ if (format === "json") {
87
+ console.log(JSON.stringify({ totalLines: diffLines.length, annotatedLines: annotatedCount, findings: findings.length }, null, 2));
88
+ return;
89
+ }
90
+ console.log(`\nAnnotated Diff (${annotatedCount} lines with findings):`);
91
+ console.log("═".repeat(70));
92
+ for (const a of annotated) {
93
+ if (a.findings.length > 0) {
94
+ console.log(a.line);
95
+ for (const f of a.findings) {
96
+ console.log(` >>> [${String(f.severity || "?").toUpperCase()}] ${f.ruleId || ""}: ${f.title || ""}`);
97
+ }
98
+ }
99
+ else {
100
+ console.log(a.line);
101
+ }
102
+ }
103
+ console.log("═".repeat(70));
104
+ }
105
+ //# sourceMappingURL=review-diff-annotate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-diff-annotate.js","sourceRoot":"","sources":["../../src/commands/review-diff-annotate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-env-check — Verify review environment prerequisites.
3
+ */
4
+ export declare function runReviewEnvCheck(argv: string[]): void;
5
+ //# sourceMappingURL=review-env-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-env-check.d.ts","sourceRoot":"","sources":["../../src/commands/review-env-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2EH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoDtD"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Review-env-check — Verify review environment prerequisites.
3
+ */
4
+ import { existsSync } from "fs";
5
+ import { execSync } from "child_process";
6
+ function checkNode() {
7
+ try {
8
+ const ver = process.version;
9
+ const major = parseInt(ver.slice(1).split(".")[0], 10);
10
+ if (major >= 18)
11
+ return { name: "Node.js", status: "pass", message: `${ver} (>= 18 required)` };
12
+ return { name: "Node.js", status: "fail", message: `${ver} — upgrade to >= 18` };
13
+ }
14
+ catch {
15
+ return { name: "Node.js", status: "fail", message: "Not found" };
16
+ }
17
+ }
18
+ function checkGit() {
19
+ try {
20
+ const ver = execSync("git --version", { encoding: "utf-8", timeout: 5000 }).trim();
21
+ return { name: "Git", status: "pass", message: ver };
22
+ }
23
+ catch {
24
+ return { name: "Git", status: "warn", message: "Not found (optional for diff features)" };
25
+ }
26
+ }
27
+ function checkConfigFile() {
28
+ const candidates = [".judgesrc", ".judgesrc.json", ".judgesrc.yaml", "judgesrc.config.js"];
29
+ for (const c of candidates) {
30
+ if (existsSync(c))
31
+ return { name: "Config file", status: "pass", message: c };
32
+ }
33
+ return { name: "Config file", status: "warn", message: "No config found (using defaults)" };
34
+ }
35
+ function checkCacheDir() {
36
+ if (existsSync(".judges"))
37
+ return { name: "Cache directory", status: "pass", message: ".judges/ exists" };
38
+ return { name: "Cache directory", status: "warn", message: ".judges/ not found (will be created on first run)" };
39
+ }
40
+ function checkDiskSpace() {
41
+ try {
42
+ const os = process.platform;
43
+ if (os === "win32") {
44
+ const out = execSync("wmic logicaldisk get freespace", { encoding: "utf-8", timeout: 5000 });
45
+ const lines = out
46
+ .trim()
47
+ .split("\n")
48
+ .filter((l) => l.trim().length > 0);
49
+ if (lines.length > 1) {
50
+ const free = parseInt(lines[1].trim(), 10);
51
+ const mb = Math.round(free / 1024 / 1024);
52
+ if (mb > 100)
53
+ return { name: "Disk space", status: "pass", message: `${mb} MB free` };
54
+ return { name: "Disk space", status: "warn", message: `${mb} MB free (low)` };
55
+ }
56
+ }
57
+ return { name: "Disk space", status: "pass", message: "Check skipped" };
58
+ }
59
+ catch {
60
+ return { name: "Disk space", status: "pass", message: "Check skipped" };
61
+ }
62
+ }
63
+ function checkPackageJson() {
64
+ if (existsSync("package.json"))
65
+ return { name: "package.json", status: "pass", message: "Found" };
66
+ return { name: "package.json", status: "warn", message: "Not found" };
67
+ }
68
+ // ─── CLI ────────────────────────────────────────────────────────────────────
69
+ export function runReviewEnvCheck(argv) {
70
+ if (argv.includes("--help") || argv.includes("-h")) {
71
+ console.log(`
72
+ judges review-env-check — Verify review environment prerequisites
73
+
74
+ Usage:
75
+ judges review-env-check [options]
76
+
77
+ Options:
78
+ --strict Fail on warnings too
79
+ --format json JSON output
80
+ --help, -h Show this help
81
+
82
+ Checks: Node.js version, Git, config file, cache dir, disk space, package.json.
83
+ `);
84
+ return;
85
+ }
86
+ const strict = argv.includes("--strict");
87
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
88
+ const checks = [
89
+ checkNode(),
90
+ checkGit(),
91
+ checkConfigFile(),
92
+ checkCacheDir(),
93
+ checkDiskSpace(),
94
+ checkPackageJson(),
95
+ ];
96
+ const failures = checks.filter((c) => c.status === "fail");
97
+ const warnings = checks.filter((c) => c.status === "warn");
98
+ const ok = failures.length === 0 && (!strict || warnings.length === 0);
99
+ if (format === "json") {
100
+ console.log(JSON.stringify({ checks, ok, failures: failures.length, warnings: warnings.length }, null, 2));
101
+ if (!ok)
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ console.log("\nEnvironment Check:");
106
+ console.log("═".repeat(55));
107
+ for (const c of checks) {
108
+ const icon = c.status === "pass" ? "PASS" : c.status === "warn" ? "WARN" : "FAIL";
109
+ console.log(` [${icon}] ${c.name.padEnd(18)} ${c.message}`);
110
+ }
111
+ console.log("═".repeat(55));
112
+ console.log(` Result: ${ok ? "Environment ready" : "Issues found"} (${failures.length} failures, ${warnings.length} warnings)`);
113
+ if (!ok)
114
+ process.exitCode = 1;
115
+ }
116
+ //# sourceMappingURL=review-env-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-env-check.js","sourceRoot":"","sources":["../../src/commands/review-env-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-health-check — Diagnose review system health and readiness.
3
+ */
4
+ export declare function runReviewHealthCheck(argv: string[]): void;
5
+ //# sourceMappingURL=review-health-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-health-check.d.ts","sourceRoot":"","sources":["../../src/commands/review-health-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiHH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgDzD"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Review-health-check — Diagnose review system health and readiness.
3
+ */
4
+ import { existsSync, readFileSync, statSync, readdirSync } from "fs";
5
+ // ─── Checks ─────────────────────────────────────────────────────────────────
6
+ function checkCacheHealth() {
7
+ if (!existsSync(".judges")) {
8
+ return { component: "Cache", status: "healthy", message: "No cache dir (will be created)" };
9
+ }
10
+ try {
11
+ const files = readdirSync(".judges");
12
+ const jsonFiles = files.filter((f) => f.endsWith(".json"));
13
+ const totalSize = jsonFiles.reduce((sum, f) => {
14
+ try {
15
+ return sum + statSync(`.judges/${f}`).size;
16
+ }
17
+ catch {
18
+ return sum;
19
+ }
20
+ }, 0);
21
+ const mb = (totalSize / 1024 / 1024).toFixed(1);
22
+ if (totalSize > 100 * 1024 * 1024) {
23
+ return { component: "Cache", status: "degraded", message: `${mb} MB — consider cleanup` };
24
+ }
25
+ return { component: "Cache", status: "healthy", message: `${jsonFiles.length} files, ${mb} MB` };
26
+ }
27
+ catch {
28
+ return { component: "Cache", status: "unhealthy", message: "Cannot read .judges/" };
29
+ }
30
+ }
31
+ function checkConfigHealth() {
32
+ const candidates = [".judgesrc", ".judgesrc.json", ".judgesrc.yaml"];
33
+ for (const c of candidates) {
34
+ if (existsSync(c)) {
35
+ try {
36
+ const content = readFileSync(c, "utf-8");
37
+ if (c.endsWith(".json") || c === ".judgesrc") {
38
+ JSON.parse(content);
39
+ }
40
+ return { component: "Config", status: "healthy", message: `Valid config: ${c}` };
41
+ }
42
+ catch {
43
+ return { component: "Config", status: "unhealthy", message: `Invalid config: ${c}` };
44
+ }
45
+ }
46
+ }
47
+ return { component: "Config", status: "healthy", message: "Using defaults (no config file)" };
48
+ }
49
+ function checkRuntimeHealth() {
50
+ const memUsage = process.memoryUsage();
51
+ const heapMb = Math.round(memUsage.heapUsed / 1024 / 1024);
52
+ if (heapMb > 500) {
53
+ return { component: "Runtime", status: "degraded", message: `Heap: ${heapMb} MB (high)` };
54
+ }
55
+ return { component: "Runtime", status: "healthy", message: `Node ${process.version}, heap: ${heapMb} MB` };
56
+ }
57
+ function checkDependenciesHealth() {
58
+ if (!existsSync("node_modules")) {
59
+ return { component: "Dependencies", status: "unhealthy", message: "node_modules not found" };
60
+ }
61
+ if (existsSync("package-lock.json") && existsSync("package.json")) {
62
+ try {
63
+ const pkg = JSON.parse(readFileSync("package.json", "utf-8"));
64
+ const lockContent = readFileSync("package-lock.json", "utf-8");
65
+ const lock = JSON.parse(lockContent);
66
+ if (pkg.version !== lock.version) {
67
+ return { component: "Dependencies", status: "degraded", message: "Lock file version mismatch" };
68
+ }
69
+ }
70
+ catch {
71
+ /* ignore parse errors */
72
+ }
73
+ }
74
+ return { component: "Dependencies", status: "healthy", message: "node_modules present" };
75
+ }
76
+ function checkRecentResults() {
77
+ const resultPaths = [".judges/last-results.json", "results.json", ".judges/results.json"];
78
+ for (const p of resultPaths) {
79
+ if (existsSync(p)) {
80
+ try {
81
+ const stat = statSync(p);
82
+ const ageHours = (Date.now() - stat.mtimeMs) / 1000 / 60 / 60;
83
+ if (ageHours > 168) {
84
+ return {
85
+ component: "Results",
86
+ status: "degraded",
87
+ message: `Last results ${Math.round(ageHours / 24)} days old`,
88
+ };
89
+ }
90
+ return {
91
+ component: "Results",
92
+ status: "healthy",
93
+ message: `Last run: ${stat.mtime.toISOString().slice(0, 19)}`,
94
+ };
95
+ }
96
+ catch {
97
+ /* ignore */
98
+ }
99
+ }
100
+ }
101
+ return { component: "Results", status: "healthy", message: "No previous results found" };
102
+ }
103
+ // ─── CLI ────────────────────────────────────────────────────────────────────
104
+ export function runReviewHealthCheck(argv) {
105
+ if (argv.includes("--help") || argv.includes("-h")) {
106
+ console.log(`
107
+ judges review-health-check — Diagnose review system health
108
+
109
+ Usage:
110
+ judges review-health-check [options]
111
+
112
+ Options:
113
+ --format json JSON output
114
+ --help, -h Show this help
115
+
116
+ Checks: cache, config, runtime, dependencies, recent results.
117
+ `);
118
+ return;
119
+ }
120
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
121
+ const checks = [
122
+ checkCacheHealth(),
123
+ checkConfigHealth(),
124
+ checkRuntimeHealth(),
125
+ checkDependenciesHealth(),
126
+ checkRecentResults(),
127
+ ];
128
+ const healthy = checks.filter((c) => c.status === "healthy").length;
129
+ const degraded = checks.filter((c) => c.status === "degraded").length;
130
+ const unhealthy = checks.filter((c) => c.status === "unhealthy").length;
131
+ const overall = unhealthy > 0 ? "unhealthy" : degraded > 0 ? "degraded" : "healthy";
132
+ if (format === "json") {
133
+ console.log(JSON.stringify({ overall, checks, healthy, degraded, unhealthy }, null, 2));
134
+ if (overall === "unhealthy")
135
+ process.exitCode = 1;
136
+ return;
137
+ }
138
+ console.log("\nSystem Health Check:");
139
+ console.log("═".repeat(60));
140
+ for (const c of checks) {
141
+ const icon = c.status === "healthy" ? " OK " : c.status === "degraded" ? "WARN" : "FAIL";
142
+ console.log(` [${icon}] ${c.component.padEnd(16)} ${c.message}`);
143
+ }
144
+ console.log("═".repeat(60));
145
+ console.log(` Overall: ${overall.toUpperCase()} (${healthy} ok, ${degraded} degraded, ${unhealthy} unhealthy)`);
146
+ if (overall === "unhealthy")
147
+ process.exitCode = 1;
148
+ }
149
+ //# sourceMappingURL=review-health-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-health-check.js","sourceRoot":"","sources":["../../src/commands/review-health-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-integration-test — Validate review integration with CI/CD pipelines.
3
+ */
4
+ export declare function runReviewIntegrationTest(argv: string[]): void;
5
+ //# sourceMappingURL=review-integration-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-integration-test.d.ts","sourceRoot":"","sources":["../../src/commands/review-integration-test.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4GH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2D7D"}