@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.
- package/CHANGELOG.md +24 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +112 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/approve-chain.d.ts +8 -0
- package/dist/commands/approve-chain.d.ts.map +1 -0
- package/dist/commands/approve-chain.js +235 -0
- package/dist/commands/approve-chain.js.map +1 -0
- package/dist/commands/build-optimize.d.ts +7 -0
- package/dist/commands/build-optimize.d.ts.map +1 -0
- package/dist/commands/build-optimize.js +257 -0
- package/dist/commands/build-optimize.js.map +1 -0
- package/dist/commands/coach-mode.d.ts +8 -0
- package/dist/commands/coach-mode.d.ts.map +1 -0
- package/dist/commands/coach-mode.js +230 -0
- package/dist/commands/coach-mode.js.map +1 -0
- package/dist/commands/commit-hygiene.d.ts +6 -0
- package/dist/commands/commit-hygiene.d.ts.map +1 -0
- package/dist/commands/commit-hygiene.js +176 -0
- package/dist/commands/commit-hygiene.js.map +1 -0
- package/dist/commands/context-inject.d.ts +9 -0
- package/dist/commands/context-inject.d.ts.map +1 -0
- package/dist/commands/context-inject.js +212 -0
- package/dist/commands/context-inject.js.map +1 -0
- package/dist/commands/deploy-readiness.d.ts +6 -0
- package/dist/commands/deploy-readiness.d.ts.map +1 -0
- package/dist/commands/deploy-readiness.js +212 -0
- package/dist/commands/deploy-readiness.js.map +1 -0
- package/dist/commands/finding-contest.d.ts +8 -0
- package/dist/commands/finding-contest.d.ts.map +1 -0
- package/dist/commands/finding-contest.js +193 -0
- package/dist/commands/finding-contest.js.map +1 -0
- package/dist/commands/habit-tracker.d.ts +8 -0
- package/dist/commands/habit-tracker.d.ts.map +1 -0
- package/dist/commands/habit-tracker.js +195 -0
- package/dist/commands/habit-tracker.js.map +1 -0
- package/dist/commands/migration-safety.d.ts +6 -0
- package/dist/commands/migration-safety.d.ts.map +1 -0
- package/dist/commands/migration-safety.js +257 -0
- package/dist/commands/migration-safety.js.map +1 -0
- package/dist/commands/observability-gap.d.ts +6 -0
- package/dist/commands/observability-gap.d.ts.map +1 -0
- package/dist/commands/observability-gap.js +212 -0
- package/dist/commands/observability-gap.js.map +1 -0
- package/dist/commands/prompt-replay.d.ts +8 -0
- package/dist/commands/prompt-replay.d.ts.map +1 -0
- package/dist/commands/prompt-replay.js +177 -0
- package/dist/commands/prompt-replay.js.map +1 -0
- package/dist/commands/review-replay.d.ts +9 -0
- package/dist/commands/review-replay.d.ts.map +1 -0
- package/dist/commands/review-replay.js +265 -0
- package/dist/commands/review-replay.js.map +1 -0
- package/dist/commands/rollback-safety.d.ts +5 -0
- package/dist/commands/rollback-safety.d.ts.map +1 -0
- package/dist/commands/rollback-safety.js +192 -0
- package/dist/commands/rollback-safety.js.map +1 -0
- package/dist/commands/secret-age.d.ts +6 -0
- package/dist/commands/secret-age.d.ts.map +1 -0
- package/dist/commands/secret-age.js +215 -0
- package/dist/commands/secret-age.js.map +1 -0
- package/dist/commands/snippet-eval.d.ts +8 -0
- package/dist/commands/snippet-eval.d.ts.map +1 -0
- package/dist/commands/snippet-eval.js +224 -0
- package/dist/commands/snippet-eval.js.map +1 -0
- package/dist/commands/test-quality.d.ts +6 -0
- package/dist/commands/test-quality.d.ts.map +1 -0
- package/dist/commands/test-quality.js +161 -0
- package/dist/commands/test-quality.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -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 @@
|
|
|
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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability gap — detect missing metrics, traces, and structured logs
|
|
3
|
+
* at critical code paths.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
6
|
+
import { join, extname } from "path";
|
|
7
|
+
// ─── File Collection ────────────────────────────────────────────────────────
|
|
8
|
+
const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".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
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
42
|
+
function analyzeFile(filepath) {
|
|
43
|
+
const gaps = [];
|
|
44
|
+
let content;
|
|
45
|
+
try {
|
|
46
|
+
content = readFileSync(filepath, "utf-8");
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return gaps;
|
|
50
|
+
}
|
|
51
|
+
const lines = content.split("\n");
|
|
52
|
+
// Track context for scoped analysis
|
|
53
|
+
let inCatchBlock = false;
|
|
54
|
+
let catchStart = 0;
|
|
55
|
+
let inRouteHandler = false;
|
|
56
|
+
let routeStart = 0;
|
|
57
|
+
for (let i = 0; i < lines.length; i++) {
|
|
58
|
+
const line = lines[i];
|
|
59
|
+
// Detect catch blocks
|
|
60
|
+
if (/\bcatch\s*\(/.test(line)) {
|
|
61
|
+
inCatchBlock = true;
|
|
62
|
+
catchStart = i;
|
|
63
|
+
}
|
|
64
|
+
if (inCatchBlock && i - catchStart > 10)
|
|
65
|
+
inCatchBlock = false;
|
|
66
|
+
// Catch without logging
|
|
67
|
+
if (inCatchBlock && /\bcatch\s*\(/.test(line)) {
|
|
68
|
+
const block = lines.slice(i, Math.min(i + 8, lines.length)).join("\n");
|
|
69
|
+
if (!/log|logger|console\.(error|warn|log)|logging|slog|zerolog|println|print/i.test(block)) {
|
|
70
|
+
gaps.push({
|
|
71
|
+
file: filepath,
|
|
72
|
+
line: i + 1,
|
|
73
|
+
gap: "Silent catch block",
|
|
74
|
+
severity: "high",
|
|
75
|
+
suggestion: "Log error details with context (request ID, user, operation)",
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Detect route/endpoint handlers
|
|
80
|
+
if (/\.(get|post|put|delete|patch)\s*\(\s*['"]\//.test(line) ||
|
|
81
|
+
/@(Get|Post|Put|Delete|Patch)Mapping/.test(line) ||
|
|
82
|
+
/app\.route|@app\.(get|post|put|delete)/.test(line)) {
|
|
83
|
+
inRouteHandler = true;
|
|
84
|
+
routeStart = i;
|
|
85
|
+
}
|
|
86
|
+
if (inRouteHandler && i - routeStart > 30)
|
|
87
|
+
inRouteHandler = false;
|
|
88
|
+
// HTTP handler without latency tracking
|
|
89
|
+
if (inRouteHandler && i === routeStart) {
|
|
90
|
+
const block = lines.slice(i, Math.min(i + 30, lines.length)).join("\n");
|
|
91
|
+
if (!/histogram|timer|latency|duration|perf_hooks|performance\.now|time\.Since|Stopwatch/i.test(block)) {
|
|
92
|
+
gaps.push({
|
|
93
|
+
file: filepath,
|
|
94
|
+
line: i + 1,
|
|
95
|
+
gap: "Endpoint without latency metrics",
|
|
96
|
+
severity: "medium",
|
|
97
|
+
suggestion: "Add response-time histogram/metric for SLO monitoring",
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// External calls without tracing
|
|
102
|
+
if (/fetch\(|axios\.|http\.request|httpClient|requests\.(get|post)|gorequest|reqwest/i.test(line)) {
|
|
103
|
+
const surrounding = lines.slice(Math.max(0, i - 3), Math.min(i + 3, lines.length)).join("\n");
|
|
104
|
+
if (!/trace|span|opentelemetry|tracing|X-Request-Id|correlation.?id|traceparent/i.test(surrounding)) {
|
|
105
|
+
gaps.push({
|
|
106
|
+
file: filepath,
|
|
107
|
+
line: i + 1,
|
|
108
|
+
gap: "Outbound call without trace propagation",
|
|
109
|
+
severity: "medium",
|
|
110
|
+
suggestion: "Propagate trace context (traceparent header) for distributed tracing",
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Background/scheduled jobs without heartbeat
|
|
115
|
+
if (/setInterval|cron\.schedule|@Scheduled|BackgroundJob|celery|sidekiq/i.test(line)) {
|
|
116
|
+
const surrounding = lines.slice(i, Math.min(i + 15, lines.length)).join("\n");
|
|
117
|
+
if (!/heartbeat|health|alive|lastRun|metric|gauge/i.test(surrounding)) {
|
|
118
|
+
gaps.push({
|
|
119
|
+
file: filepath,
|
|
120
|
+
line: i + 1,
|
|
121
|
+
gap: "Background job without heartbeat",
|
|
122
|
+
severity: "high",
|
|
123
|
+
suggestion: "Emit heartbeat metric or last-run timestamp for alerting",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Database queries without instrumentation
|
|
128
|
+
if (/\.query\s*\(|\.execute\s*\(|\.raw\s*\(|cursor\.execute|db\.Exec|sqlx/i.test(line)) {
|
|
129
|
+
const surrounding = lines.slice(Math.max(0, i - 2), Math.min(i + 5, lines.length)).join("\n");
|
|
130
|
+
if (!/span|trace|metric|histogram|timer|duration|slow.?query/i.test(surrounding)) {
|
|
131
|
+
gaps.push({
|
|
132
|
+
file: filepath,
|
|
133
|
+
line: i + 1,
|
|
134
|
+
gap: "DB query without instrumentation",
|
|
135
|
+
severity: "low",
|
|
136
|
+
suggestion: "Add query timing to detect slow queries",
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Queue/message consumers without metrics
|
|
141
|
+
if (/\.consume\s*\(|\.subscribe\s*\(|@RabbitListener|@KafkaListener|on\s*\(\s*['"]message['"]\s*\)/i.test(line)) {
|
|
142
|
+
const surrounding = lines.slice(i, Math.min(i + 15, lines.length)).join("\n");
|
|
143
|
+
if (!/metric|counter|gauge|processed|lag|backlog/i.test(surrounding)) {
|
|
144
|
+
gaps.push({
|
|
145
|
+
file: filepath,
|
|
146
|
+
line: i + 1,
|
|
147
|
+
gap: "Message consumer without processing metrics",
|
|
148
|
+
severity: "medium",
|
|
149
|
+
suggestion: "Track message processing rate, lag, and error counters",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return gaps;
|
|
155
|
+
}
|
|
156
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
157
|
+
export function runObservabilityGap(argv) {
|
|
158
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
159
|
+
console.log(`
|
|
160
|
+
judges observability-gap — Detect missing instrumentation at critical paths
|
|
161
|
+
|
|
162
|
+
Usage:
|
|
163
|
+
judges observability-gap [dir]
|
|
164
|
+
judges observability-gap src/ --format json
|
|
165
|
+
|
|
166
|
+
Options:
|
|
167
|
+
[dir] Directory to scan (default: .)
|
|
168
|
+
--format json JSON output
|
|
169
|
+
--help, -h Show this help
|
|
170
|
+
|
|
171
|
+
Detects: silent catch blocks, endpoints without latency metrics, outbound calls
|
|
172
|
+
without trace propagation, background jobs without heartbeats, DB queries without
|
|
173
|
+
instrumentation, message consumers without processing metrics.
|
|
174
|
+
`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
178
|
+
const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
|
|
179
|
+
const files = collectFiles(dir);
|
|
180
|
+
const allGaps = [];
|
|
181
|
+
for (const f of files)
|
|
182
|
+
allGaps.push(...analyzeFile(f));
|
|
183
|
+
const highCount = allGaps.filter((g) => g.severity === "high").length;
|
|
184
|
+
const medCount = allGaps.filter((g) => g.severity === "medium").length;
|
|
185
|
+
const score = Math.max(0, 100 - highCount * 10 - medCount * 5);
|
|
186
|
+
if (format === "json") {
|
|
187
|
+
console.log(JSON.stringify({
|
|
188
|
+
gaps: allGaps,
|
|
189
|
+
score,
|
|
190
|
+
summary: { high: highCount, medium: medCount, total: allGaps.length },
|
|
191
|
+
timestamp: new Date().toISOString(),
|
|
192
|
+
}, null, 2));
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
const badge = score >= 80 ? "✅ WELL INSTRUMENTED" : score >= 50 ? "⚠️ GAPS FOUND" : "❌ BLIND SPOTS";
|
|
196
|
+
console.log(`\n Observability: ${badge} (${score}/100)\n ──────────────────────────────`);
|
|
197
|
+
if (allGaps.length === 0) {
|
|
198
|
+
console.log(" No observability gaps detected.\n");
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
for (const g of allGaps.slice(0, 25)) {
|
|
202
|
+
const icon = g.severity === "high" ? "🔴" : g.severity === "medium" ? "🟡" : "🔵";
|
|
203
|
+
console.log(` ${icon} ${g.gap}`);
|
|
204
|
+
console.log(` ${g.file}:${g.line}`);
|
|
205
|
+
console.log(` → ${g.suggestion}`);
|
|
206
|
+
}
|
|
207
|
+
if (allGaps.length > 25)
|
|
208
|
+
console.log(` ... and ${allGaps.length - 25} more`);
|
|
209
|
+
console.log(`\n Total: ${allGaps.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=observability-gap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability-gap.js","sourceRoot":"","sources":["../../src/commands/observability-gap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt replay — reverse-engineer the probable AI prompt that generated
|
|
3
|
+
* flagged code and suggest improved prompts that produce compliant output.
|
|
4
|
+
*
|
|
5
|
+
* Turns Judges into a prompt engineering coach.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runPromptReplay(argv: string[]): void;
|
|
8
|
+
//# sourceMappingURL=prompt-replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-replay.d.ts","sourceRoot":"","sources":["../../src/commands/prompt-replay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+IH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsEpD"}
|