@kevinrabun/judges 3.67.0 → 3.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-cluster.d.ts +5 -0
  6. package/dist/commands/finding-cluster.d.ts.map +1 -0
  7. package/dist/commands/finding-cluster.js +158 -0
  8. package/dist/commands/finding-cluster.js.map +1 -0
  9. package/dist/commands/finding-hotspot.d.ts +5 -0
  10. package/dist/commands/finding-hotspot.d.ts.map +1 -0
  11. package/dist/commands/finding-hotspot.js +116 -0
  12. package/dist/commands/finding-hotspot.js.map +1 -0
  13. package/dist/commands/review-ab-test.d.ts +5 -0
  14. package/dist/commands/review-ab-test.d.ts.map +1 -0
  15. package/dist/commands/review-ab-test.js +225 -0
  16. package/dist/commands/review-ab-test.js.map +1 -0
  17. package/dist/commands/review-audit-log.d.ts +5 -0
  18. package/dist/commands/review-audit-log.d.ts.map +1 -0
  19. package/dist/commands/review-audit-log.js +140 -0
  20. package/dist/commands/review-audit-log.js.map +1 -0
  21. package/dist/commands/review-badge.d.ts +5 -0
  22. package/dist/commands/review-badge.d.ts.map +1 -0
  23. package/dist/commands/review-badge.js +153 -0
  24. package/dist/commands/review-badge.js.map +1 -0
  25. package/dist/commands/review-integration.d.ts +5 -0
  26. package/dist/commands/review-integration.d.ts.map +1 -0
  27. package/dist/commands/review-integration.js +237 -0
  28. package/dist/commands/review-integration.js.map +1 -0
  29. package/dist/commands/review-sandbox.d.ts +5 -0
  30. package/dist/commands/review-sandbox.d.ts.map +1 -0
  31. package/dist/commands/review-sandbox.js +192 -0
  32. package/dist/commands/review-sandbox.js.map +1 -0
  33. package/dist/commands/review-streak.d.ts +5 -0
  34. package/dist/commands/review-streak.d.ts.map +1 -0
  35. package/dist/commands/review-streak.js +151 -0
  36. package/dist/commands/review-streak.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Review-audit-log — Comprehensive local audit log for compliance tracking.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const LOG_FILE = join(".judges", "audit-log.json");
