@kevinrabun/judges 3.5.0 → 3.6.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.
- package/dist/api.d.ts +17 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +18 -0
- package/dist/api.js.map +1 -1
- package/dist/calibration.d.ts +58 -0
- package/dist/calibration.d.ts.map +1 -0
- package/dist/calibration.js +125 -0
- package/dist/calibration.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +54 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/benchmark.d.ts +100 -0
- package/dist/commands/benchmark.d.ts.map +1 -0
- package/dist/commands/benchmark.js +663 -0
- package/dist/commands/benchmark.js.map +1 -0
- package/dist/commands/config-share.d.ts +49 -0
- package/dist/commands/config-share.d.ts.map +1 -0
- package/dist/commands/config-share.js +181 -0
- package/dist/commands/config-share.js.map +1 -0
- package/dist/commands/feedback.d.ts +87 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +320 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/language-packs.d.ts +43 -0
- package/dist/commands/language-packs.d.ts.map +1 -0
- package/dist/commands/language-packs.js +151 -0
- package/dist/commands/language-packs.js.map +1 -0
- package/dist/commands/rule.d.ts +50 -0
- package/dist/commands/rule.d.ts.map +1 -0
- package/dist/commands/rule.js +202 -0
- package/dist/commands/rule.js.map +1 -0
- package/dist/commands/smart-output.d.ts +39 -0
- package/dist/commands/smart-output.d.ts.map +1 -0
- package/dist/commands/smart-output.js +176 -0
- package/dist/commands/smart-output.js.map +1 -0
- package/dist/comparison.d.ts +68 -0
- package/dist/comparison.d.ts.map +1 -0
- package/dist/comparison.js +254 -0
- package/dist/comparison.js.map +1 -0
- package/dist/fingerprint.d.ts +40 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +180 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/fix-history.d.ts +72 -0
- package/dist/fix-history.d.ts.map +1 -0
- package/dist/fix-history.js +127 -0
- package/dist/fix-history.js.map +1 -0
- package/dist/formatters/diagnostics.d.ts +82 -0
- package/dist/formatters/diagnostics.d.ts.map +1 -0
- package/dist/formatters/diagnostics.js +153 -0
- package/dist/formatters/diagnostics.js.map +1 -0
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/plugins.d.ts +103 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +187 -0
- package/dist/plugins.js.map +1 -0
- package/package.json +17 -1
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges feedback` — False-positive tracking & finding feedback.
|
|
3
|
+
*
|
|
4
|
+
* Allows users to mark findings as true positives, false positives,
|
|
5
|
+
* or "won't fix" and persists feedback to a local .judges-feedback.json file.
|
|
6
|
+
* This data is used by the confidence calibration system to improve
|
|
7
|
+
* accuracy over time.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* judges feedback submit --rule SEC-001 --verdict fp # Mark false positive
|
|
11
|
+
* judges feedback submit --rule AUTH-002 --verdict tp # Mark true positive
|
|
12
|
+
* judges feedback submit --rule SEC-001 --verdict wontfix # Won't fix
|
|
13
|
+
* judges feedback stats # Show FP rate stats
|
|
14
|
+
* judges feedback export # Export feedback data
|
|
15
|
+
* judges feedback reset # Clear all feedback
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
18
|
+
import { resolve, dirname } from "path";
|
|
19
|
+
// ─── Feedback Store Operations ──────────────────────────────────────────────
|
|
20
|
+
const DEFAULT_FEEDBACK_FILE = ".judges-feedback.json";
|
|
21
|
+
function createEmptyStore() {
|
|
22
|
+
const now = new Date().toISOString();
|
|
23
|
+
return {
|
|
24
|
+
version: 1,
|
|
25
|
+
entries: [],
|
|
26
|
+
metadata: {
|
|
27
|
+
createdAt: now,
|
|
28
|
+
lastUpdated: now,
|
|
29
|
+
totalSubmissions: 0,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function loadFeedbackStore(feedbackPath) {
|
|
34
|
+
const filePath = resolve(feedbackPath || DEFAULT_FEEDBACK_FILE);
|
|
35
|
+
if (!existsSync(filePath)) {
|
|
36
|
+
return createEmptyStore();
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const raw = JSON.parse(readFileSync(filePath, "utf-8"));
|
|
40
|
+
if (raw.version === 1 && Array.isArray(raw.entries)) {
|
|
41
|
+
return raw;
|
|
42
|
+
}
|
|
43
|
+
return createEmptyStore();
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return createEmptyStore();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function saveFeedbackStore(store, feedbackPath) {
|
|
50
|
+
const filePath = resolve(feedbackPath || DEFAULT_FEEDBACK_FILE);
|
|
51
|
+
const dir = dirname(filePath);
|
|
52
|
+
if (!existsSync(dir)) {
|
|
53
|
+
mkdirSync(dir, { recursive: true });
|
|
54
|
+
}
|
|
55
|
+
store.metadata.lastUpdated = new Date().toISOString();
|
|
56
|
+
writeFileSync(filePath, JSON.stringify(store, null, 2), "utf-8");
|
|
57
|
+
}
|
|
58
|
+
export function addFeedback(store, entry) {
|
|
59
|
+
store.entries.push(entry);
|
|
60
|
+
store.metadata.totalSubmissions++;
|
|
61
|
+
store.metadata.lastUpdated = new Date().toISOString();
|
|
62
|
+
return store;
|
|
63
|
+
}
|
|
64
|
+
// ─── Statistics ─────────────────────────────────────────────────────────────
|
|
65
|
+
export function computeFeedbackStats(store) {
|
|
66
|
+
const perRule = new Map();
|
|
67
|
+
const perJudge = new Map();
|
|
68
|
+
let tp = 0;
|
|
69
|
+
let fp = 0;
|
|
70
|
+
let wontfix = 0;
|
|
71
|
+
for (const entry of store.entries) {
|
|
72
|
+
// Overall counts
|
|
73
|
+
if (entry.verdict === "tp")
|
|
74
|
+
tp++;
|
|
75
|
+
else if (entry.verdict === "fp")
|
|
76
|
+
fp++;
|
|
77
|
+
else if (entry.verdict === "wontfix")
|
|
78
|
+
wontfix++;
|
|
79
|
+
// Per-rule stats
|
|
80
|
+
const ruleStats = perRule.get(entry.ruleId) || {
|
|
81
|
+
ruleId: entry.ruleId,
|
|
82
|
+
total: 0,
|
|
83
|
+
tp: 0,
|
|
84
|
+
fp: 0,
|
|
85
|
+
wontfix: 0,
|
|
86
|
+
fpRate: 0,
|
|
87
|
+
};
|
|
88
|
+
ruleStats.total++;
|
|
89
|
+
if (entry.verdict === "tp")
|
|
90
|
+
ruleStats.tp++;
|
|
91
|
+
else if (entry.verdict === "fp")
|
|
92
|
+
ruleStats.fp++;
|
|
93
|
+
else if (entry.verdict === "wontfix")
|
|
94
|
+
ruleStats.wontfix++;
|
|
95
|
+
ruleStats.fpRate = ruleStats.total > 0 ? ruleStats.fp / ruleStats.total : 0;
|
|
96
|
+
perRule.set(entry.ruleId, ruleStats);
|
|
97
|
+
// Per-judge stats (by rule prefix, e.g. "SEC" from "SEC-001")
|
|
98
|
+
const prefix = entry.ruleId.split("-")[0];
|
|
99
|
+
if (prefix) {
|
|
100
|
+
const judgeStats = perJudge.get(prefix) || {
|
|
101
|
+
judgePrefix: prefix,
|
|
102
|
+
total: 0,
|
|
103
|
+
tp: 0,
|
|
104
|
+
fp: 0,
|
|
105
|
+
wontfix: 0,
|
|
106
|
+
fpRate: 0,
|
|
107
|
+
};
|
|
108
|
+
judgeStats.total++;
|
|
109
|
+
if (entry.verdict === "tp")
|
|
110
|
+
judgeStats.tp++;
|
|
111
|
+
else if (entry.verdict === "fp")
|
|
112
|
+
judgeStats.fp++;
|
|
113
|
+
else if (entry.verdict === "wontfix")
|
|
114
|
+
judgeStats.wontfix++;
|
|
115
|
+
judgeStats.fpRate = judgeStats.total > 0 ? judgeStats.fp / judgeStats.total : 0;
|
|
116
|
+
perJudge.set(prefix, judgeStats);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const total = store.entries.length;
|
|
120
|
+
return {
|
|
121
|
+
total,
|
|
122
|
+
truePositives: tp,
|
|
123
|
+
falsePositives: fp,
|
|
124
|
+
wontFix: wontfix,
|
|
125
|
+
falsePositiveRate: total > 0 ? fp / total : 0,
|
|
126
|
+
perRule,
|
|
127
|
+
perJudge,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get a lookup map of FP rates by rule ID, suitable for confidence calibration.
|
|
132
|
+
*/
|
|
133
|
+
export function getFpRateByRule(store) {
|
|
134
|
+
const stats = computeFeedbackStats(store);
|
|
135
|
+
const result = new Map();
|
|
136
|
+
for (const [ruleId, ruleStat] of stats.perRule) {
|
|
137
|
+
if (ruleStat.total >= 3) {
|
|
138
|
+
// Only calibrate if we have enough data
|
|
139
|
+
result.set(ruleId, ruleStat.fpRate);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
function parseFeedbackArgs(argv) {
|
|
145
|
+
const args = {
|
|
146
|
+
subcommand: argv[3] || "stats",
|
|
147
|
+
format: "text",
|
|
148
|
+
};
|
|
149
|
+
for (let i = 4; i < argv.length; i++) {
|
|
150
|
+
const arg = argv[i];
|
|
151
|
+
switch (arg) {
|
|
152
|
+
case "--rule":
|
|
153
|
+
case "-r":
|
|
154
|
+
args.ruleId = argv[++i];
|
|
155
|
+
break;
|
|
156
|
+
case "--verdict":
|
|
157
|
+
case "-v":
|
|
158
|
+
args.verdict = argv[++i];
|
|
159
|
+
break;
|
|
160
|
+
case "--comment":
|
|
161
|
+
case "-m":
|
|
162
|
+
args.comment = argv[++i];
|
|
163
|
+
break;
|
|
164
|
+
case "--file":
|
|
165
|
+
case "-f":
|
|
166
|
+
args.filePath = argv[++i];
|
|
167
|
+
break;
|
|
168
|
+
case "--title":
|
|
169
|
+
args.title = argv[++i];
|
|
170
|
+
break;
|
|
171
|
+
case "--severity":
|
|
172
|
+
args.severity = argv[++i];
|
|
173
|
+
break;
|
|
174
|
+
case "--feedback-file":
|
|
175
|
+
args.feedbackFile = argv[++i];
|
|
176
|
+
break;
|
|
177
|
+
case "--format":
|
|
178
|
+
case "-o":
|
|
179
|
+
args.format = argv[++i];
|
|
180
|
+
break;
|
|
181
|
+
default:
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return args;
|
|
186
|
+
}
|
|
187
|
+
function printFeedbackHelp() {
|
|
188
|
+
console.log(`
|
|
189
|
+
Judges Panel — Feedback & False Positive Tracking
|
|
190
|
+
|
|
191
|
+
USAGE:
|
|
192
|
+
judges feedback submit --rule <id> --verdict <tp|fp|wontfix> Submit feedback
|
|
193
|
+
judges feedback stats View FP rate stats
|
|
194
|
+
judges feedback export Export as JSON
|
|
195
|
+
judges feedback reset Clear all feedback
|
|
196
|
+
|
|
197
|
+
SUBMIT OPTIONS:
|
|
198
|
+
--rule, -r <id> Rule ID (e.g. SEC-001, AUTH-002)
|
|
199
|
+
--verdict, -v <verdict> tp (true positive), fp (false positive), wontfix
|
|
200
|
+
--comment, -m <text> Optional comment explaining the feedback
|
|
201
|
+
--file, -f <path> File where finding was reported
|
|
202
|
+
--title <text> Finding title for context
|
|
203
|
+
--severity <sev> Finding severity
|
|
204
|
+
--feedback-file <path> Path to feedback file (default: .judges-feedback.json)
|
|
205
|
+
--format, -o <fmt> Output format: text, json
|
|
206
|
+
|
|
207
|
+
EXAMPLES:
|
|
208
|
+
judges feedback submit --rule SEC-001 --verdict fp --comment "Used in test file"
|
|
209
|
+
judges feedback submit --rule AUTH-002 --verdict tp
|
|
210
|
+
judges feedback stats
|
|
211
|
+
judges feedback export > feedback-report.json
|
|
212
|
+
`);
|
|
213
|
+
}
|
|
214
|
+
function formatStatsOutput(stats) {
|
|
215
|
+
const lines = [];
|
|
216
|
+
lines.push("╔══════════════════════════════════════════════════════════════╗");
|
|
217
|
+
lines.push("║ Judges Panel — Feedback Statistics ║");
|
|
218
|
+
lines.push("╚══════════════════════════════════════════════════════════════╝");
|
|
219
|
+
lines.push("");
|
|
220
|
+
lines.push(` Total Feedback : ${stats.total}`);
|
|
221
|
+
lines.push(` True Positives : ${stats.truePositives}`);
|
|
222
|
+
lines.push(` False Positives : ${stats.falsePositives}`);
|
|
223
|
+
lines.push(` Won't Fix : ${stats.wontFix}`);
|
|
224
|
+
lines.push(` FP Rate : ${(stats.falsePositiveRate * 100).toFixed(1)}%`);
|
|
225
|
+
lines.push("");
|
|
226
|
+
if (stats.perJudge.size > 0) {
|
|
227
|
+
lines.push(" Per-Judge FP Rates:");
|
|
228
|
+
lines.push(" " + "─".repeat(55));
|
|
229
|
+
const sorted = [...stats.perJudge.values()].sort((a, b) => b.fpRate - a.fpRate);
|
|
230
|
+
for (const j of sorted) {
|
|
231
|
+
const prefix = j.judgePrefix.padEnd(12);
|
|
232
|
+
const rate = `${(j.fpRate * 100).toFixed(1)}%`.padStart(6);
|
|
233
|
+
const counts = `${j.tp}tp / ${j.fp}fp / ${j.wontfix}wf`;
|
|
234
|
+
lines.push(` ${prefix} FP: ${rate} (${counts})`);
|
|
235
|
+
}
|
|
236
|
+
lines.push("");
|
|
237
|
+
}
|
|
238
|
+
if (stats.perRule.size > 0) {
|
|
239
|
+
lines.push(" Per-Rule FP Rates (top 20):");
|
|
240
|
+
lines.push(" " + "─".repeat(55));
|
|
241
|
+
const sorted = [...stats.perRule.values()].sort((a, b) => b.fpRate - a.fpRate).slice(0, 20);
|
|
242
|
+
for (const r of sorted) {
|
|
243
|
+
const ruleId = r.ruleId.padEnd(12);
|
|
244
|
+
const rate = `${(r.fpRate * 100).toFixed(1)}%`.padStart(6);
|
|
245
|
+
const counts = `${r.tp}tp / ${r.fp}fp / ${r.wontfix}wf`;
|
|
246
|
+
lines.push(` ${ruleId} FP: ${rate} (${counts})`);
|
|
247
|
+
}
|
|
248
|
+
lines.push("");
|
|
249
|
+
}
|
|
250
|
+
return lines.join("\n");
|
|
251
|
+
}
|
|
252
|
+
export function runFeedback(argv) {
|
|
253
|
+
const args = parseFeedbackArgs(argv);
|
|
254
|
+
if (args.subcommand === "--help" || args.subcommand === "-h") {
|
|
255
|
+
printFeedbackHelp();
|
|
256
|
+
process.exit(0);
|
|
257
|
+
}
|
|
258
|
+
const store = loadFeedbackStore(args.feedbackFile);
|
|
259
|
+
switch (args.subcommand) {
|
|
260
|
+
case "submit": {
|
|
261
|
+
if (!args.ruleId) {
|
|
262
|
+
console.error("Error: --rule is required for submit");
|
|
263
|
+
process.exit(1);
|
|
264
|
+
}
|
|
265
|
+
if (!args.verdict || !["tp", "fp", "wontfix"].includes(args.verdict)) {
|
|
266
|
+
console.error("Error: --verdict must be one of: tp, fp, wontfix");
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
const entry = {
|
|
270
|
+
ruleId: args.ruleId.toUpperCase(),
|
|
271
|
+
verdict: args.verdict,
|
|
272
|
+
comment: args.comment,
|
|
273
|
+
filePath: args.filePath,
|
|
274
|
+
title: args.title,
|
|
275
|
+
severity: args.severity,
|
|
276
|
+
timestamp: new Date().toISOString(),
|
|
277
|
+
};
|
|
278
|
+
addFeedback(store, entry);
|
|
279
|
+
saveFeedbackStore(store, args.feedbackFile);
|
|
280
|
+
const verdictLabel = { tp: "true positive", fp: "false positive", wontfix: "won't fix" };
|
|
281
|
+
console.log(`✓ Recorded ${args.ruleId.toUpperCase()} as ${verdictLabel[args.verdict]}`);
|
|
282
|
+
process.exit(0);
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
case "stats": {
|
|
286
|
+
const stats = computeFeedbackStats(store);
|
|
287
|
+
if (args.format === "json") {
|
|
288
|
+
// Convert Maps to objects for JSON
|
|
289
|
+
const jsonStats = {
|
|
290
|
+
...stats,
|
|
291
|
+
perRule: Object.fromEntries(stats.perRule),
|
|
292
|
+
perJudge: Object.fromEntries(stats.perJudge),
|
|
293
|
+
};
|
|
294
|
+
console.log(JSON.stringify(jsonStats, null, 2));
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
console.log(formatStatsOutput(stats));
|
|
298
|
+
}
|
|
299
|
+
process.exit(0);
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
case "export": {
|
|
303
|
+
console.log(JSON.stringify(store, null, 2));
|
|
304
|
+
process.exit(0);
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
case "reset": {
|
|
308
|
+
const empty = createEmptyStore();
|
|
309
|
+
saveFeedbackStore(empty, args.feedbackFile);
|
|
310
|
+
console.log("✓ Feedback store reset");
|
|
311
|
+
process.exit(0);
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
default:
|
|
315
|
+
console.error(`Unknown feedback subcommand: ${args.subcommand}`);
|
|
316
|
+
printFeedbackHelp();
|
|
317
|
+
process.exit(1);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language Packs — Preset rule configurations per language
|
|
3
|
+
*
|
|
4
|
+
* Provides curated rule sets optimized for specific languages and frameworks.
|
|
5
|
+
* Each pack enables/disables judges and adjusts severity thresholds to
|
|
6
|
+
* reduce noise and focus on language-relevant patterns.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* judges eval --pack react src/App.tsx
|
|
10
|
+
* judges pack list
|
|
11
|
+
*/
|
|
12
|
+
import type { JudgesConfig } from "../types.js";
|
|
13
|
+
export interface LanguagePack {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
languages: string[];
|
|
18
|
+
config: JudgesConfig;
|
|
19
|
+
/** Extra rule ID prefixes to prioritize */
|
|
20
|
+
priorityRules?: string[];
|
|
21
|
+
/** Tags for discoverability */
|
|
22
|
+
tags?: string[];
|
|
23
|
+
}
|
|
24
|
+
export declare const LANGUAGE_PACKS: Record<string, LanguagePack>;
|
|
25
|
+
/**
|
|
26
|
+
* Get a language pack by ID.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getLanguagePack(id: string): LanguagePack | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* List all available language packs.
|
|
31
|
+
*/
|
|
32
|
+
export declare function listLanguagePacks(): Array<{
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
description: string;
|
|
36
|
+
languages: string[];
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Auto-detect the best language pack for a given language.
|
|
40
|
+
*/
|
|
41
|
+
export declare function suggestPack(language: string): LanguagePack | undefined;
|
|
42
|
+
export declare function runPack(argv: string[]): void;
|
|
43
|
+
//# sourceMappingURL=language-packs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-packs.d.ts","sourceRoot":"","sources":["../../src/commands/language-packs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,aAAa,CAAC;AAI1D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAiGvD,CAAC;AAIF;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAOjH;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAItE;AAID,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoB5C"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language Packs — Preset rule configurations per language
|
|
3
|
+
*
|
|
4
|
+
* Provides curated rule sets optimized for specific languages and frameworks.
|
|
5
|
+
* Each pack enables/disables judges and adjusts severity thresholds to
|
|
6
|
+
* reduce noise and focus on language-relevant patterns.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* judges eval --pack react src/App.tsx
|
|
10
|
+
* judges pack list
|
|
11
|
+
*/
|
|
12
|
+
// ─── Built-in Language Packs ─────────────────────────────────────────────────
|
|
13
|
+
export const LANGUAGE_PACKS = {
|
|
14
|
+
react: {
|
|
15
|
+
id: "react",
|
|
16
|
+
name: "React / Next.js",
|
|
17
|
+
description: "Frontend-focused: accessibility, XSS, client-side security, component patterns",
|
|
18
|
+
languages: ["typescript", "javascript"],
|
|
19
|
+
config: {
|
|
20
|
+
disabledJudges: ["database", "data-sovereignty", "ci-cd", "cloud-readiness", "rate-limiting"],
|
|
21
|
+
minSeverity: "low",
|
|
22
|
+
},
|
|
23
|
+
priorityRules: ["SEC-", "A11Y-", "UX-", "PERF-"],
|
|
24
|
+
tags: ["frontend", "react", "nextjs"],
|
|
25
|
+
},
|
|
26
|
+
api: {
|
|
27
|
+
id: "api",
|
|
28
|
+
name: "REST/GraphQL API",
|
|
29
|
+
description: "Backend API focus: auth, rate limiting, input validation, error handling",
|
|
30
|
+
languages: ["typescript", "javascript", "python", "go", "java", "csharp"],
|
|
31
|
+
config: {
|
|
32
|
+
disabledJudges: ["accessibility", "internationalization", "ux"],
|
|
33
|
+
minSeverity: "low",
|
|
34
|
+
},
|
|
35
|
+
priorityRules: ["SEC-", "AUTH-", "RATE-", "API-", "ERR-"],
|
|
36
|
+
tags: ["backend", "api", "rest"],
|
|
37
|
+
},
|
|
38
|
+
python: {
|
|
39
|
+
id: "python",
|
|
40
|
+
name: "Python",
|
|
41
|
+
description: "Python-specific: injection, deserialization, type safety, package security",
|
|
42
|
+
languages: ["python"],
|
|
43
|
+
config: {
|
|
44
|
+
minSeverity: "low",
|
|
45
|
+
},
|
|
46
|
+
priorityRules: ["SEC-", "CYBER-", "DEP-"],
|
|
47
|
+
tags: ["python", "django", "flask", "fastapi"],
|
|
48
|
+
},
|
|
49
|
+
infrastructure: {
|
|
50
|
+
id: "infrastructure",
|
|
51
|
+
name: "Infrastructure / IaC",
|
|
52
|
+
description: "Terraform, Docker, CI/CD: config management, secrets, cloud readiness",
|
|
53
|
+
languages: ["terraform", "dockerfile", "yaml", "bash"],
|
|
54
|
+
config: {
|
|
55
|
+
disabledJudges: [
|
|
56
|
+
"accessibility",
|
|
57
|
+
"internationalization",
|
|
58
|
+
"ux",
|
|
59
|
+
"database",
|
|
60
|
+
"backwards-compatibility",
|
|
61
|
+
"api-design",
|
|
62
|
+
],
|
|
63
|
+
minSeverity: "low",
|
|
64
|
+
},
|
|
65
|
+
priorityRules: ["CONF-", "CLOUD-", "CICD-", "SEC-"],
|
|
66
|
+
tags: ["infrastructure", "devops", "terraform", "docker"],
|
|
67
|
+
},
|
|
68
|
+
mobile: {
|
|
69
|
+
id: "mobile",
|
|
70
|
+
name: "Mobile App",
|
|
71
|
+
description: "Mobile-focused: data security, auth, offline, performance",
|
|
72
|
+
languages: ["typescript", "javascript", "swift", "kotlin", "java"],
|
|
73
|
+
config: {
|
|
74
|
+
disabledJudges: ["database", "ci-cd", "cloud-readiness", "data-sovereignty"],
|
|
75
|
+
minSeverity: "low",
|
|
76
|
+
},
|
|
77
|
+
priorityRules: ["SEC-", "AUTH-", "DATA-", "PERF-"],
|
|
78
|
+
tags: ["mobile", "ios", "android", "react-native"],
|
|
79
|
+
},
|
|
80
|
+
"data-pipeline": {
|
|
81
|
+
id: "data-pipeline",
|
|
82
|
+
name: "Data Pipeline",
|
|
83
|
+
description: "Data engineering: SQL injection, data security, compliance, observability",
|
|
84
|
+
languages: ["python", "typescript", "java", "scala"],
|
|
85
|
+
config: {
|
|
86
|
+
disabledJudges: ["accessibility", "internationalization", "ux", "api-design", "backwards-compatibility"],
|
|
87
|
+
minSeverity: "low",
|
|
88
|
+
},
|
|
89
|
+
priorityRules: ["DB-", "DATA-", "COMP-", "LOGPRIV-"],
|
|
90
|
+
tags: ["data", "etl", "pipeline", "spark"],
|
|
91
|
+
},
|
|
92
|
+
"ai-agent": {
|
|
93
|
+
id: "ai-agent",
|
|
94
|
+
name: "AI Agent / LLM App",
|
|
95
|
+
description: "AI safety: prompt injection, agent instructions, data security, ethics",
|
|
96
|
+
languages: ["typescript", "javascript", "python"],
|
|
97
|
+
config: {
|
|
98
|
+
disabledJudges: ["database", "ci-cd", "backwards-compatibility", "portability"],
|
|
99
|
+
minSeverity: "low",
|
|
100
|
+
},
|
|
101
|
+
priorityRules: ["AGENT-", "AICS-", "SEC-", "ETHICS-", "DATA-"],
|
|
102
|
+
tags: ["ai", "llm", "agent", "chatbot"],
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
// ─── Pack Lookup ─────────────────────────────────────────────────────────────
|
|
106
|
+
/**
|
|
107
|
+
* Get a language pack by ID.
|
|
108
|
+
*/
|
|
109
|
+
export function getLanguagePack(id) {
|
|
110
|
+
return LANGUAGE_PACKS[id];
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* List all available language packs.
|
|
114
|
+
*/
|
|
115
|
+
export function listLanguagePacks() {
|
|
116
|
+
return Object.values(LANGUAGE_PACKS).map((pack) => ({
|
|
117
|
+
id: pack.id,
|
|
118
|
+
name: pack.name,
|
|
119
|
+
description: pack.description,
|
|
120
|
+
languages: pack.languages,
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Auto-detect the best language pack for a given language.
|
|
125
|
+
*/
|
|
126
|
+
export function suggestPack(language) {
|
|
127
|
+
// Find packs whose languages array includes the given language
|
|
128
|
+
const candidates = Object.values(LANGUAGE_PACKS).filter((p) => p.languages.includes(language));
|
|
129
|
+
return candidates[0]; // Return first match or undefined
|
|
130
|
+
}
|
|
131
|
+
// ─── CLI Handler ─────────────────────────────────────────────────────────────
|
|
132
|
+
export function runPack(argv) {
|
|
133
|
+
const subcommand = argv[3] || "list";
|
|
134
|
+
if (subcommand === "list" || subcommand === "--help" || subcommand === "-h") {
|
|
135
|
+
const packs = listLanguagePacks();
|
|
136
|
+
console.log(`\n Language Packs (${packs.length}):`);
|
|
137
|
+
console.log(" " + "─".repeat(60));
|
|
138
|
+
for (const p of packs) {
|
|
139
|
+
console.log(` ${p.id.padEnd(20)} ${p.name}`);
|
|
140
|
+
console.log(` ${"".padEnd(20)} ${p.description}`);
|
|
141
|
+
console.log(` ${"".padEnd(20)} Languages: ${p.languages.join(", ")}`);
|
|
142
|
+
console.log("");
|
|
143
|
+
}
|
|
144
|
+
console.log(" Usage: judges eval --pack <id> <file>");
|
|
145
|
+
console.log("");
|
|
146
|
+
process.exit(0);
|
|
147
|
+
}
|
|
148
|
+
console.error(`Unknown pack subcommand: ${subcommand}`);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=language-packs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-packs.js","sourceRoot":"","sources":["../../src/commands/language-packs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Rule Authoring — `judges rule` command
|
|
3
|
+
*
|
|
4
|
+
* Create, list, and manage custom evaluation rules from the CLI.
|
|
5
|
+
* Custom rules are stored in .judgesrc or a dedicated rules directory.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* judges rule create Interactive rule creation wizard
|
|
9
|
+
* judges rule list List custom rules
|
|
10
|
+
* judges rule test <rule-id> Test a custom rule against sample code
|
|
11
|
+
*/
|
|
12
|
+
import type { Finding, Severity } from "../types.js";
|
|
13
|
+
import type { CustomRule } from "../plugins.js";
|
|
14
|
+
export interface CustomRuleFile {
|
|
15
|
+
version: string;
|
|
16
|
+
rules: SerializedRule[];
|
|
17
|
+
}
|
|
18
|
+
export interface SerializedRule {
|
|
19
|
+
id: string;
|
|
20
|
+
title: string;
|
|
21
|
+
severity: Severity;
|
|
22
|
+
judgeId: string;
|
|
23
|
+
description: string;
|
|
24
|
+
languages?: string[];
|
|
25
|
+
pattern?: string;
|
|
26
|
+
patternFlags?: string;
|
|
27
|
+
suggestedFix?: string;
|
|
28
|
+
tags?: string[];
|
|
29
|
+
}
|
|
30
|
+
export declare function loadCustomRuleFile(dir?: string): CustomRuleFile;
|
|
31
|
+
export declare function saveCustomRuleFile(data: CustomRuleFile, dir?: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Convert a serialized rule to a CustomRule object.
|
|
34
|
+
*/
|
|
35
|
+
export declare function deserializeRule(sr: SerializedRule): CustomRule;
|
|
36
|
+
/**
|
|
37
|
+
* Generate a rule template.
|
|
38
|
+
*/
|
|
39
|
+
export declare function generateRuleTemplate(id: string): SerializedRule;
|
|
40
|
+
/**
|
|
41
|
+
* Test a custom rule against sample code.
|
|
42
|
+
*/
|
|
43
|
+
export declare function testRule(rule: CustomRule, code: string, language: string): Finding[];
|
|
44
|
+
export declare function parseRuleArgs(argv: string[]): {
|
|
45
|
+
subcommand: string;
|
|
46
|
+
ruleId?: string;
|
|
47
|
+
file?: string;
|
|
48
|
+
};
|
|
49
|
+
export declare function runRule(argv: string[]): void;
|
|
50
|
+
//# sourceMappingURL=rule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../src/commands/rule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAMD,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAY,GAAG,cAAc,CAUpE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,GAAE,MAAY,GAAG,IAAI,CAGhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,cAAc,GAAG,UAAU,CAY9D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAa/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CA8BpF;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAepG;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4F5C"}
|