@kevinrabun/judges 3.46.0 → 3.47.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 (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/adoption-report.d.ts +8 -0
  6. package/dist/commands/adoption-report.d.ts.map +1 -0
  7. package/dist/commands/adoption-report.js +219 -0
  8. package/dist/commands/adoption-report.js.map +1 -0
  9. package/dist/commands/ai-model-trust.d.ts +17 -0
  10. package/dist/commands/ai-model-trust.d.ts.map +1 -0
  11. package/dist/commands/ai-model-trust.js +235 -0
  12. package/dist/commands/ai-model-trust.js.map +1 -0
  13. package/dist/commands/ai-prompt-audit.d.ts +23 -0
  14. package/dist/commands/ai-prompt-audit.d.ts.map +1 -0
  15. package/dist/commands/ai-prompt-audit.js +255 -0
  16. package/dist/commands/ai-prompt-audit.js.map +1 -0
  17. package/dist/commands/code-owner-suggest.d.ts +17 -0
  18. package/dist/commands/code-owner-suggest.d.ts.map +1 -0
  19. package/dist/commands/code-owner-suggest.js +215 -0
  20. package/dist/commands/code-owner-suggest.js.map +1 -0
  21. package/dist/commands/cost-forecast.d.ts +19 -0
  22. package/dist/commands/cost-forecast.d.ts.map +1 -0
  23. package/dist/commands/cost-forecast.js +194 -0
  24. package/dist/commands/cost-forecast.js.map +1 -0
  25. package/dist/commands/pr-quality-gate.d.ts +29 -0
  26. package/dist/commands/pr-quality-gate.d.ts.map +1 -0
  27. package/dist/commands/pr-quality-gate.js +208 -0
  28. package/dist/commands/pr-quality-gate.js.map +1 -0
  29. package/dist/commands/team-leaderboard.d.ts +25 -0
  30. package/dist/commands/team-leaderboard.d.ts.map +1 -0
  31. package/dist/commands/team-leaderboard.js +228 -0
  32. package/dist/commands/team-leaderboard.js.map +1 -0
  33. package/dist/commands/team-rules-sync.d.ts +8 -0
  34. package/dist/commands/team-rules-sync.d.ts.map +1 -0
  35. package/dist/commands/team-rules-sync.js +251 -0
  36. package/dist/commands/team-rules-sync.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Cost forecast — projects 30/60/90-day security debt and
3
+ * remediation cost trends from local finding history.
4
+ *
5
+ * All data stays local — no upload or external services.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
8
+ import { join } from "path";
9
+ const COST_DIR = ".judges-cost-forecast";
10
+ const COST_FILE = join(COST_DIR, "history.json");
11
+ // Cost per finding by severity (industry averages, configurable)
12
+ const DEFAULT_COST_PER_FINDING = {
13
+ critical: 15000,
14
+ high: 5000,
15
+ medium: 1500,
16
+ low: 300,
17
+ };
18
+ // ─── Core ───────────────────────────────────────────────────────────────────
19
+ function ensureDir() {
20
+ if (!existsSync(COST_DIR))
21
+ mkdirSync(COST_DIR, { recursive: true });
22
+ }
23
+ function loadHistory() {
24
+ if (!existsSync(COST_FILE)) {
25
+ return { snapshots: [], projections: [], trend: "stable", updatedAt: new Date().toISOString() };
26
+ }
27
+ try {
28
+ return JSON.parse(readFileSync(COST_FILE, "utf-8"));
29
+ }
30
+ catch {
31
+ return { snapshots: [], projections: [], trend: "stable", updatedAt: new Date().toISOString() };
32
+ }
33
+ }
34
+ function saveHistory(data) {
35
+ ensureDir();
36
+ data.updatedAt = new Date().toISOString();
37
+ writeFileSync(COST_FILE, JSON.stringify(data, null, 2));
38
+ }
39
+ function estimateCost(snap) {
40
+ return (snap.critical * DEFAULT_COST_PER_FINDING.critical +
41
+ snap.high * DEFAULT_COST_PER_FINDING.high +
42
+ snap.medium * DEFAULT_COST_PER_FINDING.medium +
43
+ snap.low * DEFAULT_COST_PER_FINDING.low);
44
+ }
45
+ export function recordSnapshot(critical, high, medium, low) {
46
+ const totalFindings = critical + high + medium + low;
47
+ const estimatedCostVal = estimateCost({ critical, high, medium, low });
48
+ const snapshot = {
49
+ date: new Date().toISOString().slice(0, 10),
50
+ critical,
51
+ high,
52
+ medium,
53
+ low,
54
+ totalFindings,
55
+ estimatedCost: estimatedCostVal,
56
+ };
57
+ const history = loadHistory();
58
+ history.snapshots.push(snapshot);
59
+ if (history.snapshots.length > 365)
60
+ history.snapshots = history.snapshots.slice(-365);
61
+ // Compute trend
62
+ if (history.snapshots.length >= 2) {
63
+ const recent = history.snapshots.slice(-5);
64
+ const first = recent[0].estimatedCost;
65
+ const last = recent[recent.length - 1].estimatedCost;
66
+ if (last < first * 0.9)
67
+ history.trend = "improving";
68
+ else if (last > first * 1.1)
69
+ history.trend = "degrading";
70
+ else
71
+ history.trend = "stable";
72
+ }
73
+ // Project forward
74
+ history.projections = [];
75
+ const avgRate = history.snapshots.length >= 2
76
+ ? (history.snapshots[history.snapshots.length - 1].totalFindings - history.snapshots[0].totalFindings) /
77
+ history.snapshots.length
78
+ : 0;
79
+ const currentFindings = totalFindings;
80
+ const currentCost = estimatedCostVal;
81
+ for (const period of [30, 60, 90]) {
82
+ const projFindings = Math.max(0, Math.round(currentFindings + avgRate * period));
83
+ const projCost = Math.round(currentCost * (projFindings / Math.max(1, currentFindings)));
84
+ history.projections.push({
85
+ period: `${period}-day`,
86
+ estimatedCost: projCost,
87
+ findings: projFindings,
88
+ });
89
+ }
90
+ saveHistory(history);
91
+ return snapshot;
92
+ }
93
+ // ─── CLI ────────────────────────────────────────────────────────────────────
94
+ export function runCostForecast(argv) {
95
+ if (argv.includes("--help") || argv.includes("-h")) {
96
+ console.log(`
97
+ judges cost-forecast — Security debt cost projections
98
+
99
+ Usage:
100
+ judges cost-forecast --record --critical 2 --high 5 --medium 12 --low 20
101
+ judges cost-forecast --report
102
+ judges cost-forecast --projections
103
+ judges cost-forecast --cost-table
104
+
105
+ Options:
106
+ --record Record a new cost snapshot
107
+ --critical <n> Number of critical findings (default: 0)
108
+ --high <n> Number of high findings (default: 0)
109
+ --medium <n> Number of medium findings (default: 0)
110
+ --low <n> Number of low findings (default: 0)
111
+ --report Show full cost history and trends
112
+ --projections Show 30/60/90-day projections
113
+ --cost-table Show cost-per-finding table
114
+ --format json JSON output
115
+ --help, -h Show this help
116
+ `);
117
+ return;
118
+ }
119
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
120
+ // Cost table
121
+ if (argv.includes("--cost-table")) {
122
+ if (format === "json") {
123
+ console.log(JSON.stringify(DEFAULT_COST_PER_FINDING, null, 2));
124
+ }
125
+ else {
126
+ console.log(`\n Cost Per Finding (Industry Averages)\n ──────────────────────────`);
127
+ console.log(` Critical: $${DEFAULT_COST_PER_FINDING.critical.toLocaleString()}`);
128
+ console.log(` High: $${DEFAULT_COST_PER_FINDING.high.toLocaleString()}`);
129
+ console.log(` Medium: $${DEFAULT_COST_PER_FINDING.medium.toLocaleString()}`);
130
+ console.log(` Low: $${DEFAULT_COST_PER_FINDING.low.toLocaleString()}`);
131
+ console.log(`\n Based on: NIST/Ponemon incident cost research\n`);
132
+ }
133
+ return;
134
+ }
135
+ // Record snapshot
136
+ if (argv.includes("--record")) {
137
+ const critical = parseInt(argv.find((_a, i) => argv[i - 1] === "--critical") || "0", 10);
138
+ const high = parseInt(argv.find((_a, i) => argv[i - 1] === "--high") || "0", 10);
139
+ const medium = parseInt(argv.find((_a, i) => argv[i - 1] === "--medium") || "0", 10);
140
+ const low = parseInt(argv.find((_a, i) => argv[i - 1] === "--low") || "0", 10);
141
+ const snap = recordSnapshot(critical, high, medium, low);
142
+ if (format === "json") {
143
+ console.log(JSON.stringify(snap, null, 2));
144
+ }
145
+ else {
146
+ console.log(`\n ✅ Cost Snapshot Recorded — ${snap.date}`);
147
+ console.log(` Findings: ${snap.totalFindings} (C:${snap.critical} H:${snap.high} M:${snap.medium} L:${snap.low})`);
148
+ console.log(` Estimated cost: $${snap.estimatedCost.toLocaleString()}\n`);
149
+ }
150
+ return;
151
+ }
152
+ // Projections
153
+ if (argv.includes("--projections")) {
154
+ const history = loadHistory();
155
+ if (history.projections.length === 0) {
156
+ console.log(" No data yet. Record snapshots with --record first.");
157
+ return;
158
+ }
159
+ if (format === "json") {
160
+ console.log(JSON.stringify(history.projections, null, 2));
161
+ }
162
+ else {
163
+ console.log(`\n Cost Projections (trend: ${history.trend})\n ──────────────────────────`);
164
+ for (const p of history.projections) {
165
+ console.log(` ${p.period.padEnd(10)} ${p.findings.toString().padEnd(8)} findings $${p.estimatedCost.toLocaleString()}`);
166
+ }
167
+ console.log("");
168
+ }
169
+ return;
170
+ }
171
+ // Full report
172
+ const history = loadHistory();
173
+ if (format === "json") {
174
+ console.log(JSON.stringify(history, null, 2));
175
+ }
176
+ else {
177
+ console.log(`\n Cost Forecast Report\n ──────────────────────────`);
178
+ console.log(` Trend: ${history.trend} | Snapshots: ${history.snapshots.length}`);
179
+ if (history.snapshots.length > 0) {
180
+ console.log(`\n Recent History:`);
181
+ for (const s of history.snapshots.slice(-10)) {
182
+ console.log(` ${s.date} ${s.totalFindings.toString().padEnd(6)} findings $${s.estimatedCost.toLocaleString()}`);
183
+ }
184
+ }
185
+ if (history.projections.length > 0) {
186
+ console.log(`\n Projections:`);
187
+ for (const p of history.projections) {
188
+ console.log(` ${p.period.padEnd(10)} ${p.findings.toString().padEnd(6)} findings $${p.estimatedCost.toLocaleString()}`);
189
+ }
190
+ }
191
+ console.log("");
192
+ }
193
+ }
194
+ //# sourceMappingURL=cost-forecast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-forecast.js","sourceRoot":"","sources":["../../src/commands/cost-forecast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * PR quality gate — automated pass/fail gate for PRs with
3
+ * configurable thresholds for auto-approval.
4
+ *
5
+ * All decisions are local — integrates via output format.
6
+ */
7
+ interface GatePolicy {
8
+ maxCritical: number;
9
+ maxHigh: number;
10
+ maxTotal: number;
11
+ requireTestCoverage: boolean;
12
+ autoApproveBelow: number;
13
+ }
14
+ interface GateResult {
15
+ passed: boolean;
16
+ reason: string;
17
+ critical: number;
18
+ high: number;
19
+ medium: number;
20
+ low: number;
21
+ total: number;
22
+ score: number;
23
+ policy: GatePolicy;
24
+ timestamp: string;
25
+ }
26
+ export declare function evaluateGate(critical: number, high: number, medium: number, low: number, score: number): GateResult;
27
+ export declare function runPrQualityGate(argv: string[]): void;
28
+ export {};
29
+ //# sourceMappingURL=pr-quality-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-quality-gate.d.ts","sourceRoot":"","sources":["../../src/commands/pr-quality-gate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAsDD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAyCnH;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0HrD"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * PR quality gate — automated pass/fail gate for PRs with
3
+ * configurable thresholds for auto-approval.
4
+ *
5
+ * All decisions are local — integrates via output format.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
8
+ import { join } from "path";
9
+ const GATE_DIR = ".judges-quality-gate";
10
+ const GATE_FILE = join(GATE_DIR, "gate-history.json");
11
+ const POLICY_FILE = join(GATE_DIR, "policy.json");
12
+ const DEFAULT_POLICY = {
13
+ maxCritical: 0,
14
+ maxHigh: 2,
15
+ maxTotal: 20,
16
+ requireTestCoverage: false,
17
+ autoApproveBelow: 80,
18
+ };
19
+ // ─── Core ───────────────────────────────────────────────────────────────────
20
+ function ensureDir() {
21
+ if (!existsSync(GATE_DIR))
22
+ mkdirSync(GATE_DIR, { recursive: true });
23
+ }
24
+ function loadPolicy() {
25
+ if (!existsSync(POLICY_FILE))
26
+ return { ...DEFAULT_POLICY };
27
+ try {
28
+ return { ...DEFAULT_POLICY, ...JSON.parse(readFileSync(POLICY_FILE, "utf-8")) };
29
+ }
30
+ catch {
31
+ return { ...DEFAULT_POLICY };
32
+ }
33
+ }
34
+ function savePolicy(policy) {
35
+ ensureDir();
36
+ writeFileSync(POLICY_FILE, JSON.stringify(policy, null, 2));
37
+ }
38
+ function loadHistory() {
39
+ if (!existsSync(GATE_FILE))
40
+ return { results: [], updatedAt: new Date().toISOString() };
41
+ try {
42
+ return JSON.parse(readFileSync(GATE_FILE, "utf-8"));
43
+ }
44
+ catch {
45
+ return { results: [], updatedAt: new Date().toISOString() };
46
+ }
47
+ }
48
+ function saveHistory(history) {
49
+ ensureDir();
50
+ history.updatedAt = new Date().toISOString();
51
+ writeFileSync(GATE_FILE, JSON.stringify(history, null, 2));
52
+ }
53
+ export function evaluateGate(critical, high, medium, low, score) {
54
+ const policy = loadPolicy();
55
+ const total = critical + high + medium + low;
56
+ let passed = true;
57
+ let reason = "All checks passed";
58
+ if (critical > policy.maxCritical) {
59
+ passed = false;
60
+ reason = `Critical findings (${critical}) exceed limit (${policy.maxCritical})`;
61
+ }
62
+ else if (high > policy.maxHigh) {
63
+ passed = false;
64
+ reason = `High findings (${high}) exceed limit (${policy.maxHigh})`;
65
+ }
66
+ else if (total > policy.maxTotal) {
67
+ passed = false;
68
+ reason = `Total findings (${total}) exceed limit (${policy.maxTotal})`;
69
+ }
70
+ else if (score < policy.autoApproveBelow) {
71
+ passed = false;
72
+ reason = `Score (${score}) below threshold (${policy.autoApproveBelow})`;
73
+ }
74
+ const result = {
75
+ passed,
76
+ reason,
77
+ critical,
78
+ high,
79
+ medium,
80
+ low,
81
+ total,
82
+ score,
83
+ policy,
84
+ timestamp: new Date().toISOString(),
85
+ };
86
+ // Record
87
+ const history = loadHistory();
88
+ history.results.push(result);
89
+ if (history.results.length > 200)
90
+ history.results = history.results.slice(-200);
91
+ saveHistory(history);
92
+ return result;
93
+ }
94
+ // ─── CLI ────────────────────────────────────────────────────────────────────
95
+ export function runPrQualityGate(argv) {
96
+ if (argv.includes("--help") || argv.includes("-h")) {
97
+ console.log(`
98
+ judges pr-quality-gate — Automated PR pass/fail quality gate
99
+
100
+ Usage:
101
+ judges pr-quality-gate --check --critical 0 --high 1 --medium 5 --low 10 --score 85
102
+ judges pr-quality-gate --policy
103
+ judges pr-quality-gate --set-policy --max-critical 0 --max-high 3 --max-total 25
104
+ judges pr-quality-gate --history
105
+
106
+ Options:
107
+ --check Evaluate against policy (exit code 1 = fail)
108
+ --critical <n> Critical finding count
109
+ --high <n> High finding count
110
+ --medium <n> Medium finding count
111
+ --low <n> Low finding count
112
+ --score <n> Overall score (0-100)
113
+ --policy Show current policy
114
+ --set-policy Update policy thresholds
115
+ --max-critical <n> Set max critical threshold
116
+ --max-high <n> Set max high threshold
117
+ --max-total <n> Set max total threshold
118
+ --auto-approve <n> Set auto-approve score threshold
119
+ --history Show gate decision history
120
+ --format json JSON output
121
+ --help, -h Show this help
122
+ `);
123
+ return;
124
+ }
125
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
126
+ // Show policy
127
+ if (argv.includes("--policy") && !argv.includes("--set-policy")) {
128
+ const policy = loadPolicy();
129
+ if (format === "json") {
130
+ console.log(JSON.stringify(policy, null, 2));
131
+ }
132
+ else {
133
+ console.log(`\n PR Quality Gate Policy\n ──────────────────────────`);
134
+ console.log(` Max critical: ${policy.maxCritical}`);
135
+ console.log(` Max high: ${policy.maxHigh}`);
136
+ console.log(` Max total: ${policy.maxTotal}`);
137
+ console.log(` Auto-approve >= ${policy.autoApproveBelow} score`);
138
+ console.log(` Require tests: ${policy.requireTestCoverage}`);
139
+ console.log("");
140
+ }
141
+ return;
142
+ }
143
+ // Set policy
144
+ if (argv.includes("--set-policy")) {
145
+ const policy = loadPolicy();
146
+ const mc = argv.find((_a, i) => argv[i - 1] === "--max-critical");
147
+ const mh = argv.find((_a, i) => argv[i - 1] === "--max-high");
148
+ const mt = argv.find((_a, i) => argv[i - 1] === "--max-total");
149
+ const aa = argv.find((_a, i) => argv[i - 1] === "--auto-approve");
150
+ if (mc)
151
+ policy.maxCritical = parseInt(mc, 10);
152
+ if (mh)
153
+ policy.maxHigh = parseInt(mh, 10);
154
+ if (mt)
155
+ policy.maxTotal = parseInt(mt, 10);
156
+ if (aa)
157
+ policy.autoApproveBelow = parseInt(aa, 10);
158
+ savePolicy(policy);
159
+ console.log(` ✅ Policy updated`);
160
+ return;
161
+ }
162
+ // History
163
+ if (argv.includes("--history")) {
164
+ const history = loadHistory();
165
+ if (format === "json") {
166
+ console.log(JSON.stringify(history, null, 2));
167
+ }
168
+ else {
169
+ const passRate = history.results.length > 0
170
+ ? Math.round((history.results.filter((r) => r.passed).length / history.results.length) * 100)
171
+ : 0;
172
+ console.log(`\n Gate History (${history.results.length} checks, ${passRate}% pass rate)\n ──────────────────────────`);
173
+ for (const r of history.results.slice(-15)) {
174
+ const icon = r.passed ? "✅" : "❌";
175
+ console.log(` ${icon} ${r.timestamp.slice(0, 16)} score:${r.score} C:${r.critical} H:${r.high} — ${r.reason}`);
176
+ }
177
+ console.log("");
178
+ }
179
+ return;
180
+ }
181
+ // Check
182
+ if (argv.includes("--check")) {
183
+ const critical = parseInt(argv.find((_a, i) => argv[i - 1] === "--critical") || "0", 10);
184
+ const high = parseInt(argv.find((_a, i) => argv[i - 1] === "--high") || "0", 10);
185
+ const medium = parseInt(argv.find((_a, i) => argv[i - 1] === "--medium") || "0", 10);
186
+ const low = parseInt(argv.find((_a, i) => argv[i - 1] === "--low") || "0", 10);
187
+ const score = parseInt(argv.find((_a, i) => argv[i - 1] === "--score") || "100", 10);
188
+ const result = evaluateGate(critical, high, medium, low, score);
189
+ if (format === "json") {
190
+ console.log(JSON.stringify(result, null, 2));
191
+ }
192
+ else {
193
+ const icon = result.passed ? "✅ PASSED" : "❌ FAILED";
194
+ console.log(`\n PR Quality Gate: ${icon}`);
195
+ console.log(` ──────────────────────────`);
196
+ console.log(` Score: ${result.score}/100`);
197
+ console.log(` Findings: C:${result.critical} H:${result.high} M:${result.medium} L:${result.low} (total: ${result.total})`);
198
+ console.log(` Reason: ${result.reason}`);
199
+ console.log("");
200
+ }
201
+ if (!result.passed) {
202
+ process.exitCode = 1;
203
+ }
204
+ return;
205
+ }
206
+ console.error(" Use --check, --policy, --set-policy, or --history. --help for usage.");
207
+ }
208
+ //# sourceMappingURL=pr-quality-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-quality-gate.js","sourceRoot":"","sources":["../../src/commands/pr-quality-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Team leaderboard — gamified security review engagement
3
+ * tracking across developers.
4
+ *
5
+ * All data stays in local .judges-leaderboard/ directory.
6
+ */
7
+ interface DevStats {
8
+ author: string;
9
+ findingsReviewed: number;
10
+ findingsFixed: number;
11
+ criticalFixed: number;
12
+ scansRun: number;
13
+ streak: number;
14
+ lastActive: string;
15
+ badges: string[];
16
+ }
17
+ export declare function recordActivity(author: string, activity: {
18
+ reviewed?: number;
19
+ fixed?: number;
20
+ criticalFixed?: number;
21
+ scansRun?: number;
22
+ }): DevStats;
23
+ export declare function runTeamLeaderboard(argv: string[]): void;
24
+ export {};
25
+ //# sourceMappingURL=team-leaderboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-leaderboard.d.ts","sourceRoot":"","sources":["../../src/commands/team-leaderboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAoDD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACzF,QAAQ,CAoCV;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqIvD"}