@kevinrabun/judges 3.67.0 → 3.69.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 +17 -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/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-fix-rate.d.ts +5 -0
  10. package/dist/commands/finding-fix-rate.d.ts.map +1 -0
  11. package/dist/commands/finding-fix-rate.js +142 -0
  12. package/dist/commands/finding-fix-rate.js.map +1 -0
  13. package/dist/commands/finding-hotspot.d.ts +5 -0
  14. package/dist/commands/finding-hotspot.d.ts.map +1 -0
  15. package/dist/commands/finding-hotspot.js +116 -0
  16. package/dist/commands/finding-hotspot.js.map +1 -0
  17. package/dist/commands/finding-recurrence.d.ts +5 -0
  18. package/dist/commands/finding-recurrence.d.ts.map +1 -0
  19. package/dist/commands/finding-recurrence.js +136 -0
  20. package/dist/commands/finding-recurrence.js.map +1 -0
  21. package/dist/commands/review-ab-test.d.ts +5 -0
  22. package/dist/commands/review-ab-test.d.ts.map +1 -0
  23. package/dist/commands/review-ab-test.js +225 -0
  24. package/dist/commands/review-ab-test.js.map +1 -0
  25. package/dist/commands/review-audit-log.d.ts +5 -0
  26. package/dist/commands/review-audit-log.d.ts.map +1 -0
  27. package/dist/commands/review-audit-log.js +140 -0
  28. package/dist/commands/review-audit-log.js.map +1 -0
  29. package/dist/commands/review-badge.d.ts +5 -0
  30. package/dist/commands/review-badge.d.ts.map +1 -0
  31. package/dist/commands/review-badge.js +153 -0
  32. package/dist/commands/review-badge.js.map +1 -0
  33. package/dist/commands/review-benchmark-self.d.ts +5 -0
  34. package/dist/commands/review-benchmark-self.d.ts.map +1 -0
  35. package/dist/commands/review-benchmark-self.js +141 -0
  36. package/dist/commands/review-benchmark-self.js.map +1 -0
  37. package/dist/commands/review-changelog-gen.d.ts +5 -0
  38. package/dist/commands/review-changelog-gen.d.ts.map +1 -0
  39. package/dist/commands/review-changelog-gen.js +118 -0
  40. package/dist/commands/review-changelog-gen.js.map +1 -0
  41. package/dist/commands/review-integration.d.ts +5 -0
  42. package/dist/commands/review-integration.d.ts.map +1 -0
  43. package/dist/commands/review-integration.js +237 -0
  44. package/dist/commands/review-integration.js.map +1 -0
  45. package/dist/commands/review-milestone.d.ts +5 -0
  46. package/dist/commands/review-milestone.d.ts.map +1 -0
  47. package/dist/commands/review-milestone.js +137 -0
  48. package/dist/commands/review-milestone.js.map +1 -0
  49. package/dist/commands/review-report-pdf.d.ts +5 -0
  50. package/dist/commands/review-report-pdf.d.ts.map +1 -0
  51. package/dist/commands/review-report-pdf.js +164 -0
  52. package/dist/commands/review-report-pdf.js.map +1 -0
  53. package/dist/commands/review-risk-score.d.ts +5 -0
  54. package/dist/commands/review-risk-score.d.ts.map +1 -0
  55. package/dist/commands/review-risk-score.js +157 -0
  56. package/dist/commands/review-risk-score.js.map +1 -0
  57. package/dist/commands/review-sandbox.d.ts +5 -0
  58. package/dist/commands/review-sandbox.d.ts.map +1 -0
  59. package/dist/commands/review-sandbox.js +192 -0
  60. package/dist/commands/review-sandbox.js.map +1 -0
  61. package/dist/commands/review-standup.d.ts +5 -0
  62. package/dist/commands/review-standup.d.ts.map +1 -0
  63. package/dist/commands/review-standup.js +96 -0
  64. package/dist/commands/review-standup.js.map +1 -0
  65. package/dist/commands/review-streak.d.ts +5 -0
  66. package/dist/commands/review-streak.d.ts.map +1 -0
  67. package/dist/commands/review-streak.js +151 -0
  68. package/dist/commands/review-streak.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Review-benchmark-self — Benchmark your review metrics against your own history.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const BENCHMARK_FILE = join(".judges", "self-benchmark.json");