8
+ function loadLog() {
9
+ if (!existsSync(LOG_FILE))
10
+ return { version: "1.0.0", entries: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(LOG_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", entries: [] };
16
+ }
17
+ }
18
+ function saveLog(log) {
19
+ mkdirSync(dirname(LOG_FILE), { recursive: true });
20
+ writeFileSync(LOG_FILE, JSON.stringify(log, null, 2), "utf-8");
21
+ }
22
+ // ─── CLI ────────────────────────────────────────────────────────────────────
23
+ export function runReviewAuditLog(argv) {
24
+ if (argv.includes("--help") || argv.includes("-h")) {
25
+ console.log(`
26
+ judges review-audit-log — Comprehensive local audit log
27
+
28
+ Usage:
29
+ judges review-audit-log show Show recent audit entries
30
+ judges review-audit-log show --last 20 Show last N entries
31
+ judges review-audit-log record --action review Record an audit entry
32
+ judges review-audit-log search --action suppress Search by action
33
+ judges review-audit-log export --output log.csv Export to CSV
34
+ judges review-audit-log clear Clear audit log
35
+
36
+ Subcommands:
37
+ show Show audit entries
38
+ record Record a new entry
39
+ search Search entries
40
+ export Export log
41
+ clear Clear all entries
42
+
43
+ Options:
44
+ --action <type> Action type (review, suppress, approve, fix, configure, etc.)
45
+ --command <cmd> Command that was run
46
+ --result <text> Result description
47
+ --last <n> Show last N entries (default: 10)
48
+ --output <path> Export file path
49
+ --format json JSON output
50
+ --help, -h Show this help
51
+
52
+ Tracks all review actions locally for compliance and auditability.
53
+ Data stored in .judges/audit-log.json.
54
+ `);
55
+ return;
56
+ }
57
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
58
+ const subcommand = argv.find((a) => ["show", "record", "search", "export", "clear"].includes(a)) || "show";
59
+ const log = loadLog();
60
+ if (subcommand === "record") {
61
+ const action = argv.find((_a, i) => argv[i - 1] === "--action") || "unknown";
62
+ const command = argv.find((_a, i) => argv[i - 1] === "--command") || "";
63
+ const result = argv.find((_a, i) => argv[i - 1] === "--result") || "success";
64
+ const user = process.env.USER || process.env.USERNAME || "unknown";
65
+ const entry = {
66
+ timestamp: new Date().toISOString(),
67
+ action,
68
+ command,
69
+ user,
70
+ details: {},
71
+ result,
72
+ };
73
+ log.entries.push(entry);
74
+ saveLog(log);
75
+ console.log(`Audit entry recorded: ${action} by ${user}`);
76
+ return;
77
+ }
78
+ if (subcommand === "clear") {
79
+ saveLog({ version: "1.0.0", entries: [] });
80
+ console.log("Audit log cleared.");
81
+ return;
82
+ }
83
+ if (subcommand === "search") {
84
+ const action = argv.find((_a, i) => argv[i - 1] === "--action");
85
+ const filtered = action ? log.entries.filter((e) => e.action === action) : log.entries;
86
+ if (format === "json") {
87
+ console.log(JSON.stringify(filtered, null, 2));
88
+ return;
89
+ }
90
+ if (filtered.length === 0) {
91
+ console.log(`No entries found${action ? ` for action "${action}"` : ""}.`);
92
+ return;
93
+ }
94
+ console.log(`\nSearch Results (${filtered.length} entries):`);
95
+ console.log("─".repeat(80));
96
+ for (const e of filtered.slice(-20)) {
97
+ console.log(` ${e.timestamp} [${e.action}] ${e.command || "-"} → ${e.result} (${e.user})`);
98
+ }
99
+ console.log("─".repeat(80));
100
+ return;
101
+ }
102
+ if (subcommand === "export") {
103
+ const output = argv.find((_a, i) => argv[i - 1] === "--output");
104
+ if (!output) {
105
+ console.error("Error: --output is required for export.");
106
+ process.exitCode = 1;
107
+ return;
108
+ }
109
+ const header = "timestamp,action,command,user,result\n";
110
+ const rows = log.entries
111
+ .map((e) => `"${e.timestamp}","${e.action}","${e.command}","${e.user}","${e.result}"`)
112
+ .join("\n");
113
+ mkdirSync(dirname(output), { recursive: true });
114
+ writeFileSync(output, header + rows, "utf-8");
115
+ console.log(`Exported ${log.entries.length} entries to ${output}`);
116
+ return;
117
+ }
118
+ // show
119
+ const lastN = parseInt(argv.find((_a, i) => argv[i - 1] === "--last") || "10", 10);
120
+ const entries = log.entries.slice(-lastN);
121
+ if (format === "json") {
122
+ console.log(JSON.stringify(entries, null, 2));
123
+ return;
124
+ }
125
+ if (entries.length === 0) {
126
+ console.log("No audit entries recorded yet.");
127
+ return;
128
+ }
129
+ console.log(`\nAudit Log (last ${entries.length} of ${log.entries.length}):`);
130
+ console.log("─".repeat(80));
131
+ console.log(" Timestamp Action Command Result");
132
+ console.log("─".repeat(80));
133
+ for (const e of entries) {
134
+ const ts = e.timestamp.slice(0, 19).replace("T", " ");
135
+ console.log(` ${ts} ${e.action.padEnd(12)} ${(e.command || "-").padEnd(20)} ${e.result}`);
136
+ }
137
+ console.log("─".repeat(80));
138
+ console.log(` Total entries: ${log.entries.length}`);
139
+ }
140
+ //# sourceMappingURL=review-audit-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-audit-log.js","sourceRoot":"","sources":["../../src/commands/review-audit-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-badge — Generate status badges for project READMEs.
3
+ */
4
+ export declare function runReviewBadge(argv: string[]): void;
5
+ //# sourceMappingURL=review-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-badge.d.ts","sourceRoot":"","sources":["../../src/commands/review-badge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwDH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyGnD"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Review-badge — Generate status badges for project READMEs.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Badge Generation ───────────────────────────────────────────────────────
7
+ function scoreToGrade(score) {
8
+ if (score >= 9)
9
+ return "A+";
10
+ if (score >= 8)
11
+ return "A";
12
+ if (score >= 7)
13
+ return "B";
14
+ if (score >= 6)
15
+ return "C";
16
+ if (score >= 5)
17
+ return "D";
18
+ return "F";
19
+ }
20
+ function gradeColor(grade) {
21
+ if (grade.startsWith("A"))
22
+ return "brightgreen";
23
+ if (grade === "B")
24
+ return "green";
25
+ if (grade === "C")
26
+ return "yellow";
27
+ if (grade === "D")
28
+ return "orange";
29
+ return "red";
30
+ }
31
+ function generateMarkdownBadge(label, value, color) {
32
+ const encodedLabel = encodeURIComponent(label);
33
+ const encodedValue = encodeURIComponent(value);
34
+ return `![${label}](https://img.shields.io/badge/${encodedLabel}-${encodedValue}-${color})`;
35
+ }
36
+ function generateSvgBadge(label, value, color) {
37
+ const hexColors = {
38
+ brightgreen: "#4c1",
39
+ green: "#97CA00",
40
+ yellow: "#dfb317",
41
+ orange: "#fe7d37",
42
+ red: "#e05d44",
43
+ blue: "#007ec6",
44
+ lightgrey: "#9f9f9f",
45
+ };
46
+ const hex = hexColors[color] || hexColors.lightgrey;
47
+ const labelWidth = label.length * 7 + 10;
48
+ const valueWidth = value.length * 7 + 10;
49
+ const totalWidth = labelWidth + valueWidth;
50
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${totalWidth}" height="20">
51
+ <rect width="${labelWidth}" height="20" fill="#555"/>
52
+ <rect x="${labelWidth}" width="${valueWidth}" height="20" fill="${hex}"/>
53
+ <text x="${labelWidth / 2}" y="14" fill="#fff" text-anchor="middle" font-family="sans-serif" font-size="11">${label}</text>
54
+ <text x="${labelWidth + valueWidth / 2}" y="14" fill="#fff" text-anchor="middle" font-family="sans-serif" font-size="11">${value}</text>
55
+ </svg>`;
56
+ }
57
+ // ─── CLI ────────────────────────────────────────────────────────────────────
58
+ export function runReviewBadge(argv) {
59
+ if (argv.includes("--help") || argv.includes("-h")) {
60
+ console.log(`
61
+ judges review-badge — Generate status badges for project READMEs
62
+
63
+ Usage:
64
+ judges review-badge --file verdict.json Generate badge from verdict
65
+ judges review-badge --score 8.5 Generate badge from score
66
+ judges review-badge --file v.json --output badge.svg Save SVG badge
67
+ judges review-badge --file v.json --markdown Output markdown badge syntax
68
+
69
+ Options:
70
+ --file <path> Verdict JSON file
71
+ --score <n> Direct score (0-10)
72
+ --output <path> Save badge to file (SVG format)
73
+ --markdown Output markdown badge syntax
74
+ --label <text> Custom badge label (default: "Judges Score")
75
+ --format json JSON output
76
+ --help, -h Show this help
77
+
78
+ Generate badges showing review score/grade for project visibility.
79
+ `);
80
+ return;
81
+ }
82
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
83
+ const label = argv.find((_a, i) => argv[i - 1] === "--label") || "Judges Score";
84
+ const output = argv.find((_a, i) => argv[i - 1] === "--output");
85
+ const scoreArg = argv.find((_a, i) => argv[i - 1] === "--score");
86
+ let score;
87
+ let criticals = 0;
88
+ let findings = 0;
89
+ if (scoreArg) {
90
+ score = parseFloat(scoreArg);
91
+ }
92
+ else {
93
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
94
+ if (!file || !existsSync(file)) {
95
+ console.error("Error: --file or --score is required.");
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ try {
100
+ const verdict = JSON.parse(readFileSync(file, "utf-8"));
101
+ score = verdict.overallScore || 0;
102
+ criticals = verdict.criticalCount || 0;
103
+ findings = (verdict.findings || []).length;
104
+ }
105
+ catch {
106
+ console.error("Error: Failed to parse verdict file.");
107
+ process.exitCode = 1;
108
+ return;
109
+ }
110
+ }
111
+ const grade = scoreToGrade(score);
112
+ const color = gradeColor(grade);
113
+ const value = `${grade} (${score.toFixed(1)})`;
114
+ if (output) {
115
+ const svg = generateSvgBadge(label, value, color);
116
+ mkdirSync(dirname(output), { recursive: true });
117
+ writeFileSync(output, svg, "utf-8");
118
+ console.log(`Badge saved to ${output}`);
119
+ return;
120
+ }
121
+ if (argv.includes("--markdown")) {
122
+ const md = generateMarkdownBadge(label, value, color);
123
+ console.log(md);
124
+ if (criticals > 0) {
125
+ console.log(generateMarkdownBadge("Critical Findings", String(criticals), "red"));
126
+ }
127
+ if (findings > 0) {
128
+ console.log(generateMarkdownBadge("Total Findings", String(findings), findings > 10 ? "orange" : "blue"));
129
+ }
130
+ return;
131
+ }
132
+ if (format === "json") {
133
+ console.log(JSON.stringify({
134
+ label,
135
+ value,
136
+ grade,
137
+ score,
138
+ color,
139
+ markdown: generateMarkdownBadge(label, value, color),
140
+ criticals,
141
+ findings,
142
+ }, null, 2));
143
+ return;
144
+ }
145
+ console.log(`\nBadge: ${label} — ${value}`);
146
+ console.log(`Grade: ${grade} Color: ${color}`);
147
+ console.log(`\nMarkdown:`);
148
+ console.log(` ${generateMarkdownBadge(label, value, color)}`);
149
+ if (criticals > 0)
150
+ console.log(` ${generateMarkdownBadge("Critical Findings", String(criticals), "red")}`);
151
+ console.log();
152
+ }
153
+ //# sourceMappingURL=review-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-badge.js","sourceRoot":"","sources":["../../src/commands/review-badge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-integration — Verify CI/CD, IDE, and hook integrations are connected.
3
+ */
4
+ export declare function runReviewIntegration(argv: string[]): void;
5
+ //# sourceMappingURL=review-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-integration.d.ts","sourceRoot":"","sources":["../../src/commands/review-integration.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4LH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmEzD"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Review-integration — Verify CI/CD, IDE, and hook integrations are connected.
3
+ */
4
+ import { existsSync, readFileSync } from "fs";
5
+ import { join } from "path";
6
+ // ─── Checks ─────────────────────────────────────────────────────────────────
7
+ function checkJudgesrc() {
8
+ if (existsSync(".judgesrc")) {
9
+ try {
10
+ JSON.parse(readFileSync(".judgesrc", "utf-8"));
11
+ return {
12
+ name: ".judgesrc",
13
+ category: "config",
14
+ status: "connected",
15
+ details: "Configuration file found and valid",
16
+ };
17
+ }
18
+ catch {
19
+ return { name: ".judgesrc", category: "config", status: "partial", details: "File exists but has parse errors" };
20
+ }
21
+ }
22
+ return {
23
+ name: ".judgesrc",
24
+ category: "config",
25
+ status: "missing",
26
+ details: "No .judgesrc found — run 'judges init'",
27
+ };
28
+ }
29
+ function checkGitHooksDir() {
30
+ const huskyHook = join(".husky", "pre-commit");
31
+ const gitHook = join(".git", "hooks", "pre-commit");
32
+ if (existsSync(huskyHook)) {
33
+ const content = readFileSync(huskyHook, "utf-8");
34
+ if (content.includes("judges")) {
35
+ return {
36
+ name: "Git Pre-commit Hook",
37
+ category: "hooks",
38
+ status: "connected",
39
+ details: "Husky pre-commit hook includes judges",
40
+ };
41
+ }
42
+ return {
43
+ name: "Git Pre-commit Hook",
44
+ category: "hooks",
45
+ status: "partial",
46
+ details: "Husky hook exists but doesn't reference judges",
47
+ };
48
+ }
49
+ if (existsSync(gitHook)) {
50
+ const content = readFileSync(gitHook, "utf-8");
51
+ if (content.includes("judges")) {
52
+ return {
53
+ name: "Git Pre-commit Hook",
54
+ category: "hooks",
55
+ status: "connected",
56
+ details: "Git pre-commit hook includes judges",
57
+ };
58
+ }
59
+ return {
60
+ name: "Git Pre-commit Hook",
61
+ category: "hooks",
62
+ status: "partial",
63
+ details: "Git hook exists but doesn't reference judges",
64
+ };
65
+ }
66
+ return {
67
+ name: "Git Pre-commit Hook",
68
+ category: "hooks",
69
+ status: "missing",
70
+ details: "No pre-commit hook — run 'judges hook-install'",
71
+ };
72
+ }
73
+ function checkGitHubActions() {
74
+ const workflowDir = join(".github", "workflows");
75
+ if (!existsSync(workflowDir)) {
76
+ return { name: "GitHub Actions", category: "ci", status: "missing", details: "No .github/workflows directory" };
77
+ }
78
+ try {
79
+ const files = ["judges.yml", "judges.yaml", "review.yml", "review.yaml", "code-review.yml"];
80
+ for (const f of files) {
81
+ if (existsSync(join(workflowDir, f))) {
82
+ return { name: "GitHub Actions", category: "ci", status: "connected", details: `Workflow file: ${f}` };
83
+ }
84
+ }
85
+ // Check if any workflow references judges
86
+ const commonFiles = ["ci.yml", "ci.yaml", "main.yml", "main.yaml", "push.yml", "build.yml"];
87
+ for (const f of commonFiles) {
88
+ const path = join(workflowDir, f);
89
+ if (existsSync(path)) {
90
+ const content = readFileSync(path, "utf-8");
91
+ if (content.includes("judges")) {
92
+ return { name: "GitHub Actions", category: "ci", status: "connected", details: `Judges referenced in ${f}` };
93
+ }
94
+ }
95
+ }
96
+ return {
97
+ name: "GitHub Actions",
98
+ category: "ci",
99
+ status: "partial",
100
+ details: "Workflows exist but no judges integration found",
101
+ };
102
+ }
103
+ catch {
104
+ return { name: "GitHub Actions", category: "ci", status: "missing", details: "Could not read workflows" };
105
+ }
106
+ }
107
+ function checkVSCodeExtension() {
108
+ const vscodePath = join(".vscode", "extensions.json");
109
+ if (existsSync(vscodePath)) {
110
+ try {
111
+ const content = readFileSync(vscodePath, "utf-8");
112
+ if (content.includes("judges")) {
113
+ return {
114
+ name: "VS Code Extension",
115
+ category: "ide",
116
+ status: "connected",
117
+ details: "Judges in recommended extensions",
118
+ };
119
+ }
120
+ }
121
+ catch {
122
+ /* ignore */
123
+ }
124
+ }
125
+ return {
126
+ name: "VS Code Extension",
127
+ category: "ide",
128
+ status: "missing",
129
+ details: "Add judges to .vscode/extensions.json recommendations",
130
+ };
131
+ }
132
+ function checkPackageJson() {
133
+ if (!existsSync("package.json")) {
134
+ return { name: "package.json scripts", category: "config", status: "missing", details: "No package.json found" };
135
+ }
136
+ try {
137
+ const pkg = JSON.parse(readFileSync("package.json", "utf-8"));
138
+ const scripts = (pkg.scripts || {});
139
+ const judgesScripts = Object.entries(scripts).filter(([, v]) => v.includes("judges"));
140
+ if (judgesScripts.length > 0) {
141
+ return {
142
+ name: "package.json scripts",
143
+ category: "config",
144
+ status: "connected",
145
+ details: `Scripts: ${judgesScripts.map(([k]) => k).join(", ")}`,
146
+ };
147
+ }
148
+ return {
149
+ name: "package.json scripts",
150
+ category: "config",
151
+ status: "missing",
152
+ details: "No judges scripts in package.json",
153
+ };
154
+ }
155
+ catch {
156
+ return {
157
+ name: "package.json scripts",
158
+ category: "config",
159
+ status: "partial",
160
+ details: "Could not parse package.json",
161
+ };
162
+ }
163
+ }
164
+ function checkLocalData() {
165
+ if (existsSync(".judges")) {
166
+ return { name: "Local Data Dir", category: "data", status: "connected", details: ".judges/ directory exists" };
167
+ }
168
+ return {
169
+ name: "Local Data Dir",
170
+ category: "data",
171
+ status: "missing",
172
+ details: "No .judges/ directory — created on first use",
173
+ };
174
+ }
175
+ // ─── CLI ────────────────────────────────────────────────────────────────────
176
+ export function runReviewIntegration(argv) {
177
+ if (argv.includes("--help") || argv.includes("-h")) {
178
+ console.log(`
179
+ judges review-integration — Verify all integrations are connected
180
+
181
+ Usage:
182
+ judges review-integration Run all checks
183
+ judges review-integration --category ci Check specific category
184
+ judges review-integration --fix Show fix suggestions
185
+
186
+ Options:
187
+ --category <cat> Filter by category (config, ci, hooks, ide, data)
188
+ --fix Show how to fix missing integrations
189
+ --format json JSON output
190
+ --help, -h Show this help
191
+
192
+ Verifies CI/CD, git hooks, IDE, and config integrations are properly set up.
193
+ `);
194
+ return;
195
+ }
196
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
197
+ const category = argv.find((_a, i) => argv[i - 1] === "--category");
198
+ const showFix = argv.includes("--fix");
199
+ let checks = [
200
+ checkJudgesrc(),
201
+ checkPackageJson(),
202
+ checkGitHooksDir(),
203
+ checkGitHubActions(),
204
+ checkVSCodeExtension(),
205
+ checkLocalData(),
206
+ ];
207
+ if (category) {
208
+ checks = checks.filter((c) => c.category === category);
209
+ }
210
+ if (format === "json") {
211
+ console.log(JSON.stringify(checks, null, 2));
212
+ return;
213
+ }
214
+ const connected = checks.filter((c) => c.status === "connected").length;
215
+ const total = checks.length;
216
+ console.log("\nIntegration Status:");
217
+ console.log("─".repeat(70));
218
+ for (const c of checks) {
219
+ const icon = c.status === "connected" ? "[OK]" : c.status === "partial" ? "[!!]" : "[--]";
220
+ console.log(` ${icon} ${c.name.padEnd(25)} ${c.details}`);
221
+ }
222
+ console.log("─".repeat(70));
223
+ console.log(` ${connected}/${total} integrations connected`);
224
+ if (showFix) {
225
+ const missing = checks.filter((c) => c.status !== "connected");
226
+ if (missing.length > 0) {
227
+ console.log("\nSuggested Fixes:");
228
+ console.log("─".repeat(70));
229
+ for (const c of missing) {
230
+ console.log(` ${c.name}: ${c.details}`);
231
+ }
232
+ console.log("─".repeat(70));
233
+ }
234
+ }
235
+ console.log();
236
+ }
237
+ //# sourceMappingURL=review-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-integration.js","sourceRoot":"","sources":["../../src/commands/review-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-sandbox — Sandbox mode for testing review configurations safely.
3
+ */
4
+ export declare function runReviewSandbox(argv: string[]): void;
5
+ //# sourceMappingURL=review-sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-sandbox.d.ts","sourceRoot":"","sources":["../../src/commands/review-sandbox.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyCH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkLrD"}