@kevinrabun/judges 3.62.0 → 3.64.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 +14 -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/auto-approve.d.ts +5 -0
  6. package/dist/commands/auto-approve.d.ts.map +1 -0
  7. package/dist/commands/auto-approve.js +189 -0
  8. package/dist/commands/auto-approve.js.map +1 -0
  9. package/dist/commands/diff-explain.d.ts +5 -0
  10. package/dist/commands/diff-explain.d.ts.map +1 -0
  11. package/dist/commands/diff-explain.js +143 -0
  12. package/dist/commands/diff-explain.js.map +1 -0
  13. package/dist/commands/finding-group.d.ts +16 -0
  14. package/dist/commands/finding-group.d.ts.map +1 -0
  15. package/dist/commands/finding-group.js +165 -0
  16. package/dist/commands/finding-group.js.map +1 -0
  17. package/dist/commands/fix-suggest.d.ts +5 -0
  18. package/dist/commands/fix-suggest.d.ts.map +1 -0
  19. package/dist/commands/fix-suggest.js +172 -0
  20. package/dist/commands/fix-suggest.js.map +1 -0
  21. package/dist/commands/ignore-list.d.ts +19 -0
  22. package/dist/commands/ignore-list.d.ts.map +1 -0
  23. package/dist/commands/ignore-list.js +166 -0
  24. package/dist/commands/ignore-list.js.map +1 -0
  25. package/dist/commands/incremental-review.d.ts +5 -0
  26. package/dist/commands/incremental-review.d.ts.map +1 -0
  27. package/dist/commands/incremental-review.js +240 -0
  28. package/dist/commands/incremental-review.js.map +1 -0
  29. package/dist/commands/multi-lang-review.d.ts +5 -0
  30. package/dist/commands/multi-lang-review.d.ts.map +1 -0
  31. package/dist/commands/multi-lang-review.js +231 -0
  32. package/dist/commands/multi-lang-review.js.map +1 -0
  33. package/dist/commands/review-cache.d.ts +23 -0
  34. package/dist/commands/review-cache.d.ts.map +1 -0
  35. package/dist/commands/review-cache.js +135 -0
  36. package/dist/commands/review-cache.js.map +1 -0
  37. package/dist/commands/review-log.d.ts +23 -0
  38. package/dist/commands/review-log.d.ts.map +1 -0
  39. package/dist/commands/review-log.js +165 -0
  40. package/dist/commands/review-log.js.map +1 -0
  41. package/dist/commands/review-priority.d.ts +5 -0
  42. package/dist/commands/review-priority.d.ts.map +1 -0
  43. package/dist/commands/review-priority.js +158 -0
  44. package/dist/commands/review-priority.js.map +1 -0
  45. package/dist/commands/review-profile.d.ts +5 -0
  46. package/dist/commands/review-profile.d.ts.map +1 -0
  47. package/dist/commands/review-profile.js +169 -0
  48. package/dist/commands/review-profile.js.map +1 -0
  49. package/dist/commands/review-stats.d.ts +5 -0
  50. package/dist/commands/review-stats.d.ts.map +1 -0
  51. package/dist/commands/review-stats.js +176 -0
  52. package/dist/commands/review-stats.js.map +1 -0
  53. package/dist/commands/review-summary.d.ts +5 -0
  54. package/dist/commands/review-summary.d.ts.map +1 -0
  55. package/dist/commands/review-summary.js +175 -0
  56. package/dist/commands/review-summary.js.map +1 -0
  57. package/dist/commands/review-template.d.ts +5 -0
  58. package/dist/commands/review-template.d.ts.map +1 -0
  59. package/dist/commands/review-template.js +213 -0
  60. package/dist/commands/review-template.js.map +1 -0
  61. package/dist/commands/rule-test.d.ts +5 -0
  62. package/dist/commands/rule-test.d.ts.map +1 -0
  63. package/dist/commands/rule-test.js +216 -0
  64. package/dist/commands/rule-test.js.map +1 -0
  65. package/dist/commands/team-config.d.ts +5 -0
  66. package/dist/commands/team-config.d.ts.map +1 -0
  67. package/dist/commands/team-config.js +235 -0
  68. package/dist/commands/team-config.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Multi-lang-review — Cross-language consistency checking.
3
+ */
4
+ import { readFileSync, existsSync, readdirSync, statSync } from "fs";
5
+ import { join, extname } from "path";
6
+ // ─── Language detection ─────────────────────────────────────────────────────
7
+ const EXT_MAP = {
8
+ ".ts": "typescript",
9
+ ".tsx": "typescript",
10
+ ".js": "javascript",
11
+ ".jsx": "javascript",
12
+ ".py": "python",
13
+ ".go": "go",
14
+ ".rs": "rust",
15
+ ".java": "java",
16
+ ".cs": "csharp",
17
+ ".cpp": "cpp",
18
+ ".c": "c",
19
+ ".rb": "ruby",
20
+ ".php": "php",
21
+ ".swift": "swift",
22
+ ".kt": "kotlin",
23
+ ".scala": "scala",
24
+ };
25
+ // ─── File collection ────────────────────────────────────────────────────────
26
+ const SKIP_DIRS = new Set([
27
+ "node_modules",
28
+ "dist",
29
+ "build",
30
+ ".git",
31
+ "__pycache__",
32
+ "vendor",
33
+ "target",
34
+ ".next",
35
+ "coverage",
36
+ ]);
37
+ function collectSourceFiles(dir, maxDepth = 5, depth = 0) {
38
+ if (depth > maxDepth || !existsSync(dir))
39
+ return [];
40
+ const results = [];
41
+ const entries = readdirSync(dir);
42
+ for (const entry of entries) {
43
+ if (entry.startsWith("."))
44
+ continue;
45
+ const fullPath = join(dir, entry);
46
+ try {
47
+ const st = statSync(fullPath);
48
+ if (st.isDirectory()) {
49
+ if (!SKIP_DIRS.has(entry)) {
50
+ results.push(...collectSourceFiles(fullPath, maxDepth, depth + 1));
51
+ }
52
+ }
53
+ else {
54
+ const ext = extname(entry).toLowerCase();
55
+ const lang = EXT_MAP[ext];
56
+ if (lang) {
57
+ const content = readFileSync(fullPath, "utf-8");
58
+ results.push({ path: fullPath, language: lang, lineCount: content.split("\n").length });
59
+ }
60
+ }
61
+ }
62
+ catch {
63
+ // Skip inaccessible
64
+ }
65
+ }
66
+ return results;
67
+ }
68
+ // ─── Cross-language analysis ────────────────────────────────────────────────
69
+ function analyzeConsistency(files) {
70
+ const issues = [];
71
+ const langGroups = new Map();
72
+ for (const f of files) {
73
+ const existing = langGroups.get(f.language) || [];
74
+ existing.push(f);
75
+ langGroups.set(f.language, existing);
76
+ }
77
+ const languages = [...langGroups.keys()];
78
+ // Check for mixed JS/TS (common issue)
79
+ if (langGroups.has("javascript") && langGroups.has("typescript")) {
80
+ const jsFiles = langGroups.get("javascript") || [];
81
+ const tsFiles = langGroups.get("typescript") || [];
82
+ if (jsFiles.length > 0 && tsFiles.length > 0) {
83
+ issues.push({
84
+ type: "mixed-js-ts",
85
+ severity: "medium",
86
+ description: `Project mixes JavaScript (${jsFiles.length} files) and TypeScript (${tsFiles.length} files)`,
87
+ files: [...jsFiles.slice(0, 3).map((f) => f.path), ...tsFiles.slice(0, 3).map((f) => f.path)],
88
+ recommendation: "Consider migrating all JavaScript files to TypeScript for consistent type safety",
89
+ });
90
+ }
91
+ }
92
+ // Check for API contract consistency (frontend + backend languages)
93
+ const frontendLangs = new Set(["javascript", "typescript"]);
94
+ const backendLangs = new Set(["python", "go", "java", "csharp", "ruby", "php", "rust"]);
95
+ const hasFrontend = languages.some((l) => frontendLangs.has(l));
96
+ const hasBackend = languages.some((l) => backendLangs.has(l));
97
+ if (hasFrontend && hasBackend) {
98
+ issues.push({
99
+ type: "api-contract-risk",
100
+ severity: "high",
101
+ description: "Multi-tier project detected. Frontend and backend languages present — API contract mismatches are common",
102
+ files: [],
103
+ recommendation: "Use OpenAPI/Swagger specs or shared schema definitions to maintain API consistency across tiers",
104
+ });
105
+ }
106
+ // Check for multiple backend languages
107
+ const backendFound = languages.filter((l) => backendLangs.has(l));
108
+ if (backendFound.length > 1) {
109
+ issues.push({
110
+ type: "polyglot-backend",
111
+ severity: "low",
112
+ description: `Multiple backend languages detected: ${backendFound.join(", ")}. This increases operational complexity`,
113
+ files: [],
114
+ recommendation: "Ensure each language has consistent error handling, logging, and security patterns",
115
+ });
116
+ }
117
+ // Pattern: look for common security patterns across languages
118
+ for (const [lang, langFiles] of langGroups) {
119
+ let hasEnvAccess = false;
120
+ let hasHardcodedStrings = false;
121
+ for (const lf of langFiles.slice(0, 50)) {
122
+ try {
123
+ const content = readFileSync(lf.path, "utf-8");
124
+ if (/process\.env|os\.environ|os\.Getenv|System\.getenv|ENV\[/i.test(content)) {
125
+ hasEnvAccess = true;
126
+ }
127
+ if (/["'](sk-|api[_-]?key|password|secret)[a-z0-9]{8,}/i.test(content)) {
128
+ hasHardcodedStrings = true;
129
+ }
130
+ }
131
+ catch {
132
+ // skip
133
+ }
134
+ }
135
+ if (hasHardcodedStrings) {
136
+ issues.push({
137
+ type: "hardcoded-secrets",
138
+ severity: "critical",
139
+ description: `Potential hardcoded secrets detected in ${lang} files`,
140
+ files: langFiles.slice(0, 3).map((f) => f.path),
141
+ recommendation: "Use environment variables or a secrets manager consistently across all languages",
142
+ });
143
+ }
144
+ if (!hasEnvAccess && langFiles.length > 5) {
145
+ issues.push({
146
+ type: "no-env-config",
147
+ severity: "low",
148
+ description: `No environment variable usage detected in ${lang} files — configuration may be hardcoded`,
149
+ files: [],
150
+ recommendation: "Use environment variables for configuration to support different deployment environments",
151
+ });
152
+ }
153
+ }
154
+ return issues;
155
+ }
156
+ // ─── CLI ────────────────────────────────────────────────────────────────────
157
+ export function runMultiLangReview(argv) {
158
+ if (argv.includes("--help") || argv.includes("-h")) {
159
+ console.log(`
160
+ judges multi-lang-review — Cross-language consistency checking
161
+
162
+ Usage:
163
+ judges multi-lang-review Analyze current directory
164
+ judges multi-lang-review --dir ./my-project Analyze specific directory
165
+ judges multi-lang-review --format json JSON output
166
+
167
+ Options:
168
+ --dir <path> Directory to analyze (default: current directory)
169
+ --depth <n> Max directory depth to scan (default: 5)
170
+ --format json JSON output
171
+ --help, -h Show this help
172
+
173
+ Detects cross-language issues: mixed JS/TS, API contract risks,
174
+ polyglot backend complexity, and inconsistent security patterns.
175
+ `);
176
+ return;
177
+ }
178
+ const dir = argv.find((_a, i) => argv[i - 1] === "--dir") || ".";
179
+ const depthStr = argv.find((_a, i) => argv[i - 1] === "--depth");
180
+ const maxDepth = depthStr ? parseInt(depthStr, 10) : 5;
181
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
182
+ const files = collectSourceFiles(dir, maxDepth);
183
+ if (files.length === 0) {
184
+ console.log("No source files found.");
185
+ return;
186
+ }
187
+ // Build language stats
188
+ const langStats = new Map();
189
+ for (const f of files) {
190
+ const existing = langStats.get(f.language) || { files: 0, lines: 0 };
191
+ existing.files++;
192
+ existing.lines += f.lineCount;
193
+ langStats.set(f.language, existing);
194
+ }
195
+ const projectLanguages = [...langStats.entries()]
196
+ .map(([language, stats]) => ({ language, ...stats }))
197
+ .sort((a, b) => b.lines - a.lines);
198
+ const issues = analyzeConsistency(files);
199
+ const report = {
200
+ projectLanguages,
201
+ totalFiles: files.length,
202
+ totalLanguages: projectLanguages.length,
203
+ issues,
204
+ };
205
+ if (format === "json") {
206
+ console.log(JSON.stringify(report, null, 2));
207
+ return;
208
+ }
209
+ console.log(`\n Multi-Language Review\n ─────────────────────────────`);
210
+ console.log(` Languages: ${report.totalLanguages}`);
211
+ console.log(` Files: ${report.totalFiles}\n`);
212
+ for (const lang of projectLanguages) {
213
+ const bar = "█".repeat(Math.min(30, Math.ceil((lang.files / files.length) * 30)));
214
+ console.log(` ${lang.language.padEnd(15)} ${String(lang.files).padStart(5)} files ${String(lang.lines).padStart(8)} lines ${bar}`);
215
+ }
216
+ if (issues.length > 0) {
217
+ console.log(`\n Cross-Language Issues (${issues.length}):`);
218
+ for (const issue of issues) {
219
+ const sevIcon = { critical: "🔴", high: "🟠", medium: "🟡", low: "🔵" };
220
+ const icon = sevIcon[issue.severity] || "⬜";
221
+ console.log(`\n ${icon} [${issue.severity}] ${issue.type}`);
222
+ console.log(` ${issue.description}`);
223
+ console.log(` Fix: ${issue.recommendation}`);
224
+ }
225
+ }
226
+ else {
227
+ console.log(`\n ✅ No cross-language issues detected.`);
228
+ }
229
+ console.log();
230
+ }
231
+ //# sourceMappingURL=multi-lang-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-lang-review.js","sourceRoot":"","sources":["../../src/commands/multi-lang-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Review-cache — Cache review results to avoid re-analyzing unchanged files.
3
+ */
4
+ interface CachedResult {
5
+ fileHash: string;
6
+ timestamp: string;
7
+ findingCount: number;
8
+ findings: {
9
+ pattern: string;
10
+ severity: string;
11
+ line: number;
12
+ }[];
13
+ }
14
+ declare function hashFile(content: string): string;
15
+ declare function getCached(filePath: string, content: string): CachedResult | null;
16
+ declare function setCached(filePath: string, content: string, findings: {
17
+ pattern: string;
18
+ severity: string;
19
+ line: number;
20
+ }[]): void;
21
+ export declare function runReviewCache(argv: string[]): void;
22
+ export { getCached, setCached, hashFile };
23
+ //# sourceMappingURL=review-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-cache.d.ts","sourceRoot":"","sources":["../../src/commands/review-cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjE;AAiBD,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzC;AAMD,iBAAS,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAezE;AAED,iBAAS,SAAS,CAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAC9D,IAAI,CAaN;AA2CD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgDnD;AAGD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Review-cache — Cache review results to avoid re-analyzing unchanged files.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, unlinkSync } from "fs";
5
+ import { join } from "path";
6
+ import { createHash } from "crypto";
7
+ // ─── Cache operations ──────────────────────────────────────────────────────
8
+ function getCacheDir() {
9
+ return join(".", ".judges", "review-cache");
10
+ }
11
+ function hashFile(content) {
12
+ return createHash("sha256").update(content).digest("hex").slice(0, 16);
13
+ }
14
+ function cacheKey(filePath) {
15
+ return createHash("sha256").update(filePath).digest("hex").slice(0, 16);
16
+ }
17
+ function getCached(filePath, content) {
18
+ const dir = getCacheDir();
19
+ const key = cacheKey(filePath);
20
+ const cachePath = join(dir, `${key}.json`);
21
+ if (!existsSync(cachePath))
22
+ return null;
23
+ try {
24
+ const cached = JSON.parse(readFileSync(cachePath, "utf-8"));
25
+ const currentHash = hashFile(content);
26
+ if (cached.fileHash === currentHash)
27
+ return cached;
28
+ return null; // File changed, cache invalid
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ function setCached(filePath, content, findings) {
35
+ const dir = getCacheDir();
36
+ if (!existsSync(dir))
37
+ mkdirSync(dir, { recursive: true });
38
+ const key = cacheKey(filePath);
39
+ const result = {
40
+ fileHash: hashFile(content),
41
+ timestamp: new Date().toISOString(),
42
+ findingCount: findings.length,
43
+ findings,
44
+ };
45
+ writeFileSync(join(dir, `${key}.json`), JSON.stringify(result), "utf-8");
46
+ }
47
+ function getCacheStats() {
48
+ const dir = getCacheDir();
49
+ if (!existsSync(dir))
50
+ return { entries: 0, hits: 0, misses: 0, sizeBytes: 0, oldestEntry: "", newestEntry: "" };
51
+ const files = readdirSync(dir).filter((f) => f.endsWith(".json"));
52
+ let totalSize = 0;
53
+ let oldest = "";
54
+ let newest = "";
55
+ for (const f of files) {
56
+ try {
57
+ const content = readFileSync(join(dir, f), "utf-8");
58
+ totalSize += content.length;
59
+ const parsed = JSON.parse(content);
60
+ if (!oldest || parsed.timestamp < oldest)
61
+ oldest = parsed.timestamp;
62
+ if (!newest || parsed.timestamp > newest)
63
+ newest = parsed.timestamp;
64
+ }
65
+ catch {
66
+ // skip
67
+ }
68
+ }
69
+ return { entries: files.length, hits: 0, misses: 0, sizeBytes: totalSize, oldestEntry: oldest, newestEntry: newest };
70
+ }
71
+ function clearCache() {
72
+ const dir = getCacheDir();
73
+ if (!existsSync(dir))
74
+ return 0;
75
+ const files = readdirSync(dir).filter((f) => f.endsWith(".json"));
76
+ for (const f of files) {
77
+ try {
78
+ unlinkSync(join(dir, f));
79
+ }
80
+ catch {
81
+ // skip
82
+ }
83
+ }
84
+ return files.length;
85
+ }
86
+ // ─── CLI ────────────────────────────────────────────────────────────────────
87
+ export function runReviewCache(argv) {
88
+ if (argv.includes("--help") || argv.includes("-h")) {
89
+ console.log(`
90
+ judges review-cache — Manage review result cache
91
+
92
+ Usage:
93
+ judges review-cache stats Show cache statistics
94
+ judges review-cache clear Clear all cached results
95
+ judges review-cache --format json JSON output
96
+
97
+ Subcommands:
98
+ stats Show cache statistics
99
+ clear Clear all cached results
100
+
101
+ Options:
102
+ --format json JSON output
103
+ --help, -h Show this help
104
+
105
+ Review results are cached in .judges/review-cache/ based on file content
106
+ hashes. When a file hasn't changed, cached results are reused for faster
107
+ subsequent reviews.
108
+ `);
109
+ return;
110
+ }
111
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
112
+ const subcommand = argv.find((a) => !a.startsWith("-") && a !== "review-cache") || "stats";
113
+ if (subcommand === "clear") {
114
+ const count = clearCache();
115
+ console.log(`Cleared ${count} cached review result(s).`);
116
+ return;
117
+ }
118
+ // Stats
119
+ const stats = getCacheStats();
120
+ if (format === "json") {
121
+ console.log(JSON.stringify(stats, null, 2));
122
+ return;
123
+ }
124
+ console.log(`\n Review Cache\n ─────────────────────────────`);
125
+ console.log(` Entries: ${stats.entries}`);
126
+ console.log(` Size: ${Math.round(stats.sizeBytes / 1024)} KB`);
127
+ if (stats.oldestEntry)
128
+ console.log(` Oldest: ${stats.oldestEntry.slice(0, 10)}`);
129
+ if (stats.newestEntry)
130
+ console.log(` Newest: ${stats.newestEntry.slice(0, 10)}`);
131
+ console.log();
132
+ }
133
+ // Export helpers for use by other commands
134
+ export { getCached, setCached, hashFile };
135
+ //# sourceMappingURL=review-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-cache.js","sourceRoot":"","sources":["../../src/commands/review-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Review-log — Structured audit log of all review actions for compliance.
3
+ */
4
+ interface ReviewLogEntry {
5
+ timestamp: string;
6
+ action: string;
7
+ command: string;
8
+ filesReviewed: number;
9
+ findingsCount: number;
10
+ severity: {
11
+ critical: number;
12
+ high: number;
13
+ medium: number;
14
+ low: number;
15
+ };
16
+ duration: number;
17
+ user: string;
18
+ commit: string;
19
+ }
20
+ declare function appendLog(entry: ReviewLogEntry): void;
21
+ export declare function runReviewLog(argv: string[]): void;
22
+ export { appendLog, ReviewLogEntry };
23
+ //# sourceMappingURL=review-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-log.d.ts","sourceRoot":"","sources":["../../src/commands/review-log.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAwBD,iBAAS,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAK9C;AA2DD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuGjD;AAGD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Review-log — Structured audit log of all review actions for compliance.
3
+ */
4
+ import { readFileSync, existsSync, mkdirSync, appendFileSync, readdirSync } from "fs";
5
+ import { join } from "path";
6
+ // ─── Helpers ────────────────────────────────────────────────────────────────
7
+ function getLogDir() {
8
+ return join(".", ".judges", "logs");
9
+ }
10
+ function getLogFile() {
11
+ const dir = getLogDir();
12
+ const date = new Date().toISOString().slice(0, 7); // YYYY-MM
13
+ return join(dir, `review-log-${date}.jsonl`);
14
+ }
15
+ function appendLog(entry) {
16
+ const dir = getLogDir();
17
+ if (!existsSync(dir))
18
+ mkdirSync(dir, { recursive: true });
19
+ const logFile = getLogFile();
20
+ appendFileSync(logFile, JSON.stringify(entry) + "\n", "utf-8");
21
+ }
22
+ function readAllLogs() {
23
+ const dir = getLogDir();
24
+ if (!existsSync(dir))
25
+ return [];
26
+ const entries = [];
27
+ const files = readdirSync(dir).filter((f) => f.endsWith(".jsonl")).sort();
28
+ for (const f of files) {
29
+ try {
30
+ const content = readFileSync(join(dir, f), "utf-8");
31
+ const lines = content.split("\n").filter((l) => l.trim());
32
+ for (const line of lines) {
33
+ try {
34
+ entries.push(JSON.parse(line));
35
+ }
36
+ catch {
37
+ // skip invalid lines
38
+ }
39
+ }
40
+ }
41
+ catch {
42
+ // skip unreadable files
43
+ }
44
+ }
45
+ return entries;
46
+ }
47
+ function summarizeLogs(entries) {
48
+ if (entries.length === 0) {
49
+ return {
50
+ totalEntries: 0,
51
+ recentEntries: [],
52
+ totalFilesReviewed: 0,
53
+ totalFindings: 0,
54
+ averageDuration: 0,
55
+ firstEntry: "",
56
+ lastEntry: "",
57
+ };
58
+ }
59
+ const sorted = [...entries].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
60
+ const totalFiles = entries.reduce((s, e) => s + e.filesReviewed, 0);
61
+ const totalFindings = entries.reduce((s, e) => s + e.findingsCount, 0);
62
+ const totalDuration = entries.reduce((s, e) => s + e.duration, 0);
63
+ return {
64
+ totalEntries: entries.length,
65
+ recentEntries: sorted.slice(-10),
66
+ totalFilesReviewed: totalFiles,
67
+ totalFindings,
68
+ averageDuration: Math.round(totalDuration / entries.length),
69
+ firstEntry: sorted[0].timestamp,
70
+ lastEntry: sorted[sorted.length - 1].timestamp,
71
+ };
72
+ }
73
+ // ─── CLI ────────────────────────────────────────────────────────────────────
74
+ export function runReviewLog(argv) {
75
+ if (argv.includes("--help") || argv.includes("-h")) {
76
+ console.log(`
77
+ judges review-log — Structured audit log of review actions
78
+
79
+ Usage:
80
+ judges review-log show Show log summary
81
+ judges review-log record --command eval --files 10 --findings 5
82
+ judges review-log export Export all logs as JSON
83
+ judges review-log --format json JSON output
84
+
85
+ Subcommands:
86
+ show Show log summary and recent entries
87
+ record Record a review action to the log
88
+ export Export complete log as JSON
89
+
90
+ Record Options:
91
+ --command <name> Command that was run
92
+ --files <n> Number of files reviewed
93
+ --findings <n> Number of findings
94
+ --critical <n> Critical findings count
95
+ --high <n> High findings count
96
+ --medium <n> Medium findings count
97
+ --low <n> Low findings count
98
+ --duration <ms> Duration in milliseconds
99
+ --commit <hash> Associated commit
100
+
101
+ Logs are stored locally in .judges/logs/ as monthly JSONL files.
102
+ `);
103
+ return;
104
+ }
105
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
106
+ const subcommand = argv.find((a) => !a.startsWith("-") && a !== "review-log") || "show";
107
+ if (subcommand === "record") {
108
+ const getNum = (flag) => {
109
+ const val = argv.find((_a, i) => argv[i - 1] === flag);
110
+ return val ? parseInt(val, 10) : 0;
111
+ };
112
+ const getStr = (flag) => {
113
+ return argv.find((_a, i) => argv[i - 1] === flag) || "";
114
+ };
115
+ const entry = {
116
+ timestamp: new Date().toISOString(),
117
+ action: "review",
118
+ command: getStr("--command") || "unknown",
119
+ filesReviewed: getNum("--files"),
120
+ findingsCount: getNum("--findings"),
121
+ severity: {
122
+ critical: getNum("--critical"),
123
+ high: getNum("--high"),
124
+ medium: getNum("--medium"),
125
+ low: getNum("--low"),
126
+ },
127
+ duration: getNum("--duration"),
128
+ user: process.env.USER || process.env.USERNAME || "unknown",
129
+ commit: getStr("--commit"),
130
+ };
131
+ appendLog(entry);
132
+ console.log(`Logged review action: ${entry.command} (${entry.findingsCount} findings, ${entry.filesReviewed} files).`);
133
+ return;
134
+ }
135
+ if (subcommand === "export") {
136
+ const entries = readAllLogs();
137
+ console.log(JSON.stringify(entries, null, 2));
138
+ return;
139
+ }
140
+ // Show
141
+ const entries = readAllLogs();
142
+ const summary = summarizeLogs(entries);
143
+ if (format === "json") {
144
+ console.log(JSON.stringify(summary, null, 2));
145
+ return;
146
+ }
147
+ console.log(`\n Review Log\n ─────────────────────────────`);
148
+ console.log(` Total entries: ${summary.totalEntries}`);
149
+ console.log(` Total files reviewed: ${summary.totalFilesReviewed}`);
150
+ console.log(` Total findings: ${summary.totalFindings}`);
151
+ console.log(` Average duration: ${summary.averageDuration}ms`);
152
+ if (summary.firstEntry) {
153
+ console.log(` Period: ${summary.firstEntry.slice(0, 10)} to ${summary.lastEntry.slice(0, 10)}`);
154
+ }
155
+ if (summary.recentEntries.length > 0) {
156
+ console.log("\n Recent entries:");
157
+ for (const e of summary.recentEntries) {
158
+ console.log(` ${e.timestamp.slice(0, 19)} ${e.command} — ${e.findingsCount} findings, ${e.filesReviewed} files, ${e.duration}ms`);
159
+ }
160
+ }
161
+ console.log();
162
+ }
163
+ // Export for use by other commands
164
+ export { appendLog };
165
+ //# sourceMappingURL=review-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-log.js","sourceRoot":"","sources":["../../src/commands/review-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-priority — Smart finding prioritization by context and impact.
3
+ */
4
+ export declare function runReviewPriority(argv: string[]): void;
5
+ //# sourceMappingURL=review-priority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-priority.d.ts","sourceRoot":"","sources":["../../src/commands/review-priority.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqFH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoGtD"}