@kevinrabun/judges 3.54.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 (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/build-optimize.d.ts +7 -0
  6. package/dist/commands/build-optimize.d.ts.map +1 -0
  7. package/dist/commands/build-optimize.js +257 -0
  8. package/dist/commands/build-optimize.js.map +1 -0
  9. package/dist/commands/commit-hygiene.d.ts +6 -0
  10. package/dist/commands/commit-hygiene.d.ts.map +1 -0
  11. package/dist/commands/commit-hygiene.js +176 -0
  12. package/dist/commands/commit-hygiene.js.map +1 -0
  13. package/dist/commands/deploy-readiness.d.ts +6 -0
  14. package/dist/commands/deploy-readiness.d.ts.map +1 -0
  15. package/dist/commands/deploy-readiness.js +212 -0
  16. package/dist/commands/deploy-readiness.js.map +1 -0
  17. package/dist/commands/migration-safety.d.ts +6 -0
  18. package/dist/commands/migration-safety.d.ts.map +1 -0
  19. package/dist/commands/migration-safety.js +257 -0
  20. package/dist/commands/migration-safety.js.map +1 -0
  21. package/dist/commands/observability-gap.d.ts +6 -0
  22. package/dist/commands/observability-gap.d.ts.map +1 -0
  23. package/dist/commands/observability-gap.js +212 -0
  24. package/dist/commands/observability-gap.js.map +1 -0
  25. package/dist/commands/rollback-safety.d.ts +5 -0
  26. package/dist/commands/rollback-safety.d.ts.map +1 -0
  27. package/dist/commands/rollback-safety.js +192 -0
  28. package/dist/commands/rollback-safety.js.map +1 -0
  29. package/dist/commands/secret-age.d.ts +6 -0
  30. package/dist/commands/secret-age.d.ts.map +1 -0
  31. package/dist/commands/secret-age.js +215 -0
  32. package/dist/commands/secret-age.js.map +1 -0
  33. package/dist/commands/test-quality.d.ts +6 -0
  34. package/dist/commands/test-quality.d.ts.map +1 -0
  35. package/dist/commands/test-quality.js +161 -0
  36. package/dist/commands/test-quality.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -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,6 @@
1
+ /**
2
+ * Migration safety — validate framework/language migration PRs for
3
+ * compatibility gaps, data-loss risks, and breaking changes.
4
+ */
5
+ export declare function runMigrationSafety(argv: string[]): void;
6
+ //# sourceMappingURL=migration-safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-safety.d.ts","sourceRoot":"","sources":["../../src/commands/migration-safety.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsNH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2EvD"}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Migration safety — validate framework/language migration PRs for
3
+ * compatibility gaps, data-loss risks, and breaking changes.
4
+ */
5
+ import { readFileSync, readdirSync, statSync } from "fs";
6
+ import { join, extname } from "path";
7
+ // ─── File Collection ────────────────────────────────────────────────────────
8
+ const CODE_EXTS = new Set([
9
+ ".ts",
10
+ ".tsx",
11
+ ".js",
12
+ ".jsx",
13
+ ".mjs",
14
+ ".cjs",
15
+ ".py",
16
+ ".java",
17
+ ".go",
18
+ ".rs",
19
+ ".json",
20
+ ".yaml",
21
+ ".yml",
22
+ ]);
23
+ function collectFiles(dir, max = 300) {
24
+ const files = [];
25
+ function walk(d) {
26
+ if (files.length >= max)
27
+ return;
28
+ let entries;
29
+ try {
30
+ entries = readdirSync(d);
31
+ }
32
+ catch {
33
+ return;
34
+ }
35
+ for (const e of entries) {
36
+ if (files.length >= max)
37
+ return;
38
+ if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
39
+ continue;
40
+ const full = join(d, e);
41
+ try {
42
+ if (statSync(full).isDirectory())
43
+ walk(full);
44
+ else if (CODE_EXTS.has(extname(full)))
45
+ files.push(full);
46
+ }
47
+ catch {
48
+ /* skip */
49
+ }
50
+ }
51
+ }
52
+ walk(dir);
53
+ return files;
54
+ }
55
+ // ─── Analysis ───────────────────────────────────────────────────────────────
56
+ const MIGRATION_PATTERNS = [
57
+ // Framework migrations
58
+ {
59
+ pattern: /(?:from|import)\s+['"]react-router(?:-dom)?['"]/i,
60
+ risk: "React Router migration",
61
+ severity: "high",
62
+ detail: "React Router v5→v6: <Switch> replaced by <Routes>, useHistory→useNavigate",
63
+ },
64
+ {
65
+ pattern: /(?:from|import)\s+['"]@angular\/(?:core|common)['"]/i,
66
+ risk: "Angular version migration",
67
+ severity: "high",
68
+ detail: "Angular major versions change DI, module system, and template syntax",
69
+ },
70
+ {
71
+ pattern: /(?:from|import)\s+['"]vue['"]/i,
72
+ risk: "Vue migration",
73
+ severity: "high",
74
+ detail: "Vue 2→3: Options API defaults change, Composition API, Proxy-based reactivity",
75
+ },
76
+ {
77
+ pattern: /(?:from|import)\s+['"]express['"].*(?:from|import)\s+['"]fastify['"]/is,
78
+ risk: "Express→Fastify migration",
79
+ severity: "high",
80
+ detail: "Middleware model differs — req/res API changes, plugin system replaces middleware chain",
81
+ },
82
+ // TypeScript/JavaScript evolution
83
+ {
84
+ pattern: /require\s*\(.*\).*(?:import|from).*['"]/i,
85
+ risk: "CJS/ESM mixed imports",
86
+ severity: "medium",
87
+ detail: "Mixed require() and import — choose one module system",
88
+ },
89
+ {
90
+ pattern: /"type"\s*:\s*"module"/i,
91
+ risk: "ESM migration",
92
+ severity: "medium",
93
+ detail: "ESM migration: ensure all imports have extensions, __dirname unavailable",
94
+ },
95
+ // Database migrations
96
+ {
97
+ pattern: /(?:ALTER|DROP)\s+(?:TABLE|COLUMN|INDEX)/i,
98
+ risk: "Schema migration",
99
+ severity: "critical",
100
+ detail: "Schema changes may lose data — run on copy first, verify rollback",
101
+ },
102
+ {
103
+ pattern: /(?:mongoose|sequelize|typeorm|prisma).*(?:migrate|migration)/i,
104
+ risk: "ORM migration",
105
+ severity: "high",
106
+ detail: "ORM migrations may have different default behaviors across versions",
107
+ },
108
+ // Config format changes
109
+ {
110
+ pattern: /(?:webpack|rollup|vite|esbuild|parcel).*(?:config|\.config)/i,
111
+ risk: "Bundler migration",
112
+ severity: "medium",
113
+ detail: "Bundler configs are not portable — verify plugin equivalents",
114
+ },
115
+ // API surface changes
116
+ {
117
+ pattern: /deprecated|@deprecated|TODO.*migrate|FIXME.*upgrade/i,
118
+ risk: "Deprecated API usage",
119
+ severity: "medium",
120
+ detail: "Deprecated APIs may be removed in next version — update now",
121
+ },
122
+ // Runtime changes
123
+ {
124
+ pattern: /engines.*node.*['"]\d+/i,
125
+ risk: "Node.js version requirement",
126
+ severity: "high",
127
+ detail: "Node version changes affect API availability, performance, and security",
128
+ },
129
+ {
130
+ pattern: /python_requires.*['"]\s*>=?\s*3\./i,
131
+ risk: "Python version requirement",
132
+ severity: "high",
133
+ detail: "Python version changes affect syntax, stdlib, and type hints",
134
+ },
135
+ // Data serialization changes
136
+ {
137
+ pattern: /(?:protobuf|proto3|avro|thrift).*(?:schema|definition)/i,
138
+ risk: "Serialization schema change",
139
+ severity: "critical",
140
+ detail: "Schema changes can break wire compatibility — ensure backward compat",
141
+ },
142
+ // Authentication changes
143
+ {
144
+ pattern: /(?:passport|auth0|firebase[.-]auth|cognito).*(?:migrate|upgrade|v\d)/i,
145
+ risk: "Auth provider migration",
146
+ severity: "critical",
147
+ detail: "Auth migrations risk locking out users — run parallel during transition",
148
+ },
149
+ ];
150
+ function analyzeFile(filepath) {
151
+ const risks = [];
152
+ let content;
153
+ try {
154
+ content = readFileSync(filepath, "utf-8");
155
+ }
156
+ catch {
157
+ return risks;
158
+ }
159
+ const lines = content.split("\n");
160
+ for (let i = 0; i < lines.length; i++) {
161
+ for (const mp of MIGRATION_PATTERNS) {
162
+ if (mp.pattern.test(lines[i])) {
163
+ risks.push({ file: filepath, line: i + 1, risk: mp.risk, severity: mp.severity, detail: mp.detail });
164
+ break; // One finding per line
165
+ }
166
+ }
167
+ }
168
+ return risks;
169
+ }
170
+ function detectMigrationContext(dir) {
171
+ const signals = [];
172
+ const files = collectFiles(dir, 50);
173
+ const allContent = files
174
+ .map((f) => {
175
+ try {
176
+ return readFileSync(f, "utf-8");
177
+ }
178
+ catch {
179
+ return "";
180
+ }
181
+ })
182
+ .join("\n");
183
+ if (/codemod|jscodeshift|ast-grep/i.test(allContent))
184
+ signals.push("Codemod tooling detected — automated migration in progress");
185
+ if (/compatibility|compat|shim|polyfill/i.test(allContent))
186
+ signals.push("Compatibility layer/shim detected");
187
+ if (/canary|feature.?flag|gradual.?rollout/i.test(allContent))
188
+ signals.push("Gradual rollout strategy detected");
189
+ if (/(?:upgrade|migration).?guide|MIGRATION/i.test(allContent))
190
+ signals.push("Migration guide referenced");
191
+ return signals;
192
+ }
193
+ // ─── CLI ────────────────────────────────────────────────────────────────────
194
+ export function runMigrationSafety(argv) {
195
+ if (argv.includes("--help") || argv.includes("-h")) {
196
+ console.log(`
197
+ judges migration-safety — Validate migration PRs for compatibility and data-loss risks
198
+
199
+ Usage:
200
+ judges migration-safety [dir]
201
+ judges migration-safety src/ --format json
202
+
203
+ Options:
204
+ [dir] Directory to scan (default: .)
205
+ --format json JSON output
206
+ --help, -h Show this help
207
+
208
+ Detects: framework version breaks, CJS/ESM mixed imports, schema migrations,
209
+ bundler config changes, deprecated APIs, runtime version changes, serialization
210
+ schema breaks, auth provider migrations.
211
+ `);
212
+ return;
213
+ }
214
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
215
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
216
+ const files = collectFiles(dir);
217
+ const allRisks = [];
218
+ for (const f of files)
219
+ allRisks.push(...analyzeFile(f));
220
+ const signals = detectMigrationContext(dir);
221
+ const critCount = allRisks.filter((r) => r.severity === "critical").length;
222
+ const highCount = allRisks.filter((r) => r.severity === "high").length;
223
+ const score = allRisks.length === 0 ? 100 : Math.max(0, 100 - critCount * 20 - highCount * 8);
224
+ if (format === "json") {
225
+ console.log(JSON.stringify({
226
+ risks: allRisks,
227
+ signals,
228
+ score,
229
+ summary: { critical: critCount, high: highCount, total: allRisks.length },
230
+ timestamp: new Date().toISOString(),
231
+ }, null, 2));
232
+ }
233
+ else {
234
+ const badge = critCount > 0 ? "🚫 HIGH RISK" : highCount > 2 ? "⚠️ CAUTION" : "✅ SAFE";
235
+ console.log(`\n Migration Safety: ${badge} (${score}/100)\n ─────────────────────────────`);
236
+ if (signals.length > 0) {
237
+ console.log("\n Context:");
238
+ for (const s of signals)
239
+ console.log(` 📌 ${s}`);
240
+ }
241
+ if (allRisks.length === 0) {
242
+ console.log("\n No migration risks detected.\n");
243
+ return;
244
+ }
245
+ console.log("\n Risks:");
246
+ for (const r of allRisks.slice(0, 25)) {
247
+ const icon = r.severity === "critical" ? "🚫" : r.severity === "high" ? "🔴" : "🟡";
248
+ console.log(` ${icon} [${r.severity.toUpperCase()}] ${r.risk}`);
249
+ console.log(` ${r.file}:${r.line}`);
250
+ console.log(` ${r.detail}`);
251
+ }
252
+ if (allRisks.length > 25)
253
+ console.log(` ... and ${allRisks.length - 25} more`);
254
+ console.log(`\n Total: ${allRisks.length} | Critical: ${critCount} | High: ${highCount} | Score: ${score}/100\n`);
255
+ }
256
+ }
257
+ //# sourceMappingURL=migration-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-safety.js","sourceRoot":"","sources":["../../src/commands/migration-safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Observability gap — detect missing metrics, traces, and structured logs
3
+ * at critical code paths.
4
+ */
5
+ export declare function runObservabilityGap(argv: string[]): void;
6
+ //# sourceMappingURL=observability-gap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-gap.d.ts","sourceRoot":"","sources":["../../src/commands/observability-gap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+KH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgExD"}