@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,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-scope — Define and manage review scope boundaries.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
5
|
+
import { join, dirname } from "path";
|
|
6
|
+
// ─── Storage ────────────────────────────────────────────────────────────────
|
|
7
|
+
const SCOPE_FILE = join(".judges", "review-scope.json");
|
|
8
|
+
function loadScope() {
|
|
9
|
+
if (!existsSync(SCOPE_FILE)) {
|
|
10
|
+
return {
|
|
11
|
+
version: "1.0.0",
|
|
12
|
+
name: "default",
|
|
13
|
+
include: ["**/*"],
|
|
14
|
+
exclude: ["node_modules/**", "dist/**", ".git/**", "*.min.js", "*.min.css"],
|
|
15
|
+
languages: [],
|
|
16
|
+
maxFileSize: 500000,
|
|
17
|
+
maxFiles: 1000,
|
|
18
|
+
focusDirs: [],
|
|
19
|
+
ignoreDirs: ["node_modules", "dist", ".git", "vendor", "build", "coverage"],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(readFileSync(SCOPE_FILE, "utf-8"));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return {
|
|
27
|
+
version: "1.0.0",
|
|
28
|
+
name: "default",
|
|
29
|
+
include: ["**/*"],
|
|
30
|
+
exclude: [],
|
|
31
|
+
languages: [],
|
|
32
|
+
maxFileSize: 500000,
|
|
33
|
+
maxFiles: 1000,
|
|
34
|
+
focusDirs: [],
|
|
35
|
+
ignoreDirs: [],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function saveScope(config) {
|
|
40
|
+
mkdirSync(dirname(SCOPE_FILE), { recursive: true });
|
|
41
|
+
writeFileSync(SCOPE_FILE, JSON.stringify(config, null, 2), "utf-8");
|
|
42
|
+
}
|
|
43
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
44
|
+
export function runReviewScope(argv) {
|
|
45
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
46
|
+
console.log(`
|
|
47
|
+
judges review-scope — Define review scope boundaries
|
|
48
|
+
|
|
49
|
+
Usage:
|
|
50
|
+
judges review-scope show Show current scope
|
|
51
|
+
judges review-scope set --name production Set scope name
|
|
52
|
+
judges review-scope include --pattern "src/**" Add include pattern
|
|
53
|
+
judges review-scope exclude --pattern "test/**" Add exclude pattern
|
|
54
|
+
judges review-scope focus --dir src/core Add focus directory
|
|
55
|
+
judges review-scope ignore --dir vendor Add ignore directory
|
|
56
|
+
judges review-scope language --add python Add language filter
|
|
57
|
+
judges review-scope reset Reset to defaults
|
|
58
|
+
|
|
59
|
+
Subcommands:
|
|
60
|
+
show Show current scope configuration
|
|
61
|
+
set Set a scope property
|
|
62
|
+
include Add include pattern
|
|
63
|
+
exclude Add exclude pattern
|
|
64
|
+
focus Add focus directory
|
|
65
|
+
ignore Add ignore directory
|
|
66
|
+
language Manage language filters
|
|
67
|
+
reset Reset to default scope
|
|
68
|
+
|
|
69
|
+
Options:
|
|
70
|
+
--pattern <glob> Glob pattern (for include/exclude)
|
|
71
|
+
--dir <path> Directory (for focus/ignore)
|
|
72
|
+
--name <name> Scope name
|
|
73
|
+
--add <lang> Add language filter
|
|
74
|
+
--remove <lang> Remove language filter
|
|
75
|
+
--max-size <bytes> Maximum file size to review
|
|
76
|
+
--max-files <n> Maximum number of files
|
|
77
|
+
--format json JSON output
|
|
78
|
+
--help, -h Show this help
|
|
79
|
+
|
|
80
|
+
Scope configuration is stored in .judges/review-scope.json.
|
|
81
|
+
`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
85
|
+
const subcommand = argv.find((a) => ["show", "set", "include", "exclude", "focus", "ignore", "language", "reset"].includes(a)) ||
|
|
86
|
+
"show";
|
|
87
|
+
const config = loadScope();
|
|
88
|
+
if (subcommand === "reset") {
|
|
89
|
+
const defaults = loadScope();
|
|
90
|
+
defaults.include = ["**/*"];
|
|
91
|
+
defaults.exclude = ["node_modules/**", "dist/**", ".git/**", "*.min.js", "*.min.css"];
|
|
92
|
+
defaults.languages = [];
|
|
93
|
+
defaults.focusDirs = [];
|
|
94
|
+
defaults.ignoreDirs = ["node_modules", "dist", ".git", "vendor", "build", "coverage"];
|
|
95
|
+
saveScope(defaults);
|
|
96
|
+
console.log("Scope reset to defaults.");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (subcommand === "set") {
|
|
100
|
+
const name = argv.find((_a, i) => argv[i - 1] === "--name");
|
|
101
|
+
const maxSize = argv.find((_a, i) => argv[i - 1] === "--max-size");
|
|
102
|
+
const maxFiles = argv.find((_a, i) => argv[i - 1] === "--max-files");
|
|
103
|
+
if (name)
|
|
104
|
+
config.name = name;
|
|
105
|
+
if (maxSize)
|
|
106
|
+
config.maxFileSize = parseInt(maxSize, 10);
|
|
107
|
+
if (maxFiles)
|
|
108
|
+
config.maxFiles = parseInt(maxFiles, 10);
|
|
109
|
+
saveScope(config);
|
|
110
|
+
console.log("Scope updated.");
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (subcommand === "include") {
|
|
114
|
+
const pattern = argv.find((_a, i) => argv[i - 1] === "--pattern");
|
|
115
|
+
if (pattern && !config.include.includes(pattern)) {
|
|
116
|
+
config.include.push(pattern);
|
|
117
|
+
saveScope(config);
|
|
118
|
+
console.log(`Added include pattern: ${pattern}`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.error("Error: --pattern is required.");
|
|
122
|
+
process.exitCode = 1;
|
|
123
|
+
}
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (subcommand === "exclude") {
|
|
127
|
+
const pattern = argv.find((_a, i) => argv[i - 1] === "--pattern");
|
|
128
|
+
if (pattern && !config.exclude.includes(pattern)) {
|
|
129
|
+
config.exclude.push(pattern);
|
|
130
|
+
saveScope(config);
|
|
131
|
+
console.log(`Added exclude pattern: ${pattern}`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.error("Error: --pattern is required.");
|
|
135
|
+
process.exitCode = 1;
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (subcommand === "focus") {
|
|
140
|
+
const dir = argv.find((_a, i) => argv[i - 1] === "--dir");
|
|
141
|
+
if (dir && !config.focusDirs.includes(dir)) {
|
|
142
|
+
config.focusDirs.push(dir);
|
|
143
|
+
saveScope(config);
|
|
144
|
+
console.log(`Added focus directory: ${dir}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.error("Error: --dir is required.");
|
|
148
|
+
process.exitCode = 1;
|
|
149
|
+
}
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (subcommand === "ignore") {
|
|
153
|
+
const dir = argv.find((_a, i) => argv[i - 1] === "--dir");
|
|
154
|
+
if (dir && !config.ignoreDirs.includes(dir)) {
|
|
155
|
+
config.ignoreDirs.push(dir);
|
|
156
|
+
saveScope(config);
|
|
157
|
+
console.log(`Added ignore directory: ${dir}`);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
console.error("Error: --dir is required.");
|
|
161
|
+
process.exitCode = 1;
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (subcommand === "language") {
|
|
166
|
+
const add = argv.find((_a, i) => argv[i - 1] === "--add");
|
|
167
|
+
const remove = argv.find((_a, i) => argv[i - 1] === "--remove");
|
|
168
|
+
if (add && !config.languages.includes(add)) {
|
|
169
|
+
config.languages.push(add);
|
|
170
|
+
saveScope(config);
|
|
171
|
+
console.log(`Added language filter: ${add}`);
|
|
172
|
+
}
|
|
173
|
+
else if (remove) {
|
|
174
|
+
config.languages = config.languages.filter((l) => l !== remove);
|
|
175
|
+
saveScope(config);
|
|
176
|
+
console.log(`Removed language filter: ${remove}`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
console.log(`Languages: ${config.languages.length > 0 ? config.languages.join(", ") : "(all)"}`);
|
|
180
|
+
}
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Show
|
|
184
|
+
if (format === "json") {
|
|
185
|
+
console.log(JSON.stringify(config, null, 2));
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
console.log(`\n Review Scope: ${config.name}\n ═════════════════════════════`);
|
|
189
|
+
console.log(` Include: ${config.include.join(", ")}`);
|
|
190
|
+
console.log(` Exclude: ${config.exclude.join(", ")}`);
|
|
191
|
+
console.log(` Languages: ${config.languages.length > 0 ? config.languages.join(", ") : "(all)"}`);
|
|
192
|
+
console.log(` Max file size: ${config.maxFileSize} bytes`);
|
|
193
|
+
console.log(` Max files: ${config.maxFiles}`);
|
|
194
|
+
console.log(` Focus dirs: ${config.focusDirs.length > 0 ? config.focusDirs.join(", ") : "(none)"}`);
|
|
195
|
+
console.log(` Ignore dirs: ${config.ignoreDirs.join(", ")}`);
|
|
196
|
+
console.log();
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=review-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-scope.js","sourceRoot":"","sources":["../../src/commands/review-scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-catalog.d.ts","sourceRoot":"","sources":["../../src/commands/rule-catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyGnD"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule-catalog — Browse, search, and preview available rules with examples.
|
|
3
|
+
*/
|
|
4
|
+
import { defaultRegistry } from "../judge-registry.js";
|
|
5
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
6
|
+
export function runRuleCatalog(argv) {
|
|
7
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
8
|
+
console.log(`
|
|
9
|
+
judges rule-catalog — Browse and search available rules
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
judges rule-catalog List all rules
|
|
13
|
+
judges rule-catalog --search injection Search rules by keyword
|
|
14
|
+
judges rule-catalog --judge security Filter by judge
|
|
15
|
+
judges rule-catalog --severity critical Filter by severity
|
|
16
|
+
judges rule-catalog --count Show rule count only
|
|
17
|
+
judges rule-catalog --format json JSON output
|
|
18
|
+
|
|
19
|
+
Options:
|
|
20
|
+
--search <keyword> Search rules by keyword in name/description
|
|
21
|
+
--judge <id> Filter rules by judge ID
|
|
22
|
+
--severity <level> Filter by severity level
|
|
23
|
+
--count Show count only
|
|
24
|
+
--format json JSON output
|
|
25
|
+
--help, -h Show this help
|
|
26
|
+
|
|
27
|
+
Browse the full catalog of rules available across all judges.
|
|
28
|
+
`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
32
|
+
const search = argv.find((_a, i) => argv[i - 1] === "--search") || "";
|
|
33
|
+
const judgeFilter = argv.find((_a, i) => argv[i - 1] === "--judge") || "";
|
|
34
|
+
const sevFilter = argv.find((_a, i) => argv[i - 1] === "--severity") || "";
|
|
35
|
+
const countOnly = argv.includes("--count");
|
|
36
|
+
const judges = defaultRegistry.getJudges();
|
|
37
|
+
const catalog = [];
|
|
38
|
+
for (const judge of judges) {
|
|
39
|
+
// Create catalog entries from judge metadata
|
|
40
|
+
const entry = {
|
|
41
|
+
judgeId: judge.id,
|
|
42
|
+
ruleId: judge.id,
|
|
43
|
+
description: `Rules from ${judge.id} judge`,
|
|
44
|
+
severity: "medium",
|
|
45
|
+
category: categorizeJudge(judge.id),
|
|
46
|
+
};
|
|
47
|
+
// Filter by judge
|
|
48
|
+
if (judgeFilter && !judge.id.toLowerCase().includes(judgeFilter.toLowerCase()))
|
|
49
|
+
continue;
|
|
50
|
+
// Filter by severity
|
|
51
|
+
if (sevFilter && entry.severity !== sevFilter.toLowerCase())
|
|
52
|
+
continue;
|
|
53
|
+
// Search filter
|
|
54
|
+
if (search) {
|
|
55
|
+
const haystack = `${entry.judgeId} ${entry.ruleId} ${entry.description} ${entry.category}`.toLowerCase();
|
|
56
|
+
if (!haystack.includes(search.toLowerCase()))
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
catalog.push(entry);
|
|
60
|
+
}
|
|
61
|
+
if (countOnly) {
|
|
62
|
+
console.log(catalog.length);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (format === "json") {
|
|
66
|
+
console.log(JSON.stringify({ total: catalog.length, rules: catalog }, null, 2));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
console.log(`\n Rule Catalog (${catalog.length} rules)\n ═════════════════════════════`);
|
|
70
|
+
if (catalog.length === 0) {
|
|
71
|
+
console.log(" No rules match your filters.");
|
|
72
|
+
console.log();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Group by category
|
|
76
|
+
const byCategory = new Map();
|
|
77
|
+
for (const entry of catalog) {
|
|
78
|
+
const cat = entry.category;
|
|
79
|
+
const arr = byCategory.get(cat);
|
|
80
|
+
if (arr)
|
|
81
|
+
arr.push(entry);
|
|
82
|
+
else
|
|
83
|
+
byCategory.set(cat, [entry]);
|
|
84
|
+
}
|
|
85
|
+
for (const [category, entries] of byCategory) {
|
|
86
|
+
console.log(`\n ${category.toUpperCase()} (${entries.length})`);
|
|
87
|
+
console.log(" ─────────────────────────────");
|
|
88
|
+
for (const e of entries) {
|
|
89
|
+
console.log(` ${e.ruleId.padEnd(30)} ${e.description}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
console.log();
|
|
93
|
+
}
|
|
94
|
+
function categorizeJudge(id) {
|
|
95
|
+
const lower = id.toLowerCase();
|
|
96
|
+
if (lower.includes("sql") ||
|
|
97
|
+
lower.includes("xss") ||
|
|
98
|
+
lower.includes("inject") ||
|
|
99
|
+
lower.includes("auth") ||
|
|
100
|
+
lower.includes("crypto") ||
|
|
101
|
+
lower.includes("secret") ||
|
|
102
|
+
lower.includes("security") ||
|
|
103
|
+
lower.includes("pii") ||
|
|
104
|
+
lower.includes("privilege")) {
|
|
105
|
+
return "security";
|
|
106
|
+
}
|
|
107
|
+
if (lower.includes("perf") ||
|
|
108
|
+
lower.includes("cache") ||
|
|
109
|
+
lower.includes("optim") ||
|
|
110
|
+
lower.includes("memory") ||
|
|
111
|
+
lower.includes("resource")) {
|
|
112
|
+
return "performance";
|
|
113
|
+
}
|
|
114
|
+
if (lower.includes("cost") ||
|
|
115
|
+
lower.includes("cloud") ||
|
|
116
|
+
lower.includes("infra") ||
|
|
117
|
+
lower.includes("deploy") ||
|
|
118
|
+
lower.includes("iac")) {
|
|
119
|
+
return "infrastructure";
|
|
120
|
+
}
|
|
121
|
+
if (lower.includes("test") || lower.includes("quality") || lower.includes("coverage")) {
|
|
122
|
+
return "quality";
|
|
123
|
+
}
|
|
124
|
+
if (lower.includes("api") || lower.includes("type") || lower.includes("contract")) {
|
|
125
|
+
return "api";
|
|
126
|
+
}
|
|
127
|
+
return "general";
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=rule-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-catalog.js","sourceRoot":"","sources":["../../src/commands/rule-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-wizard.d.ts","sourceRoot":"","sources":["../../src/commands/setup-wizard.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2EH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2HnD"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup-wizard — Interactive guided setup for new users and teams.
|
|
3
|
+
*/
|
|
4
|
+
import { writeFileSync, existsSync, mkdirSync } from "fs";
|
|
5
|
+
import { join, dirname } from "path";
|
|
6
|
+
// ─── Presets ────────────────────────────────────────────────────────────────
|
|
7
|
+
const SETUP_PRESETS = {
|
|
8
|
+
"quick-start": {
|
|
9
|
+
description: "Minimal setup — evaluate files with sensible defaults",
|
|
10
|
+
config: { preset: "lenient", format: "text" },
|
|
11
|
+
},
|
|
12
|
+
"security-first": {
|
|
13
|
+
description: "Focus on security findings — strict severity thresholds",
|
|
14
|
+
config: { preset: "security-only", minSeverity: "medium", failOnFindings: true },
|
|
15
|
+
},
|
|
16
|
+
"ci-integration": {
|
|
17
|
+
description: "Optimized for CI/CD pipelines — JSON output, quality gates",
|
|
18
|
+
config: { preset: "strict", format: "sarif", failOnFindings: true, minScore: 70 },
|
|
19
|
+
},
|
|
20
|
+
"team-review": {
|
|
21
|
+
description: "Team-oriented — shared config, audit logging, PR summaries",
|
|
22
|
+
config: { preset: "strict", format: "markdown" },
|
|
23
|
+
},
|
|
24
|
+
compliance: {
|
|
25
|
+
description: "Compliance-focused — full audit trail, evidence collection",
|
|
26
|
+
config: { preset: "compliance", format: "sarif" },
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
// ─── CI Templates ───────────────────────────────────────────────────────────
|
|
30
|
+
function generateGitHubActions(profile) {
|
|
31
|
+
return `name: Judges Code Review
|
|
32
|
+
on:
|
|
33
|
+
pull_request:
|
|
34
|
+
branches: [main]
|
|
35
|
+
push:
|
|
36
|
+
branches: [main]
|
|
37
|
+
|
|
38
|
+
jobs:
|
|
39
|
+
review:
|
|
40
|
+
runs-on: ubuntu-latest
|
|
41
|
+
steps:
|
|
42
|
+
- uses: actions/checkout@v4
|
|
43
|
+
- uses: actions/setup-node@v4
|
|
44
|
+
with:
|
|
45
|
+
node-version: '20'
|
|
46
|
+
- run: npx @kevinrabun/judges eval . --preset ${profile.preset} --format sarif --fail-on-findings
|
|
47
|
+
`;
|
|
48
|
+
}
|
|
49
|
+
function generateGitLabCI(profile) {
|
|
50
|
+
return `judges-review:
|
|
51
|
+
image: node:20
|
|
52
|
+
script:
|
|
53
|
+
- npx @kevinrabun/judges eval . --preset ${profile.preset} --format sarif --fail-on-findings
|
|
54
|
+
only:
|
|
55
|
+
- merge_requests
|
|
56
|
+
- main
|
|
57
|
+
`;
|
|
58
|
+
}
|
|
59
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
60
|
+
export function runSetupWizard(argv) {
|
|
61
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
62
|
+
console.log(`
|
|
63
|
+
judges setup-wizard — Guided setup for new users
|
|
64
|
+
|
|
65
|
+
Usage:
|
|
66
|
+
judges setup-wizard Interactive setup
|
|
67
|
+
judges setup-wizard --profile quick-start Use preset profile
|
|
68
|
+
judges setup-wizard --list-profiles List available profiles
|
|
69
|
+
judges setup-wizard --generate-ci github-actions Generate CI config
|
|
70
|
+
judges setup-wizard --init Create .judgesrc and CI config
|
|
71
|
+
|
|
72
|
+
Profiles:
|
|
73
|
+
quick-start Minimal setup with sensible defaults
|
|
74
|
+
security-first Security-focused with strict thresholds
|
|
75
|
+
ci-integration Optimized for CI/CD pipelines
|
|
76
|
+
team-review Team-oriented with shared config
|
|
77
|
+
compliance Full compliance with audit trails
|
|
78
|
+
|
|
79
|
+
Options:
|
|
80
|
+
--profile <name> Select a setup profile
|
|
81
|
+
--list-profiles List all available profiles
|
|
82
|
+
--generate-ci <type> Generate CI config (github-actions, gitlab-ci)
|
|
83
|
+
--init Write configuration files
|
|
84
|
+
--output <dir> Output directory (default: current)
|
|
85
|
+
--format json JSON output
|
|
86
|
+
--help, -h Show this help
|
|
87
|
+
|
|
88
|
+
Generates .judgesrc configuration and CI workflow files
|
|
89
|
+
based on your team's needs. All data stays local.
|
|
90
|
+
`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
94
|
+
if (argv.includes("--list-profiles")) {
|
|
95
|
+
if (format === "json") {
|
|
96
|
+
console.log(JSON.stringify(SETUP_PRESETS, null, 2));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
console.log("\n Setup Profiles\n ═════════════════════════════");
|
|
100
|
+
for (const [name, info] of Object.entries(SETUP_PRESETS)) {
|
|
101
|
+
console.log(` ${name.padEnd(20)} ${info.description}`);
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const profileName = argv.find((_a, i) => argv[i - 1] === "--profile") || "quick-start";
|
|
107
|
+
const ciType = argv.find((_a, i) => argv[i - 1] === "--generate-ci");
|
|
108
|
+
const outputDir = argv.find((_a, i) => argv[i - 1] === "--output") || ".";
|
|
109
|
+
const doInit = argv.includes("--init");
|
|
110
|
+
const preset = SETUP_PRESETS[profileName];
|
|
111
|
+
if (!preset) {
|
|
112
|
+
console.error(`Error: Unknown profile '${profileName}'. Use --list-profiles to see options.`);
|
|
113
|
+
process.exitCode = 1;
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const profile = {
|
|
117
|
+
preset: profileName,
|
|
118
|
+
ciSystem: ciType || "github-actions",
|
|
119
|
+
languages: [],
|
|
120
|
+
strictness: profileName === "security-first" || profileName === "compliance" ? "strict" : "moderate",
|
|
121
|
+
features: [],
|
|
122
|
+
};
|
|
123
|
+
if (ciType) {
|
|
124
|
+
const ciConfig = ciType === "gitlab-ci" ? generateGitLabCI(profile) : generateGitHubActions(profile);
|
|
125
|
+
console.log(ciConfig);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (doInit) {
|
|
129
|
+
// Write .judgesrc
|
|
130
|
+
const rcPath = join(outputDir, ".judgesrc");
|
|
131
|
+
if (!existsSync(rcPath)) {
|
|
132
|
+
writeFileSync(rcPath, JSON.stringify(preset.config, null, 2), "utf-8");
|
|
133
|
+
console.log(`Created ${rcPath}`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log(`${rcPath} already exists, skipping.`);
|
|
137
|
+
}
|
|
138
|
+
// Write CI config
|
|
139
|
+
const ciDir = join(outputDir, ".github", "workflows");
|
|
140
|
+
const ciPath = join(ciDir, "judges-review.yml");
|
|
141
|
+
if (!existsSync(ciPath)) {
|
|
142
|
+
mkdirSync(dirname(ciPath), { recursive: true });
|
|
143
|
+
writeFileSync(ciPath, generateGitHubActions(profile), "utf-8");
|
|
144
|
+
console.log(`Created ${ciPath}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.log(`${ciPath} already exists, skipping.`);
|
|
148
|
+
}
|
|
149
|
+
console.log("\nSetup complete! Next steps:");
|
|
150
|
+
console.log(" 1. Run: npx @kevinrabun/judges eval <file>");
|
|
151
|
+
console.log(" 2. Customize .judgesrc for your needs");
|
|
152
|
+
console.log(" 3. Commit the CI workflow for automated reviews");
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Show setup summary
|
|
156
|
+
if (format === "json") {
|
|
157
|
+
console.log(JSON.stringify({ profile: profileName, ...preset }, null, 2));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
console.log(`\n Setup Wizard — ${profileName}\n ═════════════════════════════`);
|
|
161
|
+
console.log(` Profile: ${profileName}`);
|
|
162
|
+
console.log(` Description: ${preset.description}`);
|
|
163
|
+
console.log(` Configuration:`);
|
|
164
|
+
for (const [key, value] of Object.entries(preset.config)) {
|
|
165
|
+
console.log(` ${key}: ${value}`);
|
|
166
|
+
}
|
|
167
|
+
console.log();
|
|
168
|
+
console.log(" To apply this configuration:");
|
|
169
|
+
console.log(` judges setup-wizard --profile ${profileName} --init`);
|
|
170
|
+
console.log();
|
|
171
|
+
console.log(" To generate CI config:");
|
|
172
|
+
console.log(` judges setup-wizard --profile ${profileName} --generate-ci github-actions`);
|
|
173
|
+
console.log();
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=setup-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../../src/commands/setup-wizard.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/server.json
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/kevinrabun/judges",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "3.
|
|
10
|
+
"version": "3.67.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "@kevinrabun/judges",
|
|
15
|
-
"version": "3.
|
|
15
|
+
"version": "3.67.0",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
}
|