@kevinrabun/judges 3.65.0 → 3.67.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 +16 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +112 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/config-lint.d.ts +5 -0
- package/dist/commands/config-lint.d.ts.map +1 -0
- package/dist/commands/config-lint.js +188 -0
- package/dist/commands/config-lint.js.map +1 -0
- package/dist/commands/finding-age.d.ts +5 -0
- package/dist/commands/finding-age.d.ts.map +1 -0
- package/dist/commands/finding-age.js +146 -0
- package/dist/commands/finding-age.js.map +1 -0
- package/dist/commands/finding-rank.d.ts +5 -0
- package/dist/commands/finding-rank.d.ts.map +1 -0
- package/dist/commands/finding-rank.js +139 -0
- package/dist/commands/finding-rank.js.map +1 -0
- package/dist/commands/finding-timeline.d.ts +5 -0
- package/dist/commands/finding-timeline.d.ts.map +1 -0
- package/dist/commands/finding-timeline.js +144 -0
- package/dist/commands/finding-timeline.js.map +1 -0
- package/dist/commands/fix-verify.d.ts +5 -0
- package/dist/commands/fix-verify.d.ts.map +1 -0
- package/dist/commands/fix-verify.js +124 -0
- package/dist/commands/fix-verify.js.map +1 -0
- package/dist/commands/review-comment.d.ts +5 -0
- package/dist/commands/review-comment.d.ts.map +1 -0
- package/dist/commands/review-comment.js +166 -0
- package/dist/commands/review-comment.js.map +1 -0
- package/dist/commands/review-dashboard.d.ts +5 -0
- package/dist/commands/review-dashboard.d.ts.map +1 -0
- package/dist/commands/review-dashboard.js +141 -0
- package/dist/commands/review-dashboard.js.map +1 -0
- package/dist/commands/review-diff-summary.d.ts +5 -0
- package/dist/commands/review-diff-summary.d.ts.map +1 -0
- package/dist/commands/review-diff-summary.js +155 -0
- package/dist/commands/review-diff-summary.js.map +1 -0
- package/dist/commands/review-export.d.ts +5 -0
- package/dist/commands/review-export.d.ts.map +1 -0
- package/dist/commands/review-export.js +180 -0
- package/dist/commands/review-export.js.map +1 -0
- package/dist/commands/review-notify.d.ts +5 -0
- package/dist/commands/review-notify.d.ts.map +1 -0
- package/dist/commands/review-notify.js +144 -0
- package/dist/commands/review-notify.js.map +1 -0
- package/dist/commands/review-offline.d.ts +5 -0
- package/dist/commands/review-offline.d.ts.map +1 -0
- package/dist/commands/review-offline.js +126 -0
- package/dist/commands/review-offline.js.map +1 -0
- package/dist/commands/review-quota.d.ts +5 -0
- package/dist/commands/review-quota.d.ts.map +1 -0
- package/dist/commands/review-quota.js +127 -0
- package/dist/commands/review-quota.js.map +1 -0
- package/dist/commands/review-schedule.d.ts +5 -0
- package/dist/commands/review-schedule.d.ts.map +1 -0
- package/dist/commands/review-schedule.js +170 -0
- package/dist/commands/review-schedule.js.map +1 -0
- package/dist/commands/review-scope.d.ts +5 -0
- package/dist/commands/review-scope.d.ts.map +1 -0
- package/dist/commands/review-scope.js +198 -0
- package/dist/commands/review-scope.js.map +1 -0
- package/dist/commands/rule-catalog.d.ts +5 -0
- package/dist/commands/rule-catalog.d.ts.map +1 -0
- package/dist/commands/rule-catalog.js +129 -0
- package/dist/commands/rule-catalog.js.map +1 -0
- package/dist/commands/setup-wizard.d.ts +5 -0
- package/dist/commands/setup-wizard.d.ts.map +1 -0
- package/dist/commands/setup-wizard.js +175 -0
- package/dist/commands/setup-wizard.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-offline — Offline mode support for air-gapped environments.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
5
|
+
import { join, dirname } from "path";
|
|
6
|
+
// ─── Storage ────────────────────────────────────────────────────────────────
|
|
7
|
+
const OFFLINE_DIR = join(".judges", "offline");
|
|
8
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
9
|
+
export function runReviewOffline(argv) {
|
|
10
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
11
|
+
console.log(`
|
|
12
|
+
judges review-offline — Offline mode support
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
judges review-offline status Check offline readiness
|
|
16
|
+
judges review-offline prepare Prepare for offline use
|
|
17
|
+
judges review-offline bundle --output bundle.json Create offline bundle
|
|
18
|
+
judges review-offline verify Verify offline bundle
|
|
19
|
+
|
|
20
|
+
Subcommands:
|
|
21
|
+
status Check if judges can run offline
|
|
22
|
+
prepare Cache required data for offline use
|
|
23
|
+
bundle Create a portable offline bundle
|
|
24
|
+
verify Verify offline setup is complete
|
|
25
|
+
|
|
26
|
+
Options:
|
|
27
|
+
--output <path> Output path for bundle
|
|
28
|
+
--format json JSON output
|
|
29
|
+
--help, -h Show this help
|
|
30
|
+
|
|
31
|
+
Judges runs entirely locally without network access.
|
|
32
|
+
This command helps verify and document offline capabilities.
|
|
33
|
+
`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
37
|
+
const subcommand = argv.find((a) => ["status", "prepare", "bundle", "verify"].includes(a)) || "status";
|
|
38
|
+
if (subcommand === "prepare") {
|
|
39
|
+
mkdirSync(OFFLINE_DIR, { recursive: true });
|
|
40
|
+
// Snapshot current config if it exists
|
|
41
|
+
const rcPath = ".judgesrc";
|
|
42
|
+
let config = {};
|
|
43
|
+
if (existsSync(rcPath)) {
|
|
44
|
+
try {
|
|
45
|
+
config = JSON.parse(readFileSync(rcPath, "utf-8"));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
/* skip */
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const manifest = {
|
|
52
|
+
version: "1.0.0",
|
|
53
|
+
createdAt: new Date().toISOString(),
|
|
54
|
+
includes: ["judges-cli", "all-judges", "config"],
|
|
55
|
+
configSnapshot: config,
|
|
56
|
+
};
|
|
57
|
+
writeFileSync(join(OFFLINE_DIR, "manifest.json"), JSON.stringify(manifest, null, 2), "utf-8");
|
|
58
|
+
console.log("Offline preparation complete. Manifest written to .judges/offline/manifest.json");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (subcommand === "bundle") {
|
|
62
|
+
const output = argv.find((_a, i) => argv[i - 1] === "--output") || join(OFFLINE_DIR, "bundle.json");
|
|
63
|
+
const rcPath = ".judgesrc";
|
|
64
|
+
let config = {};
|
|
65
|
+
if (existsSync(rcPath)) {
|
|
66
|
+
try {
|
|
67
|
+
config = JSON.parse(readFileSync(rcPath, "utf-8"));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
/* skip */
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const bundle = {
|
|
74
|
+
version: "1.0.0",
|
|
75
|
+
createdAt: new Date().toISOString(),
|
|
76
|
+
includes: ["judges-cli", "all-judges", "config", "rules"],
|
|
77
|
+
configSnapshot: config,
|
|
78
|
+
};
|
|
79
|
+
mkdirSync(dirname(output), { recursive: true });
|
|
80
|
+
writeFileSync(output, JSON.stringify(bundle, null, 2), "utf-8");
|
|
81
|
+
console.log(`Offline bundle written to ${output}`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (subcommand === "verify") {
|
|
85
|
+
const manifestPath = join(OFFLINE_DIR, "manifest.json");
|
|
86
|
+
const checks = [
|
|
87
|
+
{ name: "CLI installed", ok: true },
|
|
88
|
+
{ name: "Judges available", ok: true },
|
|
89
|
+
{ name: "Offline manifest", ok: existsSync(manifestPath) },
|
|
90
|
+
{ name: "Config present", ok: existsSync(".judgesrc") },
|
|
91
|
+
];
|
|
92
|
+
if (format === "json") {
|
|
93
|
+
console.log(JSON.stringify({ checks, allPassed: checks.every((c) => c.ok) }, null, 2));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
console.log("\n Offline Verification\n ─────────────────────────────");
|
|
97
|
+
for (const check of checks) {
|
|
98
|
+
console.log(` ${check.ok ? "✅" : "❌"} ${check.name}`);
|
|
99
|
+
}
|
|
100
|
+
const allOk = checks.every((c) => c.ok);
|
|
101
|
+
console.log(`\n ${allOk ? "✅ Ready for offline use" : "⚠️ Some checks failed — run 'judges review-offline prepare'"}`);
|
|
102
|
+
console.log();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Status
|
|
106
|
+
const capabilities = {
|
|
107
|
+
localExecution: true,
|
|
108
|
+
noNetworkRequired: true,
|
|
109
|
+
allJudgesLocal: true,
|
|
110
|
+
configLocal: existsSync(".judgesrc"),
|
|
111
|
+
offlinePrepared: existsSync(join(OFFLINE_DIR, "manifest.json")),
|
|
112
|
+
};
|
|
113
|
+
if (format === "json") {
|
|
114
|
+
console.log(JSON.stringify(capabilities, null, 2));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
console.log("\n Offline Mode Status\n ═════════════════════════════");
|
|
118
|
+
console.log(` Local execution: ✅ All analysis runs locally`);
|
|
119
|
+
console.log(` Network required: ❌ No network access needed`);
|
|
120
|
+
console.log(` All judges local: ✅ All ${45}+ judges are bundled`);
|
|
121
|
+
console.log(` Config present: ${capabilities.configLocal ? "✅" : "⚠️ No .judgesrc found"}`);
|
|
122
|
+
console.log(` Offline prepared: ${capabilities.offlinePrepared ? "✅" : "⚠️ Run 'judges review-offline prepare'"}`);
|
|
123
|
+
console.log(`\n Judges is designed for fully offline, air-gapped operation.`);
|
|
124
|
+
console.log(` No data is sent externally — all processing is local.\n`);
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=review-offline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-offline.js","sourceRoot":"","sources":["../../src/commands/review-offline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-quota.d.ts","sourceRoot":"","sources":["../../src/commands/review-quota.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiDH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqHnD"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-quota — Track review usage quotas locally.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
5
|
+
import { join, dirname } from "path";
|
|
6
|
+
// ─── Storage ────────────────────────────────────────────────────────────────
|
|
7
|
+
const QUOTA_FILE = join(".judges", "review-quota.json");
|
|
8
|
+
function loadQuota() {
|
|
9
|
+
if (!existsSync(QUOTA_FILE))
|
|
10
|
+
return { version: "1.0.0", dailyLimit: 100, monthlyLimit: 3000, usage: [] };
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(readFileSync(QUOTA_FILE, "utf-8"));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return { version: "1.0.0", dailyLimit: 100, monthlyLimit: 3000, usage: [] };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function saveQuota(store) {
|
|
19
|
+
mkdirSync(dirname(QUOTA_FILE), { recursive: true });
|
|
20
|
+
writeFileSync(QUOTA_FILE, JSON.stringify(store, null, 2), "utf-8");
|
|
21
|
+
}
|
|
22
|
+
function today() {
|
|
23
|
+
return new Date().toISOString().slice(0, 10);
|
|
24
|
+
}
|
|
25
|
+
function thisMonth() {
|
|
26
|
+
return new Date().toISOString().slice(0, 7);
|
|
27
|
+
}
|
|
28
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
29
|
+
export function runReviewQuota(argv) {
|
|
30
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
31
|
+
console.log(`
|
|
32
|
+
judges review-quota — Track review usage quotas
|
|
33
|
+
|
|
34
|
+
Usage:
|
|
35
|
+
judges review-quota show Show current usage
|
|
36
|
+
judges review-quota record --files 5 --findings 12 Record usage
|
|
37
|
+
judges review-quota set --daily 200 --monthly 5000 Set limits
|
|
38
|
+
judges review-quota reset Reset usage data
|
|
39
|
+
|
|
40
|
+
Subcommands:
|
|
41
|
+
show Show current usage and quotas
|
|
42
|
+
record Record a review session
|
|
43
|
+
set Set daily/monthly limits
|
|
44
|
+
reset Reset all usage data
|
|
45
|
+
|
|
46
|
+
Options:
|
|
47
|
+
--files <n> Number of files reviewed
|
|
48
|
+
--findings <n> Number of findings generated
|
|
49
|
+
--daily <n> Daily review limit
|
|
50
|
+
--monthly <n> Monthly review limit
|
|
51
|
+
--format json JSON output
|
|
52
|
+
--help, -h Show this help
|
|
53
|
+
|
|
54
|
+
Quotas are tracked locally in .judges/review-quota.json.
|
|
55
|
+
`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
59
|
+
const subcommand = argv.find((a) => ["show", "record", "set", "reset"].includes(a)) || "show";
|
|
60
|
+
const store = loadQuota();
|
|
61
|
+
if (subcommand === "record") {
|
|
62
|
+
const files = parseInt(argv.find((_a, i) => argv[i - 1] === "--files") || "1", 10);
|
|
63
|
+
const findings = parseInt(argv.find((_a, i) => argv[i - 1] === "--findings") || "0", 10);
|
|
64
|
+
const todayStr = today();
|
|
65
|
+
const existing = store.usage.find((u) => u.date === todayStr);
|
|
66
|
+
if (existing) {
|
|
67
|
+
existing.reviewCount++;
|
|
68
|
+
existing.filesReviewed += files;
|
|
69
|
+
existing.findingsGenerated += findings;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
store.usage.push({ date: todayStr, reviewCount: 1, filesReviewed: files, findingsGenerated: findings });
|
|
73
|
+
}
|
|
74
|
+
saveQuota(store);
|
|
75
|
+
console.log(`Recorded: ${files} files, ${findings} findings.`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (subcommand === "set") {
|
|
79
|
+
const daily = argv.find((_a, i) => argv[i - 1] === "--daily");
|
|
80
|
+
const monthly = argv.find((_a, i) => argv[i - 1] === "--monthly");
|
|
81
|
+
if (daily)
|
|
82
|
+
store.dailyLimit = parseInt(daily, 10);
|
|
83
|
+
if (monthly)
|
|
84
|
+
store.monthlyLimit = parseInt(monthly, 10);
|
|
85
|
+
saveQuota(store);
|
|
86
|
+
console.log(`Limits set — daily: ${store.dailyLimit}, monthly: ${store.monthlyLimit}`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (subcommand === "reset") {
|
|
90
|
+
store.usage = [];
|
|
91
|
+
saveQuota(store);
|
|
92
|
+
console.log("Usage data reset.");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Show
|
|
96
|
+
const todayStr = today();
|
|
97
|
+
const monthStr = thisMonth();
|
|
98
|
+
const todayUsage = store.usage.find((u) => u.date === todayStr);
|
|
99
|
+
const dailyReviews = todayUsage ? todayUsage.reviewCount : 0;
|
|
100
|
+
const monthlyReviews = store.usage
|
|
101
|
+
.filter((u) => u.date.startsWith(monthStr))
|
|
102
|
+
.reduce((sum, u) => sum + u.reviewCount, 0);
|
|
103
|
+
const dailyPct = store.dailyLimit > 0 ? Math.round((dailyReviews / store.dailyLimit) * 100) : 0;
|
|
104
|
+
const monthlyPct = store.monthlyLimit > 0 ? Math.round((monthlyReviews / store.monthlyLimit) * 100) : 0;
|
|
105
|
+
if (format === "json") {
|
|
106
|
+
console.log(JSON.stringify({
|
|
107
|
+
daily: { used: dailyReviews, limit: store.dailyLimit, percent: dailyPct },
|
|
108
|
+
monthly: { used: monthlyReviews, limit: store.monthlyLimit, percent: monthlyPct },
|
|
109
|
+
today: todayUsage || null,
|
|
110
|
+
}, null, 2));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const dailyBar = "█".repeat(Math.min(Math.round(dailyPct / 5), 20)) + "░".repeat(Math.max(20 - Math.round(dailyPct / 5), 0));
|
|
114
|
+
const monthlyBar = "█".repeat(Math.min(Math.round(monthlyPct / 5), 20)) + "░".repeat(Math.max(20 - Math.round(monthlyPct / 5), 0));
|
|
115
|
+
console.log(`\n Review Quota\n ═════════════════════════════`);
|
|
116
|
+
console.log(` Daily: ${dailyBar} ${dailyReviews}/${store.dailyLimit} (${dailyPct}%)`);
|
|
117
|
+
console.log(` Monthly: ${monthlyBar} ${monthlyReviews}/${store.monthlyLimit} (${monthlyPct}%)`);
|
|
118
|
+
if (todayUsage) {
|
|
119
|
+
console.log(`\n Today: ${todayUsage.reviewCount} reviews, ${todayUsage.filesReviewed} files, ${todayUsage.findingsGenerated} findings`);
|
|
120
|
+
}
|
|
121
|
+
if (dailyPct >= 90)
|
|
122
|
+
console.log("\n ⚠️ Approaching daily limit!");
|
|
123
|
+
if (monthlyPct >= 90)
|
|
124
|
+
console.log(" ⚠️ Approaching monthly limit!");
|
|
125
|
+
console.log();
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=review-quota.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-quota.js","sourceRoot":"","sources":["../../src/commands/review-quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-schedule.d.ts","sourceRoot":"","sources":["../../src/commands/review-schedule.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsItD"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-schedule — Configure scheduled review cadences (stored locally).
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
5
|
+
import { join, dirname } from "path";
|
|
6
|
+
// ─── Storage ────────────────────────────────────────────────────────────────
|
|
7
|
+
const SCHEDULE_FILE = join(".judges", "schedules.json");
|
|
8
|
+
function loadSchedules() {
|
|
9
|
+
if (!existsSync(SCHEDULE_FILE))
|
|
10
|
+
return { version: "1.0.0", schedules: [] };
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(readFileSync(SCHEDULE_FILE, "utf-8"));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return { version: "1.0.0", schedules: [] };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function saveSchedules(store) {
|
|
19
|
+
mkdirSync(dirname(SCHEDULE_FILE), { recursive: true });
|
|
20
|
+
writeFileSync(SCHEDULE_FILE, JSON.stringify(store, null, 2), "utf-8");
|
|
21
|
+
}
|
|
22
|
+
// ─── Cron generation ────────────────────────────────────────────────────────
|
|
23
|
+
function generateCiConfig(schedule, ci) {
|
|
24
|
+
if (ci === "github-actions") {
|
|
25
|
+
return `# ${schedule.name}: ${schedule.description}
|
|
26
|
+
name: Scheduled Review - ${schedule.name}
|
|
27
|
+
on:
|
|
28
|
+
schedule:
|
|
29
|
+
- cron: '${schedule.cron}'
|
|
30
|
+
workflow_dispatch:
|
|
31
|
+
|
|
32
|
+
jobs:
|
|
33
|
+
review:
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@v4
|
|
37
|
+
- uses: actions/setup-node@v4
|
|
38
|
+
with:
|
|
39
|
+
node-version: '20'
|
|
40
|
+
- run: npx @kevinrabun/judges ${schedule.command}
|
|
41
|
+
`;
|
|
42
|
+
}
|
|
43
|
+
// Generic
|
|
44
|
+
return `# Schedule: ${schedule.name}\n# Cron: ${schedule.cron}\n# Command: judges ${schedule.command}`;
|
|
45
|
+
}
|
|
46
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
47
|
+
export function runReviewSchedule(argv) {
|
|
48
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
49
|
+
console.log(`
|
|
50
|
+
judges review-schedule — Configure scheduled review cadences
|
|
51
|
+
|
|
52
|
+
Usage:
|
|
53
|
+
judges review-schedule list List schedules
|
|
54
|
+
judges review-schedule add --name daily --cron "0 8 * * *" --command "eval src/"
|
|
55
|
+
judges review-schedule remove --id sched-xxx Remove a schedule
|
|
56
|
+
judges review-schedule enable --id sched-xxx Enable a schedule
|
|
57
|
+
judges review-schedule disable --id sched-xxx Disable a schedule
|
|
58
|
+
judges review-schedule generate --id sched-xxx --ci github-actions
|
|
59
|
+
|
|
60
|
+
Subcommands:
|
|
61
|
+
list List all configured schedules
|
|
62
|
+
add Add a new scheduled review
|
|
63
|
+
remove Remove a schedule
|
|
64
|
+
enable Enable a schedule
|
|
65
|
+
disable Disable a schedule
|
|
66
|
+
generate Generate CI configuration for a schedule
|
|
67
|
+
|
|
68
|
+
Options:
|
|
69
|
+
--name <name> Schedule name
|
|
70
|
+
--cron <expr> Cron expression
|
|
71
|
+
--command <cmd> Judges command to run
|
|
72
|
+
--id <id> Schedule ID
|
|
73
|
+
--ci <type> CI system (github-actions)
|
|
74
|
+
--description <text> Description
|
|
75
|
+
--format json JSON output
|
|
76
|
+
--help, -h Show this help
|
|
77
|
+
|
|
78
|
+
Schedules are stored locally in .judges/schedules.json.
|
|
79
|
+
Use 'generate' to create CI workflow files for automated execution.
|
|
80
|
+
`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
84
|
+
const subcommand = argv.find((a) => ["list", "add", "remove", "enable", "disable", "generate"].includes(a)) || "list";
|
|
85
|
+
const store = loadSchedules();
|
|
86
|
+
if (subcommand === "add") {
|
|
87
|
+
const name = argv.find((_a, i) => argv[i - 1] === "--name") || `schedule-${store.schedules.length + 1}`;
|
|
88
|
+
const cron = argv.find((_a, i) => argv[i - 1] === "--cron") || "0 8 * * 1-5";
|
|
89
|
+
const command = argv.find((_a, i) => argv[i - 1] === "--command") || "eval .";
|
|
90
|
+
const description = argv.find((_a, i) => argv[i - 1] === "--description") || "";
|
|
91
|
+
const entry = {
|
|
92
|
+
id: `sched-${Date.now().toString(36)}`,
|
|
93
|
+
name,
|
|
94
|
+
cron,
|
|
95
|
+
command,
|
|
96
|
+
enabled: true,
|
|
97
|
+
createdAt: new Date().toISOString(),
|
|
98
|
+
lastRun: "",
|
|
99
|
+
description,
|
|
100
|
+
};
|
|
101
|
+
store.schedules.push(entry);
|
|
102
|
+
saveSchedules(store);
|
|
103
|
+
console.log(`Added schedule '${name}' (${entry.id}) — cron: ${cron}`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (subcommand === "remove") {
|
|
107
|
+
const id = argv.find((_a, i) => argv[i - 1] === "--id");
|
|
108
|
+
if (!id) {
|
|
109
|
+
console.error("Error: --id is required.");
|
|
110
|
+
process.exitCode = 1;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
store.schedules = store.schedules.filter((s) => s.id !== id);
|
|
114
|
+
saveSchedules(store);
|
|
115
|
+
console.log(`Removed schedule '${id}'.`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (subcommand === "enable" || subcommand === "disable") {
|
|
119
|
+
const id = argv.find((_a, i) => argv[i - 1] === "--id");
|
|
120
|
+
if (!id) {
|
|
121
|
+
console.error("Error: --id is required.");
|
|
122
|
+
process.exitCode = 1;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const entry = store.schedules.find((s) => s.id === id);
|
|
126
|
+
if (!entry) {
|
|
127
|
+
console.error(`Error: Schedule '${id}' not found.`);
|
|
128
|
+
process.exitCode = 1;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
entry.enabled = subcommand === "enable";
|
|
132
|
+
saveSchedules(store);
|
|
133
|
+
console.log(`Schedule '${id}' ${subcommand}d.`);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (subcommand === "generate") {
|
|
137
|
+
const id = argv.find((_a, i) => argv[i - 1] === "--id");
|
|
138
|
+
const ci = argv.find((_a, i) => argv[i - 1] === "--ci") || "github-actions";
|
|
139
|
+
if (!id) {
|
|
140
|
+
console.error("Error: --id is required.");
|
|
141
|
+
process.exitCode = 1;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const entry = store.schedules.find((s) => s.id === id);
|
|
145
|
+
if (!entry) {
|
|
146
|
+
console.error(`Error: Schedule '${id}' not found.`);
|
|
147
|
+
process.exitCode = 1;
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
console.log(generateCiConfig(entry, ci));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// List
|
|
154
|
+
if (format === "json") {
|
|
155
|
+
console.log(JSON.stringify(store, null, 2));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
console.log(`\n Review Schedules (${store.schedules.length})\n ═════════════════════════════`);
|
|
159
|
+
if (store.schedules.length === 0) {
|
|
160
|
+
console.log(' No schedules. Add one with: judges review-schedule add --name daily --cron "0 8 * * *"');
|
|
161
|
+
}
|
|
162
|
+
for (const s of store.schedules) {
|
|
163
|
+
const status = s.enabled ? "✅" : "⏸️";
|
|
164
|
+
console.log(` ${status} ${s.id} — ${s.name} (${s.cron}) command: ${s.command}`);
|
|
165
|
+
if (s.description)
|
|
166
|
+
console.log(` ${s.description}`);
|
|
167
|
+
}
|
|
168
|
+
console.log();
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=review-schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-schedule.js","sourceRoot":"","sources":["../../src/commands/review-schedule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-scope.d.ts","sourceRoot":"","sources":["../../src/commands/review-scope.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6DH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6JnD"}
|