@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
@@ -1 +1 @@
1
- {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../src/commands/rule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../src/commands/rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { Finding, Severity } from "../types.js";
2
+ export interface FindingSnapshot {
3
+ /** ISO timestamp of the evaluation run */
4
+ timestamp: string;
5
+ /** Optional branch name */
6
+ branch?: string;
7
+ /** Optional commit hash */
8
+ commit?: string;
9
+ /** Total number of findings in this run */
10
+ totalFindings: number;
11
+ /** Breakdown by severity */
12
+ bySeverity: Record<Severity, number>;
13
+ /** Unique rule IDs that appeared */
14
+ ruleIds: string[];
15
+ /** Optional label for identifying the run */
16
+ label?: string;
17
+ }
18
+ export interface SnapshotStore {
19
+ version: 1;
20
+ snapshots: FindingSnapshot[];
21
+ metadata: {
22
+ createdAt: string;
23
+ lastUpdated: string;
24
+ totalRuns: number;
25
+ };
26
+ }
27
+ export interface TrendPoint {
28
+ timestamp: string;
29
+ totalFindings: number;
30
+ critical: number;
31
+ high: number;
32
+ medium: number;
33
+ low: number;
34
+ delta: number;
35
+ label?: string;
36
+ }
37
+ export interface TrendReport {
38
+ points: TrendPoint[];
39
+ stats: {
40
+ totalRuns: number;
41
+ firstRun: string;
42
+ lastRun: string;
43
+ currentTotal: number;
44
+ previousTotal: number;
45
+ overallDelta: number;
46
+ trend: "improving" | "stable" | "regressing";
47
+ averageFindings: number;
48
+ };
49
+ }
50
+ /**
51
+ * Create a new empty snapshot store.
52
+ */
53
+ export declare function createSnapshotStore(): SnapshotStore;
54
+ /**
55
+ * Load a snapshot store from disk. Returns a new store if file doesn't exist.
56
+ */
57
+ export declare function loadSnapshotStore(filePath: string): SnapshotStore;
58
+ /**
59
+ * Save a snapshot store to disk.
60
+ */
61
+ export declare function saveSnapshotStore(store: SnapshotStore, filePath: string): void;
62
+ /**
63
+ * Record a snapshot of findings from an evaluation run.
64
+ *
65
+ * @param store - The snapshot store to append to
66
+ * @param findings - The findings from this run
67
+ * @param branch - Optional branch name
68
+ * @param commit - Optional commit hash
69
+ * @param label - Optional label for the run
70
+ */
71
+ export declare function recordSnapshot(store: SnapshotStore, findings: Finding[], branch?: string, commit?: string, label?: string): FindingSnapshot;
72
+ /**
73
+ * Compute a trend report from snapshot history.
74
+ * Identifies whether findings are improving, stable, or regressing over time.
75
+ */
76
+ export declare function computeTrend(store: SnapshotStore): TrendReport;
77
+ /**
78
+ * Format a trend report as human-readable text.
79
+ */
80
+ export declare function formatTrendReport(report: TrendReport): string;
81
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIrD,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrC,oCAAoC;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;QAC7C,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAID;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAWnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAYjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAG9E;AAID;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,eAAe,CAwBjB;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW,CAmE9D;AAUD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA+B7D"}
@@ -0,0 +1,189 @@
1
+ // ─── Finding Snapshot & Trend Tracking ───────────────────────────────────────
2
+ // Persist evaluation results per run and compute trends over time.
3
+ // Enables teams to track whether code quality is improving or regressing.
4
+ //
5
+ // Usage (programmatic):
6
+ // const store = loadSnapshotStore(".judges-snapshots.json");
7
+ // recordSnapshot(store, verdict, "main", "abc1234");
8
+ // saveSnapshotStore(store, ".judges-snapshots.json");
9
+ // const trend = computeTrend(store);
10
+ // console.log(formatTrendReport(trend));
11
+ // ──────────────────────────────────────────────────────────────────────────────
12
+ import { existsSync, readFileSync, writeFileSync } from "fs";
13
+ // ─── Store Management ───────────────────────────────────────────────────────
14
+ /**
15
+ * Create a new empty snapshot store.
16
+ */
17
+ export function createSnapshotStore() {
18
+ const now = new Date().toISOString();
19
+ return {
20
+ version: 1,
21
+ snapshots: [],
22
+ metadata: {
23
+ createdAt: now,
24
+ lastUpdated: now,
25
+ totalRuns: 0,
26
+ },
27
+ };
28
+ }
29
+ /**
30
+ * Load a snapshot store from disk. Returns a new store if file doesn't exist.
31
+ */
32
+ export function loadSnapshotStore(filePath) {
33
+ if (!existsSync(filePath))
34
+ return createSnapshotStore();
35
+ try {
36
+ const raw = readFileSync(filePath, "utf-8");
37
+ const parsed = JSON.parse(raw);
38
+ if (parsed.version !== 1 || !Array.isArray(parsed.snapshots)) {
39
+ return createSnapshotStore();
40
+ }
41
+ return parsed;
42
+ }
43
+ catch {
44
+ return createSnapshotStore();
45
+ }
46
+ }
47
+ /**
48
+ * Save a snapshot store to disk.
49
+ */
50
+ export function saveSnapshotStore(store, filePath) {
51
+ store.metadata.lastUpdated = new Date().toISOString();
52
+ writeFileSync(filePath, JSON.stringify(store, null, 2), "utf-8");
53
+ }
54
+ // ─── Recording ──────────────────────────────────────────────────────────────
55
+ /**
56
+ * Record a snapshot of findings from an evaluation run.
57
+ *
58
+ * @param store - The snapshot store to append to
59
+ * @param findings - The findings from this run
60
+ * @param branch - Optional branch name
61
+ * @param commit - Optional commit hash
62
+ * @param label - Optional label for the run
63
+ */
64
+ export function recordSnapshot(store, findings, branch, commit, label) {
65
+ const bySeverity = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
66
+ const ruleIdSet = new Set();
67
+ for (const f of findings) {
68
+ bySeverity[f.severity] = (bySeverity[f.severity] ?? 0) + 1;
69
+ ruleIdSet.add(f.ruleId);
70
+ }
71
+ const snapshot = {
72
+ timestamp: new Date().toISOString(),
73
+ branch,
74
+ commit,
75
+ totalFindings: findings.length,
76
+ bySeverity,
77
+ ruleIds: [...ruleIdSet].sort(),
78
+ label,
79
+ };
80
+ store.snapshots.push(snapshot);
81
+ store.metadata.totalRuns = store.snapshots.length;
82
+ store.metadata.lastUpdated = snapshot.timestamp;
83
+ return snapshot;
84
+ }
85
+ // ─── Trend Analysis ─────────────────────────────────────────────────────────
86
+ /**
87
+ * Compute a trend report from snapshot history.
88
+ * Identifies whether findings are improving, stable, or regressing over time.
89
+ */
90
+ export function computeTrend(store) {
91
+ if (store.snapshots.length === 0) {
92
+ const now = new Date().toISOString();
93
+ return {
94
+ points: [],
95
+ stats: {
96
+ totalRuns: 0,
97
+ firstRun: now,
98
+ lastRun: now,
99
+ currentTotal: 0,
100
+ previousTotal: 0,
101
+ overallDelta: 0,
102
+ trend: "stable",
103
+ averageFindings: 0,
104
+ },
105
+ };
106
+ }
107
+ // Sort by timestamp
108
+ const sorted = [...store.snapshots].sort((a, b) => a.timestamp.localeCompare(b.timestamp));
109
+ const points = [];
110
+ let prevTotal = 0;
111
+ for (const snap of sorted) {
112
+ points.push({
113
+ timestamp: snap.timestamp,
114
+ totalFindings: snap.totalFindings,
115
+ critical: snap.bySeverity.critical ?? 0,
116
+ high: snap.bySeverity.high ?? 0,
117
+ medium: snap.bySeverity.medium ?? 0,
118
+ low: snap.bySeverity.low ?? 0,
119
+ delta: snap.totalFindings - prevTotal,
120
+ label: snap.label,
121
+ });
122
+ prevTotal = snap.totalFindings;
123
+ }
124
+ const first = sorted[0];
125
+ const last = sorted[sorted.length - 1];
126
+ const overallDelta = last.totalFindings - first.totalFindings;
127
+ const average = sorted.reduce((sum, s) => sum + s.totalFindings, 0) / sorted.length;
128
+ // Determine trend: compare last 3 runs to first 3 runs (or fewer if not enough data)
129
+ let trend = "stable";
130
+ if (sorted.length >= 2) {
131
+ const recentCount = Math.min(3, Math.floor(sorted.length / 2));
132
+ const recentAvg = sorted.slice(-recentCount).reduce((sum, s) => sum + s.totalFindings, 0) / recentCount;
133
+ const earlyAvg = sorted.slice(0, recentCount).reduce((sum, s) => sum + s.totalFindings, 0) / recentCount;
134
+ if (recentAvg < earlyAvg * 0.9)
135
+ trend = "improving";
136
+ else if (recentAvg > earlyAvg * 1.1)
137
+ trend = "regressing";
138
+ }
139
+ return {
140
+ points,
141
+ stats: {
142
+ totalRuns: sorted.length,
143
+ firstRun: first.timestamp,
144
+ lastRun: last.timestamp,
145
+ currentTotal: last.totalFindings,
146
+ previousTotal: sorted.length >= 2 ? sorted[sorted.length - 2].totalFindings : 0,
147
+ overallDelta,
148
+ trend,
149
+ averageFindings: Math.round(average * 10) / 10,
150
+ },
151
+ };
152
+ }
153
+ // ─── Formatting ─────────────────────────────────────────────────────────────
154
+ const TREND_ICON = {
155
+ improving: "📉",
156
+ stable: "➡️",
157
+ regressing: "📈",
158
+ };
159
+ /**
160
+ * Format a trend report as human-readable text.
161
+ */
162
+ export function formatTrendReport(report) {
163
+ const lines = [];
164
+ lines.push("╔══════════════════════════════════════════════════════════════╗");
165
+ lines.push("║ Judges Panel — Findings Trend Report ║");
166
+ lines.push("╚══════════════════════════════════════════════════════════════╝");
167
+ lines.push("");
168
+ if (report.points.length === 0) {
169
+ lines.push(" No snapshot data available. Run evaluations to collect trend data.");
170
+ return lines.join("\n");
171
+ }
172
+ lines.push(` Runs analyzed : ${report.stats.totalRuns}`);
173
+ lines.push(` Current total : ${report.stats.currentTotal} finding(s)`);
174
+ lines.push(` Overall delta : ${report.stats.overallDelta >= 0 ? "+" : ""}${report.stats.overallDelta}`);
175
+ lines.push(` Average : ${report.stats.averageFindings} findings/run`);
176
+ lines.push(` Trend : ${TREND_ICON[report.stats.trend]} ${report.stats.trend}`);
177
+ lines.push("");
178
+ lines.push(" Run History:");
179
+ lines.push(" " + "─".repeat(55));
180
+ for (const point of report.points) {
181
+ const date = point.timestamp.slice(0, 10);
182
+ const delta = point.delta >= 0 ? `+${point.delta}` : `${point.delta}`;
183
+ const label = point.label ? ` [${point.label}]` : "";
184
+ lines.push(` ${date} ${String(point.totalFindings).padStart(4)} findings (${delta})${label}`);
185
+ }
186
+ lines.push("");
187
+ return lines.join("\n");
188
+ }
189
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { JudgesConfig } from "./types.js";
1
+ import type { JudgesConfig, JudgeDefinition } from "./types.js";
2
2
  /**
3
3
  * Parse a JSON string into a JudgesConfig, with validation.
4
4
  */
@@ -14,8 +14,9 @@ export declare function defaultConfig(): JudgesConfig;
14
14
  export declare function discoverCascadingConfigs(startDir: string, rootDir?: string): JudgesConfig[];
15
15
  /**
16
16
  * Merge multiple configs (root → leaf order). Later entries override earlier.
17
- * Arrays (disabledRules, disabledJudges, languages, exclude, include) are
18
- * concatenated (union). Scalars (minSeverity, maxFiles) use the leaf value.
17
+ * Arrays (disabledRules, disabledJudges, languages, exclude, include, plugins) are
18
+ * concatenated (union). Scalars (minSeverity, maxFiles, preset, failOnFindings,
19
+ * baseline, format) use the leaf value.
19
20
  * ruleOverrides are deep-merged.
20
21
  */
21
22
  export declare function mergeConfigs(...configs: JudgesConfig[]): JudgesConfig;
@@ -24,4 +25,35 @@ export declare function mergeConfigs(...configs: JudgesConfig[]): JudgesConfig;
24
25
  * Walks from the file's directory up to rootDir, merging all .judgesrc files.
25
26
  */
26
27
  export declare function loadCascadingConfig(filePath: string, rootDir?: string): JudgesConfig;
28
+ /**
29
+ * Validate that a value looks like a JudgeDefinition.
30
+ * Checks required string fields (id, name, domain, description, systemPrompt,
31
+ * rulePrefix) and an optional analyze function.
32
+ */
33
+ export declare function isValidJudgeDefinition(val: unknown): val is JudgeDefinition;
34
+ /**
35
+ * Load and register plugins from module specifiers declared in config.
36
+ *
37
+ * Each plugin is a module specifier (npm package name or relative/absolute
38
+ * file path) that must export one of:
39
+ * - `default: JudgesPlugin` — a full plugin object (name, version, judges, rules, hooks)
40
+ * - `plugin: JudgesPlugin` — named export
41
+ * - `judges: JudgeDefinition[]` — an array of judge definitions (auto-wrapped)
42
+ * - `default: JudgeDefinition[]` — default export as an array (auto-wrapped)
43
+ *
44
+ * Plugins that export a full JudgesPlugin object are registered via
45
+ * registerPlugin() to enable hooks, custom rules, and full lifecycle.
46
+ * Simple judge arrays are wrapped into a minimal plugin automatically.
47
+ *
48
+ * @param pluginSpecifiers - Array of module specifiers from config.plugins
49
+ * @param baseDir - Base directory for resolving relative paths
50
+ * @param logError - Optional error logger (defaults to console.error)
51
+ * @returns Array of plugin judge definitions that were loaded
52
+ */
53
+ export declare function loadPluginJudges(pluginSpecifiers: string[], baseDir?: string, logError?: (msg: string) => void): Promise<JudgeDefinition[]>;
54
+ /**
55
+ * Synchronously validate plugin specifiers without loading them.
56
+ * Returns an array of validation error messages (empty if all valid).
57
+ */
58
+ export declare function validatePluginSpecifiers(specifiers: string[]): string[];
27
59
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,YAAY,CAAC;AAKzD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CA0EzD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,YAAY,CAE5C;AAOD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAgC3F;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,CAgCrE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAIpF"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAY,eAAe,EAAE,MAAM,YAAY,CAAC;AAQ1E;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CA4IzD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,YAAY,CAE5C;AAOD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAgC3F;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,CAuCrE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAIpF;AAID;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,eAAe,CAY3E;AAWD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAoB,GAC9C,OAAO,CAAC,eAAe,EAAE,CAAC,CAyD5B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAgBvE"}
package/dist/config.js CHANGED
@@ -4,8 +4,10 @@
4
4
  // ──────────────────────────────────────────────────────────────────────────────
