@kevinrabun/judges 3.49.0 → 3.51.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/ai-gate.d.ts +8 -0
  6. package/dist/commands/ai-gate.d.ts.map +1 -0
  7. package/dist/commands/ai-gate.js +213 -0
  8. package/dist/commands/ai-gate.js.map +1 -0
  9. package/dist/commands/ai-output-compare.d.ts +9 -0
  10. package/dist/commands/ai-output-compare.d.ts.map +1 -0
  11. package/dist/commands/ai-output-compare.js +203 -0
  12. package/dist/commands/ai-output-compare.js.map +1 -0
  13. package/dist/commands/ai-pattern-trend.d.ts +9 -0
  14. package/dist/commands/ai-pattern-trend.d.ts.map +1 -0
  15. package/dist/commands/ai-pattern-trend.js +224 -0
  16. package/dist/commands/ai-pattern-trend.js.map +1 -0
  17. package/dist/commands/api-audit.d.ts +9 -0
  18. package/dist/commands/api-audit.d.ts.map +1 -0
  19. package/dist/commands/api-audit.js +360 -0
  20. package/dist/commands/api-audit.js.map +1 -0
  21. package/dist/commands/arch-audit.d.ts +9 -0
  22. package/dist/commands/arch-audit.d.ts.map +1 -0
  23. package/dist/commands/arch-audit.js +284 -0
  24. package/dist/commands/arch-audit.js.map +1 -0
  25. package/dist/commands/clarity-score.d.ts +9 -0
  26. package/dist/commands/clarity-score.d.ts.map +1 -0
  27. package/dist/commands/clarity-score.js +261 -0
  28. package/dist/commands/clarity-score.js.map +1 -0
  29. package/dist/commands/compliance-map.d.ts +9 -0
  30. package/dist/commands/compliance-map.d.ts.map +1 -0
  31. package/dist/commands/compliance-map.js +375 -0
  32. package/dist/commands/compliance-map.js.map +1 -0
  33. package/dist/commands/exec-report.d.ts +9 -0
  34. package/dist/commands/exec-report.d.ts.map +1 -0
  35. package/dist/commands/exec-report.js +272 -0
  36. package/dist/commands/exec-report.js.map +1 -0
  37. package/dist/commands/guided-tour.d.ts +9 -0
  38. package/dist/commands/guided-tour.d.ts.map +1 -0
  39. package/dist/commands/guided-tour.js +288 -0
  40. package/dist/commands/guided-tour.js.map +1 -0
  41. package/dist/commands/hallucination-score.d.ts +9 -0
  42. package/dist/commands/hallucination-score.d.ts.map +1 -0
  43. package/dist/commands/hallucination-score.js +317 -0
  44. package/dist/commands/hallucination-score.js.map +1 -0
  45. package/dist/commands/iac-lint.d.ts +8 -0
  46. package/dist/commands/iac-lint.d.ts.map +1 -0
  47. package/dist/commands/iac-lint.js +313 -0
  48. package/dist/commands/iac-lint.js.map +1 -0
  49. package/dist/commands/perf-compare.d.ts +9 -0
  50. package/dist/commands/perf-compare.d.ts.map +1 -0
  51. package/dist/commands/perf-compare.js +246 -0
  52. package/dist/commands/perf-compare.js.map +1 -0
  53. package/dist/commands/pii-scan.d.ts +8 -0
  54. package/dist/commands/pii-scan.d.ts.map +1 -0
  55. package/dist/commands/pii-scan.js +300 -0
  56. package/dist/commands/pii-scan.js.map +1 -0
  57. package/dist/commands/secret-scan.d.ts +8 -0
  58. package/dist/commands/secret-scan.d.ts.map +1 -0
  59. package/dist/commands/secret-scan.js +245 -0
  60. package/dist/commands/secret-scan.js.map +1 -0
  61. package/dist/commands/test-suggest.d.ts +9 -0
  62. package/dist/commands/test-suggest.d.ts.map +1 -0
  63. package/dist/commands/test-suggest.js +248 -0
  64. package/dist/commands/test-suggest.js.map +1 -0
  65. package/dist/commands/vendor-lock-detect.d.ts +8 -0
  66. package/dist/commands/vendor-lock-detect.d.ts.map +1 -0
  67. package/dist/commands/vendor-lock-detect.js +289 -0
  68. package/dist/commands/vendor-lock-detect.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Exec report — executive security dashboard.
