@kevinrabun/judges 3.41.0 → 3.43.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.
Files changed (82) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +126 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/assign-findings.d.ts +37 -0
  6. package/dist/commands/assign-findings.d.ts.map +1 -0
  7. package/dist/commands/assign-findings.js +178 -0
  8. package/dist/commands/assign-findings.js.map +1 -0
  9. package/dist/commands/auto-triage.d.ts +32 -0
  10. package/dist/commands/auto-triage.d.ts.map +1 -0
  11. package/dist/commands/auto-triage.js +126 -0
  12. package/dist/commands/auto-triage.js.map +1 -0
  13. package/dist/commands/ci-template.d.ts +15 -0
  14. package/dist/commands/ci-template.d.ts.map +1 -0
  15. package/dist/commands/ci-template.js +212 -0
  16. package/dist/commands/ci-template.js.map +1 -0
  17. package/dist/commands/coverage-map.d.ts +23 -0
  18. package/dist/commands/coverage-map.d.ts.map +1 -0
  19. package/dist/commands/coverage-map.js +223 -0
  20. package/dist/commands/coverage-map.js.map +1 -0
  21. package/dist/commands/diff-only.d.ts +34 -0
  22. package/dist/commands/diff-only.d.ts.map +1 -0
  23. package/dist/commands/diff-only.js +152 -0
  24. package/dist/commands/diff-only.js.map +1 -0
  25. package/dist/commands/false-negatives.d.ts +35 -0
  26. package/dist/commands/false-negatives.d.ts.map +1 -0
  27. package/dist/commands/false-negatives.js +166 -0
  28. package/dist/commands/false-negatives.js.map +1 -0
  29. package/dist/commands/group-findings.d.ts +23 -0
  30. package/dist/commands/group-findings.d.ts.map +1 -0
  31. package/dist/commands/group-findings.js +155 -0
  32. package/dist/commands/group-findings.js.map +1 -0
  33. package/dist/commands/hook-install.d.ts +22 -0
  34. package/dist/commands/hook-install.d.ts.map +1 -0
  35. package/dist/commands/hook-install.js +143 -0
  36. package/dist/commands/hook-install.js.map +1 -0
  37. package/dist/commands/policy-audit.d.ts +53 -0
  38. package/dist/commands/policy-audit.d.ts.map +1 -0
  39. package/dist/commands/policy-audit.js +161 -0
  40. package/dist/commands/policy-audit.js.map +1 -0
  41. package/dist/commands/pr-summary.d.ts +26 -0
  42. package/dist/commands/pr-summary.d.ts.map +1 -0
  43. package/dist/commands/pr-summary.js +188 -0
  44. package/dist/commands/pr-summary.js.map +1 -0
  45. package/dist/commands/profile.d.ts +38 -0
  46. package/dist/commands/profile.d.ts.map +1 -0
  47. package/dist/commands/profile.js +102 -0
  48. package/dist/commands/profile.js.map +1 -0
  49. package/dist/commands/regression-alert.d.ts +32 -0
  50. package/dist/commands/regression-alert.d.ts.map +1 -0
  51. package/dist/commands/regression-alert.js +216 -0
  52. package/dist/commands/regression-alert.js.map +1 -0
  53. package/dist/commands/remediation.d.ts +21 -0
  54. package/dist/commands/remediation.d.ts.map +1 -0
  55. package/dist/commands/remediation.js +257 -0
  56. package/dist/commands/remediation.js.map +1 -0
  57. package/dist/commands/sla-track.d.ts +57 -0
  58. package/dist/commands/sla-track.d.ts.map +1 -0
  59. package/dist/commands/sla-track.js +269 -0
  60. package/dist/commands/sla-track.js.map +1 -0
  61. package/dist/commands/smart-select.d.ts +27 -0
  62. package/dist/commands/smart-select.d.ts.map +1 -0
  63. package/dist/commands/smart-select.js +346 -0
  64. package/dist/commands/smart-select.js.map +1 -0
  65. package/dist/commands/ticket-sync.d.ts +26 -0
  66. package/dist/commands/ticket-sync.d.ts.map +1 -0
  67. package/dist/commands/ticket-sync.js +236 -0
  68. package/dist/commands/ticket-sync.js.map +1 -0
  69. package/dist/commands/upload.d.ts +14 -0
  70. package/dist/commands/upload.d.ts.map +1 -0
  71. package/dist/commands/upload.js +173 -0
  72. package/dist/commands/upload.js.map +1 -0
  73. package/dist/commands/validate-config.d.ts +17 -0
  74. package/dist/commands/validate-config.d.ts.map +1 -0
  75. package/dist/commands/validate-config.js +268 -0
  76. package/dist/commands/validate-config.js.map +1 -0
  77. package/dist/commands/warm-cache.d.ts +31 -0
  78. package/dist/commands/warm-cache.d.ts.map +1 -0
  79. package/dist/commands/warm-cache.js +166 -0
  80. package/dist/commands/warm-cache.js.map +1 -0
  81. package/package.json +1 -1
  82. 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,26 @@
