@kevinrabun/judges 3.42.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 (42) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -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/ci-template.d.ts +15 -0
  10. package/dist/commands/ci-template.d.ts.map +1 -0
  11. package/dist/commands/ci-template.js +212 -0
  12. package/dist/commands/ci-template.js.map +1 -0
  13. package/dist/commands/false-negatives.d.ts +35 -0
  14. package/dist/commands/false-negatives.d.ts.map +1 -0
  15. package/dist/commands/false-negatives.js +166 -0
  16. package/dist/commands/false-negatives.js.map +1 -0
  17. package/dist/commands/hook-install.d.ts +22 -0
  18. package/dist/commands/hook-install.d.ts.map +1 -0
  19. package/dist/commands/hook-install.js +143 -0
  20. package/dist/commands/hook-install.js.map +1 -0
  21. package/dist/commands/policy-audit.d.ts +53 -0
  22. package/dist/commands/policy-audit.d.ts.map +1 -0
  23. package/dist/commands/policy-audit.js +161 -0
  24. package/dist/commands/policy-audit.js.map +1 -0
  25. package/dist/commands/regression-alert.d.ts +32 -0
  26. package/dist/commands/regression-alert.d.ts.map +1 -0
  27. package/dist/commands/regression-alert.js +216 -0
  28. package/dist/commands/regression-alert.js.map +1 -0
  29. package/dist/commands/remediation.d.ts +21 -0
  30. package/dist/commands/remediation.d.ts.map +1 -0
  31. package/dist/commands/remediation.js +257 -0
  32. package/dist/commands/remediation.js.map +1 -0
  33. package/dist/commands/sla-track.d.ts +57 -0
  34. package/dist/commands/sla-track.d.ts.map +1 -0
  35. package/dist/commands/sla-track.js +269 -0
  36. package/dist/commands/sla-track.js.map +1 -0
  37. package/dist/commands/ticket-sync.d.ts +26 -0
  38. package/dist/commands/ticket-sync.d.ts.map +1 -0
  39. package/dist/commands/ticket-sync.js +236 -0
  40. package/dist/commands/ticket-sync.js.map +1 -0
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.42.0",
3
+ "version": "3.43.0",
4
4
  "description": "45 specialized judges that evaluate AI-generated code for security, cost, and quality.",
5
5
  "mcpName": "io.github.KevinRabun/judges",
6
6
  "type": "module",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/kevinrabun/judges",
8
8
  "source": "github"
9
9
  },
10
- "version": "3.42.0",
10
+ "version": "3.43.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.42.0",
15
+ "version": "3.43.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }