agentlint 0.1.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 +32 -0
- package/LICENSE +190 -0
- package/README.md +246 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +351 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/diff/index.d.ts +16 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +204 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/index.d.ts +2 -0
- package/dist/ir/index.d.ts.map +1 -0
- package/dist/ir/index.js +18 -0
- package/dist/ir/index.js.map +1 -0
- package/dist/ir/types.d.ts +369 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/ir/types.js +12 -0
- package/dist/ir/types.js.map +1 -0
- package/dist/parsers/base.d.ts +104 -0
- package/dist/parsers/base.d.ts.map +1 -0
- package/dist/parsers/base.js +373 -0
- package/dist/parsers/base.js.map +1 -0
- package/dist/parsers/claude.d.ts +30 -0
- package/dist/parsers/claude.d.ts.map +1 -0
- package/dist/parsers/claude.js +453 -0
- package/dist/parsers/claude.js.map +1 -0
- package/dist/parsers/cursor.d.ts +24 -0
- package/dist/parsers/cursor.d.ts.map +1 -0
- package/dist/parsers/cursor.js +305 -0
- package/dist/parsers/cursor.js.map +1 -0
- package/dist/parsers/factory.d.ts +30 -0
- package/dist/parsers/factory.d.ts.map +1 -0
- package/dist/parsers/factory.js +78 -0
- package/dist/parsers/factory.js.map +1 -0
- package/dist/parsers/index.d.ts +5 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +21 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/policy/index.d.ts +3 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +19 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/loader.d.ts +23 -0
- package/dist/policy/loader.d.ts.map +1 -0
- package/dist/policy/loader.js +252 -0
- package/dist/policy/loader.js.map +1 -0
- package/dist/policy/types.d.ts +79 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +99 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/reports/index.d.ts +14 -0
- package/dist/reports/index.d.ts.map +1 -0
- package/dist/reports/index.js +54 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/json.d.ts +16 -0
- package/dist/reports/json.d.ts.map +1 -0
- package/dist/reports/json.js +126 -0
- package/dist/reports/json.js.map +1 -0
- package/dist/reports/sarif.d.ts +20 -0
- package/dist/reports/sarif.d.ts.map +1 -0
- package/dist/reports/sarif.js +169 -0
- package/dist/reports/sarif.js.map +1 -0
- package/dist/reports/text.d.ts +25 -0
- package/dist/reports/text.d.ts.map +1 -0
- package/dist/reports/text.js +283 -0
- package/dist/reports/text.js.map +1 -0
- package/dist/reports/types.d.ts +88 -0
- package/dist/reports/types.d.ts.map +1 -0
- package/dist/reports/types.js +6 -0
- package/dist/reports/types.js.map +1 -0
- package/dist/rules/base.d.ts +16 -0
- package/dist/rules/base.d.ts.map +1 -0
- package/dist/rules/base.js +48 -0
- package/dist/rules/base.js.map +1 -0
- package/dist/rules/engine.d.ts +61 -0
- package/dist/rules/engine.d.ts.map +1 -0
- package/dist/rules/engine.js +195 -0
- package/dist/rules/engine.js.map +1 -0
- package/dist/rules/execution.d.ts +33 -0
- package/dist/rules/execution.d.ts.map +1 -0
- package/dist/rules/execution.js +154 -0
- package/dist/rules/execution.js.map +1 -0
- package/dist/rules/filesystem.d.ts +36 -0
- package/dist/rules/filesystem.d.ts.map +1 -0
- package/dist/rules/filesystem.js +227 -0
- package/dist/rules/filesystem.js.map +1 -0
- package/dist/rules/hook.d.ts +25 -0
- package/dist/rules/hook.d.ts.map +1 -0
- package/dist/rules/hook.js +112 -0
- package/dist/rules/hook.js.map +1 -0
- package/dist/rules/index.d.ts +12 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +28 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/instruction.d.ts +25 -0
- package/dist/rules/instruction.d.ts.map +1 -0
- package/dist/rules/instruction.js +162 -0
- package/dist/rules/instruction.js.map +1 -0
- package/dist/rules/network.d.ts +33 -0
- package/dist/rules/network.d.ts.map +1 -0
- package/dist/rules/network.js +145 -0
- package/dist/rules/network.js.map +1 -0
- package/dist/rules/observability.d.ts +25 -0
- package/dist/rules/observability.d.ts.map +1 -0
- package/dist/rules/observability.js +105 -0
- package/dist/rules/observability.js.map +1 -0
- package/dist/rules/scope.d.ts +37 -0
- package/dist/rules/scope.d.ts.map +1 -0
- package/dist/rules/scope.js +173 -0
- package/dist/rules/scope.js.map +1 -0
- package/dist/rules/secrets.d.ts +35 -0
- package/dist/rules/secrets.d.ts.map +1 -0
- package/dist/rules/secrets.js +273 -0
- package/dist/rules/secrets.js.map +1 -0
- package/dist/rules/types.d.ts +58 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +6 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/scanner.d.ts +61 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +441 -0
- package/dist/scanner.js.map +1 -0
- package/dist/utils/hash.d.ts +28 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +94 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Credential & Secret Rules (SEC)
|
|
4
|
+
* Rules for detecting credential and secret access risks
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.secretRules = exports.SecretPropagationRule = exports.ImplicitSecretAccessRule = exports.EnvironmentSecretReferenceRule = void 0;
|
|
8
|
+
const base_1 = require("./base");
|
|
9
|
+
// Known secret environment variables
|
|
10
|
+
const KNOWN_SECRET_VARS = [
|
|
11
|
+
'GITHUB_TOKEN',
|
|
12
|
+
'GH_TOKEN',
|
|
13
|
+
'GITLAB_TOKEN',
|
|
14
|
+
'AWS_SECRET_ACCESS_KEY',
|
|
15
|
+
'AWS_ACCESS_KEY_ID',
|
|
16
|
+
'AWS_SESSION_TOKEN',
|
|
17
|
+
'AZURE_CLIENT_SECRET',
|
|
18
|
+
'AZURE_CLIENT_ID',
|
|
19
|
+
'AZURE_TENANT_ID',
|
|
20
|
+
'AZURE_SUBSCRIPTION_ID',
|
|
21
|
+
'GOOGLE_APPLICATION_CREDENTIALS',
|
|
22
|
+
'GCP_SERVICE_ACCOUNT',
|
|
23
|
+
'GCLOUD_SERVICE_KEY',
|
|
24
|
+
'API_KEY',
|
|
25
|
+
'API_SECRET',
|
|
26
|
+
'SECRET_KEY',
|
|
27
|
+
'PRIVATE_KEY',
|
|
28
|
+
'DATABASE_PASSWORD',
|
|
29
|
+
'DATABASE_URL',
|
|
30
|
+
'DB_PASSWORD',
|
|
31
|
+
'DB_HOST',
|
|
32
|
+
'REDIS_PASSWORD',
|
|
33
|
+
'MONGODB_URI',
|
|
34
|
+
'PASSWORD',
|
|
35
|
+
'TOKEN',
|
|
36
|
+
'NPM_TOKEN',
|
|
37
|
+
'NPM_AUTH_TOKEN',
|
|
38
|
+
'PYPI_TOKEN',
|
|
39
|
+
'PYPI_PASSWORD',
|
|
40
|
+
'DOCKER_PASSWORD',
|
|
41
|
+
'DOCKER_AUTH',
|
|
42
|
+
'SSH_PRIVATE_KEY',
|
|
43
|
+
'SSH_KEY',
|
|
44
|
+
'SLACK_TOKEN',
|
|
45
|
+
'SLACK_WEBHOOK',
|
|
46
|
+
'DISCORD_TOKEN',
|
|
47
|
+
'SENDGRID_API_KEY',
|
|
48
|
+
'STRIPE_SECRET_KEY',
|
|
49
|
+
'TWILIO_AUTH_TOKEN',
|
|
50
|
+
'OPENAI_API_KEY',
|
|
51
|
+
'ANTHROPIC_API_KEY',
|
|
52
|
+
'ENCRYPTION_KEY',
|
|
53
|
+
'JWT_SECRET',
|
|
54
|
+
'SESSION_SECRET',
|
|
55
|
+
'COOKIE_SECRET',
|
|
56
|
+
];
|
|
57
|
+
// Secret file patterns
|
|
58
|
+
const SECRET_FILE_PATTERNS = [
|
|
59
|
+
'.env',
|
|
60
|
+
'.env.local',
|
|
61
|
+
'.env.production',
|
|
62
|
+
'.env.development',
|
|
63
|
+
'credentials.json',
|
|
64
|
+
'secrets.json',
|
|
65
|
+
'service-account.json',
|
|
66
|
+
'.npmrc',
|
|
67
|
+
'.pypirc',
|
|
68
|
+
'.netrc',
|
|
69
|
+
'.docker/config.json',
|
|
70
|
+
'.aws/credentials',
|
|
71
|
+
'.kube/config',
|
|
72
|
+
'id_rsa',
|
|
73
|
+
'id_ed25519',
|
|
74
|
+
'id_ecdsa',
|
|
75
|
+
'.ssh/config',
|
|
76
|
+
];
|
|
77
|
+
/**
|
|
78
|
+
* SEC-001: Environment Secret Reference
|
|
79
|
+
* References to known secret environment variables
|
|
80
|
+
*/
|
|
81
|
+
class EnvironmentSecretReferenceRule extends base_1.BaseRule {
|
|
82
|
+
constructor() {
|
|
83
|
+
super({
|
|
84
|
+
id: 'SEC-001',
|
|
85
|
+
group: 'secrets',
|
|
86
|
+
severity: 'high',
|
|
87
|
+
title: 'Environment Secret Reference',
|
|
88
|
+
description: 'References to known secret environment variables such as GITHUB_TOKEN, AWS_SECRET_ACCESS_KEY, or API_KEY. Agents should not touch secrets by default.',
|
|
89
|
+
recommendation: 'Remove secret references from agent configurations. Use secure secret management practices.',
|
|
90
|
+
tags: ['secrets', 'credentials', 'environment'],
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
evaluate(context) {
|
|
94
|
+
const findings = [];
|
|
95
|
+
const { document, minConfidence } = context;
|
|
96
|
+
for (const action of document.actions) {
|
|
97
|
+
const secretVars = action.secrets?.reads_env_vars || [];
|
|
98
|
+
for (const varName of secretVars) {
|
|
99
|
+
if (this.isKnownSecretVar(varName)) {
|
|
100
|
+
const confidence = action.evidence[0]?.confidence || 0.9;
|
|
101
|
+
if (confidence < minConfidence)
|
|
102
|
+
continue;
|
|
103
|
+
const finding = this.createFinding(document, action.anchors, `Reference to secret environment variable: $${varName}. Agents should not access secrets directly.`, [
|
|
104
|
+
{
|
|
105
|
+
kind: 'regex',
|
|
106
|
+
value: `$${varName}`,
|
|
107
|
+
confidence,
|
|
108
|
+
},
|
|
109
|
+
], confidence);
|
|
110
|
+
finding.related_actions.push({
|
|
111
|
+
action_type: action.type,
|
|
112
|
+
context: action.context,
|
|
113
|
+
summary: action.summary,
|
|
114
|
+
anchors: action.anchors,
|
|
115
|
+
});
|
|
116
|
+
findings.push(finding);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Also check capability summary
|
|
121
|
+
for (const varName of context.capabilitySummary.secrets.env_vars_referenced) {
|
|
122
|
+
if (this.isKnownSecretVar(varName) &&
|
|
123
|
+
!findings.some(f => f.message.includes(varName))) {
|
|
124
|
+
const finding = this.createFinding(document, { start_line: 1, end_line: 1 }, `Reference to secret environment variable: $${varName}.`, [
|
|
125
|
+
{
|
|
126
|
+
kind: 'heuristic',
|
|
127
|
+
value: `Secret variable referenced: ${varName}`,
|
|
128
|
+
confidence: 0.8,
|
|
129
|
+
},
|
|
130
|
+
], 0.8);
|
|
131
|
+
findings.push(finding);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return findings;
|
|
135
|
+
}
|
|
136
|
+
isKnownSecretVar(varName) {
|
|
137
|
+
const upperVar = varName.toUpperCase();
|
|
138
|
+
return KNOWN_SECRET_VARS.some(secret => upperVar === secret || upperVar.includes(secret));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
exports.EnvironmentSecretReferenceRule = EnvironmentSecretReferenceRule;
|
|
142
|
+
/**
|
|
143
|
+
* SEC-002: Implicit Secret Access
|
|
144
|
+
* Access to .env or config files likely containing secrets
|
|
145
|
+
*/
|
|
146
|
+
class ImplicitSecretAccessRule extends base_1.BaseRule {
|
|
147
|
+
constructor() {
|
|
148
|
+
super({
|
|
149
|
+
id: 'SEC-002',
|
|
150
|
+
group: 'secrets',
|
|
151
|
+
severity: 'medium',
|
|
152
|
+
title: 'Implicit Secret Access',
|
|
153
|
+
description: 'Access to .env files or configuration files that commonly contain secrets.',
|
|
154
|
+
recommendation: 'Avoid accessing secret-containing files. Use environment variables or secure secret stores instead.',
|
|
155
|
+
tags: ['secrets', 'files', 'configuration'],
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
evaluate(context) {
|
|
159
|
+
const findings = [];
|
|
160
|
+
const { document, minConfidence } = context;
|
|
161
|
+
// Check actions for file access to secret files
|
|
162
|
+
for (const action of document.actions) {
|
|
163
|
+
const secretFiles = action.secrets?.reads_files || [];
|
|
164
|
+
const paths = action.filesystem?.paths || [];
|
|
165
|
+
const allPaths = [...secretFiles, ...paths];
|
|
166
|
+
for (const path of allPaths) {
|
|
167
|
+
if (this.isSecretFile(path)) {
|
|
168
|
+
const confidence = action.evidence[0]?.confidence || 0.85;
|
|
169
|
+
if (confidence < minConfidence)
|
|
170
|
+
continue;
|
|
171
|
+
// Avoid duplicate findings
|
|
172
|
+
if (findings.some(f => f.message.includes(path)))
|
|
173
|
+
continue;
|
|
174
|
+
const finding = this.createFinding(document, action.anchors, `Access to secret-containing file: "${path}".`, [
|
|
175
|
+
{
|
|
176
|
+
kind: 'heuristic',
|
|
177
|
+
value: `Secret file pattern: ${path}`,
|
|
178
|
+
confidence,
|
|
179
|
+
},
|
|
180
|
+
], confidence);
|
|
181
|
+
finding.related_actions.push({
|
|
182
|
+
action_type: action.type,
|
|
183
|
+
context: action.context,
|
|
184
|
+
summary: action.summary,
|
|
185
|
+
anchors: action.anchors,
|
|
186
|
+
});
|
|
187
|
+
findings.push(finding);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Check capability summary for secret file references
|
|
192
|
+
for (const file of context.capabilitySummary.secrets.files_referenced) {
|
|
193
|
+
if (this.isSecretFile(file) &&
|
|
194
|
+
!findings.some(f => f.message.includes(file))) {
|
|
195
|
+
const finding = this.createFinding(document, { start_line: 1, end_line: 1 }, `Access to secret-containing file: "${file}".`, [
|
|
196
|
+
{
|
|
197
|
+
kind: 'heuristic',
|
|
198
|
+
value: `Secret file referenced: ${file}`,
|
|
199
|
+
confidence: 0.75,
|
|
200
|
+
},
|
|
201
|
+
], 0.75);
|
|
202
|
+
findings.push(finding);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return findings;
|
|
206
|
+
}
|
|
207
|
+
isSecretFile(path) {
|
|
208
|
+
const normalizedPath = path.toLowerCase();
|
|
209
|
+
return SECRET_FILE_PATTERNS.some(pattern => normalizedPath.endsWith(pattern.toLowerCase()) ||
|
|
210
|
+
normalizedPath.includes(pattern.toLowerCase()));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.ImplicitSecretAccessRule = ImplicitSecretAccessRule;
|
|
214
|
+
/**
|
|
215
|
+
* SEC-003: Secret Propagation
|
|
216
|
+
* Secrets used in shell commands, network calls, or file writes
|
|
217
|
+
*/
|
|
218
|
+
class SecretPropagationRule extends base_1.BaseRule {
|
|
219
|
+
constructor() {
|
|
220
|
+
super({
|
|
221
|
+
id: 'SEC-003',
|
|
222
|
+
group: 'secrets',
|
|
223
|
+
severity: 'high',
|
|
224
|
+
title: 'Secret Propagation',
|
|
225
|
+
description: 'Secrets are propagated to shell commands, network calls, or file writes. This creates exfiltration and logging risks.',
|
|
226
|
+
recommendation: 'Never propagate secrets through agent actions. Use secure API authentication methods.',
|
|
227
|
+
tags: ['secrets', 'propagation', 'exfiltration'],
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
evaluate(context) {
|
|
231
|
+
const findings = [];
|
|
232
|
+
const { document, minConfidence } = context;
|
|
233
|
+
for (const action of document.actions) {
|
|
234
|
+
const propagatesTo = action.secrets?.propagates_to || [];
|
|
235
|
+
if (propagatesTo.length === 0)
|
|
236
|
+
continue;
|
|
237
|
+
const confidence = action.evidence[0]?.confidence || 0.9;
|
|
238
|
+
if (confidence < minConfidence)
|
|
239
|
+
continue;
|
|
240
|
+
const destinations = propagatesTo.join(', ');
|
|
241
|
+
const secretVars = action.secrets?.reads_env_vars?.join(', ') || 'secrets';
|
|
242
|
+
const finding = this.createFinding(document, action.anchors, `Secret propagation detected: ${secretVars} propagated to ${destinations}.`, action.evidence, confidence);
|
|
243
|
+
finding.related_actions.push({
|
|
244
|
+
action_type: action.type,
|
|
245
|
+
context: action.context,
|
|
246
|
+
summary: action.summary,
|
|
247
|
+
anchors: action.anchors,
|
|
248
|
+
});
|
|
249
|
+
findings.push(finding);
|
|
250
|
+
}
|
|
251
|
+
// Check capability summary for propagation
|
|
252
|
+
if (context.capabilitySummary.secrets.propagation_detected &&
|
|
253
|
+
findings.length === 0) {
|
|
254
|
+
const finding = this.createFinding(document, { start_line: 1, end_line: 1 }, 'Secret propagation detected in document capabilities.', [
|
|
255
|
+
{
|
|
256
|
+
kind: 'heuristic',
|
|
257
|
+
value: 'secrets.propagation_detected: true',
|
|
258
|
+
confidence: 0.8,
|
|
259
|
+
},
|
|
260
|
+
], 0.8);
|
|
261
|
+
findings.push(finding);
|
|
262
|
+
}
|
|
263
|
+
return findings;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
exports.SecretPropagationRule = SecretPropagationRule;
|
|
267
|
+
// Export all secret rules
|
|
268
|
+
exports.secretRules = [
|
|
269
|
+
new EnvironmentSecretReferenceRule(),
|
|
270
|
+
new ImplicitSecretAccessRule(),
|
|
271
|
+
new SecretPropagationRule(),
|
|
272
|
+
];
|
|
273
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/rules/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule types and interfaces
|
|
3
|
+
*/
|
|
4
|
+
import { AgentDocument, Finding, Severity, CapabilitySummary } from '../ir/types';
|
|
5
|
+
/**
|
|
6
|
+
* Rule groups as defined in the taxonomy
|
|
7
|
+
*/
|
|
8
|
+
export type RuleGroup = 'execution' | 'filesystem' | 'network' | 'secrets' | 'hook' | 'instruction' | 'scope' | 'observability';
|
|
9
|
+
/**
|
|
10
|
+
* Rule definition metadata
|
|
11
|
+
*/
|
|
12
|
+
export interface RuleDefinition {
|
|
13
|
+
id: string;
|
|
14
|
+
group: RuleGroup;
|
|
15
|
+
severity: Severity;
|
|
16
|
+
title: string;
|
|
17
|
+
description: string;
|
|
18
|
+
recommendation: string;
|
|
19
|
+
tags: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Rule evaluation context
|
|
23
|
+
*/
|
|
24
|
+
export interface RuleContext {
|
|
25
|
+
document: AgentDocument;
|
|
26
|
+
allDocuments: AgentDocument[];
|
|
27
|
+
capabilitySummary: CapabilitySummary;
|
|
28
|
+
minConfidence: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Rule evaluation result
|
|
32
|
+
*/
|
|
33
|
+
export interface RuleResult {
|
|
34
|
+
rule: RuleDefinition;
|
|
35
|
+
findings: Finding[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Base rule interface
|
|
39
|
+
*/
|
|
40
|
+
export interface Rule {
|
|
41
|
+
/**
|
|
42
|
+
* Get rule definition/metadata
|
|
43
|
+
*/
|
|
44
|
+
getDefinition(): RuleDefinition;
|
|
45
|
+
/**
|
|
46
|
+
* Evaluate the rule against a document
|
|
47
|
+
*/
|
|
48
|
+
evaluate(context: RuleContext): Finding[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Rule engine options
|
|
52
|
+
*/
|
|
53
|
+
export interface RuleEngineOptions {
|
|
54
|
+
minConfidence: number;
|
|
55
|
+
disabledRules: string[];
|
|
56
|
+
severityOverrides: Record<string, Severity>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAElF;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,YAAY,GACZ,SAAS,GACT,SAAS,GACT,MAAM,GACN,aAAa,GACb,OAAO,GACP,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB;;OAEG;IACH,aAAa,IAAI,cAAc,CAAC;IAEhC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,EAAE,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentLint Scanner
|
|
3
|
+
* Core orchestration for parsing, rule evaluation, and report generation
|
|
4
|
+
*/
|
|
5
|
+
import { AgentDocument, CapabilitySummary, Finding, PermissionManifest, ScanStatus } from './ir/types';
|
|
6
|
+
import { PolicyConfig } from './policy/types';
|
|
7
|
+
import { ReportData } from './reports/types';
|
|
8
|
+
export interface ScanOptions {
|
|
9
|
+
root: string;
|
|
10
|
+
include: string[];
|
|
11
|
+
exclude: string[];
|
|
12
|
+
policy: PolicyConfig;
|
|
13
|
+
ciMode: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ScanResult {
|
|
16
|
+
documents: AgentDocument[];
|
|
17
|
+
findings: Finding[];
|
|
18
|
+
capabilitySummary: CapabilitySummary;
|
|
19
|
+
recommendedPermissions: PermissionManifest;
|
|
20
|
+
status: ScanStatus;
|
|
21
|
+
exitCode: number;
|
|
22
|
+
errors: string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Main scanner class
|
|
26
|
+
*/
|
|
27
|
+
export declare class Scanner {
|
|
28
|
+
private parserFactory;
|
|
29
|
+
private ruleEngine;
|
|
30
|
+
private options;
|
|
31
|
+
constructor(options?: Partial<ScanOptions>);
|
|
32
|
+
/**
|
|
33
|
+
* Run the scan
|
|
34
|
+
*/
|
|
35
|
+
scan(): Promise<ScanResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Find files matching the include/exclude patterns
|
|
38
|
+
*/
|
|
39
|
+
private findFiles;
|
|
40
|
+
/**
|
|
41
|
+
* Compute capability summary from all documents
|
|
42
|
+
*/
|
|
43
|
+
private computeCapabilitySummary;
|
|
44
|
+
/**
|
|
45
|
+
* Generate recommended permission manifest based on detected capabilities
|
|
46
|
+
*/
|
|
47
|
+
private generateRecommendedPermissions;
|
|
48
|
+
private isBroadPath;
|
|
49
|
+
private isDynamicCommand;
|
|
50
|
+
/**
|
|
51
|
+
* Determine scan status and exit code based on findings
|
|
52
|
+
*/
|
|
53
|
+
private determineStatus;
|
|
54
|
+
private createEmptyCapabilitySummary;
|
|
55
|
+
private createEmptyPermissionManifest;
|
|
56
|
+
/**
|
|
57
|
+
* Create report data for output generation
|
|
58
|
+
*/
|
|
59
|
+
createReportData(result: ScanResult): ReportData;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACL,aAAa,EAEb,iBAAiB,EAEjB,OAAO,EACP,kBAAkB,EAElB,UAAU,EAIX,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAiB,MAAM,iBAAiB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,sBAAsB,EAAE,kBAAkB,CAAC;IAC3C,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,GAAE,OAAO,CAAC,WAAW,CAAM;IAsB9C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAiEjC;;OAEG;YACW,SAAS;IAuBvB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAwHhC;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAkCtC,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,4BAA4B;IAWpC,OAAO,CAAC,6BAA6B;IAarC;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU;CAkFjD"}
|