@kevinrabun/judges 3.46.0 → 3.48.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/adoption-report.d.ts +8 -0
  6. package/dist/commands/adoption-report.d.ts.map +1 -0
  7. package/dist/commands/adoption-report.js +219 -0
  8. package/dist/commands/adoption-report.js.map +1 -0
  9. package/dist/commands/ai-model-trust.d.ts +17 -0
  10. package/dist/commands/ai-model-trust.d.ts.map +1 -0
  11. package/dist/commands/ai-model-trust.js +235 -0
  12. package/dist/commands/ai-model-trust.js.map +1 -0
  13. package/dist/commands/ai-prompt-audit.d.ts +23 -0
  14. package/dist/commands/ai-prompt-audit.d.ts.map +1 -0
  15. package/dist/commands/ai-prompt-audit.js +255 -0
  16. package/dist/commands/ai-prompt-audit.js.map +1 -0
  17. package/dist/commands/audit-trail.d.ts +18 -0
  18. package/dist/commands/audit-trail.d.ts.map +1 -0
  19. package/dist/commands/audit-trail.js +155 -0
  20. package/dist/commands/audit-trail.js.map +1 -0
  21. package/dist/commands/auto-fix.d.ts +18 -0
  22. package/dist/commands/auto-fix.d.ts.map +1 -0
  23. package/dist/commands/auto-fix.js +241 -0
  24. package/dist/commands/auto-fix.js.map +1 -0
  25. package/dist/commands/code-owner-suggest.d.ts +17 -0
  26. package/dist/commands/code-owner-suggest.d.ts.map +1 -0
  27. package/dist/commands/code-owner-suggest.js +215 -0
  28. package/dist/commands/code-owner-suggest.js.map +1 -0
  29. package/dist/commands/cost-forecast.d.ts +19 -0
  30. package/dist/commands/cost-forecast.d.ts.map +1 -0
  31. package/dist/commands/cost-forecast.js +194 -0
  32. package/dist/commands/cost-forecast.js.map +1 -0
  33. package/dist/commands/dep-correlate.d.ts +9 -0
  34. package/dist/commands/dep-correlate.d.ts.map +1 -0
  35. package/dist/commands/dep-correlate.js +208 -0
  36. package/dist/commands/dep-correlate.js.map +1 -0
  37. package/dist/commands/doc-gen.d.ts +8 -0
  38. package/dist/commands/doc-gen.d.ts.map +1 -0
  39. package/dist/commands/doc-gen.js +209 -0
  40. package/dist/commands/doc-gen.js.map +1 -0
  41. package/dist/commands/judge-author.d.ts +8 -0
  42. package/dist/commands/judge-author.d.ts.map +1 -0
  43. package/dist/commands/judge-author.js +261 -0
  44. package/dist/commands/judge-author.js.map +1 -0
  45. package/dist/commands/pattern-registry.d.ts +23 -0
  46. package/dist/commands/pattern-registry.d.ts.map +1 -0
  47. package/dist/commands/pattern-registry.js +227 -0
  48. package/dist/commands/pattern-registry.js.map +1 -0
  49. package/dist/commands/perf-hotspot.d.ts +8 -0
  50. package/dist/commands/perf-hotspot.d.ts.map +1 -0
  51. package/dist/commands/perf-hotspot.js +274 -0
  52. package/dist/commands/perf-hotspot.js.map +1 -0
  53. package/dist/commands/pr-quality-gate.d.ts +29 -0
  54. package/dist/commands/pr-quality-gate.d.ts.map +1 -0
  55. package/dist/commands/pr-quality-gate.js +208 -0
  56. package/dist/commands/pr-quality-gate.js.map +1 -0
  57. package/dist/commands/security-maturity.d.ts +8 -0
  58. package/dist/commands/security-maturity.d.ts.map +1 -0
  59. package/dist/commands/security-maturity.js +313 -0
  60. package/dist/commands/security-maturity.js.map +1 -0
  61. package/dist/commands/team-leaderboard.d.ts +25 -0
  62. package/dist/commands/team-leaderboard.d.ts.map +1 -0
  63. package/dist/commands/team-leaderboard.js +228 -0
  64. package/dist/commands/team-leaderboard.js.map +1 -0
  65. package/dist/commands/team-rules-sync.d.ts +8 -0
  66. package/dist/commands/team-rules-sync.d.ts.map +1 -0
  67. package/dist/commands/team-rules-sync.js +251 -0
  68. package/dist/commands/team-rules-sync.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,255 @@
1
+ /**
2
+ * AI prompt audit — scans AI-generated code for prompt injection
3
+ * risks: user input echoed into SQL, shell, config, etc.
4
+ *
5
+ * Pattern-based analysis only — no data stored externally.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
8
+ import { join } from "path";
9
+ const AUDIT_DIR = ".judges-prompt-audit";
10
+ const AUDIT_FILE = join(AUDIT_DIR, "audit-history.json");
11
+ const RISK_PATTERNS = [
12
+ {
13
+ id: "sql-template-literal",
14
+ regex: /`[^`]*\$\{[^}]*(?:user|input|param|query|req\.|request|body|args)[^}]*\}[^`]*(?:SELECT|INSERT|UPDATE|DELETE|FROM|WHERE)/i,
15
+ severity: "critical",
16
+ description: "Template literal with user input in SQL context",
17
+ recommendation: "Use parameterized queries ($1, $2) instead of string interpolation",
18
+ },
19
+ {
20
+ id: "sql-concat",
21
+ regex: /(?:query|sql|execute|prepare)\s*\([^)]*(?:\+|\bconcat)\s*[^)]*(?:user|input|param|req\.|request|body)/i,
22
+ severity: "critical",
23
+ description: "String concatenation with user input in SQL query",
24
+ recommendation: "Use parameterized queries with placeholder values",
25
+ },
26
+ {
27
+ id: "shell-injection",
28
+ regex: /(?:exec|spawn|execSync|execFile|system|popen)\s*\([^)]*(?:\$\{|[\s+].*(?:user|input|param|req\.|args))/i,
29
+ severity: "critical",
30
+ description: "User input in shell command execution",
31
+ recommendation: "Use execFile with argument array, or validate against an allowlist",
32
+ },
33
+ {
34
+ id: "eval-user-input",
35
+ regex: /(?:eval|Function|setTimeout|setInterval)\s*\([^)]*(?:user|input|param|req\.|request|body|query)/i,
36
+ severity: "critical",
37
+ description: "User input passed to eval or dynamic code execution",
38
+ recommendation: "Never use eval with user input; use safe parsers instead",
39
+ },
40
+ {
41
+ id: "innerHTML-assignment",
42
+ regex: /\.innerHTML\s*=\s*(?!['"`](?:''|""|``)).*(?:user|input|param|data|response|result)/i,
43
+ severity: "high",
44
+ description: "Dynamic content assigned to innerHTML without sanitization",
45
+ recommendation: "Use textContent for text or a sanitization library (DOMPurify) for HTML",
46
+ },
47
+ {
48
+ id: "hardcoded-secret",
49
+ regex: /(?:password|secret|api_key|apiKey|token|auth)\s*[:=]\s*['"][^'"]{8,}['"]/i,
50
+ severity: "high",
51
+ description: "Hardcoded credential or secret in source code",
52
+ recommendation: "Use environment variables or a secrets manager",
53
+ },
54
+ {
55
+ id: "url-user-input",
56
+ regex: /(?:fetch|axios|http\.get|request|got)\s*\([^)]*(?:\$\{|[\s+].*(?:user|input|param|req\.|url|host))/i,
57
+ severity: "high",
58
+ description: "User-controlled URL in HTTP request (SSRF risk)",
59
+ recommendation: "Validate URLs against an allowlist and block private IP ranges",
60
+ },
61
+ {
62
+ id: "path-traversal",
63
+ regex: /(?:readFile|readFileSync|createReadStream|writeFile|writeFileSync|unlink|rmdir)\s*\([^)]*(?:\$\{|[\s+].*(?:user|input|param|req\.|path|file|name))/i,
64
+ severity: "high",
65
+ description: "User input in file system operation (path traversal risk)",
66
+ recommendation: "Sanitize paths with path.resolve and validate within allowed directory",
67
+ },
68
+ {
69
+ id: "prompt-echo",
70
+ regex: /(?:\/\/|#)\s*(?:TODO|FIXME|HACK|generated|copilot|cursor|claude|gpt|ai)[:\s].*(?:user|implement|replace|change)/i,
71
+ severity: "medium",
72
+ description: "AI prompt remnant in code comment — may expose intent or instructions",
73
+ recommendation: "Remove AI generation comments and prompt artifacts before committing",
74
+ },
75
+ {
76
+ id: "cors-wildcard",
77
+ regex: /(?:Access-Control-Allow-Origin|cors|origin)\s*[:=]\s*['"`]\*['"`]/i,
78
+ severity: "medium",
79
+ description: "Wildcard CORS allows any origin to access the API",
80
+ recommendation: "Restrict CORS to specific trusted origins",
81
+ },
82
+ ];
83
+ // ─── Core ───────────────────────────────────────────────────────────────────
84
+ function ensureDir() {
85
+ if (!existsSync(AUDIT_DIR))
86
+ mkdirSync(AUDIT_DIR, { recursive: true });
87
+ }
88
+ function loadStore() {
89
+ if (!existsSync(AUDIT_FILE))
90
+ return { results: [], updatedAt: new Date().toISOString() };
91
+ try {
92
+ return JSON.parse(readFileSync(AUDIT_FILE, "utf-8"));
93
+ }
94
+ catch {
95
+ return { results: [], updatedAt: new Date().toISOString() };
96
+ }
97
+ }
98
+ function saveStore(store) {
99
+ ensureDir();
100
+ store.updatedAt = new Date().toISOString();
101
+ writeFileSync(AUDIT_FILE, JSON.stringify(store, null, 2));
102
+ }
103
+ export function auditFile(filePath) {
104
+ const content = readFileSync(filePath, "utf-8");
105
+ const lines = content.split("\n");
106
+ const risks = [];
107
+ for (let i = 0; i < lines.length; i++) {
108
+ const line = lines[i];
109
+ for (const pattern of RISK_PATTERNS) {
110
+ if (pattern.regex.test(line)) {
111
+ risks.push({
112
+ line: i + 1,
113
+ pattern: pattern.id,
114
+ severity: pattern.severity,
115
+ description: pattern.description,
116
+ recommendation: pattern.recommendation,
117
+ });
118
+ }
119
+ }
120
+ }
121
+ // Risk score: critical=30, high=15, medium=5
122
+ const riskScore = risks.reduce((sum, r) => {
123
+ if (r.severity === "critical")
124
+ return sum + 30;
125
+ if (r.severity === "high")
126
+ return sum + 15;
127
+ return sum + 5;
128
+ }, 0);
129
+ const result = {
130
+ file: filePath,
131
+ risks,
132
+ riskScore: Math.min(100, riskScore),
133
+ timestamp: new Date().toISOString(),
134
+ };
135
+ // Persist
136
+ const store = loadStore();
137
+ store.results.push(result);
138
+ if (store.results.length > 200)
139
+ store.results = store.results.slice(-200);
140
+ saveStore(store);
141
+ return result;
142
+ }
143
+ // ─── CLI ────────────────────────────────────────────────────────────────────
144
+ export function runAiPromptAudit(argv) {
145
+ if (argv.includes("--help") || argv.includes("-h")) {
146
+ console.log(`
147
+ judges ai-prompt-audit — Scan for prompt injection risks in AI-generated code
148
+
149
+ Usage:
150
+ judges ai-prompt-audit --file src/app.ts
151
+ judges ai-prompt-audit --patterns
152
+ judges ai-prompt-audit --history
153
+ judges ai-prompt-audit --summary
154
+
155
+ Options:
156
+ --file <path> Scan a file for prompt injection risks
157
+ --patterns Show all detection patterns
158
+ --history Show audit history
159
+ --summary Show risk summary across all audits
160
+ --format json JSON output
161
+ --help, -h Show this help
162
+ `);
163
+ return;
164
+ }
165
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
166
+ // Patterns
167
+ if (argv.includes("--patterns")) {
168
+ const patterns = RISK_PATTERNS.map(({ id, severity, description, recommendation }) => ({
169
+ id,
170
+ severity,
171
+ description,
172
+ recommendation,
173
+ }));
174
+ if (format === "json") {
175
+ console.log(JSON.stringify(patterns, null, 2));
176
+ }
177
+ else {
178
+ console.log(`\n Prompt Audit Patterns (${patterns.length})\n ──────────────────────────`);
179
+ for (const p of patterns) {
180
+ console.log(` [${p.severity.padEnd(8)}] ${p.id.padEnd(25)} ${p.description}`);
181
+ }
182
+ console.log("");
183
+ }
184
+ return;
185
+ }
186
+ // History
187
+ if (argv.includes("--history")) {
188
+ const store = loadStore();
189
+ if (format === "json") {
190
+ console.log(JSON.stringify(store, null, 2));
191
+ }
192
+ else {
193
+ console.log(`\n Audit History (${store.results.length} scans)\n ──────────────────────────`);
194
+ for (const r of store.results.slice(-15)) {
195
+ const icon = r.riskScore === 0 ? "✅" : r.riskScore >= 50 ? "🔴" : "⚠️";
196
+ console.log(` ${icon} ${r.timestamp.slice(0, 16)} risk:${r.riskScore.toString().padEnd(4)} ${r.risks.length} issues ${r.file}`);
197
+ }
198
+ console.log("");
199
+ }
200
+ return;
201
+ }
202
+ // Summary
203
+ if (argv.includes("--summary")) {
204
+ const store = loadStore();
205
+ const totalRisks = store.results.reduce((s, r) => s + r.risks.length, 0);
206
+ const critCount = store.results.reduce((s, r) => s + r.risks.filter((x) => x.severity === "critical").length, 0);
207
+ const highCount = store.results.reduce((s, r) => s + r.risks.filter((x) => x.severity === "high").length, 0);
208
+ const avgScore = store.results.length > 0
209
+ ? Math.round(store.results.reduce((s, r) => s + r.riskScore, 0) / store.results.length)
210
+ : 0;
211
+ if (format === "json") {
212
+ console.log(JSON.stringify({ totalScans: store.results.length, totalRisks, critCount, highCount, avgScore }, null, 2));
213
+ }
214
+ else {
215
+ console.log(`\n Prompt Audit Summary\n ──────────────────────────`);
216
+ console.log(` Scans: ${store.results.length}`);
217
+ console.log(` Risks: ${totalRisks} (${critCount} critical, ${highCount} high)`);
218
+ console.log(` Avg risk: ${avgScore}/100`);
219
+ console.log("");
220
+ }
221
+ return;
222
+ }
223
+ // Scan file
224
+ const filePath = argv.find((_a, i) => argv[i - 1] === "--file");
225
+ if (!filePath) {
226
+ console.error(" Use --file <path>, --patterns, --history, or --summary. --help for usage.");
227
+ return;
228
+ }
229
+ if (!existsSync(filePath)) {
230
+ console.error(` File not found: ${filePath}`);
231
+ return;
232
+ }
233
+ const result = auditFile(filePath);
234
+ if (format === "json") {
235
+ console.log(JSON.stringify(result, null, 2));
236
+ }
237
+ else {
238
+ const icon = result.riskScore === 0 ? "✅" : result.riskScore >= 50 ? "🔴" : "⚠️";
239
+ console.log(`\n ${icon} Prompt Audit — ${filePath}`);
240
+ console.log(` Risk score: ${result.riskScore}/100 | Issues: ${result.risks.length}`);
241
+ console.log(` ──────────────────────────`);
242
+ if (result.risks.length === 0) {
243
+ console.log(" No prompt injection risks detected.");
244
+ }
245
+ else {
246
+ for (const r of result.risks) {
247
+ console.log(` L${r.line.toString().padEnd(5)} [${r.severity.padEnd(8)}] ${r.pattern}`);
248
+ console.log(` ${r.description}`);
249
+ console.log(` Fix: ${r.recommendation}`);
250
+ }
251
+ }
252
+ console.log("");
253
+ }
254
+ }
255
+ //# sourceMappingURL=ai-prompt-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-prompt-audit.js","sourceRoot":"","sources":["../../src/commands/ai-prompt-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Audit trail — chain-of-custody tracking for findings,
3
+ * recording who reviewed, voted, suppressed, or resolved each finding.
4
+ *
5
+ * All data stored locally in .judges-audit-trail/.
6
+ */
7
+ interface AuditEvent {
8
+ id: string;
9
+ findingId: string;
10
+ action: "created" | "reviewed" | "suppressed" | "resolved" | "reopened" | "escalated" | "voted";
11
+ actor: string;
12
+ detail: string;
13
+ timestamp: string;
14
+ }
15
+ export declare function recordEvent(findingId: string, action: AuditEvent["action"], actor: string, detail: string): AuditEvent;
16
+ export declare function runAuditTrail(argv: string[]): void;
17
+ export {};
18
+ //# sourceMappingURL=audit-trail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-trail.d.ts","sourceRoot":"","sources":["../../src/commands/audit-trail.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;IAChG,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAmCD,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,UAAU,CAgBZ;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkHlD"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Audit trail — chain-of-custody tracking for findings,
3
+ * recording who reviewed, voted, suppressed, or resolved each finding.
4
+ *
5
+ * All data stored locally in .judges-audit-trail/.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
8
+ import { join } from "path";
9
+ const TRAIL_DIR = ".judges-audit-trail";
10
+ const TRAIL_FILE = join(TRAIL_DIR, "trail.json");
11
+ // ─── Core ───────────────────────────────────────────────────────────────────
12
+ function ensureDir() {
13
+ if (!existsSync(TRAIL_DIR))
14
+ mkdirSync(TRAIL_DIR, { recursive: true });
15
+ }
16
+ function loadStore() {
17
+ if (!existsSync(TRAIL_FILE))
18
+ return { events: [], updatedAt: new Date().toISOString() };
19
+ try {
20
+ return JSON.parse(readFileSync(TRAIL_FILE, "utf-8"));
21
+ }
22
+ catch {
23
+ return { events: [], updatedAt: new Date().toISOString() };
24
+ }
25
+ }
26
+ function saveStore(store) {
27
+ ensureDir();
28
+ store.updatedAt = new Date().toISOString();
29
+ writeFileSync(TRAIL_FILE, JSON.stringify(store, null, 2));
30
+ }
31
+ function generateId() {
32
+ return `evt-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
33
+ }
34
+ export function recordEvent(findingId, action, actor, detail) {
35
+ const event = {
36
+ id: generateId(),
37
+ findingId,
38
+ action,
39
+ actor,
40
+ detail,
41
+ timestamp: new Date().toISOString(),
42
+ };
43
+ const store = loadStore();
44
+ store.events.push(event);
45
+ if (store.events.length > 2000)
46
+ store.events = store.events.slice(-2000);
47
+ saveStore(store);
48
+ return event;
49
+ }
50
+ // ─── CLI ────────────────────────────────────────────────────────────────────
51
+ export function runAuditTrail(argv) {
52
+ if (argv.includes("--help") || argv.includes("-h")) {
53
+ console.log(`
54
+ judges audit-trail — Finding chain-of-custody tracking
55
+
56
+ Usage:
57
+ judges audit-trail --record --finding SEC-001 --action reviewed --actor "alice@co.com" --detail "Confirmed valid"
58
+ judges audit-trail --finding SEC-001
59
+ judges audit-trail --actor "alice@co.com"
60
+ judges audit-trail --summary
61
+ judges audit-trail --export
62
+
63
+ Options:
64
+ --record Record a new audit event
65
+ --finding <id> Filter by finding/rule ID
66
+ --action <type> Event type: created, reviewed, suppressed, resolved, reopened, escalated, voted
67
+ --actor <name> Who performed the action
68
+ --detail <text> Additional context
69
+ --summary Show audit trail summary
70
+ --export Export full audit trail
71
+ --format json JSON output
72
+ --help, -h Show this help
73
+ `);
74
+ return;
75
+ }
76
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
77
+ // Record event
78
+ if (argv.includes("--record")) {
79
+ const finding = argv.find((_a, i) => argv[i - 1] === "--finding") || "unknown";
80
+ const action = (argv.find((_a, i) => argv[i - 1] === "--action") ||
81
+ "reviewed");
82
+ const actor = argv.find((_a, i) => argv[i - 1] === "--actor") || "anonymous";
83
+ const detail = argv.find((_a, i) => argv[i - 1] === "--detail") || "";
84
+ const event = recordEvent(finding, action, actor, detail);
85
+ if (format === "json") {
86
+ console.log(JSON.stringify(event, null, 2));
87
+ }
88
+ else {
89
+ console.log(` ✅ Audit event recorded: ${event.id}`);
90
+ console.log(` ${event.action} ${event.findingId} by ${event.actor}`);
91
+ }
92
+ return;
93
+ }
94
+ // Summary
95
+ if (argv.includes("--summary")) {
96
+ const store = loadStore();
97
+ const actionCounts = new Map();
98
+ const actorCounts = new Map();
99
+ for (const e of store.events) {
100
+ actionCounts.set(e.action, (actionCounts.get(e.action) || 0) + 1);
101
+ actorCounts.set(e.actor, (actorCounts.get(e.actor) || 0) + 1);
102
+ }
103
+ if (format === "json") {
104
+ console.log(JSON.stringify({
105
+ totalEvents: store.events.length,
106
+ actions: Object.fromEntries(actionCounts),
107
+ actors: Object.fromEntries(actorCounts),
108
+ }, null, 2));
109
+ }
110
+ else {
111
+ console.log(`\n Audit Trail Summary\n ──────────────────────────`);
112
+ console.log(` Total events: ${store.events.length}`);
113
+ if (actionCounts.size > 0) {
114
+ console.log(`\n By action:`);
115
+ for (const [action, count] of actionCounts) {
116
+ console.log(` ${action.padEnd(15)} ${count}`);
117
+ }
118
+ }
119
+ if (actorCounts.size > 0) {
120
+ console.log(`\n By actor:`);
121
+ for (const [actor, count] of actorCounts) {
122
+ console.log(` ${actor.padEnd(25)} ${count} events`);
123
+ }
124
+ }
125
+ console.log("");
126
+ }
127
+ return;
128
+ }
129
+ // Export
130
+ if (argv.includes("--export")) {
131
+ const store = loadStore();
132
+ console.log(JSON.stringify(store, null, 2));
133
+ return;
134
+ }
135
+ // Filter by finding
136
+ const findingFilter = argv.find((_a, i) => argv[i - 1] === "--finding");
137
+ const actorFilter = argv.find((_a, i) => argv[i - 1] === "--actor");
138
+ const store = loadStore();
139
+ let events = store.events;
140
+ if (findingFilter)
141
+ events = events.filter((e) => e.findingId === findingFilter);
142
+ if (actorFilter)
143
+ events = events.filter((e) => e.actor === actorFilter);
144
+ if (format === "json") {
145
+ console.log(JSON.stringify(events, null, 2));
146
+ }
147
+ else {
148
+ console.log(`\n Audit Trail (${events.length} events)\n ──────────────────────────`);
149
+ for (const e of events.slice(-20)) {
150
+ console.log(` ${e.timestamp.slice(0, 16)} ${e.action.padEnd(12)} ${e.findingId.padEnd(12)} ${e.actor} ${e.detail ? `— ${e.detail}` : ""}`);
151
+ }
152
+ console.log("");
153
+ }
154
+ }
155
+ //# sourceMappingURL=audit-trail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-trail.js","sourceRoot":"","sources":["../../src/commands/audit-trail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Auto-fix — generates safe, automated fix suggestions for
3
+ * common finding patterns. All processing is local.
4
+ */
5
+ interface FixSuggestion {
6
+ ruleId: string;
7
+ title: string;
8
+ file: string;
9
+ line: number;
10
+ before: string;
11
+ after: string;
12
+ confidence: number;
13
+ timestamp: string;
14
+ }
15
+ export declare function suggestFix(ruleId: string, file: string, line: number): FixSuggestion | null;
16
+ export declare function runAutoFix(argv: string[]): void;
17
+ export {};
18
+ //# sourceMappingURL=auto-fix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fix.d.ts","sourceRoot":"","sources":["../../src/commands/auto-fix.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAqHD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAqB3F;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoH/C"}