hackmyagent 0.8.0 → 0.9.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/README.md +168 -295
- package/dist/abgr/controls.d.ts +35 -0
- package/dist/abgr/controls.d.ts.map +1 -0
- package/dist/abgr/controls.js +1058 -0
- package/dist/abgr/controls.js.map +1 -0
- package/dist/abgr/detector.d.ts +45 -0
- package/dist/abgr/detector.d.ts.map +1 -0
- package/dist/abgr/detector.js +175 -0
- package/dist/abgr/detector.js.map +1 -0
- package/dist/abgr/index.d.ts +24 -0
- package/dist/abgr/index.d.ts.map +1 -0
- package/dist/abgr/index.js +50 -0
- package/dist/abgr/index.js.map +1 -0
- package/dist/abgr/scorer.d.ts +36 -0
- package/dist/abgr/scorer.d.ts.map +1 -0
- package/dist/abgr/scorer.js +205 -0
- package/dist/abgr/scorer.js.map +1 -0
- package/dist/abgr/templates.d.ts +35 -0
- package/dist/abgr/templates.d.ts.map +1 -0
- package/dist/abgr/templates.js +668 -0
- package/dist/abgr/templates.js.map +1 -0
- package/dist/abgr/tier.d.ts +27 -0
- package/dist/abgr/tier.d.ts.map +1 -0
- package/dist/abgr/tier.js +115 -0
- package/dist/abgr/tier.js.map +1 -0
- package/dist/abgr/types.d.ts +59 -0
- package/dist/abgr/types.d.ts.map +1 -0
- package/dist/abgr/types.js +10 -0
- package/dist/abgr/types.js.map +1 -0
- package/dist/agent-scan/checks.d.ts +6 -0
- package/dist/agent-scan/checks.d.ts.map +1 -0
- package/dist/agent-scan/checks.js +93 -0
- package/dist/agent-scan/checks.js.map +1 -0
- package/dist/agent-scan/index.d.ts +10 -0
- package/dist/agent-scan/index.d.ts.map +1 -0
- package/dist/agent-scan/index.js +16 -0
- package/dist/agent-scan/index.js.map +1 -0
- package/dist/agent-scan/scanner.d.ts +31 -0
- package/dist/agent-scan/scanner.d.ts.map +1 -0
- package/dist/agent-scan/scanner.js +484 -0
- package/dist/agent-scan/scanner.js.map +1 -0
- package/dist/agent-scan/types.d.ts +63 -0
- package/dist/agent-scan/types.d.ts.map +1 -0
- package/dist/agent-scan/types.js +10 -0
- package/dist/agent-scan/types.js.map +1 -0
- package/dist/arp/cli/index.js +6 -0
- package/dist/arp/cli/index.js.map +1 -1
- package/dist/cli.js +219 -0
- package/dist/cli.js.map +1 -1
- package/dist/hardening/llm-checks.d.ts +18 -0
- package/dist/hardening/llm-checks.d.ts.map +1 -0
- package/dist/hardening/llm-checks.js +434 -0
- package/dist/hardening/llm-checks.js.map +1 -0
- package/dist/hardening/mcp-tool-enum.d.ts +45 -0
- package/dist/hardening/mcp-tool-enum.d.ts.map +1 -0
- package/dist/hardening/mcp-tool-enum.js +315 -0
- package/dist/hardening/mcp-tool-enum.js.map +1 -0
- package/dist/hardening/scanner.js +3 -3
- package/dist/hardening/scanner.js.map +1 -1
- package/dist/hardening/shell-checks.d.ts +21 -0
- package/dist/hardening/shell-checks.d.ts.map +1 -0
- package/dist/hardening/shell-checks.js +236 -0
- package/dist/hardening/shell-checks.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/registry/client.js +2 -2
- package/dist/registry/client.js.map +1 -1
- package/dist/registry/contribution.d.ts +178 -0
- package/dist/registry/contribution.d.ts.map +1 -0
- package/dist/registry/contribution.js +272 -0
- package/dist/registry/contribution.js.map +1 -0
- package/dist/soul/index.d.ts +8 -0
- package/dist/soul/index.d.ts.map +1 -0
- package/dist/soul/index.js +14 -0
- package/dist/soul/index.js.map +1 -0
- package/dist/soul/scanner.d.ts +95 -0
- package/dist/soul/scanner.d.ts.map +1 -0
- package/dist/soul/scanner.js +411 -0
- package/dist/soul/scanner.js.map +1 -0
- package/dist/soul/templates.d.ts +12 -0
- package/dist/soul/templates.d.ts.map +1 -0
- package/dist/soul/templates.js +211 -0
- package/dist/soul/templates.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Anonymous registry contribution for scan results.
|
|
4
|
+
*
|
|
5
|
+
* When users opt in (--contribute flag), scan results are submitted
|
|
6
|
+
* anonymously to the OpenA2A registry for aggregate security intelligence.
|
|
7
|
+
*
|
|
8
|
+
* What IS sent:
|
|
9
|
+
* - SHA256 hash of scanned artifact (for deduplication, not identification)
|
|
10
|
+
* - Scan type and version
|
|
11
|
+
* - Finding IDs and severities (no file paths or content)
|
|
12
|
+
* - Domain scores (for governance scans)
|
|
13
|
+
* - Agent tier classification
|
|
14
|
+
* - Timestamp and scanner version
|
|
15
|
+
*
|
|
16
|
+
* What is NEVER sent:
|
|
17
|
+
* - File paths, file content, or source code
|
|
18
|
+
* - Usernames, hostnames, or IP addresses
|
|
19
|
+
* - Environment variables or credential values
|
|
20
|
+
* - Directory structure or project names
|
|
21
|
+
*/
|
|
22
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
25
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
26
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
27
|
+
}
|
|
28
|
+
Object.defineProperty(o, k2, desc);
|
|
29
|
+
}) : (function(o, m, k, k2) {
|
|
30
|
+
if (k2 === undefined) k2 = k;
|
|
31
|
+
o[k2] = m[k];
|
|
32
|
+
}));
|
|
33
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
34
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
35
|
+
}) : function(o, v) {
|
|
36
|
+
o["default"] = v;
|
|
37
|
+
});
|
|
38
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
39
|
+
var ownKeys = function(o) {
|
|
40
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
41
|
+
var ar = [];
|
|
42
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
43
|
+
return ar;
|
|
44
|
+
};
|
|
45
|
+
return ownKeys(o);
|
|
46
|
+
};
|
|
47
|
+
return function (mod) {
|
|
48
|
+
if (mod && mod.__esModule) return mod;
|
|
49
|
+
var result = {};
|
|
50
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
51
|
+
__setModuleDefault(result, mod);
|
|
52
|
+
return result;
|
|
53
|
+
};
|
|
54
|
+
})();
|
|
55
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
56
|
+
exports.hashArtifact = hashArtifact;
|
|
57
|
+
exports.generateContributionId = generateContributionId;
|
|
58
|
+
exports.extractFindingIds = extractFindingIds;
|
|
59
|
+
exports.countBySeverity = countBySeverity;
|
|
60
|
+
exports.buildHardeningContribution = buildHardeningContribution;
|
|
61
|
+
exports.buildGovernanceContribution = buildGovernanceContribution;
|
|
62
|
+
exports.buildMcpContribution = buildMcpContribution;
|
|
63
|
+
exports.buildAttackContribution = buildAttackContribution;
|
|
64
|
+
exports.buildAgentScanContribution = buildAgentScanContribution;
|
|
65
|
+
exports.submitContribution = submitContribution;
|
|
66
|
+
const crypto = __importStar(require("crypto"));
|
|
67
|
+
/**
|
|
68
|
+
* Generate SHA256 hash of content for artifact identification.
|
|
69
|
+
* The hash allows deduplication without revealing content.
|
|
70
|
+
*/
|
|
71
|
+
function hashArtifact(content) {
|
|
72
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate a random contribution ID.
|
|
76
|
+
*/
|
|
77
|
+
function generateContributionId() {
|
|
78
|
+
return crypto.randomUUID();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Strip PII from a finding list -- return only check IDs.
|
|
82
|
+
*/
|
|
83
|
+
function extractFindingIds(findings) {
|
|
84
|
+
return [...new Set(findings.map(f => f.checkId))].sort();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Count findings by severity.
|
|
88
|
+
*/
|
|
89
|
+
function countBySeverity(findings) {
|
|
90
|
+
const failed = findings.filter(f => f.passed === false);
|
|
91
|
+
return {
|
|
92
|
+
critical: failed.filter(f => f.severity === 'critical').length,
|
|
93
|
+
high: failed.filter(f => f.severity === 'high').length,
|
|
94
|
+
medium: failed.filter(f => f.severity === 'medium').length,
|
|
95
|
+
low: failed.filter(f => f.severity === 'low').length,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Build a contribution payload from hardening scan results.
|
|
100
|
+
*/
|
|
101
|
+
function buildHardeningContribution(scannerVersion, artifactContent, findings, score, maxScore, durationMs) {
|
|
102
|
+
const counts = countBySeverity(findings);
|
|
103
|
+
return {
|
|
104
|
+
contributionId: generateContributionId(),
|
|
105
|
+
artifactHash: hashArtifact(artifactContent),
|
|
106
|
+
scanType: 'hardening',
|
|
107
|
+
scannerVersion,
|
|
108
|
+
scanTimestamp: new Date().toISOString(),
|
|
109
|
+
scanDurationMs: durationMs,
|
|
110
|
+
totalFindings: counts.critical + counts.high + counts.medium + counts.low,
|
|
111
|
+
criticalCount: counts.critical,
|
|
112
|
+
highCount: counts.high,
|
|
113
|
+
mediumCount: counts.medium,
|
|
114
|
+
lowCount: counts.low,
|
|
115
|
+
findingIds: extractFindingIds(findings.filter(f => !f.passed)),
|
|
116
|
+
score,
|
|
117
|
+
maxScore,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Build a contribution payload from governance scan results.
|
|
122
|
+
*/
|
|
123
|
+
function buildGovernanceContribution(scannerVersion, artifactContent, governanceScore, durationMs) {
|
|
124
|
+
const failed = governanceScore.results.filter(r => !r.passed);
|
|
125
|
+
const counts = countBySeverity(failed.map(r => ({ severity: r.severity, passed: false })));
|
|
126
|
+
return {
|
|
127
|
+
contributionId: generateContributionId(),
|
|
128
|
+
artifactHash: hashArtifact(artifactContent),
|
|
129
|
+
scanType: 'governance',
|
|
130
|
+
scannerVersion,
|
|
131
|
+
scanTimestamp: new Date().toISOString(),
|
|
132
|
+
scanDurationMs: durationMs,
|
|
133
|
+
totalFindings: failed.length,
|
|
134
|
+
criticalCount: counts.critical,
|
|
135
|
+
highCount: counts.high,
|
|
136
|
+
mediumCount: counts.medium,
|
|
137
|
+
lowCount: counts.low,
|
|
138
|
+
findingIds: failed.map(r => r.controlId),
|
|
139
|
+
score: governanceScore.overall,
|
|
140
|
+
maxScore: 100,
|
|
141
|
+
grade: governanceScore.grade,
|
|
142
|
+
governance: {
|
|
143
|
+
tier: governanceScore.tier,
|
|
144
|
+
domainScores: governanceScore.domains.map(d => ({
|
|
145
|
+
domain: d.domain,
|
|
146
|
+
score: d.score,
|
|
147
|
+
controlsPassed: d.controlsPassed,
|
|
148
|
+
controlsTotal: d.controlsTotal,
|
|
149
|
+
})),
|
|
150
|
+
criticalFailures: governanceScore.criticalFailures,
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Build a contribution payload from MCP tool enumeration.
|
|
156
|
+
*/
|
|
157
|
+
function buildMcpContribution(scannerVersion, configContent, serverResults, durationMs) {
|
|
158
|
+
const allFindings = serverResults.flatMap(s => s.findings);
|
|
159
|
+
const counts = countBySeverity(allFindings.map(f => ({ severity: f.severity, passed: false })));
|
|
160
|
+
const categories = new Set();
|
|
161
|
+
for (const f of allFindings) {
|
|
162
|
+
if (f.checkId === 'MCPTOOL-001')
|
|
163
|
+
categories.add('execution');
|
|
164
|
+
if (f.checkId === 'MCPTOOL-002')
|
|
165
|
+
categories.add('filesystem');
|
|
166
|
+
if (f.checkId === 'MCPTOOL-003')
|
|
167
|
+
categories.add('network');
|
|
168
|
+
if (f.checkId === 'MCPTOOL-004')
|
|
169
|
+
categories.add('credential');
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
contributionId: generateContributionId(),
|
|
173
|
+
artifactHash: hashArtifact(configContent),
|
|
174
|
+
scanType: 'mcp-enumeration',
|
|
175
|
+
scannerVersion,
|
|
176
|
+
scanTimestamp: new Date().toISOString(),
|
|
177
|
+
scanDurationMs: durationMs,
|
|
178
|
+
totalFindings: allFindings.length,
|
|
179
|
+
criticalCount: counts.critical,
|
|
180
|
+
highCount: counts.high,
|
|
181
|
+
mediumCount: counts.medium,
|
|
182
|
+
lowCount: counts.low,
|
|
183
|
+
findingIds: [...new Set(allFindings.map(f => f.checkId))].sort(),
|
|
184
|
+
mcpEnumeration: {
|
|
185
|
+
serversScanned: serverResults.length,
|
|
186
|
+
totalTools: serverResults.reduce((sum, s) => sum + s.toolCount, 0),
|
|
187
|
+
dangerousToolCount: allFindings.length,
|
|
188
|
+
categories: [...categories],
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Build a contribution payload from attack scan results.
|
|
194
|
+
*/
|
|
195
|
+
function buildAttackContribution(scannerVersion, targetIdentifier, attackReport, durationMs) {
|
|
196
|
+
return {
|
|
197
|
+
contributionId: generateContributionId(),
|
|
198
|
+
artifactHash: hashArtifact(targetIdentifier),
|
|
199
|
+
scanType: 'attack',
|
|
200
|
+
scannerVersion,
|
|
201
|
+
scanTimestamp: new Date().toISOString(),
|
|
202
|
+
scanDurationMs: durationMs,
|
|
203
|
+
totalFindings: attackReport.bypassed,
|
|
204
|
+
criticalCount: 0,
|
|
205
|
+
highCount: attackReport.bypassed,
|
|
206
|
+
mediumCount: 0,
|
|
207
|
+
lowCount: 0,
|
|
208
|
+
findingIds: attackReport.categories,
|
|
209
|
+
attack: {
|
|
210
|
+
categories: attackReport.categories,
|
|
211
|
+
payloadsRun: attackReport.totalPayloads,
|
|
212
|
+
payloadsBlocked: attackReport.blocked,
|
|
213
|
+
payloadsBypassed: attackReport.bypassed,
|
|
214
|
+
blockRate: attackReport.blockRate,
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Build a contribution payload from agent card scan results.
|
|
220
|
+
*/
|
|
221
|
+
function buildAgentScanContribution(scannerVersion, artifactContent, scanResult, durationMs) {
|
|
222
|
+
const counts = countBySeverity(scanResult.findings.map(f => ({ severity: f.severity, passed: f.passed })));
|
|
223
|
+
return {
|
|
224
|
+
contributionId: generateContributionId(),
|
|
225
|
+
artifactHash: hashArtifact(artifactContent),
|
|
226
|
+
scanType: 'agent-scan',
|
|
227
|
+
scannerVersion,
|
|
228
|
+
scanTimestamp: new Date().toISOString(),
|
|
229
|
+
scanDurationMs: durationMs,
|
|
230
|
+
totalFindings: counts.critical + counts.high + counts.medium + counts.low,
|
|
231
|
+
criticalCount: counts.critical,
|
|
232
|
+
highCount: counts.high,
|
|
233
|
+
mediumCount: counts.medium,
|
|
234
|
+
lowCount: counts.low,
|
|
235
|
+
findingIds: extractFindingIds(scanResult.findings.filter(f => !f.passed)),
|
|
236
|
+
score: scanResult.score,
|
|
237
|
+
maxScore: 100,
|
|
238
|
+
grade: scanResult.grade,
|
|
239
|
+
agentScan: {
|
|
240
|
+
checksTotal: scanResult.findings.length,
|
|
241
|
+
checksPassed: scanResult.findings.filter(f => f.passed).length,
|
|
242
|
+
criticalFailures: scanResult.criticalFailures.length,
|
|
243
|
+
hasPublicKey: typeof scanResult.card.publicKey === 'string' && scanResult.card.publicKey.length > 0,
|
|
244
|
+
hasAttestation: scanResult.card.aimAttestation != null,
|
|
245
|
+
trustScore: scanResult.card.aimAttestation?.trustScore,
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Submit contribution to registry. Never throws -- contribution failure is non-fatal.
|
|
251
|
+
*/
|
|
252
|
+
async function submitContribution(registryUrl, payload) {
|
|
253
|
+
try {
|
|
254
|
+
const response = await fetch(`${registryUrl}/api/v1/registry/community/contribute`, {
|
|
255
|
+
method: 'POST',
|
|
256
|
+
headers: {
|
|
257
|
+
'Content-Type': 'application/json',
|
|
258
|
+
'User-Agent': 'HackMyAgent-CLI',
|
|
259
|
+
},
|
|
260
|
+
body: JSON.stringify(payload),
|
|
261
|
+
});
|
|
262
|
+
if (!response.ok) {
|
|
263
|
+
const body = await response.json().catch(() => ({}));
|
|
264
|
+
return { status: 'failed', message: body.message || `HTTP ${response.status}` };
|
|
265
|
+
}
|
|
266
|
+
return await response.json();
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return { status: 'failed', message: 'Network error' };
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=contribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contribution.js","sourceRoot":"","sources":["../../src/registry/contribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Soul module - Behavioral Governance Scanner
|
|
3
|
+
*/
|
|
4
|
+
export { SoulScanner, CONTROL_DEFS, DOMAIN_ORDER, GOVERNANCE_FILES } from './scanner';
|
|
5
|
+
export type { AgentTier, SoulGrade, ControlCheck, DomainResult, SoulScanResult, HardenResult, } from './scanner';
|
|
6
|
+
export { DOMAIN_TEMPLATES } from './templates';
|
|
7
|
+
export type { DomainTemplate } from './templates';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/soul/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACtF,YAAY,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Soul module - Behavioral Governance Scanner
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DOMAIN_TEMPLATES = exports.GOVERNANCE_FILES = exports.DOMAIN_ORDER = exports.CONTROL_DEFS = exports.SoulScanner = void 0;
|
|
7
|
+
var scanner_1 = require("./scanner");
|
|
8
|
+
Object.defineProperty(exports, "SoulScanner", { enumerable: true, get: function () { return scanner_1.SoulScanner; } });
|
|
9
|
+
Object.defineProperty(exports, "CONTROL_DEFS", { enumerable: true, get: function () { return scanner_1.CONTROL_DEFS; } });
|
|
10
|
+
Object.defineProperty(exports, "DOMAIN_ORDER", { enumerable: true, get: function () { return scanner_1.DOMAIN_ORDER; } });
|
|
11
|
+
Object.defineProperty(exports, "GOVERNANCE_FILES", { enumerable: true, get: function () { return scanner_1.GOVERNANCE_FILES; } });
|
|
12
|
+
var templates_1 = require("./templates");
|
|
13
|
+
Object.defineProperty(exports, "DOMAIN_TEMPLATES", { enumerable: true, get: function () { return templates_1.DOMAIN_TEMPLATES; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/soul/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,qCAAsF;AAA7E,sGAAA,WAAW,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AASlE,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOUL Scanner - Behavioral Governance Scanner
|
|
3
|
+
*
|
|
4
|
+
* Scans governance files (SOUL.md, system-prompt.md, etc.) for coverage
|
|
5
|
+
* across 8 behavioral governance domains defined in OASB v2.
|
|
6
|
+
*/
|
|
7
|
+
export type AgentTier = 'BASIC' | 'TOOL-USING' | 'AGENTIC' | 'MULTI-AGENT';
|
|
8
|
+
export type SoulGrade = 'A' | 'B' | 'C' | 'D' | 'F';
|
|
9
|
+
export interface ControlCheck {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
domain: string;
|
|
13
|
+
keywords: string[];
|
|
14
|
+
passed: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface DomainResult {
|
|
17
|
+
domain: string;
|
|
18
|
+
domainId: number;
|
|
19
|
+
controls: ControlCheck[];
|
|
20
|
+
passed: number;
|
|
21
|
+
total: number;
|
|
22
|
+
percentage: number;
|
|
23
|
+
}
|
|
24
|
+
export interface SoulScanResult {
|
|
25
|
+
file: string | null;
|
|
26
|
+
fileSize: number;
|
|
27
|
+
agentTier: AgentTier;
|
|
28
|
+
domains: DomainResult[];
|
|
29
|
+
score: number;
|
|
30
|
+
grade: SoulGrade;
|
|
31
|
+
criticalFloor: boolean;
|
|
32
|
+
criticalMissing: string[];
|
|
33
|
+
totalControls: number;
|
|
34
|
+
totalPassed: number;
|
|
35
|
+
}
|
|
36
|
+
export interface HardenResult {
|
|
37
|
+
file: string;
|
|
38
|
+
sectionsAdded: string[];
|
|
39
|
+
controlsAdded: number;
|
|
40
|
+
dryRun: boolean;
|
|
41
|
+
content: string;
|
|
42
|
+
existedBefore: boolean;
|
|
43
|
+
}
|
|
44
|
+
declare const GOVERNANCE_FILES: string[];
|
|
45
|
+
interface ControlDef {
|
|
46
|
+
id: string;
|
|
47
|
+
name: string;
|
|
48
|
+
domain: string;
|
|
49
|
+
domainId: number;
|
|
50
|
+
keywords: string[];
|
|
51
|
+
critical?: boolean;
|
|
52
|
+
/** Which tiers must satisfy this control. Empty means all tiers. */
|
|
53
|
+
tiers: AgentTier[];
|
|
54
|
+
}
|
|
55
|
+
declare const CONTROL_DEFS: ControlDef[];
|
|
56
|
+
declare const DOMAIN_ORDER: string[];
|
|
57
|
+
export declare class SoulScanner {
|
|
58
|
+
/**
|
|
59
|
+
* Find the governance file in a directory.
|
|
60
|
+
* Returns the first match from GOVERNANCE_FILES priority order, or null.
|
|
61
|
+
*/
|
|
62
|
+
findGovernanceFile(targetDir: string): string | null;
|
|
63
|
+
/**
|
|
64
|
+
* Detect agent tier by scanning governance file content and project files.
|
|
65
|
+
*/
|
|
66
|
+
detectTier(targetDir: string, governanceContent: string): AgentTier;
|
|
67
|
+
/**
|
|
68
|
+
* Check if content matches any keyword for a control.
|
|
69
|
+
* Case-insensitive substring match.
|
|
70
|
+
*/
|
|
71
|
+
private checkControl;
|
|
72
|
+
/**
|
|
73
|
+
* Calculate grade from score, applying critical floor if needed.
|
|
74
|
+
*/
|
|
75
|
+
private calculateGrade;
|
|
76
|
+
/**
|
|
77
|
+
* Return the subset of controls applicable to a given agent tier.
|
|
78
|
+
*/
|
|
79
|
+
private applicableControls;
|
|
80
|
+
/**
|
|
81
|
+
* Scan a directory for behavioral governance coverage.
|
|
82
|
+
*/
|
|
83
|
+
scanSoul(targetDir: string, options?: {
|
|
84
|
+
verbose?: boolean;
|
|
85
|
+
tier?: string;
|
|
86
|
+
}): Promise<SoulScanResult>;
|
|
87
|
+
/**
|
|
88
|
+
* Generate or update SOUL.md with missing governance sections.
|
|
89
|
+
*/
|
|
90
|
+
hardenSoul(targetDir: string, options?: {
|
|
91
|
+
dryRun?: boolean;
|
|
92
|
+
}): Promise<HardenResult>;
|
|
93
|
+
}
|
|
94
|
+
export { CONTROL_DEFS, DOMAIN_ORDER, GOVERNANCE_FILES };
|
|
95
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/soul/scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,GAAG,aAAa,CAAC;AAE3E,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;CACxB;AAMD,QAAA,MAAM,gBAAgB,UAWrB,CAAC;AAMF,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAOD,QAAA,MAAM,YAAY,EAAE,UAAU,EAoE7B,CAAC;AAGF,QAAA,MAAM,YAAY,UASjB,CAAC;AAgBF,qBAAa,WAAW;IACtB;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUpD;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,SAAS;IAiCnE;;;OAGG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAqG1G;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;CA6E3F;AAGD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|