@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,113 @@
1
+ /**
2
+ * Review-config-template — Generate config templates for common scenarios.
3
+ */
4
+ import { writeFileSync } from "fs";
5
+ import { defaultRegistry } from "../judge-registry.js";
6
+ // ─── Templates ──────────────────────────────────────────────────────────────
7
+ function getTemplates() {
8
+ const judges = defaultRegistry.getJudges();
9
+ return [
10
+ {
11
+ name: "security-focused",
12
+ description: "Focus on security vulnerabilities and best practices",
13
+ config: {
14
+ preset: "security-focused",
15
+ minSeverity: "medium",
16
+ disabledJudges: judges
17
+ .filter((j) => !j.domain.toLowerCase().includes("security"))
18
+ .map((j) => j.id)
19
+ .slice(0, 5),
20
+ },
21
+ },
22
+ {
23
+ name: "strict",
24
+ description: "Strict mode with all judges enabled and low severity threshold",
25
+ config: {
26
+ preset: "strict",
27
+ minSeverity: "low",
28
+ },
29
+ },
30
+ {
31
+ name: "ci-friendly",
32
+ description: "Optimized for CI pipelines with critical-only findings",
33
+ config: {
34
+ preset: "default",
35
+ minSeverity: "high",
36
+ },
37
+ },
38
+ {
39
+ name: "performance",
40
+ description: "Focus on performance issues",
41
+ config: {
42
+ preset: "performance",
43
+ minSeverity: "medium",
44
+ disabledJudges: judges
45
+ .filter((j) => !j.domain.toLowerCase().includes("perf"))
46
+ .map((j) => j.id)
47
+ .slice(0, 5),
48
+ },
49
+ },
50
+ {
51
+ name: "minimal",
52
+ description: "Minimal configuration with only critical findings",
53
+ config: {
54
+ preset: "default",
55
+ minSeverity: "critical",
56
+ },
57
+ },
58
+ ];
59
+ }
60
+ // ─── CLI ────────────────────────────────────────────────────────────────────
61
+ export function runReviewConfigTemplate(argv) {
62
+ const templateIdx = argv.indexOf("--template");
63
+ const outputIdx = argv.indexOf("--output");
64
+ const formatIdx = argv.indexOf("--format");
65
+ const templateName = templateIdx >= 0 ? argv[templateIdx + 1] : undefined;
66
+ const outputPath = outputIdx >= 0 ? argv[outputIdx + 1] : undefined;
67
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
68
+ if (argv.includes("--help") || argv.includes("-h")) {
69
+ console.log(`
70
+ judges review-config-template — Generate config templates
71
+
72
+ Usage:
73
+ judges review-config-template [--template <name>] [--output <file>]
74
+ [--format table|json]
75
+
76
+ Options:
77
+ --template <name> Template: security-focused, strict, ci-friendly, performance, minimal
78
+ --output <path> Write config to file
79
+ --format <fmt> Output format: table (default), json
80
+ --help, -h Show this help
81
+ `);
82
+ return;
83
+ }
84
+ const templates = getTemplates();
85
+ // List mode
86
+ if (!templateName) {
87
+ if (format === "json") {
88
+ console.log(JSON.stringify(templates, null, 2));
89
+ return;
90
+ }
91
+ console.log(`\nAvailable Config Templates`);
92
+ console.log("═".repeat(55));
93
+ for (const t of templates) {
94
+ console.log(` ${t.name.padEnd(20)} ${t.description}`);
95
+ }
96
+ console.log("═".repeat(55));
97
+ return;
98
+ }
99
+ const template = templates.find((t) => t.name === templateName);
100
+ if (!template) {
101
+ console.error(`Error: unknown template: ${templateName}`);
102
+ console.error(`Available: ${templates.map((t) => t.name).join(", ")}`);
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ if (outputPath) {
107
+ writeFileSync(outputPath, JSON.stringify(template.config, null, 2));
108
+ console.log(`Template "${template.name}" written to ${outputPath}`);
109
+ return;
110
+ }
111
+ console.log(JSON.stringify(template.config, null, 2));
112
+ }
113
+ //# sourceMappingURL=review-config-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-config-template.js","sourceRoot":"","sources":["../../src/commands/review-config-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-ide-sync — Sync review results to IDE-compatible formats.
3
+ */
4
+ export declare function runReviewIdeSync(argv: string[]): void;
5
+ //# sourceMappingURL=review-ide-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-ide-sync.d.ts","sourceRoot":"","sources":["../../src/commands/review-ide-sync.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+CH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkErD"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Review-ide-sync — Sync review results to IDE-compatible formats.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ function toVscodeDiagnostics(findings, sourceFile) {
6
+ return findings.map((f) => ({
7
+ file: sourceFile,
8
+ line: f.lineNumbers !== undefined && f.lineNumbers.length > 0 ? f.lineNumbers[0] : 1,
9
+ severity: f.severity === "critical" || f.severity === "high"
10
+ ? "error"
11
+ : f.severity === "medium"
12
+ ? "warning"
13
+ : "information",
14
+ message: `${f.title}: ${f.recommendation}`,
15
+ source: "judges",
16
+ code: f.ruleId,
17
+ }));
18
+ }
19
+ function toJetbrainsDiagnostics(findings, sourceFile) {
20
+ return {
21
+ format: "jetbrains-inspections",
22
+ inspections: findings.map((f) => ({
23
+ file: sourceFile,
24
+ line: f.lineNumbers !== undefined && f.lineNumbers.length > 0 ? f.lineNumbers[0] : 1,
25
+ severity: f.severity === "critical" ? "ERROR" : f.severity === "high" ? "WARNING" : "WEAK WARNING",
26
+ description: `[${f.ruleId}] ${f.title} — ${f.recommendation}`,
27
+ category: "Judges Review",
28
+ })),
29
+ };
30
+ }
31
+ // ─── CLI ────────────────────────────────────────────────────────────────────
32
+ export function runReviewIdeSync(argv) {
33
+ const fileIdx = argv.indexOf("--file");
34
+ const targetIdx = argv.indexOf("--target");
35
+ const outputIdx = argv.indexOf("--output");
36
+ const sourceIdx = argv.indexOf("--source");
37
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
38
+ const target = targetIdx >= 0 ? argv[targetIdx + 1] : "vscode";
39
+ const outputPath = outputIdx >= 0 ? argv[outputIdx + 1] : undefined;
40
+ const sourceFile = sourceIdx >= 0 ? argv[sourceIdx + 1] : "unknown";
41
+ if (argv.includes("--help") || argv.includes("-h")) {
42
+ console.log(`
43
+ judges review-ide-sync — Sync review results to IDE format
44
+
45
+ Usage:
46
+ judges review-ide-sync --file <review.json> [--target vscode|jetbrains]
47
+ [--source <file>] [--output <path>]
48
+
49
+ Options:
50
+ --file <path> Review result JSON file
51
+ --target <ide> IDE format: vscode (default), jetbrains
52
+ --source <file> Original source file path for diagnostics
53
+ --output <path> Write output to file
54
+ --help, -h Show this help
55
+ `);
56
+ return;
57
+ }
58
+ if (!filePath) {
59
+ console.error("Error: --file is required");
60
+ process.exitCode = 1;
61
+ return;
62
+ }
63
+ if (!existsSync(filePath)) {
64
+ console.error(`Error: file not found: ${filePath}`);
65
+ process.exitCode = 1;
66
+ return;
67
+ }
68
+ let verdict;
69
+ try {
70
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
71
+ }
72
+ catch {
73
+ console.error(`Error: failed to parse review file: ${filePath}`);
74
+ process.exitCode = 1;
75
+ return;
76
+ }
77
+ let result;
78
+ if (target === "jetbrains") {
79
+ result = toJetbrainsDiagnostics(verdict.findings, sourceFile);
80
+ }
81
+ else {
82
+ result = toVscodeDiagnostics(verdict.findings, sourceFile);
83
+ }
84
+ const output = JSON.stringify(result, null, 2);
85
+ if (outputPath) {
86
+ writeFileSync(outputPath, output);
87
+ console.log(`IDE diagnostics written to ${outputPath} (${target} format)`);
88
+ return;
89
+ }
90
+ console.log(output);
91
+ }
92
+ //# sourceMappingURL=review-ide-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-ide-sync.js","sourceRoot":"","sources":["../../src/commands/review-ide-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-interactive — Interactive review session with step-by-step finding walkthrough.
3
+ */
4
+ export declare function runReviewInteractive(argv: string[]): void;
5
+ //# sourceMappingURL=review-interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-interactive.d.ts","sourceRoot":"","sources":["../../src/commands/review-interactive.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuEzD"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Review-interactive — Interactive review session with step-by-step finding walkthrough.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Helpers ────────────────────────────────────────────────────────────────
6
+ function formatFinding(f, index) {
7
+ const lines = [];
8
+ lines.push(`\n── Finding ${index + 1} ──────────────────────────────────────`);
9
+ lines.push(` Rule: ${f.ruleId}`);
10
+ lines.push(` Severity: ${f.severity}`);
11
+ lines.push(` Title: ${f.title}`);
12
+ lines.push(` Details: ${f.description}`);
13
+ if (f.lineNumbers !== undefined && f.lineNumbers.length > 0) {
14
+ lines.push(` Lines: ${f.lineNumbers.join(", ")}`);
15
+ }
16
+ lines.push(` Fix: ${f.recommendation}`);
17
+ if (f.confidence !== undefined) {
18
+ lines.push(` Confidence: ${(f.confidence * 100).toFixed(0)}%`);
19
+ }
20
+ return lines.join("\n");
21
+ }
22
+ // ─── CLI ────────────────────────────────────────────────────────────────────
23
+ export function runReviewInteractive(argv) {
24
+ const fileIdx = argv.indexOf("--file");
25
+ const severityIdx = argv.indexOf("--severity");
26
+ const formatIdx = argv.indexOf("--format");
27
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
28
+ const severityFilter = severityIdx >= 0 ? argv[severityIdx + 1] : undefined;
29
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
30
+ if (argv.includes("--help") || argv.includes("-h")) {
31
+ console.log(`
32
+ judges review-interactive — Interactive finding walkthrough
33
+
34
+ Usage:
35
+ judges review-interactive --file <review.json> [--severity <level>]
36
+ [--format table|json]
37
+
38
+ Options:
39
+ --file <path> Review result JSON file
40
+ --severity <level> Filter: critical, high, medium, low, info
41
+ --format <fmt> Output format: table (default), json
42
+ --help, -h Show this help
43
+ `);
44
+ return;
45
+ }
46
+ if (!filePath) {
47
+ console.error("Error: --file is required");
48
+ process.exitCode = 1;
49
+ return;
50
+ }
51
+ if (!existsSync(filePath)) {
52
+ console.error(`Error: file not found: ${filePath}`);
53
+ process.exitCode = 1;
54
+ return;
55
+ }
56
+ let verdict;
57
+ try {
58
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
59
+ }
60
+ catch {
61
+ console.error(`Error: failed to parse review file: ${filePath}`);
62
+ process.exitCode = 1;
63
+ return;
64
+ }
65
+ let findings = verdict.findings;
66
+ if (severityFilter) {
67
+ findings = findings.filter((f) => f.severity === severityFilter);
68
+ }
69
+ if (format === "json") {
70
+ console.log(JSON.stringify({ total: findings.length, findings }, null, 2));
71
+ return;
72
+ }
73
+ console.log(`\nInteractive Review: ${findings.length} findings`);
74
+ console.log(`Overall: ${verdict.overallVerdict} (score: ${verdict.overallScore})`);
75
+ console.log("═".repeat(55));
76
+ if (findings.length === 0) {
77
+ console.log(" No findings match the current filter.");
78
+ return;
79
+ }
80
+ for (let i = 0; i < findings.length; i++) {
81
+ console.log(formatFinding(findings[i], i));
82
+ }
83
+ console.log("\n" + "═".repeat(55));
84
+ console.log(`Reviewed ${findings.length} finding(s). Use --severity to filter.`);
85
+ }
86
+ //# sourceMappingURL=review-interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-interactive.js","sourceRoot":"","sources":["../../src/commands/review-interactive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-onboard-checklist — Generate team onboarding checklists for Judges adoption.
3
+ */
4
+ export declare function runReviewOnboardChecklist(argv: string[]): void;
5
+ //# sourceMappingURL=review-onboard-checklist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-onboard-checklist.d.ts","sourceRoot":"","sources":["../../src/commands/review-onboard-checklist.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkDH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqF9D"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Review-onboard-checklist — Generate team onboarding checklists for Judges adoption.
3
+ */
4
+ import { writeFileSync } from "fs";
5
+ import { defaultRegistry } from "../judge-registry.js";
6
+ function getChecklist() {
7
+ const judges = defaultRegistry.getJudges();
8
+ const domains = [...new Set(judges.map((j) => j.domain))];
9
+ return [
10
+ {
11
+ category: "Installation",
12
+ item: "Install @kevinrabun/judges globally or as dev dependency",
13
+ priority: "required",
14
+ },
15
+ { category: "Installation", item: "Install VS Code extension (Judges Panel)", priority: "recommended" },
16
+ { category: "Configuration", item: "Create .judgesrc in project root", priority: "required" },
17
+ { category: "Configuration", item: "Choose preset (default, strict, security-focused)", priority: "required" },
18
+ { category: "Configuration", item: "Set minSeverity threshold for team", priority: "recommended" },
19
+ {
20
+ category: "Configuration",
21
+ item: `Review available domains: ${domains.slice(0, 5).join(", ")}...`,
22
+ priority: "recommended",
23
+ },
24
+ { category: "CI/CD", item: "Add judges review to CI pipeline", priority: "recommended" },
25
+ { category: "CI/CD", item: "Configure review-ci-gate with pass/fail thresholds", priority: "recommended" },
26
+ { category: "CI/CD", item: "Set up SARIF output for GitHub Security tab", priority: "optional" },
27
+ { category: "Team", item: "Share .judgesrc in version control", priority: "required" },
28
+ { category: "Team", item: "Document suppression workflow for false positives", priority: "recommended" },
29
+ { category: "Team", item: "Set up team-specific tenant config profiles", priority: "optional" },
30
+ { category: "Review", item: "Run first review on sample file", priority: "required" },
31
+ { category: "Review", item: "Review output formats (table, json, markdown, sarif)", priority: "recommended" },
32
+ {
33
+ category: "Review",
34
+ item: `Explore ${judges.length} available judges across ${domains.length} domains`,
35
+ priority: "optional",
36
+ },
37
+ ];
38
+ }
39
+ // ─── CLI ────────────────────────────────────────────────────────────────────
40
+ export function runReviewOnboardChecklist(argv) {
41
+ const formatIdx = argv.indexOf("--format");
42
+ const outputIdx = argv.indexOf("--output");
43
+ const priorityIdx = argv.indexOf("--priority");
44
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
45
+ const outputPath = outputIdx >= 0 ? argv[outputIdx + 1] : undefined;
46
+ const priorityFilter = priorityIdx >= 0 ? argv[priorityIdx + 1] : undefined;
47
+ if (argv.includes("--help") || argv.includes("-h")) {
48
+ console.log(`
49
+ judges review-onboard-checklist — Team onboarding checklist
50
+
51
+ Usage:
52
+ judges review-onboard-checklist [--priority required|recommended|optional]
53
+ [--output <file>] [--format table|json|markdown]
54
+
55
+ Options:
56
+ --priority <level> Filter by priority level
57
+ --output <path> Write checklist to file
58
+ --format <fmt> Output format: table (default), json, markdown
59
+ --help, -h Show this help
60
+ `);
61
+ return;
62
+ }
63
+ let items = getChecklist();
64
+ if (priorityFilter) {
65
+ items = items.filter((i) => i.priority === priorityFilter);
66
+ }
67
+ if (format === "json") {
68
+ const output = JSON.stringify(items, null, 2);
69
+ if (outputPath) {
70
+ writeFileSync(outputPath, output);
71
+ console.log(`Checklist written to ${outputPath}`);
72
+ }
73
+ else {
74
+ console.log(output);
75
+ }
76
+ return;
77
+ }
78
+ if (format === "markdown") {
79
+ const lines = ["# Judges Onboarding Checklist\n"];
80
+ let currentCategory = "";
81
+ for (const item of items) {
82
+ if (item.category !== currentCategory) {
83
+ currentCategory = item.category;
84
+ lines.push(`\n## ${currentCategory}\n`);
85
+ }
86
+ const badge = item.priority === "required"
87
+ ? "**[REQUIRED]**"
88
+ : item.priority === "recommended"
89
+ ? "[recommended]"
90
+ : "[optional]";
91
+ lines.push(`- [ ] ${badge} ${item.item}`);
92
+ }
93
+ const output = lines.join("\n");
94
+ if (outputPath) {
95
+ writeFileSync(outputPath, output);
96
+ console.log(`Checklist written to ${outputPath}`);
97
+ }
98
+ else {
99
+ console.log(output);
100
+ }
101
+ return;
102
+ }
103
+ // Table format
104
+ console.log(`\nOnboarding Checklist: ${items.length} items`);
105
+ console.log("═".repeat(70));
106
+ let currentCategory = "";
107
+ for (const item of items) {
108
+ if (item.category !== currentCategory) {
109
+ currentCategory = item.category;
110
+ console.log(`\n ${currentCategory}`);
111
+ console.log(" " + "─".repeat(60));
112
+ }
113
+ const badge = item.priority === "required" ? "[REQ]" : item.priority === "recommended" ? "[REC]" : "[OPT]";
114
+ console.log(` ${badge} ${item.item}`);
115
+ }
116
+ console.log("\n" + "═".repeat(70));
117
+ const required = items.filter((i) => i.priority === "required").length;
118
+ console.log(`${required} required, ${items.length - required} optional/recommended`);
119
+ }
120
+ //# sourceMappingURL=review-onboard-checklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-onboard-checklist.js","sourceRoot":"","sources":["../../src/commands/review-onboard-checklist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-progress-track — Track review progress over time.
3
+ */
4
+ export declare function runReviewProgressTrack(argv: string[]): void;
5
+ //# sourceMappingURL=review-progress-track.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-progress-track.d.ts","sourceRoot":"","sources":["../../src/commands/review-progress-track.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoCH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuF3D"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Review-progress-track — Track review progress over time.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ // ─── Logic ──────────────────────────────────────────────────────────────────
6
+ function loadProgress(path) {
7
+ if (!existsSync(path)) {
8
+ return { version: 1, entries: [] };
9
+ }
10
+ try {
11
+ return JSON.parse(readFileSync(path, "utf-8"));
12
+ }
13
+ catch {
14
+ return { version: 1, entries: [] };
15
+ }
16
+ }
17
+ // ─── CLI ────────────────────────────────────────────────────────────────────
18
+ export function runReviewProgressTrack(argv) {
19
+ const fileIdx = argv.indexOf("--file");
20
+ const logIdx = argv.indexOf("--log");
21
+ const labelIdx = argv.indexOf("--label");
22
+ const formatIdx = argv.indexOf("--format");
23
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
24
+ const logPath = logIdx >= 0 ? argv[logIdx + 1] : ".judges-progress.json";
25
+ const label = labelIdx >= 0 ? argv[labelIdx + 1] : new Date().toISOString().slice(0, 10);
26
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
27
+ if (argv.includes("--help") || argv.includes("-h")) {
28
+ console.log(`
29
+ judges review-progress-track — Track review progress over time
30
+
31
+ Usage:
32
+ judges review-progress-track [--file <verdict.json>] [--log <path>]
33
+ [--label <name>] [--format table|json]
34
+
35
+ Options:
36
+ --file <path> Add verdict to progress log
37
+ --log <path> Progress log file (default: .judges-progress.json)
38
+ --label <name> Label for this entry (default: current date)
39
+ --format <fmt> Output format: table (default), json
40
+ --help, -h Show this help
41
+ `);
42
+ return;
43
+ }
44
+ const log = loadProgress(logPath);
45
+ // Add mode
46
+ if (filePath) {
47
+ if (!existsSync(filePath)) {
48
+ console.error(`Error: not found: ${filePath}`);
49
+ process.exitCode = 1;
50
+ return;
51
+ }
52
+ let verdict;
53
+ try {
54
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
55
+ }
56
+ catch {
57
+ console.error("Error: invalid JSON");
58
+ process.exitCode = 1;
59
+ return;
60
+ }
61
+ log.entries.push({
62
+ timestamp: new Date().toISOString(),
63
+ label,
64
+ score: verdict.overallScore,
65
+ findingCount: verdict.findings.length,
66
+ criticalCount: verdict.criticalCount,
67
+ highCount: verdict.highCount,
68
+ });
69
+ writeFileSync(logPath, JSON.stringify(log, null, 2));
70
+ console.log(`Added progress entry "${label}" (${log.entries.length} total)`);
71
+ return;
72
+ }
73
+ // View mode
74
+ if (format === "json") {
75
+ console.log(JSON.stringify(log, null, 2));
76
+ return;
77
+ }
78
+ console.log(`\nReview Progress (${log.entries.length} entries)`);
79
+ console.log("═".repeat(65));
80
+ console.log(`${"Label".padEnd(18)} ${"Score".padEnd(8)} ${"Findings".padEnd(10)} ${"Critical".padEnd(10)} High`);
81
+ console.log("─".repeat(65));
82
+ for (const e of log.entries) {
83
+ const lbl = e.label.length > 16 ? e.label.slice(0, 16) + "…" : e.label;
84
+ console.log(`${lbl.padEnd(18)} ${String(e.score).padEnd(8)} ${String(e.findingCount).padEnd(10)} ${String(e.criticalCount).padEnd(10)} ${e.highCount}`);
85
+ }
86
+ if (log.entries.length >= 2) {
87
+ const first = log.entries[0];
88
+ const last = log.entries[log.entries.length - 1];
89
+ const delta = last.score - first.score;
90
+ console.log("─".repeat(65));
91
+ console.log(` Score trend: ${delta >= 0 ? "+" : ""}${delta} (${first.label} → ${last.label})`);
92
+ }
93
+ console.log("═".repeat(65));
94
+ }
95
+ //# sourceMappingURL=review-progress-track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-progress-track.js","sourceRoot":"","sources":["../../src/commands/review-progress-track.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-quickstart — Interactive quickstart guide for new users.
3
+ */
4
+ export declare function runReviewQuickstart(argv: string[]): void;
5
+ //# sourceMappingURL=review-quickstart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-quickstart.d.ts","sourceRoot":"","sources":["../../src/commands/review-quickstart.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoEH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuDxD"}