@kevinrabun/judges 3.53.0 → 3.55.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 (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/approve-chain.d.ts +8 -0
  6. package/dist/commands/approve-chain.d.ts.map +1 -0
  7. package/dist/commands/approve-chain.js +235 -0
  8. package/dist/commands/approve-chain.js.map +1 -0
  9. package/dist/commands/build-optimize.d.ts +7 -0
  10. package/dist/commands/build-optimize.d.ts.map +1 -0
  11. package/dist/commands/build-optimize.js +257 -0
  12. package/dist/commands/build-optimize.js.map +1 -0
  13. package/dist/commands/coach-mode.d.ts +8 -0
  14. package/dist/commands/coach-mode.d.ts.map +1 -0
  15. package/dist/commands/coach-mode.js +230 -0
  16. package/dist/commands/coach-mode.js.map +1 -0
  17. package/dist/commands/commit-hygiene.d.ts +6 -0
  18. package/dist/commands/commit-hygiene.d.ts.map +1 -0
  19. package/dist/commands/commit-hygiene.js +176 -0
  20. package/dist/commands/commit-hygiene.js.map +1 -0
  21. package/dist/commands/context-inject.d.ts +9 -0
  22. package/dist/commands/context-inject.d.ts.map +1 -0
  23. package/dist/commands/context-inject.js +212 -0
  24. package/dist/commands/context-inject.js.map +1 -0
  25. package/dist/commands/deploy-readiness.d.ts +6 -0
  26. package/dist/commands/deploy-readiness.d.ts.map +1 -0
  27. package/dist/commands/deploy-readiness.js +212 -0
  28. package/dist/commands/deploy-readiness.js.map +1 -0
  29. package/dist/commands/finding-contest.d.ts +8 -0
  30. package/dist/commands/finding-contest.d.ts.map +1 -0
  31. package/dist/commands/finding-contest.js +193 -0
  32. package/dist/commands/finding-contest.js.map +1 -0
  33. package/dist/commands/habit-tracker.d.ts +8 -0
  34. package/dist/commands/habit-tracker.d.ts.map +1 -0
  35. package/dist/commands/habit-tracker.js +195 -0
  36. package/dist/commands/habit-tracker.js.map +1 -0
  37. package/dist/commands/migration-safety.d.ts +6 -0
  38. package/dist/commands/migration-safety.d.ts.map +1 -0
  39. package/dist/commands/migration-safety.js +257 -0
  40. package/dist/commands/migration-safety.js.map +1 -0
  41. package/dist/commands/observability-gap.d.ts +6 -0
  42. package/dist/commands/observability-gap.d.ts.map +1 -0
  43. package/dist/commands/observability-gap.js +212 -0
  44. package/dist/commands/observability-gap.js.map +1 -0
  45. package/dist/commands/prompt-replay.d.ts +8 -0
  46. package/dist/commands/prompt-replay.d.ts.map +1 -0
  47. package/dist/commands/prompt-replay.js +177 -0
  48. package/dist/commands/prompt-replay.js.map +1 -0
  49. package/dist/commands/review-replay.d.ts +9 -0
  50. package/dist/commands/review-replay.d.ts.map +1 -0
  51. package/dist/commands/review-replay.js +265 -0
  52. package/dist/commands/review-replay.js.map +1 -0
  53. package/dist/commands/rollback-safety.d.ts +5 -0
  54. package/dist/commands/rollback-safety.d.ts.map +1 -0
  55. package/dist/commands/rollback-safety.js +192 -0
  56. package/dist/commands/rollback-safety.js.map +1 -0
  57. package/dist/commands/secret-age.d.ts +6 -0
  58. package/dist/commands/secret-age.d.ts.map +1 -0
  59. package/dist/commands/secret-age.js +215 -0
  60. package/dist/commands/secret-age.js.map +1 -0
  61. package/dist/commands/snippet-eval.d.ts +8 -0
  62. package/dist/commands/snippet-eval.d.ts.map +1 -0
  63. package/dist/commands/snippet-eval.js +224 -0
  64. package/dist/commands/snippet-eval.js.map +1 -0
  65. package/dist/commands/test-quality.d.ts +6 -0
  66. package/dist/commands/test-quality.d.ts.map +1 -0
  67. package/dist/commands/test-quality.js +161 -0
  68. package/dist/commands/test-quality.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Context inject — feed project-specific context (architecture docs,
3
+ * API contracts, coding standards) into evaluation for higher-precision
4
+ * findings.
5
+ *
6
+ * Parses context files and maintains a local context cache for judges.
7
+ */
8
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from "fs";
9
+ import { join, basename } from "path";
10
+ // ─── Storage ────────────────────────────────────────────────────────────────
11
+ const CONTEXT_DIR = ".judges-context";
12
+ function ensureDir() {
13
+ if (!existsSync(CONTEXT_DIR))
14
+ mkdirSync(CONTEXT_DIR, { recursive: true });
15
+ }
16
+ function loadProfile() {
17
+ const file = join(CONTEXT_DIR, "profile.json");
18
+ if (!existsSync(file))
19
+ return null;
20
+ try {
21
+ return JSON.parse(readFileSync(file, "utf-8"));
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function saveProfile(profile) {
28
+ ensureDir();
29
+ writeFileSync(join(CONTEXT_DIR, "profile.json"), JSON.stringify(profile, null, 2));
30
+ }
31
+ // ─── Context Extraction ────────────────────────────────────────────────────
32
+ const RULE_PATTERNS = [
33
+ { regex: /(?:must|should|always|never|require|mandatory)\s+(.{10,80})/i, category: "requirement" },
34
+ { regex: /(?:do not|don't|avoid|prohibit|forbid)\s+(.{10,80})/i, category: "prohibition" },
35
+ { regex: /(?:all|every)\s+(?:api|endpoint|route|handler)\s+(?:must|should)\s+(.{10,80})/i, category: "api-standard" },
36
+ {
37
+ regex: /(?:database|db|data)\s+(?:access|query|operation)\s+(?:must|should)\s+(.{10,80})/i,
38
+ category: "data-access",
39
+ },
40
+ {
41
+ regex: /(?:error|exception)\s+(?:handling|management)\s+(?:must|should)\s+(.{10,80})/i,
42
+ category: "error-handling",
43
+ },
44
+ { regex: /(?:auth|authentication|authorization)\s+(.{10,80})/i, category: "auth" },
45
+ { regex: /(?:naming|convention|style)\s+(?:must|should|:)\s*(.{10,80})/i, category: "naming" },
46
+ { regex: /(?:test|testing)\s+(?:must|should|require)\s+(.{10,80})/i, category: "testing" },
47
+ { regex: /(?:log|logging)\s+(?:must|should|require)\s+(.{10,80})/i, category: "logging" },
48
+ { regex: /(?:security|secure)\s+(?:must|should|require)\s+(.{10,80})/i, category: "security" },
49
+ ];
50
+ function extractRules(content, source) {
51
+ const rules = [];
52
+ const lines = content.split("\n");
53
+ for (const line of lines) {
54
+ const trimmed = line.trim();
55
+ if (!trimmed || trimmed.startsWith("#"))
56
+ continue;
57
+ for (const pattern of RULE_PATTERNS) {
58
+ const match = pattern.regex.exec(trimmed);
59
+ if (match) {
60
+ rules.push({ source: basename(source), category: pattern.category, rule: trimmed.substring(0, 120) });
61
+ break;
62
+ }
63
+ }
64
+ }
65
+ return rules;
66
+ }
67
+ // ─── CLI ────────────────────────────────────────────────────────────────────
68
+ export function runContextInject(argv) {
69
+ if (argv.includes("--help") || argv.includes("-h")) {
70
+ console.log(`
71
+ judges context-inject — Feed project context into evaluation
72
+
73
+ Usage:
74
+ judges context-inject --add docs/architecture.md
75
+ judges context-inject --add docs/coding-standards.md
76
+ judges context-inject --show
77
+ judges context-inject --scan docs/
78
+ judges context-inject --clear
79
+
80
+ Options:
81
+ --add <file> Add a context file (Markdown/YAML/text)
82
+ --scan <dir> Scan directory for context documents
83
+ --show Show current context profile
84
+ --clear Clear all context
85
+ --format json JSON output
86
+ --help, -h Show this help
87
+
88
+ Context files are parsed for rules, standards, and conventions that
89
+ judges use to calibrate findings for your specific project.
90
+ `);
91
+ return;
92
+ }
93
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
94
+ const isAdd = argv.includes("--add");
95
+ const _isShow = argv.includes("--show");
96
+ const isScan = argv.includes("--scan");
97
+ const isClear = argv.includes("--clear");
98
+ if (isClear) {
99
+ saveProfile({
100
+ name: "default",
101
+ sources: [],
102
+ rules: [],
103
+ createdAt: new Date().toISOString(),
104
+ updatedAt: new Date().toISOString(),
105
+ });
106
+ console.log(" ✅ Context cleared");
107
+ return;
108
+ }
109
+ if (isAdd) {
110
+ const fileIdx = argv.indexOf("--add") + 1;
111
+ const file = argv[fileIdx] || "";
112
+ if (!file || !existsSync(file)) {
113
+ console.error(` File not found: ${file}`);
114
+ return;
115
+ }
116
+ const content = readFileSync(file, "utf-8");
117
+ const newRules = extractRules(content, file);
118
+ const profile = loadProfile() || {
119
+ name: "default",
120
+ sources: [],
121
+ rules: [],
122
+ createdAt: new Date().toISOString(),
123
+ updatedAt: "",
124
+ };
125
+ if (!profile.sources.includes(file))
126
+ profile.sources.push(file);
127
+ profile.rules.push(...newRules);
128
+ profile.updatedAt = new Date().toISOString();
129
+ saveProfile(profile);
130
+ console.log(` ✅ Added ${file} — extracted ${newRules.length} rule(s)`);
131
+ if (newRules.length > 0) {
132
+ for (const r of newRules.slice(0, 5)) {
133
+ console.log(` [${r.category}] ${r.rule}`);
134
+ }
135
+ if (newRules.length > 5)
136
+ console.log(` ... and ${newRules.length - 5} more`);
137
+ }
138
+ return;
139
+ }
140
+ if (isScan) {
141
+ const dirIdx = argv.indexOf("--scan") + 1;
142
+ const dir = argv[dirIdx] || "docs";
143
+ if (!existsSync(dir)) {
144
+ console.error(` Directory not found: ${dir}`);
145
+ return;
146
+ }
147
+ const DOC_EXTS = new Set([".md", ".txt", ".yaml", ".yml", ".rst"]);
148
+ let entries;
149
+ try {
150
+ entries = readdirSync(dir);
151
+ }
152
+ catch {
153
+ entries = [];
154
+ }
155
+ const docFiles = entries.filter((e) => DOC_EXTS.has(join(".", e).includes(".") ? "." + e.split(".").pop() : ""));
156
+ const profile = loadProfile() || {
157
+ name: "default",
158
+ sources: [],
159
+ rules: [],
160
+ createdAt: new Date().toISOString(),
161
+ updatedAt: "",
162
+ };
163
+ let totalNew = 0;
164
+ for (const f of docFiles) {
165
+ const fullPath = join(dir, f);
166
+ try {
167
+ const content = readFileSync(fullPath, "utf-8");
168
+ const rules = extractRules(content, fullPath);
169
+ if (!profile.sources.includes(fullPath))
170
+ profile.sources.push(fullPath);
171
+ profile.rules.push(...rules);
172
+ totalNew += rules.length;
173
+ }
174
+ catch {
175
+ /* skip */
176
+ }
177
+ }
178
+ profile.updatedAt = new Date().toISOString();
179
+ saveProfile(profile);
180
+ console.log(` ✅ Scanned ${docFiles.length} doc(s) in ${dir} — extracted ${totalNew} rule(s)`);
181
+ return;
182
+ }
183
+ // Default: show profile
184
+ const profile = loadProfile();
185
+ if (!profile || profile.rules.length === 0) {
186
+ console.log(" No context loaded. Use --add <file> or --scan <dir> to inject context.");
187
+ return;
188
+ }
189
+ if (format === "json") {
190
+ console.log(JSON.stringify(profile, null, 2));
191
+ }
192
+ else {
193
+ console.log(`\n Context Profile — ${profile.rules.length} rule(s) from ${profile.sources.length} source(s)\n ──────────────────────────`);
194
+ const byCategory = new Map();
195
+ for (const r of profile.rules) {
196
+ const list = byCategory.get(r.category) || [];
197
+ list.push(r);
198
+ byCategory.set(r.category, list);
199
+ }
200
+ for (const [cat, rules] of byCategory) {
201
+ console.log(`\n 📋 ${cat} (${rules.length}):`);
202
+ for (const r of rules.slice(0, 5)) {
203
+ console.log(` ${r.rule}`);
204
+ }
205
+ if (rules.length > 5)
206
+ console.log(` ... and ${rules.length - 5} more`);
207
+ }
208
+ console.log(`\n Sources: ${profile.sources.join(", ")}`);
209
+ console.log(` Last updated: ${profile.updatedAt}\n`);
210
+ }
211
+ }
212
+ //# sourceMappingURL=context-inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-inject.js","sourceRoot":"","sources":["../../src/commands/context-inject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Deploy readiness — pre-deployment checklist that validates
3
+ * AI-generated code is production-ready.
4
+ */
5
+ export declare function runDeployReadiness(argv: string[]): void;
6
+ //# sourceMappingURL=deploy-readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-readiness.d.ts","sourceRoot":"","sources":["../../src/commands/deploy-readiness.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4LH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsDvD"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Deploy readiness — pre-deployment checklist that validates
3
+ * AI-generated code is production-ready.
4
+ */
5
+ import { readFileSync, readdirSync, statSync, existsSync } from "fs";
6
+ import { join, extname } from "path";
7
+ // ─── File Collection ────────────────────────────────────────────────────────
8
+ const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".py", ".java", ".go", ".rs"]);
9
+ function collectFiles(dir, max = 300) {
10
+ const files = [];
11
+ function walk(d) {
12
+ if (files.length >= max)
13
+ return;
14
+ let entries;
15
+ try {
16
+ entries = readdirSync(d);
17
+ }
18
+ catch {
19
+ return;
20
+ }
21
+ for (const e of entries) {
22
+ if (files.length >= max)
23
+ return;
24
+ if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
25
+ continue;
26
+ const full = join(d, e);
27
+ try {
28
+ if (statSync(full).isDirectory())
29
+ walk(full);
30
+ else if (CODE_EXTS.has(extname(full)))
31
+ files.push(full);
32
+ }
33
+ catch {
34
+ /* skip */
35
+ }
36
+ }
37
+ }
38
+ walk(dir);
39
+ return files;
40
+ }
41
+ function allContent(files) {
42
+ return files
43
+ .map((f) => {
44
+ try {
45
+ return readFileSync(f, "utf-8");
46
+ }
47
+ catch {
48
+ return "";
49
+ }
50
+ })
51
+ .join("\n");
52
+ }
53
+ // ─── Checks ─────────────────────────────────────────────────────────────────
54
+ function runChecks(dir) {
55
+ const checks = [];
56
+ const files = collectFiles(dir);
57
+ const content = allContent(files);
58
+ // Health check endpoint
59
+ const hasHealthCheck = /\/(health|healthz|readyz|livez|status)\b/.test(content);
60
+ checks.push({
61
+ name: "Health check endpoint",
62
+ status: hasHealthCheck ? "pass" : "fail",
63
+ detail: hasHealthCheck ? "Health check endpoint found" : "No /health or /healthz endpoint detected",
64
+ category: "availability",
65
+ });
66
+ // Graceful shutdown
67
+ const hasGraceful = /process\.on\s*\(\s*['"]SIG(TERM|INT)['"]|graceful.?shutdown|server\.close/i.test(content);
68
+ checks.push({
69
+ name: "Graceful shutdown handler",
70
+ status: hasGraceful ? "pass" : "warn",
71
+ detail: hasGraceful ? "SIGTERM/SIGINT handler found" : "No graceful shutdown handler — may lose in-flight requests",
72
+ category: "availability",
73
+ });
74
+ // Environment variable validation
75
+ const envRefs = (content.match(/process\.env\.\w+|os\.environ|System\.getenv/g) || []).length;
76
+ const envValidation = /process\.env\.\w+\s*\|\||required|assert.*env|validateEnv|env\.parse/i.test(content);
77
+ checks.push({
78
+ name: "Environment variable validation",
79
+ status: envRefs > 0 && envValidation ? "pass" : envRefs > 0 ? "warn" : "pass",
80
+ detail: envRefs > 0
81
+ ? envValidation
82
+ ? `${envRefs} env vars with validation`
83
+ : `${envRefs} env vars but no validation at startup`
84
+ : "No environment variables detected",
85
+ category: "configuration",
86
+ });
87
+ // Rate limiting
88
+ const hasRateLimit = /rate.?limit|throttle|express-rate-limit|fastify-rate-limit|@nestjs\/throttler/i.test(content);
89
+ checks.push({
90
+ name: "Rate limiting",
91
+ status: hasRateLimit ? "pass" : "warn",
92
+ detail: hasRateLimit ? "Rate limiting configured" : "No rate limiting detected — vulnerable to abuse",
93
+ category: "security",
94
+ });
95
+ // CORS configuration
96
+ const hasCors = /cors\(|Access-Control-Allow-Origin|@CrossOrigin/i.test(content);
97
+ const permissiveCors = /cors\(\s*\)|Allow-Origin.*\*/i.test(content);
98
+ checks.push({
99
+ name: "CORS configuration",
100
+ status: hasCors && !permissiveCors ? "pass" : permissiveCors ? "warn" : hasCors ? "pass" : "pass",
101
+ detail: permissiveCors
102
+ ? "CORS is permissive (allow-all) — restrict origins in production"
103
+ : hasCors
104
+ ? "CORS configured"
105
+ : "No CORS detected (may be OK for backend-only services)",
106
+ category: "security",
107
+ });
108
+ // Error handling
109
+ const hasGlobalErrorHandler = /app\.use\s*\(\s*\(err|@ExceptionHandler|exception_handler|error_handler/i.test(content);
110
+ checks.push({
111
+ name: "Global error handler",
112
+ status: hasGlobalErrorHandler ? "pass" : "warn",
113
+ detail: hasGlobalErrorHandler
114
+ ? "Global error handler found"
115
+ : "No global error handler — uncaught errors may leak stack traces",
116
+ category: "reliability",
117
+ });
118
+ // Logging
119
+ const hasStructuredLogging = /winston|pino|bunyan|log4j|logging\.getLogger|slog\.|zerolog/i.test(content);
120
+ const consoleLogCount = (content.match(/console\.(log|debug)\s*\(/g) || []).length;
121
+ checks.push({
122
+ name: "Structured logging",
123
+ status: hasStructuredLogging ? "pass" : consoleLogCount > 10 ? "warn" : "pass",
124
+ detail: hasStructuredLogging
125
+ ? "Structured logging framework detected"
126
+ : `${consoleLogCount} console.log calls — use a logging framework in production`,
127
+ category: "observability",
128
+ });
129
+ // Connection pool limits
130
+ const hasPool = /pool|createPool|connectionLimit|maxConnections|max_connections/i.test(content);
131
+ checks.push({
132
+ name: "Connection pool limits",
133
+ status: hasPool ? "pass" : "pass",
134
+ detail: hasPool ? "Connection pooling configured" : "No explicit connection pool detected (may be OK)",
135
+ category: "performance",
136
+ });
137
+ // Dockerfile / container
138
+ const hasDockerfile = existsSync(join(dir, "Dockerfile")) || existsSync(join(dir, "docker-compose.yml"));
139
+ const hasK8sProbes = /readinessProbe|livenessProbe|startupProbe/i.test(content);
140
+ if (hasDockerfile) {
141
+ checks.push({
142
+ name: "Container probes",
143
+ status: hasK8sProbes ? "pass" : "warn",
144
+ detail: hasK8sProbes ? "K8s readiness/liveness probes configured" : "Dockerfile found but no K8s probes detected",
145
+ category: "deployment",
146
+ });
147
+ }
148
+ // HTTPS
149
+ const hasInsecureHttp = /['"]http:\/\/(?!localhost|127\.0\.0\.1)/i.test(content);
150
+ checks.push({
151
+ name: "HTTPS enforcement",
152
+ status: hasInsecureHttp ? "warn" : "pass",
153
+ detail: hasInsecureHttp ? "Insecure HTTP URLs detected — use HTTPS" : "No insecure HTTP URLs found",
154
+ category: "security",
155
+ });
156
+ // Timeout configuration
157
+ const hasTimeouts = /timeout|connectTimeout|socketTimeout|requestTimeout/i.test(content);
158
+ checks.push({
159
+ name: "Request timeouts",
160
+ status: hasTimeouts ? "pass" : "warn",
161
+ detail: hasTimeouts ? "Timeout configuration found" : "No explicit timeouts — requests may hang indefinitely",
162
+ category: "reliability",
163
+ });
164
+ return checks;
165
+ }
166
+ // ─── CLI ────────────────────────────────────────────────────────────────────
167
+ export function runDeployReadiness(argv) {
168
+ if (argv.includes("--help") || argv.includes("-h")) {
169
+ console.log(`
170
+ judges deploy-readiness — Pre-deployment production readiness checklist
171
+
172
+ Usage:
173
+ judges deploy-readiness [dir]
174
+ judges deploy-readiness src/ --format json
175
+
176
+ Options:
177
+ [dir] Directory to scan (default: .)
178
+ --format json JSON output
179
+ --help, -h Show this help
180
+
181
+ Checks: health endpoints, graceful shutdown, env validation, rate limiting,
182
+ CORS, error handling, logging, connection pools, container probes, HTTPS, timeouts
183
+ `);
184
+ return;
185
+ }
186
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
187
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
188
+ const checks = runChecks(dir);
189
+ const passCount = checks.filter((c) => c.status === "pass").length;
190
+ const warnCount = checks.filter((c) => c.status === "warn").length;
191
+ const failCount = checks.filter((c) => c.status === "fail").length;
192
+ const score = Math.round((passCount / checks.length) * 100);
193
+ if (format === "json") {
194
+ console.log(JSON.stringify({
195
+ checks,
196
+ score,
197
+ summary: { pass: passCount, warn: warnCount, fail: failCount },
198
+ timestamp: new Date().toISOString(),
199
+ }, null, 2));
200
+ }
201
+ else {
202
+ const badge = failCount > 0 ? "❌ NOT READY" : warnCount > 2 ? "⚠️ REVIEW" : "✅ READY";
203
+ console.log(`\n Deploy Readiness: ${badge} (${score}%)\n ──────────────────────────`);
204
+ for (const check of checks) {
205
+ const icon = check.status === "pass" ? "✅" : check.status === "warn" ? "⚠️" : "❌";
206
+ console.log(` ${icon} ${check.name}`);
207
+ console.log(` ${check.detail}`);
208
+ }
209
+ console.log(`\n Score: ${score}% | Pass: ${passCount} | Warn: ${warnCount} | Fail: ${failCount}\n`);
210
+ }
211
+ }
212
+ //# sourceMappingURL=deploy-readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-readiness.js","sourceRoot":"","sources":["../../src/commands/deploy-readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Finding contest — gamified challenge mode where developers compete
3
+ * to fix the most findings in a codebase within a time window.
4
+ *
5
+ * Results stored locally in `.judges-contests/`.
6
+ */
7
+ export declare function runFindingContest(argv: string[]): void;
8
+ //# sourceMappingURL=finding-contest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-contest.d.ts","sourceRoot":"","sources":["../../src/commands/finding-contest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuKtD"}