8
+ function loadStore() {
9
+ if (!existsSync(BENCHMARK_FILE))
10
+ return { version: "1.0.0", snapshots: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(BENCHMARK_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", snapshots: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(BENCHMARK_FILE), { recursive: true });
20
+ writeFileSync(BENCHMARK_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── CLI ────────────────────────────────────────────────────────────────────
23
+ export function runReviewBenchmarkSelf(argv) {
24
+ if (argv.includes("--help") || argv.includes("-h")) {
25
+ console.log(`
26
+ judges review-benchmark-self — Benchmark against your own history
27
+
28
+ Usage:
29
+ judges review-benchmark-self show Show benchmarks
30
+ judges review-benchmark-self snapshot Take a snapshot
31
+ judges review-benchmark-self snapshot --score 8.5 --findings 3 --reviews 10
32
+ judges review-benchmark-self compare Compare latest vs baseline
33
+ judges review-benchmark-self clear Clear all data
34
+
35
+ Subcommands:
36
+ show Show all snapshots
37
+ snapshot Take a new snapshot
38
+ compare Compare latest to first (baseline)
39
+ clear Clear all data
40
+
41
+ Options:
42
+ --score <n> Average score
43
+ --findings <n> Total findings
44
+ --reviews <n> Number of reviews
45
+ --criticals <n> Critical finding count
46
+ --pass-rate <n> Pass rate percentage
47
+ --format json JSON output
48
+ --help, -h Show this help
49
+
50
+ Track your improvement over time. Data in .judges/self-benchmark.json.
51
+ `);
52
+ return;
53
+ }
54
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
55
+ const subcommand = argv.find((a) => ["show", "snapshot", "compare", "clear"].includes(a)) || "show";
56
+ const store = loadStore();
57
+ if (subcommand === "snapshot") {
58
+ const avgScore = parseFloat(argv.find((_a, i) => argv[i - 1] === "--score") || "0");
59
+ const totalFindings = parseInt(argv.find((_a, i) => argv[i - 1] === "--findings") || "0", 10);
60
+ const criticalCount = parseInt(argv.find((_a, i) => argv[i - 1] === "--criticals") || "0", 10);
61
+ const reviewCount = parseInt(argv.find((_a, i) => argv[i - 1] === "--reviews") || "0", 10);
62
+ const passRate = parseFloat(argv.find((_a, i) => argv[i - 1] === "--pass-rate") || "0");
63
+ store.snapshots.push({
64
+ date: new Date().toISOString().slice(0, 10),
65
+ avgScore,
66
+ totalFindings,
67
+ criticalCount,
68
+ reviewCount,
69
+ passRate,
70
+ });
71
+ saveStore(store);
72
+ console.log(`Snapshot recorded for ${new Date().toISOString().slice(0, 10)}.`);
73
+ return;
74
+ }
75
+ if (subcommand === "clear") {
76
+ saveStore({ version: "1.0.0", snapshots: [] });
77
+ console.log("Benchmark data cleared.");
78
+ return;
79
+ }
80
+ if (subcommand === "compare") {
81
+ if (store.snapshots.length < 2) {
82
+ console.log("Need at least 2 snapshots to compare. Take more snapshots first.");
83
+ return;
84
+ }
85
+ const baseline = store.snapshots[0];
86
+ const latest = store.snapshots[store.snapshots.length - 1];
87
+ if (format === "json") {
88
+ console.log(JSON.stringify({
89
+ baseline,
90
+ latest,
91
+ improvements: {
92
+ scoreDelta: latest.avgScore - baseline.avgScore,
93
+ findingDelta: latest.totalFindings - baseline.totalFindings,
94
+ passRateDelta: latest.passRate - baseline.passRate,
95
+ },
96
+ }, null, 2));
97
+ return;
98
+ }
99
+ console.log("\nSelf-Benchmark Comparison:");
100
+ console.log("─".repeat(55));
101
+ console.log(" Baseline Latest Delta");
102
+ console.log("─".repeat(55));
103
+ console.log(` Date: ${baseline.date.padEnd(17)}${latest.date}`);
104
+ const scoreDelta = latest.avgScore - baseline.avgScore;
105
+ const scoreSign = scoreDelta >= 0 ? "+" : "";
106
+ console.log(` Avg Score: ${baseline.avgScore.toFixed(1).padEnd(17)}${latest.avgScore.toFixed(1).padEnd(15)}${scoreSign}${scoreDelta.toFixed(1)}`);
107
+ const findingDelta = latest.totalFindings - baseline.totalFindings;
108
+ const findingSign = findingDelta <= 0 ? "" : "+";
109
+ console.log(` Findings: ${String(baseline.totalFindings).padEnd(17)}${String(latest.totalFindings).padEnd(15)}${findingSign}${findingDelta}`);
110
+ const passRateDelta = latest.passRate - baseline.passRate;
111
+ const passSign = passRateDelta >= 0 ? "+" : "";
112
+ console.log(` Pass Rate: ${(baseline.passRate.toFixed(1) + "%").padEnd(17)}${(latest.passRate.toFixed(1) + "%").padEnd(15)}${passSign}${passRateDelta.toFixed(1)}%`);
113
+ console.log("─".repeat(55));
114
+ if (scoreDelta > 0)
115
+ console.log(" Trend: Improving!");
116
+ else if (scoreDelta < 0)
117
+ console.log(" Trend: Declining — consider reviewing recent changes.");
118
+ else
119
+ console.log(" Trend: Stable");
120
+ console.log();
121
+ return;
122
+ }
123
+ // show
124
+ if (format === "json") {
125
+ console.log(JSON.stringify(store.snapshots, null, 2));
126
+ return;
127
+ }
128
+ if (store.snapshots.length === 0) {
129
+ console.log("No benchmarks recorded. Use 'judges review-benchmark-self snapshot' to start.");
130
+ return;
131
+ }
132
+ console.log("\nSelf-Benchmark History:");
133
+ console.log("─".repeat(65));
134
+ console.log(" Date Score Findings Criticals Reviews Pass Rate");
135
+ console.log("─".repeat(65));
136
+ for (const s of store.snapshots) {
137
+ console.log(` ${s.date} ${s.avgScore.toFixed(1).padEnd(8)}${String(s.totalFindings).padEnd(10)}${String(s.criticalCount).padEnd(11)}${String(s.reviewCount).padEnd(9)}${s.passRate.toFixed(1)}%`);
138
+ }
139
+ console.log("─".repeat(65));
140
+ }
141
+ //# sourceMappingURL=review-benchmark-self.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-benchmark-self.js","sourceRoot":"","sources":["../../src/commands/review-benchmark-self.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-changelog-gen — Auto-generate changelog entries from review findings and fixes.
3
+ */
4
+ export declare function runReviewChangelogGen(argv: string[]): void;
5
+ //# sourceMappingURL=review-changelog-gen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-changelog-gen.d.ts","sourceRoot":"","sources":["../../src/commands/review-changelog-gen.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgFH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgE1D"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Review-changelog-gen — Auto-generate changelog entries from review findings and fixes.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Generation ─────────────────────────────────────────────────────────────
7
+ function generateEntries(verdict) {
8
+ const entries = [];
9
+ const date = new Date().toISOString().slice(0, 10);
10
+ const ruleGroups = new Map();
11
+ for (const f of verdict.findings || []) {
12
+ const prefix = (f.ruleId || "UNKNOWN").split("-")[0];
13
+ const group = ruleGroups.get(prefix) || { rules: [], severity: String(f.severity || "medium"), count: 0 };
14
+ if (f.ruleId && !group.rules.includes(f.ruleId))
15
+ group.rules.push(f.ruleId);
16
+ group.count++;
17
+ ruleGroups.set(prefix, group);
18
+ }
19
+ for (const [prefix, group] of ruleGroups) {
20
+ const type = group.severity === "critical" || group.severity === "high" ? "security" : "improvement";
21
+ entries.push({
22
+ date,
23
+ type,
24
+ description: `Address ${group.count} ${prefix} finding(s) (${group.severity} severity)`,
25
+ ruleIds: group.rules,
26
+ });
27
+ }
28
+ return entries;
29
+ }
30
+ function formatMarkdown(entries, version) {
31
+ const lines = [];
32
+ lines.push(`## [${version}] — ${entries[0]?.date || new Date().toISOString().slice(0, 10)}`);
33
+ lines.push("");
34
+ const security = entries.filter((e) => e.type === "security");
35
+ const fixes = entries.filter((e) => e.type === "fix");
36
+ const improvements = entries.filter((e) => e.type === "improvement");
37
+ if (security.length > 0) {
38
+ lines.push("### Security");
39
+ for (const e of security) {
40
+ lines.push(`- ${e.description} (${e.ruleIds.join(", ")})`);
41
+ }
42
+ lines.push("");
43
+ }
44
+ if (fixes.length > 0) {
45
+ lines.push("### Fixed");
46
+ for (const e of fixes) {
47
+ lines.push(`- ${e.description} (${e.ruleIds.join(", ")})`);
48
+ }
49
+ lines.push("");
50
+ }
51
+ if (improvements.length > 0) {
52
+ lines.push("### Improved");
53
+ for (const e of improvements) {
54
+ lines.push(`- ${e.description} (${e.ruleIds.join(", ")})`);
55
+ }
56
+ lines.push("");
57
+ }
58
+ return lines.join("\n");
59
+ }
60
+ // ─── CLI ────────────────────────────────────────────────────────────────────
61
+ export function runReviewChangelogGen(argv) {
62
+ if (argv.includes("--help") || argv.includes("-h")) {
63
+ console.log(`
64
+ judges review-changelog-gen — Generate changelog entries from review findings
65
+
66
+ Usage:
67
+ judges review-changelog-gen --file verdict.json Generate from verdict
68
+ judges review-changelog-gen --file v.json --version 1.2.0 With version
69
+ judges review-changelog-gen --file v.json --output CHANGES.md Save to file
70
+
71
+ Options:
72
+ --file <path> Verdict JSON file
73
+ --version <ver> Version string (default: "Unreleased")
74
+ --output <path> Save output to file
75
+ --format json JSON output
76
+ --help, -h Show this help
77
+
78
+ Auto-generates changelog entries from review findings for documentation.
79
+ `);
80
+ return;
81
+ }
82
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
83
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
84
+ const version = argv.find((_a, i) => argv[i - 1] === "--version") || "Unreleased";
85
+ const output = argv.find((_a, i) => argv[i - 1] === "--output");
86
+ if (!file || !existsSync(file)) {
87
+ console.error("Error: --file with valid verdict JSON is required.");
88
+ process.exitCode = 1;
89
+ return;
90
+ }
91
+ let verdict;
92
+ try {
93
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
94
+ }
95
+ catch {
96
+ console.error("Error: Failed to parse verdict file.");
97
+ process.exitCode = 1;
98
+ return;
99
+ }
100
+ const entries = generateEntries(verdict);
101
+ if (entries.length === 0) {
102
+ console.log("No findings to generate changelog entries from.");
103
+ return;
104
+ }
105
+ if (format === "json") {
106
+ console.log(JSON.stringify(entries, null, 2));
107
+ return;
108
+ }
109
+ const md = formatMarkdown(entries, version);
110
+ if (output) {
111
+ mkdirSync(dirname(output), { recursive: true });
112
+ writeFileSync(output, md, "utf-8");
113
+ console.log(`Changelog entries saved to ${output}`);
114
+ return;
115
+ }
116
+ console.log(md);
117
+ }
118
+ //# sourceMappingURL=review-changelog-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-changelog-gen.js","sourceRoot":"","sources":["../../src/commands/review-changelog-gen.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-milestone — Track and celebrate review milestones.
3
+ */
4
+ export declare function runReviewMilestone(argv: string[]): void;
5
+ //# sourceMappingURL=review-milestone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-milestone.d.ts","sourceRoot":"","sources":["../../src/commands/review-milestone.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4EH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyFvD"}