@adversarylabs/sdk 0.1.3 → 0.1.4
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/LICENSE +21 -0
- package/README.md +28 -19
- package/dist/index.d.ts +48 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +222 -132
- package/dist/index.js.map +1 -1
- package/package.json +18 -5
- package/schemas/adversary.run.v1.schema.json +275 -0
- package/templates/basic/.dockerignore +5 -0
- package/templates/basic/Dockerfile +11 -4
- package/templates/basic/README.md +3 -1
- package/templates/basic/adversary.yaml +1 -1
- package/templates/basic/npm-shrinkwrap.json +1309 -0
- package/templates/basic/package.json +4 -4
- package/templates/basic/src/index.ts +8 -1
- package/templates/basic/test/index.test.ts +0 -4
- package/schemas/adversary.findings.v1.schema.json +0 -80
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Adversary Labs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -17,13 +17,13 @@ Requires Node 22 or newer and ESM.
|
|
|
17
17
|
## Author an adversary
|
|
18
18
|
|
|
19
19
|
```ts
|
|
20
|
-
import { Adversary, Severity,
|
|
20
|
+
import { Adversary, Severity, log } from "@adversarylabs/sdk";
|
|
21
21
|
|
|
22
22
|
const app = new Adversary({
|
|
23
23
|
name: "adversarylabs/comment-sentences"
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
-
defineRule({
|
|
26
|
+
app.defineRule({
|
|
27
27
|
id: "comments.complete-sentence",
|
|
28
28
|
category: "code-style",
|
|
29
29
|
defaultSeverity: Severity.Info,
|
|
@@ -59,7 +59,7 @@ app.rule("comments.complete-sentence", async (ctx) => {
|
|
|
59
59
|
});
|
|
60
60
|
});
|
|
61
61
|
|
|
62
|
-
await app.
|
|
62
|
+
await app.runFromEnvironment();
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
## API
|
|
@@ -93,14 +93,14 @@ Rule context exposes:
|
|
|
93
93
|
- `ctx.review.observe(note)`
|
|
94
94
|
- `ctx.review.opinion(opinion)`
|
|
95
95
|
|
|
96
|
-
### `defineRule(definition)`
|
|
96
|
+
### `app.defineRule(definition)`
|
|
97
97
|
|
|
98
98
|
Registers domain-specific aggregation for a stable rule id. The SDK still owns grouping,
|
|
99
99
|
deduplication, ranking, suppression, and rendering; the rule definition supplies engineering
|
|
100
100
|
language for a grouped set of observations.
|
|
101
101
|
|
|
102
102
|
```ts
|
|
103
|
-
defineRule({
|
|
103
|
+
app.defineRule({
|
|
104
104
|
id: "comments.complete-sentence",
|
|
105
105
|
category: "code-style",
|
|
106
106
|
defaultSeverity: "info",
|
|
@@ -126,6 +126,10 @@ defineRule({
|
|
|
126
126
|
`category`, `defaultSeverity`, `defaultConfidence`, and `groupBy` act as defaults for observations
|
|
127
127
|
with the same `ruleId`. If a rule has no `aggregate(...)`, the SDK uses generic synthesis.
|
|
128
128
|
|
|
129
|
+
Definitions are scoped to one `Adversary`. Duplicate IDs throw; use `app.replaceRule(...)` when an
|
|
130
|
+
intentional replacement is required. The top-level `defineRule(...)` API remains temporarily
|
|
131
|
+
available for compatibility but is deprecated.
|
|
132
|
+
|
|
129
133
|
### `ctx.observe(input)`
|
|
130
134
|
|
|
131
135
|
Use observations for raw detector output and evidence. Observations are normalized, deduplicated,
|
|
@@ -157,7 +161,8 @@ ctx.observe({
|
|
|
157
161
|
});
|
|
158
162
|
```
|
|
159
163
|
|
|
160
|
-
Set `deduplicate: false`
|
|
164
|
+
Set `deduplicate: false` on a completed finding when separate findings intentionally share an
|
|
165
|
+
identity. The SDK otherwise merges findings with the same group key or generated ID.
|
|
161
166
|
|
|
162
167
|
### `ctx.finding(input)`
|
|
163
168
|
|
|
@@ -173,9 +178,9 @@ ctx.finding({
|
|
|
173
178
|
whyItMatters: "Complete-sentence comments can be useful for intent, but noisy when they restate code.",
|
|
174
179
|
impact: "Reviewers may spend time reading comments that do not add much context.",
|
|
175
180
|
evidence: [
|
|
176
|
-
{ file: "src/index.ts", line: 3, message: "Explains parser intent." },
|
|
177
|
-
{ file: "src/index.ts", line: 11, message: "Explains fallback behavior." },
|
|
178
|
-
{ file: "src/index.ts", line: 20, message: "Explains output formatting." }
|
|
181
|
+
{ location: { file: "src/index.ts", line: 3 }, message: "Explains parser intent." },
|
|
182
|
+
{ location: { file: "src/index.ts", line: 11 }, message: "Explains fallback behavior." },
|
|
183
|
+
{ location: { file: "src/index.ts", line: 20 }, message: "Explains output formatting." }
|
|
179
184
|
],
|
|
180
185
|
recommendation: "Keep complete-sentence comments only when they explain non-obvious intent.",
|
|
181
186
|
remediation: { complexity: "trivial" }
|
|
@@ -260,7 +265,7 @@ ctx.review.assessment({
|
|
|
260
265
|
ctx.review.positive({
|
|
261
266
|
key: "intentional-comments",
|
|
262
267
|
summary: "Several comments explain intent rather than restating implementation.",
|
|
263
|
-
evidence: [{ file: "src/index.ts", line: 3 }]
|
|
268
|
+
evidence: [{ location: { file: "src/index.ts", line: 3 } }]
|
|
264
269
|
});
|
|
265
270
|
|
|
266
271
|
ctx.review.observe({
|
|
@@ -309,7 +314,9 @@ Use `ctx.finding(...)` when the adversary has already done issue synthesis itsel
|
|
|
309
314
|
|
|
310
315
|
## Review Result
|
|
311
316
|
|
|
312
|
-
`app.run()` returns one normalized review object
|
|
317
|
+
`app.run({ input })` is the side-effect-free library API and returns one normalized review object.
|
|
318
|
+
Container and CLI entry points should call `app.runFromEnvironment()`, which reads the runtime
|
|
319
|
+
environment and writes the run envelope to the configured output path.
|
|
313
320
|
|
|
314
321
|
```ts
|
|
315
322
|
type ReviewResult = {
|
|
@@ -321,7 +328,7 @@ type ReviewResult = {
|
|
|
321
328
|
scores?: ReviewScore[];
|
|
322
329
|
findings: ReviewFinding[];
|
|
323
330
|
opinion?: { ship?: boolean; summary: string };
|
|
324
|
-
suppressed: {
|
|
331
|
+
suppressed: { findings: number };
|
|
325
332
|
timing?: { totalMs?: number };
|
|
326
333
|
};
|
|
327
334
|
```
|
|
@@ -329,7 +336,7 @@ type ReviewResult = {
|
|
|
329
336
|
Renderers consume this result. The SDK includes `TerminalRenderer` and `JsonRenderer`:
|
|
330
337
|
|
|
331
338
|
```ts
|
|
332
|
-
const result = await app.run({
|
|
339
|
+
const result = await app.run({ });
|
|
333
340
|
new TerminalRenderer().render(result);
|
|
334
341
|
new JsonRenderer().render(result);
|
|
335
342
|
```
|
|
@@ -367,7 +374,7 @@ permissions:
|
|
|
367
374
|
env: []
|
|
368
375
|
|
|
369
376
|
findings:
|
|
370
|
-
format: adversary.
|
|
377
|
+
format: adversary.run.v1
|
|
371
378
|
```
|
|
372
379
|
|
|
373
380
|
`src/index.ts`:
|
|
@@ -375,7 +382,7 @@ findings:
|
|
|
375
382
|
```ts
|
|
376
383
|
import { readFile } from "node:fs/promises";
|
|
377
384
|
import { join } from "node:path";
|
|
378
|
-
import { Adversary
|
|
385
|
+
import { Adversary } from "@adversarylabs/sdk";
|
|
379
386
|
|
|
380
387
|
const app = new Adversary({
|
|
381
388
|
name: "adversarylabs/comment-sentences",
|
|
@@ -384,7 +391,7 @@ const app = new Adversary({
|
|
|
384
391
|
}
|
|
385
392
|
});
|
|
386
393
|
|
|
387
|
-
defineRule({
|
|
394
|
+
app.defineRule({
|
|
388
395
|
id: "comments.complete-sentence",
|
|
389
396
|
category: "code-style",
|
|
390
397
|
defaultSeverity: "info",
|
|
@@ -402,8 +409,10 @@ defineRule({
|
|
|
402
409
|
"Comments are most useful when they explain non-obvious intent rather than restating code.",
|
|
403
410
|
impact: "Repeated prose can make routine code harder to scan during review.",
|
|
404
411
|
evidence: observations.map((observation) => ({
|
|
405
|
-
|
|
406
|
-
|
|
412
|
+
location: {
|
|
413
|
+
file: observation.location?.file,
|
|
414
|
+
line: observation.location?.line
|
|
415
|
+
},
|
|
407
416
|
message: "complete sentence",
|
|
408
417
|
snippet:
|
|
409
418
|
typeof observation.evidence === "object" && observation.evidence !== null
|
|
@@ -503,6 +512,7 @@ Output shape:
|
|
|
503
512
|
{
|
|
504
513
|
"protocolVersion": 1,
|
|
505
514
|
"result": {
|
|
515
|
+
"schemaVersion": "adversary.review.v1",
|
|
506
516
|
"adversary": {
|
|
507
517
|
"name": "adversarylabs/example"
|
|
508
518
|
},
|
|
@@ -514,7 +524,6 @@ Output shape:
|
|
|
514
524
|
"observations": [],
|
|
515
525
|
"findings": [],
|
|
516
526
|
"suppressed": {
|
|
517
|
-
"observations": 0,
|
|
518
527
|
"findings": 0
|
|
519
528
|
}
|
|
520
529
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export declare const DEFAULT_INPUT_PATH = "/adversary/input.json";
|
|
2
2
|
export declare const DEFAULT_OUTPUT_PATH = "/adversary/output.json";
|
|
3
3
|
export declare const ADVERSARY_RUN_PROTOCOL_VERSION = 1;
|
|
4
|
+
export declare const REVIEW_RESULT_SCHEMA_VERSION = "adversary.review.v1";
|
|
4
5
|
export declare const Severity: {
|
|
5
6
|
readonly Info: "info";
|
|
6
7
|
readonly Low: "low";
|
|
@@ -26,21 +27,27 @@ export interface ConfidenceThresholds {
|
|
|
26
27
|
high: number;
|
|
27
28
|
}
|
|
28
29
|
export declare const DEFAULT_CONFIDENCE_THRESHOLDS: ConfidenceThresholds;
|
|
29
|
-
export interface
|
|
30
|
-
location?: {
|
|
31
|
-
file?: string;
|
|
32
|
-
line?: number;
|
|
33
|
-
endLine?: number;
|
|
34
|
-
};
|
|
30
|
+
export interface Location {
|
|
35
31
|
file?: string;
|
|
36
32
|
line?: number;
|
|
37
33
|
endLine?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface EvidenceInput extends Location {
|
|
36
|
+
location?: Location;
|
|
38
37
|
label?: string;
|
|
39
38
|
message?: string;
|
|
40
39
|
snippet?: string;
|
|
41
40
|
data?: Record<string, unknown>;
|
|
41
|
+
/** @deprecated Use data. */
|
|
42
42
|
metadata?: Record<string, unknown>;
|
|
43
43
|
}
|
|
44
|
+
export interface Evidence {
|
|
45
|
+
location?: Location;
|
|
46
|
+
label?: string;
|
|
47
|
+
message?: string;
|
|
48
|
+
snippet?: string;
|
|
49
|
+
data?: Record<string, unknown>;
|
|
50
|
+
}
|
|
44
51
|
export interface Remediation {
|
|
45
52
|
complexity?: "trivial" | "small" | "medium" | "large" | "architectural";
|
|
46
53
|
}
|
|
@@ -74,7 +81,7 @@ export interface ObservationInit {
|
|
|
74
81
|
summary?: ObservationSummary;
|
|
75
82
|
whyItMatters?: string;
|
|
76
83
|
impact?: string;
|
|
77
|
-
location?:
|
|
84
|
+
location?: EvidenceInput;
|
|
78
85
|
evidence?: string | Record<string, unknown>;
|
|
79
86
|
recommendation?: string | RecommendationInput;
|
|
80
87
|
remediation?: Remediation;
|
|
@@ -93,7 +100,7 @@ export interface FindingInput {
|
|
|
93
100
|
summary: string;
|
|
94
101
|
whyItMatters?: string;
|
|
95
102
|
impact?: string;
|
|
96
|
-
evidence:
|
|
103
|
+
evidence: EvidenceInput[];
|
|
97
104
|
recommendation?: string;
|
|
98
105
|
remediation?: Remediation;
|
|
99
106
|
tags?: string[];
|
|
@@ -123,6 +130,9 @@ export interface ReviewNote {
|
|
|
123
130
|
evidence?: Evidence[];
|
|
124
131
|
metadata?: Record<string, unknown>;
|
|
125
132
|
}
|
|
133
|
+
export interface ReviewNoteInput extends Omit<ReviewNote, "evidence"> {
|
|
134
|
+
evidence?: EvidenceInput[];
|
|
135
|
+
}
|
|
126
136
|
export interface ReviewAssessment {
|
|
127
137
|
risk: "none" | "low" | "medium" | "high" | "critical";
|
|
128
138
|
summary?: string;
|
|
@@ -146,6 +156,7 @@ export interface ReviewPolicy {
|
|
|
146
156
|
severityOverrides?: Record<string, Severity>;
|
|
147
157
|
}
|
|
148
158
|
export interface ReviewResult {
|
|
159
|
+
schemaVersion: typeof REVIEW_RESULT_SCHEMA_VERSION;
|
|
149
160
|
adversary: {
|
|
150
161
|
name: string;
|
|
151
162
|
version?: string;
|
|
@@ -161,7 +172,6 @@ export interface ReviewResult {
|
|
|
161
172
|
findings: ReviewFinding[];
|
|
162
173
|
opinion?: ReviewOpinion;
|
|
163
174
|
suppressed: {
|
|
164
|
-
observations: number;
|
|
165
175
|
findings: number;
|
|
166
176
|
};
|
|
167
177
|
timing?: {
|
|
@@ -185,7 +195,6 @@ export interface RuntimeInput {
|
|
|
185
195
|
}
|
|
186
196
|
export interface Summary {
|
|
187
197
|
files_scanned?: number;
|
|
188
|
-
[key: string]: number | string | boolean | null | undefined;
|
|
189
198
|
}
|
|
190
199
|
export interface RuleContext {
|
|
191
200
|
repoPath: string;
|
|
@@ -198,8 +207,8 @@ export interface RuleContext {
|
|
|
198
207
|
finding: (finding: FindingInput) => void;
|
|
199
208
|
review: {
|
|
200
209
|
assessment: (assessment: ReviewAssessment) => void;
|
|
201
|
-
positive: (note:
|
|
202
|
-
observe: (note:
|
|
210
|
+
positive: (note: ReviewNoteInput) => void;
|
|
211
|
+
observe: (note: ReviewNoteInput) => void;
|
|
203
212
|
score: (score: ReviewScore) => void;
|
|
204
213
|
opinion: (opinion: ReviewOpinion) => void;
|
|
205
214
|
};
|
|
@@ -211,13 +220,20 @@ export interface AdversaryOptions {
|
|
|
211
220
|
review?: ReviewPolicy;
|
|
212
221
|
}
|
|
213
222
|
export interface RunOptions {
|
|
223
|
+
input: RuntimeInput;
|
|
224
|
+
review?: ReviewPolicy;
|
|
225
|
+
includeSuppressed?: boolean;
|
|
226
|
+
includeRawObservations?: boolean;
|
|
227
|
+
includeTiming?: boolean;
|
|
228
|
+
}
|
|
229
|
+
export interface EnvironmentRunOptions {
|
|
214
230
|
input?: RuntimeInput;
|
|
215
231
|
inputPath?: string;
|
|
216
232
|
outputPath?: string;
|
|
217
|
-
write?: boolean;
|
|
218
233
|
review?: ReviewPolicy;
|
|
219
234
|
includeSuppressed?: boolean;
|
|
220
235
|
includeRawObservations?: boolean;
|
|
236
|
+
includeTiming?: boolean;
|
|
221
237
|
}
|
|
222
238
|
export interface ReviewRenderer {
|
|
223
239
|
render(result: ReviewResult): Promise<void> | void;
|
|
@@ -228,16 +244,26 @@ export interface RuleDefinition {
|
|
|
228
244
|
defaultSeverity?: Severity;
|
|
229
245
|
defaultConfidence?: ConfidenceInput;
|
|
230
246
|
groupBy?: string[];
|
|
231
|
-
aggregate?: (observations: ObservationInit
|
|
247
|
+
aggregate?: (observations: ReadonlyArray<ObservationInit>) => FindingSynthesis;
|
|
232
248
|
}
|
|
249
|
+
export type FindingSynthesis = Omit<Partial<ReviewFinding>, "evidence"> & {
|
|
250
|
+
evidence?: EvidenceInput[];
|
|
251
|
+
};
|
|
233
252
|
export declare class RuleRegistry {
|
|
234
253
|
private readonly rules;
|
|
235
254
|
register(rule: RuleDefinition): void;
|
|
255
|
+
replace(rule: RuleDefinition): void;
|
|
236
256
|
lookup(ruleId: string): RuleDefinition | undefined;
|
|
237
257
|
has(ruleId: string): boolean;
|
|
258
|
+
snapshot(): RuleRegistry;
|
|
259
|
+
importMissing(source: RuleRegistry): void;
|
|
238
260
|
}
|
|
261
|
+
/** @deprecated Prefer app.defineRule(...) so definitions remain instance-scoped. */
|
|
239
262
|
export declare const ruleRegistry: RuleRegistry;
|
|
263
|
+
/** @deprecated Prefer app.defineRule(...) so definitions remain instance-scoped. */
|
|
240
264
|
export declare function defineRule(rule: RuleDefinition): void;
|
|
265
|
+
/** @deprecated Prefer app.replaceRule(...) so definitions remain instance-scoped. */
|
|
266
|
+
export declare function replaceRule(rule: RuleDefinition): void;
|
|
241
267
|
export declare const log: {
|
|
242
268
|
debug(message: unknown): void;
|
|
243
269
|
info(message: unknown): void;
|
|
@@ -247,14 +273,16 @@ export declare const log: {
|
|
|
247
273
|
export declare class Adversary {
|
|
248
274
|
readonly name: string;
|
|
249
275
|
readonly version?: string;
|
|
250
|
-
readonly rules
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}>;
|
|
254
|
-
readonly reviewPolicy: ReviewPolicy;
|
|
276
|
+
private readonly rules;
|
|
277
|
+
private readonly reviewPolicy;
|
|
278
|
+
private readonly ruleDefinitions;
|
|
255
279
|
constructor(options: AdversaryOptions);
|
|
280
|
+
defineRule(rule: RuleDefinition): void;
|
|
281
|
+
replaceRule(rule: RuleDefinition): void;
|
|
282
|
+
hasRuleDefinition(ruleId: string): boolean;
|
|
256
283
|
rule(id: string, handler: RuleHandler): void;
|
|
257
|
-
run(options
|
|
284
|
+
run(options: RunOptions): Promise<ReviewResult>;
|
|
285
|
+
runFromEnvironment(options?: EnvironmentRunOptions): Promise<ReviewResult>;
|
|
258
286
|
}
|
|
259
287
|
export declare function createAdversaryRunEnvelope(result: ReviewResult): AdversaryRunEnvelope;
|
|
260
288
|
export declare function parseInput(path?: string): Promise<RuntimeInput>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAC1D,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAC5D,eAAO,MAAM,8BAA8B,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|