@sentry/warden 0.9.0 → 0.11.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/.mcp.json +8 -0
- package/README.md +4 -0
- package/agents.toml +7 -0
- package/conductor.json +8 -0
- package/dist/cli/fix.d.ts +3 -1
- package/dist/cli/fix.d.ts.map +1 -1
- package/dist/cli/fix.js +91 -59
- package/dist/cli/fix.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +29 -8
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output/ink-runner.d.ts +6 -17
- package/dist/cli/output/ink-runner.d.ts.map +1 -1
- package/dist/cli/output/ink-runner.js +138 -122
- package/dist/cli/output/ink-runner.js.map +1 -1
- package/dist/cli/output/jsonl.d.ts +211 -58
- package/dist/cli/output/jsonl.d.ts.map +1 -1
- package/dist/cli/output/jsonl.js +81 -4
- package/dist/cli/output/jsonl.js.map +1 -1
- package/dist/cli/output/reporter.d.ts +7 -3
- package/dist/cli/output/reporter.d.ts.map +1 -1
- package/dist/cli/output/reporter.js +15 -1
- package/dist/cli/output/reporter.js.map +1 -1
- package/dist/cli/output/tasks.d.ts +10 -1
- package/dist/cli/output/tasks.d.ts.map +1 -1
- package/dist/cli/output/tasks.js +145 -32
- package/dist/cli/output/tasks.js.map +1 -1
- package/dist/cli/terminal.d.ts +7 -1
- package/dist/cli/terminal.d.ts.map +1 -1
- package/dist/cli/terminal.js +31 -9
- package/dist/cli/terminal.js.map +1 -1
- package/dist/config/schema.d.ts +3 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +3 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/evals/index.d.ts +22 -0
- package/dist/evals/index.d.ts.map +1 -0
- package/dist/evals/index.js +92 -0
- package/dist/evals/index.js.map +1 -0
- package/dist/evals/judge.d.ts +12 -0
- package/dist/evals/judge.d.ts.map +1 -0
- package/dist/evals/judge.js +171 -0
- package/dist/evals/judge.js.map +1 -0
- package/dist/evals/runner.d.ts +18 -0
- package/dist/evals/runner.d.ts.map +1 -0
- package/dist/evals/runner.js +133 -0
- package/dist/evals/runner.js.map +1 -0
- package/dist/{examples → evals}/setup.d.ts.map +1 -1
- package/dist/evals/setup.js.map +1 -0
- package/dist/evals/types.d.ts +166 -0
- package/dist/evals/types.d.ts.map +1 -0
- package/dist/evals/types.js +134 -0
- package/dist/evals/types.js.map +1 -0
- package/dist/output/dedup.d.ts.map +1 -1
- package/dist/output/dedup.js +29 -57
- package/dist/output/dedup.js.map +1 -1
- package/dist/output/github-checks.d.ts.map +1 -1
- package/dist/output/github-checks.js +37 -8
- package/dist/output/github-checks.js.map +1 -1
- package/dist/output/renderer.d.ts.map +1 -1
- package/dist/output/renderer.js +16 -1
- package/dist/output/renderer.js.map +1 -1
- package/dist/output/stale.d.ts +1 -0
- package/dist/output/stale.d.ts.map +1 -1
- package/dist/output/stale.js +14 -8
- package/dist/output/stale.js.map +1 -1
- package/dist/sdk/analyze.d.ts +11 -0
- package/dist/sdk/analyze.d.ts.map +1 -1
- package/dist/sdk/analyze.js +99 -19
- package/dist/sdk/analyze.js.map +1 -1
- package/dist/sdk/extract.d.ts +54 -0
- package/dist/sdk/extract.d.ts.map +1 -1
- package/dist/sdk/extract.js +175 -2
- package/dist/sdk/extract.js.map +1 -1
- package/dist/sdk/model-pricing.json +6 -12
- package/dist/sdk/prompt.d.ts +2 -0
- package/dist/sdk/prompt.d.ts.map +1 -1
- package/dist/sdk/prompt.js +18 -8
- package/dist/sdk/prompt.js.map +1 -1
- package/dist/sdk/runner.d.ts +2 -2
- package/dist/sdk/runner.d.ts.map +1 -1
- package/dist/sdk/runner.js +1 -1
- package/dist/sdk/runner.js.map +1 -1
- package/dist/sdk/types.d.ts +11 -3
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/sdk/types.js +1 -1
- package/dist/sdk/types.js.map +1 -1
- package/dist/sentry.d.ts +15 -0
- package/dist/sentry.d.ts.map +1 -1
- package/dist/sentry.js +40 -1
- package/dist/sentry.js.map +1 -1
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +25 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/async.d.ts +14 -0
- package/dist/utils/async.d.ts.map +1 -1
- package/dist/utils/async.js +33 -0
- package/dist/utils/async.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/evals/README.md +154 -0
- package/evals/bug-detection.yaml +56 -0
- package/evals/fixtures/ignores-style-issues/utils.ts +48 -0
- package/evals/fixtures/missing-await/cache.ts +45 -0
- package/evals/fixtures/null-property-access/handler.ts +36 -0
- package/evals/fixtures/off-by-one/paginator.ts +38 -0
- package/evals/fixtures/sql-injection/api.ts +59 -0
- package/evals/fixtures/stale-closure/counter.tsx +33 -0
- package/evals/fixtures/wrong-comparison/validator.ts +52 -0
- package/evals/fixtures/xss-reflected/server.ts +55 -0
- package/evals/precision.yaml +15 -0
- package/evals/security-scanning.yaml +24 -0
- package/evals/skills/bug-detection.md +33 -0
- package/evals/skills/precision.md +18 -0
- package/evals/skills/security-scanning.md +32 -0
- package/package.json +4 -2
- package/dist/examples/index.d.ts +0 -50
- package/dist/examples/index.d.ts.map +0 -1
- package/dist/examples/index.js +0 -104
- package/dist/examples/index.js.map +0 -1
- package/dist/examples/setup.js.map +0 -1
- /package/dist/{examples → evals}/setup.d.ts +0 -0
- /package/dist/{examples → evals}/setup.js +0 -0
package/dist/sentry.js
CHANGED
|
@@ -19,11 +19,41 @@ export function initSentry(context) {
|
|
|
19
19
|
Sentry.httpIntegration(),
|
|
20
20
|
],
|
|
21
21
|
});
|
|
22
|
-
Sentry.setTag('deployment.context', context);
|
|
23
22
|
Sentry.setTag('service.version', getVersion());
|
|
23
|
+
Sentry.getGlobalScope().setAttributes({
|
|
24
|
+
'warden.source': context === 'action' ? 'github-action' : 'cli',
|
|
25
|
+
});
|
|
24
26
|
}
|
|
25
27
|
export { Sentry };
|
|
26
28
|
export const { logger } = Sentry;
|
|
29
|
+
/**
|
|
30
|
+
* Set attributes on the global Sentry scope.
|
|
31
|
+
* These automatically apply to ALL metrics and spans.
|
|
32
|
+
*/
|
|
33
|
+
export function setGlobalAttributes(attrs) {
|
|
34
|
+
if (!initialized)
|
|
35
|
+
return;
|
|
36
|
+
try {
|
|
37
|
+
Sentry.getGlobalScope().setAttributes(attrs);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Never break the workflow
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the trace ID from the active span, if available.
|
|
45
|
+
* Useful for correlating runs to Sentry traces in logs and output.
|
|
46
|
+
*/
|
|
47
|
+
export function getTraceId() {
|
|
48
|
+
if (!initialized)
|
|
49
|
+
return undefined;
|
|
50
|
+
try {
|
|
51
|
+
return Sentry.getActiveSpan()?.spanContext().traceId;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
27
57
|
/**
|
|
28
58
|
* Run a metrics callback only when Sentry is initialized.
|
|
29
59
|
* Swallows errors so metrics never break the main workflow.
|
|
@@ -38,6 +68,15 @@ function safeEmit(fn) {
|
|
|
38
68
|
// Metrics emission should never break the main workflow
|
|
39
69
|
}
|
|
40
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Emit a single run count. Call once per analysis workflow execution.
|
|
73
|
+
* Inherits warden.source and warden.repository from global scope.
|
|
74
|
+
*/
|
|
75
|
+
export function emitRunMetric() {
|
|
76
|
+
safeEmit(() => {
|
|
77
|
+
Sentry.metrics.count('workflow.runs', 1);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
41
80
|
export function emitSkillMetrics(report) {
|
|
42
81
|
safeEmit(() => {
|
|
43
82
|
const attrs = { skill: report.skill };
|
package/dist/sentry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentry.js","sourceRoot":"","sources":["../src/sentry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,MAAM,UAAU,UAAU,CAAC,OAAsB;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,IAAI,WAAW;QAAE,OAAO;IAChC,WAAW,GAAG,IAAI,CAAC;IAEnB,MAAM,CAAC,IAAI,CAAC;QACV,GAAG;QACH,OAAO,EAAE,UAAU,UAAU,EAAE,EAAE;QACjC,WAAW,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK;QAC3D,gBAAgB,EAAE,GAAG;QACrB,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE;YACZ,MAAM,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,sBAAsB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;YAC1E,MAAM,CAAC,eAAe,EAAE;SACzB;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"sentry.js","sourceRoot":"","sources":["../src/sentry.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -70,6 +70,11 @@ export declare const FindingSchema: z.ZodObject<{
|
|
|
70
70
|
startLine: z.ZodNumber;
|
|
71
71
|
endLine: z.ZodOptional<z.ZodNumber>;
|
|
72
72
|
}, z.core.$strip>>;
|
|
73
|
+
additionalLocations: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
74
|
+
path: z.ZodString;
|
|
75
|
+
startLine: z.ZodNumber;
|
|
76
|
+
endLine: z.ZodOptional<z.ZodNumber>;
|
|
77
|
+
}, z.core.$strip>>>;
|
|
73
78
|
suggestedFix: z.ZodOptional<z.ZodObject<{
|
|
74
79
|
description: z.ZodString;
|
|
75
80
|
diff: z.ZodString;
|
|
@@ -77,6 +82,15 @@ export declare const FindingSchema: z.ZodObject<{
|
|
|
77
82
|
elapsedMs: z.ZodOptional<z.ZodNumber>;
|
|
78
83
|
}, z.core.$strip>;
|
|
79
84
|
export type Finding = z.infer<typeof FindingSchema>;
|
|
85
|
+
/**
|
|
86
|
+
* Get the effective line number for a finding (endLine if present, otherwise startLine).
|
|
87
|
+
*/
|
|
88
|
+
export declare function findingLine(f: Finding): number;
|
|
89
|
+
/**
|
|
90
|
+
* Compare two findings by priority for winner selection.
|
|
91
|
+
* Lower return value = higher priority (more severe, more confident, earlier path/line).
|
|
92
|
+
*/
|
|
93
|
+
export declare function compareFindingPriority(a: Finding, b: Finding): number;
|
|
80
94
|
export declare const UsageStatsSchema: z.ZodObject<{
|
|
81
95
|
inputTokens: z.ZodNumber;
|
|
82
96
|
outputTokens: z.ZodNumber;
|
|
@@ -139,6 +153,11 @@ export declare const SkillReportSchema: z.ZodObject<{
|
|
|
139
153
|
startLine: z.ZodNumber;
|
|
140
154
|
endLine: z.ZodOptional<z.ZodNumber>;
|
|
141
155
|
}, z.core.$strip>>;
|
|
156
|
+
additionalLocations: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
157
|
+
path: z.ZodString;
|
|
158
|
+
startLine: z.ZodNumber;
|
|
159
|
+
endLine: z.ZodOptional<z.ZodNumber>;
|
|
160
|
+
}, z.core.$strip>>>;
|
|
142
161
|
suggestedFix: z.ZodOptional<z.ZodObject<{
|
|
143
162
|
description: z.ZodString;
|
|
144
163
|
diff: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,cAAc;;;;;;EAAwD,CAAC;AACpF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAGtD,eAAO,MAAM,gBAAgB;;;;EAAoC,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIvD,CAAC;AAGF,eAAO,MAAM,uBAAuB;;;;;;;EAA+D,CAAC;AACpG,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAMnD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,iBAAiB,GAAG,OAAO,EAAE,CAKtG;AAGD,eAAO,MAAM,cAAc;;;;iBAIzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAGtD,eAAO,MAAM,kBAAkB;;;iBAG7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAG9D,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js
CHANGED
|
@@ -57,9 +57,34 @@ export const FindingSchema = z.object({
|
|
|
57
57
|
title: z.string(),
|
|
58
58
|
description: z.string(),
|
|
59
59
|
location: LocationSchema.optional(),
|
|
60
|
+
additionalLocations: z.array(LocationSchema).optional(),
|
|
60
61
|
suggestedFix: SuggestedFixSchema.optional(),
|
|
61
62
|
elapsedMs: z.number().nonnegative().optional(),
|
|
62
63
|
});
|
|
64
|
+
/**
|
|
65
|
+
* Get the effective line number for a finding (endLine if present, otherwise startLine).
|
|
66
|
+
*/
|
|
67
|
+
export function findingLine(f) {
|
|
68
|
+
return f.location?.endLine ?? f.location?.startLine ?? 0;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Compare two findings by priority for winner selection.
|
|
72
|
+
* Lower return value = higher priority (more severe, more confident, earlier path/line).
|
|
73
|
+
*/
|
|
74
|
+
export function compareFindingPriority(a, b) {
|
|
75
|
+
const sevDiff = SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity];
|
|
76
|
+
if (sevDiff !== 0)
|
|
77
|
+
return sevDiff;
|
|
78
|
+
const confA = CONFIDENCE_ORDER[a.confidence ?? 'low'];
|
|
79
|
+
const confB = CONFIDENCE_ORDER[b.confidence ?? 'low'];
|
|
80
|
+
const confDiff = confA - confB;
|
|
81
|
+
if (confDiff !== 0)
|
|
82
|
+
return confDiff;
|
|
83
|
+
const pathCmp = (a.location?.path ?? '').localeCompare(b.location?.path ?? '');
|
|
84
|
+
if (pathCmp !== 0)
|
|
85
|
+
return pathCmp;
|
|
86
|
+
return findingLine(a) - findingLine(b);
|
|
87
|
+
}
|
|
63
88
|
// Usage statistics from SDK
|
|
64
89
|
export const UsageStatsSchema = z.object({
|
|
65
90
|
inputTokens: z.number().int().nonnegative(),
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/async.d.ts
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A counting semaphore for limiting concurrent access to a shared resource.
|
|
3
|
+
* Callers acquire a permit before starting work and release it when done.
|
|
4
|
+
* If no permits are available, acquire() blocks until one is released.
|
|
5
|
+
*/
|
|
6
|
+
export declare class Semaphore {
|
|
7
|
+
private permits;
|
|
8
|
+
private waiters;
|
|
9
|
+
/** The initial permit count this semaphore was created with. */
|
|
10
|
+
readonly initialPermits: number;
|
|
11
|
+
constructor(permits: number);
|
|
12
|
+
acquire(): Promise<void>;
|
|
13
|
+
release(): void;
|
|
14
|
+
}
|
|
1
15
|
/**
|
|
2
16
|
* Run async work items with a sliding-window concurrency pool.
|
|
3
17
|
* Spawns up to `concurrency` workers that each grab the next
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../src/utils/async.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,CAAC,EAChC,KAAK,EAAE,CAAC,EAAE,EACV,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAA;CAAE,GACxC,OAAO,CAAC,CAAC,EAAE,CAAC,CAmBd;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EACzC,KAAK,EAAE,CAAC,EAAE,EACV,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC3B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,EAAE,CAAC,CAEd"}
|
|
1
|
+
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../src/utils/async.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAsB;IACrC,gEAAgE;IAChE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;gBAEpB,OAAO,EAAE,MAAM;IAKrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,OAAO,IAAI,IAAI;CAQhB;AAED;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,CAAC,EAChC,KAAK,EAAE,CAAC,EAAE,EACV,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAA;CAAE,GACxC,OAAO,CAAC,CAAC,EAAE,CAAC,CAmBd;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EACzC,KAAK,EAAE,CAAC,EAAE,EACV,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC3B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,EAAE,CAAC,CAEd"}
|
package/dist/utils/async.js
CHANGED
|
@@ -1,3 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A counting semaphore for limiting concurrent access to a shared resource.
|
|
3
|
+
* Callers acquire a permit before starting work and release it when done.
|
|
4
|
+
* If no permits are available, acquire() blocks until one is released.
|
|
5
|
+
*/
|
|
6
|
+
export class Semaphore {
|
|
7
|
+
permits;
|
|
8
|
+
waiters = [];
|
|
9
|
+
/** The initial permit count this semaphore was created with. */
|
|
10
|
+
initialPermits;
|
|
11
|
+
constructor(permits) {
|
|
12
|
+
this.permits = permits;
|
|
13
|
+
this.initialPermits = permits;
|
|
14
|
+
}
|
|
15
|
+
async acquire() {
|
|
16
|
+
if (this.permits > 0) {
|
|
17
|
+
this.permits--;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
this.waiters.push(resolve);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
release() {
|
|
25
|
+
const next = this.waiters.shift();
|
|
26
|
+
if (next) {
|
|
27
|
+
next();
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
this.permits++;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
1
34
|
/**
|
|
2
35
|
* Run async work items with a sliding-window concurrency pool.
|
|
3
36
|
* Spawns up to `concurrency` workers that each grab the next
|
package/dist/utils/async.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/utils/async.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAU,EACV,WAAmB,EACnB,EAA0C,EAC1C,OAAyC;IAEzC,MAAM,OAAO,GAAkC,EAAE,CAAC;IAClD,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,UAAU,MAAM;QACnB,OAAO,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,OAAO,EAAE,WAAW,EAAE,EAAE;gBAAE,MAAM;YACpC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAM,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEvE,gCAAgC;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAU,EACV,EAA2B,EAC3B,SAAiB;IAEjB,OAAO,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/utils/async.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,SAAS;IACZ,OAAO,CAAS;IAChB,OAAO,GAAmB,EAAE,CAAC;IACrC,gEAAgE;IACvD,cAAc,CAAS;IAEhC,YAAY,OAAe;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,EAAE,CAAC;QACT,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAU,EACV,WAAmB,EACnB,EAA0C,EAC1C,OAAyC;IAEzC,MAAM,OAAO,GAAkC,EAAE,CAAC;IAClD,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,UAAU,MAAM;QACnB,OAAO,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,OAAO,EAAE,WAAW,EAAE,EAAE;gBAAE,MAAM;YACpC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAM,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEvE,gCAAgC;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAU,EACV,EAA2B,EAC3B,SAAiB;IAEjB,OAAO,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { processInBatches, runPool } from './async.js';
|
|
1
|
+
export { processInBatches, runPool, Semaphore } from './async.js';
|
|
2
2
|
export { getVersion, getMajorVersion } from './version.js';
|
|
3
3
|
export { ExecError, execNonInteractive, execFileNonInteractive, execGitNonInteractive, GIT_NON_INTERACTIVE_ENV, } from './exec.js';
|
|
4
4
|
export type { ExecOptions } from './exec.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+B/C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAEvD"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { processInBatches, runPool } from './async.js';
|
|
1
|
+
export { processInBatches, runPool, Semaphore } from './async.js';
|
|
2
2
|
export { getVersion, getMajorVersion } from './version.js';
|
|
3
3
|
export { ExecError, execNonInteractive, execFileNonInteractive, execGitNonInteractive, GIT_NON_INTERACTIVE_ENV, } from './exec.js';
|
|
4
4
|
/** Default concurrency for parallel trigger/skill execution */
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,WAAW,CAAC;AAGnB,+DAA+D;AAC/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,+DAA+D;IAC/D,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,wFAAwF;IACxF,qEAAqE;IACrE,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;QAC9B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;QAC9B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,SAAS,GAAG,SAAS;SAClB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAEzB,+BAA+B;IAC/B,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9B,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACrF,CAAC"}
|
package/evals/README.md
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# Warden Evals
|
|
2
|
+
|
|
3
|
+
End-to-end behavioral evaluations for the Warden pipeline. These evals verify
|
|
4
|
+
that Warden correctly runs skills, invokes the agent, extracts findings, and
|
|
5
|
+
produces the expected behavioral outcomes on known code.
|
|
6
|
+
|
|
7
|
+
## Philosophy
|
|
8
|
+
|
|
9
|
+
Evals are not unit tests or A/B comparisons. They answer one question:
|
|
10
|
+
|
|
11
|
+
> **Does the Warden pipeline behave correctly when given known inputs?**
|
|
12
|
+
|
|
13
|
+
Each eval provides code with a known issue, runs the full Warden agent pipeline
|
|
14
|
+
(skill loading, prompt construction, SDK invocation, finding extraction), and
|
|
15
|
+
uses an LLM judge to verify the output matches behavioral expectations.
|
|
16
|
+
|
|
17
|
+
Evals test **Warden's behavior**, not individual skills. Skills are used as
|
|
18
|
+
test vehicles to exercise the pipeline.
|
|
19
|
+
|
|
20
|
+
The only thing mocked is the GitHub event payload. Everything else runs for
|
|
21
|
+
real.
|
|
22
|
+
|
|
23
|
+
## YAML Format
|
|
24
|
+
|
|
25
|
+
Evals are defined in YAML files at the top level of `evals/`. Each file
|
|
26
|
+
describes a category of behaviors with a shared test skill and a list of
|
|
27
|
+
scenarios. No custom code per eval. Adding a new eval means adding an entry
|
|
28
|
+
to a YAML file and a fixture file.
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
skill: skills/bug-detection.md
|
|
32
|
+
|
|
33
|
+
evals:
|
|
34
|
+
- name: null-property-access
|
|
35
|
+
given: code that accesses properties on an array .find() result without null checking
|
|
36
|
+
files:
|
|
37
|
+
- fixtures/null-property-access/handler.ts
|
|
38
|
+
should_find:
|
|
39
|
+
- finding: accessing .name on a potentially undefined user object from Array.find()
|
|
40
|
+
severity: high
|
|
41
|
+
should_not_find:
|
|
42
|
+
- style, formatting, or naming issues
|
|
43
|
+
- the lack of try/catch around the fetch call
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
This reads as:
|
|
47
|
+
|
|
48
|
+
> **Given** code that accesses properties on an array `.find()` result without
|
|
49
|
+
> null checking, Warden **should find** a null access bug and **should not
|
|
50
|
+
> find** style issues.
|
|
51
|
+
|
|
52
|
+
## Eval Structure
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
evals/
|
|
56
|
+
├── README.md
|
|
57
|
+
├── bug-detection.yaml # Category: finding logic bugs
|
|
58
|
+
├── security-scanning.yaml # Category: finding security vulnerabilities
|
|
59
|
+
├── precision.yaml # Category: avoiding false positives
|
|
60
|
+
├── skills/ # Test skills (vehicles for exercising pipeline)
|
|
61
|
+
│ ├── bug-detection.md
|
|
62
|
+
│ ├── security-scanning.md
|
|
63
|
+
│ └── precision.md
|
|
64
|
+
└── fixtures/ # Source code with known issues
|
|
65
|
+
├── null-property-access/
|
|
66
|
+
│ └── handler.ts
|
|
67
|
+
├── off-by-one/
|
|
68
|
+
│ └── paginator.ts
|
|
69
|
+
├── missing-await/
|
|
70
|
+
│ └── cache.ts
|
|
71
|
+
├── wrong-comparison/
|
|
72
|
+
│ └── validator.ts
|
|
73
|
+
├── stale-closure/
|
|
74
|
+
│ └── counter.tsx
|
|
75
|
+
├── sql-injection/
|
|
76
|
+
│ └── api.ts
|
|
77
|
+
├── xss-reflected/
|
|
78
|
+
│ └── server.ts
|
|
79
|
+
└── ignores-style-issues/
|
|
80
|
+
└── utils.ts
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## YAML Schema
|
|
84
|
+
|
|
85
|
+
### File-level fields
|
|
86
|
+
|
|
87
|
+
| Field | Required | Description |
|
|
88
|
+
|-------|----------|-------------|
|
|
89
|
+
| `skill` | Yes | Path to test skill, relative to `evals/` |
|
|
90
|
+
| `model` | No | Default model for all evals (default: `claude-sonnet-4-6`) |
|
|
91
|
+
| `evals` | Yes | List of eval scenarios (at least one) |
|
|
92
|
+
|
|
93
|
+
### Per-eval fields
|
|
94
|
+
|
|
95
|
+
| Field | Required | Description |
|
|
96
|
+
|-------|----------|-------------|
|
|
97
|
+
| `name` | Yes | Scenario name (used in test output) |
|
|
98
|
+
| `given` | Yes | What code/situation the eval sets up (BDD "given") |
|
|
99
|
+
| `files` | Yes | Fixture files, relative to `evals/` |
|
|
100
|
+
| `model` | No | Model override for this scenario |
|
|
101
|
+
| `should_find` | Yes | What the pipeline should detect (at least one) |
|
|
102
|
+
| `should_find[].finding` | Yes | Natural language description for the LLM judge |
|
|
103
|
+
| `should_find[].severity` | No | Expected severity (hint, not strict) |
|
|
104
|
+
| `should_find[].required` | No | If true (default), eval fails when not found |
|
|
105
|
+
| `should_not_find` | No | Things the pipeline should NOT report (precision) |
|
|
106
|
+
|
|
107
|
+
## Running Evals
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Run all evals (requires ANTHROPIC_API_KEY)
|
|
111
|
+
pnpm test:evals
|
|
112
|
+
|
|
113
|
+
# Run evals for a specific category
|
|
114
|
+
pnpm test:evals -- --grep "bug-detection"
|
|
115
|
+
|
|
116
|
+
# Run a single eval
|
|
117
|
+
pnpm test:evals -- --grep "null-property-access"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Evals make real API calls. They run skills on `claude-sonnet-4-6` by
|
|
121
|
+
default.
|
|
122
|
+
|
|
123
|
+
## Adding a New Eval
|
|
124
|
+
|
|
125
|
+
1. Pick an existing YAML file or create a new `evals/<category>.yaml`
|
|
126
|
+
2. Add a scenario entry under the `evals:` key
|
|
127
|
+
3. Create a fixture file under `evals/fixtures/<scenario>/`
|
|
128
|
+
4. Run `pnpm test:evals` to verify
|
|
129
|
+
|
|
130
|
+
If a new category needs a different test skill, add it to `evals/skills/`.
|
|
131
|
+
|
|
132
|
+
### Guidelines
|
|
133
|
+
|
|
134
|
+
- **One bug per eval.** Each scenario tests one specific behavior.
|
|
135
|
+
- **Make bugs realistic.** Code should look like something a human wrote.
|
|
136
|
+
- **Write precise `should_find`.** "null access on user.name from Array.find()"
|
|
137
|
+
is better than "finds a bug."
|
|
138
|
+
- **Include `should_not_find`.** If the code has issues the skill should ignore,
|
|
139
|
+
call them out.
|
|
140
|
+
- **Keep fixtures small.** 20-80 lines. The agent analyzes hunks, not novels.
|
|
141
|
+
- **No custom code.** Every eval is just YAML + fixture files.
|
|
142
|
+
|
|
143
|
+
## How It Works
|
|
144
|
+
|
|
145
|
+
1. **Discovery**: Scan `evals/` for `.yaml` files
|
|
146
|
+
2. **Loading**: Parse YAML, validate with Zod, resolve paths
|
|
147
|
+
3. **Git repo**: Create a temp repo with fixture files committed on an `eval`
|
|
148
|
+
branch (empty `main` as base), so the agent has a real repo to explore
|
|
149
|
+
4. **Context**: Build `EventContext` from real `git diff main...eval`
|
|
150
|
+
5. **Execution**: Run the skill via `runSkill()` with the real SDK pipeline;
|
|
151
|
+
the agent operates in the temp repo with Read/Grep tools
|
|
152
|
+
6. **Judgment**: An LLM judge (Sonnet) evaluates findings against assertions
|
|
153
|
+
7. **Verdict**: Pass if all required `should_find` are met and no
|
|
154
|
+
`should_not_find` are violated
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
skill: skills/bug-detection.md
|
|
2
|
+
|
|
3
|
+
evals:
|
|
4
|
+
- name: null-property-access
|
|
5
|
+
given: code that accesses properties on an array .find() result without null checking
|
|
6
|
+
files:
|
|
7
|
+
- fixtures/null-property-access/handler.ts
|
|
8
|
+
should_find:
|
|
9
|
+
- finding: accessing .name and .profile.avatar on a potentially undefined user object from Array.find()
|
|
10
|
+
severity: high
|
|
11
|
+
should_not_find:
|
|
12
|
+
- style, formatting, or naming issues
|
|
13
|
+
- the lack of try/catch around the fetch call
|
|
14
|
+
|
|
15
|
+
- name: off-by-one
|
|
16
|
+
given: pagination logic that uses Math.floor instead of Math.ceil, skipping the last page
|
|
17
|
+
files:
|
|
18
|
+
- fixtures/off-by-one/paginator.ts
|
|
19
|
+
should_find:
|
|
20
|
+
- finding: off-by-one error in page count calculation that loses the last page when totalItems is not evenly divisible by pageSize
|
|
21
|
+
severity: medium
|
|
22
|
+
should_not_find:
|
|
23
|
+
- use of any[] type
|
|
24
|
+
- missing error handling
|
|
25
|
+
|
|
26
|
+
- name: missing-await
|
|
27
|
+
given: async cache lookup missing await, causing a Promise object to be used as a truthy value
|
|
28
|
+
files:
|
|
29
|
+
- fixtures/missing-await/cache.ts
|
|
30
|
+
should_find:
|
|
31
|
+
- finding: missing await on loadFromCache() call, so cached is always a truthy Promise and the function never actually fetches fresh data
|
|
32
|
+
severity: high
|
|
33
|
+
should_not_find:
|
|
34
|
+
- console.log statements
|
|
35
|
+
- missing return type annotations
|
|
36
|
+
|
|
37
|
+
- name: wrong-comparison
|
|
38
|
+
given: permission check using <= instead of >=, inverting the access control logic
|
|
39
|
+
files:
|
|
40
|
+
- fixtures/wrong-comparison/validator.ts
|
|
41
|
+
should_find:
|
|
42
|
+
- finding: comparison operator is <= instead of >=, granting access to lower-privilege users while denying higher-privilege users
|
|
43
|
+
severity: high
|
|
44
|
+
should_not_find:
|
|
45
|
+
- hardcoded role strings
|
|
46
|
+
- suggestion to use an enum for roles
|
|
47
|
+
|
|
48
|
+
- name: stale-closure
|
|
49
|
+
given: React useEffect with setInterval that captures count in a stale closure
|
|
50
|
+
files:
|
|
51
|
+
- fixtures/stale-closure/counter.tsx
|
|
52
|
+
should_find:
|
|
53
|
+
- finding: "stale closure: setInterval callback captures initial count value and never sees updates, so the counter always sets the same value"
|
|
54
|
+
severity: high
|
|
55
|
+
should_not_find:
|
|
56
|
+
- TypeScript type annotation issues
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// This code is functionally correct but has style issues.
|
|
2
|
+
// A precision-focused eval: the skill should NOT report any of these as bugs.
|
|
3
|
+
|
|
4
|
+
// Inconsistent naming convention (camelCase vs snake_case)
|
|
5
|
+
export function calculate_total(items: number[]): number {
|
|
6
|
+
let runningTotal = 0;
|
|
7
|
+
for (let i = 0; i < items.length; i++) {
|
|
8
|
+
runningTotal = runningTotal + items[i]!;
|
|
9
|
+
}
|
|
10
|
+
return runningTotal;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Verbose conditional (could be simplified but is correct)
|
|
14
|
+
export function isEligible(age: number, hasConsent: boolean): boolean {
|
|
15
|
+
if (age >= 18) {
|
|
16
|
+
if (hasConsent === true) {
|
|
17
|
+
return true;
|
|
18
|
+
} else {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
} else {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Missing JSDoc, long parameter list, but functionally correct
|
|
27
|
+
export function formatAddress(
|
|
28
|
+
street: string,
|
|
29
|
+
city: string,
|
|
30
|
+
state: string,
|
|
31
|
+
zip: string,
|
|
32
|
+
country: string
|
|
33
|
+
): string {
|
|
34
|
+
const parts = [street, city, state, zip, country];
|
|
35
|
+
return parts.filter((p) => p.length > 0).join(', ');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Magic numbers but correct behavior
|
|
39
|
+
export function calculateDiscount(price: number, quantity: number): number {
|
|
40
|
+
if (quantity >= 100) {
|
|
41
|
+
return price * 0.8;
|
|
42
|
+
} else if (quantity >= 50) {
|
|
43
|
+
return price * 0.9;
|
|
44
|
+
} else if (quantity >= 10) {
|
|
45
|
+
return price * 0.95;
|
|
46
|
+
}
|
|
47
|
+
return price;
|
|
48
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
interface CacheEntry {
|
|
2
|
+
key: string;
|
|
3
|
+
value: string;
|
|
4
|
+
expiresAt: number;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const store = new Map<string, CacheEntry>();
|
|
8
|
+
|
|
9
|
+
async function saveToCache(key: string, value: string, ttlMs: number): Promise<void> {
|
|
10
|
+
// Simulate async storage (e.g., Redis, database)
|
|
11
|
+
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
12
|
+
store.set(key, {
|
|
13
|
+
key,
|
|
14
|
+
value,
|
|
15
|
+
expiresAt: Date.now() + ttlMs,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function loadFromCache(key: string): Promise<string | null> {
|
|
20
|
+
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
21
|
+
const entry = store.get(key);
|
|
22
|
+
if (!entry) return null;
|
|
23
|
+
if (Date.now() > entry.expiresAt) {
|
|
24
|
+
store.delete(key);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return entry.value;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function getOrFetchData(key: string, fetchFn: () => Promise<string>): Promise<string> {
|
|
31
|
+
// Bug: missing await on loadFromCache. The result `cached` will be a
|
|
32
|
+
// Promise, which is truthy, so the function always returns a Promise
|
|
33
|
+
// object (as a string) instead of the actual cached value.
|
|
34
|
+
const cached = loadFromCache(key);
|
|
35
|
+
|
|
36
|
+
if (cached) {
|
|
37
|
+
console.log('Cache hit:', key);
|
|
38
|
+
return cached as unknown as string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
console.log('Cache miss:', key);
|
|
42
|
+
const fresh = await fetchFn();
|
|
43
|
+
await saveToCache(key, fresh, 60_000);
|
|
44
|
+
return fresh;
|
|
45
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
interface User {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
email: string;
|
|
5
|
+
profile: {
|
|
6
|
+
avatar: string;
|
|
7
|
+
bio: string;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface ApiResponse {
|
|
12
|
+
users: User[];
|
|
13
|
+
total: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function fetchUsers(endpoint: string): Promise<ApiResponse> {
|
|
17
|
+
const response = await fetch(endpoint);
|
|
18
|
+
return response.json() as Promise<ApiResponse>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function getUserDisplayName(userId: string): Promise<string> {
|
|
22
|
+
const data = await fetchUsers(`/api/users?id=${userId}`);
|
|
23
|
+
const user = data.users.find((u) => u.id === userId);
|
|
24
|
+
|
|
25
|
+
// Bug: user could be undefined if not found in the array,
|
|
26
|
+
// but we access .name without checking
|
|
27
|
+
const displayName = user.name;
|
|
28
|
+
const avatarUrl = user.profile.avatar;
|
|
29
|
+
|
|
30
|
+
return `${displayName} (${avatarUrl})`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function getTeamMembers(teamId: string): Promise<string[]> {
|
|
34
|
+
const data = await fetchUsers(`/api/teams/${teamId}/members`);
|
|
35
|
+
return data.users.map((u) => u.name);
|
|
36
|
+
}
|