@kevinrabun/judges 3.68.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 (38) hide show
  1. package/CHANGELOG.md +8 -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-fix-rate.d.ts +5 -0
  6. package/dist/commands/finding-fix-rate.d.ts.map +1 -0
  7. package/dist/commands/finding-fix-rate.js +142 -0
  8. package/dist/commands/finding-fix-rate.js.map +1 -0
  9. package/dist/commands/finding-recurrence.d.ts +5 -0
  10. package/dist/commands/finding-recurrence.d.ts.map +1 -0
  11. package/dist/commands/finding-recurrence.js +136 -0
  12. package/dist/commands/finding-recurrence.js.map +1 -0
  13. package/dist/commands/review-benchmark-self.d.ts +5 -0
  14. package/dist/commands/review-benchmark-self.d.ts.map +1 -0
  15. package/dist/commands/review-benchmark-self.js +141 -0
  16. package/dist/commands/review-benchmark-self.js.map +1 -0
  17. package/dist/commands/review-changelog-gen.d.ts +5 -0
  18. package/dist/commands/review-changelog-gen.d.ts.map +1 -0
  19. package/dist/commands/review-changelog-gen.js +118 -0
  20. package/dist/commands/review-changelog-gen.js.map +1 -0
  21. package/dist/commands/review-milestone.d.ts +5 -0
  22. package/dist/commands/review-milestone.d.ts.map +1 -0
  23. package/dist/commands/review-milestone.js +137 -0
  24. package/dist/commands/review-milestone.js.map +1 -0
  25. package/dist/commands/review-report-pdf.d.ts +5 -0
  26. package/dist/commands/review-report-pdf.d.ts.map +1 -0
  27. package/dist/commands/review-report-pdf.js +164 -0
  28. package/dist/commands/review-report-pdf.js.map +1 -0
  29. package/dist/commands/review-risk-score.d.ts +5 -0
  30. package/dist/commands/review-risk-score.d.ts.map +1 -0
  31. package/dist/commands/review-risk-score.js +157 -0
  32. package/dist/commands/review-risk-score.js.map +1 -0
  33. package/dist/commands/review-standup.d.ts +5 -0
  34. package/dist/commands/review-standup.d.ts.map +1 -0
  35. package/dist/commands/review-standup.js +96 -0
  36. package/dist/commands/review-standup.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Finding-fix-rate — Track how quickly findings are being resolved over time.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const FIX_RATE_FILE = join(".judges", "fix-rate.json");
