@kevinrabun/judges 3.62.0 → 3.63.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 +7 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +56 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/finding-group.d.ts +16 -0
- package/dist/commands/finding-group.d.ts.map +1 -0
- package/dist/commands/finding-group.js +165 -0
- package/dist/commands/finding-group.js.map +1 -0
- package/dist/commands/ignore-list.d.ts +19 -0
- package/dist/commands/ignore-list.d.ts.map +1 -0
- package/dist/commands/ignore-list.js +166 -0
- package/dist/commands/ignore-list.js.map +1 -0
- package/dist/commands/incremental-review.d.ts +5 -0
- package/dist/commands/incremental-review.d.ts.map +1 -0
- package/dist/commands/incremental-review.js +240 -0
- package/dist/commands/incremental-review.js.map +1 -0
- package/dist/commands/review-cache.d.ts +23 -0
- package/dist/commands/review-cache.d.ts.map +1 -0
- package/dist/commands/review-cache.js +135 -0
- package/dist/commands/review-cache.js.map +1 -0
- package/dist/commands/review-log.d.ts +23 -0
- package/dist/commands/review-log.d.ts.map +1 -0
- package/dist/commands/review-log.js +165 -0
- package/dist/commands/review-log.js.map +1 -0
- package/dist/commands/review-summary.d.ts +5 -0
- package/dist/commands/review-summary.d.ts.map +1 -0
- package/dist/commands/review-summary.js +175 -0
- package/dist/commands/review-summary.js.map +1 -0
- package/dist/commands/rule-test.d.ts +5 -0
- package/dist/commands/rule-test.d.ts.map +1 -0
- package/dist/commands/rule-test.js +216 -0
- package/dist/commands/rule-test.js.map +1 -0
- package/dist/commands/team-config.d.ts +5 -0
- package/dist/commands/team-config.d.ts.map +1 -0
- package/dist/commands/team-config.js +235 -0
- package/dist/commands/team-config.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule-test — Test custom rules against sample code before deployment.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync, readdirSync, statSync } from "fs";
|
|
5
|
+
import { join, extname } from "path";
|
|
6
|
+
// ─── Rule loading ───────────────────────────────────────────────────────────
|
|
7
|
+
function loadRules(rulesPath) {
|
|
8
|
+
const raw = readFileSync(rulesPath, "utf-8");
|
|
9
|
+
const parsed = JSON.parse(raw);
|
|
10
|
+
const rules = Array.isArray(parsed) ? parsed : parsed.rules || [];
|
|
11
|
+
return rules;
|
|
12
|
+
}
|
|
13
|
+
// ─── File collection ────────────────────────────────────────────────────────
|
|
14
|
+
function collectFiles(dirPath) {
|
|
15
|
+
const results = [];
|
|
16
|
+
if (!existsSync(dirPath))
|
|
17
|
+
return results;
|
|
18
|
+
const entries = readdirSync(dirPath);
|
|
19
|
+
for (const entry of entries) {
|
|
20
|
+
const fullPath = join(dirPath, entry);
|
|
21
|
+
try {
|
|
22
|
+
const st = statSync(fullPath);
|
|
23
|
+
if (st.isDirectory()) {
|
|
24
|
+
results.push(...collectFiles(fullPath));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
results.push(fullPath);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// skip inaccessible entries
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return results;
|
|
35
|
+
}
|
|
36
|
+
// ─── Language matching ──────────────────────────────────────────────────────
|
|
37
|
+
const EXT_TO_LANG = {
|
|
38
|
+
".ts": "typescript",
|
|
39
|
+
".tsx": "typescript",
|
|
40
|
+
".js": "javascript",
|
|
41
|
+
".jsx": "javascript",
|
|
42
|
+
".py": "python",
|
|
43
|
+
".go": "go",
|
|
44
|
+
".rs": "rust",
|
|
45
|
+
".java": "java",
|
|
46
|
+
".cs": "csharp",
|
|
47
|
+
".cpp": "cpp",
|
|
48
|
+
".c": "c",
|
|
49
|
+
".rb": "ruby",
|
|
50
|
+
".php": "php",
|
|
51
|
+
};
|
|
52
|
+
function matchesLanguage(filePath, languages) {
|
|
53
|
+
if (!languages || languages.length === 0)
|
|
54
|
+
return true;
|
|
55
|
+
const ext = extname(filePath).toLowerCase();
|
|
56
|
+
const lang = EXT_TO_LANG[ext] || ext.slice(1);
|
|
57
|
+
return languages.includes(lang);
|
|
58
|
+
}
|
|
59
|
+
// ─── Rule testing ───────────────────────────────────────────────────────────
|
|
60
|
+
function testRule(rule, files) {
|
|
61
|
+
const results = [];
|
|
62
|
+
let regex;
|
|
63
|
+
try {
|
|
64
|
+
regex = new RegExp(rule.pattern, "gi");
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
console.error(` ❌ Rule '${rule.id}' has invalid regex: ${rule.pattern}`);
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
70
|
+
for (const file of files) {
|
|
71
|
+
if (!matchesLanguage(file, rule.languages))
|
|
72
|
+
continue;
|
|
73
|
+
let content;
|
|
74
|
+
try {
|
|
75
|
+
content = readFileSync(file, "utf-8");
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const lines = content.split("\n");
|
|
81
|
+
const matches = [];
|
|
82
|
+
for (let i = 0; i < lines.length; i++) {
|
|
83
|
+
regex.lastIndex = 0;
|
|
84
|
+
if (regex.test(lines[i])) {
|
|
85
|
+
matches.push({ line: i + 1, content: lines[i].trim().slice(0, 120) });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
results.push({
|
|
89
|
+
ruleId: rule.id,
|
|
90
|
+
file,
|
|
91
|
+
matches,
|
|
92
|
+
matched: matches.length > 0,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return results;
|
|
96
|
+
}
|
|
97
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
98
|
+
export function runRuleTest(argv) {
|
|
99
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
100
|
+
console.log(`
|
|
101
|
+
judges rule-test — Test custom rules against sample code
|
|
102
|
+
|
|
103
|
+
Usage:
|
|
104
|
+
judges rule-test --rules custom-rules.json --fixtures tests/fixtures
|
|
105
|
+
judges rule-test --rules custom-rules.json --file sample.ts
|
|
106
|
+
judges rule-test --rules custom-rules.json --fixtures src --format json
|
|
107
|
+
|
|
108
|
+
Options:
|
|
109
|
+
--rules <file> JSON file with custom rules (required)
|
|
110
|
+
--fixtures <dir> Directory with test fixture files
|
|
111
|
+
--file <path> Test against a single file
|
|
112
|
+
--rule <id> Test only a specific rule by ID
|
|
113
|
+
--format json JSON output
|
|
114
|
+
--help, -h Show this help
|
|
115
|
+
|
|
116
|
+
Validates custom rules against real code before deployment. Ensures
|
|
117
|
+
patterns match expected findings and catch the intended issues.
|
|
118
|
+
`);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const rulesPath = argv.find((_a, i) => argv[i - 1] === "--rules");
|
|
122
|
+
const fixturesDir = argv.find((_a, i) => argv[i - 1] === "--fixtures");
|
|
123
|
+
const singleFile = argv.find((_a, i) => argv[i - 1] === "--file");
|
|
124
|
+
const ruleFilter = argv.find((_a, i) => argv[i - 1] === "--rule");
|
|
125
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
126
|
+
if (!rulesPath) {
|
|
127
|
+
console.error("Error: --rules is required. Provide a custom rules JSON file.");
|
|
128
|
+
process.exitCode = 1;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (!existsSync(rulesPath)) {
|
|
132
|
+
console.error(`Error: Rules file not found: ${rulesPath}`);
|
|
133
|
+
process.exitCode = 1;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
let rules;
|
|
137
|
+
try {
|
|
138
|
+
rules = loadRules(rulesPath);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
console.error(`Error: Cannot parse rules file: ${rulesPath}`);
|
|
142
|
+
process.exitCode = 1;
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (ruleFilter) {
|
|
146
|
+
rules = rules.filter((r) => r.id === ruleFilter);
|
|
147
|
+
if (rules.length === 0) {
|
|
148
|
+
console.error(`Error: Rule '${ruleFilter}' not found in ${rulesPath}`);
|
|
149
|
+
process.exitCode = 1;
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Gather target files
|
|
154
|
+
let files;
|
|
155
|
+
if (singleFile) {
|
|
156
|
+
if (!existsSync(singleFile)) {
|
|
157
|
+
console.error(`Error: File not found: ${singleFile}`);
|
|
158
|
+
process.exitCode = 1;
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
files = [singleFile];
|
|
162
|
+
}
|
|
163
|
+
else if (fixturesDir) {
|
|
164
|
+
files = collectFiles(fixturesDir);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
console.error("Error: Either --fixtures or --file is required.");
|
|
168
|
+
process.exitCode = 1;
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (files.length === 0) {
|
|
172
|
+
console.log("No files found to test against.");
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// Run tests
|
|
176
|
+
const allResults = [];
|
|
177
|
+
for (const rule of rules) {
|
|
178
|
+
allResults.push(...testRule(rule, files));
|
|
179
|
+
}
|
|
180
|
+
const matchedResults = allResults.filter((r) => r.matched);
|
|
181
|
+
const rulesWithMatches = new Set(matchedResults.map((r) => r.ruleId));
|
|
182
|
+
if (format === "json") {
|
|
183
|
+
console.log(JSON.stringify({
|
|
184
|
+
rulesCount: rules.length,
|
|
185
|
+
filesCount: files.length,
|
|
186
|
+
matchedRules: rulesWithMatches.size,
|
|
187
|
+
totalMatches: matchedResults.reduce((s, r) => s + r.matches.length, 0),
|
|
188
|
+
results: matchedResults.map((r) => ({
|
|
189
|
+
ruleId: r.ruleId,
|
|
190
|
+
file: r.file,
|
|
191
|
+
matchCount: r.matches.length,
|
|
192
|
+
matches: r.matches,
|
|
193
|
+
})),
|
|
194
|
+
}, null, 2));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
console.log(`\n Rule Test Results\n ─────────────────────────────`);
|
|
198
|
+
console.log(` Rules tested: ${rules.length}`);
|
|
199
|
+
console.log(` Files scanned: ${files.length}`);
|
|
200
|
+
console.log(` Rules with matches: ${rulesWithMatches.size}\n`);
|
|
201
|
+
for (const rule of rules) {
|
|
202
|
+
const ruleResults = matchedResults.filter((r) => r.ruleId === rule.id);
|
|
203
|
+
const totalMatches = ruleResults.reduce((s, r) => s + r.matches.length, 0);
|
|
204
|
+
const icon = totalMatches > 0 ? "✅" : "⬜";
|
|
205
|
+
console.log(` ${icon} ${rule.id} — ${totalMatches} match(es) across ${ruleResults.length} file(s)`);
|
|
206
|
+
console.log(` Pattern: ${rule.pattern}`);
|
|
207
|
+
console.log(` Severity: ${rule.severity}`);
|
|
208
|
+
for (const rr of ruleResults.slice(0, 3)) {
|
|
209
|
+
for (const m of rr.matches.slice(0, 3)) {
|
|
210
|
+
console.log(` L${m.line}: ${m.content}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
console.log();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=rule-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-test.js","sourceRoot":"","sources":["../../src/commands/rule-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-config.d.ts","sourceRoot":"","sources":["../../src/commands/team-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4HH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6JlD"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team-config — Team-level shared configuration management.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
5
|
+
// ─── Default config ────────────────────────────────────────────────────────
|
|
6
|
+
function defaultTeamConfig() {
|
|
7
|
+
return {
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
team: "default",
|
|
10
|
+
preset: "recommended",
|
|
11
|
+
enabledJudges: [
|
|
12
|
+
"data-security",
|
|
13
|
+
"cybersecurity",
|
|
14
|
+
"authentication",
|
|
15
|
+
"database",
|
|
16
|
+
"reliability",
|
|
17
|
+
"performance",
|
|
18
|
+
"maintainability",
|
|
19
|
+
"documentation",
|
|
20
|
+
"testing",
|
|
21
|
+
"error-handling",
|
|
22
|
+
],
|
|
23
|
+
disabledRules: [],
|
|
24
|
+
severityOverrides: {},
|
|
25
|
+
customPatterns: [],
|
|
26
|
+
ignorePatterns: ["**/*.test.ts", "**/*.spec.ts", "**/fixtures/**"],
|
|
27
|
+
reviewGate: {
|
|
28
|
+
maxCritical: 0,
|
|
29
|
+
maxHigh: 5,
|
|
30
|
+
maxTotal: 25,
|
|
31
|
+
blockOnSecurity: true,
|
|
32
|
+
},
|
|
33
|
+
formatting: {
|
|
34
|
+
defaultFormat: "text",
|
|
35
|
+
includeRecommendations: true,
|
|
36
|
+
includeEvidence: true,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function validateConfig(config) {
|
|
41
|
+
const issues = [];
|
|
42
|
+
const warnings = [];
|
|
43
|
+
if (!config.version)
|
|
44
|
+
issues.push("Missing version");
|
|
45
|
+
if (!config.team)
|
|
46
|
+
issues.push("Missing team name");
|
|
47
|
+
if (!config.enabledJudges || config.enabledJudges.length === 0) {
|
|
48
|
+
warnings.push("No judges enabled — all judges will be used");
|
|
49
|
+
}
|
|
50
|
+
const validPresets = new Set(["strict", "recommended", "lenient", "security-only", "quality-only"]);
|
|
51
|
+
if (config.preset && !validPresets.has(config.preset)) {
|
|
52
|
+
warnings.push(`Unknown preset '${config.preset}' — using 'recommended' defaults`);
|
|
53
|
+
}
|
|
54
|
+
if (config.reviewGate) {
|
|
55
|
+
if (config.reviewGate.maxCritical < 0)
|
|
56
|
+
issues.push("maxCritical cannot be negative");
|
|
57
|
+
if (config.reviewGate.maxHigh < 0)
|
|
58
|
+
issues.push("maxHigh cannot be negative");
|
|
59
|
+
if (config.reviewGate.maxTotal < 0)
|
|
60
|
+
issues.push("maxTotal cannot be negative");
|
|
61
|
+
}
|
|
62
|
+
for (const cp of config.customPatterns || []) {
|
|
63
|
+
if (!cp.name)
|
|
64
|
+
issues.push("Custom pattern missing name");
|
|
65
|
+
if (!cp.pattern)
|
|
66
|
+
issues.push(`Custom pattern '${cp.name}' missing regex pattern`);
|
|
67
|
+
try {
|
|
68
|
+
new RegExp(cp.pattern);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
issues.push(`Custom pattern '${cp.name}' has invalid regex: ${cp.pattern}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { valid: issues.length === 0, issues, warnings };
|
|
75
|
+
}
|
|
76
|
+
// ─── Config merging ────────────────────────────────────────────────────────
|
|
77
|
+
function mergeConfigs(base, override) {
|
|
78
|
+
return {
|
|
79
|
+
...base,
|
|
80
|
+
...override,
|
|
81
|
+
reviewGate: { ...base.reviewGate, ...(override.reviewGate || {}) },
|
|
82
|
+
formatting: { ...base.formatting, ...(override.formatting || {}) },
|
|
83
|
+
enabledJudges: override.enabledJudges || base.enabledJudges,
|
|
84
|
+
disabledRules: [...(base.disabledRules || []), ...(override.disabledRules || [])],
|
|
85
|
+
ignorePatterns: override.ignorePatterns || base.ignorePatterns,
|
|
86
|
+
severityOverrides: { ...(base.severityOverrides || {}), ...(override.severityOverrides || {}) },
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
90
|
+
export function runTeamConfig(argv) {
|
|
91
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
92
|
+
console.log(`
|
|
93
|
+
judges team-config — Team-level shared configuration
|
|
94
|
+
|
|
95
|
+
Usage:
|
|
96
|
+
judges team-config init Create team-config.json template
|
|
97
|
+
judges team-config show Show current configuration
|
|
98
|
+
judges team-config validate Validate configuration
|
|
99
|
+
judges team-config merge --base base.json --override local.json
|
|
100
|
+
judges team-config --format json JSON output
|
|
101
|
+
|
|
102
|
+
Subcommands:
|
|
103
|
+
init Create a team-config.json template
|
|
104
|
+
show Display current configuration
|
|
105
|
+
validate Validate configuration file
|
|
106
|
+
merge Merge base config with local overrides
|
|
107
|
+
|
|
108
|
+
Options:
|
|
109
|
+
--config <path> Config file path (default: team-config.json)
|
|
110
|
+
--base <path> Base config for merge
|
|
111
|
+
--override <path> Override config for merge
|
|
112
|
+
--format json JSON output
|
|
113
|
+
--help, -h Show this help
|
|
114
|
+
|
|
115
|
+
Team config defines shared review settings: enabled judges, severity
|
|
116
|
+
overrides, review gate thresholds, and formatting preferences. Commit
|
|
117
|
+
to your repository to share across the team.
|
|
118
|
+
`);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
122
|
+
const configPath = argv.find((_a, i) => argv[i - 1] === "--config") || "team-config.json";
|
|
123
|
+
const subcommand = argv.find((a) => !a.startsWith("-") &&
|
|
124
|
+
a !== "team-config" &&
|
|
125
|
+
argv[argv.indexOf(a) - 1] !== "--config" &&
|
|
126
|
+
argv[argv.indexOf(a) - 1] !== "--format" &&
|
|
127
|
+
argv[argv.indexOf(a) - 1] !== "--base" &&
|
|
128
|
+
argv[argv.indexOf(a) - 1] !== "--override") || "show";
|
|
129
|
+
if (subcommand === "init") {
|
|
130
|
+
if (existsSync(configPath)) {
|
|
131
|
+
console.error(`Error: ${configPath} already exists.`);
|
|
132
|
+
process.exitCode = 1;
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
writeFileSync(configPath, JSON.stringify(defaultTeamConfig(), null, 2), "utf-8");
|
|
136
|
+
console.log(`Created ${configPath}. Edit and commit to share with your team.`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (subcommand === "merge") {
|
|
140
|
+
const basePath = argv.find((_a, i) => argv[i - 1] === "--base");
|
|
141
|
+
const overridePath = argv.find((_a, i) => argv[i - 1] === "--override");
|
|
142
|
+
if (!basePath || !overridePath) {
|
|
143
|
+
console.error("Error: Both --base and --override paths are required.");
|
|
144
|
+
process.exitCode = 1;
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const base = JSON.parse(readFileSync(basePath, "utf-8"));
|
|
149
|
+
const override = JSON.parse(readFileSync(overridePath, "utf-8"));
|
|
150
|
+
const merged = mergeConfigs(base, override);
|
|
151
|
+
if (format === "json") {
|
|
152
|
+
console.log(JSON.stringify(merged, null, 2));
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.log("Merged configuration:");
|
|
156
|
+
console.log(JSON.stringify(merged, null, 2));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
console.error("Error: Cannot read or parse config files.");
|
|
161
|
+
process.exitCode = 1;
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
// Load config
|
|
166
|
+
let config;
|
|
167
|
+
if (existsSync(configPath)) {
|
|
168
|
+
try {
|
|
169
|
+
config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
console.error(`Error: ${configPath} is not valid JSON.`);
|
|
173
|
+
process.exitCode = 1;
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
config = defaultTeamConfig();
|
|
179
|
+
}
|
|
180
|
+
if (subcommand === "validate") {
|
|
181
|
+
const result = validateConfig(config);
|
|
182
|
+
if (format === "json") {
|
|
183
|
+
console.log(JSON.stringify(result, null, 2));
|
|
184
|
+
if (!result.valid)
|
|
185
|
+
process.exitCode = 1;
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const icon = result.valid ? "✅" : "❌";
|
|
189
|
+
console.log(`\n Config Validation: ${icon} ${result.valid ? "VALID" : "INVALID"}\n ─────────────────────────────`);
|
|
190
|
+
if (result.issues.length > 0) {
|
|
191
|
+
console.log(`\n Issues (${result.issues.length}):`);
|
|
192
|
+
for (const issue of result.issues)
|
|
193
|
+
console.log(` ❌ ${issue}`);
|
|
194
|
+
}
|
|
195
|
+
if (result.warnings.length > 0) {
|
|
196
|
+
console.log(`\n Warnings (${result.warnings.length}):`);
|
|
197
|
+
for (const w of result.warnings)
|
|
198
|
+
console.log(` ⚠️ ${w}`);
|
|
199
|
+
}
|
|
200
|
+
if (result.valid && result.warnings.length === 0)
|
|
201
|
+
console.log(" No issues found.");
|
|
202
|
+
console.log();
|
|
203
|
+
if (!result.valid)
|
|
204
|
+
process.exitCode = 1;
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// Show
|
|
208
|
+
if (format === "json") {
|
|
209
|
+
console.log(JSON.stringify(config, null, 2));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
console.log(`\n Team Configuration\n ─────────────────────────────`);
|
|
213
|
+
console.log(` Team: ${config.team}`);
|
|
214
|
+
console.log(` Preset: ${config.preset}`);
|
|
215
|
+
console.log(` Source: ${existsSync(configPath) ? configPath : "defaults"}`);
|
|
216
|
+
console.log(`\n Enabled Judges (${config.enabledJudges.length}):`);
|
|
217
|
+
for (const j of config.enabledJudges)
|
|
218
|
+
console.log(` ✅ ${j}`);
|
|
219
|
+
if (config.disabledRules.length > 0) {
|
|
220
|
+
console.log(`\n Disabled Rules (${config.disabledRules.length}):`);
|
|
221
|
+
for (const r of config.disabledRules)
|
|
222
|
+
console.log(` ⬜ ${r}`);
|
|
223
|
+
}
|
|
224
|
+
console.log("\n Review Gate:");
|
|
225
|
+
console.log(` Max critical: ${config.reviewGate.maxCritical}`);
|
|
226
|
+
console.log(` Max high: ${config.reviewGate.maxHigh}`);
|
|
227
|
+
console.log(` Max total: ${config.reviewGate.maxTotal}`);
|
|
228
|
+
console.log(` Block on security: ${config.reviewGate.blockOnSecurity}`);
|
|
229
|
+
console.log("\n Formatting:");
|
|
230
|
+
console.log(` Default format: ${config.formatting.defaultFormat}`);
|
|
231
|
+
console.log(` Include recommendations: ${config.formatting.includeRecommendations}`);
|
|
232
|
+
console.log(` Include evidence: ${config.formatting.includeEvidence}`);
|
|
233
|
+
console.log();
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=team-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-config.js","sourceRoot":"","sources":["../../src/commands/team-config.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.63.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "@kevinrabun/judges",
|
|
15
|
-
"version": "3.
|
|
15
|
+
"version": "3.63.0",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
}
|