@kevinrabun/judges 3.52.0 → 3.54.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/approve-chain.d.ts +8 -0
  6. package/dist/commands/approve-chain.d.ts.map +1 -0
  7. package/dist/commands/approve-chain.js +235 -0
  8. package/dist/commands/approve-chain.js.map +1 -0
  9. package/dist/commands/coach-mode.d.ts +8 -0
  10. package/dist/commands/coach-mode.d.ts.map +1 -0
  11. package/dist/commands/coach-mode.js +230 -0
  12. package/dist/commands/coach-mode.js.map +1 -0
  13. package/dist/commands/code-similarity.d.ts +9 -0
  14. package/dist/commands/code-similarity.d.ts.map +1 -0
  15. package/dist/commands/code-similarity.js +232 -0
  16. package/dist/commands/code-similarity.js.map +1 -0
  17. package/dist/commands/compliance-weight.d.ts +9 -0
  18. package/dist/commands/compliance-weight.d.ts.map +1 -0
  19. package/dist/commands/compliance-weight.js +273 -0
  20. package/dist/commands/compliance-weight.js.map +1 -0
  21. package/dist/commands/context-inject.d.ts +9 -0
  22. package/dist/commands/context-inject.d.ts.map +1 -0
  23. package/dist/commands/context-inject.js +212 -0
  24. package/dist/commands/context-inject.js.map +1 -0
  25. package/dist/commands/cross-pr-regression.d.ts +9 -0
  26. package/dist/commands/cross-pr-regression.d.ts.map +1 -0
  27. package/dist/commands/cross-pr-regression.js +298 -0
  28. package/dist/commands/cross-pr-regression.js.map +1 -0
  29. package/dist/commands/doc-drift.d.ts +9 -0
  30. package/dist/commands/doc-drift.d.ts.map +1 -0
  31. package/dist/commands/doc-drift.js +259 -0
  32. package/dist/commands/doc-drift.js.map +1 -0
  33. package/dist/commands/exception-consistency.d.ts +7 -0
  34. package/dist/commands/exception-consistency.d.ts.map +1 -0
  35. package/dist/commands/exception-consistency.js +193 -0
  36. package/dist/commands/exception-consistency.js.map +1 -0
  37. package/dist/commands/finding-contest.d.ts +8 -0
  38. package/dist/commands/finding-contest.d.ts.map +1 -0
  39. package/dist/commands/finding-contest.js +193 -0
  40. package/dist/commands/finding-contest.js.map +1 -0
  41. package/dist/commands/habit-tracker.d.ts +8 -0
  42. package/dist/commands/habit-tracker.d.ts.map +1 -0
  43. package/dist/commands/habit-tracker.js +195 -0
  44. package/dist/commands/habit-tracker.js.map +1 -0
  45. package/dist/commands/prompt-replay.d.ts +8 -0
  46. package/dist/commands/prompt-replay.d.ts.map +1 -0
  47. package/dist/commands/prompt-replay.js +177 -0
  48. package/dist/commands/prompt-replay.js.map +1 -0
  49. package/dist/commands/refactor-safety.d.ts +9 -0
  50. package/dist/commands/refactor-safety.d.ts.map +1 -0
  51. package/dist/commands/refactor-safety.js +274 -0
  52. package/dist/commands/refactor-safety.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/review-replay.d.ts +9 -0
  58. package/dist/commands/review-replay.d.ts.map +1 -0
  59. package/dist/commands/review-replay.js +265 -0
  60. package/dist/commands/review-replay.js.map +1 -0
  61. package/dist/commands/snippet-eval.d.ts +8 -0
  62. package/dist/commands/snippet-eval.d.ts.map +1 -0
  63. package/dist/commands/snippet-eval.js +224 -0
  64. package/dist/commands/snippet-eval.js.map +1 -0
  65. package/dist/commands/team-trust.d.ts +8 -0
  66. package/dist/commands/team-trust.d.ts.map +1 -0
  67. package/dist/commands/team-trust.js +175 -0
  68. package/dist/commands/team-trust.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Context inject — feed project-specific context (architecture docs,
3
+ * API contracts, coding standards) into evaluation for higher-precision
4
+ * findings.
5
+ *
6
+ * Parses context files and maintains a local context cache for judges.
7
+ */
8
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from "fs";
9
+ import { join, basename } from "path";
10
+ // ─── Storage ────────────────────────────────────────────────────────────────
11
+ const CONTEXT_DIR = ".judges-context";
12
+ function ensureDir() {
13
+ if (!existsSync(CONTEXT_DIR))
14
+ mkdirSync(CONTEXT_DIR, { recursive: true });
15
+ }
16
+ function loadProfile() {
17
+ const file = join(CONTEXT_DIR, "profile.json");
18
+ if (!existsSync(file))
19
+ return null;
20
+ try {
21
+ return JSON.parse(readFileSync(file, "utf-8"));
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function saveProfile(profile) {
28
+ ensureDir();
29
+ writeFileSync(join(CONTEXT_DIR, "profile.json"), JSON.stringify(profile, null, 2));
30
+ }
31
+ // ─── Context Extraction ────────────────────────────────────────────────────
32
+ const RULE_PATTERNS = [
33
+ { regex: /(?:must|should|always|never|require|mandatory)\s+(.{10,80})/i, category: "requirement" },
34
+ { regex: /(?:do not|don't|avoid|prohibit|forbid)\s+(.{10,80})/i, category: "prohibition" },
35
+ { regex: /(?:all|every)\s+(?:api|endpoint|route|handler)\s+(?:must|should)\s+(.{10,80})/i, category: "api-standard" },
36
+ {
37
+ regex: /(?:database|db|data)\s+(?:access|query|operation)\s+(?:must|should)\s+(.{10,80})/i,
38
+ category: "data-access",
39
+ },
40
+ {
41
+ regex: /(?:error|exception)\s+(?:handling|management)\s+(?:must|should)\s+(.{10,80})/i,
42
+ category: "error-handling",
43
+ },
44
+ { regex: /(?:auth|authentication|authorization)\s+(.{10,80})/i, category: "auth" },
45
+ { regex: /(?:naming|convention|style)\s+(?:must|should|:)\s*(.{10,80})/i, category: "naming" },
46
+ { regex: /(?:test|testing)\s+(?:must|should|require)\s+(.{10,80})/i, category: "testing" },
47
+ { regex: /(?:log|logging)\s+(?:must|should|require)\s+(.{10,80})/i, category: "logging" },
48
+ { regex: /(?:security|secure)\s+(?:must|should|require)\s+(.{10,80})/i, category: "security" },
49
+ ];
50
+ function extractRules(content, source) {
51
+ const rules = [];
52
+ const lines = content.split("\n");
53
+ for (const line of lines) {
54
+ const trimmed = line.trim();
55
+ if (!trimmed || trimmed.startsWith("#"))
56
+ continue;
57
+ for (const pattern of RULE_PATTERNS) {
58
+ const match = pattern.regex.exec(trimmed);
59
+ if (match) {
60
+ rules.push({ source: basename(source), category: pattern.category, rule: trimmed.substring(0, 120) });
61
+ break;
62
+ }
63
+ }
64
+ }
65
+ return rules;
66
+ }
67
+ // ─── CLI ────────────────────────────────────────────────────────────────────
68
+ export function runContextInject(argv) {
69
+ if (argv.includes("--help") || argv.includes("-h")) {
70
+ console.log(`
71
+ judges context-inject — Feed project context into evaluation
72
+
73
+ Usage:
74
+ judges context-inject --add docs/architecture.md
75
+ judges context-inject --add docs/coding-standards.md
76
+ judges context-inject --show
77
+ judges context-inject --scan docs/
78
+ judges context-inject --clear
79
+
80
+ Options:
81
+ --add <file> Add a context file (Markdown/YAML/text)
82
+ --scan <dir> Scan directory for context documents
83
+ --show Show current context profile
84
+ --clear Clear all context
85
+ --format json JSON output
86
+ --help, -h Show this help
87
+
88
+ Context files are parsed for rules, standards, and conventions that
89
+ judges use to calibrate findings for your specific project.
90
+ `);
91
+ return;
92
+ }
93
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
94
+ const isAdd = argv.includes("--add");
95
+ const _isShow = argv.includes("--show");
96
+ const isScan = argv.includes("--scan");
97
+ const isClear = argv.includes("--clear");
98
+ if (isClear) {
99
+ saveProfile({
100
+ name: "default",
101
+ sources: [],
102
+ rules: [],
103
+ createdAt: new Date().toISOString(),
104
+ updatedAt: new Date().toISOString(),
105
+ });
106
+ console.log(" ✅ Context cleared");
107
+ return;
108
+ }
109
+ if (isAdd) {
110
+ const fileIdx = argv.indexOf("--add") + 1;
111
+ const file = argv[fileIdx] || "";
112
+ if (!file || !existsSync(file)) {
113
+ console.error(` File not found: ${file}`);
114
+ return;
115
+ }
116
+ const content = readFileSync(file, "utf-8");
117
+ const newRules = extractRules(content, file);
118
+ const profile = loadProfile() || {
119
+ name: "default",
120
+ sources: [],
121
+ rules: [],
122
+ createdAt: new Date().toISOString(),
123
+ updatedAt: "",
124
+ };
125
+ if (!profile.sources.includes(file))
126
+ profile.sources.push(file);
127
+ profile.rules.push(...newRules);
128
+ profile.updatedAt = new Date().toISOString();
129
+ saveProfile(profile);
130
+ console.log(` ✅ Added ${file} — extracted ${newRules.length} rule(s)`);
131
+ if (newRules.length > 0) {
132
+ for (const r of newRules.slice(0, 5)) {
133
+ console.log(` [${r.category}] ${r.rule}`);
134
+ }
135
+ if (newRules.length > 5)
136
+ console.log(` ... and ${newRules.length - 5} more`);
137
+ }
138
+ return;
139
+ }
140
+ if (isScan) {
141
+ const dirIdx = argv.indexOf("--scan") + 1;
142
+ const dir = argv[dirIdx] || "docs";
143
+ if (!existsSync(dir)) {
144
+ console.error(` Directory not found: ${dir}`);
145
+ return;
146
+ }
147
+ const DOC_EXTS = new Set([".md", ".txt", ".yaml", ".yml", ".rst"]);
148
+ let entries;
149
+ try {
150
+ entries = readdirSync(dir);
151
+ }
152
+ catch {
153
+ entries = [];
154
+ }
155
+ const docFiles = entries.filter((e) => DOC_EXTS.has(join(".", e).includes(".") ? "." + e.split(".").pop() : ""));
156
+ const profile = loadProfile() || {
157
+ name: "default",
158
+ sources: [],
159
+ rules: [],
160
+ createdAt: new Date().toISOString(),
161
+ updatedAt: "",
162
+ };
163
+ let totalNew = 0;
164
+ for (const f of docFiles) {
165
+ const fullPath = join(dir, f);
166
+ try {
167
+ const content = readFileSync(fullPath, "utf-8");
168
+ const rules = extractRules(content, fullPath);
169
+ if (!profile.sources.includes(fullPath))
170
+ profile.sources.push(fullPath);
171
+ profile.rules.push(...rules);
172
+ totalNew += rules.length;
173
+ }
174
+ catch {
175
+ /* skip */
176
+ }
177
+ }
178
+ profile.updatedAt = new Date().toISOString();
179
+ saveProfile(profile);
180
+ console.log(` ✅ Scanned ${docFiles.length} doc(s) in ${dir} — extracted ${totalNew} rule(s)`);
181
+ return;
182
+ }
183
+ // Default: show profile
184
+ const profile = loadProfile();
185
+ if (!profile || profile.rules.length === 0) {
186
+ console.log(" No context loaded. Use --add <file> or --scan <dir> to inject context.");
187
+ return;
188
+ }
189
+ if (format === "json") {
190
+ console.log(JSON.stringify(profile, null, 2));
191
+ }
192
+ else {
193
+ console.log(`\n Context Profile — ${profile.rules.length} rule(s) from ${profile.sources.length} source(s)\n ──────────────────────────`);
194
+ const byCategory = new Map();
195
+ for (const r of profile.rules) {
196
+ const list = byCategory.get(r.category) || [];
197
+ list.push(r);
198
+ byCategory.set(r.category, list);
199
+ }
200
+ for (const [cat, rules] of byCategory) {
201
+ console.log(`\n 📋 ${cat} (${rules.length}):`);
202
+ for (const r of rules.slice(0, 5)) {
203
+ console.log(` ${r.rule}`);
204
+ }
205
+ if (rules.length > 5)
206
+ console.log(` ... and ${rules.length - 5} more`);
207
+ }
208
+ console.log(`\n Sources: ${profile.sources.join(", ")}`);
209
+ console.log(` Last updated: ${profile.updatedAt}\n`);
210
+ }
211
+ }
212
+ //# sourceMappingURL=context-inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-inject.js","sourceRoot":"","sources":["../../src/commands/context-inject.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
+ * Doc drift — detect when inline comments, docstrings, and type
3
+ * annotations contradict the actual code behavior. A critical
4
+ * AI-generation problem where docs are written separately.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ export declare function runDocDrift(argv: string[]): void;
9
+ //# sourceMappingURL=doc-drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-drift.d.ts","sourceRoot":"","sources":["../../src/commands/doc-drift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuMH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyFhD"}