8
+ function loadStore() {
9
+ if (!existsSync(FIX_RATE_FILE))
10
+ return { version: "1.0.0", events: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(FIX_RATE_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", events: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(FIX_RATE_FILE), { recursive: true });
20
+ writeFileSync(FIX_RATE_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── CLI ────────────────────────────────────────────────────────────────────
23
+ export function runFindingFixRate(argv) {
24
+ if (argv.includes("--help") || argv.includes("-h")) {
25
+ console.log(`
26
+ judges finding-fix-rate — Track finding resolution speed
27
+
28
+ Usage:
29
+ judges finding-fix-rate show Show fix rate metrics
30
+ judges finding-fix-rate record --rule SEC-001 --severity high --days 3
31
+ judges finding-fix-rate trend Show trend over time
32
+ judges finding-fix-rate clear Clear all data
33
+
34
+ Subcommands:
35
+ show Show fix rate summary
36
+ record Record a fix event
37
+ trend Show fix rate trends
38
+ clear Clear all data
39
+
40
+ Options:
41
+ --rule <ruleId> Rule ID of the fixed finding
42
+ --severity <level> Severity (critical, high, medium, low)
43
+ --days <n> Days to fix
44
+ --last <n> Show last N events (default: 20)
45
+ --format json JSON output
46
+ --help, -h Show this help
47
+
48
+ Tracks how quickly findings are resolved. Data in .judges/fix-rate.json.
49
+ `);
50
+ return;
51
+ }
52
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
53
+ const subcommand = argv.find((a) => ["show", "record", "trend", "clear"].includes(a)) || "show";
54
+ const store = loadStore();
55
+ if (subcommand === "record") {
56
+ const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule") || "UNKNOWN";
57
+ const severity = argv.find((_a, i) => argv[i - 1] === "--severity") || "medium";
58
+ const days = parseInt(argv.find((_a, i) => argv[i - 1] === "--days") || "1", 10);
59
+ const now = new Date();
60
+ const foundDate = new Date(now.getTime() - days * 86400000);
61
+ store.events.push({
62
+ ruleId,
63
+ severity,
64
+ foundAt: foundDate.toISOString(),
65
+ fixedAt: now.toISOString(),
66
+ daysToFix: days,
67
+ });
68
+ saveStore(store);
69
+ console.log(`Recorded fix: ${ruleId} (${severity}) resolved in ${days} day(s).`);
70
+ return;
71
+ }
72
+ if (subcommand === "clear") {
73
+ saveStore({ version: "1.0.0", events: [] });
74
+ console.log("Fix rate data cleared.");
75
+ return;
76
+ }
77
+ if (subcommand === "trend") {
78
+ if (store.events.length === 0) {
79
+ console.log("No fix events recorded yet.");
80
+ return;
81
+ }
82
+ // Group by month
83
+ const monthly = new Map();
84
+ for (const e of store.events) {
85
+ const month = e.fixedAt.slice(0, 7);
86
+ const list = monthly.get(month) || [];
87
+ list.push(e.daysToFix);
88
+ monthly.set(month, list);
89
+ }
90
+ if (format === "json") {
91
+ const trend = [...monthly.entries()].map(([month, days]) => ({
92
+ month,
93
+ avgDays: days.reduce((s, d) => s + d, 0) / days.length,
94
+ fixes: days.length,
95
+ }));
96
+ console.log(JSON.stringify(trend, null, 2));
97
+ return;
98
+ }
99
+ console.log("\nFix Rate Trend:");
100
+ console.log("─".repeat(50));
101
+ for (const [month, days] of monthly) {
102
+ const avg = days.reduce((s, d) => s + d, 0) / days.length;
103
+ const bar = "█".repeat(Math.min(Math.round(avg), 30));
104
+ console.log(` ${month} avg ${avg.toFixed(1)}d (${days.length} fixes) ${bar}`);
105
+ }
106
+ console.log("─".repeat(50));
107
+ return;
108
+ }
109
+ // show
110
+ if (store.events.length === 0) {
111
+ console.log("No fix events recorded. Use 'judges finding-fix-rate record' to track fixes.");
112
+ return;
113
+ }
114
+ const avgDays = store.events.reduce((s, e) => s + e.daysToFix, 0) / store.events.length;
115
+ const criticals = store.events.filter((e) => e.severity === "critical");
116
+ const avgCriticalDays = criticals.length > 0 ? criticals.reduce((s, e) => s + e.daysToFix, 0) / criticals.length : 0;
117
+ if (format === "json") {
118
+ console.log(JSON.stringify({
119
+ totalFixes: store.events.length,
120
+ avgDaysToFix: avgDays,
121
+ avgCriticalDaysToFix: avgCriticalDays,
122
+ bySeverity: {
123
+ critical: criticals.length,
124
+ high: store.events.filter((e) => e.severity === "high").length,
125
+ medium: store.events.filter((e) => e.severity === "medium").length,
126
+ low: store.events.filter((e) => e.severity === "low").length,
127
+ },
128
+ }, null, 2));
129
+ return;
130
+ }
131
+ console.log("\nFix Rate Summary:");
132
+ console.log("─".repeat(40));
133
+ console.log(` Total fixes: ${store.events.length}`);
134
+ console.log(` Avg days to fix: ${avgDays.toFixed(1)}`);
135
+ console.log(` Avg critical fix time: ${avgCriticalDays > 0 ? avgCriticalDays.toFixed(1) + "d" : "N/A"}`);
136
+ console.log(` Critical fixes: ${criticals.length}`);
137
+ console.log(` High fixes: ${store.events.filter((e) => e.severity === "high").length}`);
138
+ console.log(` Medium fixes: ${store.events.filter((e) => e.severity === "medium").length}`);
139
+ console.log(` Low fixes: ${store.events.filter((e) => e.severity === "low").length}`);
140
+ console.log("─".repeat(40));
141
+ }
142
+ //# sourceMappingURL=finding-fix-rate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-fix-rate.js","sourceRoot":"","sources":["../../src/commands/finding-fix-rate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-recurrence — Track findings that keep coming back after being fixed.
3
+ */
4
+ export declare function runFindingRecurrence(argv: string[]): void;
5
+ //# sourceMappingURL=finding-recurrence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-recurrence.d.ts","sourceRoot":"","sources":["../../src/commands/finding-recurrence.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+CH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsHzD"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Finding-recurrence — Track findings that keep coming back after being fixed.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const RECURRENCE_FILE = join(".judges", "finding-recurrence.json");
8
+ function loadStore() {
9
+ if (!existsSync(RECURRENCE_FILE))
10
+ return { version: "1.0.0", records: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(RECURRENCE_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", records: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(RECURRENCE_FILE), { recursive: true });
20
+ writeFileSync(RECURRENCE_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ function fingerprint(f) {
23
+ return [f.ruleId || "", f.title || "", String(f.severity || "")].join("|").toLowerCase();
24
+ }
25
+ // ─── CLI ────────────────────────────────────────────────────────────────────
26
+ export function runFindingRecurrence(argv) {
27
+ if (argv.includes("--help") || argv.includes("-h")) {
28
+ console.log(`
29
+ judges finding-recurrence — Track recurring findings
30
+
31
+ Usage:
32
+ judges finding-recurrence update --file verdict.json Update records
33
+ judges finding-recurrence show Show recurring findings
34
+ judges finding-recurrence show --min 3 Show findings with 3+ occurrences
35
+ judges finding-recurrence clear Clear all data
36
+
37
+ Subcommands:
38
+ update Update recurrence records from verdict
39
+ show Show recurring findings
40
+ clear Clear all data
41
+
42
+ Options:
43
+ --file <path> Verdict JSON file (for update)
44
+ --min <n> Minimum occurrences to show (default: 2)
45
+ --format json JSON output
46
+ --help, -h Show this help
47
+
48
+ Tracks findings that keep reappearing. Data in .judges/finding-recurrence.json.
49
+ `);
50
+ return;
51
+ }
52
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
53
+ const subcommand = argv.find((a) => ["update", "show", "clear"].includes(a)) || "show";
54
+ const store = loadStore();
55
+ if (subcommand === "update") {
56
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
57
+ if (!file || !existsSync(file)) {
58
+ console.error("Error: --file with valid verdict JSON is required.");
59
+ process.exitCode = 1;
60
+ return;
61
+ }
62
+ let verdict;
63
+ try {
64
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
65
+ }
66
+ catch {
67
+ console.error("Error: Failed to parse verdict file.");
68
+ process.exitCode = 1;
69
+ return;
70
+ }
71
+ const now = new Date().toISOString();
72
+ const seenFingerprints = new Set();
73
+ let newCount = 0;
74
+ let recurCount = 0;
75
+ for (const f of verdict.findings || []) {
76
+ const fp = fingerprint(f);
77
+ seenFingerprints.add(fp);
78
+ const existing = store.records.find((r) => r.fingerprint === fp);
79
+ if (existing) {
80
+ existing.occurrences++;
81
+ existing.lastSeen = now;
82
+ recurCount++;
83
+ }
84
+ else {
85
+ store.records.push({
86
+ fingerprint: fp,
87
+ ruleId: f.ruleId || "",
88
+ title: f.title || "",
89
+ occurrences: 1,
90
+ firstSeen: now,
91
+ lastSeen: now,
92
+ resolvedCount: 0,
93
+ });
94
+ newCount++;
95
+ }
96
+ }
97
+ // Mark resolved findings
98
+ for (const r of store.records) {
99
+ if (!seenFingerprints.has(r.fingerprint) && r.occurrences > 0) {
100
+ r.resolvedCount++;
101
+ }
102
+ }
103
+ saveStore(store);
104
+ console.log(`Updated: ${newCount} new, ${recurCount} recurring findings tracked.`);
105
+ return;
106
+ }
107
+ if (subcommand === "clear") {
108
+ saveStore({ version: "1.0.0", records: [] });
109
+ console.log("Recurrence data cleared.");
110
+ return;
111
+ }
112
+ // show
113
+ const minOccurrences = parseInt(argv.find((_a, i) => argv[i - 1] === "--min") || "2", 10);
114
+ const recurring = store.records.filter((r) => r.occurrences >= minOccurrences);
115
+ recurring.sort((a, b) => b.occurrences - a.occurrences);
116
+ if (format === "json") {
117
+ console.log(JSON.stringify(recurring, null, 2));
118
+ return;
119
+ }
120
+ if (recurring.length === 0) {
121
+ console.log(`No findings with ${minOccurrences}+ occurrences.`);
122
+ return;
123
+ }
124
+ console.log(`\nRecurring Findings (${minOccurrences}+ occurrences):`);
125
+ console.log("─".repeat(70));
126
+ console.log(" Occurrences Rule Title");
127
+ console.log("─".repeat(70));
128
+ for (const r of recurring.slice(0, 30)) {
129
+ console.log(` ${String(r.occurrences).padEnd(12)} ${(r.ruleId || "-").padEnd(13)} ${r.title.slice(0, 40)}`);
130
+ }
131
+ console.log("─".repeat(70));
132
+ console.log(` ${recurring.length} recurring finding(s) found`);
133
+ if (recurring.length > 30)
134
+ console.log(` (showing top 30 of ${recurring.length})`);
135
+ }
136
+ //# sourceMappingURL=finding-recurrence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-recurrence.js","sourceRoot":"","sources":["../../src/commands/finding-recurrence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-benchmark-self — Benchmark your review metrics against your own history.
3
+ */
4
+ export declare function runReviewBenchmarkSelf(argv: string[]): void;
5
+ //# sourceMappingURL=review-benchmark-self.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-benchmark-self.d.ts","sourceRoot":"","sources":["../../src/commands/review-benchmark-self.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyCH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+I3D"}
@@ -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-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"}