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.
Files changed (136) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/LICENSE +190 -0
  3. package/README.md +246 -0
  4. package/dist/cli/index.d.ts +7 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +351 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/diff/index.d.ts +16 -0
  9. package/dist/diff/index.d.ts.map +1 -0
  10. package/dist/diff/index.js +204 -0
  11. package/dist/diff/index.js.map +1 -0
  12. package/dist/index.d.ts +21 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +55 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/ir/index.d.ts +2 -0
  17. package/dist/ir/index.d.ts.map +1 -0
  18. package/dist/ir/index.js +18 -0
  19. package/dist/ir/index.js.map +1 -0
  20. package/dist/ir/types.d.ts +369 -0
  21. package/dist/ir/types.d.ts.map +1 -0
  22. package/dist/ir/types.js +12 -0
  23. package/dist/ir/types.js.map +1 -0
  24. package/dist/parsers/base.d.ts +104 -0
  25. package/dist/parsers/base.d.ts.map +1 -0
  26. package/dist/parsers/base.js +373 -0
  27. package/dist/parsers/base.js.map +1 -0
  28. package/dist/parsers/claude.d.ts +30 -0
  29. package/dist/parsers/claude.d.ts.map +1 -0
  30. package/dist/parsers/claude.js +453 -0
  31. package/dist/parsers/claude.js.map +1 -0
  32. package/dist/parsers/cursor.d.ts +24 -0
  33. package/dist/parsers/cursor.d.ts.map +1 -0
  34. package/dist/parsers/cursor.js +305 -0
  35. package/dist/parsers/cursor.js.map +1 -0
  36. package/dist/parsers/factory.d.ts +30 -0
  37. package/dist/parsers/factory.d.ts.map +1 -0
  38. package/dist/parsers/factory.js +78 -0
  39. package/dist/parsers/factory.js.map +1 -0
  40. package/dist/parsers/index.d.ts +5 -0
  41. package/dist/parsers/index.d.ts.map +1 -0
  42. package/dist/parsers/index.js +21 -0
  43. package/dist/parsers/index.js.map +1 -0
  44. package/dist/policy/index.d.ts +3 -0
  45. package/dist/policy/index.d.ts.map +1 -0
  46. package/dist/policy/index.js +19 -0
  47. package/dist/policy/index.js.map +1 -0
  48. package/dist/policy/loader.d.ts +23 -0
  49. package/dist/policy/loader.d.ts.map +1 -0
  50. package/dist/policy/loader.js +252 -0
  51. package/dist/policy/loader.js.map +1 -0
  52. package/dist/policy/types.d.ts +79 -0
  53. package/dist/policy/types.d.ts.map +1 -0
  54. package/dist/policy/types.js +99 -0
  55. package/dist/policy/types.js.map +1 -0
  56. package/dist/reports/index.d.ts +14 -0
  57. package/dist/reports/index.d.ts.map +1 -0
  58. package/dist/reports/index.js +54 -0
  59. package/dist/reports/index.js.map +1 -0
  60. package/dist/reports/json.d.ts +16 -0
  61. package/dist/reports/json.d.ts.map +1 -0
  62. package/dist/reports/json.js +126 -0
  63. package/dist/reports/json.js.map +1 -0
  64. package/dist/reports/sarif.d.ts +20 -0
  65. package/dist/reports/sarif.d.ts.map +1 -0
  66. package/dist/reports/sarif.js +169 -0
  67. package/dist/reports/sarif.js.map +1 -0
  68. package/dist/reports/text.d.ts +25 -0
  69. package/dist/reports/text.d.ts.map +1 -0
  70. package/dist/reports/text.js +283 -0
  71. package/dist/reports/text.js.map +1 -0
  72. package/dist/reports/types.d.ts +88 -0
  73. package/dist/reports/types.d.ts.map +1 -0
  74. package/dist/reports/types.js +6 -0
  75. package/dist/reports/types.js.map +1 -0
  76. package/dist/rules/base.d.ts +16 -0
  77. package/dist/rules/base.d.ts.map +1 -0
  78. package/dist/rules/base.js +48 -0
  79. package/dist/rules/base.js.map +1 -0
  80. package/dist/rules/engine.d.ts +61 -0
  81. package/dist/rules/engine.d.ts.map +1 -0
  82. package/dist/rules/engine.js +195 -0
  83. package/dist/rules/engine.js.map +1 -0
  84. package/dist/rules/execution.d.ts +33 -0
  85. package/dist/rules/execution.d.ts.map +1 -0
  86. package/dist/rules/execution.js +154 -0
  87. package/dist/rules/execution.js.map +1 -0
  88. package/dist/rules/filesystem.d.ts +36 -0
  89. package/dist/rules/filesystem.d.ts.map +1 -0
  90. package/dist/rules/filesystem.js +227 -0
  91. package/dist/rules/filesystem.js.map +1 -0
  92. package/dist/rules/hook.d.ts +25 -0
  93. package/dist/rules/hook.d.ts.map +1 -0
  94. package/dist/rules/hook.js +112 -0
  95. package/dist/rules/hook.js.map +1 -0
  96. package/dist/rules/index.d.ts +12 -0
  97. package/dist/rules/index.d.ts.map +1 -0
  98. package/dist/rules/index.js +28 -0
  99. package/dist/rules/index.js.map +1 -0
  100. package/dist/rules/instruction.d.ts +25 -0
  101. package/dist/rules/instruction.d.ts.map +1 -0
  102. package/dist/rules/instruction.js +162 -0
  103. package/dist/rules/instruction.js.map +1 -0
  104. package/dist/rules/network.d.ts +33 -0
  105. package/dist/rules/network.d.ts.map +1 -0
  106. package/dist/rules/network.js +145 -0
  107. package/dist/rules/network.js.map +1 -0
  108. package/dist/rules/observability.d.ts +25 -0
  109. package/dist/rules/observability.d.ts.map +1 -0
  110. package/dist/rules/observability.js +105 -0
  111. package/dist/rules/observability.js.map +1 -0
  112. package/dist/rules/scope.d.ts +37 -0
  113. package/dist/rules/scope.d.ts.map +1 -0
  114. package/dist/rules/scope.js +173 -0
  115. package/dist/rules/scope.js.map +1 -0
  116. package/dist/rules/secrets.d.ts +35 -0
  117. package/dist/rules/secrets.d.ts.map +1 -0
  118. package/dist/rules/secrets.js +273 -0
  119. package/dist/rules/secrets.js.map +1 -0
  120. package/dist/rules/types.d.ts +58 -0
  121. package/dist/rules/types.d.ts.map +1 -0
  122. package/dist/rules/types.js +6 -0
  123. package/dist/rules/types.js.map +1 -0
  124. package/dist/scanner.d.ts +61 -0
  125. package/dist/scanner.d.ts.map +1 -0
  126. package/dist/scanner.js +441 -0
  127. package/dist/scanner.js.map +1 -0
  128. package/dist/utils/hash.d.ts +28 -0
  129. package/dist/utils/hash.d.ts.map +1 -0
  130. package/dist/utils/hash.js +94 -0
  131. package/dist/utils/hash.js.map +1 -0
  132. package/dist/utils/index.d.ts +2 -0
  133. package/dist/utils/index.d.ts.map +1 -0
  134. package/dist/utils/index.js +18 -0
  135. package/dist/utils/index.js.map +1 -0
  136. 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,6 @@
1
+ "use strict";
2
+ /**
3
+ * Rule types and interfaces
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -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"}