@kevinrabun/judges 3.51.0 → 3.53.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/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/code-similarity.d.ts +9 -0
  10. package/dist/commands/code-similarity.d.ts.map +1 -0
  11. package/dist/commands/code-similarity.js +232 -0
  12. package/dist/commands/code-similarity.js.map +1 -0
  13. package/dist/commands/compliance-weight.d.ts +9 -0
  14. package/dist/commands/compliance-weight.d.ts.map +1 -0
  15. package/dist/commands/compliance-weight.js +273 -0
  16. package/dist/commands/compliance-weight.js.map +1 -0
  17. package/dist/commands/cross-pr-regression.d.ts +9 -0
  18. package/dist/commands/cross-pr-regression.d.ts.map +1 -0
  19. package/dist/commands/cross-pr-regression.js +298 -0
  20. package/dist/commands/cross-pr-regression.js.map +1 -0
  21. package/dist/commands/design-audit.d.ts +9 -0
  22. package/dist/commands/design-audit.d.ts.map +1 -0
  23. package/dist/commands/design-audit.js +302 -0
  24. package/dist/commands/design-audit.js.map +1 -0
  25. package/dist/commands/doc-drift.d.ts +9 -0
  26. package/dist/commands/doc-drift.d.ts.map +1 -0
  27. package/dist/commands/doc-drift.js +259 -0
  28. package/dist/commands/doc-drift.js.map +1 -0
  29. package/dist/commands/exception-consistency.d.ts +7 -0
  30. package/dist/commands/exception-consistency.d.ts.map +1 -0
  31. package/dist/commands/exception-consistency.js +193 -0
  32. package/dist/commands/exception-consistency.js.map +1 -0
  33. package/dist/commands/impact-scan.d.ts +9 -0
  34. package/dist/commands/impact-scan.d.ts.map +1 -0
  35. package/dist/commands/impact-scan.js +282 -0
  36. package/dist/commands/impact-scan.js.map +1 -0
  37. package/dist/commands/judge-learn.d.ts +9 -0
  38. package/dist/commands/judge-learn.d.ts.map +1 -0
  39. package/dist/commands/judge-learn.js +218 -0
  40. package/dist/commands/judge-learn.js.map +1 -0
  41. package/dist/commands/model-report.d.ts +9 -0
  42. package/dist/commands/model-report.d.ts.map +1 -0
  43. package/dist/commands/model-report.js +195 -0
  44. package/dist/commands/model-report.js.map +1 -0
  45. package/dist/commands/refactor-safety.d.ts +9 -0
  46. package/dist/commands/refactor-safety.d.ts.map +1 -0
  47. package/dist/commands/refactor-safety.js +274 -0
  48. package/dist/commands/refactor-safety.js.map +1 -0
  49. package/dist/commands/remediation-lib.d.ts +9 -0
  50. package/dist/commands/remediation-lib.d.ts.map +1 -0
  51. package/dist/commands/remediation-lib.js +266 -0
  52. package/dist/commands/remediation-lib.js.map +1 -0
  53. package/dist/commands/resource-cleanup.d.ts +7 -0
  54. package/dist/commands/resource-cleanup.d.ts.map +1 -0
  55. package/dist/commands/resource-cleanup.js +236 -0
  56. package/dist/commands/resource-cleanup.js.map +1 -0
  57. package/dist/commands/team-trust.d.ts +8 -0
  58. package/dist/commands/team-trust.d.ts.map +1 -0
  59. package/dist/commands/team-trust.js +175 -0
  60. package/dist/commands/team-trust.js.map +1 -0
  61. package/dist/commands/trust-adaptive.d.ts +9 -0
  62. package/dist/commands/trust-adaptive.d.ts.map +1 -0
  63. package/dist/commands/trust-adaptive.js +194 -0
  64. package/dist/commands/trust-adaptive.js.map +1 -0
  65. package/dist/commands/watch-judge.d.ts +8 -0
  66. package/dist/commands/watch-judge.d.ts.map +1 -0
  67. package/dist/commands/watch-judge.js +180 -0
  68. package/dist/commands/watch-judge.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Compliance weight — dynamically adjust finding severity based on