1
+ /**
2
+ * Ticket sync — create tickets in external issue trackers (Jira, Linear,
3
+ * GitHub Issues) from Judges findings.
4
+ *
5
+ * Uses standard REST APIs. No data is stored by Judges — tickets are
6
+ * created directly in the user's chosen tracker.
7
+ */
8
+ export interface TicketConfig {
9
+ provider: "github" | "jira" | "linear";
10
+ /** GitHub: owner/repo. Jira: project key. Linear: team key */
11
+ project: string;
12
+ /** API token */
13
+ token: string;
14
+ /** Base URL for Jira (e.g., https://mycompany.atlassian.net) */
15
+ baseUrl?: string;
16
+ /** Label(s) to add to created tickets */
17
+ labels?: string[];
18
+ }
19
+ export interface TicketResult {
20
+ findingRuleId: string;
21
+ ticketId: string;
22
+ url: string;
23
+ provider: string;
24
+ }
25
+ export declare function runTicketSync(argv: string[]): Promise<void>;
26
+ //# sourceMappingURL=ticket-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-sync.d.ts","sourceRoot":"","sources":["../../src/commands/ticket-sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IACvC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAkJD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGjE"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Ticket sync — create tickets in external issue trackers (Jira, Linear,
3
+ * GitHub Issues) from Judges findings.
4
+ *
5
+ * Uses standard REST APIs. No data is stored by Judges — tickets are
6
+ * created directly in the user's chosen tracker.
7
+ */
8
+ // ─── Ticket Creation ────────────────────────────────────────────────────────
9
+ async function createGitHubIssue(finding, config) {
10
+ const [owner, repo] = config.project.split("/");
11
+ const url = `https://api.github.com/repos/${owner}/${repo}/issues`;
12
+ const body = [
13
+ `## ${finding.title}`,
14
+ "",
15
+ `**Severity:** ${finding.severity}`,
16
+ `**Rule:** ${finding.ruleId}`,
17
+ "",
18
+ finding.description,
19
+ "",
20
+ "### Recommendation",
21
+ finding.recommendation,
22
+ finding.reference ? `\n### Reference\n${finding.reference}` : "",
23
+ "",
24
+ "---",
25
+ "_Created by [Judges](https://github.com/KevinRabun/judges)_",
26
+ ].join("\n");
27
+ const res = await fetch(url, {
28
+ method: "POST",
29
+ headers: {
30
+ Authorization: `Bearer ${config.token}`,
31
+ Accept: "application/vnd.github+json",
32
+ "Content-Type": "application/json",
33
+ },
34
+ body: JSON.stringify({
35
+ title: `[${finding.severity.toUpperCase()}] ${finding.ruleId}: ${finding.title}`,
36
+ body,
37
+ labels: config.labels || ["judges", "security"],
38
+ }),
39
+ });
40
+ if (!res.ok)
41
+ throw new Error(`GitHub API error: ${res.status} ${res.statusText}`);
42
+ const data = (await res.json());
43
+ return { findingRuleId: finding.ruleId, ticketId: `#${data.number}`, url: data.html_url, provider: "github" };
44
+ }
45
+ async function createJiraTicket(finding, config) {
46
+ const baseUrl = config.baseUrl || "https://jira.atlassian.net";
47
+ const url = `${baseUrl}/rest/api/3/issue`;
48
+ const severityMap = {
49
+ critical: "Highest",
50
+ high: "High",
51
+ medium: "Medium",
52
+ low: "Low",
53
+ info: "Lowest",
54
+ };
55
+ const res = await fetch(url, {
56
+ method: "POST",
57
+ headers: {
58
+ Authorization: `Basic ${Buffer.from(`user:${config.token}`).toString("base64")}`,
59
+ Accept: "application/json",
60
+ "Content-Type": "application/json",
61
+ },
62
+ body: JSON.stringify({
63
+ fields: {
64
+ project: { key: config.project },
65
+ summary: `[${finding.severity.toUpperCase()}] ${finding.ruleId}: ${finding.title}`,
66
+ description: {
67
+ type: "doc",
68
+ version: 1,
69
+ content: [
70
+ {
71
+ type: "paragraph",
72
+ content: [{ type: "text", text: finding.description }],
73
+ },
74
+ ],
75
+ },
76
+ issuetype: { name: "Bug" },
77
+ priority: { name: severityMap[finding.severity] || "Medium" },
78
+ labels: config.labels || ["judges", "security"],
79
+ },
80
+ }),
81
+ });
82
+ if (!res.ok)
83
+ throw new Error(`Jira API error: ${res.status} ${res.statusText}`);
84
+ const data = (await res.json());
85
+ return {
86
+ findingRuleId: finding.ruleId,
87
+ ticketId: data.key,
88
+ url: `${baseUrl}/browse/${data.key}`,
89
+ provider: "jira",
90
+ };
91
+ }
92
+ async function createLinearIssue(finding, config) {
93
+ const priorityMap = {
94
+ critical: 1,
95
+ high: 2,
96
+ medium: 3,
97
+ low: 4,
98
+ info: 0,
99
+ };
100
+ const query = `mutation {
101
+ issueCreate(input: {
102
+ teamId: "${config.project}"
103
+ title: "[${finding.severity.toUpperCase()}] ${finding.ruleId}: ${finding.title}"
104
+ description: "${finding.description.replace(/"/g, '\\"').replace(/\n/g, "\\n")}"
105
+ priority: ${priorityMap[finding.severity] ?? 3}
106
+ }) {
107
+ success
108
+ issue {
109
+ id
110
+ identifier
111
+ url
112
+ }
113
+ }
114
+ }`;
115
+ const res = await fetch("https://api.linear.app/graphql", {
116
+ method: "POST",
117
+ headers: {
118
+ Authorization: config.token,
119
+ "Content-Type": "application/json",
120
+ },
121
+ body: JSON.stringify({ query }),
122
+ });
123
+ if (!res.ok)
124
+ throw new Error(`Linear API error: ${res.status} ${res.statusText}`);
125
+ const data = (await res.json());
126
+ const issue = data.data.issueCreate.issue;
127
+ return { findingRuleId: finding.ruleId, ticketId: issue.identifier, url: issue.url, provider: "linear" };
128
+ }
129
+ async function createTicket(finding, config) {
130
+ switch (config.provider) {
131
+ case "github":
132
+ return createGitHubIssue(finding, config);
133
+ case "jira":
134
+ return createJiraTicket(finding, config);
135
+ case "linear":
136
+ return createLinearIssue(finding, config);
137
+ }
138
+ }
139
+ // ─── CLI ────────────────────────────────────────────────────────────────────
140
+ export async function runTicketSync(argv) {
141
+ if (argv.includes("--help") || argv.includes("-h")) {
142
+ console.log(`
143
+ judges ticket-sync — Create tickets from findings in Jira, Linear, or GitHub
144
+
145
+ Usage:
146
+ judges ticket-sync --input results.json --provider github --project owner/repo
147
+ judges ticket-sync --input results.json --provider jira --project PROJ --base-url https://myco.atlassian.net
148
+ judges ticket-sync --input results.json --provider linear --project team-id
149
+
150
+ Options:
151
+ --input <path> JSON results file (required)
152
+ --provider <name> Ticket provider: github, jira, linear (required)
153
+ --project <key> Project identifier (required)
154
+ --token <token> API token (default: JUDGES_TICKET_TOKEN or GITHUB_TOKEN env)
155
+ --base-url <url> Jira base URL
156
+ --severity <level> Only create tickets for this severity+
157
+ --labels <list> Comma-separated labels
158
+ --dry-run Show what would be created without creating
159
+ --format json JSON output
160
+ --help, -h Show this help
161
+ `);
162
+ return;
163
+ }
164
+ const { readFileSync, existsSync } = await import("fs");
165
+ const inputPath = argv.find((_a, i) => argv[i - 1] === "--input");
166
+ const provider = argv.find((_a, i) => argv[i - 1] === "--provider");
167
+ const project = argv.find((_a, i) => argv[i - 1] === "--project");
168
+ const token = argv.find((_a, i) => argv[i - 1] === "--token") ||
169
+ process.env.JUDGES_TICKET_TOKEN ||
170
+ process.env.GITHUB_TOKEN ||
171
+ "";
172
+ const baseUrl = argv.find((_a, i) => argv[i - 1] === "--base-url");
173
+ const labelsStr = argv.find((_a, i) => argv[i - 1] === "--labels");
174
+ const severityFilter = argv.find((_a, i) => argv[i - 1] === "--severity");
175
+ const dryRun = argv.includes("--dry-run");
176
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
177
+ if (!inputPath || !provider || !project) {
178
+ console.error("Error: --input, --provider, and --project required");
179
+ process.exit(1);
180
+ }
181
+ if (!existsSync(inputPath)) {
182
+ console.error(`Error: file not found: ${inputPath}`);
183
+ process.exit(1);
184
+ }
185
+ if (!token) {
186
+ console.error("Error: --token or JUDGES_TICKET_TOKEN/GITHUB_TOKEN env required");
187
+ process.exit(1);
188
+ }
189
+ const data = JSON.parse(readFileSync(inputPath, "utf-8"));
190
+ let findings = data.evaluations
191
+ ? data.evaluations.flatMap((e) => e.findings || [])
192
+ : data.findings || data;
193
+ if (severityFilter) {
194
+ const order = ["critical", "high", "medium", "low", "info"];
195
+ const idx = order.indexOf(severityFilter);
196
+ if (idx >= 0) {
197
+ const allowed = new Set(order.slice(0, idx + 1));
198
+ findings = findings.filter((f) => allowed.has(f.severity));
199
+ }
200
+ }
201
+ const config = {
202
+ provider,
203
+ project,
204
+ token,
205
+ baseUrl,
206
+ labels: labelsStr ? labelsStr.split(",").map((s) => s.trim()) : undefined,
207
+ };
208
+ if (dryRun) {
209
+ console.log(`\n Dry Run — Would create ${findings.length} tickets in ${provider}/${project}\n`);
210
+ for (const f of findings) {
211
+ console.log(` ${f.severity.padEnd(8)} ${f.ruleId}: ${f.title}`);
212
+ }
213
+ console.log("");
214
+ return;
215
+ }
216
+ const results = [];
217
+ for (const f of findings) {
218
+ try {
219
+ const result = await createTicket(f, config);
220
+ results.push(result);
221
+ if (format !== "json") {
222
+ console.log(` ✅ ${result.ticketId}: ${f.ruleId} — ${result.url}`);
223
+ }
224
+ }
225
+ catch (e) {
226
+ console.error(` ❌ Failed for ${f.ruleId}: ${e instanceof Error ? e.message : e}`);
227
+ }
228
+ }
229
+ if (format === "json") {
230
+ console.log(JSON.stringify(results, null, 2));
231
+ }
232
+ else {
233
+ console.log(`\n Created ${results.length}/${findings.length} tickets\n`);
234
+ }
235
+ }
236
+ //# sourceMappingURL=ticket-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-sync.js","sourceRoot":"","sources":["../../src/commands/ticket-sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyBH,+EAA+E;AAE/E,KAAK,UAAU,iBAAiB,CAAC,OAAgB,EAAE,MAAoB;IACrE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,gCAAgC,KAAK,IAAI,IAAI,SAAS,CAAC;IAEnE,MAAM,IAAI,GAAG;QACX,MAAM,OAAO,CAAC,KAAK,EAAE;QACrB,EAAE;QACF,iBAAiB,OAAO,CAAC,QAAQ,EAAE;QACnC,aAAa,OAAO,CAAC,MAAM,EAAE;QAC7B,EAAE;QACF,OAAO,CAAC,WAAW;QACnB,EAAE;QACF,oBAAoB;QACpB,OAAO,CAAC,cAAc;QACtB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;QAChE,EAAE;QACF,KAAK;QACL,6DAA6D;KAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;YACvC,MAAM,EAAE,6BAA6B;YACrC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE;YAChF,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;SAChD,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyC,CAAC;IACxE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAgB,EAAE,MAAoB;IACpE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,4BAA4B,CAAC;IAC/D,MAAM,GAAG,GAAG,GAAG,OAAO,mBAAmB,CAAC;IAE1C,MAAM,WAAW,GAA2B;QAC1C,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,QAAQ;KACf,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAChF,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,MAAM,EAAE;gBACN,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE;gBAChC,OAAO,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE;gBAClF,WAAW,EAAE;oBACX,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;yBACvD;qBACF;iBACF;gBACD,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;gBAC1B,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE;gBAC7D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;aAChD;SACF,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IACnD,OAAO;QACL,aAAa,EAAE,OAAO,CAAC,MAAM;QAC7B,QAAQ,EAAE,IAAI,CAAC,GAAG;QAClB,GAAG,EAAE,GAAG,OAAO,WAAW,IAAI,CAAC,GAAG,EAAE;QACpC,QAAQ,EAAE,MAAM;KACjB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAgB,EAAE,MAAoB;IACrE,MAAM,WAAW,GAA2B;QAC1C,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;QACT,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,CAAC;KACR,CAAC;IAEF,MAAM,KAAK,GAAG;;iBAEC,MAAM,CAAC,OAAO;iBACd,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK;sBAC9D,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;kBAClE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;IAShD,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gCAAgC,EAAE;QACxD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,MAAM,CAAC,KAAK;YAC3B,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;KAChC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA8E,CAAC;IAC7G,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IAC1C,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC3G,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAgB,EAAE,MAAoB;IAChE,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,KAAK,MAAM;YACT,OAAO,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;CAmBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,YAAY,CAA6B,CAAC;IAChH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;IAClF,MAAM,KAAK,GACT,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAC/B,OAAO,CAAC,GAAG,CAAC,YAAY;QACxB,EAAE,CAAC;IACL,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;IACnF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;IAE1F,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,IAAI,QAAQ,GAAc,IAAI,CAAC,WAAW;QACxC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAA2B,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC7E,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IAE1B,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC1C,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACjD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAiB;QAC3B,QAAQ;QACR,OAAO;QACP,KAAK;QACL,OAAO;QACP,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KAClF,CAAC;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,8BAA8B,QAAQ,CAAC,MAAM,eAAe,QAAQ,IAAI,OAAO,IAAI,CAAC,CAAC;QACjG,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,MAAM,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
@@ -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"}