@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,274 @@
1
+ /**
2
+ * Refactor safety — analyze proposed refactorings for breaking changes,
3
+ * incomplete migrations, orphaned references, and behavioral changes.
4
+ *
5
+ * Compares two directory snapshots or a list of changed files against
6
+ * the broader codebase to detect incomplete refactors.
7
+ */
8
+ import { readFileSync, readdirSync, statSync, existsSync } from "fs";
9
+ import { join, extname, relative } from "path";
10
+ // ─── File Collection ────────────────────────────────────────────────────────
11
+ const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".java", ".cs", ".go", ".rs"]);
12
+ function collectFiles(dir, max = 500) {
13
+ const files = [];
14
+ function walk(d) {
15
+ if (files.length >= max)
16
+ return;
17
+ let entries;
18
+ try {
19
+ entries = readdirSync(d);
20
+ }
21
+ catch {
22
+ return;
23
+ }
24
+ for (const e of entries) {
25
+ if (files.length >= max)
26
+ return;
27
+ if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
28
+ continue;
29
+ const full = join(d, e);
30
+ try {
31
+ if (statSync(full).isDirectory())
32
+ walk(full);
33
+ else if (CODE_EXTS.has(extname(full)))
34
+ files.push(full);
35
+ }
36
+ catch {
37
+ /* skip */
38
+ }
39
+ }
40
+ }
41
+ walk(dir);
42
+ return files;
43
+ }
44
+ // ─── Analysis ───────────────────────────────────────────────────────────────
45
+ function extractExports(content) {
46
+ const exports = [];
47
+ const exportRegex = /\bexport\s+(?:function|class|const|let|type|interface|enum)\s+(\w+)/g;
48
+ let m;
49
+ while ((m = exportRegex.exec(content)) !== null)
50
+ exports.push(m[1]);
51
+ const defaultExport = /\bexport\s+default\s+(?:function|class)?\s*(\w+)?/g;
52
+ while ((m = defaultExport.exec(content)) !== null) {
53
+ if (m[1])
54
+ exports.push(m[1]);
55
+ }
56
+ return exports;
57
+ }
58
+ function extractImports(content) {
59
+ const imports = [];
60
+ const importRegex = /import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/g;
61
+ let m;
62
+ while ((m = importRegex.exec(content)) !== null) {
63
+ const names = m[1]
64
+ .split(",")
65
+ .map((n) => n
66
+ .trim()
67
+ .split(/\s+as\s+/)[0]
68
+ .trim())
69
+ .filter(Boolean);
70
+ imports.push({ names, source: m[2] });
71
+ }
72
+ return imports;
73
+ }
74
+ function analyzeRefactorSafety(files, dir) {
75
+ const issues = [];
76
+ // Build export map: symbol → file
77
+ const exportMap = new Map();
78
+ const fileContents = new Map();
79
+ for (const f of files) {
80
+ let content;
81
+ try {
82
+ content = readFileSync(f, "utf-8");
83
+ }
84
+ catch {
85
+ continue;
86
+ }
87
+ fileContents.set(f, content);
88
+ const exports = extractExports(content);
89
+ for (const exp of exports) {
90
+ exportMap.set(exp, f);
91
+ }
92
+ }
93
+ // Check for orphaned imports (importing symbols that no file exports)
94
+ for (const [filePath, content] of fileContents) {
95
+ const imports = extractImports(content);
96
+ const lines = content.split("\n");
97
+ for (const imp of imports) {
98
+ // Only check local imports (starting with . or ..)
99
+ if (!imp.source.startsWith("."))
100
+ continue;
101
+ for (const name of imp.names) {
102
+ // Check if any file exports this symbol
103
+ if (!exportMap.has(name)) {
104
+ const lineNum = lines.findIndex((l) => l.includes(name) && l.includes("import")) + 1;
105
+ issues.push({
106
+ file: filePath,
107
+ line: lineNum || 1,
108
+ kind: "orphaned-import",
109
+ message: `Import '${name}' from '${imp.source}' — symbol not found in any scanned file exports`,
110
+ severity: "high",
111
+ });
112
+ }
113
+ }
114
+ }
115
+ }
116
+ // Detect renamed/removed patterns
117
+ for (const [filePath, content] of fileContents) {
118
+ const lines = content.split("\n");
119
+ // Check for TODO/FIXME indicating incomplete refactor
120
+ for (let i = 0; i < lines.length; i++) {
121
+ const line = lines[i];
122
+ if (/\/\/\s*(TODO|FIXME|HACK|XXX)\s*:?\s*(refactor|rename|migrate|move|deprecated)/i.test(line)) {
123
+ issues.push({
124
+ file: filePath,
125
+ line: i + 1,
126
+ kind: "incomplete-refactor-marker",
127
+ message: `Found refactor marker: ${line.trim().substring(0, 80)}`,
128
+ severity: "medium",
129
+ });
130
+ }
131
+ }
132
+ // Detect deprecated usage
133
+ for (let i = 0; i < lines.length; i++) {
134
+ if (/@deprecated/i.test(lines[i])) {
135
+ // Find the symbol being deprecated
136
+ const nextLine = lines[i + 1] || "";
137
+ const symbolMatch = nextLine.match(/\b(function|class|const|let|var)\s+(\w+)/);
138
+ if (symbolMatch) {
139
+ const deprecatedName = symbolMatch[2];
140
+ // Count references across codebase
141
+ let refs = 0;
142
+ for (const [otherFile, otherContent] of fileContents) {
143
+ if (otherFile === filePath)
144
+ continue;
145
+ const regex = new RegExp(`\\b${deprecatedName}\\b`, "g");
146
+ const matches = otherContent.match(regex);
147
+ if (matches)
148
+ refs += matches.length;
149
+ }
150
+ if (refs > 0) {
151
+ issues.push({
152
+ file: filePath,
153
+ line: i + 1,
154
+ kind: "deprecated-still-used",
155
+ message: `@deprecated symbol '${deprecatedName}' still referenced ${refs} time(s) across codebase`,
156
+ severity: "high",
157
+ });
158
+ }
159
+ }
160
+ }
161
+ }
162
+ // Detect type assertion overuse (potential behavioral change masking)
163
+ const assertionCount = (content.match(/\bas\s+\w/g) || []).length;
164
+ if (assertionCount > 10) {
165
+ issues.push({
166
+ file: filePath,
167
+ line: 1,
168
+ kind: "excessive-type-assertions",
169
+ message: `${assertionCount} type assertions — may mask type incompatibilities from refactoring`,
170
+ severity: "low",
171
+ });
172
+ }
173
+ }
174
+ // Detect dead files (files with exports but no imports from other files)
175
+ for (const [filePath, content] of fileContents) {
176
+ const exports = extractExports(content);
177
+ if (exports.length === 0)
178
+ continue;
179
+ // Skip entry points
180
+ const rel = relative(dir, filePath);
181
+ if (rel.includes("index.") || rel.includes("main.") || rel.includes("cli.") || rel.includes("test"))
182
+ continue;
183
+ let referenced = false;
184
+ for (const [otherFile, otherContent] of fileContents) {
185
+ if (otherFile === filePath)
186
+ continue;
187
+ if (exports.some((exp) => otherContent.includes(exp))) {
188
+ referenced = true;
189
+ break;
190
+ }
191
+ }
192
+ if (!referenced) {
193
+ issues.push({
194
+ file: filePath,
195
+ line: 1,
196
+ kind: "potentially-dead-file",
197
+ message: `File exports [${exports.slice(0, 3).join(", ")}${exports.length > 3 ? "..." : ""}] but none appear imported elsewhere`,
198
+ severity: "low",
199
+ });
200
+ }
201
+ }
202
+ return issues.sort((a, b) => {
203
+ const sev = { high: 3, medium: 2, low: 1 };
204
+ return sev[b.severity] - sev[a.severity];
205
+ });
206
+ }
207
+ // ─── CLI ────────────────────────────────────────────────────────────────────
208
+ export function runRefactorSafety(argv) {
209
+ if (argv.includes("--help") || argv.includes("-h")) {
210
+ console.log(`
211
+ judges refactor-safety — Analyze refactoring safety
212
+
213
+ Usage:
214
+ judges refactor-safety [dir]
215
+ judges refactor-safety src/ --severity high
216
+ judges refactor-safety --format json
217
+
218
+ Options:
219
+ [dir] Directory to scan (default: .)
220
+ --severity <level> Filter by minimum severity (high|medium|low)
221
+ --format json JSON output
222
+ --help, -h Show this help
223
+
224
+ Detects:
225
+ • Orphaned imports (importing symbols that don't exist)
226
+ • Deprecated symbols still in use
227
+ • Incomplete refactor markers (TODO/FIXME with refactor keywords)
228
+ • Excessive type assertions masking type changes
229
+ • Potentially dead files (exported but never imported)
230
+ `);
231
+ return;
232
+ }
233
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
234
+ const severityFilter = argv.find((_a, i) => argv[i - 1] === "--severity") || "low";
235
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
236
+ if (!existsSync(dir)) {
237
+ console.error(` Directory not found: ${dir}`);
238
+ return;
239
+ }
240
+ const severityOrder = { high: 3, medium: 2, low: 1 };
241
+ const minSev = severityOrder[severityFilter] || 1;
242
+ const files = collectFiles(dir);
243
+ const allIssues = analyzeRefactorSafety(files, dir).filter((x) => severityOrder[x.severity] >= minSev);
244
+ if (format === "json") {
245
+ console.log(JSON.stringify({ issues: allIssues, filesScanned: files.length, timestamp: new Date().toISOString() }, null, 2));
246
+ }
247
+ else {
248
+ console.log(`\n Refactor Safety — ${files.length} files scanned, ${allIssues.length} issue(s)\n ──────────────────────────`);
249
+ if (allIssues.length === 0) {
250
+ console.log(" ✅ No refactoring safety issues detected");
251
+ }
252
+ else {
253
+ const byKind = new Map();
254
+ for (const issue of allIssues) {
255
+ byKind.set(issue.kind, (byKind.get(issue.kind) || 0) + 1);
256
+ }
257
+ console.log("\n Summary:");
258
+ for (const [kind, count] of byKind) {
259
+ console.log(` ${kind}: ${count}`);
260
+ }
261
+ console.log("\n Details:");
262
+ for (const issue of allIssues.slice(0, 50)) {
263
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "⚪";
264
+ console.log(` ${icon} [${issue.severity}] ${issue.file}:${issue.line}`);
265
+ console.log(` ${issue.message}`);
266
+ }
267
+ if (allIssues.length > 50) {
268
+ console.log(`\n ... and ${allIssues.length - 50} more`);
269
+ }
270
+ }
271
+ console.log("");
272
+ }
273
+ }
274
+ //# sourceMappingURL=refactor-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor-safety.js","sourceRoot":"","sources":["../../src/commands/refactor-safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Resource cleanup — validate that allocated resources are properly
3
+ * freed: file handles, DB connections, timers, event listeners,
4
+ * streams with try-finally or equivalent cleanup mechanisms.
5
+ */
6
+ export declare function runResourceCleanup(argv: string[]): void;
7
+ //# sourceMappingURL=resource-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-cleanup.d.ts","sourceRoot":"","sources":["../../src/commands/resource-cleanup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+LH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8EvD"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Resource cleanup — validate that allocated resources are properly
3
+ * freed: file handles, DB connections, timers, event listeners,
4
+ * streams with try-finally or equivalent cleanup mechanisms.
5
+ */
6
+ import { readFileSync, readdirSync, statSync } from "fs";
7
+ import { join, extname } from "path";
8
+ // ─── File Collection ────────────────────────────────────────────────────────
9
+ const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py", ".java", ".cs", ".go"]);
10
+ function collectFiles(dir, max = 500) {
11
+ const files = [];
12
+ function walk(d) {
13
+ if (files.length >= max)
14
+ return;
15
+ let entries;
16
+ try {
17
+ entries = readdirSync(d);
18
+ }
19
+ catch {
20
+ return;
21
+ }
22
+ for (const e of entries) {
23
+ if (files.length >= max)
24
+ return;
25
+ if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
26
+ continue;
27
+ const full = join(d, e);
28
+ try {
29
+ if (statSync(full).isDirectory())
30
+ walk(full);
31
+ else if (CODE_EXTS.has(extname(full)))
32
+ files.push(full);
33
+ }
34
+ catch {
35
+ /* skip */
36
+ }
37
+ }
38
+ }
39
+ walk(dir);
40
+ return files;
41
+ }
42
+ const RESOURCE_PATTERNS = [
43
+ {
44
+ name: "file-handle",
45
+ openRegex: /\b(openSync|createReadStream|createWriteStream|fs\.open)\s*\(/,
46
+ closeRegex: /\b(closeSync|\.close\(|\.destroy\(|\.end\()/,
47
+ guardRegex: /\b(finally|using|dispose|\.close\(|\.destroy\()/,
48
+ severity: "high",
49
+ },
50
+ {
51
+ name: "db-connection",
52
+ openRegex: /\b(createConnection|createPool|\.connect\(|new\s+Client\(|getConnection\()/,
53
+ closeRegex: /\b(\.end\(|\.close\(|\.release\(|\.disconnect\(|\.destroy\()/,
54
+ guardRegex: /\b(finally|\.release\(|\.end\(|pool\.end|disconnect)/,
55
+ severity: "high",
56
+ },
57
+ {
58
+ name: "timer",
59
+ openRegex: /\b(setInterval|setTimeout)\s*\(/,
60
+ closeRegex: /\b(clearInterval|clearTimeout)\s*\(/,
61
+ guardRegex: /\b(clearInterval|clearTimeout|finally)/,
62
+ severity: "medium",
63
+ },
64
+ {
65
+ name: "event-listener",
66
+ openRegex: /\b(addEventListener|\.on\(|\.addListener\()/,
67
+ closeRegex: /\b(removeEventListener|\.off\(|\.removeListener\(|\.removeAllListeners\()/,
68
+ guardRegex: /\b(removeEventListener|\.off\(|\.removeListener\(|dispose|finally)/,
69
+ severity: "medium",
70
+ },
71
+ {
72
+ name: "stream",
73
+ openRegex: /\b(createReadStream|createWriteStream|new\s+Readable|new\s+Writable|pipeline\()/,
74
+ closeRegex: /\b(\.end\(|\.destroy\(|\.close\(|pipeline\()/,
75
+ guardRegex: /\b(finally|\.destroy\(|\.end\(|pipeline|using)/,
76
+ severity: "high",
77
+ },
78
+ {
79
+ name: "child-process",
80
+ openRegex: /\b(spawn|exec|execFile|fork)\s*\(/,
81
+ closeRegex: /\b(\.kill\(|\.disconnect\()/,
82
+ guardRegex: /\b(\.kill\(|finally|\.on\(\s*['"]exit)/,
83
+ severity: "medium",
84
+ },
85
+ ];
86
+ // ─── Analysis ───────────────────────────────────────────────────────────────
87
+ function analyzeFile(filePath) {
88
+ let content;
89
+ try {
90
+ content = readFileSync(filePath, "utf-8");
91
+ }
92
+ catch {
93
+ return [];
94
+ }
95
+ const lines = content.split("\n");
96
+ const issues = [];
97
+ for (const pattern of RESOURCE_PATTERNS) {
98
+ // Find all opens
99
+ for (let i = 0; i < lines.length; i++) {
100
+ if (pattern.openRegex.test(lines[i])) {
101
+ // Check if a corresponding close or guard exists in the surrounding function
102
+ const functionBlock = extractFunctionBlock(lines, i);
103
+ const hasClose = pattern.closeRegex.test(functionBlock);
104
+ const hasGuard = pattern.guardRegex.test(functionBlock);
105
+ if (!hasClose) {
106
+ issues.push({
107
+ file: filePath,
108
+ line: i + 1,
109
+ kind: `${pattern.name}-no-close`,
110
+ resource: pattern.name,
111
+ message: `${pattern.name} opened but no corresponding close/cleanup found in surrounding scope`,
112
+ severity: pattern.severity,
113
+ });
114
+ }
115
+ else if (!hasGuard) {
116
+ issues.push({
117
+ file: filePath,
118
+ line: i + 1,
119
+ kind: `${pattern.name}-no-guard`,
120
+ resource: pattern.name,
121
+ message: `${pattern.name} is closed but not in a finally/dispose block — may leak on exception`,
122
+ severity: "low",
123
+ });
124
+ }
125
+ }
126
+ }
127
+ }
128
+ // Detect try blocks without finally when resources are opened inside
129
+ const tryRegex = /\btry\s*\{/g;
130
+ let match;
131
+ while ((match = tryRegex.exec(content)) !== null) {
132
+ const pos = match.index;
133
+ const lineNum = content.substring(0, pos).split("\n").length;
134
+ const remaining = content.substring(pos);
135
+ // Check if this try block has a finally
136
+ const hasFinally = /\bfinally\s*\{/.test(remaining.substring(0, 500));
137
+ if (!hasFinally) {
138
+ // Check if resource operations exist inside the try
139
+ const tryBlock = remaining.substring(0, 500);
140
+ const hasResourceOp = RESOURCE_PATTERNS.some((p) => p.openRegex.test(tryBlock));
141
+ if (hasResourceOp) {
142
+ issues.push({
143
+ file: filePath,
144
+ line: lineNum,
145
+ kind: "try-without-finally",
146
+ resource: "mixed",
147
+ message: "try block contains resource operations but no finally block for cleanup",
148
+ severity: "medium",
149
+ });
150
+ }
151
+ }
152
+ }
153
+ return issues;
154
+ }
155
+ function extractFunctionBlock(lines, startLine) {
156
+ // Walk backwards to find function/method boundary, then forward to end
157
+ let start = Math.max(0, startLine - 30);
158
+ const end = Math.min(lines.length, startLine + 50);
159
+ for (let i = startLine; i >= Math.max(0, startLine - 30); i--) {
160
+ if (/\b(function|async\s+function|=>\s*\{|class\s|constructor|ngOnInit|componentDidMount)/.test(lines[i])) {
161
+ start = i;
162
+ break;
163
+ }
164
+ }
165
+ return lines.slice(start, end).join("\n");
166
+ }
167
+ // ─── CLI ────────────────────────────────────────────────────────────────────
168
+ export function runResourceCleanup(argv) {
169
+ if (argv.includes("--help") || argv.includes("-h")) {
170
+ console.log(`
171
+ judges resource-cleanup — Validate resource cleanup patterns
172
+
173
+ Usage:
174
+ judges resource-cleanup [dir]
175
+ judges resource-cleanup src/ --severity high
176
+ judges resource-cleanup --format json
177
+
178
+ Options:
179
+ [dir] Directory to scan (default: .)
180
+ --severity <level> Filter by minimum severity (high|medium|low)
181
+ --format json JSON output
182
+ --help, -h Show this help
183
+
184
+ Resources checked:
185
+ • File handles (open/close)
186
+ • Database connections (connect/end)
187
+ • Timers (setInterval/clearInterval)
188
+ • Event listeners (on/off)
189
+ • Streams (createReadStream/destroy)
190
+ • Child processes (spawn/kill)
191
+ `);
192
+ return;
193
+ }
194
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
195
+ const severityFilter = argv.find((_a, i) => argv[i - 1] === "--severity") || "low";
196
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
197
+ const severityOrder = { high: 3, medium: 2, low: 1 };
198
+ const minSev = severityOrder[severityFilter] || 1;
199
+ const files = collectFiles(dir);
200
+ const allIssues = [];
201
+ for (const f of files) {
202
+ const issues = analyzeFile(f);
203
+ allIssues.push(...issues.filter((x) => severityOrder[x.severity] >= minSev));
204
+ }
205
+ allIssues.sort((a, b) => severityOrder[b.severity] - severityOrder[a.severity]);
206
+ if (format === "json") {
207
+ console.log(JSON.stringify({ issues: allIssues, filesScanned: files.length, timestamp: new Date().toISOString() }, null, 2));
208
+ }
209
+ else {
210
+ console.log(`\n Resource Cleanup — ${files.length} files scanned, ${allIssues.length} issue(s)\n ──────────────────────────`);
211
+ if (allIssues.length === 0) {
212
+ console.log(" ✅ No resource cleanup issues detected");
213
+ }
214
+ else {
215
+ const byResource = new Map();
216
+ for (const issue of allIssues) {
217
+ byResource.set(issue.resource, (byResource.get(issue.resource) || 0) + 1);
218
+ }
219
+ console.log("\n By resource type:");
220
+ for (const [res, count] of byResource) {
221
+ console.log(` ${res}: ${count} issue(s)`);
222
+ }
223
+ console.log("\n Details:");
224
+ for (const issue of allIssues.slice(0, 50)) {
225
+ const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "⚪";
226
+ console.log(` ${icon} [${issue.severity}] ${issue.file}:${issue.line}`);
227
+ console.log(` ${issue.message}`);
228
+ }
229
+ if (allIssues.length > 50) {
230
+ console.log(`\n ... and ${allIssues.length - 50} more issue(s)`);
231
+ }
232
+ }
233
+ console.log("");
234
+ }
235
+ }
236
+ //# sourceMappingURL=resource-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-cleanup.js","sourceRoot":"","sources":["../../src/commands/resource-cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Review replay — record, export, and replay a full evaluation run
3
+ * as a shareable step-by-step walkthrough.
4
+ *
5
+ * Captures file discovery, judge selection, finding detection, dedup,
6
+ * and calibration into a replayable JSON trace.
7
+ */
8
+ export declare function runReviewReplay(argv: string[]): void;
9
+ //# sourceMappingURL=review-replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-replay.d.ts","sourceRoot":"","sources":["../../src/commands/review-replay.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwLH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuHpD"}