5
5
  import { existsSync, readFileSync } from "fs";
6
6
  import { resolve, dirname, join } from "path";
7
+ import { registerPlugin } from "./plugins.js";
7
8
  import { ConfigError } from "./errors.js";
8
9
  const VALID_SEVERITIES = new Set(["critical", "high", "medium", "low", "info"]);
10
+ const VALID_FORMATS = new Set(["text", "json", "sarif", "markdown", "html", "junit", "codeclimate"]);
9
11
  /**
10
12
  * Parse a JSON string into a JudgesConfig, with validation.
11
13
  */
@@ -75,6 +77,62 @@ export function parseConfig(jsonStr) {
75
77
  }
76
78
  config.ruleOverrides = overrides;
77
79
  }
80
+ // exclude
81
+ if (obj.exclude !== undefined) {
82
+ if (!Array.isArray(obj.exclude) || !obj.exclude.every((e) => typeof e === "string")) {
83
+ throw new ConfigError('Invalid .judgesrc: "exclude" must be an array of strings');
84
+ }
85
+ config.exclude = obj.exclude;
86
+ }
87
+ // include
88
+ if (obj.include !== undefined) {
89
+ if (!Array.isArray(obj.include) || !obj.include.every((e) => typeof e === "string")) {
90
+ throw new ConfigError('Invalid .judgesrc: "include" must be an array of strings');
91
+ }
92
+ config.include = obj.include;
93
+ }
94
+ // maxFiles
95
+ if (obj.maxFiles !== undefined) {
96
+ if (typeof obj.maxFiles !== "number" || !Number.isInteger(obj.maxFiles) || obj.maxFiles < 1) {
97
+ throw new ConfigError('Invalid .judgesrc: "maxFiles" must be an integer >= 1');
98
+ }
99
+ config.maxFiles = obj.maxFiles;
100
+ }
101
+ // preset
102
+ if (obj.preset !== undefined) {
103
+ if (typeof obj.preset !== "string") {
104
+ throw new ConfigError('Invalid .judgesrc: "preset" must be a string');
105
+ }
106
+ config.preset = obj.preset;
107
+ }
108
+ // failOnFindings
109
+ if (obj.failOnFindings !== undefined) {
110
+ if (typeof obj.failOnFindings !== "boolean") {
111
+ throw new ConfigError('Invalid .judgesrc: "failOnFindings" must be a boolean');
112
+ }
113
+ config.failOnFindings = obj.failOnFindings;
114
+ }
115
+ // baseline
116
+ if (obj.baseline !== undefined) {
117
+ if (typeof obj.baseline !== "string") {
118
+ throw new ConfigError('Invalid .judgesrc: "baseline" must be a string (file path)');
119
+ }
120
+ config.baseline = obj.baseline;
121
+ }
122
+ // format
123
+ if (obj.format !== undefined) {
124
+ if (typeof obj.format !== "string" || !VALID_FORMATS.has(obj.format)) {
125
+ throw new ConfigError('Invalid .judgesrc: "format" must be one of text, json, sarif, markdown, html, junit, codeclimate');
126
+ }
127
+ config.format = obj.format;
128
+ }
129
+ // plugins
130
+ if (obj.plugins !== undefined) {
131
+ if (!Array.isArray(obj.plugins) || !obj.plugins.every((p) => typeof p === "string")) {
132
+ throw new ConfigError('Invalid .judgesrc: "plugins" must be an array of strings (module specifiers)');
133
+ }
134
+ config.plugins = obj.plugins;
135
+ }
78
136
  return config;
