@kevinrabun/judges 3.52.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 (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/code-similarity.d.ts +9 -0
  6. package/dist/commands/code-similarity.d.ts.map +1 -0
  7. package/dist/commands/code-similarity.js +232 -0
  8. package/dist/commands/code-similarity.js.map +1 -0
  9. package/dist/commands/compliance-weight.d.ts +9 -0
  10. package/dist/commands/compliance-weight.d.ts.map +1 -0
  11. package/dist/commands/compliance-weight.js +273 -0
  12. package/dist/commands/compliance-weight.js.map +1 -0
  13. package/dist/commands/cross-pr-regression.d.ts +9 -0
  14. package/dist/commands/cross-pr-regression.d.ts.map +1 -0
  15. package/dist/commands/cross-pr-regression.js +298 -0
  16. package/dist/commands/cross-pr-regression.js.map +1 -0
  17. package/dist/commands/doc-drift.d.ts +9 -0
  18. package/dist/commands/doc-drift.d.ts.map +1 -0
  19. package/dist/commands/doc-drift.js +259 -0
  20. package/dist/commands/doc-drift.js.map +1 -0
  21. package/dist/commands/exception-consistency.d.ts +7 -0
  22. package/dist/commands/exception-consistency.d.ts.map +1 -0
  23. package/dist/commands/exception-consistency.js +193 -0
  24. package/dist/commands/exception-consistency.js.map +1 -0
  25. package/dist/commands/refactor-safety.d.ts +9 -0
  26. package/dist/commands/refactor-safety.d.ts.map +1 -0
  27. package/dist/commands/refactor-safety.js +274 -0
  28. package/dist/commands/refactor-safety.js.map +1 -0
  29. package/dist/commands/resource-cleanup.d.ts +7 -0
  30. package/dist/commands/resource-cleanup.d.ts.map +1 -0
  31. package/dist/commands/resource-cleanup.js +236 -0
  32. package/dist/commands/resource-cleanup.js.map +1 -0
  33. package/dist/commands/team-trust.d.ts +8 -0
  34. package/dist/commands/team-trust.d.ts.map +1 -0
  35. package/dist/commands/team-trust.js +175 -0
  36. package/dist/commands/team-trust.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -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"}
@@ -0,0 +1,259 @@
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
+ import { existsSync, readFileSync, readdirSync } from "fs";
9
+ import { join, extname, relative } from "path";
10
+ // ─── Analysis ───────────────────────────────────────────────────────────────
11
+ function analyzeDrift(content) {
12
+ const lines = content.split("\n");
13
+ const issues = [];
14
+ for (let i = 0; i < lines.length; i++) {
15
+ const line = lines[i];
16
+ const nextLine = lines[i + 1] || "";
17
+ // 1. JSDoc @param mismatch
18
+ const paramMatch = line.match(/@param\s+(?:{[^}]+}\s+)?(\w+)/);
19
+ if (paramMatch) {
20
+ const paramName = paramMatch[1];
21
+ // Look ahead for function signature
22
+ for (let j = i + 1; j < Math.min(i + 5, lines.length); j++) {
23
+ const fnMatch = lines[j].match(/(?:function\s+\w+|(?:const|let)\s+\w+\s*=\s*(?:async\s*)?\(|^\s*(?:async\s*)?\()\s*([^)]*)\)/);
24
+ if (fnMatch) {
25
+ const params = fnMatch[1];
26
+ if (params && !params.includes(paramName)) {
27
+ issues.push({
28
+ line: i + 1,
29
+ type: "param-mismatch",
30
+ severity: "high",
31
+ detail: `@param "${paramName}" not found in function signature`,
32
+ });
33
+ }
34
+ break;
35
+ }
36
+ }
37
+ }
38
+ // 2. @returns but function has no return
39
+ if (/@returns?\s/.test(line)) {
40
+ let fnBodyStart = -1;
41
+ for (let j = i + 1; j < Math.min(i + 5, lines.length); j++) {
42
+ if (/{\s*$/.test(lines[j])) {
43
+ fnBodyStart = j;
44
+ break;
45
+ }
46
+ }
47
+ if (fnBodyStart >= 0) {
48
+ let depth = 0;
49
+ let hasReturn = false;
50
+ for (let j = fnBodyStart; j < lines.length; j++) {
51
+ depth += (lines[j].match(/{/g) || []).length;
52
+ depth -= (lines[j].match(/}/g) || []).length;
53
+ if (/\breturn\s+\S/.test(lines[j]))
54
+ hasReturn = true;
55
+ if (depth <= 0)
56
+ break;
57
+ }
58
+ if (!hasReturn) {
59
+ issues.push({
60
+ line: i + 1,
61
+ type: "return-mismatch",
62
+ severity: "high",
63
+ detail: "@returns documented but function has no return value",
64
+ });
65
+ }
66
+ }
67
+ }
68
+ // 3. Comment references wrong function/variable name
69
+ const commentMatch = line.match(/\/\/\s*(?:calls?|uses?|invokes?|sets?|gets?)\s+(\w+)/i);
70
+ if (commentMatch) {
71
+ const refName = commentMatch[1];
72
+ if (refName.length > 2 &&
73
+ !content.includes(`function ${refName}`) &&
74
+ !content.includes(`const ${refName}`) &&
75
+ !content.includes(`let ${refName}`) &&
76
+ !content.includes(`.${refName}`)) {
77
+ issues.push({
78
+ line: i + 1,
79
+ type: "wrong-name",
80
+ severity: "medium",
81
+ detail: `Comment references "${refName}" which doesn't exist in this file`,
82
+ });
83
+ }
84
+ }
85
+ // 4. Comment says "returns X" but next line does something else
86
+ const returnsComment = line.match(/\/\/\s*returns?\s+(true|false|null|undefined|void|nothing|\d+|an?\s+\w+)/i);
87
+ if (returnsComment && /\breturn\b/.test(nextLine)) {
88
+ const claimed = returnsComment[1].toLowerCase();
89
+ if (claimed === "true" && !nextLine.includes("true")) {
90
+ issues.push({
91
+ line: i + 1,
92
+ type: "stale-comment",
93
+ severity: "medium",
94
+ detail: `Comment says "returns true" but return statement differs`,
95
+ });
96
+ }
97
+ else if (claimed === "false" && !nextLine.includes("false")) {
98
+ issues.push({
99
+ line: i + 1,
100
+ type: "stale-comment",
101
+ severity: "medium",
102
+ detail: `Comment says "returns false" but return statement differs`,
103
+ });
104
+ }
105
+ else if (claimed === "null" && !nextLine.includes("null")) {
106
+ issues.push({
107
+ line: i + 1,
108
+ type: "stale-comment",
109
+ severity: "medium",
110
+ detail: `Comment says "returns null" but return statement differs`,
111
+ });
112
+ }
113
+ }
114
+ // 5. Dead documentation — comment block before deleted/empty code
115
+ if (/\/\*\*/.test(line) && !line.includes("*/")) {
116
+ let endComment = -1;
117
+ for (let j = i + 1; j < Math.min(i + 20, lines.length); j++) {
118
+ if (/\*\//.test(lines[j])) {
119
+ endComment = j;
120
+ break;
121
+ }
122
+ }
123
+ if (endComment >= 0) {
124
+ const afterDoc = lines[endComment + 1]?.trim() || "";
125
+ if (afterDoc === "" || afterDoc === "}" || afterDoc === ");") {
126
+ issues.push({
127
+ line: i + 1,
128
+ type: "dead-doc",
129
+ severity: "low",
130
+ detail: "Documentation block with no code following it",
131
+ });
132
+ }
133
+ }
134
+ }
135
+ // 6. TODO in documentation
136
+ if (/\/\*\*[\s\S]*TODO|@todo/i.test(line) || (/^\s*\*/.test(line) && /TODO/i.test(line))) {
137
+ issues.push({
138
+ line: i + 1,
139
+ type: "todo-doc",
140
+ severity: "low",
141
+ detail: "TODO found in documentation — may indicate incomplete AI-generated docs",
142
+ });
143
+ }
144
+ }
145
+ return issues;
146
+ }
147
+ // ─── Scanner ────────────────────────────────────────────────────────────────
148
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
149
+ const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
150
+ function collectFiles(dir) {
151
+ const result = [];
152
+ function walk(d) {
153
+ let entries;
154
+ try {
155
+ entries = readdirSync(d);
156
+ }
157
+ catch {
158
+ return;
159
+ }
160
+ for (const name of entries) {
161
+ if (SKIP.has(name) || name.startsWith("."))
162
+ continue;
163
+ const full = join(d, name);
164
+ try {
165
+ const sub = readdirSync(full);
166
+ void sub;
167
+ walk(full);
168
+ }
169
+ catch {
170
+ if (EXTS.has(extname(name).toLowerCase()))
171
+ result.push(full);
172
+ }
173
+ }
174
+ }
175
+ walk(dir);
176
+ return result;
177
+ }
178
+ // ─── CLI ────────────────────────────────────────────────────────────────────
179
+ export function runDocDrift(argv) {
180
+ if (argv.includes("--help") || argv.includes("-h")) {
181
+ console.log(`
182
+ judges doc-drift — Detect documentation-to-code drift
183
+
184
+ Usage:
185
+ judges doc-drift <file-or-dir>
186
+ judges doc-drift src/ --min-issues 1
187
+
188
+ Options:
189
+ --min-issues <n> Only show files with at least N issues (default: 1)
190
+ --format json JSON output
191
+ --help, -h Show this help
192
+
193
+ Checks:
194
+ • @param name mismatches with function signature
195
+ • @returns documented but no return statement
196
+ • Comments referencing nonexistent identifiers
197
+ • Stale return value comments
198
+ • Dead documentation blocks
199
+ • TODO in documentation
200
+ `);
201
+ return;
202
+ }
203
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
204
+ const minIssues = parseInt(argv.find((_a, i) => argv[i - 1] === "--min-issues") || "1");
205
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
206
+ if (!existsSync(target)) {
207
+ console.error(` Path not found: ${target}`);
208
+ return;
209
+ }
210
+ let files;
211
+ try {
212
+ readdirSync(target);
213
+ files = collectFiles(target);
214
+ }
215
+ catch {
216
+ files = [target];
217
+ }
218
+ const results = [];
219
+ for (const f of files) {
220
+ let content;
221
+ try {
222
+ content = readFileSync(f, "utf-8");
223
+ }
224
+ catch {
225
+ continue;
226
+ }
227
+ const issues = analyzeDrift(content);
228
+ const driftScore = Math.max(0, 100 -
229
+ issues.filter((i) => i.severity === "high").length * 20 -
230
+ issues.filter((i) => i.severity === "medium").length * 10 -
231
+ issues.filter((i) => i.severity === "low").length * 3);
232
+ results.push({ file: relative(target, f) || f, issues, driftScore });
233
+ }
234
+ const filtered = results.filter((r) => r.issues.length >= minIssues);
235
+ filtered.sort((a, b) => a.driftScore - b.driftScore);
236
+ if (format === "json") {
237
+ console.log(JSON.stringify({ files: filtered, scannedFiles: files.length, timestamp: new Date().toISOString() }, null, 2));
238
+ }
239
+ else {
240
+ const totalIssues = results.reduce((s, r) => s + r.issues.length, 0);
241
+ console.log(`\n Doc Drift — ${files.length} files, ${totalIssues} issues\n ──────────────────────────`);
242
+ if (filtered.length === 0) {
243
+ console.log(` ✅ No documentation drift detected\n`);
244
+ return;
245
+ }
246
+ for (const r of filtered.slice(0, 20)) {
247
+ const icon = r.driftScore >= 80 ? "🟢" : r.driftScore >= 50 ? "🟡" : "🔴";
248
+ console.log(`\n ${icon} ${r.file} — ${r.driftScore}/100 (${r.issues.length} issues)`);
249
+ for (const iss of r.issues) {
250
+ const sev = iss.severity === "high" ? "🔴" : iss.severity === "medium" ? "🟠" : "🟡";
251
+ console.log(` ${sev} L${iss.line}: ${iss.detail}`);
252
+ }
253
+ }
254
+ if (filtered.length > 20)
255
+ console.log(` ... and ${filtered.length - 20} more files`);
256
+ console.log("");
257
+ }
258
+ }
259
+ //# sourceMappingURL=doc-drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-drift.js","sourceRoot":"","sources":["../../src/commands/doc-drift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAiB/C,+EAA+E;AAE/E,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAEpC,2BAA2B;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/D,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,oCAAoC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAC5B,8FAA8F,CAC/F,CAAC;gBACF,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC1B,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC1C,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,CAAC,GAAG,CAAC;4BACX,IAAI,EAAE,gBAAgB;4BACtB,QAAQ,EAAE,MAAM;4BAChB,MAAM,EAAE,WAAW,SAAS,mCAAmC;yBAChE,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3D,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,WAAW,GAAG,CAAC,CAAC;oBAChB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,IAAI,KAAK,GAAG,CAAC,CAAC;gBACd,IAAI,SAAS,GAAG,KAAK,CAAC;gBACtB,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAChD,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;oBAC7C,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;oBAC7C,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAAE,SAAS,GAAG,IAAI,CAAC;oBACrD,IAAI,KAAK,IAAI,CAAC;wBAAE,MAAM;gBACxB,CAAC;gBACD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,IAAI,EAAE,iBAAiB;wBACvB,QAAQ,EAAE,MAAM;wBAChB,MAAM,EAAE,sDAAsD;qBAC/D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACzF,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,IACE,OAAO,CAAC,MAAM,GAAG,CAAC;gBAClB,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,OAAO,EAAE,CAAC;gBACxC,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,OAAO,EAAE,CAAC;gBACrC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,OAAO,EAAE,CAAC;gBACnC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC,EAChC,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,uBAAuB,OAAO,oCAAoC;iBAC3E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC/G,IAAI,cAAc,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAChD,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrD,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,IAAI,EAAE,eAAe;oBACrB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,0DAA0D;iBACnE,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9D,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,IAAI,EAAE,eAAe;oBACrB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,2DAA2D;iBACpE,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,IAAI,EAAE,eAAe;oBACrB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,0DAA0D;iBACnE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5D,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1B,UAAU,GAAG,CAAC,CAAC;oBACf,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACrD,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;oBAC7D,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,IAAI,EAAE,UAAU;wBAChB,QAAQ,EAAE,KAAK;wBACf,MAAM,EAAE,+CAA+C;qBACxD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,yEAAyE;aAClF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAC5E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAEzF,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,SAAS,IAAI,CAAC,CAAS;QACrB,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,CAAC,CAAwB,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9B,KAAK,GAAG,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;CAmBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;IAC1F,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC;IACxG,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;IAEpH,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,CAAC,EACD,GAAG;YACD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,GAAG,EAAE;YACvD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,GAAG,EAAE;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CACxD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;IACrE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAErD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAC9G,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,MAAM,WAAW,WAAW,uCAAuC,CAAC,CAAC;QAE1G,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,UAAU,SAAS,CAAC,CAAC,MAAM,CAAC,MAAM,UAAU,CAAC,CAAC;YACzF,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACrF,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,MAAM,GAAG,EAAE,aAAa,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Exception consistency — detect inconsistent exception handling
3
+ * patterns within a codebase: thrown-but-uncaught, asymmetric
4
+ * try/catch/finally, unhandled promise rejections, mixed strategies.
5
+ */
6
+ export declare function runExceptionConsistency(argv: string[]): void;
7
+ //# sourceMappingURL=exception-consistency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exception-consistency.d.ts","sourceRoot":"","sources":["../../src/commands/exception-consistency.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmJH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsE5D"}