@kevinrabun/judges 3.51.0 → 3.52.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 (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/chat-notify.d.ts +9 -0
  6. package/dist/commands/chat-notify.d.ts.map +1 -0
  7. package/dist/commands/chat-notify.js +259 -0
  8. package/dist/commands/chat-notify.js.map +1 -0
  9. package/dist/commands/design-audit.d.ts +9 -0
  10. package/dist/commands/design-audit.d.ts.map +1 -0
  11. package/dist/commands/design-audit.js +302 -0
  12. package/dist/commands/design-audit.js.map +1 -0
  13. package/dist/commands/impact-scan.d.ts +9 -0
  14. package/dist/commands/impact-scan.d.ts.map +1 -0
  15. package/dist/commands/impact-scan.js +282 -0
  16. package/dist/commands/impact-scan.js.map +1 -0
  17. package/dist/commands/judge-learn.d.ts +9 -0
  18. package/dist/commands/judge-learn.d.ts.map +1 -0
  19. package/dist/commands/judge-learn.js +218 -0
  20. package/dist/commands/judge-learn.js.map +1 -0
  21. package/dist/commands/model-report.d.ts +9 -0
  22. package/dist/commands/model-report.d.ts.map +1 -0
  23. package/dist/commands/model-report.js +195 -0
  24. package/dist/commands/model-report.js.map +1 -0
  25. package/dist/commands/remediation-lib.d.ts +9 -0
  26. package/dist/commands/remediation-lib.d.ts.map +1 -0
  27. package/dist/commands/remediation-lib.js +266 -0
  28. package/dist/commands/remediation-lib.js.map +1 -0
  29. package/dist/commands/trust-adaptive.d.ts +9 -0
  30. package/dist/commands/trust-adaptive.d.ts.map +1 -0
  31. package/dist/commands/trust-adaptive.js +194 -0
  32. package/dist/commands/trust-adaptive.js.map +1 -0
  33. package/dist/commands/watch-judge.d.ts +8 -0
  34. package/dist/commands/watch-judge.d.ts.map +1 -0
  35. package/dist/commands/watch-judge.js +180 -0
  36. package/dist/commands/watch-judge.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Chat-notify — publish findings to Slack, Teams, Discord, or custom
3
+ * webhooks with rich formatting and team mention routing.
4
+ *
5
+ * DataAdapter-friendly: webhook URLs come from local config,
6
+ * no data stored server-side.
7
+ */
8
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
9
+ import { join } from "path";
10
+ // ─── Config ─────────────────────────────────────────────────────────────────
11
+ const CONFIG_DIR = ".judges-notify";
12
+ const CONFIG_FILE = join(CONFIG_DIR, "webhooks.json");
13
+ function ensureDir() {
14
+ if (!existsSync(CONFIG_DIR))
15
+ mkdirSync(CONFIG_DIR, { recursive: true });
16
+ }
17
+ function loadWebhooks() {
18
+ if (!existsSync(CONFIG_FILE))
19
+ return [];
20
+ try {
21
+ return JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ }
27
+ function saveWebhooks(webhooks) {
28
+ ensureDir();
29
+ writeFileSync(CONFIG_FILE, JSON.stringify(webhooks, null, 2));
30
+ }
31
+ // ─── Formatters ─────────────────────────────────────────────────────────────
32
+ function formatSlack(payload) {
33
+ const color = payload.criticalCount > 0 ? "#e74c3c" : payload.score < 60 ? "#f39c12" : "#2ecc71";
34
+ return {
35
+ attachments: [
36
+ {
37
+ color,
38
+ title: `🔍 Judges Panel: ${payload.subject}`,
39
+ text: payload.body,
40
+ fields: [
41
+ { title: "Score", value: `${payload.score}/100`, short: true },
42
+ { title: "Findings", value: String(payload.findings), short: true },
43
+ { title: "Critical", value: String(payload.criticalCount), short: true },
44
+ ],
45
+ footer: "Judges Panel",
46
+ ts: Math.floor(Date.now() / 1000),
47
+ },
48
+ ],
49
+ };
50
+ }
51
+ function formatTeams(payload) {
52
+ const color = payload.criticalCount > 0 ? "FF0000" : payload.score < 60 ? "FFC107" : "28A745";
53
+ return {
54
+ "@type": "MessageCard",
55
+ "@context": "http://schema.org/extensions",
56
+ themeColor: color,
57
+ summary: `Judges Panel: ${payload.subject}`,
58
+ sections: [
59
+ {
60
+ activityTitle: `🔍 ${payload.subject}`,
61
+ facts: [
62
+ { name: "Score", value: `${payload.score}/100` },
63
+ { name: "Findings", value: String(payload.findings) },
64
+ { name: "Critical", value: String(payload.criticalCount) },
65
+ ],
66
+ text: payload.body,
67
+ },
68
+ ],
69
+ };
70
+ }
71
+ function formatDiscord(payload) {
72
+ const color = payload.criticalCount > 0 ? 0xe74c3c : payload.score < 60 ? 0xf39c12 : 0x2ecc71;
73
+ return {
74
+ embeds: [
75
+ {
76
+ title: `🔍 Judges Panel: ${payload.subject}`,
77
+ description: payload.body,
78
+ color,
79
+ fields: [
80
+ { name: "Score", value: `${payload.score}/100`, inline: true },
81
+ { name: "Findings", value: String(payload.findings), inline: true },
82
+ { name: "Critical", value: String(payload.criticalCount), inline: true },
83
+ ],
84
+ timestamp: new Date().toISOString(),
85
+ },
86
+ ],
87
+ };
88
+ }
89
+ function formatPayload(webhook, payload) {
90
+ switch (webhook.type) {
91
+ case "slack":
92
+ return JSON.stringify(formatSlack(payload));
93
+ case "teams":
94
+ return JSON.stringify(formatTeams(payload));
95
+ case "discord":
96
+ return JSON.stringify(formatDiscord(payload));
97
+ default:
98
+ return JSON.stringify(payload);
99
+ }
100
+ }
101
+ // ─── CLI ────────────────────────────────────────────────────────────────────
102
+ export function runChatNotify(argv) {
103
+ if (argv.includes("--help") || argv.includes("-h")) {
104
+ console.log(`
105
+ judges chat-notify — Publish findings to chat platforms
106
+
107
+ Usage:
108
+ judges chat-notify --add --name "team-slack" --type slack --url <webhook-url>
109
+ judges chat-notify --send --subject "PR #42" --score 65 --findings 5 --critical 1
110
+ judges chat-notify --send --file eval-output.json
111
+ judges chat-notify --list
112
+ judges chat-notify --preview --name "team-slack" --subject "test"
113
+ judges chat-notify --remove --name "team-slack"
114
+
115
+ Options:
116
+ --add Add webhook configuration
117
+ --name <name> Webhook name
118
+ --type <platform> Platform: slack, teams, discord, custom
119
+ --url <webhook-url> Webhook URL (stored locally in .judges-notify/)
120
+ --channel <name> Channel name (for display)
121
+ --mention <user> Mention on critical findings
122
+ --min-severity <sev> Minimum severity to notify (default: medium)
123
+ --send Send notification
124
+ --subject <text> Notification subject
125
+ --score <n> Score (0-100)
126
+ --findings <n> Finding count
127
+ --critical <n> Critical finding count
128
+ --file <path> Import from evaluation output
129
+ --preview Preview formatted message (no send)
130
+ --list List configured webhooks
131
+ --remove Remove webhook
132
+ --format json JSON output
133
+ --help, -h Show this help
134
+
135
+ Platforms: Slack (attachments), Teams (MessageCard), Discord (embeds), Custom (raw JSON)
136
+ Webhook URLs are stored locally — no data sent to Judges servers.
137
+ `);
138
+ return;
139
+ }
140
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
141
+ const isAdd = argv.includes("--add");
142
+ const isSend = argv.includes("--send");
143
+ const isList = argv.includes("--list");
144
+ const isPreview = argv.includes("--preview");
145
+ const isRemove = argv.includes("--remove");
146
+ const name = argv.find((_a, i) => argv[i - 1] === "--name") || "";
147
+ const webhookType = (argv.find((_a, i) => argv[i - 1] === "--type") ||
148
+ "custom");
149
+ const url = argv.find((_a, i) => argv[i - 1] === "--url") || "";
150
+ const channel = argv.find((_a, i) => argv[i - 1] === "--channel") || "";
151
+ const mention = argv.find((_a, i) => argv[i - 1] === "--mention") || "";
152
+ const subject = argv.find((_a, i) => argv[i - 1] === "--subject") || "Judges Panel Evaluation";
153
+ const score = parseInt(argv.find((_a, i) => argv[i - 1] === "--score") || "0");
154
+ const findings = parseInt(argv.find((_a, i) => argv[i - 1] === "--findings") || "0");
155
+ const critical = parseInt(argv.find((_a, i) => argv[i - 1] === "--critical") || "0");
156
+ const fileArg = argv.find((_a, i) => argv[i - 1] === "--file");
157
+ if (isAdd) {
158
+ if (!name || !url) {
159
+ console.error(" --name and --url are required for --add");
160
+ return;
161
+ }
162
+ const webhooks = loadWebhooks();
163
+ if (webhooks.some((w) => w.name === name)) {
164
+ console.error(` Webhook "${name}" already exists. Remove first.`);
165
+ return;
166
+ }
167
+ webhooks.push({ name, url, type: webhookType, channel, mentionOnCritical: mention || undefined });
168
+ saveWebhooks(webhooks);
169
+ console.log(` ✅ Added ${webhookType} webhook "${name}"`);
170
+ return;
171
+ }
172
+ if (isRemove) {
173
+ if (!name) {
174
+ console.error(" --name is required");
175
+ return;
176
+ }
177
+ const webhooks = loadWebhooks().filter((w) => w.name !== name);
178
+ saveWebhooks(webhooks);
179
+ console.log(` ✅ Removed webhook "${name}"`);
180
+ return;
181
+ }
182
+ if (isList) {
183
+ const webhooks = loadWebhooks();
184
+ if (format === "json") {
185
+ console.log(JSON.stringify(webhooks, null, 2));
186
+ }
187
+ else {
188
+ console.log(`\n Configured Webhooks — ${webhooks.length}\n ──────────────────────────`);
189
+ for (const w of webhooks) {
190
+ const masked = w.url.replace(/(.{20}).*(.{6})/, "$1***$2");
191
+ console.log(` 📡 ${w.name} (${w.type}) → ${masked}${w.channel ? ` #${w.channel}` : ""}`);
192
+ }
193
+ if (webhooks.length === 0)
194
+ console.log(" No webhooks configured. Use --add to add one.");
195
+ console.log("");
196
+ }
197
+ return;
198
+ }
199
+ if (isSend || isPreview) {
200
+ const webhooks = loadWebhooks();
201
+ const targets = name ? webhooks.filter((w) => w.name === name) : webhooks;
202
+ if (targets.length === 0) {
203
+ console.error(" No webhooks configured. Use --add first.");
204
+ return;
205
+ }
206
+ let payloadScore = score;
207
+ let payloadFindings = findings;
208
+ let payloadCritical = critical;
209
+ let body = `Score: ${score}/100 | ${findings} findings | ${critical} critical`;
210
+ if (fileArg && existsSync(fileArg)) {
211
+ try {
212
+ const data = JSON.parse(readFileSync(fileArg, "utf-8"));
213
+ payloadScore = data.overallScore || score;
214
+ payloadFindings = Array.isArray(data.findings) ? data.findings.length : findings;
215
+ payloadCritical = data.criticalCount || critical;
216
+ body = data.summary || body;
217
+ }
218
+ catch {
219
+ /* use manual values */
220
+ }
221
+ }
222
+ for (const webhook of targets) {
223
+ const payload = {
224
+ platform: webhook.type,
225
+ channel: webhook.channel || "",
226
+ subject,
227
+ body,
228
+ findings: payloadFindings,
229
+ criticalCount: payloadCritical,
230
+ score: payloadScore,
231
+ };
232
+ const formatted = formatPayload(webhook, payload);
233
+ if (isPreview) {
234
+ console.log(`\n Preview for ${webhook.name} (${webhook.type}):\n`);
235
+ console.log(JSON.stringify(JSON.parse(formatted), null, 2));
236
+ }
237
+ else {
238
+ // In a real implementation, this would use fetch/https to POST
239
+ // Since we can't store/process data server-side, we output the curl command
240
+ console.log(`\n 📡 ${webhook.name} (${webhook.type}):`);
241
+ console.log(` curl -X POST -H "Content-Type: application/json" -d '${formatted}' "${webhook.url}"`);
242
+ if (webhook.mentionOnCritical && payloadCritical > 0) {
243
+ console.log(` ⚠ Critical findings — mention ${webhook.mentionOnCritical}`);
244
+ }
245
+ }
246
+ }
247
+ console.log("");
248
+ return;
249
+ }
250
+ // Default: show status
251
+ const webhooks = loadWebhooks();
252
+ console.log(`\n Chat Notify — ${webhooks.length} webhook(s) configured`);
253
+ if (webhooks.length > 0) {
254
+ for (const w of webhooks)
255
+ console.log(` 📡 ${w.name} (${w.type})`);
256
+ }
257
+ console.log(" Use --help for usage.\n");
258
+ }
259
+ //# sourceMappingURL=chat-notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-notify.js","sourceRoot":"","sources":["../../src/commands/chat-notify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Design audit — detect AI-generated code that breaks project
3
+ * conventions, introduces unnecessary abstractions, or creates
4
+ * architectural deviation from the baseline.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ export declare function runDesignAudit(argv: string[]): void;
9
+ //# sourceMappingURL=design-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-audit.d.ts","sourceRoot":"","sources":["../../src/commands/design-audit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4PH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6GnD"}
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Design audit — detect AI-generated code that breaks project
3
+ * conventions, introduces unnecessary abstractions, or creates
4
+ * architectural deviation from the baseline.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ import { existsSync, readFileSync, readdirSync } from "fs";
9
+ import { join, extname, relative } from "path";
10
+ // ─── Analysers ──────────────────────────────────────────────────────────────
11
+ function analyzeDesignCoherence(content, _filePath, baselinePatterns) {
12
+ const lines = content.split("\n");
13
+ const metrics = [];
14
+ const issues = [];
15
+ // 1. Convention adherence — does file follow project patterns?
16
+ const usesProjectImportStyle = baselinePatterns.importStyle === "named" ? /import\s*{/.test(content) : /import\s+\w+\s+from/.test(content);
17
+ const conventionScore = usesProjectImportStyle ? 80 : 40;
18
+ metrics.push({ id: "convention", label: "Convention Adherence", score: conventionScore, weight: 20 });
19
+ if (conventionScore < 60)
20
+ issues.push({
21
+ id: "import-style",
22
+ label: "Import Style Deviation",
23
+ severity: "low",
24
+ detail: "Import style differs from project convention",
25
+ });
26
+ // 2. Unnecessary abstraction
27
+ const classCount = (content.match(/\bclass\s+\w+/g) || []).length;
28
+ const interfaceCount = (content.match(/\binterface\s+\w+/g) || []).length;
29
+ const abstractCount = (content.match(/\babstract\s+class/g) || []).length;
30
+ const singleMethodClasses = (content.match(/class\s+\w+[\s\S]*?{[\s\S]*?(\w+\s*\([\s\S]*?\)[\s\S]*?{[\s\S]*?})[\s\S]*?}/g) || []).length;
31
+ const overAbstraction = abstractCount > 1 || (classCount > 0 && singleMethodClasses === classCount);
32
+ const abstractionScore = overAbstraction ? 30 : classCount + interfaceCount > 8 ? 50 : 100;
33
+ metrics.push({
34
+ id: "abstraction",
35
+ label: "Abstraction Level",
36
+ score: abstractionScore,
37
+ weight: 20,
38
+ detail: `${classCount} classes, ${interfaceCount} interfaces, ${abstractCount} abstract`,
39
+ });
40
+ if (overAbstraction) {
41
+ issues.push({
42
+ id: "over-abstraction",
43
+ label: "Over-Abstraction",
44
+ severity: "medium",
45
+ detail: "Excessive abstraction layers — AI often creates unnecessary wrappers",
46
+ });
47
+ }
48
+ // 3. Orphaned dependencies
49
+ const imports = content.match(/import\s+(?:{[^}]+}|\w+)\s+from\s+["']([^"']+)["']/g) || [];
50
+ const unusedImportCount = imports.filter((imp) => {
51
+ const names = imp
52
+ .match(/import\s+{([^}]+)}/)?.[1]
53
+ ?.split(",")
54
+ .map((s) => s
55
+ .trim()
56
+ .split(/\s+as\s+/)
57
+ .pop()
58
+ ?.trim()) || [];
59
+ const defaultName = imp.match(/import\s+(\w+)\s+from/)?.[1];
60
+ const allNames = [...names, defaultName].filter(Boolean);
61
+ const afterImport = content.slice(content.indexOf(imp) + imp.length);
62
+ return allNames.some((n) => !new RegExp(`\\b${n}\\b`).test(afterImport));
63
+ }).length;
64
+ const orphanScore = unusedImportCount === 0 ? 100 : unusedImportCount <= 2 ? 60 : 30;
65
+ metrics.push({
66
+ id: "orphaned-deps",
67
+ label: "Dependency Hygiene",
68
+ score: orphanScore,
69
+ weight: 15,
70
+ detail: `${unusedImportCount} potentially unused imports`,
71
+ });
72
+ if (unusedImportCount > 0) {
73
+ issues.push({
74
+ id: "unused-imports",
75
+ label: "Orphaned Imports",
76
+ severity: "low",
77
+ detail: `${unusedImportCount} import(s) may be unused — common AI-generation artifact`,
78
+ });
79
+ }
80
+ // 4. Pattern consistency
81
+ const usesCallbacks = /\bcallback\b|\.then\(|function\s*\(err/.test(content);
82
+ const usesAsync = /\basync\b.*\bawait\b/s.test(content);
83
+ const usesPromise = /new\s+Promise/.test(content);
84
+ const asyncPatterns = [usesCallbacks, usesAsync, usesPromise].filter(Boolean).length;
85
+ const patternScore = asyncPatterns <= 1 ? 100 : asyncPatterns === 2 ? 60 : 30;
86
+ metrics.push({ id: "pattern-consistency", label: "Pattern Consistency", score: patternScore, weight: 15 });
87
+ if (asyncPatterns > 1) {
88
+ issues.push({
89
+ id: "mixed-async",
90
+ label: "Mixed Async Patterns",
91
+ severity: "medium",
92
+ detail: "Mixes callbacks, async/await, and/or raw Promises — pick one style",
93
+ });
94
+ }
95
+ // 5. Error handling consistency
96
+ const tryCatchCount = (content.match(/\btry\s*{/g) || []).length;
97
+ const catchSuppressCount = (content.match(/catch\s*\([^)]*\)\s*{\s*}/g) || []).length;
98
+ const throwCount = (content.match(/\bthrow\s+/g) || []).length;
99
+ const errorScore = catchSuppressCount === 0 ? 100 : catchSuppressCount <= 1 ? 70 : 30;
100
+ metrics.push({
101
+ id: "error-handling",
102
+ label: "Error Handling",
103
+ score: errorScore,
104
+ weight: 15,
105
+ detail: `${tryCatchCount} try/catch, ${catchSuppressCount} suppressed, ${throwCount} throws`,
106
+ });
107
+ if (catchSuppressCount > 0) {
108
+ issues.push({
109
+ id: "suppressed-errors",
110
+ label: "Suppressed Errors",
111
+ severity: "high",
112
+ detail: `${catchSuppressCount} empty catch block(s) — errors silently swallowed`,
113
+ });
114
+ }
115
+ // 6. Naming coherence
116
+ const camelCase = (content.match(/\b[a-z][a-zA-Z0-9]*[A-Z][a-zA-Z0-9]*/g) || []).length;
117
+ const snakeCase = (content.match(/\b[a-z]+_[a-z]+/g) || []).length;
118
+ const mixedNaming = camelCase > 0 && snakeCase > 0;
119
+ const namingScore = mixedNaming ? (Math.abs(camelCase - snakeCase) > 5 ? 50 : 30) : 100;
120
+ metrics.push({ id: "naming-coherence", label: "Naming Coherence", score: namingScore, weight: 15 });
121
+ if (mixedNaming) {
122
+ issues.push({
123
+ id: "mixed-naming",
124
+ label: "Mixed Naming Convention",
125
+ severity: "low",
126
+ detail: `${camelCase} camelCase + ${snakeCase} snake_case identifiers`,
127
+ });
128
+ }
129
+ void lines;
130
+ return { metrics, issues };
131
+ }
132
+ function detectBaseline(files) {
133
+ let namedCount = 0;
134
+ let defaultCount = 0;
135
+ let totalLength = 0;
136
+ let asyncCount = 0;
137
+ let callbackCount = 0;
138
+ for (const f of files.slice(0, 20)) {
139
+ try {
140
+ const content = readFileSync(f, "utf-8");
141
+ totalLength += content.split("\n").length;
142
+ namedCount += (content.match(/import\s*{/g) || []).length;
143
+ defaultCount += (content.match(/import\s+\w+\s+from/g) || []).length;
144
+ if (/\basync\b/.test(content))
145
+ asyncCount++;
146
+ if (/\.then\(/.test(content))
147
+ callbackCount++;
148
+ }
149
+ catch {
150
+ /* skip */
151
+ }
152
+ }
153
+ return {
154
+ importStyle: namedCount >= defaultCount ? "named" : "default",
155
+ avgFileLength: files.length > 0 ? Math.round(totalLength / Math.min(files.length, 20)) : 0,
156
+ primaryAsyncPattern: asyncCount >= callbackCount ? "async/await" : "callbacks",
157
+ };
158
+ }
159
+ // ─── Scanner ────────────────────────────────────────────────────────────────
160
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
161
+ const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
162
+ function collectFiles(dir) {
163
+ const result = [];
164
+ function walk(d) {
165
+ let entries;
166
+ try {
167
+ entries = readdirSync(d);
168
+ }
169
+ catch {
170
+ return;
171
+ }
172
+ for (const name of entries) {
173
+ if (SKIP.has(name) || name.startsWith("."))
174
+ continue;
175
+ const full = join(d, name);
176
+ try {
177
+ const sub = readdirSync(full);
178
+ void sub;
179
+ walk(full);
180
+ }
181
+ catch {
182
+ if (EXTS.has(extname(name).toLowerCase()))
183
+ result.push(full);
184
+ }
185
+ }
186
+ }
187
+ walk(dir);
188
+ return result;
189
+ }
190
+ function gradeFor(score) {
191
+ if (score >= 90)
192
+ return "A";
193
+ if (score >= 80)
194
+ return "B";
195
+ if (score >= 70)
196
+ return "C";
197
+ if (score >= 60)
198
+ return "D";
199
+ return "F";
200
+ }
201
+ function computeOverall(metrics) {
202
+ const totalWeight = metrics.reduce((s, m) => s + m.weight, 0);
203
+ const weighted = metrics.reduce((s, m) => s + m.score * m.weight, 0);
204
+ return totalWeight > 0 ? Math.round(weighted / totalWeight) : 0;
205
+ }
206
+ // ─── CLI ────────────────────────────────────────────────────────────────────
207
+ export function runDesignAudit(argv) {
208
+ if (argv.includes("--help") || argv.includes("-h")) {
209
+ console.log(`
210
+ judges design-audit — Detect code that breaks project conventions
211
+
212
+ Usage:
213
+ judges design-audit <file-or-dir>
214
+ judges design-audit src/ --min-grade C
215
+
216
+ Options:
217
+ --min-grade <A-F> Only show files at or below this grade
218
+ --format json JSON output
219
+ --help, -h Show this help
220
+
221
+ Checks:
222
+ • Convention adherence (import style, project patterns)
223
+ • Abstraction level (over-engineering, unnecessary wrappers)
224
+ • Dependency hygiene (orphaned/unused imports)
225
+ • Pattern consistency (mixed async styles)
226
+ • Error handling (suppressed errors, empty catch blocks)
227
+ • Naming coherence (mixed camelCase/snake_case)
228
+ `);
229
+ return;
230
+ }
231
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
232
+ const minGrade = argv.find((_a, i) => argv[i - 1] === "--min-grade");
233
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
234
+ if (!existsSync(target)) {
235
+ console.error(` Path not found: ${target}`);
236
+ return;
237
+ }
238
+ let files;
239
+ try {
240
+ readdirSync(target);
241
+ files = collectFiles(target);
242
+ }
243
+ catch {
244
+ files = [target];
245
+ }
246
+ const baseline = detectBaseline(files);
247
+ const results = [];
248
+ for (const f of files) {
249
+ let content;
250
+ try {
251
+ content = readFileSync(f, "utf-8");
252
+ }
253
+ catch {
254
+ continue;
255
+ }
256
+ const { metrics, issues } = analyzeDesignCoherence(content, f, baseline);
257
+ const overall = computeOverall(metrics);
258
+ results.push({ file: relative(target, f) || f, overallScore: overall, grade: gradeFor(overall), metrics, issues });
259
+ }
260
+ let filtered = results;
261
+ if (minGrade) {
262
+ const gradeOrder = ["A", "B", "C", "D", "F"];
263
+ const minIdx = gradeOrder.indexOf(minGrade.toUpperCase());
264
+ if (minIdx >= 0)
265
+ filtered = results.filter((r) => gradeOrder.indexOf(r.grade) >= minIdx);
266
+ }
267
+ filtered.sort((a, b) => a.overallScore - b.overallScore);
268
+ if (format === "json") {
269
+ console.log(JSON.stringify({ files: filtered, baseline, scannedFiles: files.length, timestamp: new Date().toISOString() }, null, 2));
270
+ }
271
+ else {
272
+ const avgScore = results.length > 0 ? Math.round(results.reduce((s, r) => s + r.overallScore, 0) / results.length) : 0;
273
+ console.log(`\n Design Coherence Audit — ${files.length} files`);
274
+ console.log(` Average: ${avgScore}/100 (${gradeFor(avgScore)})`);
275
+ console.log(` Baseline: ${baseline.importStyle} imports, ${baseline.primaryAsyncPattern}, ~${baseline.avgFileLength} lines/file\n ──────────────────────────`);
276
+ if (filtered.length === 0) {
277
+ console.log(` ✅ All files meet design coherence threshold\n`);
278
+ return;
279
+ }
280
+ for (const r of filtered.slice(0, 20)) {
281
+ const icon = r.grade === "A" || r.grade === "B" ? "🟢" : r.grade === "C" ? "🟡" : r.grade === "D" ? "🟠" : "🔴";
282
+ console.log(`\n ${icon} ${r.file} — ${r.overallScore}/100 (${r.grade})`);
283
+ for (const m of r.metrics) {
284
+ const mIcon = m.score >= 70 ? "✓" : m.score >= 40 ? "~" : "✗";
285
+ console.log(` ${mIcon} ${m.label.padEnd(24)} ${String(m.score).padEnd(4)} ${m.detail || ""}`);
286
+ }
287
+ if (r.issues.length > 0) {
288
+ for (const iss of r.issues) {
289
+ const sev = iss.severity === "high" ? "🔴" : iss.severity === "medium" ? "🟠" : "🟡";
290
+ console.log(` ${sev} ${iss.detail}`);
291
+ }
292
+ }
293
+ }
294
+ if (filtered.length > 20)
295
+ console.log(` ... and ${filtered.length - 20} more files`);
296
+ const dist = { A: 0, B: 0, C: 0, D: 0, F: 0 };
297
+ for (const r of results)
298
+ dist[r.grade]++;
299
+ console.log(`\n Distribution: A:${dist.A} B:${dist.B} C:${dist.C} D:${dist.D} F:${dist.F}\n`);
300
+ }
301
+ }
302
+ //# sourceMappingURL=design-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-audit.js","sourceRoot":"","sources":["../../src/commands/design-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Impact scan — detect ripple effects of AI-generated code across
3
+ * the codebase: broken imports, unused exports, API contract breaks,
4
+ * dependency chain issues.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ export declare function runImpactScan(argv: string[]): void;
9
+ //# sourceMappingURL=impact-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact-scan.d.ts","sourceRoot":"","sources":["../../src/commands/impact-scan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsPH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyElD"}