@kevinrabun/judges 3.41.0 → 3.42.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 +17 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +70 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto-triage.d.ts +32 -0
- package/dist/commands/auto-triage.d.ts.map +1 -0
- package/dist/commands/auto-triage.js +126 -0
- package/dist/commands/auto-triage.js.map +1 -0
- package/dist/commands/coverage-map.d.ts +23 -0
- package/dist/commands/coverage-map.d.ts.map +1 -0
- package/dist/commands/coverage-map.js +223 -0
- package/dist/commands/coverage-map.js.map +1 -0
- package/dist/commands/diff-only.d.ts +34 -0
- package/dist/commands/diff-only.d.ts.map +1 -0
- package/dist/commands/diff-only.js +152 -0
- package/dist/commands/diff-only.js.map +1 -0
- package/dist/commands/group-findings.d.ts +23 -0
- package/dist/commands/group-findings.d.ts.map +1 -0
- package/dist/commands/group-findings.js +155 -0
- package/dist/commands/group-findings.js.map +1 -0
- package/dist/commands/pr-summary.d.ts +26 -0
- package/dist/commands/pr-summary.d.ts.map +1 -0
- package/dist/commands/pr-summary.js +188 -0
- package/dist/commands/pr-summary.js.map +1 -0
- package/dist/commands/profile.d.ts +38 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +102 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/smart-select.d.ts +27 -0
- package/dist/commands/smart-select.d.ts.map +1 -0
- package/dist/commands/smart-select.js +346 -0
- package/dist/commands/smart-select.js.map +1 -0
- package/dist/commands/upload.d.ts +14 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +173 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/validate-config.d.ts +17 -0
- package/dist/commands/validate-config.d.ts.map +1 -0
- package/dist/commands/validate-config.js +268 -0
- package/dist/commands/validate-config.js.map +1 -0
- package/dist/commands/warm-cache.d.ts +31 -0
- package/dist/commands/warm-cache.d.ts.map +1 -0
- package/dist/commands/warm-cache.js +166 -0
- package/dist/commands/warm-cache.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart judge selection — auto-select relevant judges based on file content.
|
|
3
|
+
*
|
|
4
|
+
* Avoids running irrelevant judges (e.g., SQL judge on .tsx files,
|
|
5
|
+
* IaC judge on .py files) to improve evaluation speed and reduce noise.
|
|
6
|
+
*
|
|
7
|
+
* Used internally by the evaluation pipeline when `smartSelect: true`.
|
|
8
|
+
*/
|
|
9
|
+
import { defaultRegistry } from "../judge-registry.js";
|
|
10
|
+
// ─── Language → Judge Relevance ─────────────────────────────────────────────
|
|
11
|
+
/** Judges that are always relevant regardless of language */
|
|
12
|
+
const UNIVERSAL_JUDGES = new Set([
|
|
13
|
+
"code-structure",
|
|
14
|
+
"error-handling",
|
|
15
|
+
"documentation",
|
|
16
|
+
"maintainability",
|
|
17
|
+
"testing",
|
|
18
|
+
"logic-review",
|
|
19
|
+
"intent-alignment",
|
|
20
|
+
"ai-code-safety",
|
|
21
|
+
"software-practices",
|
|
22
|
+
"over-engineering",
|
|
23
|
+
]);
|
|
24
|
+
/** Judges relevant only for specific language families */
|
|
25
|
+
const LANGUAGE_SPECIFIC = {
|
|
26
|
+
// Security judges — relevant for all code languages
|
|
27
|
+
cybersecurity: new Set([
|
|
28
|
+
"typescript",
|
|
29
|
+
"javascript",
|
|
30
|
+
"python",
|
|
31
|
+
"go",
|
|
32
|
+
"rust",
|
|
33
|
+
"java",
|
|
34
|
+
"csharp",
|
|
35
|
+
"ruby",
|
|
36
|
+
"php",
|
|
37
|
+
"swift",
|
|
38
|
+
"kotlin",
|
|
39
|
+
"c",
|
|
40
|
+
"cpp",
|
|
41
|
+
"dart",
|
|
42
|
+
"scala",
|
|
43
|
+
]),
|
|
44
|
+
"data-security": new Set([
|
|
45
|
+
"typescript",
|
|
46
|
+
"javascript",
|
|
47
|
+
"python",
|
|
48
|
+
"go",
|
|
49
|
+
"rust",
|
|
50
|
+
"java",
|
|
51
|
+
"csharp",
|
|
52
|
+
"ruby",
|
|
53
|
+
"php",
|
|
54
|
+
"swift",
|
|
55
|
+
"kotlin",
|
|
56
|
+
"c",
|
|
57
|
+
"cpp",
|
|
58
|
+
"dart",
|
|
59
|
+
"scala",
|
|
60
|
+
]),
|
|
61
|
+
authentication: new Set([
|
|
62
|
+
"typescript",
|
|
63
|
+
"javascript",
|
|
64
|
+
"python",
|
|
65
|
+
"go",
|
|
66
|
+
"java",
|
|
67
|
+
"csharp",
|
|
68
|
+
"ruby",
|
|
69
|
+
"php",
|
|
70
|
+
"kotlin",
|
|
71
|
+
"scala",
|
|
72
|
+
]),
|
|
73
|
+
security: new Set([
|
|
74
|
+
"typescript",
|
|
75
|
+
"javascript",
|
|
76
|
+
"python",
|
|
77
|
+
"go",
|
|
78
|
+
"rust",
|
|
79
|
+
"java",
|
|
80
|
+
"csharp",
|
|
81
|
+
"ruby",
|
|
82
|
+
"php",
|
|
83
|
+
"swift",
|
|
84
|
+
"kotlin",
|
|
85
|
+
"c",
|
|
86
|
+
"cpp",
|
|
87
|
+
"dart",
|
|
88
|
+
"scala",
|
|
89
|
+
]),
|
|
90
|
+
// Infrastructure judges
|
|
91
|
+
"iac-security": new Set(["terraform", "bicep", "arm", "yaml", "dockerfile"]),
|
|
92
|
+
"ci-cd": new Set(["yaml", "dockerfile", "bash", "powershell"]),
|
|
93
|
+
"cloud-readiness": new Set([
|
|
94
|
+
"typescript",
|
|
95
|
+
"javascript",
|
|
96
|
+
"python",
|
|
97
|
+
"go",
|
|
98
|
+
"java",
|
|
99
|
+
"csharp",
|
|
100
|
+
"yaml",
|
|
101
|
+
"terraform",
|
|
102
|
+
"dockerfile",
|
|
103
|
+
]),
|
|
104
|
+
// Database judge
|
|
105
|
+
database: new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "php", "sql", "kotlin"]),
|
|
106
|
+
// Performance judges
|
|
107
|
+
performance: new Set([
|
|
108
|
+
"typescript",
|
|
109
|
+
"javascript",
|
|
110
|
+
"python",
|
|
111
|
+
"go",
|
|
112
|
+
"rust",
|
|
113
|
+
"java",
|
|
114
|
+
"csharp",
|
|
115
|
+
"ruby",
|
|
116
|
+
"c",
|
|
117
|
+
"cpp",
|
|
118
|
+
"kotlin",
|
|
119
|
+
"scala",
|
|
120
|
+
]),
|
|
121
|
+
scalability: new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "kotlin", "scala"]),
|
|
122
|
+
caching: new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "kotlin"]),
|
|
123
|
+
"cost-effectiveness": new Set(["typescript", "javascript", "python", "go", "java", "csharp", "yaml", "terraform"]),
|
|
124
|
+
// Reliability
|
|
125
|
+
reliability: new Set([
|
|
126
|
+
"typescript",
|
|
127
|
+
"javascript",
|
|
128
|
+
"python",
|
|
129
|
+
"go",
|
|
130
|
+
"rust",
|
|
131
|
+
"java",
|
|
132
|
+
"csharp",
|
|
133
|
+
"ruby",
|
|
134
|
+
"kotlin",
|
|
135
|
+
"scala",
|
|
136
|
+
]),
|
|
137
|
+
observability: new Set(["typescript", "javascript", "python", "go", "java", "csharp", "kotlin"]),
|
|
138
|
+
"rate-limiting": new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "kotlin"]),
|
|
139
|
+
// Compliance judges
|
|
140
|
+
compliance: new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "php", "kotlin"]),
|
|
141
|
+
"data-sovereignty": new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "kotlin"]),
|
|
142
|
+
// UX / Accessibility — only frontend
|
|
143
|
+
accessibility: new Set(["typescript", "javascript", "html"]),
|
|
144
|
+
ux: new Set(["typescript", "javascript", "html"]),
|
|
145
|
+
internationalization: new Set(["typescript", "javascript", "python", "java", "csharp", "ruby", "kotlin"]),
|
|
146
|
+
// Backwards compatibility
|
|
147
|
+
"backwards-compatibility": new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "kotlin"]),
|
|
148
|
+
// API judges
|
|
149
|
+
"api-contract": new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "kotlin", "scala"]),
|
|
150
|
+
"api-design": new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "kotlin", "scala"]),
|
|
151
|
+
// Concurrency
|
|
152
|
+
concurrency: new Set([
|
|
153
|
+
"typescript",
|
|
154
|
+
"javascript",
|
|
155
|
+
"python",
|
|
156
|
+
"go",
|
|
157
|
+
"rust",
|
|
158
|
+
"java",
|
|
159
|
+
"csharp",
|
|
160
|
+
"c",
|
|
161
|
+
"cpp",
|
|
162
|
+
"kotlin",
|
|
163
|
+
"scala",
|
|
164
|
+
]),
|
|
165
|
+
// Framework safety
|
|
166
|
+
"framework-safety": new Set(["typescript", "javascript", "python", "java", "csharp", "ruby", "kotlin"]),
|
|
167
|
+
// AI-specific
|
|
168
|
+
"hallucination-detection": new Set([
|
|
169
|
+
"typescript",
|
|
170
|
+
"javascript",
|
|
171
|
+
"python",
|
|
172
|
+
"go",
|
|
173
|
+
"rust",
|
|
174
|
+
"java",
|
|
175
|
+
"csharp",
|
|
176
|
+
"ruby",
|
|
177
|
+
"kotlin",
|
|
178
|
+
]),
|
|
179
|
+
"model-fingerprint": new Set([
|
|
180
|
+
"typescript",
|
|
181
|
+
"javascript",
|
|
182
|
+
"python",
|
|
183
|
+
"go",
|
|
184
|
+
"rust",
|
|
185
|
+
"java",
|
|
186
|
+
"csharp",
|
|
187
|
+
"ruby",
|
|
188
|
+
"kotlin",
|
|
189
|
+
]),
|
|
190
|
+
"agent-instructions": new Set(["typescript", "javascript", "python", "yaml"]),
|
|
191
|
+
"multi-turn-coherence": new Set(["typescript", "javascript", "python"]),
|
|
192
|
+
// Other
|
|
193
|
+
"ethics-bias": new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "kotlin"]),
|
|
194
|
+
portability: new Set(["typescript", "javascript", "python", "go", "rust", "java", "csharp", "c", "cpp"]),
|
|
195
|
+
"logging-privacy": new Set(["typescript", "javascript", "python", "go", "java", "csharp", "ruby", "kotlin"]),
|
|
196
|
+
"configuration-management": new Set(["typescript", "javascript", "python", "go", "java", "csharp", "yaml", "json"]),
|
|
197
|
+
"dependency-health": new Set(["typescript", "javascript", "python", "go", "rust", "java", "csharp", "ruby"]),
|
|
198
|
+
};
|
|
199
|
+
/** Content-based signals that boost judge relevance */
|
|
200
|
+
const CONTENT_SIGNALS = {
|
|
201
|
+
database: /\b(SELECT|INSERT|UPDATE|DELETE|CREATE TABLE|mongoose|prisma|typeorm|sequelize|knex|drizzle|sqlalchemy|django\.db|ActiveRecord)\b/i,
|
|
202
|
+
authentication: /\b(jwt|oauth|passport|bcrypt|argon2|session|cookie|token|login|signup|auth|credential|password)\b/i,
|
|
203
|
+
"rate-limiting": /\b(rate[_-]?limit|throttl|express[_-]?rate|ratelimit|bucket|leaky|sliding[_-]?window)\b/i,
|
|
204
|
+
caching: /\b(redis|memcache|cache|lru|ttl|invalidat|memoiz)\b/i,
|
|
205
|
+
"iac-security": /\b(resource|provider|module|azurerm|aws_|google_|terraform|apiVersion|kind:\s*Deployment)\b/i,
|
|
206
|
+
accessibility: /\b(aria-|role=|alt=|tabindex|a11y|wcag|screen[_-]?reader)\b/i,
|
|
207
|
+
internationalization: /\b(i18n|l10n|intl\.|gettext|ngettext|t\(|useTranslation|formatMessage)\b/i,
|
|
208
|
+
concurrency: /\b(mutex|semaphor|lock|atomic|channel|goroutine|thread|async|await|Promise\.all|worker|race condition)\b/i,
|
|
209
|
+
};
|
|
210
|
+
// ─── Selection Logic ────────────────────────────────────────────────────────
|
|
211
|
+
/**
|
|
212
|
+
* Select relevant judges for a given file based on its language and content.
|
|
213
|
+
* Returns the list of judge IDs that should be run.
|
|
214
|
+
*/
|
|
215
|
+
export function selectJudgesForFile(language, code, availableJudges) {
|
|
216
|
+
const judges = availableJudges || defaultRegistry.getJudges().map((j) => j.id);
|
|
217
|
+
const results = [];
|
|
218
|
+
for (const judgeId of judges) {
|
|
219
|
+
// Universal judges are always relevant
|
|
220
|
+
if (UNIVERSAL_JUDGES.has(judgeId)) {
|
|
221
|
+
results.push({ judgeId, relevant: true, reason: "Universal judge" });
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// Check language relevance
|
|
225
|
+
const langSet = LANGUAGE_SPECIFIC[judgeId];
|
|
226
|
+
if (langSet) {
|
|
227
|
+
if (langSet.has(language)) {
|
|
228
|
+
results.push({ judgeId, relevant: true, reason: `Relevant for ${language}` });
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
// Check content-based override — maybe the code contains relevant patterns
|
|
232
|
+
const signal = CONTENT_SIGNALS[judgeId];
|
|
233
|
+
if (signal && signal.test(code)) {
|
|
234
|
+
results.push({ judgeId, relevant: true, reason: `Content signal detected` });
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
results.push({ judgeId, relevant: false, reason: `Not relevant for ${language}` });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
// Unknown judge — include it to be safe
|
|
243
|
+
results.push({ judgeId, relevant: true, reason: "Default include" });
|
|
244
|
+
}
|
|
245
|
+
return results;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get just the relevant judge IDs for a file.
|
|
249
|
+
*/
|
|
250
|
+
export function getRelevantJudges(language, code, availableJudges) {
|
|
251
|
+
return selectJudgesForFile(language, code, availableJudges)
|
|
252
|
+
.filter((r) => r.relevant)
|
|
253
|
+
.map((r) => r.judgeId);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* CLI: Show judge selection for a file.
|
|
257
|
+
*/
|
|
258
|
+
export function runSmartSelect(argv) {
|
|
259
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
260
|
+
console.log(`
|
|
261
|
+
judges smart-select — Show which judges would run for a file
|
|
262
|
+
|
|
263
|
+
Usage:
|
|
264
|
+
judges smart-select <file> Show relevant judges
|
|
265
|
+
judges smart-select --language <lang> Specify language
|
|
266
|
+
judges smart-select --all Show all judges including skipped
|
|
267
|
+
|
|
268
|
+
Options:
|
|
269
|
+
--language <lang> Override detected language
|
|
270
|
+
--all Show all judges (relevant + skipped)
|
|
271
|
+
--format json JSON output
|
|
272
|
+
--help, -h Show this help
|
|
273
|
+
`);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const { readFileSync } = require("fs");
|
|
277
|
+
const { extname } = require("path");
|
|
278
|
+
const file = argv.find((a, i) => i > 1 && !a.startsWith("-") && argv[i - 1] !== "--language" && argv[i - 1] !== "--format");
|
|
279
|
+
const langOverride = argv.find((_a, i) => argv[i - 1] === "--language");
|
|
280
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
281
|
+
const showAll = argv.includes("--all");
|
|
282
|
+
const EXT_MAP = {
|
|
283
|
+
".ts": "typescript",
|
|
284
|
+
".tsx": "typescript",
|
|
285
|
+
".js": "javascript",
|
|
286
|
+
".jsx": "javascript",
|
|
287
|
+
".py": "python",
|
|
288
|
+
".go": "go",
|
|
289
|
+
".rs": "rust",
|
|
290
|
+
".java": "java",
|
|
291
|
+
".cs": "csharp",
|
|
292
|
+
".rb": "ruby",
|
|
293
|
+
".php": "php",
|
|
294
|
+
".swift": "swift",
|
|
295
|
+
".kt": "kotlin",
|
|
296
|
+
".scala": "scala",
|
|
297
|
+
".c": "c",
|
|
298
|
+
".cpp": "cpp",
|
|
299
|
+
".h": "c",
|
|
300
|
+
".hpp": "cpp",
|
|
301
|
+
".yaml": "yaml",
|
|
302
|
+
".yml": "yaml",
|
|
303
|
+
".tf": "terraform",
|
|
304
|
+
".bicep": "bicep",
|
|
305
|
+
".sql": "sql",
|
|
306
|
+
".sh": "bash",
|
|
307
|
+
".ps1": "powershell",
|
|
308
|
+
".dockerfile": "dockerfile",
|
|
309
|
+
};
|
|
310
|
+
let language = langOverride || "typescript";
|
|
311
|
+
let code = "";
|
|
312
|
+
if (file) {
|
|
313
|
+
try {
|
|
314
|
+
code = readFileSync(file, "utf-8");
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
/* use empty */
|
|
318
|
+
}
|
|
319
|
+
if (!langOverride) {
|
|
320
|
+
const ext = extname(file).toLowerCase();
|
|
321
|
+
language = EXT_MAP[ext] || "typescript";
|
|
322
|
+
if (file.toLowerCase().includes("dockerfile"))
|
|
323
|
+
language = "dockerfile";
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
const results = selectJudgesForFile(language, code);
|
|
327
|
+
if (format === "json") {
|
|
328
|
+
console.log(JSON.stringify({ language, results: showAll ? results : results.filter((r) => r.relevant) }, null, 2));
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const relevant = results.filter((r) => r.relevant);
|
|
332
|
+
const skipped = results.filter((r) => !r.relevant);
|
|
333
|
+
console.log(`\n Smart Judge Selection — ${language}\n`);
|
|
334
|
+
console.log(` Relevant judges (${relevant.length}):`);
|
|
335
|
+
for (const r of relevant) {
|
|
336
|
+
console.log(` ✅ ${r.judgeId.padEnd(30)} ${r.reason}`);
|
|
337
|
+
}
|
|
338
|
+
if (showAll && skipped.length > 0) {
|
|
339
|
+
console.log(`\n Skipped judges (${skipped.length}):`);
|
|
340
|
+
for (const r of skipped) {
|
|
341
|
+
console.log(` ⏭️ ${r.judgeId.padEnd(30)} ${r.reason}`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
console.log(`\n ${relevant.length}/${results.length} judges selected (${skipped.length} skipped)\n`);
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=smart-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-select.js","sourceRoot":"","sources":["../../src/commands/smart-select.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges upload` — Upload SARIF results to GitHub Code Scanning.
|
|
3
|
+
*
|
|
4
|
+
* Pushes evaluation results directly to GitHub's Code Scanning API,
|
|
5
|
+
* making findings visible in the Security tab without needing
|
|
6
|
+
* github/codeql-action/upload-sarif in CI.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* judges upload results.sarif.json Upload SARIF file
|
|
10
|
+
* judges upload --file results.json --repo owner/repo Convert + upload
|
|
11
|
+
* judges upload --ref refs/heads/main --sha abc123 Specify git ref
|
|
12
|
+
*/
|
|
13
|
+
export declare function runUpload(argv: string[]): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA6HH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+E7D"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges upload` — Upload SARIF results to GitHub Code Scanning.
|
|
3
|
+
*
|
|
4
|
+
* Pushes evaluation results directly to GitHub's Code Scanning API,
|
|
5
|
+
* making findings visible in the Security tab without needing
|
|
6
|
+
* github/codeql-action/upload-sarif in CI.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* judges upload results.sarif.json Upload SARIF file
|
|
10
|
+
* judges upload --file results.json --repo owner/repo Convert + upload
|
|
11
|
+
* judges upload --ref refs/heads/main --sha abc123 Specify git ref
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync } from "fs";
|
|
14
|
+
import { execSync } from "child_process";
|
|
15
|
+
import { resolve, basename } from "path";
|
|
16
|
+
import { gzipSync } from "zlib";
|
|
17
|
+
// ─── Git Helpers ────────────────────────────────────────────────────────────
|
|
18
|
+
function detectGitRef() {
|
|
19
|
+
try {
|
|
20
|
+
const branch = execSync("git rev-parse --abbrev-ref HEAD", { encoding: "utf-8" }).trim();
|
|
21
|
+
return `refs/heads/${branch}`;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return "refs/heads/main";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function detectGitSha() {
|
|
28
|
+
try {
|
|
29
|
+
return execSync("git rev-parse HEAD", { encoding: "utf-8" }).trim();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function detectRepo() {
|
|
36
|
+
try {
|
|
37
|
+
const remote = execSync("git remote get-url origin", { encoding: "utf-8" }).trim();
|
|
38
|
+
const match = remote.match(/github\.com[/:]([^/]+\/[^/.]+)/);
|
|
39
|
+
return match?.[1]?.replace(/\.git$/, "") || "";
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return "";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// ─── Upload ────────────────────────────────────────────────────────────────
|
|
46
|
+
async function uploadSarif(options) {
|
|
47
|
+
const { sarifPath, repo, ref, commitSha, token } = options;
|
|
48
|
+
if (!existsSync(sarifPath)) {
|
|
49
|
+
return { success: false, error: `File not found: ${sarifPath}` };
|
|
50
|
+
}
|
|
51
|
+
const sarifContent = readFileSync(sarifPath, "utf-8");
|
|
52
|
+
// Validate it's valid JSON
|
|
53
|
+
try {
|
|
54
|
+
JSON.parse(sarifContent);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return { success: false, error: "Invalid JSON in SARIF file" };
|
|
58
|
+
}
|
|
59
|
+
// GitHub requires gzip + base64 encoding
|
|
60
|
+
const compressed = gzipSync(Buffer.from(sarifContent, "utf-8"));
|
|
61
|
+
const encoded = compressed.toString("base64");
|
|
62
|
+
const apiUrl = `https://api.github.com/repos/${repo}/code-scanning/sarifs`;
|
|
63
|
+
const body = JSON.stringify({
|
|
64
|
+
commit_sha: commitSha,
|
|
65
|
+
ref,
|
|
66
|
+
sarif: encoded,
|
|
67
|
+
tool_name: "Judges Panel",
|
|
68
|
+
});
|
|
69
|
+
try {
|
|
70
|
+
const response = await fetch(apiUrl, {
|
|
71
|
+
method: "POST",
|
|
72
|
+
headers: {
|
|
73
|
+
Authorization: `Bearer ${token}`,
|
|
74
|
+
Accept: "application/vnd.github+json",
|
|
75
|
+
"Content-Type": "application/json",
|
|
76
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
77
|
+
},
|
|
78
|
+
body,
|
|
79
|
+
});
|
|
80
|
+
if (response.ok || response.status === 202) {
|
|
81
|
+
const data = (await response.json());
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
id: data.id,
|
|
85
|
+
url: data.url,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const errorData = (await response.json().catch(() => ({})));
|
|
89
|
+
return {
|
|
90
|
+
success: false,
|
|
91
|
+
error: `GitHub API ${response.status}: ${errorData.message || response.statusText}`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return {
|
|
96
|
+
success: false,
|
|
97
|
+
error: `Upload failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ─── CLI Runner ─────────────────────────────────────────────────────────────
|
|
102
|
+
export async function runUpload(argv) {
|
|
103
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
104
|
+
console.log(`
|
|
105
|
+
judges upload — Upload SARIF results to GitHub Code Scanning
|
|
106
|
+
|
|
107
|
+
Usage:
|
|
108
|
+
judges upload <sarif-file> Upload SARIF file
|
|
109
|
+
judges upload --file <sarif-file> Upload SARIF file (alternate)
|
|
110
|
+
judges upload --repo <owner/repo> Specify target repository
|
|
111
|
+
judges upload --ref <git-ref> Git ref (default: current branch)
|
|
112
|
+
judges upload --sha <commit-sha> Git commit SHA (default: HEAD)
|
|
113
|
+
judges upload --token <github-token> GitHub token (default: GITHUB_TOKEN env)
|
|
114
|
+
|
|
115
|
+
The SARIF file is gzipped and base64-encoded before upload, as required by
|
|
116
|
+
the GitHub Code Scanning API.
|
|
117
|
+
|
|
118
|
+
Environment Variables:
|
|
119
|
+
GITHUB_TOKEN GitHub API token with security_events scope
|
|
120
|
+
|
|
121
|
+
Options:
|
|
122
|
+
--file <path> Path to SARIF file
|
|
123
|
+
--repo <owner/repo> GitHub repository (auto-detected from git remote)
|
|
124
|
+
--ref <ref> Git ref (auto-detected from current branch)
|
|
125
|
+
--sha <sha> Commit SHA (auto-detected from HEAD)
|
|
126
|
+
--token <token> GitHub token (or set GITHUB_TOKEN env var)
|
|
127
|
+
--help, -h Show this help
|
|
128
|
+
`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// Parse args
|
|
132
|
+
const sarifPath = resolve(argv.find((_a, i) => argv[i - 1] === "--file") ||
|
|
133
|
+
argv.find((a, i) => i > 1 && !a.startsWith("-") && a.endsWith(".json")) ||
|
|
134
|
+
"");
|
|
135
|
+
if (!sarifPath || !existsSync(sarifPath)) {
|
|
136
|
+
console.error("\n Error: Please provide a SARIF file path.\n");
|
|
137
|
+
console.error(" Usage: judges upload <sarif-file>\n");
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
const repo = argv.find((_a, i) => argv[i - 1] === "--repo") || detectRepo();
|
|
141
|
+
const ref = argv.find((_a, i) => argv[i - 1] === "--ref") || detectGitRef();
|
|
142
|
+
const commitSha = argv.find((_a, i) => argv[i - 1] === "--sha") || detectGitSha();
|
|
143
|
+
const token = argv.find((_a, i) => argv[i - 1] === "--token") || process.env.GITHUB_TOKEN || "";
|
|
144
|
+
if (!repo) {
|
|
145
|
+
console.error("\n Error: Could not detect repository. Use --repo owner/repo\n");
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
if (!commitSha) {
|
|
149
|
+
console.error("\n Error: Could not detect commit SHA. Use --sha <sha>\n");
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
if (!token) {
|
|
153
|
+
console.error("\n Error: No GitHub token found. Set GITHUB_TOKEN env var or use --token\n");
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
console.log(`\n Uploading SARIF to GitHub Code Scanning...`);
|
|
157
|
+
console.log(` Repository: ${repo}`);
|
|
158
|
+
console.log(` Ref: ${ref}`);
|
|
159
|
+
console.log(` Commit: ${commitSha.slice(0, 7)}`);
|
|
160
|
+
console.log(` File: ${basename(sarifPath)}\n`);
|
|
161
|
+
const result = await uploadSarif({ sarifPath, repo, ref, commitSha, token });
|
|
162
|
+
if (result.success) {
|
|
163
|
+
console.log(" ✅ SARIF uploaded successfully.");
|
|
164
|
+
if (result.id)
|
|
165
|
+
console.log(` Analysis ID: ${result.id}`);
|
|
166
|
+
console.log(` View results: https://github.com/${repo}/security/code-scanning\n`);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
console.error(` ❌ Upload failed: ${result.error}\n`);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config validation — validate .judgesrc against the JSON schema
|
|
3
|
+
* and report errors with line numbers and fix suggestions.
|
|
4
|
+
*/
|
|
5
|
+
export interface ValidationError {
|
|
6
|
+
path: string;
|
|
7
|
+
message: string;
|
|
8
|
+
suggestion?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ValidationResult {
|
|
11
|
+
valid: boolean;
|
|
12
|
+
errors: ValidationError[];
|
|
13
|
+
warnings: ValidationError[];
|
|
14
|
+
}
|
|
15
|
+
export declare function validateConfig(config: Record<string, unknown>): ValidationResult;
|
|
16
|
+
export declare function runValidateConfig(argv: string[]): void;
|
|
17
|
+
//# sourceMappingURL=validate-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-config.d.ts","sourceRoot":"","sources":["../../src/commands/validate-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAqDD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAuIhF;AAiCD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6EtD"}
|