@kevinrabun/judges 3.22.1 → 3.23.1

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 (64) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/api.d.ts +18 -5
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +15 -3
  5. package/dist/api.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +54 -36
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/auto-detect.d.ts +62 -0
  10. package/dist/commands/auto-detect.d.ts.map +1 -0
  11. package/dist/commands/auto-detect.js +329 -0
  12. package/dist/commands/auto-detect.js.map +1 -0
  13. package/dist/commands/baseline.d.ts +46 -0
  14. package/dist/commands/baseline.d.ts.map +1 -1
  15. package/dist/commands/baseline.js +290 -27
  16. package/dist/commands/baseline.js.map +1 -1
  17. package/dist/commands/benchmark.d.ts +21 -3
  18. package/dist/commands/benchmark.d.ts.map +1 -1
  19. package/dist/commands/benchmark.js +365 -6
  20. package/dist/commands/benchmark.js.map +1 -1
  21. package/dist/commands/coverage.d.ts +41 -0
  22. package/dist/commands/coverage.d.ts.map +1 -0
  23. package/dist/commands/coverage.js +184 -0
  24. package/dist/commands/coverage.js.map +1 -0
  25. package/dist/commands/doctor.d.ts +56 -0
  26. package/dist/commands/doctor.d.ts.map +1 -0
  27. package/dist/commands/doctor.js +363 -0
  28. package/dist/commands/doctor.js.map +1 -0
  29. package/dist/commands/feedback.d.ts +42 -0
  30. package/dist/commands/feedback.d.ts.map +1 -1
  31. package/dist/commands/feedback.js +129 -0
  32. package/dist/commands/feedback.js.map +1 -1
  33. package/dist/commands/rule-metrics.d.ts +44 -0
  34. package/dist/commands/rule-metrics.d.ts.map +1 -0
  35. package/dist/commands/rule-metrics.js +114 -0
  36. package/dist/commands/rule-metrics.js.map +1 -0
  37. package/dist/commands/rule.d.ts +65 -0
  38. package/dist/commands/rule.d.ts.map +1 -1
  39. package/dist/commands/rule.js +94 -0
  40. package/dist/commands/rule.js.map +1 -1
  41. package/dist/commands/snapshot.d.ts +81 -0
  42. package/dist/commands/snapshot.d.ts.map +1 -0
  43. package/dist/commands/snapshot.js +189 -0
  44. package/dist/commands/snapshot.js.map +1 -0
  45. package/dist/config.d.ts +35 -3
  46. package/dist/config.d.ts.map +1 -1
  47. package/dist/config.js +187 -2
  48. package/dist/config.js.map +1 -1
  49. package/dist/dedup.d.ts +35 -0
  50. package/dist/dedup.d.ts.map +1 -1
  51. package/dist/dedup.js +96 -0
  52. package/dist/dedup.js.map +1 -1
  53. package/dist/evaluators/index.d.ts +22 -2
  54. package/dist/evaluators/index.d.ts.map +1 -1
  55. package/dist/evaluators/index.js +144 -52
  56. package/dist/evaluators/index.js.map +1 -1
  57. package/dist/patches/index.d.ts.map +1 -1
  58. package/dist/patches/index.js +426 -0
  59. package/dist/patches/index.js.map +1 -1
  60. package/dist/types.d.ts +43 -0
  61. package/dist/types.d.ts.map +1 -1
  62. package/judgesrc.schema.json +5 -0
  63. package/package.json +1 -1
  64. package/server.json +2 -2
@@ -0,0 +1,184 @@
1
+ // ─── Language Coverage Report ────────────────────────────────────────────────
2
+ // Analyse a set of files to report which languages have Judges Panel coverage
3
+ // and which lack it. Helps teams identify blind spots.
4
+ //
5
+ // Usage (programmatic):
6
+ // const report = computeLanguageCoverage(fileList);
7
+ // console.log(formatCoverageReport(report));
8
+ // ──────────────────────────────────────────────────────────────────────────────
9
+ import { extname } from "path";
10
+ import { normalizeLanguage } from "../language-patterns.js";
11
+ import { JUDGES } from "../judges/index.js";
12
+ // ─── Extension → Language mapping (mirrors CLI) ─────────────────────────────
13
+ const EXT_TO_LANG = {
14
+ ".ts": "typescript",
15
+ ".tsx": "typescript",
16
+ ".js": "javascript",
17
+ ".jsx": "javascript",
18
+ ".mjs": "javascript",
19
+ ".cjs": "javascript",
20
+ ".py": "python",
21
+ ".rs": "rust",
22
+ ".go": "go",
23
+ ".java": "java",
24
+ ".cs": "csharp",
25
+ ".rb": "ruby",
26
+ ".php": "php",
27
+ ".swift": "swift",
28
+ ".kt": "kotlin",
29
+ ".scala": "scala",
30
+ ".c": "c",
31
+ ".cpp": "cpp",
32
+ ".h": "c",
33
+ ".hpp": "cpp",
34
+ ".yaml": "yaml",
35
+ ".yml": "yaml",
36
+ ".json": "json",
37
+ ".tf": "terraform",
38
+ ".hcl": "terraform",
39
+ ".sh": "bash",
40
+ ".bash": "bash",
41
+ ".ps1": "powershell",
42
+ ".psm1": "powershell",
43
+ ".bicep": "bicep",
44
+ };
45
+ /**
46
+ * Languages for which the Judges Panel has first-class evaluator coverage.
47
+ * A language is "covered" if normalizeLanguage returns a recognized LangFamily
48
+ * AND there are judges whose pattern matching includes that language.
49
+ */
50
+ const COVERED_LANGUAGES = new Set([
51
+ "javascript",
52
+ "typescript",
53
+ "python",
54
+ "rust",
55
+ "csharp",
56
+ "java",
57
+ "go",
58
+ "cpp",
59
+ "powershell",
60
+ "terraform",
61
+ "bicep",
62
+ "arm",
63
+ "php",
64
+ "ruby",
65
+ "kotlin",
66
+ "swift",
67
+ ]);
68
+ // ─── Core Functions ─────────────────────────────────────────────────────────
69
+ /**
70
+ * Detect language from file path extension.
71
+ */
72
+ export function detectFileLanguage(filePath) {
73
+ const lower = filePath.toLowerCase();
74
+ if (lower.endsWith("dockerfile") || lower.includes("dockerfile."))
75
+ return "dockerfile";
76
+ const ext = extname(lower);
77
+ return EXT_TO_LANG[ext] ?? "unknown";
78
+ }
79
+ /**
80
+ * Count how many judges can evaluate a given language.
81
+ * Most judges are language-agnostic (they analyze patterns across all languages),
82
+ * so we return the total judge count for covered languages and 0 for uncovered.
83
+ */
84
+ function judgeCountForLanguage(language) {
85
+ const normalized = normalizeLanguage(language);
86
+ if (COVERED_LANGUAGES.has(normalized) || COVERED_LANGUAGES.has(language)) {
87
+ return JUDGES.length;
88
+ }
89
+ return 0;
90
+ }
91
+ /**
92
+ * Compute language coverage for a set of file paths.
93
+ *
94
+ * @param files - Array of relative or absolute file paths
95
+ * @returns Coverage report with covered/uncovered breakdown
96
+ */
97
+ export function computeLanguageCoverage(files) {
98
+ // Group files by detected language
99
+ const langFiles = new Map();
100
+ for (const f of files) {
101
+ const lang = detectFileLanguage(f);
102
+ if (lang === "unknown")
103
+ continue; // Skip unrecognized files
104
+ const existing = langFiles.get(lang) ?? [];
105
+ existing.push(f);
106
+ langFiles.set(lang, existing);
107
+ }
108
+ const covered = [];
109
+ const uncovered = [];
110
+ for (const [lang, langFileList] of langFiles) {
111
+ const normalized = normalizeLanguage(lang);
112
+ const isCovered = COVERED_LANGUAGES.has(normalized) || COVERED_LANGUAGES.has(lang);
113
+ const jCount = judgeCountForLanguage(lang);
114
+ const entry = {
115
+ language: lang,
116
+ fileCount: langFileList.length,
117
+ files: langFileList,
118
+ covered: isCovered,
119
+ judgeCount: jCount,
120
+ };
121
+ if (isCovered) {
122
+ covered.push(entry);
123
+ }
124
+ else {
125
+ uncovered.push(entry);
126
+ }
127
+ }
128
+ // Sort by file count descending
129
+ covered.sort((a, b) => b.fileCount - a.fileCount);
130
+ uncovered.sort((a, b) => b.fileCount - a.fileCount);
131
+ const coveredFileCount = covered.reduce((sum, e) => sum + e.fileCount, 0);
132
+ const uncoveredFileCount = uncovered.reduce((sum, e) => sum + e.fileCount, 0);
133
+ const totalFiles = coveredFileCount + uncoveredFileCount;
134
+ return {
135
+ covered,
136
+ uncovered,
137
+ stats: {
138
+ totalFiles,
139
+ coveredFiles: coveredFileCount,
140
+ uncoveredFiles: uncoveredFileCount,
141
+ coveragePercent: totalFiles > 0 ? Math.round((coveredFileCount / totalFiles) * 100) : 100,
142
+ languageCount: covered.length + uncovered.length,
143
+ coveredLanguages: covered.length,
144
+ uncoveredLanguages: uncovered.length,
145
+ },
146
+ };
147
+ }
148
+ // ─── Formatting ─────────────────────────────────────────────────────────────
149
+ /**
150
+ * Format a language coverage report as human-readable text.
151
+ */
152
+ export function formatCoverageReport(report) {
153
+ const lines = [];
154
+ lines.push("╔══════════════════════════════════════════════════════════════╗");
155
+ lines.push("║ Judges Panel — Language Coverage Report ║");
156
+ lines.push("╚══════════════════════════════════════════════════════════════╝");
157
+ lines.push("");
158
+ lines.push(` Total files : ${report.stats.totalFiles}`);
159
+ lines.push(` Languages found : ${report.stats.languageCount}`);
160
+ lines.push(` Coverage : ${report.stats.coveragePercent}% (${report.stats.coveredFiles}/${report.stats.totalFiles} files)`);
161
+ lines.push("");
162
+ if (report.covered.length > 0) {
163
+ lines.push(" ✅ Covered Languages:");
164
+ lines.push(" " + "─".repeat(55));
165
+ for (const entry of report.covered) {
166
+ lines.push(` ${entry.language.padEnd(14)} ${entry.fileCount} file(s) (${entry.judgeCount} judges)`);
167
+ }
168
+ lines.push("");
169
+ }
170
+ if (report.uncovered.length > 0) {
171
+ lines.push(" ⚠️ Uncovered Languages:");
172
+ lines.push(" " + "─".repeat(55));
173
+ for (const entry of report.uncovered) {
174
+ lines.push(` ${entry.language.padEnd(14)} ${entry.fileCount} file(s) — no dedicated evaluator`);
175
+ }
176
+ lines.push("");
177
+ }
178
+ if (report.uncovered.length === 0) {
179
+ lines.push(" All detected languages have Judges Panel coverage! 🎯");
180
+ lines.push("");
181
+ }
182
+ return lines.join("\n");
183
+ }
184
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/commands/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { JudgesConfig } from "../types.js";
2
+ export type CheckStatus = "pass" | "warn" | "fail";
3
+ export interface DoctorCheck {
4
+ name: string;
5
+ status: CheckStatus;
6
+ message: string;
7
+ detail?: string;
8
+ }
9
+ export interface DoctorReport {
10
+ checks: DoctorCheck[];
11
+ summary: {
12
+ pass: number;
13
+ warn: number;
14
+ fail: number;
15
+ total: number;
16
+ };
17
+ healthy: boolean;
18
+ }
19
+ /**
20
+ * Check Node.js version meets minimum requirements.
21
+ */
22
+ export declare function checkNodeVersion(): DoctorCheck;
23
+ /**
24
+ * Check for a .judgesrc config file and validate it.
25
+ */
26
+ export declare function checkConfigFile(dir: string): DoctorCheck;
27
+ /**
28
+ * Check that core judges are loaded.
29
+ */
30
+ export declare function checkJudgesLoaded(): DoctorCheck;
31
+ /**
32
+ * Check plugin specifiers for validity (if config has plugins).
33
+ */
34
+ export declare function checkPlugins(config: Partial<JudgesConfig>): DoctorCheck;
35
+ /**
36
+ * Check feedback store integrity.
37
+ */
38
+ export declare function checkFeedbackStore(dir: string): DoctorCheck;
39
+ /**
40
+ * Check baseline file integrity (if configured or present).
41
+ */
42
+ export declare function checkBaselineFile(dir: string, config: Partial<JudgesConfig>): DoctorCheck;
43
+ /**
44
+ * Check that presets are accessible.
45
+ */
46
+ export declare function checkPresets(): DoctorCheck;
47
+ /**
48
+ * Run all diagnostic checks and produce a report.
49
+ */
50
+ export declare function runDoctorChecks(dir?: string): DoctorReport;
51
+ /**
52
+ * Format a doctor report as human-readable text.
53
+ */
54
+ export declare function formatDoctorReport(report: DoctorReport): string;
55
+ export declare function runDoctor(argv: string[]): void;
56
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;CAClB;AAID;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CAqB9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAkExD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAc/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,WAAW,CAyBvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAoC3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,WAAW,CAqDzF;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,WAAW,CAe1C;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,SAAM,GAAG,YAAY,CAmCvD;AAUD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4B/D;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8B9C"}
@@ -0,0 +1,363 @@
1
+ // ─── Doctor Command ──────────────────────────────────────────────────────────
2
+ // Diagnostic healthcheck for the Judges Panel environment.
3
+ //
4
+ // Validates: Node version, config file, plugins, feedback store, baseline,
5
+ // custom rules, and core system integrity.
6
+ //
7
+ // Usage:
8
+ // judges doctor # run all checks
9
+ // judges doctor --json # JSON output
10
+ // ──────────────────────────────────────────────────────────────────────────────
11
+ import { existsSync, readFileSync } from "fs";
12
+ import { resolve } from "path";
13
+ import { parseConfig, validatePluginSpecifiers } from "../config.js";
14
+ import { JUDGES } from "../judges/index.js";
15
+ import { listPresets } from "../presets.js";
16
+ // ─── Individual Checks ──────────────────────────────────────────────────────
17
+ /**
18
+ * Check Node.js version meets minimum requirements.
19
+ */
20
+ export function checkNodeVersion() {
21
+ const version = process.version;
22
+ const major = parseInt(version.slice(1).split(".")[0], 10);
23
+ if (major >= 20) {
24
+ return { name: "node-version", status: "pass", message: `Node.js ${version} (>= 20 required)` };
25
+ }
26
+ if (major >= 18) {
27
+ return {
28
+ name: "node-version",
29
+ status: "warn",
30
+ message: `Node.js ${version} — 18.x works but 20+ is recommended`,
31
+ detail: "Some features may not be available. Upgrade to Node.js 20 or later.",
32
+ };
33
+ }
34
+ return {
35
+ name: "node-version",
36
+ status: "fail",
37
+ message: `Node.js ${version} — minimum 18.x required`,
38
+ detail: "Judges Panel requires Node.js 18 or later. Please upgrade.",
39
+ };
40
+ }
41
+ /**
42
+ * Check for a .judgesrc config file and validate it.
43
+ */
44
+ export function checkConfigFile(dir) {
45
+ const candidates = [".judgesrc", ".judgesrc.json", ".judgesrc.yaml", ".judgesrc.yml"];
46
+ let found = null;
47
+ for (const name of candidates) {
48
+ const full = resolve(dir, name);
49
+ if (existsSync(full)) {
50
+ found = full;
51
+ break;
52
+ }
53
+ }
54
+ if (!found) {
55
+ return {
56
+ name: "config-file",
57
+ status: "warn",
58
+ message: "No .judgesrc config file found",
59
+ detail: "Using defaults. Run `judges init` to create a config file.",
60
+ };
61
+ }
62
+ try {
63
+ const raw = readFileSync(found, "utf-8");
64
+ const parsed = JSON.parse(raw);
65
+ const result = parseConfig(parsed);
66
+ // Check for unknown properties
67
+ const knownKeys = new Set([
68
+ "judges",
69
+ "threshold",
70
+ "minConfidence",
71
+ "maxFindings",
72
+ "enableDeepReview",
73
+ "severity",
74
+ "preset",
75
+ "failOnFindings",
76
+ "baseline",
77
+ "format",
78
+ "plugins",
79
+ "name",
80
+ ]);
81
+ const unknownKeys = Object.keys(parsed).filter((k) => !knownKeys.has(k));
82
+ if (unknownKeys.length > 0) {
83
+ return {
84
+ name: "config-file",
85
+ status: "warn",
86
+ message: `Config file has unknown properties: ${unknownKeys.join(", ")}`,
87
+ detail: `Found at: ${found}`,
88
+ };
89
+ }
90
+ return {
91
+ name: "config-file",
92
+ status: "pass",
93
+ message: `Config file valid: ${found}`,
94
+ detail: `Disabled judges: ${result.disabledJudges?.length ?? 0}, Min severity: ${result.minSeverity ?? "default"}`,
95
+ };
96
+ }
97
+ catch (err) {
98
+ return {
99
+ name: "config-file",
100
+ status: "fail",
101
+ message: `Config file invalid: ${found}`,
102
+ detail: err instanceof Error ? err.message : String(err),
103
+ };
104
+ }
105
+ }
106
+ /**
107
+ * Check that core judges are loaded.
108
+ */
109
+ export function checkJudgesLoaded() {
110
+ const count = JUDGES.length;
111
+ if (count === 0) {
112
+ return {
113
+ name: "judges-loaded",
114
+ status: "fail",
115
+ message: "No judges found — core module may be corrupted",
116
+ };
117
+ }
118
+ return {
119
+ name: "judges-loaded",
120
+ status: "pass",
121
+ message: `${count} judges loaded`,
122
+ };
123
+ }
124
+ /**
125
+ * Check plugin specifiers for validity (if config has plugins).
126
+ */
127
+ export function checkPlugins(config) {
128
+ if (!config.plugins || config.plugins.length === 0) {
129
+ return {
130
+ name: "plugins",
131
+ status: "pass",
132
+ message: "No plugins configured (none required)",
133
+ };
134
+ }
135
+ const errors = validatePluginSpecifiers(config.plugins);
136
+ if (errors.length > 0) {
137
+ return {
138
+ name: "plugins",
139
+ status: "fail",
140
+ message: `Plugin validation failed: ${errors.length} error(s)`,
141
+ detail: errors.join("\n"),
142
+ };
143
+ }
144
+ return {
145
+ name: "plugins",
146
+ status: "pass",
147
+ message: `${config.plugins.length} plugin(s) configured`,
148
+ detail: config.plugins.join(", "),
149
+ };
150
+ }
151
+ /**
152
+ * Check feedback store integrity.
153
+ */
154
+ export function checkFeedbackStore(dir) {
155
+ const storePath = resolve(dir, ".judges-feedback.json");
156
+ if (!existsSync(storePath)) {
157
+ return {
158
+ name: "feedback-store",
159
+ status: "pass",
160
+ message: "No feedback store found (optional)",
161
+ };
162
+ }
163
+ try {
164
+ const raw = readFileSync(storePath, "utf-8");
165
+ const parsed = JSON.parse(raw);
166
+ if (!parsed.version || !Array.isArray(parsed.entries)) {
167
+ return {
168
+ name: "feedback-store",
169
+ status: "warn",
170
+ message: "Feedback store has unexpected format",
171
+ detail: "Expected { version, entries[], metadata }",
172
+ };
173
+ }
174
+ return {
175
+ name: "feedback-store",
176
+ status: "pass",
177
+ message: `Feedback store valid: ${parsed.entries.length} entries`,
178
+ };
179
+ }
180
+ catch (err) {
181
+ return {
182
+ name: "feedback-store",
183
+ status: "fail",
184
+ message: "Feedback store corrupted",
185
+ detail: err instanceof Error ? err.message : String(err),
186
+ };
187
+ }
188
+ }
189
+ /**
190
+ * Check baseline file integrity (if configured or present).
191
+ */
192
+ export function checkBaselineFile(dir, config) {
193
+ const baselinePath = config.baseline ? resolve(dir, config.baseline) : resolve(dir, ".judges-baseline.json");
194
+ if (!existsSync(baselinePath)) {
195
+ if (config.baseline) {
196
+ return {
197
+ name: "baseline",
198
+ status: "fail",
199
+ message: `Configured baseline file not found: ${config.baseline}`,
200
+ };
201
+ }
202
+ return {
203
+ name: "baseline",
204
+ status: "pass",
205
+ message: "No baseline file (optional)",
206
+ };
207
+ }
208
+ try {
209
+ const raw = readFileSync(baselinePath, "utf-8");
210
+ const parsed = JSON.parse(raw);
211
+ if (parsed.version === 2 && typeof parsed.files === "object") {
212
+ const fileCount = Object.keys(parsed.files).length;
213
+ return {
214
+ name: "baseline",
215
+ status: "pass",
216
+ message: `Baseline V2: ${fileCount} file(s) baselined`,
217
+ };
218
+ }
219
+ if (Array.isArray(parsed.ignoredFindings)) {
220
+ return {
221
+ name: "baseline",
222
+ status: "warn",
223
+ message: `Baseline V1 detected — consider upgrading with \`judges baseline generate\``,
224
+ detail: `${parsed.ignoredFindings.length} suppressed finding(s)`,
225
+ };
226
+ }
227
+ return {
228
+ name: "baseline",
229
+ status: "warn",
230
+ message: "Baseline file has unrecognized format",
231
+ };
232
+ }
233
+ catch (err) {
234
+ return {
235
+ name: "baseline",
236
+ status: "fail",
237
+ message: "Baseline file corrupted",
238
+ detail: err instanceof Error ? err.message : String(err),
239
+ };
240
+ }
241
+ }
242
+ /**
243
+ * Check that presets are accessible.
244
+ */
245
+ export function checkPresets() {
246
+ const presets = listPresets();
247
+ if (presets.length === 0) {
248
+ return {
249
+ name: "presets",
250
+ status: "fail",
251
+ message: "No presets available — core module may be corrupted",
252
+ };
253
+ }
254
+ return {
255
+ name: "presets",
256
+ status: "pass",
257
+ message: `${presets.length} presets available`,
258
+ detail: presets.map((p) => p.name).join(", "),
259
+ };
260
+ }
261
+ // ─── Run All Checks ─────────────────────────────────────────────────────────
262
+ /**
263
+ * Run all diagnostic checks and produce a report.
264
+ */
265
+ export function runDoctorChecks(dir = ".") {
266
+ // Load config for context-aware checks
267
+ let config = {};
268
+ const configCandidates = [".judgesrc", ".judgesrc.json"];
269
+ for (const name of configCandidates) {
270
+ const full = resolve(dir, name);
271
+ if (existsSync(full)) {
272
+ try {
273
+ const raw = readFileSync(full, "utf-8");
274
+ config = parseConfig(JSON.parse(raw));
275
+ }
276
+ catch {
277
+ // Config parse errors are caught by checkConfigFile
278
+ }
279
+ break;
280
+ }
281
+ }
282
+ const checks = [
283
+ checkNodeVersion(),
284
+ checkConfigFile(dir),
285
+ checkJudgesLoaded(),
286
+ checkPlugins(config),
287
+ checkFeedbackStore(dir),
288
+ checkBaselineFile(dir, config),
289
+ checkPresets(),
290
+ ];
291
+ const summary = {
292
+ pass: checks.filter((c) => c.status === "pass").length,
293
+ warn: checks.filter((c) => c.status === "warn").length,
294
+ fail: checks.filter((c) => c.status === "fail").length,
295
+ total: checks.length,
296
+ };
297
+ return { checks, summary, healthy: summary.fail === 0 };
298
+ }
299
+ // ─── Format Output ──────────────────────────────────────────────────────────
300
+ const ICONS = {
301
+ pass: "✅",
302
+ warn: "⚠️",
303
+ fail: "❌",
304
+ };
305
+ /**
306
+ * Format a doctor report as human-readable text.
307
+ */
308
+ export function formatDoctorReport(report) {
309
+ const lines = [];
310
+ lines.push("╔══════════════════════════════════════════════════════════════╗");
311
+ lines.push("║ Judges Panel — Doctor Report ║");
312
+ lines.push("╚══════════════════════════════════════════════════════════════╝");
313
+ lines.push("");
314
+ for (const check of report.checks) {
315
+ lines.push(` ${ICONS[check.status]} ${check.message}`);
316
+ if (check.detail) {
317
+ lines.push(` ${check.detail}`);
318
+ }
319
+ }
320
+ lines.push("");
321
+ lines.push("─".repeat(60));
322
+ lines.push(` Summary: ${report.summary.pass} pass, ${report.summary.warn} warn, ${report.summary.fail} fail (${report.summary.total} checks)`);
323
+ if (report.healthy) {
324
+ lines.push(" Status: Healthy ✅");
325
+ }
326
+ else {
327
+ lines.push(" Status: Issues found ❌ — fix the errors above");
328
+ }
329
+ lines.push("");
330
+ return lines.join("\n");
331
+ }
332
+ // ─── CLI Entry Point ────────────────────────────────────────────────────────
333
+ export function runDoctor(argv) {
334
+ let format = "text";
335
+ let dir = ".";
336
+ for (let i = 3; i < argv.length; i++) {
337
+ const arg = argv[i];
338
+ if (arg === "--json")
339
+ format = "json";
340
+ else if (arg === "--help" || arg === "-h") {
341
+ console.log(`Usage: judges doctor [options]
342
+
343
+ Options:
344
+ --json Output as JSON
345
+ --help, -h Show this help
346
+
347
+ Runs diagnostic checks on your Judges Panel environment.`);
348
+ process.exit(0);
349
+ }
350
+ else if (!arg.startsWith("-")) {
351
+ dir = arg;
352
+ }
353
+ }
354
+ const report = runDoctorChecks(dir);
355
+ if (format === "json") {
356
+ console.log(JSON.stringify(report, null, 2));
357
+ }
358
+ else {
359
+ console.log(formatDoctorReport(report));
360
+ }
361
+ process.exit(report.healthy ? 0 : 1);
362
+ }
363
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}