@kevinrabun/judges 3.92.0 → 3.94.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-code-context.d.ts +5 -0
  6. package/dist/commands/finding-code-context.d.ts.map +1 -0
  7. package/dist/commands/finding-code-context.js +97 -0
  8. package/dist/commands/finding-code-context.js.map +1 -0
  9. package/dist/commands/finding-explain.d.ts +5 -0
  10. package/dist/commands/finding-explain.d.ts.map +1 -0
  11. package/dist/commands/finding-explain.js +94 -0
  12. package/dist/commands/finding-explain.js.map +1 -0
  13. package/dist/commands/finding-filter-view.d.ts +5 -0
  14. package/dist/commands/finding-filter-view.d.ts.map +1 -0
  15. package/dist/commands/finding-filter-view.js +108 -0
  16. package/dist/commands/finding-filter-view.js.map +1 -0
  17. package/dist/commands/finding-fix-suggest.d.ts +5 -0
  18. package/dist/commands/finding-fix-suggest.d.ts.map +1 -0
  19. package/dist/commands/finding-fix-suggest.js +89 -0
  20. package/dist/commands/finding-fix-suggest.js.map +1 -0
  21. package/dist/commands/finding-link-graph.d.ts +5 -0
  22. package/dist/commands/finding-link-graph.d.ts.map +1 -0
  23. package/dist/commands/finding-link-graph.js +145 -0
  24. package/dist/commands/finding-link-graph.js.map +1 -0
  25. package/dist/commands/finding-ownership-map.d.ts +5 -0
  26. package/dist/commands/finding-ownership-map.d.ts.map +1 -0
  27. package/dist/commands/finding-ownership-map.js +118 -0
  28. package/dist/commands/finding-ownership-map.js.map +1 -0
  29. package/dist/commands/finding-resolution-track.d.ts +5 -0
  30. package/dist/commands/finding-resolution-track.d.ts.map +1 -0
  31. package/dist/commands/finding-resolution-track.js +151 -0
  32. package/dist/commands/finding-resolution-track.js.map +1 -0
  33. package/dist/commands/review-audit-trail.d.ts +5 -0
  34. package/dist/commands/review-audit-trail.d.ts.map +1 -0
  35. package/dist/commands/review-audit-trail.js +97 -0
  36. package/dist/commands/review-audit-trail.js.map +1 -0
  37. package/dist/commands/review-compliance-report.d.ts +5 -0
  38. package/dist/commands/review-compliance-report.d.ts.map +1 -0
  39. package/dist/commands/review-compliance-report.js +128 -0
  40. package/dist/commands/review-compliance-report.js.map +1 -0
  41. package/dist/commands/review-config-template.d.ts +5 -0
  42. package/dist/commands/review-config-template.d.ts.map +1 -0
  43. package/dist/commands/review-config-template.js +113 -0
  44. package/dist/commands/review-config-template.js.map +1 -0
  45. package/dist/commands/review-ide-sync.d.ts +5 -0
  46. package/dist/commands/review-ide-sync.d.ts.map +1 -0
  47. package/dist/commands/review-ide-sync.js +92 -0
  48. package/dist/commands/review-ide-sync.js.map +1 -0
  49. package/dist/commands/review-interactive.d.ts +5 -0
  50. package/dist/commands/review-interactive.d.ts.map +1 -0
  51. package/dist/commands/review-interactive.js +86 -0
  52. package/dist/commands/review-interactive.js.map +1 -0
  53. package/dist/commands/review-onboard-checklist.d.ts +5 -0
  54. package/dist/commands/review-onboard-checklist.d.ts.map +1 -0
  55. package/dist/commands/review-onboard-checklist.js +120 -0
  56. package/dist/commands/review-onboard-checklist.js.map +1 -0
  57. package/dist/commands/review-progress-track.d.ts +5 -0
  58. package/dist/commands/review-progress-track.d.ts.map +1 -0
  59. package/dist/commands/review-progress-track.js +95 -0
  60. package/dist/commands/review-progress-track.js.map +1 -0
  61. package/dist/commands/review-quickstart.d.ts +5 -0
  62. package/dist/commands/review-quickstart.d.ts.map +1 -0
  63. package/dist/commands/review-quickstart.js +108 -0
  64. package/dist/commands/review-quickstart.js.map +1 -0
  65. package/dist/commands/review-report-schedule.d.ts +5 -0
  66. package/dist/commands/review-report-schedule.d.ts.map +1 -0
  67. package/dist/commands/review-report-schedule.js +97 -0
  68. package/dist/commands/review-report-schedule.js.map +1 -0
  69. package/dist/commands/review-slack-format.d.ts +5 -0
  70. package/dist/commands/review-slack-format.d.ts.map +1 -0
  71. package/dist/commands/review-slack-format.js +114 -0
  72. package/dist/commands/review-slack-format.js.map +1 -0
  73. package/dist/commands/review-tenant-config.d.ts +5 -0
  74. package/dist/commands/review-tenant-config.d.ts.map +1 -0
  75. package/dist/commands/review-tenant-config.js +117 -0
  76. package/dist/commands/review-tenant-config.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Review-quickstart — Interactive quickstart guide for new users.
3
+ */
4
+ import { existsSync, writeFileSync } from "fs";
5
+ import { join } from "path";
6
+ import { defaultRegistry } from "../judge-registry.js";
7
+ function buildSteps(projectDir) {
8
+ const configPath = join(projectDir, ".judgesrc");
9
+ const hasConfig = existsSync(configPath);
10
+ const judges = defaultRegistry.getJudges();
11
+ return [
12
+ {
13
+ number: 1,
14
+ title: "Install Judges",
15
+ description: "npm install -g @kevinrabun/judges",
16
+ status: "done",
17
+ },
18
+ {
19
+ number: 2,
20
+ title: "Create Configuration",
21
+ description: `Create .judgesrc in your project root (${judges.length} judges available)`,
22
+ status: hasConfig ? "done" : "pending",
23
+ },
24
+ {
25
+ number: 3,
26
+ title: "Run First Review",
27
+ description: "judges review <file> — run your first code review",
28
+ status: "pending",
29
+ },
30
+ {
31
+ number: 4,
32
+ title: "Explore Judges",
33
+ description: `judges list — browse ${judges.length} available judges across domains`,
34
+ status: "pending",
35
+ },
36
+ {
37
+ number: 5,
38
+ title: "Configure Severity",
39
+ description: "Set minSeverity in .judgesrc to filter noise (critical, high, medium, low, info)",
40
+ status: "pending",
41
+ },
42
+ {
43
+ number: 6,
44
+ title: "Add CI Integration",
45
+ description: "judges review-ci-gate — integrate into your CI/CD pipeline",
46
+ status: "pending",
47
+ },
48
+ {
49
+ number: 7,
50
+ title: "Enable IDE Support",
51
+ description: "Install Judges Panel for VS Code or configure JetBrains plugin",
52
+ status: "pending",
53
+ },
54
+ ];
55
+ }
56
+ // ─── CLI ────────────────────────────────────────────────────────────────────
57
+ export function runReviewQuickstart(argv) {
58
+ const dirIdx = argv.indexOf("--dir");
59
+ const formatIdx = argv.indexOf("--format");
60
+ const initFlag = argv.includes("--init");
61
+ const projectDir = dirIdx >= 0 ? argv[dirIdx + 1] : process.cwd();
62
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
63
+ if (argv.includes("--help") || argv.includes("-h")) {
64
+ console.log(`
65
+ judges review-quickstart — Interactive quickstart guide
66
+
67
+ Usage:
68
+ judges review-quickstart [--dir <path>] [--init] [--format table|json]
69
+
70
+ Options:
71
+ --dir <path> Project directory (default: cwd)
72
+ --init Generate default .judgesrc config
73
+ --format <fmt> Output format: table (default), json
74
+ --help, -h Show this help
75
+ `);
76
+ return;
77
+ }
78
+ if (initFlag) {
79
+ const configPath = join(projectDir, ".judgesrc");
80
+ if (existsSync(configPath)) {
81
+ console.log(`Config already exists: ${configPath}`);
82
+ return;
83
+ }
84
+ const defaultConfig = {
85
+ preset: "default",
86
+ minSeverity: "medium",
87
+ };
88
+ writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));
89
+ console.log(`Created default config: ${configPath}`);
90
+ return;
91
+ }
92
+ const steps = buildSteps(projectDir);
93
+ if (format === "json") {
94
+ console.log(JSON.stringify(steps, null, 2));
95
+ return;
96
+ }
97
+ const completed = steps.filter((s) => s.status === "done").length;
98
+ console.log(`\nQuickstart Progress: ${completed}/${steps.length} steps completed`);
99
+ console.log("═".repeat(65));
100
+ for (const step of steps) {
101
+ const icon = step.status === "done" ? "[✓]" : step.status === "skipped" ? "[-]" : "[ ]";
102
+ console.log(` ${icon} Step ${step.number}: ${step.title}`);
103
+ console.log(` ${step.description}`);
104
+ }
105
+ console.log("═".repeat(65));
106
+ console.log(`\nRun with --init to generate a default .judgesrc config.`);
107
+ }
108
+ //# sourceMappingURL=review-quickstart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-quickstart.js","sourceRoot":"","sources":["../../src/commands/review-quickstart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-report-schedule — Configure and view scheduled report generation.
3
+ */
4
+ export declare function runReviewReportSchedule(argv: string[]): void;
5
+ //# sourceMappingURL=review-report-schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-report-schedule.d.ts","sourceRoot":"","sources":["../../src/commands/review-report-schedule.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkCH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuF5D"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Review-report-schedule — Configure and view scheduled report generation.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ // ─── Logic ──────────────────────────────────────────────────────────────────
6
+ function loadSchedule(path) {
7
+ if (!existsSync(path)) {
8
+ return { version: 1, schedules: [] };
9
+ }
10
+ try {
11
+ return JSON.parse(readFileSync(path, "utf-8"));
12
+ }
13
+ catch {
14
+ return { version: 1, schedules: [] };
15
+ }
16
+ }
17
+ // ─── CLI ────────────────────────────────────────────────────────────────────
18
+ export function runReviewReportSchedule(argv) {
19
+ const configIdx = argv.indexOf("--config");
20
+ const addIdx = argv.indexOf("--add");
21
+ const freqIdx = argv.indexOf("--frequency");
22
+ const fmtIdx = argv.indexOf("--report-format");
23
+ const outIdx = argv.indexOf("--output-dir");
24
+ const removeIdx = argv.indexOf("--remove");
25
+ const formatIdx = argv.indexOf("--format");
26
+ const configPath = configIdx >= 0 ? argv[configIdx + 1] : ".judges-schedule.json";
27
+ const addId = addIdx >= 0 ? argv[addIdx + 1] : undefined;
28
+ const frequency = freqIdx >= 0 ? argv[freqIdx + 1] : "weekly";
29
+ const reportFormat = fmtIdx >= 0 ? argv[fmtIdx + 1] : "markdown";
30
+ const outputDir = outIdx >= 0 ? argv[outIdx + 1] : "./reports";
31
+ const removeId = removeIdx >= 0 ? argv[removeIdx + 1] : undefined;
32
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
33
+ if (argv.includes("--help") || argv.includes("-h")) {
34
+ console.log(`
35
+ judges review-report-schedule — Manage report schedules
36
+
37
+ Usage:
38
+ judges review-report-schedule [--config <path>] [--add <id>]
39
+ [--frequency daily|weekly|monthly]
40
+ [--report-format <fmt>] [--output-dir <path>]
41
+ [--remove <id>] [--format table|json]
42
+
43
+ Options:
44
+ --config <path> Schedule config file (default: .judges-schedule.json)
45
+ --add <id> Add a new schedule
46
+ --frequency <freq> Schedule frequency (default: weekly)
47
+ --report-format <fmt> Report format (default: markdown)
48
+ --output-dir <path> Output directory (default: ./reports)
49
+ --remove <id> Remove a schedule by ID
50
+ --format <fmt> Output format: table (default), json
51
+ --help, -h Show this help
52
+ `);
53
+ return;
54
+ }
55
+ const config = loadSchedule(configPath);
56
+ // Remove mode
57
+ if (removeId) {
58
+ config.schedules = config.schedules.filter((s) => s.id !== removeId);
59
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
60
+ console.log(`Removed schedule "${removeId}"`);
61
+ return;
62
+ }
63
+ // Add mode
64
+ if (addId) {
65
+ const existing = config.schedules.find((s) => s.id === addId);
66
+ if (existing) {
67
+ console.error(`Error: schedule "${addId}" already exists`);
68
+ process.exitCode = 1;
69
+ return;
70
+ }
71
+ config.schedules.push({
72
+ id: addId,
73
+ frequency,
74
+ format: reportFormat,
75
+ outputDir,
76
+ createdAt: new Date().toISOString(),
77
+ });
78
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
79
+ console.log(`Added schedule "${addId}" (${frequency})`);
80
+ return;
81
+ }
82
+ // List mode
83
+ if (format === "json") {
84
+ console.log(JSON.stringify(config, null, 2));
85
+ return;
86
+ }
87
+ console.log(`\nReport Schedules (${config.schedules.length})`);
88
+ console.log("═".repeat(65));
89
+ console.log(`${"ID".padEnd(18)} ${"Frequency".padEnd(12)} ${"Format".padEnd(12)} Output Dir`);
90
+ console.log("─".repeat(65));
91
+ for (const s of config.schedules) {
92
+ const id = s.id.length > 16 ? s.id.slice(0, 16) + "…" : s.id;
93
+ console.log(`${id.padEnd(18)} ${s.frequency.padEnd(12)} ${s.format.padEnd(12)} ${s.outputDir}`);
94
+ }
95
+ console.log("═".repeat(65));
96
+ }
97
+ //# sourceMappingURL=review-report-schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-report-schedule.js","sourceRoot":"","sources":["../../src/commands/review-report-schedule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-slack-format — Format review summaries for Slack-compatible output.
3
+ */
4
+ export declare function runReviewSlackFormat(argv: string[]): void;
5
+ //# sourceMappingURL=review-slack-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-slack-format.d.ts","sourceRoot":"","sources":["../../src/commands/review-slack-format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgFH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsDzD"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Review-slack-format — Format review summaries for Slack-compatible output.
3
+ */
4
+ import { readFileSync, existsSync, writeFileSync } from "fs";
5
+ // ─── Analysis ───────────────────────────────────────────────────────────────
6
+ function toSlackBlocks(verdict) {
7
+ const emoji = verdict.overallVerdict === "pass"
8
+ ? ":white_check_mark:"
9
+ : verdict.overallVerdict === "warning"
10
+ ? ":warning:"
11
+ : ":x:";
12
+ const blocks = [
13
+ {
14
+ type: "header",
15
+ text: { type: "plain_text", text: `${emoji} Code Review: ${verdict.overallVerdict.toUpperCase()}` },
16
+ },
17
+ {
18
+ type: "section",
19
+ fields: [
20
+ { type: "mrkdwn", text: `*Score:* ${verdict.overallScore}/100` },
21
+ { type: "mrkdwn", text: `*Findings:* ${verdict.findings.length}` },
22
+ { type: "mrkdwn", text: `*Critical:* ${verdict.criticalCount}` },
23
+ { type: "mrkdwn", text: `*High:* ${verdict.highCount}` },
24
+ ],
25
+ },
26
+ ];
27
+ if (verdict.findings.length > 0) {
28
+ const topFindings = verdict.findings.slice(0, 5);
29
+ const findingText = topFindings
30
+ .map((f) => {
31
+ const sev = (f.severity || "medium").toUpperCase();
32
+ return `• *[${sev}]* ${f.ruleId}: ${f.title}`;
33
+ })
34
+ .join("\n");
35
+ blocks.push({
36
+ type: "section",
37
+ text: { type: "mrkdwn", text: `*Top Findings:*\n${findingText}` },
38
+ });
39
+ if (verdict.findings.length > 5) {
40
+ blocks.push({
41
+ type: "context",
42
+ elements: [{ type: "mrkdwn", text: `_+${verdict.findings.length - 5} more findings_` }],
43
+ });
44
+ }
45
+ }
46
+ return { blocks };
47
+ }
48
+ function toSlackText(verdict) {
49
+ const lines = [];
50
+ const emoji = verdict.overallVerdict === "pass" ? "✅" : verdict.overallVerdict === "warning" ? "⚠️" : "❌";
51
+ lines.push(`${emoji} *Code Review: ${verdict.overallVerdict.toUpperCase()}*`);
52
+ lines.push(`Score: ${verdict.overallScore}/100 | Findings: ${verdict.findings.length} | Critical: ${verdict.criticalCount} | High: ${verdict.highCount}`);
53
+ lines.push("");
54
+ for (const f of verdict.findings.slice(0, 5)) {
55
+ const sev = (f.severity || "medium").toUpperCase();
56
+ lines.push(`• [${sev}] ${f.ruleId}: ${f.title}`);
57
+ }
58
+ if (verdict.findings.length > 5) {
59
+ lines.push(`_+${verdict.findings.length - 5} more_`);
60
+ }
61
+ return lines.join("\n");
62
+ }
63
+ // ─── CLI ────────────────────────────────────────────────────────────────────
64
+ export function runReviewSlackFormat(argv) {
65
+ const fileIdx = argv.indexOf("--file");
66
+ const formatIdx = argv.indexOf("--format");
67
+ const outputIdx = argv.indexOf("--output");
68
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
69
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "blocks";
70
+ const outputPath = outputIdx >= 0 ? argv[outputIdx + 1] : undefined;
71
+ if (argv.includes("--help") || argv.includes("-h")) {
72
+ console.log(`
73
+ judges review-slack-format — Format review for Slack
74
+
75
+ Usage:
76
+ judges review-slack-format --file <verdict.json> [--format blocks|text]
77
+ [--output <file>]
78
+
79
+ Options:
80
+ --file <path> Path to verdict JSON file (required)
81
+ --format <fmt> Format: blocks (default), text
82
+ --output <path> Write output to file
83
+ --help, -h Show this help
84
+ `);
85
+ return;
86
+ }
87
+ if (!filePath) {
88
+ console.error("Error: --file required");
89
+ process.exitCode = 1;
90
+ return;
91
+ }
92
+ if (!existsSync(filePath)) {
93
+ console.error(`Error: not found: ${filePath}`);
94
+ process.exitCode = 1;
95
+ return;
96
+ }
97
+ let verdict;
98
+ try {
99
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
100
+ }
101
+ catch {
102
+ console.error("Error: invalid JSON");
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ const output = format === "text" ? toSlackText(verdict) : JSON.stringify(toSlackBlocks(verdict), null, 2);
107
+ if (outputPath) {
108
+ writeFileSync(outputPath, output);
109
+ console.log(`Slack format written to ${outputPath}`);
110
+ return;
111
+ }
112
+ console.log(output);
113
+ }
114
+ //# sourceMappingURL=review-slack-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-slack-format.js","sourceRoot":"","sources":["../../src/commands/review-slack-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-tenant-config — Manage per-tenant/team configuration profiles.
3
+ */
4
+ export declare function runReviewTenantConfig(argv: string[]): void;
5
+ //# sourceMappingURL=review-tenant-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-tenant-config.d.ts","sourceRoot":"","sources":["../../src/commands/review-tenant-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqH1D"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Review-tenant-config — Manage per-tenant/team configuration profiles.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, readdirSync } from "fs";
5
+ import { join } from "path";
6
+ // ─── CLI ────────────────────────────────────────────────────────────────────
7
+ export function runReviewTenantConfig(argv) {
8
+ const dirIdx = argv.indexOf("--dir");
9
+ const nameIdx = argv.indexOf("--name");
10
+ const setIdx = argv.indexOf("--set");
11
+ const formatIdx = argv.indexOf("--format");
12
+ const configDir = dirIdx >= 0 ? argv[dirIdx + 1] : join(process.cwd(), ".judges-tenants");
13
+ const tenantName = nameIdx >= 0 ? argv[nameIdx + 1] : undefined;
14
+ const setValue = setIdx >= 0 ? argv[setIdx + 1] : undefined;
15
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
16
+ if (argv.includes("--help") || argv.includes("-h")) {
17
+ console.log(`
18
+ judges review-tenant-config — Manage team configuration profiles
19
+
20
+ Usage:
21
+ judges review-tenant-config [--dir <path>] [--name <tenant>]
22
+ [--set <key=value>] [--format table|json]
23
+
24
+ Options:
25
+ --dir <path> Config directory (default: .judges-tenants/)
26
+ --name <tenant> Tenant/team name
27
+ --set <key=value> Set a config key for the named tenant
28
+ --format <fmt> Output format: table (default), json
29
+ --help, -h Show this help
30
+ `);
31
+ return;
32
+ }
33
+ // List all tenants
34
+ if (!tenantName) {
35
+ if (!existsSync(configDir)) {
36
+ console.log("No tenant configs found. Use --name <tenant> to create one.");
37
+ return;
38
+ }
39
+ const files = readdirSync(configDir);
40
+ const profiles = [];
41
+ for (const file of files) {
42
+ if (typeof file === "string" && file.endsWith(".json")) {
43
+ try {
44
+ const profile = JSON.parse(readFileSync(join(configDir, file), "utf-8"));
45
+ profiles.push(profile);
46
+ }
47
+ catch {
48
+ // skip invalid files
49
+ }
50
+ }
51
+ }
52
+ if (format === "json") {
53
+ console.log(JSON.stringify(profiles, null, 2));
54
+ return;
55
+ }
56
+ console.log(`\nTenant Configurations: ${profiles.length} profile(s)`);
57
+ console.log("═".repeat(55));
58
+ for (const p of profiles) {
59
+ console.log(` ${p.name.padEnd(20)} ${p.description}`);
60
+ console.log(` ${"".padEnd(20)} Created: ${p.createdAt}`);
61
+ }
62
+ if (profiles.length === 0) {
63
+ console.log(" No tenant profiles found.");
64
+ }
65
+ console.log("═".repeat(55));
66
+ return;
67
+ }
68
+ // Set a value
69
+ if (setValue) {
70
+ const eqPos = setValue.indexOf("=");
71
+ if (eqPos < 0) {
72
+ console.error("Error: --set requires key=value format");
73
+ process.exitCode = 1;
74
+ return;
75
+ }
76
+ const key = setValue.substring(0, eqPos);
77
+ const val = setValue.substring(eqPos + 1);
78
+ const filePath = join(configDir, `${tenantName}.json`);
79
+ let profile;
80
+ if (existsSync(filePath)) {
81
+ profile = JSON.parse(readFileSync(filePath, "utf-8"));
82
+ }
83
+ else {
84
+ profile = {
85
+ name: tenantName,
86
+ description: `Configuration for ${tenantName}`,
87
+ config: {},
88
+ createdAt: new Date().toISOString().split("T")[0],
89
+ };
90
+ }
91
+ profile.config[key] = val;
92
+ writeFileSync(filePath, JSON.stringify(profile, null, 2));
93
+ console.log(`Set ${key}=${val} for tenant "${tenantName}"`);
94
+ return;
95
+ }
96
+ // Show tenant
97
+ const filePath = join(configDir, `${tenantName}.json`);
98
+ if (!existsSync(filePath)) {
99
+ console.error(`Error: no config found for tenant "${tenantName}"`);
100
+ console.error("Use --set <key=value> to create one.");
101
+ process.exitCode = 1;
102
+ return;
103
+ }
104
+ const profile = JSON.parse(readFileSync(filePath, "utf-8"));
105
+ if (format === "json") {
106
+ console.log(JSON.stringify(profile, null, 2));
107
+ return;
108
+ }
109
+ console.log(`\nTenant: ${profile.name}`);
110
+ console.log(`Description: ${profile.description}`);
111
+ console.log(`Created: ${profile.createdAt}`);
112
+ console.log("─".repeat(40));
113
+ for (const [k, v] of Object.entries(profile.config)) {
114
+ console.log(` ${k}: ${String(v)}`);
115
+ }
116
+ }
117
+ //# sourceMappingURL=review-tenant-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-tenant-config.js","sourceRoot":"","sources":["../../src/commands/review-tenant-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,+EAA+E;AAE/E,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAC1F,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,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;;;;;;;;;;;;;CAaf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAwB,CAAC;QAC5D,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvD,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAkB,CAAC;oBAC1F,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;gBAAC,MAAM,CAAC;oBACP,qBAAqB;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,cAAc;IACd,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,UAAU,OAAO,CAAC,CAAC;QACvD,IAAI,OAAsB,CAAC;QAC3B,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAkB,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,OAAO,GAAG;gBACR,IAAI,EAAE,UAAU;gBAChB,WAAW,EAAE,qBAAqB,UAAU,EAAE;gBAC9C,MAAM,EAAE,EAAE;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAClD,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1B,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,gBAAgB,UAAU,GAAG,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,cAAc;IACd,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,UAAU,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,sCAAsC,UAAU,GAAG,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACtD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAkB,CAAC;IAC7E,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.92.0",
3
+ "version": "3.94.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.92.0",
10
+ "version": "3.94.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.92.0",
15
+ "version": "3.94.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }