@kevinrabun/judges 3.100.0 → 3.102.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-batch-suppress.d.ts +5 -0
  6. package/dist/commands/finding-batch-suppress.d.ts.map +1 -0
  7. package/dist/commands/finding-batch-suppress.js +86 -0
  8. package/dist/commands/finding-batch-suppress.js.map +1 -0
  9. package/dist/commands/finding-dependency-link.d.ts +5 -0
  10. package/dist/commands/finding-dependency-link.d.ts.map +1 -0
  11. package/dist/commands/finding-dependency-link.js +74 -0
  12. package/dist/commands/finding-dependency-link.js.map +1 -0
  13. package/dist/commands/finding-ownership-assign.d.ts +5 -0
  14. package/dist/commands/finding-ownership-assign.d.ts.map +1 -0
  15. package/dist/commands/finding-ownership-assign.js +102 -0
  16. package/dist/commands/finding-ownership-assign.js.map +1 -0
  17. package/dist/commands/finding-recurrence-detect.d.ts +5 -0
  18. package/dist/commands/finding-recurrence-detect.d.ts.map +1 -0
  19. package/dist/commands/finding-recurrence-detect.js +78 -0
  20. package/dist/commands/finding-recurrence-detect.js.map +1 -0
  21. package/dist/commands/finding-search-index.d.ts +5 -0
  22. package/dist/commands/finding-search-index.d.ts.map +1 -0
  23. package/dist/commands/finding-search-index.js +100 -0
  24. package/dist/commands/finding-search-index.js.map +1 -0
  25. package/dist/commands/finding-severity-drift.d.ts +5 -0
  26. package/dist/commands/finding-severity-drift.d.ts.map +1 -0
  27. package/dist/commands/finding-severity-drift.js +93 -0
  28. package/dist/commands/finding-severity-drift.js.map +1 -0
  29. package/dist/commands/review-access-log.d.ts +5 -0
  30. package/dist/commands/review-access-log.d.ts.map +1 -0
  31. package/dist/commands/review-access-log.js +66 -0
  32. package/dist/commands/review-access-log.js.map +1 -0
  33. package/dist/commands/review-archive-search.d.ts +5 -0
  34. package/dist/commands/review-archive-search.d.ts.map +1 -0
  35. package/dist/commands/review-archive-search.js +71 -0
  36. package/dist/commands/review-archive-search.js.map +1 -0
  37. package/dist/commands/review-branch-policy.d.ts +5 -0
  38. package/dist/commands/review-branch-policy.d.ts.map +1 -0
  39. package/dist/commands/review-branch-policy.js +103 -0
  40. package/dist/commands/review-branch-policy.js.map +1 -0
  41. package/dist/commands/review-custom-judge-config.d.ts +5 -0
  42. package/dist/commands/review-custom-judge-config.d.ts.map +1 -0
  43. package/dist/commands/review-custom-judge-config.js +104 -0
  44. package/dist/commands/review-custom-judge-config.js.map +1 -0
  45. package/dist/commands/review-incident-link.d.ts +5 -0
  46. package/dist/commands/review-incident-link.d.ts.map +1 -0
  47. package/dist/commands/review-incident-link.js +94 -0
  48. package/dist/commands/review-incident-link.js.map +1 -0
  49. package/dist/commands/review-integration-health.d.ts +5 -0
  50. package/dist/commands/review-integration-health.d.ts.map +1 -0
  51. package/dist/commands/review-integration-health.js +85 -0
  52. package/dist/commands/review-integration-health.js.map +1 -0
  53. package/dist/commands/review-metric-export.d.ts +5 -0
  54. package/dist/commands/review-metric-export.d.ts.map +1 -0
  55. package/dist/commands/review-metric-export.js +63 -0
  56. package/dist/commands/review-metric-export.js.map +1 -0
  57. package/dist/commands/review-notification-digest.d.ts +5 -0
  58. package/dist/commands/review-notification-digest.d.ts.map +1 -0
  59. package/dist/commands/review-notification-digest.js +65 -0
  60. package/dist/commands/review-notification-digest.js.map +1 -0
  61. package/dist/commands/review-pr-comment-gen.d.ts +5 -0
  62. package/dist/commands/review-pr-comment-gen.d.ts.map +1 -0
  63. package/dist/commands/review-pr-comment-gen.js +63 -0
  64. package/dist/commands/review-pr-comment-gen.js.map +1 -0
  65. package/dist/commands/review-quality-trend.d.ts +5 -0
  66. package/dist/commands/review-quality-trend.d.ts.map +1 -0
  67. package/dist/commands/review-quality-trend.js +58 -0
  68. package/dist/commands/review-quality-trend.js.map +1 -0
  69. package/dist/commands/review-role-assignment.d.ts +5 -0
  70. package/dist/commands/review-role-assignment.d.ts.map +1 -0
  71. package/dist/commands/review-role-assignment.js +99 -0
  72. package/dist/commands/review-role-assignment.js.map +1 -0
  73. package/dist/commands/review-tag-manager.d.ts +5 -0
  74. package/dist/commands/review-tag-manager.d.ts.map +1 -0
  75. package/dist/commands/review-tag-manager.js +129 -0
  76. package/dist/commands/review-tag-manager.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Finding-severity-drift — Detect severity changes across review runs.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Helpers ────────────────────────────────────────────────────────────────
6
+ const SEVERITY_ORDER = {
7
+ critical: 5,
8
+ high: 4,
9
+ medium: 3,
10
+ low: 2,
11
+ info: 1,
12
+ };
13
+ function detectDrift(previous, current) {
14
+ const prevMap = new Map();
15
+ for (const f of previous) {
16
+ prevMap.set(f.ruleId, f);
17
+ }
18
+ const results = [];
19
+ for (const f of current) {
20
+ const prev = prevMap.get(f.ruleId);
21
+ if (prev) {
22
+ const prevOrder = SEVERITY_ORDER[prev.severity] ?? 0;
23
+ const currOrder = SEVERITY_ORDER[f.severity] ?? 0;
24
+ const direction = currOrder > prevOrder ? "escalated" : currOrder < prevOrder ? "de-escalated" : "unchanged";
25
+ results.push({
26
+ ruleId: f.ruleId,
27
+ title: f.title,
28
+ previousSeverity: prev.severity,
29
+ currentSeverity: f.severity,
30
+ direction,
31
+ });
32
+ }
33
+ }
34
+ return results;
35
+ }
36
+ // ─── CLI ────────────────────────────────────────────────────────────────────
37
+ export function runFindingSeverityDrift(argv) {
38
+ const prevIdx = argv.indexOf("--previous");
39
+ const prevPath = prevIdx >= 0 ? argv[prevIdx + 1] : "";
40
+ const currIdx = argv.indexOf("--current");
41
+ const currPath = currIdx >= 0 ? argv[currIdx + 1] : "";
42
+ const formatIdx = argv.indexOf("--format");
43
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
44
+ const changedOnly = argv.includes("--changed-only");
45
+ if (argv.includes("--help") || argv.includes("-h")) {
46
+ console.log(`
47
+ judges finding-severity-drift — Detect severity changes
48
+
49
+ Usage:
50
+ judges finding-severity-drift --previous <path> --current <path> [--changed-only] [--format table|json]
51
+
52
+ Options:
53
+ --previous <path> Path to previous findings JSON
54
+ --current <path> Path to current findings JSON
55
+ --changed-only Only show findings with severity changes
56
+ --format <fmt> Output format: table (default), json
57
+ --help, -h Show this help
58
+ `);
59
+ return;
60
+ }
61
+ if (!prevPath || !existsSync(prevPath)) {
62
+ console.error("Provide --previous <path> to a valid findings JSON file.");
63
+ process.exitCode = 1;
64
+ return;
65
+ }
66
+ if (!currPath || !existsSync(currPath)) {
67
+ console.error("Provide --current <path> to a valid findings JSON file.");
68
+ process.exitCode = 1;
69
+ return;
70
+ }
71
+ const previous = JSON.parse(readFileSync(prevPath, "utf-8"));
72
+ const current = JSON.parse(readFileSync(currPath, "utf-8"));
73
+ let results = detectDrift(previous, current);
74
+ if (changedOnly) {
75
+ results = results.filter((r) => r.direction !== "unchanged");
76
+ }
77
+ if (format === "json") {
78
+ console.log(JSON.stringify(results, null, 2));
79
+ return;
80
+ }
81
+ console.log(`\nSeverity Drift Analysis (${results.length} findings)`);
82
+ console.log("═".repeat(80));
83
+ console.log(` ${"Rule ID".padEnd(25)} ${"Previous".padEnd(12)} ${"Current".padEnd(12)} Direction`);
84
+ console.log(" " + "─".repeat(60));
85
+ for (const r of results) {
86
+ console.log(` ${r.ruleId.padEnd(25)} ${r.previousSeverity.padEnd(12)} ${r.currentSeverity.padEnd(12)} ${r.direction}`);
87
+ }
88
+ const escalated = results.filter((r) => r.direction === "escalated").length;
89
+ const deEscalated = results.filter((r) => r.direction === "de-escalated").length;
90
+ console.log(`\n Escalated: ${escalated} | De-escalated: ${deEscalated} | Unchanged: ${results.length - escalated - deEscalated}`);
91
+ console.log("═".repeat(80));
92
+ }
93
+ //# sourceMappingURL=finding-severity-drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-severity-drift.js","sourceRoot":"","sources":["../../src/commands/finding-severity-drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-access-log — View and manage review access logs.
3
+ */
4
+ export declare function runReviewAccessLog(argv: string[]): void;
5
+ //# sourceMappingURL=review-access-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-access-log.d.ts","sourceRoot":"","sources":["../../src/commands/review-access-log.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsEvD"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Review-access-log — View and manage review access logs.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewAccessLog(argv) {
7
+ const storeIdx = argv.indexOf("--store");
8
+ const storePath = storeIdx >= 0 ? argv[storeIdx + 1] : ".judges-access-log.json";
9
+ const formatIdx = argv.indexOf("--format");
10
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
11
+ const userFilter = argv.indexOf("--user");
12
+ const filterUser = userFilter >= 0 ? argv[userFilter + 1] : "";
13
+ const lastN = argv.indexOf("--last");
14
+ const lastCount = lastN >= 0 ? parseInt(argv[lastN + 1], 10) : 0;
15
+ if (argv.includes("--help") || argv.includes("-h")) {
16
+ console.log(`
17
+ judges review-access-log — View review access logs
18
+
19
+ Usage:
20
+ judges review-access-log [--store <path>] [--user <name>] [--last <n>] [--format table|json]
21
+
22
+ Options:
23
+ --store <path> Access log file (default: .judges-access-log.json)
24
+ --user <name> Filter by user
25
+ --last <n> Show only the last N entries
26
+ --format <fmt> Output format: table (default), json
27
+ --help, -h Show this help
28
+ `);
29
+ return;
30
+ }
31
+ if (!existsSync(storePath)) {
32
+ console.log(`No access log found at: ${storePath}`);
33
+ console.log("Access logs are generated when permission features are enabled.");
34
+ return;
35
+ }
36
+ const store = JSON.parse(readFileSync(storePath, "utf-8"));
37
+ let entries = store.entries;
38
+ if (filterUser) {
39
+ entries = entries.filter((e) => e.user === filterUser);
40
+ }
41
+ if (lastCount > 0) {
42
+ entries = entries.slice(-lastCount);
43
+ }
44
+ if (format === "json") {
45
+ console.log(JSON.stringify(entries, null, 2));
46
+ return;
47
+ }
48
+ console.log(`\nAccess Log (${entries.length} entries)`);
49
+ console.log("═".repeat(80));
50
+ if (entries.length === 0) {
51
+ console.log(" No access log entries to display.");
52
+ }
53
+ else {
54
+ console.log(` ${"User".padEnd(18)} ${"Action".padEnd(15)} ${"Resource".padEnd(20)} ${"Result".padEnd(10)} Date`);
55
+ console.log(" " + "─".repeat(75));
56
+ for (const e of entries) {
57
+ const res = e.resource.length > 18 ? e.resource.slice(0, 15) + "..." : e.resource;
58
+ console.log(` ${e.user.padEnd(18)} ${e.action.padEnd(15)} ${res.padEnd(20)} ${e.result.padEnd(10)} ${e.timestamp.slice(0, 10)}`);
59
+ }
60
+ }
61
+ const allowed = entries.filter((e) => e.result === "allowed").length;
62
+ const denied = entries.filter((e) => e.result === "denied").length;
63
+ console.log(`\n Allowed: ${allowed} | Denied: ${denied}`);
64
+ console.log("═".repeat(80));
65
+ }
66
+ //# sourceMappingURL=review-access-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-access-log.js","sourceRoot":"","sources":["../../src/commands/review-access-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-archive-search — Search through archived review reports.
3
+ */
4
+ export declare function runReviewArchiveSearch(argv: string[]): void;
5
+ //# sourceMappingURL=review-archive-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-archive-search.d.ts","sourceRoot":"","sources":["../../src/commands/review-archive-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8E3D"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Review-archive-search — Search through archived review reports.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewArchiveSearch(argv) {
7
+ const storeIdx = argv.indexOf("--store");
8
+ const storePath = storeIdx >= 0 ? argv[storeIdx + 1] : ".judges-archive.json";
9
+ const queryIdx = argv.indexOf("--query");
10
+ const query = queryIdx >= 0 ? argv[queryIdx + 1] : "";
11
+ const verdictIdx = argv.indexOf("--verdict");
12
+ const verdictFilter = verdictIdx >= 0 ? argv[verdictIdx + 1] : "";
13
+ const tagIdx = argv.indexOf("--tag");
14
+ const tagFilter = tagIdx >= 0 ? argv[tagIdx + 1] : "";
15
+ const formatIdx = argv.indexOf("--format");
16
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
17
+ if (argv.includes("--help") || argv.includes("-h")) {
18
+ console.log(`
19
+ judges review-archive-search — Search archived reviews
20
+
21
+ Usage:
22
+ judges review-archive-search [--query <text>] [--verdict <v>] [--tag <t>] [--store <path>] [--format table|json]
23
+
24
+ Options:
25
+ --store <path> Archive store (default: .judges-archive.json)
26
+ --query <text> Search in file names
27
+ --verdict <v> Filter by verdict (pass, fail, warning)
28
+ --tag <t> Filter by tag
29
+ --format <fmt> Output format: table (default), json
30
+ --help, -h Show this help
31
+ `);
32
+ return;
33
+ }
34
+ if (!existsSync(storePath)) {
35
+ console.log(`No archive store found at: ${storePath}`);
36
+ console.log("Archives are created by review-report-archive.");
37
+ return;
38
+ }
39
+ const store = JSON.parse(readFileSync(storePath, "utf-8"));
40
+ let entries = store.entries;
41
+ if (query) {
42
+ const q = query.toLowerCase();
43
+ entries = entries.filter((e) => e.file.toLowerCase().includes(q) || e.id.toLowerCase().includes(q));
44
+ }
45
+ if (verdictFilter) {
46
+ entries = entries.filter((e) => e.verdict === verdictFilter);
47
+ }
48
+ if (tagFilter) {
49
+ entries = entries.filter((e) => e.tags.includes(tagFilter));
50
+ }
51
+ if (format === "json") {
52
+ console.log(JSON.stringify(entries, null, 2));
53
+ return;
54
+ }
55
+ console.log(`\nArchive Search Results (${entries.length})`);
56
+ console.log("═".repeat(80));
57
+ if (entries.length === 0) {
58
+ console.log(" No matching archives found.");
59
+ }
60
+ else {
61
+ console.log(` ${"ID".padEnd(12)} ${"File".padEnd(25)} ${"Verdict".padEnd(10)} ${"Score".padEnd(8)} ${"Findings".padEnd(10)} Date`);
62
+ console.log(" " + "─".repeat(75));
63
+ for (const e of entries) {
64
+ const fileName = e.file.length > 23 ? "..." + e.file.slice(-20) : e.file;
65
+ console.log(` ${e.id.padEnd(12)} ${fileName.padEnd(25)} ${e.verdict.padEnd(10)} ${String(e.score).padEnd(8)} ${String(e.findingCount).padEnd(10)} ${e.timestamp.slice(0, 10)}`);
66
+ }
67
+ }
68
+ console.log(`\n Total archives: ${store.entries.length} | Matched: ${entries.length}`);
69
+ console.log("═".repeat(80));
70
+ }
71
+ //# sourceMappingURL=review-archive-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-archive-search.js","sourceRoot":"","sources":["../../src/commands/review-archive-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-branch-policy — Manage branch-level review policies.
3
+ */
4
+ export declare function runReviewBranchPolicy(argv: string[]): void;
5
+ //# sourceMappingURL=review-branch-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-branch-policy.d.ts","sourceRoot":"","sources":["../../src/commands/review-branch-policy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8G1D"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Review-branch-policy — Manage branch-level review policies.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewBranchPolicy(argv) {
7
+ const storeIdx = argv.indexOf("--store");
8
+ const storePath = storeIdx >= 0 ? argv[storeIdx + 1] : ".judges-branch-policy.json";
9
+ const formatIdx = argv.indexOf("--format");
10
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
11
+ const initMode = argv.includes("--init");
12
+ const addIdx = argv.indexOf("--add");
13
+ const addPattern = addIdx >= 0 ? argv[addIdx + 1] : "";
14
+ const removeIdx = argv.indexOf("--remove");
15
+ const removePattern = removeIdx >= 0 ? argv[removeIdx + 1] : "";
16
+ if (argv.includes("--help") || argv.includes("-h")) {
17
+ console.log(`
18
+ judges review-branch-policy — Manage branch-level review policies
19
+
20
+ Usage:
21
+ judges review-branch-policy [--store <path>] [--format table|json]
22
+ judges review-branch-policy --init [--store <path>]
23
+ judges review-branch-policy --add <pattern> [--store <path>]
24
+ judges review-branch-policy --remove <pattern> [--store <path>]
25
+
26
+ Options:
27
+ --store <path> Policy store (default: .judges-branch-policy.json)
28
+ --init Create default policies (main, develop, feature/*)
29
+ --add <pattern> Add a branch pattern policy
30
+ --remove <pattern> Remove a branch pattern policy
31
+ --format <fmt> Output format: table (default), json
32
+ --help, -h Show this help
33
+ `);
34
+ return;
35
+ }
36
+ if (initMode) {
37
+ const defaultStore = {
38
+ policies: [
39
+ { pattern: "main", preset: "strict", minScore: 80, blockOnCritical: true, requiredJudges: [] },
40
+ { pattern: "develop", preset: "default", minScore: 60, blockOnCritical: true, requiredJudges: [] },
41
+ { pattern: "feature/*", preset: "default", minScore: 50, blockOnCritical: false, requiredJudges: [] },
42
+ ],
43
+ lastUpdated: new Date().toISOString(),
44
+ };
45
+ writeFileSync(storePath, JSON.stringify(defaultStore, null, 2));
46
+ console.log(`Created default branch policies: ${storePath}`);
47
+ return;
48
+ }
49
+ if (!existsSync(storePath)) {
50
+ console.log(`No branch policy store found at: ${storePath}`);
51
+ console.log("Run with --init to create one.");
52
+ return;
53
+ }
54
+ const store = JSON.parse(readFileSync(storePath, "utf-8"));
55
+ if (addPattern) {
56
+ const exists = store.policies.some((p) => p.pattern === addPattern);
57
+ if (exists) {
58
+ console.error(`Policy already exists for pattern: ${addPattern}`);
59
+ process.exitCode = 1;
60
+ return;
61
+ }
62
+ store.policies.push({
63
+ pattern: addPattern,
64
+ preset: "default",
65
+ minScore: 60,
66
+ blockOnCritical: false,
67
+ requiredJudges: [],
68
+ });
69
+ store.lastUpdated = new Date().toISOString();
70
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
71
+ console.log(`Added branch policy: ${addPattern}`);
72
+ return;
73
+ }
74
+ if (removePattern) {
75
+ const idx = store.policies.findIndex((p) => p.pattern === removePattern);
76
+ if (idx < 0) {
77
+ console.error(`Policy not found for pattern: ${removePattern}`);
78
+ process.exitCode = 1;
79
+ return;
80
+ }
81
+ store.policies.splice(idx, 1);
82
+ store.lastUpdated = new Date().toISOString();
83
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
84
+ console.log(`Removed branch policy: ${removePattern}`);
85
+ return;
86
+ }
87
+ if (format === "json") {
88
+ console.log(JSON.stringify(store, null, 2));
89
+ return;
90
+ }
91
+ console.log("\nBranch Review Policies");
92
+ console.log("═".repeat(70));
93
+ console.log(` ${"Pattern".padEnd(20)} ${"Preset".padEnd(12)} ${"Min Score".padEnd(12)} ${"Block Crit".padEnd(12)} Required`);
94
+ console.log(" " + "─".repeat(65));
95
+ for (const p of store.policies) {
96
+ const block = p.blockOnCritical ? "Yes" : "No";
97
+ const req = p.requiredJudges.length > 0 ? p.requiredJudges.join(", ") : "—";
98
+ console.log(` ${p.pattern.padEnd(20)} ${p.preset.padEnd(12)} ${String(p.minScore).padEnd(12)} ${block.padEnd(12)} ${req}`);
99
+ }
100
+ console.log(`\n Total policies: ${store.policies.length}`);
101
+ console.log("═".repeat(70));
102
+ }
103
+ //# sourceMappingURL=review-branch-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-branch-policy.js","sourceRoot":"","sources":["../../src/commands/review-branch-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-custom-judge-config — Configure custom judge settings per project.
3
+ */
4
+ export declare function runReviewCustomJudgeConfig(argv: string[]): void;
5
+ //# sourceMappingURL=review-custom-judge-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-custom-judge-config.d.ts","sourceRoot":"","sources":["../../src/commands/review-custom-judge-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyG/D"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Review-custom-judge-config — Configure custom judge settings per project.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ import { defaultRegistry } from "../judge-registry.js";
6
+ // ─── CLI ────────────────────────────────────────────────────────────────────
7
+ export function runReviewCustomJudgeConfig(argv) {
8
+ const storeIdx = argv.indexOf("--store");
9
+ const storePath = storeIdx >= 0 ? argv[storeIdx + 1] : ".judges-custom-config.json";
10
+ const formatIdx = argv.indexOf("--format");
11
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
12
+ const initMode = argv.includes("--init");
13
+ const enableIdx = argv.indexOf("--enable");
14
+ const enableId = enableIdx >= 0 ? argv[enableIdx + 1] : "";
15
+ const disableIdx = argv.indexOf("--disable");
16
+ const disableId = disableIdx >= 0 ? argv[disableIdx + 1] : "";
17
+ const weightIdx = argv.indexOf("--weight");
18
+ const weightVal = weightIdx >= 0 ? parseFloat(argv[weightIdx + 1]) : NaN;
19
+ if (argv.includes("--help") || argv.includes("-h")) {
20
+ console.log(`
21
+ judges review-custom-judge-config — Configure custom judge settings
22
+
23
+ Usage:
24
+ judges review-custom-judge-config [--store <path>] [--format table|json]
25
+ judges review-custom-judge-config --init [--store <path>]
26
+ judges review-custom-judge-config --enable <judgeId> [--weight <n>] [--store <path>]
27
+ judges review-custom-judge-config --disable <judgeId> [--store <path>]
28
+
29
+ Options:
30
+ --store <path> Config store (default: .judges-custom-config.json)
31
+ --init Create default config from registered judges
32
+ --enable <id> Enable a judge
33
+ --disable <id> Disable a judge
34
+ --weight <n> Set judge weight (0.0-2.0)
35
+ --format <fmt> Output format: table (default), json
36
+ --help, -h Show this help
37
+ `);
38
+ return;
39
+ }
40
+ if (initMode) {
41
+ const judges = defaultRegistry.getJudges();
42
+ const entries = judges.map((j) => ({
43
+ judgeId: j.id,
44
+ enabled: true,
45
+ weight: 1.0,
46
+ customRules: {},
47
+ }));
48
+ const store = { judges: entries, lastUpdated: new Date().toISOString() };
49
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
50
+ console.log(`Created custom judge config with ${entries.length} judges: ${storePath}`);
51
+ return;
52
+ }
53
+ if (!existsSync(storePath)) {
54
+ console.log(`No custom judge config found at: ${storePath}`);
55
+ console.log("Run with --init to create one.");
56
+ return;
57
+ }
58
+ const store = JSON.parse(readFileSync(storePath, "utf-8"));
59
+ if (enableId) {
60
+ const entry = store.judges.find((j) => j.judgeId === enableId);
61
+ if (!entry) {
62
+ console.error(`Judge not found in config: ${enableId}`);
63
+ process.exitCode = 1;
64
+ return;
65
+ }
66
+ entry.enabled = true;
67
+ if (!isNaN(weightVal))
68
+ entry.weight = weightVal;
69
+ store.lastUpdated = new Date().toISOString();
70
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
71
+ console.log(`Enabled judge: ${enableId}`);
72
+ return;
73
+ }
74
+ if (disableId) {
75
+ const entry = store.judges.find((j) => j.judgeId === disableId);
76
+ if (!entry) {
77
+ console.error(`Judge not found in config: ${disableId}`);
78
+ process.exitCode = 1;
79
+ return;
80
+ }
81
+ entry.enabled = false;
82
+ store.lastUpdated = new Date().toISOString();
83
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
84
+ console.log(`Disabled judge: ${disableId}`);
85
+ return;
86
+ }
87
+ if (format === "json") {
88
+ console.log(JSON.stringify(store, null, 2));
89
+ return;
90
+ }
91
+ console.log("\nCustom Judge Configuration");
92
+ console.log("═".repeat(60));
93
+ console.log(` ${"Judge ID".padEnd(25)} ${"Enabled".padEnd(10)} ${"Weight".padEnd(10)} Custom Rules`);
94
+ console.log(" " + "─".repeat(55));
95
+ for (const j of store.judges) {
96
+ const enabled = j.enabled ? "Yes" : "No";
97
+ const rules = Object.keys(j.customRules).length;
98
+ console.log(` ${j.judgeId.padEnd(25)} ${enabled.padEnd(10)} ${j.weight.toFixed(1).padEnd(10)} ${rules}`);
99
+ }
100
+ const enabledCount = store.judges.filter((j) => j.enabled).length;
101
+ console.log(`\n Enabled: ${enabledCount}/${store.judges.length}`);
102
+ console.log("═".repeat(60));
103
+ }
104
+ //# sourceMappingURL=review-custom-judge-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-custom-judge-config.js","sourceRoot":"","sources":["../../src/commands/review-custom-judge-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-incident-link — Link review findings to incident tracking systems.
3
+ */
4
+ export declare function runReviewIncidentLink(argv: string[]): void;
5
+ //# sourceMappingURL=review-incident-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-incident-link.d.ts","sourceRoot":"","sources":["../../src/commands/review-incident-link.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmG1D"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Review-incident-link — Link review findings to incident tracking systems.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewIncidentLink(argv) {
7
+ const storeIdx = argv.indexOf("--store");
8
+ const storePath = storeIdx >= 0 ? argv[storeIdx + 1] : ".judges-incidents.json";
9
+ const formatIdx = argv.indexOf("--format");
10
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
11
+ const linkIdx = argv.indexOf("--link");
12
+ const linkRule = linkIdx >= 0 ? argv[linkIdx + 1] : "";
13
+ const incidentIdx = argv.indexOf("--incident");
14
+ const incidentId = incidentIdx >= 0 ? argv[incidentIdx + 1] : "";
15
+ const systemIdx = argv.indexOf("--system");
16
+ const system = systemIdx >= 0 ? argv[systemIdx + 1] : "generic";
17
+ const findingsIdx = argv.indexOf("--findings");
18
+ const findingsPath = findingsIdx >= 0 ? argv[findingsIdx + 1] : "";
19
+ if (argv.includes("--help") || argv.includes("-h")) {
20
+ console.log(`
21
+ judges review-incident-link — Link findings to incidents
22
+
23
+ Usage:
24
+ judges review-incident-link [--store <path>] [--format table|json]
25
+ judges review-incident-link --link <ruleId> --incident <id> [--system <name>]
26
+ judges review-incident-link --findings <path> --incident <id> [--system <name>]
27
+
28
+ Options:
29
+ --store <path> Incident store (default: .judges-incidents.json)
30
+ --link <ruleId> Link a specific rule to an incident
31
+ --incident <id> Incident/ticket ID
32
+ --system <name> Tracking system name (default: generic)
33
+ --findings <path> Bulk link from findings JSON
34
+ --format <fmt> Output format: table (default), json
35
+ --help, -h Show this help
36
+ `);
37
+ return;
38
+ }
39
+ const store = existsSync(storePath)
40
+ ? JSON.parse(readFileSync(storePath, "utf-8"))
41
+ : { links: [], lastUpdated: new Date().toISOString() };
42
+ if (linkRule && incidentId) {
43
+ store.links.push({
44
+ ruleId: linkRule,
45
+ severity: "medium",
46
+ incidentId,
47
+ system,
48
+ linkedAt: new Date().toISOString(),
49
+ status: "open",
50
+ });
51
+ store.lastUpdated = new Date().toISOString();
52
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
53
+ console.log(`Linked ${linkRule} to incident ${incidentId} (${system}).`);
54
+ return;
55
+ }
56
+ if (findingsPath && incidentId && existsSync(findingsPath)) {
57
+ const findings = JSON.parse(readFileSync(findingsPath, "utf-8"));
58
+ let count = 0;
59
+ for (const f of findings) {
60
+ store.links.push({
61
+ ruleId: f.ruleId,
62
+ severity: f.severity,
63
+ incidentId,
64
+ system,
65
+ linkedAt: new Date().toISOString(),
66
+ status: "open",
67
+ });
68
+ count++;
69
+ }
70
+ store.lastUpdated = new Date().toISOString();
71
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
72
+ console.log(`Linked ${count} findings to incident ${incidentId}.`);
73
+ return;
74
+ }
75
+ if (format === "json") {
76
+ console.log(JSON.stringify(store, null, 2));
77
+ return;
78
+ }
79
+ console.log("\nIncident Links");
80
+ console.log("═".repeat(80));
81
+ if (store.links.length === 0) {
82
+ console.log(" No incident links.");
83
+ }
84
+ else {
85
+ console.log(` ${"Rule ID".padEnd(25)} ${"Severity".padEnd(10)} ${"Incident".padEnd(15)} ${"System".padEnd(12)} Status`);
86
+ console.log(" " + "─".repeat(70));
87
+ for (const l of store.links) {
88
+ console.log(` ${l.ruleId.padEnd(25)} ${l.severity.padEnd(10)} ${l.incidentId.padEnd(15)} ${l.system.padEnd(12)} ${l.status}`);
89
+ }
90
+ }
91
+ console.log(`\n Total links: ${store.links.length}`);
92
+ console.log("═".repeat(80));
93
+ }
94
+ //# sourceMappingURL=review-incident-link.js.map