@kevinrabun/judges 3.48.0 → 3.50.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/api-audit.d.ts +9 -0
- package/dist/commands/api-audit.d.ts.map +1 -0
- package/dist/commands/api-audit.js +360 -0
- package/dist/commands/api-audit.js.map +1 -0
- package/dist/commands/compliance-map.d.ts +9 -0
- package/dist/commands/compliance-map.d.ts.map +1 -0
- package/dist/commands/compliance-map.js +375 -0
- package/dist/commands/compliance-map.js.map +1 -0
- package/dist/commands/exec-report.d.ts +9 -0
- package/dist/commands/exec-report.d.ts.map +1 -0
- package/dist/commands/exec-report.js +272 -0
- package/dist/commands/exec-report.js.map +1 -0
- package/dist/commands/guided-tour.d.ts +9 -0
- package/dist/commands/guided-tour.d.ts.map +1 -0
- package/dist/commands/guided-tour.js +288 -0
- package/dist/commands/guided-tour.js.map +1 -0
- package/dist/commands/iac-lint.d.ts +8 -0
- package/dist/commands/iac-lint.d.ts.map +1 -0
- package/dist/commands/iac-lint.js +313 -0
- package/dist/commands/iac-lint.js.map +1 -0
- package/dist/commands/incident-response.d.ts +8 -0
- package/dist/commands/incident-response.d.ts.map +1 -0
- package/dist/commands/incident-response.js +255 -0
- package/dist/commands/incident-response.js.map +1 -0
- package/dist/commands/learning-path.d.ts +9 -0
- package/dist/commands/learning-path.d.ts.map +1 -0
- package/dist/commands/learning-path.js +326 -0
- package/dist/commands/learning-path.js.map +1 -0
- package/dist/commands/license-scan.d.ts +9 -0
- package/dist/commands/license-scan.d.ts.map +1 -0
- package/dist/commands/license-scan.js +180 -0
- package/dist/commands/license-scan.js.map +1 -0
- package/dist/commands/org-policy.d.ts +8 -0
- package/dist/commands/org-policy.d.ts.map +1 -0
- package/dist/commands/org-policy.js +208 -0
- package/dist/commands/org-policy.js.map +1 -0
- package/dist/commands/perf-compare.d.ts +9 -0
- package/dist/commands/perf-compare.d.ts.map +1 -0
- package/dist/commands/perf-compare.js +246 -0
- package/dist/commands/perf-compare.js.map +1 -0
- package/dist/commands/pii-scan.d.ts +8 -0
- package/dist/commands/pii-scan.d.ts.map +1 -0
- package/dist/commands/pii-scan.js +300 -0
- package/dist/commands/pii-scan.js.map +1 -0
- package/dist/commands/predict.d.ts +8 -0
- package/dist/commands/predict.d.ts.map +1 -0
- package/dist/commands/predict.js +219 -0
- package/dist/commands/predict.js.map +1 -0
- package/dist/commands/risk-heatmap.d.ts +8 -0
- package/dist/commands/risk-heatmap.d.ts.map +1 -0
- package/dist/commands/risk-heatmap.js +224 -0
- package/dist/commands/risk-heatmap.js.map +1 -0
- package/dist/commands/sbom-export.d.ts +8 -0
- package/dist/commands/sbom-export.d.ts.map +1 -0
- package/dist/commands/sbom-export.js +162 -0
- package/dist/commands/sbom-export.js.map +1 -0
- package/dist/commands/secret-scan.d.ts +8 -0
- package/dist/commands/secret-scan.d.ts.map +1 -0
- package/dist/commands/secret-scan.js +245 -0
- package/dist/commands/secret-scan.js.map +1 -0
- package/dist/commands/test-correlate.d.ts +8 -0
- package/dist/commands/test-correlate.d.ts.map +1 -0
- package/dist/commands/test-correlate.js +222 -0
- package/dist/commands/test-correlate.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learning path — generates personalized developer learning
|
|
3
|
+
* modules from recurring finding patterns, tracking skill
|
|
4
|
+
* progression over time.
|
|
5
|
+
*
|
|
6
|
+
* All data stored locally.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync, mkdirSync, writeFileSync } from "fs";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
// ─── Module Library ─────────────────────────────────────────────────────────
|
|
11
|
+
const MODULES = [
|
|
12
|
+
{
|
|
13
|
+
id: "sql-injection-101",
|
|
14
|
+
topic: "SQL Injection Prevention",
|
|
15
|
+
difficulty: "beginner",
|
|
16
|
+
description: "Learn to identify and prevent SQL injection vulnerabilities",
|
|
17
|
+
resources: [
|
|
18
|
+
"OWASP SQL Injection Prevention Cheat Sheet",
|
|
19
|
+
"Use parameterized queries instead of string concatenation",
|
|
20
|
+
"Apply input validation at system boundaries",
|
|
21
|
+
],
|
|
22
|
+
exercises: [
|
|
23
|
+
"Refactor a string-concatenated query to use parameterized statements",
|
|
24
|
+
"Identify SQL injection vectors in a sample CRUD controller",
|
|
25
|
+
"Implement an ORM-based data access layer",
|
|
26
|
+
],
|
|
27
|
+
prerequisites: [],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "xss-prevention",
|
|
31
|
+
topic: "Cross-Site Scripting (XSS) Prevention",
|
|
32
|
+
difficulty: "beginner",
|
|
33
|
+
description: "Understand and prevent XSS vulnerabilities in web applications",
|
|
34
|
+
resources: [
|
|
35
|
+
"OWASP XSS Prevention Cheat Sheet",
|
|
36
|
+
"Content Security Policy (CSP) headers",
|
|
37
|
+
"Output encoding for different contexts (HTML, JS, URL, CSS)",
|
|
38
|
+
],
|
|
39
|
+
exercises: [
|
|
40
|
+
"Add output encoding to a template rendering user input",
|
|
41
|
+
"Configure CSP headers for a web application",
|
|
42
|
+
"Test for DOM-based XSS in a client-side application",
|
|
43
|
+
],
|
|
44
|
+
prerequisites: [],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "auth-security",
|
|
48
|
+
topic: "Authentication & Authorization",
|
|
49
|
+
difficulty: "intermediate",
|
|
50
|
+
description: "Implement secure authentication and authorization patterns",
|
|
51
|
+
resources: [
|
|
52
|
+
"OWASP Authentication Cheat Sheet",
|
|
53
|
+
"JWT best practices and pitfalls",
|
|
54
|
+
"OAuth 2.0 and OpenID Connect fundamentals",
|
|
55
|
+
],
|
|
56
|
+
exercises: [
|
|
57
|
+
"Implement rate limiting on login endpoints",
|
|
58
|
+
"Add proper JWT validation with signature verification",
|
|
59
|
+
"Design role-based access control for an API",
|
|
60
|
+
],
|
|
61
|
+
prerequisites: ["sql-injection-101"],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "crypto-basics",
|
|
65
|
+
topic: "Cryptography Fundamentals",
|
|
66
|
+
difficulty: "intermediate",
|
|
67
|
+
description: "Use cryptographic primitives correctly",
|
|
68
|
+
resources: [
|
|
69
|
+
"OWASP Cryptographic Storage Cheat Sheet",
|
|
70
|
+
"Modern cipher suites and key management",
|
|
71
|
+
"Password hashing: bcrypt, scrypt, Argon2",
|
|
72
|
+
],
|
|
73
|
+
exercises: [
|
|
74
|
+
"Replace MD5/SHA-1 with SHA-256 or better",
|
|
75
|
+
"Implement proper password hashing with Argon2",
|
|
76
|
+
"Set up encrypted-at-rest storage for sensitive data",
|
|
77
|
+
],
|
|
78
|
+
prerequisites: [],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: "ssrf-prevention",
|
|
82
|
+
topic: "Server-Side Request Forgery (SSRF)",
|
|
83
|
+
difficulty: "advanced",
|
|
84
|
+
description: "Prevent SSRF attacks in web applications",
|
|
85
|
+
resources: [
|
|
86
|
+
"OWASP SSRF Prevention Cheat Sheet",
|
|
87
|
+
"URL validation and allowlisting strategies",
|
|
88
|
+
"Network segmentation for defense in depth",
|
|
89
|
+
],
|
|
90
|
+
exercises: [
|
|
91
|
+
"Implement URL validation with an allowlist",
|
|
92
|
+
"Block internal IP ranges in outbound requests",
|
|
93
|
+
"Design a secure proxy service for external API calls",
|
|
94
|
+
],
|
|
95
|
+
prerequisites: ["auth-security"],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: "supply-chain",
|
|
99
|
+
topic: "Supply Chain Security",
|
|
100
|
+
difficulty: "advanced",
|
|
101
|
+
description: "Secure the software supply chain",
|
|
102
|
+
resources: [
|
|
103
|
+
"SLSA framework for supply chain integrity",
|
|
104
|
+
"Dependency pinning and lock file management",
|
|
105
|
+
"SBOM generation and consumption",
|
|
106
|
+
],
|
|
107
|
+
exercises: [
|
|
108
|
+
"Generate an SBOM with `judges sbom-export`",
|
|
109
|
+
"Audit dependencies with `judges dep-correlate`",
|
|
110
|
+
"Set up automated dependency update policies",
|
|
111
|
+
],
|
|
112
|
+
prerequisites: ["crypto-basics"],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
id: "secure-code-review",
|
|
116
|
+
topic: "Secure Code Review Practices",
|
|
117
|
+
difficulty: "intermediate",
|
|
118
|
+
description: "Conduct effective security-focused code reviews",
|
|
119
|
+
resources: [
|
|
120
|
+
"OWASP Code Review Guide",
|
|
121
|
+
"Common vulnerability patterns by language",
|
|
122
|
+
"Using Judges for automated security review",
|
|
123
|
+
],
|
|
124
|
+
exercises: [
|
|
125
|
+
"Review a sample PR for security issues using Judges",
|
|
126
|
+
"Create a custom judge with `judges judge-author`",
|
|
127
|
+
"Build a team pattern library with `judges pattern-registry`",
|
|
128
|
+
],
|
|
129
|
+
prerequisites: ["sql-injection-101", "xss-prevention"],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: "incident-handling",
|
|
133
|
+
topic: "Security Incident Handling",
|
|
134
|
+
difficulty: "advanced",
|
|
135
|
+
description: "Respond to and manage security incidents",
|
|
136
|
+
resources: [
|
|
137
|
+
"NIST Incident Response Guide",
|
|
138
|
+
"Post-incident review best practices",
|
|
139
|
+
"Using `judges incident-response` for playbook generation",
|
|
140
|
+
],
|
|
141
|
+
exercises: [
|
|
142
|
+
"Create an incident response playbook for a critical finding",
|
|
143
|
+
"Conduct a tabletop exercise with the team",
|
|
144
|
+
"Set up SLA tracking with `judges sla-track`",
|
|
145
|
+
],
|
|
146
|
+
prerequisites: ["secure-code-review", "auth-security"],
|
|
147
|
+
},
|
|
148
|
+
];
|
|
149
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
150
|
+
const TOPIC_PATTERNS = {
|
|
151
|
+
"SQL Injection Prevention": ["sql", "injection", "query", "database"],
|
|
152
|
+
"Cross-Site Scripting (XSS) Prevention": ["xss", "cross-site", "script", "sanitize", "encode"],
|
|
153
|
+
"Authentication & Authorization": ["auth", "login", "password", "token", "jwt", "session", "rbac"],
|
|
154
|
+
"Cryptography Fundamentals": ["crypto", "cipher", "hash", "encrypt", "md5", "sha1", "key"],
|
|
155
|
+
"Server-Side Request Forgery (SSRF)": ["ssrf", "request-forgery", "url", "redirect"],
|
|
156
|
+
"Supply Chain Security": ["dependency", "package", "npm", "supply-chain", "sbom"],
|
|
157
|
+
"Secure Code Review Practices": ["review", "code-quality", "pattern"],
|
|
158
|
+
"Security Incident Handling": ["incident", "breach", "response", "escalation"],
|
|
159
|
+
};
|
|
160
|
+
function analyzeWeaknesses(findings) {
|
|
161
|
+
const topicCounts = new Map();
|
|
162
|
+
for (const f of findings) {
|
|
163
|
+
const text = `${f.ruleId} ${f.title}`.toLowerCase();
|
|
164
|
+
for (const [topic, patterns] of Object.entries(TOPIC_PATTERNS)) {
|
|
165
|
+
if (patterns.some((p) => text.includes(p))) {
|
|
166
|
+
topicCounts.set(topic, (topicCounts.get(topic) || 0) + 1);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return [...topicCounts.entries()]
|
|
171
|
+
.map(([topic, count]) => ({ topic, findingCount: count }))
|
|
172
|
+
.sort((a, b) => b.findingCount - a.findingCount);
|
|
173
|
+
}
|
|
174
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
175
|
+
const STORE = ".judges-learning";
|
|
176
|
+
export function runLearningPath(argv) {
|
|
177
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
178
|
+
console.log(`
|
|
179
|
+
judges learning-path — Personalized security learning recommendations
|
|
180
|
+
|
|
181
|
+
Usage:
|
|
182
|
+
judges learning-path
|
|
183
|
+
judges learning-path --developer "alice"
|
|
184
|
+
judges learning-path --modules
|
|
185
|
+
judges learning-path --complete <module-id>
|
|
186
|
+
|
|
187
|
+
Options:
|
|
188
|
+
--developer <name> Developer name for personalized path
|
|
189
|
+
--modules List all available learning modules
|
|
190
|
+
--complete <id> Mark a module as completed
|
|
191
|
+
--reset Reset progress for developer
|
|
192
|
+
--format json JSON output
|
|
193
|
+
--help, -h Show this help
|
|
194
|
+
`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
198
|
+
// List modules
|
|
199
|
+
if (argv.includes("--modules")) {
|
|
200
|
+
if (format === "json") {
|
|
201
|
+
console.log(JSON.stringify(MODULES, null, 2));
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
console.log(`\n Learning Modules (${MODULES.length})\n ──────────────────────────`);
|
|
205
|
+
for (const m of MODULES) {
|
|
206
|
+
console.log(` [${m.difficulty.padEnd(12)}] ${m.id.padEnd(25)} ${m.topic}`);
|
|
207
|
+
}
|
|
208
|
+
console.log("");
|
|
209
|
+
}
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (!existsSync(STORE))
|
|
213
|
+
mkdirSync(STORE, { recursive: true });
|
|
214
|
+
const devName = argv.find((_a, i) => argv[i - 1] === "--developer") || "default";
|
|
215
|
+
const progressPath = join(STORE, `${devName}-progress.json`);
|
|
216
|
+
let progress = existsSync(progressPath)
|
|
217
|
+
? JSON.parse(readFileSync(progressPath, "utf-8"))
|
|
218
|
+
: { developer: devName, completedModules: [], weakAreas: [], skillLevel: 1, lastUpdated: new Date().toISOString() };
|
|
219
|
+
// Reset
|
|
220
|
+
if (argv.includes("--reset")) {
|
|
221
|
+
progress = {
|
|
222
|
+
developer: devName,
|
|
223
|
+
completedModules: [],
|
|
224
|
+
weakAreas: [],
|
|
225
|
+
skillLevel: 1,
|
|
226
|
+
lastUpdated: new Date().toISOString(),
|
|
227
|
+
};
|
|
228
|
+
writeFileSync(progressPath, JSON.stringify(progress, null, 2));
|
|
229
|
+
console.log(` Reset progress for ${devName}`);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
// Complete module
|
|
233
|
+
const completeId = argv.find((_a, i) => argv[i - 1] === "--complete");
|
|
234
|
+
if (completeId) {
|
|
235
|
+
const mod = MODULES.find((m) => m.id === completeId);
|
|
236
|
+
if (!mod) {
|
|
237
|
+
console.error(` Module ${completeId} not found.`);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
if (!progress.completedModules.includes(completeId)) {
|
|
241
|
+
progress.completedModules.push(completeId);
|
|
242
|
+
progress.skillLevel = Math.min(10, Math.round((progress.completedModules.length / MODULES.length) * 10));
|
|
243
|
+
progress.lastUpdated = new Date().toISOString();
|
|
244
|
+
writeFileSync(progressPath, JSON.stringify(progress, null, 2));
|
|
245
|
+
}
|
|
246
|
+
console.log(` Completed: ${mod.topic} — Skill level: ${progress.skillLevel}/10`);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
// Analyze and recommend
|
|
250
|
+
const findings = [];
|
|
251
|
+
const paths = [".judges-findings.json", "judges-report.json"];
|
|
252
|
+
for (const p of paths) {
|
|
253
|
+
if (!existsSync(p))
|
|
254
|
+
continue;
|
|
255
|
+
try {
|
|
256
|
+
const data = JSON.parse(readFileSync(p, "utf-8"));
|
|
257
|
+
if (Array.isArray(data))
|
|
258
|
+
findings.push(...data);
|
|
259
|
+
else if (data.findings)
|
|
260
|
+
findings.push(...data.findings);
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
/* skip */
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
const weakAreas = analyzeWeaknesses(findings);
|
|
267
|
+
progress.weakAreas = weakAreas;
|
|
268
|
+
progress.lastUpdated = new Date().toISOString();
|
|
269
|
+
writeFileSync(progressPath, JSON.stringify(progress, null, 2));
|
|
270
|
+
// Find recommended modules (not completed, prerequisites met)
|
|
271
|
+
const recommended = MODULES.filter((m) => {
|
|
272
|
+
if (progress.completedModules.includes(m.id))
|
|
273
|
+
return false;
|
|
274
|
+
const prereqsMet = m.prerequisites.every((p) => progress.completedModules.includes(p));
|
|
275
|
+
if (!prereqsMet)
|
|
276
|
+
return false;
|
|
277
|
+
// Prioritize modules matching weak areas
|
|
278
|
+
return true;
|
|
279
|
+
});
|
|
280
|
+
// Sort by relevance to weak areas
|
|
281
|
+
const sortedRecs = recommended.sort((a, b) => {
|
|
282
|
+
const aRelevance = weakAreas.find((w) => w.topic === a.topic)?.findingCount || 0;
|
|
283
|
+
const bRelevance = weakAreas.find((w) => w.topic === b.topic)?.findingCount || 0;
|
|
284
|
+
return bRelevance - aRelevance;
|
|
285
|
+
});
|
|
286
|
+
const report = {
|
|
287
|
+
recommendedModules: sortedRecs,
|
|
288
|
+
progress,
|
|
289
|
+
timestamp: new Date().toISOString(),
|
|
290
|
+
};
|
|
291
|
+
if (format === "json") {
|
|
292
|
+
console.log(JSON.stringify(report, null, 2));
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
console.log(`\n Learning Path — ${devName}`);
|
|
296
|
+
console.log(` Skill Level: ${progress.skillLevel}/10 Completed: ${progress.completedModules.length}/${MODULES.length}`);
|
|
297
|
+
console.log(` ──────────────────────────`);
|
|
298
|
+
if (weakAreas.length > 0) {
|
|
299
|
+
console.log(`\n Weak Areas (from findings):`);
|
|
300
|
+
for (const w of weakAreas.slice(0, 5)) {
|
|
301
|
+
console.log(` ${w.topic.padEnd(35)} ${w.findingCount} findings`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
console.log(`\n Recommended Modules:`);
|
|
305
|
+
if (sortedRecs.length === 0) {
|
|
306
|
+
console.log(` 🎉 All available modules completed!`);
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
for (const m of sortedRecs.slice(0, 5)) {
|
|
310
|
+
const relevant = weakAreas.find((w) => w.topic === m.topic);
|
|
311
|
+
const tag = relevant ? ` (${relevant.findingCount} findings)` : "";
|
|
312
|
+
console.log(` [${m.difficulty.padEnd(12)}] ${m.id}${tag}`);
|
|
313
|
+
console.log(` ${m.topic}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (progress.completedModules.length > 0) {
|
|
317
|
+
console.log(`\n Completed:`);
|
|
318
|
+
for (const id of progress.completedModules) {
|
|
319
|
+
const mod = MODULES.find((m) => m.id === id);
|
|
320
|
+
console.log(` ✅ ${mod?.topic || id}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
console.log("");
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=learning-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-path.js","sourceRoot":"","sources":["../../src/commands/learning-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License scan — scans project dependencies for license
|
|
3
|
+
* compatibility, flags copyleft/unknown licenses, and
|
|
4
|
+
* generates a license obligations report.
|
|
5
|
+
*
|
|
6
|
+
* All data from local files.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runLicenseScan(argv: string[]): void;
|
|
9
|
+
//# sourceMappingURL=license-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-scan.d.ts","sourceRoot":"","sources":["../../src/commands/license-scan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiIH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkFnD"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License scan — scans project dependencies for license
|
|
3
|
+
* compatibility, flags copyleft/unknown licenses, and
|
|
4
|
+
* generates a license obligations report.
|
|
5
|
+
*
|
|
6
|
+
* All data from local files.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync, mkdirSync, writeFileSync } from "fs";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
// ─── License DB ─────────────────────────────────────────────────────────────
|
|
11
|
+
const LICENSE_CATEGORIES = {
|
|
12
|
+
MIT: { category: "permissive", risk: "low" },
|
|
13
|
+
ISC: { category: "permissive", risk: "low" },
|
|
14
|
+
"BSD-2-Clause": { category: "permissive", risk: "low" },
|
|
15
|
+
"BSD-3-Clause": { category: "permissive", risk: "low" },
|
|
16
|
+
"Apache-2.0": { category: "permissive", risk: "low" },
|
|
17
|
+
Unlicense: { category: "permissive", risk: "low" },
|
|
18
|
+
"0BSD": { category: "permissive", risk: "low" },
|
|
19
|
+
"CC0-1.0": { category: "permissive", risk: "low" },
|
|
20
|
+
Zlib: { category: "permissive", risk: "low" },
|
|
21
|
+
"GPL-2.0": { category: "copyleft", risk: "high" },
|
|
22
|
+
"GPL-3.0": { category: "copyleft", risk: "high" },
|
|
23
|
+
"AGPL-3.0": { category: "copyleft", risk: "high" },
|
|
24
|
+
"GPL-2.0-only": { category: "copyleft", risk: "high" },
|
|
25
|
+
"GPL-3.0-only": { category: "copyleft", risk: "high" },
|
|
26
|
+
"AGPL-3.0-only": { category: "copyleft", risk: "high" },
|
|
27
|
+
"LGPL-2.1": { category: "weak-copyleft", risk: "medium" },
|
|
28
|
+
"LGPL-3.0": { category: "weak-copyleft", risk: "medium" },
|
|
29
|
+
"MPL-2.0": { category: "weak-copyleft", risk: "medium" },
|
|
30
|
+
"EPL-1.0": { category: "weak-copyleft", risk: "medium" },
|
|
31
|
+
"EPL-2.0": { category: "weak-copyleft", risk: "medium" },
|
|
32
|
+
"CDDL-1.0": { category: "weak-copyleft", risk: "medium" },
|
|
33
|
+
};
|
|
34
|
+
function classifyLicense(license) {
|
|
35
|
+
const normalized = license.trim().replace(/\s+/g, "-");
|
|
36
|
+
return LICENSE_CATEGORIES[normalized] || { category: "unknown", risk: "high" };
|
|
37
|
+
}
|
|
38
|
+
// ─── Scanning ───────────────────────────────────────────────────────────────
|
|
39
|
+
function scanNpmLicenses() {
|
|
40
|
+
const results = [];
|
|
41
|
+
// Try node_modules approach
|
|
42
|
+
if (existsSync("package.json")) {
|
|
43
|
+
try {
|
|
44
|
+
const pkg = JSON.parse(readFileSync("package.json", "utf-8"));
|
|
45
|
+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
46
|
+
for (const [name, ver] of Object.entries(allDeps)) {
|
|
47
|
+
let license = "UNKNOWN";
|
|
48
|
+
// Check node_modules for the package's package.json
|
|
49
|
+
const depPkgPath = join("node_modules", name, "package.json");
|
|
50
|
+
if (existsSync(depPkgPath)) {
|
|
51
|
+
try {
|
|
52
|
+
const depPkg = JSON.parse(readFileSync(depPkgPath, "utf-8"));
|
|
53
|
+
if (typeof depPkg.license === "string") {
|
|
54
|
+
license = depPkg.license;
|
|
55
|
+
}
|
|
56
|
+
else if (depPkg.license?.type) {
|
|
57
|
+
license = depPkg.license.type;
|
|
58
|
+
}
|
|
59
|
+
else if (Array.isArray(depPkg.licenses)) {
|
|
60
|
+
license = depPkg.licenses.map((l) => l.type || "UNKNOWN").join(" OR ");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
/* skip */
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const { category, risk } = classifyLicense(license);
|
|
68
|
+
results.push({
|
|
69
|
+
dependency: name,
|
|
70
|
+
version: String(ver).replace(/^[\^~>=<]+/, ""),
|
|
71
|
+
license,
|
|
72
|
+
category,
|
|
73
|
+
risk,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
/* skip */
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return results;
|
|
82
|
+
}
|
|
83
|
+
function detectConflicts(licenses) {
|
|
84
|
+
const conflicts = [];
|
|
85
|
+
const hasCopyleft = licenses.some((l) => l.category === "copyleft");
|
|
86
|
+
const hasProprietary = licenses.some((l) => l.category === "proprietary");
|
|
87
|
+
if (hasCopyleft && hasProprietary) {
|
|
88
|
+
conflicts.push("Copyleft and proprietary licenses detected — may be incompatible");
|
|
89
|
+
}
|
|
90
|
+
const agpl = licenses.filter((l) => l.license.includes("AGPL"));
|
|
91
|
+
if (agpl.length > 0) {
|
|
92
|
+
conflicts.push(`AGPL license detected in: ${agpl.map((l) => l.dependency).join(", ")} — requires source disclosure for network use`);
|
|
93
|
+
}
|
|
94
|
+
const unknown = licenses.filter((l) => l.category === "unknown");
|
|
95
|
+
if (unknown.length > 0) {
|
|
96
|
+
conflicts.push(`Unknown licenses in: ${unknown.map((l) => l.dependency).join(", ")} — review manually`);
|
|
97
|
+
}
|
|
98
|
+
return conflicts;
|
|
99
|
+
}
|
|
100
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
101
|
+
const STORE = ".judges-licenses";
|
|
102
|
+
export function runLicenseScan(argv) {
|
|
103
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
104
|
+
console.log(`
|
|
105
|
+
judges license-scan — Dependency license compliance scanning
|
|
106
|
+
|
|
107
|
+
Usage:
|
|
108
|
+
judges license-scan
|
|
109
|
+
judges license-scan --risk high
|
|
110
|
+
judges license-scan --category copyleft
|
|
111
|
+
judges license-scan --save
|
|
112
|
+
|
|
113
|
+
Options:
|
|
114
|
+
--risk <level> Filter by risk level (low, medium, high)
|
|
115
|
+
--category <cat> Filter by category (permissive, copyleft, weak-copyleft, proprietary, unknown)
|
|
116
|
+
--save Save report to ${STORE}/
|
|
117
|
+
--format json JSON output
|
|
118
|
+
--help, -h Show this help
|
|
119
|
+
`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
123
|
+
let licenses = scanNpmLicenses();
|
|
124
|
+
if (licenses.length === 0) {
|
|
125
|
+
console.log(" No dependencies found. Run from a project root with package.json.");
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Filters
|
|
129
|
+
const riskFilter = argv.find((_a, i) => argv[i - 1] === "--risk");
|
|
130
|
+
if (riskFilter)
|
|
131
|
+
licenses = licenses.filter((l) => l.risk === riskFilter);
|
|
132
|
+
const catFilter = argv.find((_a, i) => argv[i - 1] === "--category");
|
|
133
|
+
if (catFilter)
|
|
134
|
+
licenses = licenses.filter((l) => l.category === catFilter);
|
|
135
|
+
const conflicts = detectConflicts(licenses);
|
|
136
|
+
const report = {
|
|
137
|
+
licenses,
|
|
138
|
+
summary: {
|
|
139
|
+
permissive: licenses.filter((l) => l.category === "permissive").length,
|
|
140
|
+
copyleft: licenses.filter((l) => l.category === "copyleft").length,
|
|
141
|
+
weakCopyleft: licenses.filter((l) => l.category === "weak-copyleft").length,
|
|
142
|
+
proprietary: licenses.filter((l) => l.category === "proprietary").length,
|
|
143
|
+
unknown: licenses.filter((l) => l.category === "unknown").length,
|
|
144
|
+
},
|
|
145
|
+
conflicts,
|
|
146
|
+
timestamp: new Date().toISOString(),
|
|
147
|
+
};
|
|
148
|
+
if (argv.includes("--save")) {
|
|
149
|
+
if (!existsSync(STORE))
|
|
150
|
+
mkdirSync(STORE, { recursive: true });
|
|
151
|
+
writeFileSync(join(STORE, "license-report.json"), JSON.stringify(report, null, 2));
|
|
152
|
+
console.log(` Report saved to ${STORE}/license-report.json`);
|
|
153
|
+
}
|
|
154
|
+
if (format === "json") {
|
|
155
|
+
console.log(JSON.stringify(report, null, 2));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
console.log(`\n License Scan — ${licenses.length} dependencies`);
|
|
159
|
+
console.log(` ──────────────────────────`);
|
|
160
|
+
console.log(` Permissive: ${report.summary.permissive}`);
|
|
161
|
+
console.log(` Weak-copyleft: ${report.summary.weakCopyleft}`);
|
|
162
|
+
console.log(` Copyleft: ${report.summary.copyleft}`);
|
|
163
|
+
console.log(` Unknown: ${report.summary.unknown}`);
|
|
164
|
+
if (conflicts.length > 0) {
|
|
165
|
+
console.log(`\n ⚠️ Conflicts:`);
|
|
166
|
+
for (const c of conflicts)
|
|
167
|
+
console.log(` ${c}`);
|
|
168
|
+
}
|
|
169
|
+
// Show high-risk
|
|
170
|
+
const highRisk = licenses.filter((l) => l.risk === "high");
|
|
171
|
+
if (highRisk.length > 0) {
|
|
172
|
+
console.log(`\n High Risk (${highRisk.length}):`);
|
|
173
|
+
for (const l of highRisk) {
|
|
174
|
+
console.log(` ${l.dependency.padEnd(30)} ${l.license.padEnd(15)} ${l.category}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
console.log("");
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=license-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-scan.js","sourceRoot":"","sources":["../../src/commands/license-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Org policy — defines, validates, and enforces organization-wide
|
|
3
|
+
* policy manifests that cascade into per-repo .judgesrc files.
|
|
4
|
+
*
|
|
5
|
+
* All data stored locally.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runOrgPolicy(argv: string[]): void;
|
|
8
|
+
//# sourceMappingURL=org-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-policy.d.ts","sourceRoot":"","sources":["../../src/commands/org-policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqHH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiIjD"}
|