3
+ * Generates non-technical HTML report with risk posture summary,
4
+ * recurring issue trends, severity distribution, and remediation guidance.
5
+ *
6
+ * All data local.
7
+ */
8
+ import { existsSync, readFileSync, mkdirSync, writeFileSync } from "fs";
9
+ import { join } from "path";
10
+ // ─── Data loading ───────────────────────────────────────────────────────────
11
+ function loadReportData(inputPath) {
12
+ const content = readFileSync(inputPath, "utf-8");
13
+ const data = JSON.parse(content);
14
+ // SARIF format
15
+ if (data.$schema?.includes("sarif") || data.runs) {
16
+ const findings = [];
17
+ for (const run of data.runs || []) {
18
+ for (const result of run.results || []) {
19
+ findings.push({
20
+ ruleId: result.ruleId || "unknown",
21
+ severity: result.level === "error" ? "high" : result.level === "warning" ? "medium" : "low",
22
+ title: result.message?.text || result.ruleId || "Unknown",
23
+ confidence: result.properties?.confidence,
24
+ });
25
+ }
26
+ }
27
+ return { findings };
28
+ }
29
+ // Judges tribunal output
30
+ if (data.findings) {
31
+ return {
32
+ findings: data.findings.map((f) => ({
33
+ ruleId: f.ruleId || "unknown",
34
+ severity: f.severity || "medium",
35
+ title: f.title || f.ruleId || "Unknown",
36
+ confidence: f.confidence,
37
+ })),
38
+ };
39
+ }
40
+ // Array
41
+ if (Array.isArray(data)) {
42
+ return {
43
+ findings: data.map((f) => ({
44
+ ruleId: f.ruleId || "unknown",
45
+ severity: f.severity || "medium",
46
+ title: f.title || "Unknown",
47
+ confidence: f.confidence,
48
+ })),
49
+ };
50
+ }
51
+ return { findings: [] };
52
+ }
53
+ // ─── Analysis ───────────────────────────────────────────────────────────────
54
+ function getSeverityBreakdown(findings) {
55
+ return {
56
+ critical: findings.filter((f) => f.severity === "critical").length,
57
+ high: findings.filter((f) => f.severity === "high").length,
58
+ medium: findings.filter((f) => f.severity === "medium").length,
59
+ low: findings.filter((f) => f.severity === "low").length,
60
+ total: findings.length,
61
+ };
62
+ }
63
+ function getTopRecurring(findings, limit = 10) {
64
+ const counts = {};
65
+ for (const f of findings) {
66
+ if (!counts[f.ruleId])
67
+ counts[f.ruleId] = { count: 0, severity: f.severity };
68
+ counts[f.ruleId].count++;
69
+ }
70
+ return Object.entries(counts)
71
+ .map(([ruleId, v]) => ({ ruleId, count: v.count, severity: v.severity }))
72
+ .sort((a, b) => b.count - a.count)
73
+ .slice(0, limit);
74
+ }
75
+ function getRiskScore(breakdown) {
76
+ const raw = breakdown.critical * 10 + breakdown.high * 5 + breakdown.medium * 2 + breakdown.low * 1;
77
+ const maxReasonable = 100;
78
+ const score = Math.min(100, Math.round((raw / Math.max(maxReasonable, raw)) * 100));
79
+ const inverted = 100 - score; // higher = better
80
+ if (inverted >= 80)
81
+ return { score: inverted, label: "Low Risk", color: "#22c55e" };
82
+ if (inverted >= 60)
83
+ return { score: inverted, label: "Moderate Risk", color: "#eab308" };
84
+ if (inverted >= 40)
85
+ return { score: inverted, label: "Elevated Risk", color: "#f97316" };
86
+ return { score: inverted, label: "High Risk", color: "#ef4444" };
87
+ }
88
+ // ─── HTML generation ────────────────────────────────────────────────────────
89
+ function generateHtml(data) {
90
+ const breakdown = getSeverityBreakdown(data.findings);
91
+ const topRecurring = getTopRecurring(data.findings);
92
+ const risk = getRiskScore(breakdown);
93
+ const ts = data.timestamp || new Date().toISOString();
94
+ const sevBarData = [
95
+ { label: "Critical", count: breakdown.critical, color: "#ef4444" },
96
+ { label: "High", count: breakdown.high, color: "#f97316" },
97
+ { label: "Medium", count: breakdown.medium, color: "#eab308" },
98
+ { label: "Low", count: breakdown.low, color: "#22c55e" },
99
+ ];
100
+ return `<!DOCTYPE html>
101
+ <html lang="en">
102
+ <head>
103
+ <meta charset="UTF-8">
104
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
105
+ <title>Security Executive Report — Judges</title>
106
+ <style>
107
+ * { margin: 0; padding: 0; box-sizing: border-box; }
108
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f8fafc; color: #1e293b; }
109
+ .container { max-width: 1000px; margin: 0 auto; padding: 2rem; }
110
+ .header { text-align: center; margin-bottom: 2rem; }
111
+ .header h1 { font-size: 1.8rem; color: #0f172a; }
112
+ .header .subtitle { color: #64748b; margin-top: 0.5rem; }
113
+ .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin: 1.5rem 0; }
114
+ .card { background: white; border-radius: 8px; padding: 1.5rem; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
115
+ .card h3 { font-size: 0.875rem; color: #64748b; text-transform: uppercase; letter-spacing: 0.05em; }
116
+ .card .value { font-size: 2rem; font-weight: 700; margin-top: 0.5rem; }
117
+ .risk-gauge { text-align: center; padding: 2rem; }
118
+ .risk-score { font-size: 3rem; font-weight: 800; }
119
+ .risk-label { font-size: 1.2rem; margin-top: 0.25rem; }
120
+ .bar-chart { margin: 1.5rem 0; }
121
+ .bar-row { display: flex; align-items: center; margin: 0.5rem 0; }
122
+ .bar-label { width: 80px; font-size: 0.875rem; color: #64748b; }
123
+ .bar { height: 28px; border-radius: 4px; display: flex; align-items: center; padding: 0 8px; color: white; font-weight: 600; font-size: 0.8rem; min-width: 30px; transition: width 0.3s; }
124
+ .table { width: 100%; border-collapse: collapse; margin-top: 1rem; }
125
+ .table th, .table td { padding: 0.75rem 1rem; text-align: left; border-bottom: 1px solid #e2e8f0; }
126
+ .table th { background: #f1f5f9; font-size: 0.75rem; text-transform: uppercase; color: #64748b; }
127
+ .badge { display: inline-block; padding: 2px 8px; border-radius: 12px; font-size: 0.75rem; font-weight: 600; color: white; }
128
+ .badge-critical { background: #ef4444; }
129
+ .badge-high { background: #f97316; }
130
+ .badge-medium { background: #eab308; color: #1e293b; }
131
+ .badge-low { background: #22c55e; }
132
+ .section { margin: 2rem 0; }
133
+ .section h2 { font-size: 1.2rem; color: #0f172a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid #e2e8f0; }
134
+ .footer { text-align: center; margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #e2e8f0; color: #94a3b8; font-size: 0.8rem; }
135
+ @media print { body { background: white; } .container { max-width: 100%; } }
136
+ </style>
137
+ </head>
138
+ <body>
139
+ <div class="container">
140
+ <div class="header">
141
+ <h1>🔒 Security Executive Report</h1>
142
+ <div class="subtitle">Generated by Judges — ${new Date(ts).toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" })}</div>
143
+ </div>
144
+
145
+ <div class="grid">
146
+ <div class="card risk-gauge">
147
+ <h3>Risk Posture</h3>
148
+ <div class="risk-score" style="color: ${risk.color}">${risk.score}</div>
149
+ <div class="risk-label" style="color: ${risk.color}">${risk.label}</div>
150
+ </div>
151
+ <div class="card">
152
+ <h3>Total Findings</h3>
153
+ <div class="value">${breakdown.total}</div>
154
+ </div>
155
+ <div class="card">
156
+ <h3>Critical + High</h3>
157
+ <div class="value" style="color: #ef4444">${breakdown.critical + breakdown.high}</div>
158
+ </div>
159
+ <div class="card">
160
+ <h3>Actionable Items</h3>
161
+ <div class="value">${breakdown.critical + breakdown.high + breakdown.medium}</div>
162
+ </div>
163
+ </div>
164
+
165
+ <div class="section">
166
+ <h2>Severity Distribution</h2>
167
+ <div class="bar-chart">
168
+ ${sevBarData
169
+ .map((s) => {
170
+ const pct = breakdown.total > 0 ? Math.max(5, (s.count / breakdown.total) * 100) : 0;
171
+ return `<div class="bar-row">
172
+ <div class="bar-label">${s.label}</div>
173
+ <div class="bar" style="width: ${pct}%; background: ${s.color};">${s.count}</div>
174
+ </div>`;
175
+ })
176
+ .join("\n ")}
177
+ </div>
178
+ </div>
179
+
180
+ <div class="section">
181
+ <h2>Top Recurring Issues</h2>
182
+ ${topRecurring.length > 0
183
+ ? `<table class="table">
184
+ <thead><tr><th>Rule</th><th>Count</th><th>Severity</th></tr></thead>
185
+ <tbody>
186
+ ${topRecurring.map((r) => `<tr><td>${escapeHtml(r.ruleId)}</td><td>${r.count}</td><td><span class="badge badge-${r.severity}">${r.severity}</span></td></tr>`).join("\n ")}
187
+ </tbody>
188
+ </table>`
189
+ : "<p>No recurring issues found.</p>"}
190
+ </div>
191
+
192
+ <div class="section">
193
+ <h2>Recommendations</h2>
194
+ <ul style="padding-left: 1.5rem; line-height: 1.8;">
195
+ ${breakdown.critical > 0 ? "<li><strong>Immediate:</strong> Address " + breakdown.critical + " critical finding(s) — these represent active security risks.</li>" : ""}
196
+ ${breakdown.high > 0 ? "<li><strong>Short-term:</strong> Remediate " + breakdown.high + " high severity finding(s) within the next sprint.</li>" : ""}
197
+ ${breakdown.medium > 0 ? "<li><strong>Medium-term:</strong> Plan fixes for " + breakdown.medium + " medium severity issue(s) in the backlog.</li>" : ""}
198
+ <li><strong>Process:</strong> Establish a baseline and track trend over time with <code>judges trend</code>.</li>
199
+ <li><strong>Prevention:</strong> Integrate Judges into CI/CD to catch issues before merge.</li>
200
+ </ul>
201
+ </div>
202
+
203
+ <div class="footer">
204
+ Generated by Judges • ${ts} • All data processed locally
205
+ </div>
206
+ </div>
207
+ </body>
208
+ </html>`;
209
+ }
210
+ function escapeHtml(str) {
211
+ return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
212
+ }
213
+ // ─── CLI ────────────────────────────────────────────────────────────────────
214
+ export function runExecReport(argv) {
215
+ if (argv.includes("--help") || argv.includes("-h")) {
216
+ console.log(`
217
+ judges exec-report — Generate executive security dashboard
218
+
219
+ Usage:
220
+ judges exec-report <findings.json>
221
+ judges exec-report report.sarif.json --output dashboard.html
222
+
223
+ Options:
224
+ --output <file> Output HTML filename (default: exec-report.html)
225
+ --format json JSON data output instead of HTML
226
+ --help, -h Show this help
227
+
228
+ Input accepts: Judges JSON, SARIF, or finding arrays.
229
+ Output: Clean HTML report suitable for CISO/VP-level presentation.
230
+ `);
231
+ return;
232
+ }
233
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "html";
234
+ const outputName = argv.find((_a, i) => argv[i - 1] === "--output") || "exec-report.html";
235
+ const inputFile = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--"));
236
+ if (!inputFile || !existsSync(inputFile)) {
237
+ console.error(" Please provide a valid findings file (JSON or SARIF)");
238
+ return;
239
+ }
240
+ let data;
241
+ try {
242
+ data = loadReportData(inputFile);
243
+ }
244
+ catch (err) {
245
+ console.error(` Failed to parse findings: ${err instanceof Error ? err.message : String(err)}`);
246
+ return;
247
+ }
248
+ data.timestamp = new Date().toISOString();
249
+ if (format === "json") {
250
+ const breakdown = getSeverityBreakdown(data.findings);
251
+ const topRecurring = getTopRecurring(data.findings);
252
+ const risk = getRiskScore(breakdown);
253
+ console.log(JSON.stringify({ risk, breakdown, topRecurring, totalFindings: data.findings.length, timestamp: data.timestamp }, null, 2));
254
+ return;
255
+ }
256
+ // Generate HTML
257
+ const html = generateHtml(data);
258
+ const outDir = join(".", ".judges-reports");
259
+ if (!existsSync(outDir))
260
+ mkdirSync(outDir, { recursive: true });
261
+ const outPath = join(outDir, outputName);
262
+ writeFileSync(outPath, html);
263
+ const breakdown = getSeverityBreakdown(data.findings);
264
+ const risk = getRiskScore(breakdown);
265
+ console.log(`\n Executive Report Generated`);
266
+ console.log(` ──────────────────────────`);
267
+ console.log(` Risk Score: ${risk.score}/100 (${risk.label})`);
268
+ console.log(` Findings: ${breakdown.total} (${breakdown.critical}C / ${breakdown.high}H / ${breakdown.medium}M / ${breakdown.low}L)`);
269
+ console.log(` Output: ${outPath}`);
270
+ console.log(`\n Open in browser to view the dashboard.\n`);
271
+ }
272
+ //# sourceMappingURL=exec-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec-report.js","sourceRoot":"","sources":["../../src/commands/exec-report.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAyB5B,+EAA+E;AAE/E,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEjC,eAAe;IACf,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YAClC,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;gBACvC,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;oBAClC,QAAQ,EAAE,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;oBAC3F,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS;oBACzD,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU;iBAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,yBAAyB;IACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC;gBACjD,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;gBAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ;gBAChC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,SAAS;gBACvC,UAAU,EAAE,CAAC,CAAC,UAAU;aACzB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,QAAQ;IACR,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC;gBACxC,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;gBAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ;gBAChC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS;gBAC3B,UAAU,EAAE,CAAC,CAAC,UAAU;aACzB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAE/E,SAAS,oBAAoB,CAAC,QAAyB;IACrD,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM;QAClE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;QAC1D,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM;QAC9D,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM;QACxD,KAAK,EAAE,QAAQ,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,QAAyB,EACzB,KAAK,GAAG,EAAE;IAEV,MAAM,MAAM,GAAwD,EAAE,CAAC;IACvE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7E,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;SACxE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CAAC,SAA4B;IAChD,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,GAAG,EAAE,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;IACpG,MAAM,aAAa,GAAG,GAAG,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,kBAAkB;IAChD,IAAI,QAAQ,IAAI,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACpF,IAAI,QAAQ,IAAI,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACzF,IAAI,QAAQ,IAAI,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACzF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACnE,CAAC;AAED,+EAA+E;AAE/E,SAAS,YAAY,CAAC,IAAgB;IACpC,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEtD,MAAM,UAAU,GAAG;QACjB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;QAClE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;QAC1D,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;QAC9D,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;KACzD,CAAC;IAEF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kDA0CyC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;;;;;;8CAMhG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;8CACzB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;;;;2BAI5C,SAAS,CAAC,KAAK;;;;kDAIQ,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI;;;;2BAI1D,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,MAAM;;;;;;;QAOzE,UAAU;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO;iCACgB,CAAC,CAAC,KAAK;yCACC,GAAG,kBAAkB,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK;aACrE,CAAC;IACN,CAAC,CAAC;SACD,IAAI,CAAC,UAAU,CAAC;;;;;;MAOnB,YAAY,CAAC,MAAM,GAAG,CAAC;QACrB,CAAC,CAAC;;;UAGA,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,qCAAqC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,mBAAmB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;;aAE5K;QACL,CAAC,CAAC,mCACN;;;;;;QAMI,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,0CAA0C,GAAG,SAAS,CAAC,QAAQ,GAAG,oEAAoE,CAAC,CAAC,CAAC,EAAE;QACpK,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,6CAA6C,GAAG,SAAS,CAAC,IAAI,GAAG,wDAAwD,CAAC,CAAC,CAAC,EAAE;QACnJ,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mDAAmD,GAAG,SAAS,CAAC,MAAM,GAAG,gDAAgD,CAAC,CAAC,CAAC,EAAE;;;;;;;4BAOjI,EAAE;;;;QAItB,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACxG,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;CAcf,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,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,kBAAkB,CAAC;IAC1G,MAAM,SAAS,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,CAAC;IAEhH,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,IAAI,IAAgB,CAAC;IACrB,IAAI,CAAC;QACH,IAAI,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjG,OAAO;IACT,CAAC;IAED,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE1C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EACjG,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE7B,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAErC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CACT,kBAAkB,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,QAAQ,OAAO,SAAS,CAAC,IAAI,OAAO,SAAS,CAAC,MAAM,OAAO,SAAS,CAAC,GAAG,IAAI,CAC7H,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Guided tour — interactive onboarding tutorial for new Judges users.
3
+ * Step-by-step walkthrough: first evaluation, understanding output,
4
+ * suppression/baseline workflows, building .judgesrc by example.
5
+ *
6
+ * All data local.
7
+ */
8
+ export declare function runGuidedTour(argv: string[]): void;
9
+ //# sourceMappingURL=guided-tour.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guided-tour.d.ts","sourceRoot":"","sources":["../../src/commands/guided-tour.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsMH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyHlD"}
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Guided tour — interactive onboarding tutorial for new Judges users.
3
+ * Step-by-step walkthrough: first evaluation, understanding output,
4
+ * suppression/baseline workflows, building .judgesrc by example.
5
+ *
6
+ * All data local.
7
+ */
8
+ import { existsSync, writeFileSync, mkdirSync } from "fs";
9
+ import { join } from "path";
10
+ // ─── Tour content ───────────────────────────────────────────────────────────
11
+ const TOUR_TRACKS = [
12
+ {
13
+ id: "quickstart",
14
+ name: "Quick Start",
15
+ description: "Get your first code review in under 5 minutes",
16
+ steps: [
17
+ {
18
+ id: "install",
19
+ title: "Step 1: Installation",
20
+ description: "Install Judges globally or as a dev dependency.",
21
+ command: "npm install -g @kevinrabun/judges",
22
+ example: "# Or as a dev dependency:\nnpm install --save-dev @kevinrabun/judges",
23
+ tips: [
24
+ "Use --save-dev for project-specific installations",
25
+ "Global install lets you run 'judges' from anywhere",
26
+ ],
27
+ },
28
+ {
29
+ id: "first-review",
30
+ title: "Step 2: Run Your First Review",
31
+ description: "Point Judges at any source file to get an instant security review.",
32
+ command: "judges review src/app.ts",
33
+ example: "# Review an entire directory:\njudges review src/\n\n# Review with a specific preset:\njudges review src/ --preset strict",
34
+ tips: [
35
+ "Start with a single file to learn the output format",
36
+ "Use --preset lenient for fewer false positives initially",
37
+ ],
38
+ },
39
+ {
40
+ id: "understand-output",
41
+ title: "Step 3: Understanding the Output",
42
+ description: "Judges outputs findings with severity, confidence, and actionable recommendations.",
43
+ example: `Finding output explained:
44
+ ─────────────────────────
45
+ [HIGH] sql-injection-risk
46
+ Title: Potential SQL injection in query builder
47
+ Line: 42
48
+ Confidence: 0.92 (high tier)
49
+ Recommendation: Use parameterized queries instead of string concatenation
50
+
51
+ Fields:
52
+ severity — critical / high / medium / low
53
+ confidence — 0.0–1.0 score (how certain the judge is)
54
+ ruleId — unique identifier for the finding type
55
+ title — human-readable description
56
+ recommendation — how to fix the issue`,
57
+ tips: [
58
+ "High confidence + high severity = fix immediately",
59
+ "Low confidence findings may be false positives — review carefully",
60
+ ],
61
+ },
62
+ {
63
+ id: "suppress",
64
+ title: "Step 4: Suppressing False Positives",
65
+ description: "Mark findings as acknowledged or false positives so they don't appear again.",
66
+ command: "judges baseline create --output .judges-baseline.json",
67
+ example: `# Create a baseline from current findings:
68
+ judges baseline create --output .judges-baseline.json
69
+
70
+ # Run review with baseline (only new findings shown):
71
+ judges review src/ --baseline .judges-baseline.json
72
+
73
+ # Suppress a specific rule:
74
+ # Add to .judgesrc: { "disabledRules": ["rule-id-here"] }`,
75
+ tips: [
76
+ "Baselines capture current state — only new issues surface",
77
+ "Commit .judges-baseline.json to share with your team",
78
+ ],
79
+ },
80
+ {
81
+ id: "configure",
82
+ title: "Step 5: Create Your .judgesrc",
83
+ description: "Customize Judges behavior with a configuration file.",
84
+ example: `// .judgesrc (JSON format)
85
+ {
86
+ "preset": "recommended",
87
+ "minSeverity": "medium",
88
+ "disabledRules": [],
89
+ "disabledJudges": [],
90
+ "ruleOverrides": {
91
+ "some-noisy-rule": { "severity": "low" }
92
+ }
93
+ }`,
94
+ tips: [
95
+ "Start with 'recommended' preset",
96
+ "Use minSeverity to filter out low-priority findings",
97
+ "Override specific rules without disabling them entirely",
98
+ ],
99
+ },
100
+ ],
101
+ },
102
+ {
103
+ id: "ci-integration",
104
+ name: "CI/CD Integration",
105
+ description: "Add Judges to your continuous integration pipeline",
106
+ steps: [
107
+ {
108
+ id: "github-actions",
109
+ title: "Step 1: GitHub Actions Setup",
110
+ description: "Add Judges as a review step in your GitHub Actions workflow.",
111
+ example: `# .github/workflows/judges.yml
112
+ name: Judges Code Review
113
+ on: [pull_request]
114
+ jobs:
115
+ review:
116
+ runs-on: ubuntu-latest
117
+ steps:
118
+ - uses: actions/checkout@v4
119
+ - uses: actions/setup-node@v4
120
+ with:
121
+ node-version: 20
122
+ - run: npm install -g @kevinrabun/judges
123
+ - run: judges review src/ --format sarif --output results.sarif
124
+ - uses: github/codeql-action/upload-sarif@v3
125
+ with:
126
+ sarif_file: results.sarif`,
127
+ },
128
+ {
129
+ id: "quality-gate",
130
+ title: "Step 2: Quality Gate",
131
+ description: "Block PRs that introduce critical or high-severity findings.",
132
+ command: "judges gate --max-critical 0 --max-high 3",
133
+ example: "# In CI:\njudges review src/ --format json | judges gate --max-critical 0 --max-high 3\n# Exit code 1 = gate failed, PR should not merge",
134
+ tips: ["Start lenient (allow some highs) and tighten over time", "Always block on critical findings"],
135
+ },
136
+ {
137
+ id: "diff-review",
138
+ title: "Step 3: Diff-Only Review",
139
+ description: "Review only changed files in a PR for faster feedback.",
140
+ command: "judges diff-review --base main",
141
+ tips: ["Diff review is much faster than full review", "Combine with baseline for minimal noise"],
142
+ },
143
+ ],
144
+ },
145
+ {
146
+ id: "team-adoption",
147
+ name: "Team Adoption",
148
+ description: "Roll out Judges across your development team",
149
+ steps: [
150
+ {
151
+ id: "shared-config",
152
+ title: "Step 1: Shared Configuration",
153
+ description: "Create a team-wide .judgesrc and commit it to your repository.",
154
+ example: `// Recommended team .judgesrc
155
+ {
156
+ "preset": "recommended",
157
+ "minSeverity": "medium",
158
+ "disabledRules": []
159
+ }`,
160
+ tips: ["Start with recommended preset for team consensus", "Document why rules are disabled"],
161
+ },
162
+ {
163
+ id: "baseline-workflow",
164
+ title: "Step 2: Baseline Workflow",
165
+ description: "Establish a baseline then only review new findings going forward.",
166
+ command: "judges baseline create --output .judges-baseline.json",
167
+ tips: ["Create baseline on main branch", "Each team member starts from the shared baseline"],
168
+ },
169
+ {
170
+ id: "metrics",
171
+ title: "Step 3: Track Metrics",
172
+ description: "Monitor your team's security posture over time.",
173
+ command: "judges trend --days 30",
174
+ tips: ["Track findings-per-PR to measure improvement", "Celebrate declining finding counts"],
175
+ },
176
+ ],
177
+ },
178
+ ];
179
+ // ─── CLI ────────────────────────────────────────────────────────────────────
180
+ export function runGuidedTour(argv) {
181
+ if (argv.includes("--help") || argv.includes("-h")) {
182
+ console.log(`
183
+ judges guided-tour — Interactive onboarding tutorials
184
+
185
+ Usage:
186
+ judges guided-tour List available tour tracks
187
+ judges guided-tour quickstart Start the quick start tour
188
+ judges guided-tour ci-integration CI/CD integration guide
189
+ judges guided-tour team-adoption Team rollout guide
190
+ judges guided-tour --init Generate starter .judgesrc
191
+ judges guided-tour --all Show all tour content
192
+
193
+ Options:
194
+ --init Generate a starter .judgesrc file
195
+ --all Show all tracks at once
196
+ --format json JSON output
197
+ --step <n> Jump to specific step number
198
+ --help, -h Show this help
199
+
200
+ Available tracks: ${TOUR_TRACKS.map((t) => t.id).join(", ")}
201
+ `);
202
+ return;
203
+ }
204
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
205
+ // Generate starter config
206
+ if (argv.includes("--init")) {
207
+ const rcPath = join(".", ".judgesrc");
208
+ if (existsSync(rcPath)) {
209
+ console.log(" .judgesrc already exists — skipping");
210
+ return;
211
+ }
212
+ const config = {
213
+ preset: "recommended",
214
+ minSeverity: "medium",
215
+ disabledRules: [],
216
+ disabledJudges: [],
217
+ ruleOverrides: {},
218
+ };
219
+ writeFileSync(rcPath, JSON.stringify(config, null, 2) + "\n");
220
+ console.log(" ✅ Created .judgesrc with recommended defaults");
221
+ return;
222
+ }
223
+ const trackId = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--"));
224
+ const stepNum = argv.find((_a, i) => argv[i - 1] === "--step");
225
+ const showAll = argv.includes("--all");
226
+ if (format === "json") {
227
+ const data = trackId
228
+ ? TOUR_TRACKS.find((t) => t.id === trackId) || TOUR_TRACKS
229
+ : showAll
230
+ ? TOUR_TRACKS
231
+ : TOUR_TRACKS.map(({ steps: _s, ...rest }) => rest);
232
+ console.log(JSON.stringify(data, null, 2));
233
+ return;
234
+ }
235
+ // List tracks
236
+ if (!trackId && !showAll) {
237
+ console.log(`\n 📚 Judges Guided Tour\n ──────────────────────────`);
238
+ for (const track of TOUR_TRACKS) {
239
+ console.log(`\n ${track.name} (${track.id})`);
240
+ console.log(` ${track.description}`);
241
+ console.log(` Steps: ${track.steps.length}`);
242
+ console.log(` Run: judges guided-tour ${track.id}`);
243
+ }
244
+ console.log(`\n 💡 Quick setup: judges guided-tour --init\n`);
245
+ return;
246
+ }
247
+ // Show track(s)
248
+ const tracks = showAll ? TOUR_TRACKS : [TOUR_TRACKS.find((t) => t.id === trackId)];
249
+ if (!tracks[0]) {
250
+ console.error(` Unknown track: ${trackId}\n Available: ${TOUR_TRACKS.map((t) => t.id).join(", ")}`);
251
+ return;
252
+ }
253
+ for (const track of tracks) {
254
+ console.log(`\n ═══════════════════════════════════════`);
255
+ console.log(` 📚 ${track.name}`);
256
+ console.log(` ${track.description}`);
257
+ console.log(` ═══════════════════════════════════════`);
258
+ const steps = stepNum ? [track.steps[parseInt(stepNum) - 1]].filter(Boolean) : track.steps;
259
+ for (let i = 0; i < steps.length; i++) {
260
+ const step = steps[i];
261
+ const num = stepNum ? parseInt(stepNum) : i + 1;
262
+ console.log(`\n ─── ${num}/${track.steps.length} ──────────────────────────`);
263
+ console.log(` ${step.title}`);
264
+ console.log(` ${step.description}`);
265
+ if (step.command) {
266
+ console.log(`\n $ ${step.command}`);
267
+ }
268
+ if (step.example) {
269
+ console.log(`\n${step.example
270
+ .split("\n")
271
+ .map((l) => " " + l)
272
+ .join("\n")}`);
273
+ }
274
+ if (step.tips && step.tips.length > 0) {
275
+ console.log("");
276
+ for (const tip of step.tips) {
277
+ console.log(` 💡 ${tip}`);
278
+ }
279
+ }
280
+ }
281
+ console.log("");
282
+ }
283
+ // Generate .judgesrc directory for tour progress
284
+ const tourDir = join(".", ".judges-tour");
285
+ if (!existsSync(tourDir))
286
+ mkdirSync(tourDir, { recursive: true });
287
+ }
288
+ //# sourceMappingURL=guided-tour.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guided-tour.js","sourceRoot":"","sources":["../../src/commands/guided-tour.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Hallucination score — assign a hallucination risk score (0–100)
3
+ * to AI-generated code based on detected patterns: generic naming,
4
+ * suspicious imports, implausible logic, unverified API usage.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ export declare function runHallucinationScore(argv: string[]): void;
9
+ //# sourceMappingURL=hallucination-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hallucination-score.d.ts","sourceRoot":"","sources":["../../src/commands/hallucination-score.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8PH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmG1D"}