@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.
- package/CHANGELOG.md +44 -0
- package/dist/api.d.ts +18 -5
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +15 -3
- package/dist/api.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +54 -36
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto-detect.d.ts +62 -0
- package/dist/commands/auto-detect.d.ts.map +1 -0
- package/dist/commands/auto-detect.js +329 -0
- package/dist/commands/auto-detect.js.map +1 -0
- package/dist/commands/baseline.d.ts +46 -0
- package/dist/commands/baseline.d.ts.map +1 -1
- package/dist/commands/baseline.js +290 -27
- package/dist/commands/baseline.js.map +1 -1
- package/dist/commands/benchmark.d.ts +21 -3
- package/dist/commands/benchmark.d.ts.map +1 -1
- package/dist/commands/benchmark.js +365 -6
- package/dist/commands/benchmark.js.map +1 -1
- package/dist/commands/coverage.d.ts +41 -0
- package/dist/commands/coverage.d.ts.map +1 -0
- package/dist/commands/coverage.js +184 -0
- package/dist/commands/coverage.js.map +1 -0
- package/dist/commands/doctor.d.ts +56 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +363 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/feedback.d.ts +42 -0
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +129 -0
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/rule-metrics.d.ts +44 -0
- package/dist/commands/rule-metrics.d.ts.map +1 -0
- package/dist/commands/rule-metrics.js +114 -0
- package/dist/commands/rule-metrics.js.map +1 -0
- package/dist/commands/rule.d.ts +65 -0
- package/dist/commands/rule.d.ts.map +1 -1
- package/dist/commands/rule.js +94 -0
- package/dist/commands/rule.js.map +1 -1
- package/dist/commands/snapshot.d.ts +81 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +189 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/config.d.ts +35 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +187 -2
- package/dist/config.js.map +1 -1
- package/dist/dedup.d.ts +35 -0
- package/dist/dedup.d.ts.map +1 -1
- package/dist/dedup.js +96 -0
- package/dist/dedup.js.map +1 -1
- package/dist/evaluators/index.d.ts +22 -2
- package/dist/evaluators/index.d.ts.map +1 -1
- package/dist/evaluators/index.js +144 -52
- package/dist/evaluators/index.js.map +1 -1
- package/dist/patches/index.d.ts.map +1 -1
- package/dist/patches/index.js +426 -0
- package/dist/patches/index.js.map +1 -1
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -1
- package/judgesrc.schema.json +5 -0
- package/package.json +1 -1
- 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
|
|
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
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|