@kevinrabun/judges 3.96.0 → 3.98.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 (78) hide show
  1. package/CHANGELOG.md +26 -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/finding-annotation-layer.d.ts +5 -0
  6. package/dist/commands/finding-annotation-layer.d.ts.map +1 -0
  7. package/dist/commands/finding-annotation-layer.js +129 -0
  8. package/dist/commands/finding-annotation-layer.js.map +1 -0
  9. package/dist/commands/finding-cwe-lookup.d.ts +5 -0
  10. package/dist/commands/finding-cwe-lookup.d.ts.map +1 -0
  11. package/dist/commands/finding-cwe-lookup.js +149 -0
  12. package/dist/commands/finding-cwe-lookup.js.map +1 -0
  13. package/dist/commands/finding-duplicate-detect.d.ts +5 -0
  14. package/dist/commands/finding-duplicate-detect.d.ts.map +1 -0
  15. package/dist/commands/finding-duplicate-detect.js +114 -0
  16. package/dist/commands/finding-duplicate-detect.js.map +1 -0
  17. package/dist/commands/finding-impact-rank.d.ts +5 -0
  18. package/dist/commands/finding-impact-rank.d.ts.map +1 -0
  19. package/dist/commands/finding-impact-rank.js +86 -0
  20. package/dist/commands/finding-impact-rank.js.map +1 -0
  21. package/dist/commands/finding-patch-preview.d.ts +5 -0
  22. package/dist/commands/finding-patch-preview.d.ts.map +1 -0
  23. package/dist/commands/finding-patch-preview.js +104 -0
  24. package/dist/commands/finding-patch-preview.js.map +1 -0
  25. package/dist/commands/finding-priority-matrix.d.ts +5 -0
  26. package/dist/commands/finding-priority-matrix.d.ts.map +1 -0
  27. package/dist/commands/finding-priority-matrix.js +103 -0
  28. package/dist/commands/finding-priority-matrix.js.map +1 -0
  29. package/dist/commands/finding-risk-score.d.ts +5 -0
  30. package/dist/commands/finding-risk-score.d.ts.map +1 -0
  31. package/dist/commands/finding-risk-score.js +96 -0
  32. package/dist/commands/finding-risk-score.js.map +1 -0
  33. package/dist/commands/finding-trend-forecast.d.ts +5 -0
  34. package/dist/commands/finding-trend-forecast.d.ts.map +1 -0
  35. package/dist/commands/finding-trend-forecast.js +107 -0
  36. package/dist/commands/finding-trend-forecast.js.map +1 -0
  37. package/dist/commands/review-cicd-integrate.d.ts +5 -0
  38. package/dist/commands/review-cicd-integrate.d.ts.map +1 -0
  39. package/dist/commands/review-cicd-integrate.js +123 -0
  40. package/dist/commands/review-cicd-integrate.js.map +1 -0
  41. package/dist/commands/review-compliance-map.d.ts +5 -0
  42. package/dist/commands/review-compliance-map.d.ts.map +1 -0
  43. package/dist/commands/review-compliance-map.js +111 -0
  44. package/dist/commands/review-compliance-map.js.map +1 -0
  45. package/dist/commands/review-gate-config.d.ts +5 -0
  46. package/dist/commands/review-gate-config.d.ts.map +1 -0
  47. package/dist/commands/review-gate-config.js +154 -0
  48. package/dist/commands/review-gate-config.js.map +1 -0
  49. package/dist/commands/review-language-profile.d.ts +5 -0
  50. package/dist/commands/review-language-profile.d.ts.map +1 -0
  51. package/dist/commands/review-language-profile.js +73 -0
  52. package/dist/commands/review-language-profile.js.map +1 -0
  53. package/dist/commands/review-org-dashboard.d.ts +5 -0
  54. package/dist/commands/review-org-dashboard.d.ts.map +1 -0
  55. package/dist/commands/review-org-dashboard.js +69 -0
  56. package/dist/commands/review-org-dashboard.js.map +1 -0
  57. package/dist/commands/review-policy-engine.d.ts +5 -0
  58. package/dist/commands/review-policy-engine.d.ts.map +1 -0
  59. package/dist/commands/review-policy-engine.js +136 -0
  60. package/dist/commands/review-policy-engine.js.map +1 -0
  61. package/dist/commands/review-report-archive.d.ts +5 -0
  62. package/dist/commands/review-report-archive.d.ts.map +1 -0
  63. package/dist/commands/review-report-archive.js +101 -0
  64. package/dist/commands/review-report-archive.js.map +1 -0
  65. package/dist/commands/review-rollout-plan.d.ts +5 -0
  66. package/dist/commands/review-rollout-plan.d.ts.map +1 -0
  67. package/dist/commands/review-rollout-plan.js +124 -0
  68. package/dist/commands/review-rollout-plan.js.map +1 -0
  69. package/dist/commands/review-sla-config.d.ts +5 -0
  70. package/dist/commands/review-sla-config.d.ts.map +1 -0
  71. package/dist/commands/review-sla-config.js +89 -0
  72. package/dist/commands/review-sla-config.js.map +1 -0
  73. package/dist/commands/review-webhook-dispatch.d.ts +5 -0
  74. package/dist/commands/review-webhook-dispatch.d.ts.map +1 -0
  75. package/dist/commands/review-webhook-dispatch.js +100 -0
  76. package/dist/commands/review-webhook-dispatch.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Review-report-archive — Archive and manage historical review reports.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from "fs";