79
137
  }
80
138
  /**
@@ -124,8 +182,9 @@ export function discoverCascadingConfigs(startDir, rootDir) {
124
182
  }
125
183
  /**
126
184
  * Merge multiple configs (root → leaf order). Later entries override earlier.
127
- * Arrays (disabledRules, disabledJudges, languages, exclude, include) are
128
- * concatenated (union). Scalars (minSeverity, maxFiles) use the leaf value.
185
+ * Arrays (disabledRules, disabledJudges, languages, exclude, include, plugins) are
186
+ * concatenated (union). Scalars (minSeverity, maxFiles, preset, failOnFindings,
187
+ * baseline, format) use the leaf value.
129
188
  * ruleOverrides are deep-merged.
130
189
  */
131
190
  export function mergeConfigs(...configs) {
@@ -147,11 +206,22 @@ export function mergeConfigs(...configs) {
147
206
  if (cfg.include) {
148
207
  merged.include = [...new Set([...(merged.include ?? []), ...cfg.include])];
149
208
  }
209
+ if (cfg.plugins) {
210
+ merged.plugins = [...new Set([...(merged.plugins ?? []), ...cfg.plugins])];
211
+ }
150
212
  // Scalars: leaf wins
151
213
  if (cfg.minSeverity !== undefined)
152
214
  merged.minSeverity = cfg.minSeverity;
153
215
  if (cfg.maxFiles !== undefined)
154
216
  merged.maxFiles = cfg.maxFiles;
217
+ if (cfg.preset !== undefined)
218
+ merged.preset = cfg.preset;
219
+ if (cfg.failOnFindings !== undefined)
220
+ merged.failOnFindings = cfg.failOnFindings;
221
+ if (cfg.baseline !== undefined)
222
+ merged.baseline = cfg.baseline;
223
+ if (cfg.format !== undefined)
224
+ merged.format = cfg.format;
155
225
  // Deep-merge ruleOverrides
156
226
  if (cfg.ruleOverrides) {
157
227
  merged.ruleOverrides = { ...(merged.ruleOverrides ?? {}), ...cfg.ruleOverrides };
@@ -168,4 +238,119 @@ export function loadCascadingConfig(filePath, rootDir) {
168
238
  const configs = discoverCascadingConfigs(dir, rootDir);
169
239
  return configs.length > 0 ? mergeConfigs(...configs) : {};
170
240
  }
241
+ // ─── Plugin Loading ─────────────────────────────────────────────────────────
242
+ /**
243
+ * Validate that a value looks like a JudgeDefinition.
244
+ * Checks required string fields (id, name, domain, description, systemPrompt,
245
+ * rulePrefix) and an optional analyze function.
246
+ */
247
+ export function isValidJudgeDefinition(val) {
248
+ if (typeof val !== "object" || val === null)
249
+ return false;
250
+ const obj = val;
251
+ return (typeof obj.id === "string" &&
252
+ typeof obj.name === "string" &&
253
+ typeof obj.domain === "string" &&
254
+ typeof obj.description === "string" &&
255
+ typeof obj.systemPrompt === "string" &&
256
+ typeof obj.rulePrefix === "string" &&
257
+ (obj.analyze === undefined || typeof obj.analyze === "function"));
258
+ }
259
+ /**
260
+ * Validate that a value looks like a JudgesPlugin.
261
+ */
262
+ function isValidPlugin(val) {
263
+ if (typeof val !== "object" || val === null)
264
+ return false;
265
+ const obj = val;
266
+ return typeof obj.name === "string" && typeof obj.version === "string";
267
+ }
268
+ /**
269
+ * Load and register plugins from module specifiers declared in config.
270
+ *
271
+ * Each plugin is a module specifier (npm package name or relative/absolute
272
+ * file path) that must export one of:
273
+ * - `default: JudgesPlugin` — a full plugin object (name, version, judges, rules, hooks)
274
+ * - `plugin: JudgesPlugin` — named export
275
+ * - `judges: JudgeDefinition[]` — an array of judge definitions (auto-wrapped)
276
+ * - `default: JudgeDefinition[]` — default export as an array (auto-wrapped)
277
+ *
278
+ * Plugins that export a full JudgesPlugin object are registered via
279
+ * registerPlugin() to enable hooks, custom rules, and full lifecycle.
280
+ * Simple judge arrays are wrapped into a minimal plugin automatically.
281
+ *
282
+ * @param pluginSpecifiers - Array of module specifiers from config.plugins
283
+ * @param baseDir - Base directory for resolving relative paths
284
+ * @param logError - Optional error logger (defaults to console.error)
285
+ * @returns Array of plugin judge definitions that were loaded
286
+ */
287
+ export async function loadPluginJudges(pluginSpecifiers, baseDir, logError = console.error) {
288
+ const loaded = [];
289
+ for (const specifier of pluginSpecifiers) {
290
+ try {
291
+ // Resolve relative paths against baseDir
292
+ const resolvedSpec = specifier.startsWith(".") || specifier.startsWith("/")
293
+ ? resolve(baseDir ?? process.cwd(), specifier)
294
+ : specifier;
295
+ // Dynamic import the module
296
+ const mod = (await import(resolvedSpec));
297
+ // Strategy 1: Full JudgesPlugin export (best — gets hooks, rules, etc.)
298
+ const pluginObj = isValidPlugin(mod.default) ? mod.default : isValidPlugin(mod.plugin) ? mod.plugin : null;
299
+ if (pluginObj) {
300
+ const reg = registerPlugin(pluginObj);
301
+ if (pluginObj.judges) {
302
+ loaded.push(...pluginObj.judges);
303
+ }
304
+ if (!reg.rulesRegistered && !reg.judgesRegistered) {
305
+ logError(`Plugin "${specifier}": registered but has no rules or judges`);
306
+ }
307
+ continue;
308
+ }
309
+ // Strategy 2: Bare JudgeDefinition array — wrap into a minimal plugin
310
+ let candidates = [];
311
+ if (Array.isArray(mod.judges)) {
312
+ candidates = mod.judges;
313
+ }
314
+ else if (Array.isArray(mod.default)) {
315
+ candidates = mod.default;
316
+ }
317
+ const validJudges = candidates.filter(isValidJudgeDefinition);
318
+ if (validJudges.length > 0) {
319
+ registerPlugin({
320
+ name: specifier,
321
+ version: "0.0.0",
322
+ judges: validJudges,
323
+ });
324
+ loaded.push(...validJudges);
325
+ continue;
326
+ }
327
+ logError(`Plugin "${specifier}": no valid plugin or judge definitions found. ` +
328
+ `Export a JudgesPlugin object or an array of JudgeDefinition objects.`);
329
+ }
330
+ catch (err) {
331
+ const msg = err instanceof Error ? err.message : String(err);
332
+ logError(`Plugin "${specifier}": failed to load — ${msg}`);
333
+ }
334
+ }
335
+ return loaded;
336
+ }
337
+ /**
338
+ * Synchronously validate plugin specifiers without loading them.
339
+ * Returns an array of validation error messages (empty if all valid).
340
+ */
341
+ export function validatePluginSpecifiers(specifiers) {
342
+ const errors = [];
343
+ const seen = new Set();
344
+ for (const spec of specifiers) {
345
+ if (typeof spec !== "string" || spec.trim().length === 0) {
346
+ errors.push(`Invalid plugin specifier: must be a non-empty string`);
347
+ continue;
348
+ }
349
+ if (seen.has(spec)) {
350
+ errors.push(`Duplicate plugin specifier: "${spec}"`);
351
+ }
352
+ seen.add(spec);
353
+ }
354
+ return errors;
355
+ }
171
356
  //# sourceMappingURL=config.js.map