3
+ * active compliance frameworks (PCI-DSS, HIPAA, GDPR, SOC2, ISO27001).
4
+ *
5
+ * Takes a judges report (JSON) and re-weights findings according to
6
+ * the specified framework(s). Stored config in `.judgesrc` or CLI flags.
7
+ */
8
+ // ─── Framework Definitions ──────────────────────────────────────────────────
9
+ const FRAMEWORK_RULES = [
10
+ // PCI-DSS
11
+ { pattern: /sql.?inject|injection/i, weight: 3.0, frameworks: ["PCI-DSS"], note: "PCI-DSS 6.5.1: Injection flaws" },
12
+ {
13
+ pattern: /xss|cross.?site.?script/i,
14
+ weight: 2.5,
15
+ frameworks: ["PCI-DSS"],
16
+ note: "PCI-DSS 6.5.7: Cross-site scripting",
17
+ },
18
+ {
19
+ pattern: /hardcoded.?(secret|password|key|credential|token)/i,
20
+ weight: 3.0,
21
+ frameworks: ["PCI-DSS"],
22
+ note: "PCI-DSS 3.4: Render PAN unreadable",
23
+ },
24
+ {
25
+ pattern: /crypto|encrypt|hash|cipher/i,
26
+ weight: 2.0,
27
+ frameworks: ["PCI-DSS"],
28
+ note: "PCI-DSS 4.1: Strong cryptography",
29
+ },
30
+ {
31
+ pattern: /auth|session|login|password/i,
32
+ weight: 2.0,
33
+ frameworks: ["PCI-DSS"],
34
+ note: "PCI-DSS 8.x: Authentication controls",
35
+ },
36
+ // HIPAA
37
+ {
38
+ pattern: /pii|personal.?data|patient|health|phi|protected.?health/i,
39
+ weight: 3.0,
40
+ frameworks: ["HIPAA"],
41
+ note: "HIPAA §164.312: ePHI protection",
42
+ },
43
+ {
44
+ pattern: /encrypt|crypto|tls|ssl/i,
45
+ weight: 2.5,
46
+ frameworks: ["HIPAA"],
47
+ note: "HIPAA §164.312(a)(2)(iv): Encryption",
48
+ },
49
+ { pattern: /log|audit|monitor/i, weight: 2.0, frameworks: ["HIPAA"], note: "HIPAA §164.312(b): Audit controls" },
50
+ {
51
+ pattern: /access.?control|rbac|authorization/i,
52
+ weight: 2.5,
53
+ frameworks: ["HIPAA"],
54
+ note: "HIPAA §164.312(a)(1): Access control",
55
+ },
56
+ // GDPR
57
+ {
58
+ pattern: /pii|personal.?data|consent|data.?subject/i,
59
+ weight: 3.0,
60
+ frameworks: ["GDPR"],
61
+ note: "GDPR Art. 5: Data processing principles",
62
+ },
63
+ {
64
+ pattern: /data.?retention|delete|erase|forget/i,
65
+ weight: 2.5,
66
+ frameworks: ["GDPR"],
67
+ note: "GDPR Art. 17: Right to erasure",
68
+ },
69
+ {
70
+ pattern: /encrypt|pseudonym|anonymi/i,
71
+ weight: 2.0,
72
+ frameworks: ["GDPR"],
73
+ note: "GDPR Art. 32: Security of processing",
74
+ },
75
+ {
76
+ pattern: /third.?party|vendor|external.?api/i,
77
+ weight: 2.0,
78
+ frameworks: ["GDPR"],
79
+ note: "GDPR Art. 28: Processor obligations",
80
+ },
81
+ // SOC2
82
+ { pattern: /log|audit|monitor|alert/i, weight: 2.0, frameworks: ["SOC2"], note: "SOC2 CC7.x: System monitoring" },
83
+ { pattern: /access.?control|auth|rbac/i, weight: 2.5, frameworks: ["SOC2"], note: "SOC2 CC6.x: Logical access" },
84
+ {
85
+ pattern: /encrypt|crypto|tls/i,
86
+ weight: 2.0,
87
+ frameworks: ["SOC2"],
88
+ note: "SOC2 CC6.7: Encryption in transit/at rest",
89
+ },
90
+ {
91
+ pattern: /error.?handling|exception|catch/i,
92
+ weight: 1.5,
93
+ frameworks: ["SOC2"],
94
+ note: "SOC2 CC7.4: Error handling",
95
+ },
96
+ // ISO 27001
97
+ {
98
+ pattern: /access.?control|auth|rbac/i,
99
+ weight: 2.5,
100
+ frameworks: ["ISO27001"],
101
+ note: "ISO27001 A.9: Access control",
102
+ },
103
+ {
104
+ pattern: /crypto|encrypt|hash|key.?manage/i,
105
+ weight: 2.5,
106
+ frameworks: ["ISO27001"],
107
+ note: "ISO27001 A.10: Cryptography",
108
+ },
109
+ { pattern: /backup|recovery|disaster/i, weight: 2.0, frameworks: ["ISO27001"], note: "ISO27001 A.12.3: Backup" },
110
+ {
111
+ pattern: /log|audit|monitor/i,
112
+ weight: 2.0,
113
+ frameworks: ["ISO27001"],
114
+ note: "ISO27001 A.12.4: Logging and monitoring",
115
+ },
116
+ ];
117
+ const SEVERITY_LEVELS = { info: 1, low: 2, medium: 3, high: 4, critical: 5 };
118
+ const SEVERITY_NAMES = ["info", "low", "medium", "high", "critical"];
119
+ function numericSeverity(sev) {
120
+ return SEVERITY_LEVELS[sev.toLowerCase()] || 2;
121
+ }
122
+ function severityFromScore(score) {
123
+ const clamped = Math.min(5, Math.max(1, Math.round(score)));
124
+ return SEVERITY_NAMES[clamped - 1];
125
+ }
126
+ // ─── Re-weighting ───────────────────────────────────────────────────────────
127
+ function reweightFindings(findings, activeFrameworks) {
128
+ const active = new Set(activeFrameworks.map((f) => f.toUpperCase()));
129
+ return findings.map((f) => {
130
+ const text = [f.ruleId || "", f.title || "", f.description || ""].join(" ");
131
+ const originalSev = (f.severity || "medium").toLowerCase();
132
+ const baseSeverity = numericSeverity(originalSev);
133
+ let maxWeight = 1.0;
134
+ const matchedFrameworks = [];
135
+ const notes = [];
136
+ for (const rule of FRAMEWORK_RULES) {
137
+ // Only apply rules from active frameworks
138
+ const ruleFrameworks = rule.frameworks.filter((fw) => active.has(fw.toUpperCase()));
139
+ if (ruleFrameworks.length === 0)
140
+ continue;
141
+ if (rule.pattern.test(text)) {
142
+ if (rule.weight > maxWeight)
143
+ maxWeight = rule.weight;
144
+ matchedFrameworks.push(...ruleFrameworks);
145
+ notes.push(rule.note);
146
+ }
147
+ }
148
+ const adjustedScore = baseSeverity * maxWeight;
149
+ const newSeverity = severityFromScore(adjustedScore);
150
+ return {
151
+ ruleId: f.ruleId || "unknown",
152
+ title: f.title || f.description || "Untitled finding",
153
+ severity: newSeverity,
154
+ originalSeverity: originalSev,
155
+ frameworks: [...new Set(matchedFrameworks)],
156
+ complianceNotes: [...new Set(notes)],
157
+ weight: maxWeight,
158
+ };
159
+ });
160
+ }
161
+ // ─── CLI ────────────────────────────────────────────────────────────────────
162
+ export function runComplianceWeight(argv) {
163
+ if (argv.includes("--help") || argv.includes("-h")) {
164
+ console.log(`
165
+ judges compliance-weight — Re-weight findings by compliance framework
166
+
167
+ Usage:
168
+ judges compliance-weight --frameworks PCI-DSS,HIPAA < report.json
169
+ judges compliance-weight --frameworks GDPR --demo
170
+ judges compliance-weight --list-frameworks
171
+
172
+ Options:
173
+ --frameworks <list> Comma-separated frameworks: PCI-DSS, HIPAA, GDPR, SOC2, ISO27001
174
+ --demo Run with demo findings
175
+ --list-frameworks List available frameworks and rules
176
+ --format json JSON output
177
+ --help, -h Show this help
178
+ `);
179
+ return;
180
+ }
181
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
182
+ const frameworksArg = argv.find((_a, i) => argv[i - 1] === "--frameworks") || "";
183
+ const isDemo = argv.includes("--demo");
184
+ const isList = argv.includes("--list-frameworks");
185
+ if (isList) {
186
+ const frameworks = new Map();
187
+ for (const rule of FRAMEWORK_RULES) {
188
+ for (const fw of rule.frameworks) {
189
+ const list = frameworks.get(fw) || [];
190
+ list.push(` ${rule.note} (weight: ${rule.weight}x)`);
191
+ frameworks.set(fw, list);
192
+ }
193
+ }
194
+ console.log("\n Available Compliance Frameworks:\n ──────────────────────────");
195
+ for (const [fw, rules] of frameworks) {
196
+ console.log(`\n ${fw} (${rules.length} rules):`);
197
+ for (const r of rules)
198
+ console.log(` ${r}`);
199
+ }
200
+ console.log("");
201
+ return;
202
+ }
203
+ const activeFrameworks = frameworksArg
204
+ .split(",")
205
+ .map((f) => f.trim())
206
+ .filter(Boolean);
207
+ if (activeFrameworks.length === 0) {
208
+ console.error(" Specify --frameworks (e.g., --frameworks PCI-DSS,GDPR) or use --list-frameworks");
209
+ return;
210
+ }
211
+ let findings;
212
+ if (isDemo) {
213
+ findings = [
214
+ { ruleId: "SEC-001", title: "SQL injection in user query", severity: "medium" },
215
+ { ruleId: "SEC-002", title: "XSS vulnerability in template", severity: "medium" },
216
+ { ruleId: "SEC-003", title: "Hardcoded password in config", severity: "high" },
217
+ { ruleId: "SEC-004", title: "Missing encryption for PII data", severity: "medium" },
218
+ { ruleId: "SEC-005", title: "No audit logging for access control", severity: "low" },
219
+ { ruleId: "SEC-006", title: "Third-party API calls without auth", severity: "medium" },
220
+ { ruleId: "SEC-007", title: "Missing data retention policy", severity: "low" },
221
+ { ruleId: "PERF-001", title: "Inefficient loop nesting", severity: "low" },
222
+ ];
223
+ }
224
+ else {
225
+ // Read from stdin
226
+ try {
227
+ const input = require("fs").readFileSync(0, "utf-8");
228
+ const parsed = JSON.parse(input);
229
+ findings = parsed.findings || parsed.results || parsed;
230
+ if (!Array.isArray(findings)) {
231
+ console.error(" Input must contain a 'findings' or 'results' array");
232
+ return;
233
+ }
234
+ }
235
+ catch {
236
+ console.error(" Could not read JSON from stdin. Use --demo for a demo or pipe a report.");
237
+ return;
238
+ }
239
+ }
240
+ const weighted = reweightFindings(findings, activeFrameworks);
241
+ if (format === "json") {
242
+ console.log(JSON.stringify({
243
+ frameworks: activeFrameworks,
244
+ findings: weighted,
245
+ summary: {
246
+ total: weighted.length,
247
+ escalated: weighted.filter((f) => f.severity !== f.originalSeverity).length,
248
+ complianceRelevant: weighted.filter((f) => f.frameworks.length > 0).length,
249
+ },
250
+ timestamp: new Date().toISOString(),
251
+ }, null, 2));
252
+ }
253
+ else {
254
+ const escalated = weighted.filter((f) => f.severity !== f.originalSeverity);
255
+ const relevant = weighted.filter((f) => f.frameworks.length > 0);
256
+ console.log(`\n Compliance-Weighted Findings — ${activeFrameworks.join(", ")}\n ──────────────────────────`);
257
+ console.log(` Total: ${weighted.length} | Escalated: ${escalated.length} | Compliance-relevant: ${relevant.length}\n`);
258
+ for (const f of weighted) {
259
+ const changed = f.severity !== f.originalSeverity;
260
+ const sevDisplay = changed ? `${f.originalSeverity} → ${f.severity} ⬆` : f.severity;
261
+ const icon = f.severity === "critical" ? "🔴" : f.severity === "high" ? "🟠" : f.severity === "medium" ? "🟡" : "⚪";
262
+ console.log(` ${icon} [${sevDisplay}] ${f.ruleId}: ${f.title}`);
263
+ if (f.frameworks.length > 0) {
264
+ console.log(` Frameworks: ${f.frameworks.join(", ")}`);
265
+ for (const note of f.complianceNotes.slice(0, 2)) {
266
+ console.log(` 📋 ${note}`);
267
+ }
268
+ }
269
+ }
270
+ console.log("");
271
+ }
272
+ }
273
+ //# sourceMappingURL=compliance-weight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-weight.js","sourceRoot":"","sources":["../../src/commands/compliance-weight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Cross-PR pattern regression — track flagged patterns and alert
3
+ * when they recur in new code. Prevents AI from reintroducing
4
+ * known bugs.
5
+ *
6
+ * All data stored locally in `.judges-pr-patterns/`.
7
+ */
8
+ export declare function runCrossPrRegression(argv: string[]): void;
9
+ //# sourceMappingURL=cross-pr-regression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-pr-regression.d.ts","sourceRoot":"","sources":["../../src/commands/cross-pr-regression.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0LH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4JzD"}
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Cross-PR pattern regression — track flagged patterns and alert
3
+ * when they recur in new code. Prevents AI from reintroducing
4
+ * known bugs.
5
+ *
6
+ * All data stored locally in `.judges-pr-patterns/`.
7
+ */
8
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from "fs";
9
+ import { join, extname, relative } from "path";
10
+ // ─── Storage ────────────────────────────────────────────────────────────────
11
+ const DATA_DIR = ".judges-pr-patterns";
12
+ function ensureDir() {
13
+ if (!existsSync(DATA_DIR))
14
+ mkdirSync(DATA_DIR, { recursive: true });
15
+ }
16
+ function loadPatterns() {
17
+ const file = join(DATA_DIR, "patterns.json");
18
+ if (!existsSync(file))
19
+ return [];
20
+ try {
21
+ return JSON.parse(readFileSync(file, "utf-8"));
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ }
27
+ function savePatterns(patterns) {
28
+ ensureDir();
29
+ writeFileSync(join(DATA_DIR, "patterns.json"), JSON.stringify(patterns, null, 2));
30
+ }
31
+ // ─── Built-in patterns ─────────────────────────────────────────────────────
32
+ const BUILTIN_PATTERNS = [
33
+ {
34
+ id: "bp-sql-concat",
35
+ pattern: "\\$\\{.*\\}.*(?:SELECT|INSERT|UPDATE|DELETE)",
36
+ description: "SQL string interpolation",
37
+ severity: "critical",
38
+ language: "any",
39
+ occurrences: 0,
40
+ firstSeen: "",
41
+ lastSeen: "",
42
+ },
43
+ {
44
+ id: "bp-eval",
45
+ pattern: "\\beval\\s*\\(",
46
+ description: "eval() usage",
47
+ severity: "critical",
48
+ language: "any",
49
+ occurrences: 0,
50
+ firstSeen: "",
51
+ lastSeen: "",
52
+ },
53
+ {
54
+ id: "bp-innerhtml",
55
+ pattern: "\\.innerHTML\\s*=",
56
+ description: "Direct innerHTML assignment",
57
+ severity: "high",
58
+ language: "javascript",
59
+ occurrences: 0,
60
+ firstSeen: "",
61
+ lastSeen: "",
62
+ },
63
+ {
64
+ id: "bp-empty-catch",
65
+ pattern: "catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}",
66
+ description: "Empty catch block",
67
+ severity: "medium",
68
+ language: "any",
69
+ occurrences: 0,
70
+ firstSeen: "",
71
+ lastSeen: "",
72
+ },
73
+ {
74
+ id: "bp-hardcoded-secret",
75
+ pattern: "(?:password|secret|api.?key|token)\\s*[:=]\\s*[\"'][^\"']{8,}",
76
+ description: "Hardcoded secret",
77
+ severity: "critical",
78
+ language: "any",
79
+ occurrences: 0,
80
+ firstSeen: "",
81
+ lastSeen: "",
82
+ },
83
+ {
84
+ id: "bp-debug-log",
85
+ pattern: "console\\.(?:log|debug)\\(",
86
+ description: "Debug logging in production",
87
+ severity: "low",
88
+ language: "javascript",
89
+ occurrences: 0,
90
+ firstSeen: "",
91
+ lastSeen: "",
92
+ },
93
+ ];
94
+ // ─── Scanner ────────────────────────────────────────────────────────────────
95
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
96
+ const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
97
+ function collectFiles(dir) {
98
+ const result = [];
99
+ function walk(d) {
100
+ let entries;
101
+ try {
102
+ entries = readdirSync(d);
103
+ }
104
+ catch {
105
+ return;
106
+ }
107
+ for (const name of entries) {
108
+ if (SKIP.has(name) || name.startsWith("."))
109
+ continue;
110
+ const full = join(d, name);
111
+ try {
112
+ const sub = readdirSync(full);
113
+ void sub;
114
+ walk(full);
115
+ }
116
+ catch {
117
+ if (EXTS.has(extname(name).toLowerCase()))
118
+ result.push(full);
119
+ }
120
+ }
121
+ }
122
+ walk(dir);
123
+ return result;
124
+ }
125
+ function scanForRegressions(files, patterns, baseDir) {
126
+ const hits = [];
127
+ for (const f of files) {
128
+ let content;
129
+ try {
130
+ content = readFileSync(f, "utf-8");
131
+ }
132
+ catch {
133
+ continue;
134
+ }
135
+ const lines = content.split("\n");
136
+ const rel = relative(baseDir, f) || f;
137
+ for (const pat of patterns) {
138
+ try {
139
+ const re = new RegExp(pat.pattern, "gi");
140
+ for (let i = 0; i < lines.length; i++) {
141
+ const m = re.exec(lines[i]);
142
+ if (m) {
143
+ hits.push({
144
+ file: rel,
145
+ line: i + 1,
146
+ patternId: pat.id,
147
+ patternDescription: pat.description,
148
+ severity: pat.severity,
149
+ matchedText: m[0].slice(0, 80),
150
+ });
151
+ }
152
+ re.lastIndex = 0;
153
+ }
154
+ }
155
+ catch {
156
+ /* invalid regex, skip */
157
+ }
158
+ }
159
+ }
160
+ return hits;
161
+ }
162
+ // ─── CLI ────────────────────────────────────────────────────────────────────
163
+ export function runCrossPrRegression(argv) {
164
+ if (argv.includes("--help") || argv.includes("-h")) {
165
+ console.log(`
166
+ judges cross-pr-regression — Detect recurring problem patterns
167
+
168
+ Usage:
169
+ judges cross-pr-regression <dir>
170
+ judges cross-pr-regression src/ --init
171
+ judges cross-pr-regression src/ --add --pattern "TODO:" --desc "Unfinished TODO" --severity medium
172
+
173
+ Options:
174
+ --init Initialize with built-in patterns
175
+ --add Add a custom pattern
176
+ --pattern <regex> Regex pattern to detect
177
+ --desc <text> Pattern description
178
+ --severity <level> critical, high, medium, low
179
+ --lang <language> Language filter (default: any)
180
+ --list List tracked patterns
181
+ --format json JSON output
182
+ --help, -h Show this help
183
+ `);
184
+ return;
185
+ }
186
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
187
+ const isInit = argv.includes("--init");
188
+ const isAdd = argv.includes("--add");
189
+ const isList = argv.includes("--list");
190
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
191
+ if (isInit) {
192
+ const patterns = loadPatterns();
193
+ let added = 0;
194
+ for (const bp of BUILTIN_PATTERNS) {
195
+ if (!patterns.some((p) => p.id === bp.id)) {
196
+ patterns.push({ ...bp, firstSeen: new Date().toISOString() });
197
+ added++;
198
+ }
199
+ }
200
+ savePatterns(patterns);
201
+ console.log(` ✅ Initialized with ${added} built-in patterns (${patterns.length} total)`);
202
+ return;
203
+ }
204
+ if (isAdd) {
205
+ const pattern = argv.find((_a, i) => argv[i - 1] === "--pattern") || "";
206
+ const desc = argv.find((_a, i) => argv[i - 1] === "--desc") || "";
207
+ const severity = (argv.find((_a, i) => argv[i - 1] === "--severity") ||
208
+ "medium");
209
+ const lang = argv.find((_a, i) => argv[i - 1] === "--lang") || "any";
210
+ if (!pattern || !desc) {
211
+ console.error(" --pattern and --desc are required");
212
+ return;
213
+ }
214
+ const patterns = loadPatterns();
215
+ patterns.push({
216
+ id: `custom-${Date.now()}`,
217
+ pattern,
218
+ description: desc,
219
+ severity,
220
+ language: lang,
221
+ occurrences: 0,
222
+ firstSeen: new Date().toISOString(),
223
+ lastSeen: "",
224
+ });
225
+ savePatterns(patterns);
226
+ console.log(` ✅ Added pattern: ${desc}`);
227
+ return;
228
+ }
229
+ if (isList) {
230
+ const patterns = loadPatterns();
231
+ if (format === "json") {
232
+ console.log(JSON.stringify(patterns, null, 2));
233
+ }
234
+ else {
235
+ console.log(`\n Tracked Patterns — ${patterns.length}\n ──────────────────────────`);
236
+ for (const p of patterns) {
237
+ const sev = p.severity === "critical" ? "🔴" : p.severity === "high" ? "🟠" : p.severity === "medium" ? "🟡" : "⚪";
238
+ console.log(` ${sev} [${p.id}] ${p.description} (${p.occurrences} hits)`);
239
+ }
240
+ console.log("");
241
+ }
242
+ return;
243
+ }
244
+ // Scan
245
+ if (!existsSync(target)) {
246
+ console.error(` Path not found: ${target}`);
247
+ return;
248
+ }
249
+ const patterns = loadPatterns();
250
+ if (patterns.length === 0) {
251
+ console.log(" No patterns tracked. Use --init or --add to add patterns.");
252
+ return;
253
+ }
254
+ let files;
255
+ try {
256
+ readdirSync(target);
257
+ files = collectFiles(target);
258
+ }
259
+ catch {
260
+ files = [target];
261
+ }
262
+ const hits = scanForRegressions(files, patterns, target);
263
+ // Update occurrence counts
264
+ for (const hit of hits) {
265
+ const pat = patterns.find((p) => p.id === hit.patternId);
266
+ if (pat) {
267
+ pat.occurrences++;
268
+ pat.lastSeen = new Date().toISOString();
269
+ }
270
+ }
271
+ savePatterns(patterns);
272
+ if (format === "json") {
273
+ console.log(JSON.stringify({ hits, scannedFiles: files.length, patterns: patterns.length, timestamp: new Date().toISOString() }, null, 2));
274
+ }
275
+ else {
276
+ console.log(`\n Cross-PR Pattern Regression — ${files.length} files, ${patterns.length} patterns\n ──────────────────────────`);
277
+ if (hits.length === 0) {
278
+ console.log(` ✅ No pattern regressions detected\n`);
279
+ return;
280
+ }
281
+ console.log(` ⚠ ${hits.length} regression(s) found:\n`);
282
+ const byFile = new Map();
283
+ for (const h of hits) {
284
+ const list = byFile.get(h.file) || [];
285
+ list.push(h);
286
+ byFile.set(h.file, list);
287
+ }
288
+ for (const [file, fileHits] of byFile) {
289
+ console.log(` 📄 ${file}`);
290
+ for (const h of fileHits) {
291
+ const sev = h.severity === "critical" ? "🔴" : h.severity === "high" ? "🟠" : h.severity === "medium" ? "🟡" : "⚪";
292
+ console.log(` ${sev} L${h.line}: ${h.patternDescription} — "${h.matchedText}"`);
293
+ }
294
+ }
295
+ console.log("");
296
+ }
297
+ }
298
+ //# sourceMappingURL=cross-pr-regression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-pr-regression.js","sourceRoot":"","sources":["../../src/commands/cross-pr-regression.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"}