@kevinrabun/judges 3.46.0 → 3.48.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 +24 -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/adoption-report.d.ts +8 -0
- package/dist/commands/adoption-report.d.ts.map +1 -0
- package/dist/commands/adoption-report.js +219 -0
- package/dist/commands/adoption-report.js.map +1 -0
- package/dist/commands/ai-model-trust.d.ts +17 -0
- package/dist/commands/ai-model-trust.d.ts.map +1 -0
- package/dist/commands/ai-model-trust.js +235 -0
- package/dist/commands/ai-model-trust.js.map +1 -0
- package/dist/commands/ai-prompt-audit.d.ts +23 -0
- package/dist/commands/ai-prompt-audit.d.ts.map +1 -0
- package/dist/commands/ai-prompt-audit.js +255 -0
- package/dist/commands/ai-prompt-audit.js.map +1 -0
- package/dist/commands/audit-trail.d.ts +18 -0
- package/dist/commands/audit-trail.d.ts.map +1 -0
- package/dist/commands/audit-trail.js +155 -0
- package/dist/commands/audit-trail.js.map +1 -0
- package/dist/commands/auto-fix.d.ts +18 -0
- package/dist/commands/auto-fix.d.ts.map +1 -0
- package/dist/commands/auto-fix.js +241 -0
- package/dist/commands/auto-fix.js.map +1 -0
- package/dist/commands/code-owner-suggest.d.ts +17 -0
- package/dist/commands/code-owner-suggest.d.ts.map +1 -0
- package/dist/commands/code-owner-suggest.js +215 -0
- package/dist/commands/code-owner-suggest.js.map +1 -0
- package/dist/commands/cost-forecast.d.ts +19 -0
- package/dist/commands/cost-forecast.d.ts.map +1 -0
- package/dist/commands/cost-forecast.js +194 -0
- package/dist/commands/cost-forecast.js.map +1 -0
- package/dist/commands/dep-correlate.d.ts +9 -0
- package/dist/commands/dep-correlate.d.ts.map +1 -0
- package/dist/commands/dep-correlate.js +208 -0
- package/dist/commands/dep-correlate.js.map +1 -0
- package/dist/commands/doc-gen.d.ts +8 -0
- package/dist/commands/doc-gen.d.ts.map +1 -0
- package/dist/commands/doc-gen.js +209 -0
- package/dist/commands/doc-gen.js.map +1 -0
- package/dist/commands/judge-author.d.ts +8 -0
- package/dist/commands/judge-author.d.ts.map +1 -0
- package/dist/commands/judge-author.js +261 -0
- package/dist/commands/judge-author.js.map +1 -0
- package/dist/commands/pattern-registry.d.ts +23 -0
- package/dist/commands/pattern-registry.d.ts.map +1 -0
- package/dist/commands/pattern-registry.js +227 -0
- package/dist/commands/pattern-registry.js.map +1 -0
- package/dist/commands/perf-hotspot.d.ts +8 -0
- package/dist/commands/perf-hotspot.d.ts.map +1 -0
- package/dist/commands/perf-hotspot.js +274 -0
- package/dist/commands/perf-hotspot.js.map +1 -0
- package/dist/commands/pr-quality-gate.d.ts +29 -0
- package/dist/commands/pr-quality-gate.d.ts.map +1 -0
- package/dist/commands/pr-quality-gate.js +208 -0
- package/dist/commands/pr-quality-gate.js.map +1 -0
- package/dist/commands/security-maturity.d.ts +8 -0
- package/dist/commands/security-maturity.d.ts.map +1 -0
- package/dist/commands/security-maturity.js +313 -0
- package/dist/commands/security-maturity.js.map +1 -0
- package/dist/commands/team-leaderboard.d.ts +25 -0
- package/dist/commands/team-leaderboard.d.ts.map +1 -0
- package/dist/commands/team-leaderboard.js +228 -0
- package/dist/commands/team-leaderboard.js.map +1 -0
- package/dist/commands/team-rules-sync.d.ts +8 -0
- package/dist/commands/team-rules-sync.d.ts.map +1 -0
- package/dist/commands/team-rules-sync.js +251 -0
- package/dist/commands/team-rules-sync.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR quality gate — automated pass/fail gate for PRs with
|
|
3
|
+
* configurable thresholds for auto-approval.
|
|
4
|
+
*
|
|
5
|
+
* All decisions are local — integrates via output format.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
const GATE_DIR = ".judges-quality-gate";
|
|
10
|
+
const GATE_FILE = join(GATE_DIR, "gate-history.json");
|
|
11
|
+
const POLICY_FILE = join(GATE_DIR, "policy.json");
|
|
12
|
+
const DEFAULT_POLICY = {
|
|
13
|
+
maxCritical: 0,
|
|
14
|
+
maxHigh: 2,
|
|
15
|
+
maxTotal: 20,
|
|
16
|
+
requireTestCoverage: false,
|
|
17
|
+
autoApproveBelow: 80,
|
|
18
|
+
};
|
|
19
|
+
// ─── Core ───────────────────────────────────────────────────────────────────
|
|
20
|
+
function ensureDir() {
|
|
21
|
+
if (!existsSync(GATE_DIR))
|
|
22
|
+
mkdirSync(GATE_DIR, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
function loadPolicy() {
|
|
25
|
+
if (!existsSync(POLICY_FILE))
|
|
26
|
+
return { ...DEFAULT_POLICY };
|
|
27
|
+
try {
|
|
28
|
+
return { ...DEFAULT_POLICY, ...JSON.parse(readFileSync(POLICY_FILE, "utf-8")) };
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return { ...DEFAULT_POLICY };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function savePolicy(policy) {
|
|
35
|
+
ensureDir();
|
|
36
|
+
writeFileSync(POLICY_FILE, JSON.stringify(policy, null, 2));
|
|
37
|
+
}
|
|
38
|
+
function loadHistory() {
|
|
39
|
+
if (!existsSync(GATE_FILE))
|
|
40
|
+
return { results: [], updatedAt: new Date().toISOString() };
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(readFileSync(GATE_FILE, "utf-8"));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return { results: [], updatedAt: new Date().toISOString() };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function saveHistory(history) {
|
|
49
|
+
ensureDir();
|
|
50
|
+
history.updatedAt = new Date().toISOString();
|
|
51
|
+
writeFileSync(GATE_FILE, JSON.stringify(history, null, 2));
|
|
52
|
+
}
|
|
53
|
+
export function evaluateGate(critical, high, medium, low, score) {
|
|
54
|
+
const policy = loadPolicy();
|
|
55
|
+
const total = critical + high + medium + low;
|
|
56
|
+
let passed = true;
|
|
57
|
+
let reason = "All checks passed";
|
|
58
|
+
if (critical > policy.maxCritical) {
|
|
59
|
+
passed = false;
|
|
60
|
+
reason = `Critical findings (${critical}) exceed limit (${policy.maxCritical})`;
|
|
61
|
+
}
|
|
62
|
+
else if (high > policy.maxHigh) {
|
|
63
|
+
passed = false;
|
|
64
|
+
reason = `High findings (${high}) exceed limit (${policy.maxHigh})`;
|
|
65
|
+
}
|
|
66
|
+
else if (total > policy.maxTotal) {
|
|
67
|
+
passed = false;
|
|
68
|
+
reason = `Total findings (${total}) exceed limit (${policy.maxTotal})`;
|
|
69
|
+
}
|
|
70
|
+
else if (score < policy.autoApproveBelow) {
|
|
71
|
+
passed = false;
|
|
72
|
+
reason = `Score (${score}) below threshold (${policy.autoApproveBelow})`;
|
|
73
|
+
}
|
|
74
|
+
const result = {
|
|
75
|
+
passed,
|
|
76
|
+
reason,
|
|
77
|
+
critical,
|
|
78
|
+
high,
|
|
79
|
+
medium,
|
|
80
|
+
low,
|
|
81
|
+
total,
|
|
82
|
+
score,
|
|
83
|
+
policy,
|
|
84
|
+
timestamp: new Date().toISOString(),
|
|
85
|
+
};
|
|
86
|
+
// Record
|
|
87
|
+
const history = loadHistory();
|
|
88
|
+
history.results.push(result);
|
|
89
|
+
if (history.results.length > 200)
|
|
90
|
+
history.results = history.results.slice(-200);
|
|
91
|
+
saveHistory(history);
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
95
|
+
export function runPrQualityGate(argv) {
|
|
96
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
97
|
+
console.log(`
|
|
98
|
+
judges pr-quality-gate — Automated PR pass/fail quality gate
|
|
99
|
+
|
|
100
|
+
Usage:
|
|
101
|
+
judges pr-quality-gate --check --critical 0 --high 1 --medium 5 --low 10 --score 85
|
|
102
|
+
judges pr-quality-gate --policy
|
|
103
|
+
judges pr-quality-gate --set-policy --max-critical 0 --max-high 3 --max-total 25
|
|
104
|
+
judges pr-quality-gate --history
|
|
105
|
+
|
|
106
|
+
Options:
|
|
107
|
+
--check Evaluate against policy (exit code 1 = fail)
|
|
108
|
+
--critical <n> Critical finding count
|
|
109
|
+
--high <n> High finding count
|
|
110
|
+
--medium <n> Medium finding count
|
|
111
|
+
--low <n> Low finding count
|
|
112
|
+
--score <n> Overall score (0-100)
|
|
113
|
+
--policy Show current policy
|
|
114
|
+
--set-policy Update policy thresholds
|
|
115
|
+
--max-critical <n> Set max critical threshold
|
|
116
|
+
--max-high <n> Set max high threshold
|
|
117
|
+
--max-total <n> Set max total threshold
|
|
118
|
+
--auto-approve <n> Set auto-approve score threshold
|
|
119
|
+
--history Show gate decision history
|
|
120
|
+
--format json JSON output
|
|
121
|
+
--help, -h Show this help
|
|
122
|
+
`);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
126
|
+
// Show policy
|
|
127
|
+
if (argv.includes("--policy") && !argv.includes("--set-policy")) {
|
|
128
|
+
const policy = loadPolicy();
|
|
129
|
+
if (format === "json") {
|
|
130
|
+
console.log(JSON.stringify(policy, null, 2));
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
console.log(`\n PR Quality Gate Policy\n ──────────────────────────`);
|
|
134
|
+
console.log(` Max critical: ${policy.maxCritical}`);
|
|
135
|
+
console.log(` Max high: ${policy.maxHigh}`);
|
|
136
|
+
console.log(` Max total: ${policy.maxTotal}`);
|
|
137
|
+
console.log(` Auto-approve >= ${policy.autoApproveBelow} score`);
|
|
138
|
+
console.log(` Require tests: ${policy.requireTestCoverage}`);
|
|
139
|
+
console.log("");
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// Set policy
|
|
144
|
+
if (argv.includes("--set-policy")) {
|
|
145
|
+
const policy = loadPolicy();
|
|
146
|
+
const mc = argv.find((_a, i) => argv[i - 1] === "--max-critical");
|
|
147
|
+
const mh = argv.find((_a, i) => argv[i - 1] === "--max-high");
|
|
148
|
+
const mt = argv.find((_a, i) => argv[i - 1] === "--max-total");
|
|
149
|
+
const aa = argv.find((_a, i) => argv[i - 1] === "--auto-approve");
|
|
150
|
+
if (mc)
|
|
151
|
+
policy.maxCritical = parseInt(mc, 10);
|
|
152
|
+
if (mh)
|
|
153
|
+
policy.maxHigh = parseInt(mh, 10);
|
|
154
|
+
if (mt)
|
|
155
|
+
policy.maxTotal = parseInt(mt, 10);
|
|
156
|
+
if (aa)
|
|
157
|
+
policy.autoApproveBelow = parseInt(aa, 10);
|
|
158
|
+
savePolicy(policy);
|
|
159
|
+
console.log(` ✅ Policy updated`);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// History
|
|
163
|
+
if (argv.includes("--history")) {
|
|
164
|
+
const history = loadHistory();
|
|
165
|
+
if (format === "json") {
|
|
166
|
+
console.log(JSON.stringify(history, null, 2));
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
const passRate = history.results.length > 0
|
|
170
|
+
? Math.round((history.results.filter((r) => r.passed).length / history.results.length) * 100)
|
|
171
|
+
: 0;
|
|
172
|
+
console.log(`\n Gate History (${history.results.length} checks, ${passRate}% pass rate)\n ──────────────────────────`);
|
|
173
|
+
for (const r of history.results.slice(-15)) {
|
|
174
|
+
const icon = r.passed ? "✅" : "❌";
|
|
175
|
+
console.log(` ${icon} ${r.timestamp.slice(0, 16)} score:${r.score} C:${r.critical} H:${r.high} — ${r.reason}`);
|
|
176
|
+
}
|
|
177
|
+
console.log("");
|
|
178
|
+
}
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// Check
|
|
182
|
+
if (argv.includes("--check")) {
|
|
183
|
+
const critical = parseInt(argv.find((_a, i) => argv[i - 1] === "--critical") || "0", 10);
|
|
184
|
+
const high = parseInt(argv.find((_a, i) => argv[i - 1] === "--high") || "0", 10);
|
|
185
|
+
const medium = parseInt(argv.find((_a, i) => argv[i - 1] === "--medium") || "0", 10);
|
|
186
|
+
const low = parseInt(argv.find((_a, i) => argv[i - 1] === "--low") || "0", 10);
|
|
187
|
+
const score = parseInt(argv.find((_a, i) => argv[i - 1] === "--score") || "100", 10);
|
|
188
|
+
const result = evaluateGate(critical, high, medium, low, score);
|
|
189
|
+
if (format === "json") {
|
|
190
|
+
console.log(JSON.stringify(result, null, 2));
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const icon = result.passed ? "✅ PASSED" : "❌ FAILED";
|
|
194
|
+
console.log(`\n PR Quality Gate: ${icon}`);
|
|
195
|
+
console.log(` ──────────────────────────`);
|
|
196
|
+
console.log(` Score: ${result.score}/100`);
|
|
197
|
+
console.log(` Findings: C:${result.critical} H:${result.high} M:${result.medium} L:${result.low} (total: ${result.total})`);
|
|
198
|
+
console.log(` Reason: ${result.reason}`);
|
|
199
|
+
console.log("");
|
|
200
|
+
}
|
|
201
|
+
if (!result.passed) {
|
|
202
|
+
process.exitCode = 1;
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
console.error(" Use --check, --policy, --set-policy, or --history. --help for usage.");
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=pr-quality-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-quality-gate.js","sourceRoot":"","sources":["../../src/commands/pr-quality-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security maturity — assesses organization's security posture
|
|
3
|
+
* maturity level based on Judges usage and finding data.
|
|
4
|
+
*
|
|
5
|
+
* All analysis from local files — no external data.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runSecurityMaturity(argv: string[]): void;
|
|
8
|
+
//# sourceMappingURL=security-maturity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-maturity.d.ts","sourceRoot":"","sources":["../../src/commands/security-maturity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4PH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqFxD"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security maturity — assesses organization's security posture
|
|
3
|
+
* maturity level based on Judges usage and finding data.
|
|
4
|
+
*
|
|
5
|
+
* All analysis from local files — no external data.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
const MATURITY_LABELS = ["Initial", "Developing", "Defined", "Managed", "Optimizing"];
|
|
10
|
+
// ─── Core ───────────────────────────────────────────────────────────────────
|
|
11
|
+
function fileExists(path) {
|
|
12
|
+
return existsSync(path);
|
|
13
|
+
}
|
|
14
|
+
function loadJsonSafe(path, fallback) {
|
|
15
|
+
if (!existsSync(path))
|
|
16
|
+
return fallback;
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return fallback;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function assessMaturity() {
|
|
25
|
+
const dimensions = [];
|
|
26
|
+
// 1. Scanning adoption
|
|
27
|
+
{
|
|
28
|
+
let level = 1;
|
|
29
|
+
const evidence = [];
|
|
30
|
+
const nextSteps = [];
|
|
31
|
+
if (fileExists(".judgesrc")) {
|
|
32
|
+
level = 2;
|
|
33
|
+
evidence.push(".judgesrc configured");
|
|
34
|
+
}
|
|
35
|
+
if (fileExists(".judges-scores")) {
|
|
36
|
+
level = 3;
|
|
37
|
+
evidence.push("Developer scoring active");
|
|
38
|
+
}
|
|
39
|
+
if (fileExists(join(".judges-leaderboard", "leaderboard.json"))) {
|
|
40
|
+
level = 4;
|
|
41
|
+
evidence.push("Team leaderboard active");
|
|
42
|
+
}
|
|
43
|
+
if (fileExists(join(".judges-quality-gate", "policy.json"))) {
|
|
44
|
+
level = 5;
|
|
45
|
+
evidence.push("Quality gate policy set");
|
|
46
|
+
}
|
|
47
|
+
if (level < 2)
|
|
48
|
+
nextSteps.push("Configure .judgesrc with team presets");
|
|
49
|
+
if (level < 3)
|
|
50
|
+
nextSteps.push("Enable developer scoring with `judges dev-score`");
|
|
51
|
+
if (level < 4)
|
|
52
|
+
nextSteps.push("Set up team leaderboard with `judges team-leaderboard`");
|
|
53
|
+
if (level < 5)
|
|
54
|
+
nextSteps.push("Configure quality gate policy with `judges pr-quality-gate --set-policy`");
|
|
55
|
+
dimensions.push({
|
|
56
|
+
name: "Scanning Adoption",
|
|
57
|
+
level,
|
|
58
|
+
maxLevel: 5,
|
|
59
|
+
description: "How widely Judges is used across the team",
|
|
60
|
+
evidence,
|
|
61
|
+
nextSteps,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// 2. Finding management
|
|
65
|
+
{
|
|
66
|
+
let level = 1;
|
|
67
|
+
const evidence = [];
|
|
68
|
+
const nextSteps = [];
|
|
69
|
+
if (fileExists(".judges-suppressions.json")) {
|
|
70
|
+
level = 2;
|
|
71
|
+
evidence.push("Suppressions configured");
|
|
72
|
+
}
|
|
73
|
+
if (fileExists(join(".judges-audit-trail", "trail.json"))) {
|
|
74
|
+
level = 3;
|
|
75
|
+
evidence.push("Audit trail active");
|
|
76
|
+
}
|
|
77
|
+
if (fileExists(".judges-votes.json")) {
|
|
78
|
+
level = 4;
|
|
79
|
+
evidence.push("Consensus voting enabled");
|
|
80
|
+
}
|
|
81
|
+
if (fileExists(join(".judges-auto-fix", "fix-history.json"))) {
|
|
82
|
+
level = 5;
|
|
83
|
+
evidence.push("Auto-fix suggestions used");
|
|
84
|
+
}
|
|
85
|
+
if (level < 2)
|
|
86
|
+
nextSteps.push("Configure finding suppressions with `judges suppress`");
|
|
87
|
+
if (level < 3)
|
|
88
|
+
nextSteps.push("Enable audit trail with `judges audit-trail`");
|
|
89
|
+
if (level < 4)
|
|
90
|
+
nextSteps.push("Set up consensus voting with `judges vote`");
|
|
91
|
+
if (level < 5)
|
|
92
|
+
nextSteps.push("Use auto-fix suggestions with `judges auto-fix`");
|
|
93
|
+
dimensions.push({
|
|
94
|
+
name: "Finding Management",
|
|
95
|
+
level,
|
|
96
|
+
maxLevel: 5,
|
|
97
|
+
description: "How findings are triaged, tracked, and resolved",
|
|
98
|
+
evidence,
|
|
99
|
+
nextSteps,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// 3. Compliance & governance
|
|
103
|
+
{
|
|
104
|
+
let level = 1;
|
|
105
|
+
const evidence = [];
|
|
106
|
+
const nextSteps = [];
|
|
107
|
+
if (fileExists(join(".judges-reg-watch", "watch.json")) || fileExists(".judges-reg-watch.json")) {
|
|
108
|
+
level = 2;
|
|
109
|
+
evidence.push("Regulatory watch configured");
|
|
110
|
+
}
|
|
111
|
+
if (fileExists(".judges-policy-audit.json")) {
|
|
112
|
+
level = 3;
|
|
113
|
+
evidence.push("Policy audit active");
|
|
114
|
+
}
|
|
115
|
+
if (fileExists(join(".judges-audit-bundle", "manifest.json"))) {
|
|
116
|
+
level = 4;
|
|
117
|
+
evidence.push("Audit bundles generated");
|
|
118
|
+
}
|
|
119
|
+
const costData = loadJsonSafe(join(".judges-cost-forecast", "history.json"), {
|
|
120
|
+
snapshots: [],
|
|
121
|
+
});
|
|
122
|
+
if (costData.snapshots.length > 0) {
|
|
123
|
+
level = 5;
|
|
124
|
+
evidence.push("Cost forecasting active");
|
|
125
|
+
}
|
|
126
|
+
if (level < 2)
|
|
127
|
+
nextSteps.push("Set up regulatory watch with `judges reg-watch`");
|
|
128
|
+
if (level < 3)
|
|
129
|
+
nextSteps.push("Run policy audit with `judges policy-audit`");
|
|
130
|
+
if (level < 4)
|
|
131
|
+
nextSteps.push("Generate audit bundles with `judges audit-bundle`");
|
|
132
|
+
if (level < 5)
|
|
133
|
+
nextSteps.push("Track costs with `judges cost-forecast`");
|
|
134
|
+
dimensions.push({
|
|
135
|
+
name: "Compliance & Governance",
|
|
136
|
+
level,
|
|
137
|
+
maxLevel: 5,
|
|
138
|
+
description: "Regulatory compliance and audit readiness",
|
|
139
|
+
evidence,
|
|
140
|
+
nextSteps,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// 4. Team collaboration
|
|
144
|
+
{
|
|
145
|
+
let level = 1;
|
|
146
|
+
const evidence = [];
|
|
147
|
+
const nextSteps = [];
|
|
148
|
+
if (fileExists(".judges-correlations.json")) {
|
|
149
|
+
level = 2;
|
|
150
|
+
evidence.push("Finding correlation active");
|
|
151
|
+
}
|
|
152
|
+
if (fileExists(".judges-digest.json")) {
|
|
153
|
+
level = 3;
|
|
154
|
+
evidence.push("Digest reports active");
|
|
155
|
+
}
|
|
156
|
+
if (fileExists(join(".judges-shared-rules"))) {
|
|
157
|
+
level = 4;
|
|
158
|
+
evidence.push("Rule sharing enabled");
|
|
159
|
+
}
|
|
160
|
+
if (fileExists(join(".judges-patterns"))) {
|
|
161
|
+
level = 5;
|
|
162
|
+
evidence.push("Pattern registry active");
|
|
163
|
+
}
|
|
164
|
+
if (level < 2)
|
|
165
|
+
nextSteps.push("Enable correlation with `judges correlate`");
|
|
166
|
+
if (level < 3)
|
|
167
|
+
nextSteps.push("Set up digests with `judges digest`");
|
|
168
|
+
if (level < 4)
|
|
169
|
+
nextSteps.push("Share rules with `judges rule-share`");
|
|
170
|
+
if (level < 5)
|
|
171
|
+
nextSteps.push("Build pattern registry with `judges pattern-registry`");
|
|
172
|
+
dimensions.push({
|
|
173
|
+
name: "Team Collaboration",
|
|
174
|
+
level,
|
|
175
|
+
maxLevel: 5,
|
|
176
|
+
description: "Knowledge sharing and team review processes",
|
|
177
|
+
evidence,
|
|
178
|
+
nextSteps,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// 5. AI-specific readiness
|
|
182
|
+
{
|
|
183
|
+
let level = 1;
|
|
184
|
+
const evidence = [];
|
|
185
|
+
const nextSteps = [];
|
|
186
|
+
if (fileExists(".judges-model-risk.json")) {
|
|
187
|
+
level = 2;
|
|
188
|
+
evidence.push("Model risk profiling active");
|
|
189
|
+
}
|
|
190
|
+
if (fileExists(join(".judges-model-trust", "trust-history.json"))) {
|
|
191
|
+
level = 3;
|
|
192
|
+
evidence.push("AI model trust scoring active");
|
|
193
|
+
}
|
|
194
|
+
if (fileExists(join(".judges-prompt-audit", "audit-history.json"))) {
|
|
195
|
+
level = 4;
|
|
196
|
+
evidence.push("Prompt injection auditing active");
|
|
197
|
+
}
|
|
198
|
+
if (fileExists(join(".judges-learn"))) {
|
|
199
|
+
level = 5;
|
|
200
|
+
evidence.push("Developer learning paths active");
|
|
201
|
+
}
|
|
202
|
+
if (level < 2)
|
|
203
|
+
nextSteps.push("Profile AI model risks with `judges model-risk`");
|
|
204
|
+
if (level < 3)
|
|
205
|
+
nextSteps.push("Score AI model trust with `judges ai-model-trust`");
|
|
206
|
+
if (level < 4)
|
|
207
|
+
nextSteps.push("Audit for prompt injection with `judges ai-prompt-audit`");
|
|
208
|
+
if (level < 5)
|
|
209
|
+
nextSteps.push("Set up learning paths with `judges learn`");
|
|
210
|
+
dimensions.push({
|
|
211
|
+
name: "AI Readiness",
|
|
212
|
+
level,
|
|
213
|
+
maxLevel: 5,
|
|
214
|
+
description: "AI-specific code review maturity",
|
|
215
|
+
evidence,
|
|
216
|
+
nextSteps,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
// Overall
|
|
220
|
+
const avgLevel = Math.round(dimensions.reduce((s, d) => s + d.level, 0) / dimensions.length);
|
|
221
|
+
const score = Math.round((dimensions.reduce((s, d) => s + d.level, 0) / (dimensions.length * 5)) * 100);
|
|
222
|
+
return {
|
|
223
|
+
overallLevel: avgLevel,
|
|
224
|
+
overallLabel: MATURITY_LABELS[avgLevel - 1] || "Unknown",
|
|
225
|
+
dimensions,
|
|
226
|
+
score,
|
|
227
|
+
timestamp: new Date().toISOString(),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
231
|
+
export function runSecurityMaturity(argv) {
|
|
232
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
233
|
+
console.log(`
|
|
234
|
+
judges security-maturity — Security posture maturity assessment
|
|
235
|
+
|
|
236
|
+
Usage:
|
|
237
|
+
judges security-maturity
|
|
238
|
+
judges security-maturity --dimension "Scanning Adoption"
|
|
239
|
+
judges security-maturity --roadmap
|
|
240
|
+
|
|
241
|
+
Options:
|
|
242
|
+
--dimension <name> Show details for a specific dimension
|
|
243
|
+
--roadmap Show prioritized improvement roadmap
|
|
244
|
+
--format json JSON output
|
|
245
|
+
--help, -h Show this help
|
|
246
|
+
`);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
250
|
+
const assessment = assessMaturity();
|
|
251
|
+
// Single dimension
|
|
252
|
+
const dimName = argv.find((_a, i) => argv[i - 1] === "--dimension");
|
|
253
|
+
if (dimName) {
|
|
254
|
+
const dim = assessment.dimensions.find((d) => d.name.toLowerCase().includes(dimName.toLowerCase()));
|
|
255
|
+
if (!dim) {
|
|
256
|
+
console.error(` Dimension not found. Available: ${assessment.dimensions.map((d) => d.name).join(", ")}`);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (format === "json") {
|
|
260
|
+
console.log(JSON.stringify(dim, null, 2));
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
console.log(`\n ${dim.name} — Level ${dim.level}/${dim.maxLevel} (${MATURITY_LABELS[dim.level - 1]})`);
|
|
264
|
+
console.log(` ──────────────────────────`);
|
|
265
|
+
console.log(` ${dim.description}`);
|
|
266
|
+
if (dim.evidence.length) {
|
|
267
|
+
console.log(`\n Evidence:`);
|
|
268
|
+
for (const e of dim.evidence)
|
|
269
|
+
console.log(` ✅ ${e}`);
|
|
270
|
+
}
|
|
271
|
+
if (dim.nextSteps.length) {
|
|
272
|
+
console.log(`\n Next steps:`);
|
|
273
|
+
for (const s of dim.nextSteps)
|
|
274
|
+
console.log(` → ${s}`);
|
|
275
|
+
}
|
|
276
|
+
console.log("");
|
|
277
|
+
}
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
// Roadmap
|
|
281
|
+
if (argv.includes("--roadmap")) {
|
|
282
|
+
const allSteps = assessment.dimensions
|
|
283
|
+
.sort((a, b) => a.level - b.level)
|
|
284
|
+
.flatMap((d) => d.nextSteps.map((s) => ({ dimension: d.name, level: d.level, step: s })));
|
|
285
|
+
if (format === "json") {
|
|
286
|
+
console.log(JSON.stringify(allSteps, null, 2));
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
console.log(`\n Security Maturity Roadmap\n ──────────────────────────`);
|
|
290
|
+
console.log(` Current: Level ${assessment.overallLevel} (${assessment.overallLabel}) — ${assessment.score}/100\n`);
|
|
291
|
+
for (const s of allSteps) {
|
|
292
|
+
console.log(` [L${s.level}] ${s.dimension.padEnd(25)} → ${s.step}`);
|
|
293
|
+
}
|
|
294
|
+
console.log("");
|
|
295
|
+
}
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
// Full assessment
|
|
299
|
+
if (format === "json") {
|
|
300
|
+
console.log(JSON.stringify(assessment, null, 2));
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
console.log(`\n Security Maturity Assessment`);
|
|
304
|
+
console.log(` Overall: Level ${assessment.overallLevel}/5 (${assessment.overallLabel}) — Score: ${assessment.score}/100`);
|
|
305
|
+
console.log(` ──────────────────────────`);
|
|
306
|
+
for (const d of assessment.dimensions) {
|
|
307
|
+
const bar = "█".repeat(d.level) + "░".repeat(d.maxLevel - d.level);
|
|
308
|
+
console.log(` ${d.name.padEnd(25)} ${bar} ${d.level}/${d.maxLevel} (${MATURITY_LABELS[d.level - 1]})`);
|
|
309
|
+
}
|
|
310
|
+
console.log(`\n Run --roadmap to see improvement steps\n`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=security-maturity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-maturity.js","sourceRoot":"","sources":["../../src/commands/security-maturity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team leaderboard — gamified security review engagement
|
|
3
|
+
* tracking across developers.
|
|
4
|
+
*
|
|
5
|
+
* All data stays in local .judges-leaderboard/ directory.
|
|
6
|
+
*/
|
|
7
|
+
interface DevStats {
|
|
8
|
+
author: string;
|
|
9
|
+
findingsReviewed: number;
|
|
10
|
+
findingsFixed: number;
|
|
11
|
+
criticalFixed: number;
|
|
12
|
+
scansRun: number;
|
|
13
|
+
streak: number;
|
|
14
|
+
lastActive: string;
|
|
15
|
+
badges: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function recordActivity(author: string, activity: {
|
|
18
|
+
reviewed?: number;
|
|
19
|
+
fixed?: number;
|
|
20
|
+
criticalFixed?: number;
|
|
21
|
+
scansRun?: number;
|
|
22
|
+
}): DevStats;
|
|
23
|
+
export declare function runTeamLeaderboard(argv: string[]): void;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=team-leaderboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-leaderboard.d.ts","sourceRoot":"","sources":["../../src/commands/team-leaderboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAoDD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACzF,QAAQ,CAoCV;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqIvD"}
|