@kevinrabun/judges 3.43.0 → 3.45.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 (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/burndown.d.ts +27 -0
  6. package/dist/commands/burndown.d.ts.map +1 -0
  7. package/dist/commands/burndown.js +180 -0
  8. package/dist/commands/burndown.js.map +1 -0
  9. package/dist/commands/compare-runs.d.ts +38 -0
  10. package/dist/commands/compare-runs.d.ts.map +1 -0
  11. package/dist/commands/compare-runs.js +229 -0
  12. package/dist/commands/compare-runs.js.map +1 -0
  13. package/dist/commands/correlate.d.ts +28 -0
  14. package/dist/commands/correlate.d.ts.map +1 -0
  15. package/dist/commands/correlate.js +242 -0
  16. package/dist/commands/correlate.js.map +1 -0
  17. package/dist/commands/digest.d.ts +20 -0
  18. package/dist/commands/digest.d.ts.map +1 -0
  19. package/dist/commands/digest.js +222 -0
  20. package/dist/commands/digest.js.map +1 -0
  21. package/dist/commands/explain-finding.d.ts +8 -0
  22. package/dist/commands/explain-finding.d.ts.map +1 -0
  23. package/dist/commands/explain-finding.js +279 -0
  24. package/dist/commands/explain-finding.js.map +1 -0
  25. package/dist/commands/judge-reputation.d.ts +29 -0
  26. package/dist/commands/judge-reputation.d.ts.map +1 -0
  27. package/dist/commands/judge-reputation.js +199 -0
  28. package/dist/commands/judge-reputation.js.map +1 -0
  29. package/dist/commands/kb.d.ts +41 -0
  30. package/dist/commands/kb.d.ts.map +1 -0
  31. package/dist/commands/kb.js +231 -0
  32. package/dist/commands/kb.js.map +1 -0
  33. package/dist/commands/noise-advisor.d.ts +30 -0
  34. package/dist/commands/noise-advisor.d.ts.map +1 -0
  35. package/dist/commands/noise-advisor.js +171 -0
  36. package/dist/commands/noise-advisor.js.map +1 -0
  37. package/dist/commands/query.d.ts +20 -0
  38. package/dist/commands/query.d.ts.map +1 -0
  39. package/dist/commands/query.js +230 -0
  40. package/dist/commands/query.js.map +1 -0
  41. package/dist/commands/recommend.d.ts +21 -0
  42. package/dist/commands/recommend.d.ts.map +1 -0
  43. package/dist/commands/recommend.js +283 -0
  44. package/dist/commands/recommend.js.map +1 -0
  45. package/dist/commands/report-template.d.ts +17 -0
  46. package/dist/commands/report-template.d.ts.map +1 -0
  47. package/dist/commands/report-template.js +291 -0
  48. package/dist/commands/report-template.js.map +1 -0
  49. package/dist/commands/review-queue.d.ts +34 -0
  50. package/dist/commands/review-queue.d.ts.map +1 -0
  51. package/dist/commands/review-queue.js +226 -0
  52. package/dist/commands/review-queue.js.map +1 -0
  53. package/dist/commands/rule-owner.d.ts +31 -0
  54. package/dist/commands/rule-owner.d.ts.map +1 -0
  55. package/dist/commands/rule-owner.js +182 -0
  56. package/dist/commands/rule-owner.js.map +1 -0
  57. package/dist/commands/rule-share.d.ts +35 -0
  58. package/dist/commands/rule-share.d.ts.map +1 -0
  59. package/dist/commands/rule-share.js +203 -0
  60. package/dist/commands/rule-share.js.map +1 -0
  61. package/dist/commands/suppress.d.ts +40 -0
  62. package/dist/commands/suppress.d.ts.map +1 -0
  63. package/dist/commands/suppress.js +209 -0
  64. package/dist/commands/suppress.js.map +1 -0
  65. package/dist/commands/vote.d.ts +32 -0
  66. package/dist/commands/vote.d.ts.map +1 -0
  67. package/dist/commands/vote.js +201 -0
  68. package/dist/commands/vote.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Advanced finding search/filter — complex queries across evaluation results.
3
+ *
4
+ * Reads local .judges-results.json files for searching.
5
+ */
6
+ import { readFileSync, existsSync, writeFileSync } from "fs";
7
+ const QUERY_FILE = ".judges-query.json";
8
+ const RESULTS_FILE = ".judges-results.json";
9
+ // ─── Core ───────────────────────────────────────────────────────────────────
10
+ function loadResults() {
11
+ if (!existsSync(RESULTS_FILE))
12
+ return [];
13
+ try {
14
+ const data = JSON.parse(readFileSync(RESULTS_FILE, "utf-8"));
15
+ if (Array.isArray(data))
16
+ return data;
17
+ if (data.findings)
18
+ return data.findings;
19
+ return [];
20
+ }
21
+ catch {
22
+ return [];
23
+ }
24
+ }
25
+ function loadQueryDb() {
26
+ if (!existsSync(QUERY_FILE))
27
+ return { history: [], savedQueries: [] };
28
+ return JSON.parse(readFileSync(QUERY_FILE, "utf-8"));
29
+ }
30
+ function saveQueryDb(db) {
31
+ writeFileSync(QUERY_FILE, JSON.stringify(db, null, 2));
32
+ }
33
+ function matchesFilter(finding, key, value) {
34
+ const lowerVal = value.toLowerCase();
35
+ switch (key) {
36
+ case "severity":
37
+ return finding.severity.toLowerCase() === lowerVal;
38
+ case "rule":
39
+ case "ruleId":
40
+ return finding.ruleId.toLowerCase().includes(lowerVal);
41
+ case "title":
42
+ return finding.title.toLowerCase().includes(lowerVal);
43
+ case "description":
44
+ case "desc":
45
+ return finding.description.toLowerCase().includes(lowerVal);
46
+ case "confidence":
47
+ if (finding.confidence === undefined)
48
+ return false;
49
+ return finding.confidence >= parseFloat(value);
50
+ case "has-patch":
51
+ return !!finding.patch;
52
+ case "has-fix":
53
+ return !!finding.suggestedFix;
54
+ default:
55
+ // Generic text search across all string fields
56
+ return [finding.ruleId, finding.title, finding.description, finding.recommendation].some((f) => f.toLowerCase().includes(lowerVal));
57
+ }
58
+ }
59
+ export function queryFindings(queryStr, findings) {
60
+ const records = findings || loadResults();
61
+ // Parse query: "severity:critical rule:SEC text-search"
62
+ const parts = queryStr.split(/\s+/);
63
+ let matches = [...records];
64
+ const textParts = [];
65
+ for (const part of parts) {
66
+ const colonIdx = part.indexOf(":");
67
+ if (colonIdx > 0) {
68
+ const key = part.slice(0, colonIdx);
69
+ const val = part.slice(colonIdx + 1);
70
+ if (part.startsWith("-")) {
71
+ // Negation: -severity:low
72
+ const negKey = key.slice(1);
73
+ matches = matches.filter((f) => !matchesFilter(f, negKey, val));
74
+ }
75
+ else {
76
+ matches = matches.filter((f) => matchesFilter(f, key, val));
77
+ }
78
+ }
79
+ else {
80
+ textParts.push(part.toLowerCase());
81
+ }
82
+ }
83
+ if (textParts.length > 0) {
84
+ const textQuery = textParts.join(" ");
85
+ matches = matches.filter((f) => [f.ruleId, f.title, f.description, f.recommendation].some((s) => s.toLowerCase().includes(textQuery)));
86
+ }
87
+ return { matches, total: matches.length, query: queryStr };
88
+ }
89
+ export function aggregateFindings(findings, groupBy) {
90
+ const result = {};
91
+ for (const f of findings) {
92
+ let key;
93
+ switch (groupBy) {
94
+ case "severity":
95
+ key = f.severity;
96
+ break;
97
+ case "rule":
98
+ case "ruleId":
99
+ key = f.ruleId;
100
+ break;
101
+ case "confidence":
102
+ key = f.confidence !== undefined ? `${Math.floor(f.confidence * 10) * 10}%` : "unknown";
103
+ break;
104
+ default:
105
+ key = f.severity;
106
+ }
107
+ result[key] = (result[key] || 0) + 1;
108
+ }
109
+ return result;
110
+ }
111
+ // ─── CLI ────────────────────────────────────────────────────────────────────
112
+ export function runQuery(argv) {
113
+ if (argv.includes("--help") || argv.includes("-h")) {
114
+ console.log(`
115
+ judges query — Advanced finding search and filter
116
+
117
+ Usage:
118
+ judges query "severity:critical"
119
+ judges query "rule:SEC -severity:low"
120
+ judges query "injection" --aggregate severity
121
+ judges query --save "critical-sec" "severity:critical rule:SEC"
122
+ judges query --saved "critical-sec"
123
+ judges query --list-saved
124
+
125
+ Filter keys:
126
+ severity:<level> critical | high | medium | low
127
+ rule:<pattern> Match ruleId (substring)
128
+ title:<text> Match title
129
+ desc:<text> Match description
130
+ confidence:<min> Minimum confidence (e.g., 0.8)
131
+ has-patch:true Only findings with patches
132
+ has-fix:true Only findings with suggested fixes
133
+ -<key>:<value> Negate a filter
134
+
135
+ Options:
136
+ --aggregate <key> Group by severity|rule|confidence
137
+ --limit <n> Max results
138
+ --save <name> Save query for reuse
139
+ --saved <name> Run a saved query
140
+ --list-saved List saved queries
141
+ --format json JSON output
142
+ --help, -h Show this help
143
+ `);
144
+ return;
145
+ }
146
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
147
+ // List saved queries
148
+ if (argv.includes("--list-saved")) {
149
+ const db = loadQueryDb();
150
+ if (db.savedQueries.length === 0) {
151
+ console.log("\n No saved queries.\n");
152
+ }
153
+ else {
154
+ console.log(`\n Saved Queries (${db.savedQueries.length})\n ───────────────`);
155
+ for (const q of db.savedQueries) {
156
+ console.log(` ${q.name.padEnd(20)} ${q.query}`);
157
+ }
158
+ console.log("");
159
+ }
160
+ return;
161
+ }
162
+ // Save a query
163
+ const saveName = argv.find((_a, i) => argv[i - 1] === "--save");
164
+ if (saveName) {
165
+ const queryStr = argv.filter((a) => !a.startsWith("--") && a !== saveName).join(" ");
166
+ const db = loadQueryDb();
167
+ db.savedQueries = db.savedQueries.filter((q) => q.name !== saveName);
168
+ db.savedQueries.push({ name: saveName, query: queryStr, createdAt: new Date().toISOString() });
169
+ saveQueryDb(db);
170
+ console.log(` ✅ Saved query "${saveName}": ${queryStr}`);
171
+ return;
172
+ }
173
+ // Run saved query
174
+ const savedName = argv.find((_a, i) => argv[i - 1] === "--saved");
175
+ if (savedName) {
176
+ const db = loadQueryDb();
177
+ const saved = db.savedQueries.find((q) => q.name === savedName);
178
+ if (!saved) {
179
+ console.error(` ❌ Saved query "${savedName}" not found`);
180
+ return;
181
+ }
182
+ const result = queryFindings(saved.query);
183
+ printResults(result, format, argv);
184
+ return;
185
+ }
186
+ // Execute query
187
+ const queryStr = argv.filter((a) => !a.startsWith("--")).join(" ");
188
+ if (!queryStr) {
189
+ console.error(" ❌ No query provided. Use --help for usage.");
190
+ return;
191
+ }
192
+ const result = queryFindings(queryStr);
193
+ printResults(result, format, argv);
194
+ }
195
+ function printResults(result, format, argv) {
196
+ const aggregateBy = argv.find((_a, i) => argv[i - 1] === "--aggregate");
197
+ const limitStr = argv.find((_a, i) => argv[i - 1] === "--limit");
198
+ const limit = limitStr ? parseInt(limitStr, 10) : undefined;
199
+ let { matches } = result;
200
+ if (limit)
201
+ matches = matches.slice(0, limit);
202
+ if (aggregateBy) {
203
+ const agg = aggregateFindings(matches, aggregateBy);
204
+ if (format === "json") {
205
+ console.log(JSON.stringify(agg, null, 2));
206
+ }
207
+ else {
208
+ console.log(`\n Aggregate by ${aggregateBy} (${result.total} matches)\n ──────────────────────`);
209
+ for (const [key, count] of Object.entries(agg).sort((a, b) => b[1] - a[1])) {
210
+ console.log(` ${key.padEnd(20)} ${count}`);
211
+ }
212
+ console.log("");
213
+ }
214
+ return;
215
+ }
216
+ if (format === "json") {
217
+ console.log(JSON.stringify({ ...result, matches }, null, 2));
218
+ return;
219
+ }
220
+ console.log(`\n Query: "${result.query}" → ${result.total} match(es)\n ─────────────────────────`);
221
+ if (matches.length === 0) {
222
+ console.log(" No findings matched.\n");
223
+ return;
224
+ }
225
+ for (const f of matches) {
226
+ console.log(` [${f.severity.toUpperCase()}] ${f.ruleId.padEnd(12)} ${f.title.slice(0, 50)}`);
227
+ }
228
+ console.log("");
229
+ }
230
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Rule recommendations — analyze project stack and suggest which
3
+ * judges/rules are most relevant.
4
+ *
5
+ * Uses local file analysis only — no external services.
6
+ */
7
+ export interface StackSignal {
8
+ framework: string;
9
+ confidence: number;
10
+ detectedVia: string;
11
+ }
12
+ export interface JudgeRecommendation {
13
+ judgeId: string;
14
+ relevance: "high" | "medium" | "low";
15
+ reason: string;
16
+ estimatedCoverage: string;
17
+ }
18
+ export declare function detectStack(dir?: string): StackSignal[];
19
+ export declare function getRecommendations(dir?: string): JudgeRecommendation[];
20
+ export declare function runRecommend(argv: string[]): void;
21
+ //# sourceMappingURL=recommend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../src/commands/recommend.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AA+ED,wBAAgB,WAAW,CAAC,GAAG,SAAM,GAAG,WAAW,EAAE,CAuDpD;AAgBD,wBAAgB,kBAAkB,CAAC,GAAG,SAAM,GAAG,mBAAmB,EAAE,CAsEnE;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmEjD"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Rule recommendations — analyze project stack and suggest which
3
+ * judges/rules are most relevant.
4
+ *
5
+ * Uses local file analysis only — no external services.
6
+ */
7
+ import { readdirSync, readFileSync, existsSync, statSync } from "fs";
8
+ import { join, extname } from "path";
9
+ import { defaultRegistry } from "../judge-registry.js";
10
+ // ─── Stack Detection ────────────────────────────────────────────────────────
11
+ const FRAMEWORK_SIGNALS = [
12
+ { framework: "React", files: [], deps: ["react", "react-dom", "next", "@remix-run/react"] },
13
+ { framework: "Next.js", files: ["next.config.js", "next.config.mjs", "next.config.ts"], deps: ["next"] },
14
+ { framework: "Express", files: [], deps: ["express"] },
15
+ { framework: "FastAPI", files: [], deps: ["fastapi", "uvicorn"] },
16
+ { framework: "Django", files: ["manage.py", "settings.py"], deps: ["django"] },
17
+ { framework: "Spring Boot", files: ["pom.xml", "build.gradle"], deps: ["spring-boot"] },
18
+ { framework: "Rails", files: ["Gemfile", "config/routes.rb"], deps: ["rails"] },
19
+ { framework: "Terraform", files: [], deps: [] },
20
+ { framework: "Kubernetes", files: [], deps: [] },
21
+ { framework: "Docker", files: ["Dockerfile", "docker-compose.yml", "docker-compose.yaml"], deps: [] },
22
+ { framework: "Vue", files: [], deps: ["vue", "nuxt"] },
23
+ { framework: "Angular", files: ["angular.json"], deps: ["@angular/core"] },
24
+ { framework: "Svelte", files: ["svelte.config.js"], deps: ["svelte", "@sveltejs/kit"] },
25
+ { framework: "Flask", files: [], deps: ["flask"] },
26
+ { framework: "Go", files: ["go.mod", "go.sum"], deps: [] },
27
+ { framework: "Rust", files: ["Cargo.toml"], deps: [] },
28
+ ];
29
+ function scanDirectory(dir, depth = 0, maxDepth = 3) {
30
+ if (depth > maxDepth)
31
+ return [];
32
+ const files = [];
33
+ try {
34
+ for (const entry of readdirSync(dir)) {
35
+ if (entry.startsWith(".") || entry === "node_modules" || entry === "vendor" || entry === "dist")
36
+ continue;
37
+ const full = join(dir, entry);
38
+ try {
39
+ const stat = statSync(full);
40
+ if (stat.isFile())
41
+ files.push(entry);
42
+ else if (stat.isDirectory())
43
+ files.push(...scanDirectory(full, depth + 1, maxDepth).map((f) => `${entry}/${f}`));
44
+ }
45
+ catch {
46
+ /* skip */
47
+ }
48
+ }
49
+ }
50
+ catch {
51
+ /* skip */
52
+ }
53
+ return files;
54
+ }
55
+ function detectLanguages(files) {
56
+ const extMap = {
57
+ ".ts": "TypeScript",
58
+ ".tsx": "TypeScript",
59
+ ".js": "JavaScript",
60
+ ".jsx": "JavaScript",
61
+ ".py": "Python",
62
+ ".java": "Java",
63
+ ".go": "Go",
64
+ ".rs": "Rust",
65
+ ".cs": "C#",
66
+ ".cpp": "C++",
67
+ ".c": "C",
68
+ ".rb": "Ruby",
69
+ ".tf": "Terraform",
70
+ ".yaml": "YAML",
71
+ ".yml": "YAML",
72
+ ".sql": "SQL",
73
+ ".sh": "Shell",
74
+ ".ps1": "PowerShell",
75
+ };
76
+ const counts = {};
77
+ for (const f of files) {
78
+ const ext = extname(f);
79
+ const lang = extMap[ext];
80
+ if (lang)
81
+ counts[lang] = (counts[lang] || 0) + 1;
82
+ }
83
+ return counts;
84
+ }
85
+ export function detectStack(dir = ".") {
86
+ const files = scanDirectory(dir);
87
+ const signals = [];
88
+ // Check for framework config files
89
+ for (const fw of FRAMEWORK_SIGNALS) {
90
+ for (const file of fw.files) {
91
+ if (files.includes(file) || existsSync(join(dir, file))) {
92
+ signals.push({ framework: fw.framework, confidence: 0.9, detectedVia: `config file: ${file}` });
93
+ }
94
+ }
95
+ }
96
+ // Check package.json dependencies
97
+ const pkgPath = join(dir, "package.json");
98
+ if (existsSync(pkgPath)) {
99
+ try {
100
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
101
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
102
+ for (const fw of FRAMEWORK_SIGNALS) {
103
+ for (const dep of fw.deps) {
104
+ if (allDeps[dep]) {
105
+ const existing = signals.find((s) => s.framework === fw.framework);
106
+ if (!existing) {
107
+ signals.push({ framework: fw.framework, confidence: 0.85, detectedVia: `package.json: ${dep}` });
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+ catch {
114
+ /* skip */
115
+ }
116
+ }
117
+ // Check for Terraform files
118
+ if (files.some((f) => f.endsWith(".tf"))) {
119
+ signals.push({ framework: "Terraform", confidence: 0.95, detectedVia: "*.tf files" });
120
+ }
121
+ // Check for Kubernetes manifests
122
+ if (files.some((f) => f.endsWith(".yaml") || f.endsWith(".yml"))) {
123
+ for (const f of files.filter((f) => f.endsWith(".yaml") || f.endsWith(".yml"))) {
124
+ try {
125
+ const content = readFileSync(join(dir, f), "utf-8").slice(0, 500);
126
+ if (content.includes("apiVersion:") && content.includes("kind:")) {
127
+ signals.push({ framework: "Kubernetes", confidence: 0.9, detectedVia: `manifest: ${f}` });
128
+ break;
129
+ }
130
+ }
131
+ catch {
132
+ /* skip */
133
+ }
134
+ }
135
+ }
136
+ return signals;
137
+ }
138
+ // ─── Recommendation Engine ──────────────────────────────────────────────────
139
+ const JUDGE_FRAMEWORK_MAP = {
140
+ react: ["xss-judge", "frontend-judge"],
141
+ "next.js": ["xss-judge", "ssr-judge", "frontend-judge"],
142
+ express: ["injection-judge", "auth-judge", "ssrf-judge"],
143
+ fastapi: ["injection-judge", "auth-judge", "python-judge"],
144
+ django: ["injection-judge", "auth-judge", "python-judge"],
145
+ "spring boot": ["injection-judge", "auth-judge", "java-judge"],
146
+ terraform: ["iac-judge", "secrets-judge"],
147
+ kubernetes: ["iac-judge", "container-judge"],
148
+ docker: ["container-judge", "secrets-judge"],
149
+ };
150
+ export function getRecommendations(dir = ".") {
151
+ const stack = detectStack(dir);
152
+ const files = scanDirectory(dir);
153
+ const languages = detectLanguages(files);
154
+ const allJudges = defaultRegistry.getJudges().map((j) => j.id);
155
+ const recommendations = [];
156
+ const seen = new Set();
157
+ // Framework-specific recommendations
158
+ for (const signal of stack) {
159
+ const matching = JUDGE_FRAMEWORK_MAP[signal.framework.toLowerCase()] || [];
160
+ for (const judgeId of matching) {
161
+ if (seen.has(judgeId))
162
+ continue;
163
+ // Check if this judge actually exists
164
+ const actual = allJudges.find((j) => j.includes(judgeId.replace("-judge", "")));
165
+ if (actual) {
166
+ seen.add(actual);
167
+ recommendations.push({
168
+ judgeId: actual,
169
+ relevance: "high",
170
+ reason: `${signal.framework} detected (${signal.detectedVia}). This judge covers common ${signal.framework} patterns.`,
171
+ estimatedCoverage: "80-90%",
172
+ });
173
+ }
174
+ }
175
+ }
176
+ // Language-based recommendations
177
+ const topLang = Object.entries(languages)
178
+ .sort((a, b) => b[1] - a[1])
179
+ .slice(0, 3);
180
+ for (const [lang, count] of topLang) {
181
+ const percentage = Math.round((count / files.length) * 100);
182
+ if (percentage < 5)
183
+ continue;
184
+ for (const jId of allJudges) {
185
+ if (seen.has(jId))
186
+ continue;
187
+ if (jId.toLowerCase().includes(lang.toLowerCase().replace(/[#+]/g, ""))) {
188
+ seen.add(jId);
189
+ recommendations.push({
190
+ judgeId: jId,
191
+ relevance: "medium",
192
+ reason: `${lang} is ${percentage}% of your codebase (${count} files).`,
193
+ estimatedCoverage: "60-80%",
194
+ });
195
+ }
196
+ }
197
+ }
198
+ // Universal judges everyone should use
199
+ const universalJudges = ["security", "secrets", "error", "performance"];
200
+ for (const keyword of universalJudges) {
201
+ for (const jId of allJudges) {
202
+ if (seen.has(jId))
203
+ continue;
204
+ if (jId.toLowerCase().includes(keyword)) {
205
+ seen.add(jId);
206
+ recommendations.push({
207
+ judgeId: jId,
208
+ relevance: "medium",
209
+ reason: `Universal ${keyword} rules apply to all codebases.`,
210
+ estimatedCoverage: "70-85%",
211
+ });
212
+ }
213
+ }
214
+ }
215
+ return recommendations.sort((a, b) => {
216
+ const order = { high: 0, medium: 1, low: 2 };
217
+ return order[a.relevance] - order[b.relevance];
218
+ });
219
+ }
220
+ // ─── CLI ────────────────────────────────────────────────────────────────────
221
+ export function runRecommend(argv) {
222
+ if (argv.includes("--help") || argv.includes("-h")) {
223
+ console.log(`
224
+ judges recommend — Analyze project and recommend judges
225
+
226
+ Usage:
227
+ judges recommend Analyze current directory
228
+ judges recommend --dir /path Analyze specific directory
229
+ judges recommend --stack-only Only show detected stack
230
+
231
+ Options:
232
+ --dir <path> Directory to analyze (default: .)
233
+ --stack-only Only show detected frameworks
234
+ --format json JSON output
235
+ --help, -h Show this help
236
+ `);
237
+ return;
238
+ }
239
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
240
+ const dir = argv.find((_a, i) => argv[i - 1] === "--dir") || ".";
241
+ if (argv.includes("--stack-only")) {
242
+ const stack = detectStack(dir);
243
+ if (format === "json") {
244
+ console.log(JSON.stringify(stack, null, 2));
245
+ }
246
+ else if (stack.length === 0) {
247
+ console.log("\n No frameworks detected.\n");
248
+ }
249
+ else {
250
+ console.log("\n Detected Stack\n ──────────────");
251
+ for (const s of stack) {
252
+ console.log(` ${s.framework.padEnd(16)} (${(s.confidence * 100).toFixed(0)}%) via ${s.detectedVia}`);
253
+ }
254
+ console.log("");
255
+ }
256
+ return;
257
+ }
258
+ const recs = getRecommendations(dir);
259
+ const stack = detectStack(dir);
260
+ if (format === "json") {
261
+ console.log(JSON.stringify({ stack, recommendations: recs }, null, 2));
262
+ return;
263
+ }
264
+ console.log("\n Project Analysis\n ────────────────");
265
+ if (stack.length > 0) {
266
+ console.log("\n Detected stack:");
267
+ for (const s of stack) {
268
+ console.log(` ${s.framework.padEnd(16)} (${(s.confidence * 100).toFixed(0)}%) via ${s.detectedVia}`);
269
+ }
270
+ }
271
+ if (recs.length === 0) {
272
+ console.log("\n No specific recommendations. All judges are applicable.\n");
273
+ return;
274
+ }
275
+ console.log(`\n Recommended Judges (${recs.length}):\n`);
276
+ for (const r of recs) {
277
+ const icon = r.relevance === "high" ? "🟢" : r.relevance === "medium" ? "🟡" : "⚪";
278
+ console.log(` ${icon} ${r.judgeId.padEnd(25)} [${r.relevance}] coverage: ${r.estimatedCoverage}`);
279
+ console.log(` ${r.reason}`);
280
+ }
281
+ console.log("");
282
+ }
283
+ //# sourceMappingURL=recommend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/commands/recommend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Report templates — generate reports from different predefined
3
+ * templates targeting different audiences (exec, dev, compliance).
4
+ *
5
+ * Pure local generation — no external services.
6
+ */
7
+ import type { TribunalVerdict } from "../types.js";
8
+ export interface ReportTemplate {
9
+ id: string;
10
+ name: string;
11
+ audience: string;
12
+ description: string;
13
+ }
14
+ export declare function listTemplates(): ReportTemplate[];
15
+ export declare function generateReport(templateId: string, verdict: TribunalVerdict): string;
16
+ export declare function runReportTemplate(argv: string[]): void;
17
+ //# sourceMappingURL=report-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-template.d.ts","sourceRoot":"","sources":["../../src/commands/report-template.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAW,eAAe,EAAE,MAAM,aAAa,CAAC;AAI5D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AA8PD,wBAAgB,aAAa,IAAI,cAAc,EAAE,CAEhD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAiBnF;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6DtD"}