5
+ import { join, basename } from "path";
6
+ // ─── CLI ────────────────────────────────────────────────────────────────────
7
+ export function runReviewReportArchive(argv) {
8
+ const archiveIdx = argv.indexOf("--archive-dir");
9
+ const archiveDir = archiveIdx >= 0 ? argv[archiveIdx + 1] : ".judges/archive";
10
+ const formatIdx = argv.indexOf("--format");
11
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
12
+ if (argv.includes("--help") || argv.includes("-h")) {
13
+ console.log(`
14
+ judges review-report-archive — Archive review reports
15
+
16
+ Usage:
17
+ judges review-report-archive [--archive-dir <path>] [--add <report>]
18
+ [--prune <days>] [--format table|json]
19
+
20
+ Options:
21
+ --archive-dir <path> Archive directory (default: .judges/archive)
22
+ --add <report> Archive a report file
23
+ --prune <days> Remove entries older than N days
24
+ --format <fmt> Output format: table (default), json
25
+ --help, -h Show this help
26
+ `);
27
+ return;
28
+ }
29
+ if (!existsSync(archiveDir)) {
30
+ mkdirSync(archiveDir, { recursive: true });
31
+ }
32
+ const indexPath = join(archiveDir, "index.json");
33
+ let index;
34
+ if (existsSync(indexPath)) {
35
+ index = JSON.parse(readFileSync(indexPath, "utf-8"));
36
+ }
37
+ else {
38
+ index = { entries: [], lastUpdated: new Date().toISOString().split("T")[0] };
39
+ }
40
+ // Add report to archive
41
+ const addIdx = argv.indexOf("--add");
42
+ if (addIdx >= 0) {
43
+ const reportPath = argv[addIdx + 1];
44
+ if (!existsSync(reportPath)) {
45
+ console.error(`Report not found: ${reportPath}`);
46
+ process.exitCode = 1;
47
+ return;
48
+ }
49
+ const report = JSON.parse(readFileSync(reportPath, "utf-8"));
50
+ const ts = new Date().toISOString().replace(/[:.]/g, "-");
51
+ const archiveFilename = `${ts}_${basename(reportPath)}`;
52
+ const destPath = join(archiveDir, archiveFilename);
53
+ copyFileSync(reportPath, destPath);
54
+ const entry = {
55
+ filename: archiveFilename,
56
+ archivedAt: new Date().toISOString().split("T")[0],
57
+ originalPath: reportPath,
58
+ findings: report.findings?.length ?? 0,
59
+ verdict: report.overallVerdict ?? "unknown",
60
+ };
61
+ index.entries.push(entry);
62
+ index.lastUpdated = new Date().toISOString().split("T")[0];
63
+ writeFileSync(indexPath, JSON.stringify(index, null, 2));
64
+ console.log(`Archived: ${archiveFilename}`);
65
+ return;
66
+ }
67
+ // Prune old entries
68
+ const pruneIdx = argv.indexOf("--prune");
69
+ if (pruneIdx >= 0) {
70
+ const days = parseInt(argv[pruneIdx + 1], 10);
71
+ const cutoff = new Date();
72
+ cutoff.setDate(cutoff.getDate() - days);
73
+ const cutoffStr = cutoff.toISOString().split("T")[0];
74
+ const before = index.entries.length;
75
+ index.entries = index.entries.filter((e) => e.archivedAt >= cutoffStr);
76
+ index.lastUpdated = new Date().toISOString().split("T")[0];
77
+ writeFileSync(indexPath, JSON.stringify(index, null, 2));
78
+ console.log(`Pruned ${before - index.entries.length} entries older than ${days} days.`);
79
+ return;
80
+ }
81
+ // List archive
82
+ if (format === "json") {
83
+ console.log(JSON.stringify(index, null, 2));
84
+ return;
85
+ }
86
+ console.log(`\nReport Archive`);
87
+ console.log("═".repeat(70));
88
+ if (index.entries.length === 0) {
89
+ console.log(" No archived reports. Use --add <report> to archive one.");
90
+ }
91
+ else {
92
+ console.log(` ${"Date".padEnd(12)} ${"Verdict".padEnd(10)} ${"Findings".padEnd(10)} Filename`);
93
+ console.log(" " + "─".repeat(65));
94
+ for (const e of index.entries) {
95
+ console.log(` ${e.archivedAt.padEnd(12)} ${e.verdict.padEnd(10)} ${String(e.findings).padEnd(10)} ${e.filename}`);
96
+ }
97
+ }
98
+ console.log(`\n Total archived: ${index.entries.length}`);
99
+ console.log("═".repeat(70));
100
+ }
101
+ //# sourceMappingURL=review-report-archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-report-archive.js","sourceRoot":"","sources":["../../src/commands/review-report-archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-rollout-plan — Generate a phased rollout plan for Judges adoption.
3
+ */
4
+ export declare function runReviewRolloutPlan(argv: string[]): void;
5
+ //# sourceMappingURL=review-rollout-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-rollout-plan.d.ts","sourceRoot":"","sources":["../../src/commands/review-rollout-plan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+HzD"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Review-rollout-plan — Generate a phased rollout plan for Judges adoption.
3
+ */
4
+ import { writeFileSync } from "fs";
5
+ import { defaultRegistry } from "../judge-registry.js";
6
+ // ─── CLI ────────────────────────────────────────────────────────────────────
7
+ export function runReviewRolloutPlan(argv) {
8
+ const teamIdx = argv.indexOf("--team-size");
9
+ const outIdx = argv.indexOf("--out");
10
+ const formatIdx = argv.indexOf("--format");
11
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
12
+ const teamSize = teamIdx >= 0 ? parseInt(argv[teamIdx + 1], 10) : 5;
13
+ if (argv.includes("--help") || argv.includes("-h")) {
14
+ console.log(`
15
+ judges review-rollout-plan — Generate a phased rollout plan
16
+
17
+ Usage:
18
+ judges review-rollout-plan [--team-size <n>] [--out <path>]
19
+ [--format table|json]
20
+
21
+ Options:
22
+ --team-size <n> Team size for rollout planning (default: 5)
23
+ --out <path> Save plan to file
24
+ --format <fmt> Output format: table (default), json
25
+ --help, -h Show this help
26
+ `);
27
+ return;
28
+ }
29
+ const allJudges = defaultRegistry.getJudges();
30
+ const securityJudges = allJudges.filter((j) => j.domain === "security").map((j) => j.id);
31
+ const qualityJudges = allJudges
32
+ .filter((j) => j.domain === "quality" || j.domain === "best-practices")
33
+ .map((j) => j.id);
34
+ const otherJudges = allJudges
35
+ .filter((j) => j.domain !== "security" && j.domain !== "quality" && j.domain !== "best-practices")
36
+ .map((j) => j.id);
37
+ const phases = [
38
+ {
39
+ phase: 1,
40
+ name: "Pilot",
41
+ duration: "1-2 weeks",
42
+ judges: securityJudges.slice(0, 3),
43
+ goals: [
44
+ `Onboard ${Math.max(1, Math.floor(teamSize * 0.2))} pilot users`,
45
+ "Run security judges on non-critical repos",
46
+ "Collect feedback on finding quality",
47
+ ],
48
+ successCriteria: ["Pilot users complete 5+ reviews", "False positive rate < 15%", "Positive user feedback"],
49
+ },
50
+ {
51
+ phase: 2,
52
+ name: "Expand Security",
53
+ duration: "2-3 weeks",
54
+ judges: securityJudges,
55
+ goals: [
56
+ `Expand to ${Math.max(2, Math.floor(teamSize * 0.5))} users`,
57
+ "Enable all security judges",
58
+ "Integrate into CI pipeline",
59
+ ],
60
+ successCriteria: ["CI integration operational", "Review turnaround < 5 min", "Team adoption > 50%"],
61
+ },
62
+ {
63
+ phase: 3,
64
+ name: "Full Judge Suite",
65
+ duration: "2-4 weeks",
66
+ judges: [...securityJudges, ...qualityJudges.slice(0, 5)],
67
+ goals: [
68
+ `Expand to full team (${teamSize} users)`,
69
+ "Enable quality and best-practice judges",
70
+ "Establish baseline metrics",
71
+ ],
72
+ successCriteria: ["100% team adoption", "Baseline established", "Documented processes"],
73
+ },
74
+ {
75
+ phase: 4,
76
+ name: "Optimization",
77
+ duration: "Ongoing",
78
+ judges: [...securityJudges, ...qualityJudges, ...otherJudges],
79
+ goals: [
80
+ "Enable full judge suite",
81
+ "Tune thresholds based on team feedback",
82
+ "Automate fix application where safe",
83
+ ],
84
+ successCriteria: [
85
+ "Finding resolution rate > 80%",
86
+ "Average review score > 7/10",
87
+ "Continuous improvement cycle active",
88
+ ],
89
+ },
90
+ ];
91
+ const plan = {
92
+ teamSize,
93
+ phases,
94
+ generatedAt: new Date().toISOString().split("T")[0],
95
+ };
96
+ // Save if requested
97
+ if (outIdx >= 0) {
98
+ const outPath = argv[outIdx + 1];
99
+ writeFileSync(outPath, JSON.stringify(plan, null, 2));
100
+ console.log(`Rollout plan saved to: ${outPath}`);
101
+ return;
102
+ }
103
+ if (format === "json") {
104
+ console.log(JSON.stringify(plan, null, 2));
105
+ return;
106
+ }
107
+ console.log(`\nRollout Plan (team size: ${teamSize})`);
108
+ console.log("═".repeat(65));
109
+ for (const p of phases) {
110
+ console.log(`\n Phase ${p.phase}: ${p.name} (${p.duration})`);
111
+ console.log(" " + "─".repeat(55));
112
+ console.log(` Judges: ${p.judges.slice(0, 5).join(", ")}${p.judges.length > 5 ? ` (+${p.judges.length - 5} more)` : ""}`);
113
+ console.log(" Goals:");
114
+ for (const g of p.goals) {
115
+ console.log(` • ${g}`);
116
+ }
117
+ console.log(" Success Criteria:");
118
+ for (const s of p.successCriteria) {
119
+ console.log(` ✓ ${s}`);
120
+ }
121
+ }
122
+ console.log("\n═".repeat(65));
123
+ }
124
+ //# sourceMappingURL=review-rollout-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-rollout-plan.js","sourceRoot":"","sources":["../../src/commands/review-rollout-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-sla-config — Configure SLA targets for review resolution.
3
+ */
4
+ export declare function runReviewSlaConfig(argv: string[]): void;
5
+ //# sourceMappingURL=review-sla-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-sla-config.d.ts","sourceRoot":"","sources":["../../src/commands/review-sla-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6BH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqFvD"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Review-sla-config — Configure SLA targets for review resolution.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ const DEFAULT_SLAS = [
6
+ { severity: "critical", maxResolutionHours: 4, escalateAfterHours: 2, notifyOnBreach: true },
7
+ { severity: "high", maxResolutionHours: 24, escalateAfterHours: 12, notifyOnBreach: true },
8
+ { severity: "medium", maxResolutionHours: 72, escalateAfterHours: 48, notifyOnBreach: false },
9
+ { severity: "low", maxResolutionHours: 168, escalateAfterHours: 120, notifyOnBreach: false },
10
+ { severity: "info", maxResolutionHours: 336, escalateAfterHours: 240, notifyOnBreach: false },
11
+ ];
12
+ // ─── CLI ────────────────────────────────────────────────────────────────────
13
+ export function runReviewSlaConfig(argv) {
14
+ const storeIdx = argv.indexOf("--store");
15
+ const storePath = storeIdx >= 0 ? argv[storeIdx + 1] : ".judges-sla.json";
16
+ const formatIdx = argv.indexOf("--format");
17
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
18
+ if (argv.includes("--help") || argv.includes("-h")) {
19
+ console.log(`
20
+ judges review-sla-config — Configure SLA targets for review resolution
21
+
22
+ Usage:
23
+ judges review-sla-config [--store <path>] [--init] [--set <json>]
24
+ [--format table|json]
25
+
26
+ Options:
27
+ --store <path> SLA config file (default: .judges-sla.json)
28
+ --init Initialize with default SLA targets
29
+ --set <json> Set SLA target (JSON with severity, maxResolutionHours, etc.)
30
+ --format <fmt> Output format: table (default), json
31
+ --help, -h Show this help
32
+ `);
33
+ return;
34
+ }
35
+ // Init with defaults
36
+ if (argv.includes("--init")) {
37
+ const store = {
38
+ targets: DEFAULT_SLAS,
39
+ lastUpdated: new Date().toISOString().split("T")[0],
40
+ };
41
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
42
+ console.log(`SLA config initialized with defaults at: ${storePath}`);
43
+ return;
44
+ }
45
+ let store;
46
+ if (existsSync(storePath)) {
47
+ store = JSON.parse(readFileSync(storePath, "utf-8"));
48
+ }
49
+ else {
50
+ store = { targets: [], lastUpdated: new Date().toISOString().split("T")[0] };
51
+ }
52
+ // Set SLA target
53
+ const setIdx = argv.indexOf("--set");
54
+ if (setIdx >= 0) {
55
+ const target = JSON.parse(argv[setIdx + 1]);
56
+ const existingIdx = store.targets.findIndex((t) => t.severity === target.severity);
57
+ if (existingIdx >= 0) {
58
+ store.targets[existingIdx] = target;
59
+ }
60
+ else {
61
+ store.targets.push(target);
62
+ }
63
+ store.lastUpdated = new Date().toISOString().split("T")[0];
64
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
65
+ console.log(`SLA target for "${target.severity}" saved.`);
66
+ return;
67
+ }
68
+ // Display
69
+ if (format === "json") {
70
+ console.log(JSON.stringify(store, null, 2));
71
+ return;
72
+ }
73
+ console.log(`\nSLA Configuration`);
74
+ console.log("═".repeat(65));
75
+ if (store.targets.length === 0) {
76
+ console.log(" No SLA targets configured. Use --init for defaults or --set to add.");
77
+ }
78
+ else {
79
+ console.log(` ${"Severity".padEnd(12)} ${"Max Resolution".padEnd(16)} ${"Escalate After".padEnd(16)} Notify`);
80
+ console.log(" " + "─".repeat(55));
81
+ for (const t of store.targets) {
82
+ const maxRes = t.maxResolutionHours < 24 ? `${t.maxResolutionHours}h` : `${Math.round(t.maxResolutionHours / 24)}d`;
83
+ const escalate = t.escalateAfterHours < 24 ? `${t.escalateAfterHours}h` : `${Math.round(t.escalateAfterHours / 24)}d`;
84
+ console.log(` ${t.severity.padEnd(12)} ${maxRes.padEnd(16)} ${escalate.padEnd(16)} ${t.notifyOnBreach ? "Yes" : "No"}`);
85
+ }
86
+ }
87
+ console.log("═".repeat(65));
88
+ }
89
+ //# sourceMappingURL=review-sla-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-sla-config.js","sourceRoot":"","sources":["../../src/commands/review-sla-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-webhook-dispatch — Configure webhook endpoints for review events.
3
+ */
4
+ export declare function runReviewWebhookDispatch(argv: string[]): void;
5
+ //# sourceMappingURL=review-webhook-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-webhook-dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/review-webhook-dispatch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmG7D"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Review-webhook-dispatch — Configure webhook endpoints for review events.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewWebhookDispatch(argv) {
7
+ const storeIdx = argv.indexOf("--store");
8
+ const storePath = storeIdx >= 0 ? argv[storeIdx + 1] : ".judges-webhooks.json";
9
+ const formatIdx = argv.indexOf("--format");
10
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
11
+ if (argv.includes("--help") || argv.includes("-h")) {
12
+ console.log(`
13
+ judges review-webhook-dispatch — Configure webhook dispatch for review events
14
+
15
+ Usage:
16
+ judges review-webhook-dispatch [--store <path>] [--add <json>]
17
+ [--remove <id>] [--test <id>]
18
+ [--format table|json]
19
+
20
+ Options:
21
+ --store <path> Webhook config file (default: .judges-webhooks.json)
22
+ --add <json> Add webhook config (JSON)
23
+ --remove <id> Remove webhook by id
24
+ --test <id> Test webhook connectivity (dry run)
25
+ --format <fmt> Output format: table (default), json
26
+ --help, -h Show this help
27
+ `);
28
+ return;
29
+ }
30
+ let store;
31
+ if (existsSync(storePath)) {
32
+ store = JSON.parse(readFileSync(storePath, "utf-8"));
33
+ }
34
+ else {
35
+ store = { webhooks: [], lastUpdated: new Date().toISOString().split("T")[0] };
36
+ }
37
+ // Add webhook
38
+ const addIdx = argv.indexOf("--add");
39
+ if (addIdx >= 0) {
40
+ const webhook = JSON.parse(argv[addIdx + 1]);
41
+ const existingIdx = store.webhooks.findIndex((w) => w.id === webhook.id);
42
+ if (existingIdx >= 0) {
43
+ store.webhooks[existingIdx] = webhook;
44
+ }
45
+ else {
46
+ store.webhooks.push(webhook);
47
+ }
48
+ store.lastUpdated = new Date().toISOString().split("T")[0];
49
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
50
+ console.log(`Webhook "${webhook.id}" saved.`);
51
+ return;
52
+ }
53
+ // Remove webhook
54
+ const removeIdx = argv.indexOf("--remove");
55
+ if (removeIdx >= 0) {
56
+ const id = argv[removeIdx + 1];
57
+ store.webhooks = store.webhooks.filter((w) => w.id !== id);
58
+ store.lastUpdated = new Date().toISOString().split("T")[0];
59
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
60
+ console.log(`Webhook "${id}" removed.`);
61
+ return;
62
+ }
63
+ // Test webhook
64
+ const testIdx = argv.indexOf("--test");
65
+ if (testIdx >= 0) {
66
+ const id = argv[testIdx + 1];
67
+ const webhook = store.webhooks.find((w) => w.id === id);
68
+ if (!webhook) {
69
+ console.error(`Webhook "${id}" not found.`);
70
+ process.exitCode = 1;
71
+ return;
72
+ }
73
+ console.log(`Webhook test (dry run):`);
74
+ console.log(` ID: ${webhook.id}`);
75
+ console.log(` URL: ${webhook.url}`);
76
+ console.log(` Events: ${webhook.events.join(", ")}`);
77
+ console.log(` Status: ${webhook.enabled ? "enabled" : "disabled"}`);
78
+ console.log(` Would send: { "event": "test", "timestamp": "${new Date().toISOString()}" }`);
79
+ return;
80
+ }
81
+ // List webhooks
82
+ if (format === "json") {
83
+ console.log(JSON.stringify(store, null, 2));
84
+ return;
85
+ }
86
+ console.log(`\nWebhook Dispatch Config`);
87
+ console.log("═".repeat(60));
88
+ if (store.webhooks.length === 0) {
89
+ console.log(" No webhooks configured. Use --add to create one.");
90
+ }
91
+ else {
92
+ for (const w of store.webhooks) {
93
+ const status = w.enabled ? "ON" : "OFF";
94
+ console.log(` [${status}] ${w.id.padEnd(20)} ${w.url}`);
95
+ console.log(` Events: ${w.events.join(", ")}`);
96
+ }
97
+ }
98
+ console.log("═".repeat(60));
99
+ }
100
+ //# sourceMappingURL=review-webhook-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-webhook-dispatch.js","sourceRoot":"","sources":["../../src/commands/review-webhook-dispatch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAiB7D,+EAA+E;AAE/E,MAAM,UAAU,wBAAwB,CAAC,IAAc;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC;IAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE9D,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;CAef,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,IAAI,KAAmB,CAAC;IACxB,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAiB,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,CAAC;IAED,cAAc;IACd,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAkB,CAAC;QAC9D,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,eAAe;IACf,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC7F,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.96.0",
3
+ "version": "3.98.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.96.0",
10
+ "version": "3.98.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.96.0",
15
+ "version": "3.98.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }