@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.
- package/CHANGELOG.md +9 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +56 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/finding-cluster.d.ts +5 -0
- package/dist/commands/finding-cluster.d.ts.map +1 -0
- package/dist/commands/finding-cluster.js +158 -0
- package/dist/commands/finding-cluster.js.map +1 -0
- package/dist/commands/finding-hotspot.d.ts +5 -0
- package/dist/commands/finding-hotspot.d.ts.map +1 -0
- package/dist/commands/finding-hotspot.js +116 -0
- package/dist/commands/finding-hotspot.js.map +1 -0
- package/dist/commands/review-ab-test.d.ts +5 -0
- package/dist/commands/review-ab-test.d.ts.map +1 -0
- package/dist/commands/review-ab-test.js +225 -0
- package/dist/commands/review-ab-test.js.map +1 -0
- package/dist/commands/review-audit-log.d.ts +5 -0
- package/dist/commands/review-audit-log.d.ts.map +1 -0
- package/dist/commands/review-audit-log.js +140 -0
- package/dist/commands/review-audit-log.js.map +1 -0
- package/dist/commands/review-badge.d.ts +5 -0
- package/dist/commands/review-badge.d.ts.map +1 -0
- package/dist/commands/review-badge.js +153 -0
- package/dist/commands/review-badge.js.map +1 -0
- package/dist/commands/review-integration.d.ts +5 -0
- package/dist/commands/review-integration.d.ts.map +1 -0
- package/dist/commands/review-integration.js +237 -0
- package/dist/commands/review-integration.js.map +1 -0
- package/dist/commands/review-sandbox.d.ts +5 -0
- package/dist/commands/review-sandbox.d.ts.map +1 -0
- package/dist/commands/review-sandbox.js +192 -0
- package/dist/commands/review-sandbox.js.map +1 -0
- package/dist/commands/review-streak.d.ts +5 -0
- package/dist/commands/review-streak.d.ts.map +1 -0
- package/dist/commands/review-streak.js +151 -0
- package/dist/commands/review-streak.js.map +1 -0
- package/package.json +1 -1
- 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 @@
|
|
|
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 ``;
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|