@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.
Files changed (58) hide show
  1. package/dist/api.d.ts +17 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +18 -0
  4. package/dist/api.js.map +1 -1
  5. package/dist/calibration.d.ts +58 -0
  6. package/dist/calibration.d.ts.map +1 -0
  7. package/dist/calibration.js +125 -0
  8. package/dist/calibration.js.map +1 -0
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +54 -0
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/benchmark.d.ts +100 -0
  13. package/dist/commands/benchmark.d.ts.map +1 -0
  14. package/dist/commands/benchmark.js +663 -0
  15. package/dist/commands/benchmark.js.map +1 -0
  16. package/dist/commands/config-share.d.ts +49 -0
  17. package/dist/commands/config-share.d.ts.map +1 -0
  18. package/dist/commands/config-share.js +181 -0
  19. package/dist/commands/config-share.js.map +1 -0
  20. package/dist/commands/feedback.d.ts +87 -0
  21. package/dist/commands/feedback.d.ts.map +1 -0
  22. package/dist/commands/feedback.js +320 -0
  23. package/dist/commands/feedback.js.map +1 -0
  24. package/dist/commands/language-packs.d.ts +43 -0
  25. package/dist/commands/language-packs.d.ts.map +1 -0
  26. package/dist/commands/language-packs.js +151 -0
  27. package/dist/commands/language-packs.js.map +1 -0
  28. package/dist/commands/rule.d.ts +50 -0
  29. package/dist/commands/rule.d.ts.map +1 -0
  30. package/dist/commands/rule.js +202 -0
  31. package/dist/commands/rule.js.map +1 -0
  32. package/dist/commands/smart-output.d.ts +39 -0
  33. package/dist/commands/smart-output.d.ts.map +1 -0
  34. package/dist/commands/smart-output.js +176 -0
  35. package/dist/commands/smart-output.js.map +1 -0
  36. package/dist/comparison.d.ts +68 -0
  37. package/dist/comparison.d.ts.map +1 -0
  38. package/dist/comparison.js +254 -0
  39. package/dist/comparison.js.map +1 -0
  40. package/dist/fingerprint.d.ts +40 -0
  41. package/dist/fingerprint.d.ts.map +1 -0
  42. package/dist/fingerprint.js +180 -0
  43. package/dist/fingerprint.js.map +1 -0
  44. package/dist/fix-history.d.ts +72 -0
  45. package/dist/fix-history.d.ts.map +1 -0
  46. package/dist/fix-history.js +127 -0
  47. package/dist/fix-history.js.map +1 -0
  48. package/dist/formatters/diagnostics.d.ts +82 -0
  49. package/dist/formatters/diagnostics.d.ts.map +1 -0
  50. package/dist/formatters/diagnostics.js +153 -0
  51. package/dist/formatters/diagnostics.js.map +1 -0
  52. package/dist/index.js +7 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/plugins.d.ts +103 -0
  55. package/dist/plugins.d.ts.map +1 -0
  56. package/dist/plugins.js +187 -0
  57. package/dist/plugins.js.map +1 -0
  58. 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"}