opena2a-cli 0.1.2 → 0.3.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 +225 -1
- package/dist/commands/guard-hooks.d.ts +27 -0
- package/dist/commands/guard-hooks.d.ts.map +1 -0
- package/dist/commands/guard-hooks.js +207 -0
- package/dist/commands/guard-hooks.js.map +1 -0
- package/dist/commands/guard-policy.d.ts +54 -0
- package/dist/commands/guard-policy.d.ts.map +1 -0
- package/dist/commands/guard-policy.js +251 -0
- package/dist/commands/guard-policy.js.map +1 -0
- package/dist/commands/guard-signing.d.ts +52 -0
- package/dist/commands/guard-signing.d.ts.map +1 -0
- package/dist/commands/guard-signing.js +185 -0
- package/dist/commands/guard-signing.js.map +1 -0
- package/dist/commands/guard-snapshots.d.ts +54 -0
- package/dist/commands/guard-snapshots.d.ts.map +1 -0
- package/dist/commands/guard-snapshots.js +346 -0
- package/dist/commands/guard-snapshots.js.map +1 -0
- package/dist/commands/guard.d.ts +60 -4
- package/dist/commands/guard.d.ts.map +1 -1
- package/dist/commands/guard.js +475 -95
- package/dist/commands/guard.js.map +1 -1
- package/dist/commands/init.js +3 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/review.d.ts +110 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +634 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/shield.d.ts +3 -0
- package/dist/commands/shield.d.ts.map +1 -1
- package/dist/commands/shield.js +488 -34
- package/dist/commands/shield.js.map +1 -1
- package/dist/index.js +36 -6
- package/dist/index.js.map +1 -1
- package/dist/report/review-html.d.ts +16 -0
- package/dist/report/review-html.d.ts.map +1 -0
- package/dist/report/review-html.js +579 -0
- package/dist/report/review-html.js.map +1 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +2 -1
- package/dist/router.js.map +1 -1
- package/dist/shield/ai-tool-config.d.ts +49 -0
- package/dist/shield/ai-tool-config.d.ts.map +1 -0
- package/dist/shield/ai-tool-config.js +169 -0
- package/dist/shield/ai-tool-config.js.map +1 -0
- package/dist/shield/arp-bridge.d.ts +62 -0
- package/dist/shield/arp-bridge.d.ts.map +1 -0
- package/dist/shield/arp-bridge.js +198 -0
- package/dist/shield/arp-bridge.js.map +1 -0
- package/dist/shield/baselines.d.ts +58 -0
- package/dist/shield/baselines.d.ts.map +1 -0
- package/dist/shield/baselines.js +371 -0
- package/dist/shield/baselines.js.map +1 -0
- package/dist/shield/findings.d.ts +52 -0
- package/dist/shield/findings.d.ts.map +1 -0
- package/dist/shield/findings.js +336 -0
- package/dist/shield/findings.js.map +1 -0
- package/dist/shield/init.d.ts +3 -0
- package/dist/shield/init.d.ts.map +1 -1
- package/dist/shield/init.js +145 -12
- package/dist/shield/init.js.map +1 -1
- package/dist/shield/integrity.d.ts.map +1 -1
- package/dist/shield/integrity.js +6 -2
- package/dist/shield/integrity.js.map +1 -1
- package/dist/shield/report-html.d.ts +29 -0
- package/dist/shield/report-html.d.ts.map +1 -0
- package/dist/shield/report-html.js +689 -0
- package/dist/shield/report-html.js.map +1 -0
- package/dist/shield/sarif.d.ts +65 -0
- package/dist/shield/sarif.d.ts.map +1 -0
- package/dist/shield/sarif.js +108 -0
- package/dist/shield/sarif.js.map +1 -0
- package/dist/shield/status.d.ts.map +1 -1
- package/dist/shield/status.js +19 -6
- package/dist/shield/status.js.map +1 -1
- package/dist/shield/types.d.ts +19 -1
- package/dist/shield/types.d.ts.map +1 -1
- package/dist/shield/types.js +2 -1
- package/dist/shield/types.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Guard policy: signing requirements and heartbeat disable on tamper.
|
|
4
|
+
*
|
|
5
|
+
* Loads policy from `.opena2a/guard/policy.json`, checks compliance
|
|
6
|
+
* against the signature store, and manages the heartbeat-disabled marker.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports._internals = void 0;
|
|
43
|
+
exports.loadGuardPolicy = loadGuardPolicy;
|
|
44
|
+
exports.saveGuardPolicy = saveGuardPolicy;
|
|
45
|
+
exports.generateDefaultPolicy = generateDefaultPolicy;
|
|
46
|
+
exports.checkPolicyCompliance = checkPolicyCompliance;
|
|
47
|
+
exports.disableHeartbeat = disableHeartbeat;
|
|
48
|
+
exports.isHeartbeatDisabled = isHeartbeatDisabled;
|
|
49
|
+
exports.enableHeartbeat = enableHeartbeat;
|
|
50
|
+
exports.guardPolicy = guardPolicy;
|
|
51
|
+
const fs = __importStar(require("node:fs"));
|
|
52
|
+
const path = __importStar(require("node:path"));
|
|
53
|
+
const node_crypto_1 = require("node:crypto");
|
|
54
|
+
const colors_js_1 = require("../util/colors.js");
|
|
55
|
+
// --- Constants ---
|
|
56
|
+
const GUARD_DIR = '.opena2a/guard';
|
|
57
|
+
const POLICY_FILE = 'policy.json';
|
|
58
|
+
const HEARTBEAT_DISABLED_FILE = 'heartbeat-disabled';
|
|
59
|
+
const SIGNATURES_FILE = 'signatures.json';
|
|
60
|
+
const DEFAULT_CONFIG_FILES = [
|
|
61
|
+
'mcp.json', '.mcp.json', '.claude/settings.json',
|
|
62
|
+
'package.json', 'package-lock.json',
|
|
63
|
+
'arp.yaml', 'arp.yml', 'arp.json',
|
|
64
|
+
'openclaw.json', '.openclaw/config.json',
|
|
65
|
+
'.opena2a.yaml', '.opena2a.json',
|
|
66
|
+
'tsconfig.json', 'go.mod', 'go.sum',
|
|
67
|
+
'pyproject.toml', 'requirements.txt',
|
|
68
|
+
'Dockerfile', 'docker-compose.yml',
|
|
69
|
+
];
|
|
70
|
+
// --- Event emission ---
|
|
71
|
+
async function emitEvent(category, action, target, severity, outcome, detail) {
|
|
72
|
+
try {
|
|
73
|
+
const { writeEvent } = await import('../shield/events.js');
|
|
74
|
+
writeEvent({
|
|
75
|
+
source: 'configguard', category, severity,
|
|
76
|
+
agent: null, sessionId: null, action, target, outcome, detail,
|
|
77
|
+
orgId: null, managed: false, agentId: null,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Shield module not available
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// --- Policy loading ---
|
|
85
|
+
function loadGuardPolicy(targetDir) {
|
|
86
|
+
const policyPath = path.join(targetDir, GUARD_DIR, POLICY_FILE);
|
|
87
|
+
if (!fs.existsSync(policyPath))
|
|
88
|
+
return null;
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(fs.readFileSync(policyPath, 'utf-8'));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function saveGuardPolicy(targetDir, policy) {
|
|
97
|
+
const dir = path.join(targetDir, GUARD_DIR);
|
|
98
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
99
|
+
fs.writeFileSync(path.join(dir, POLICY_FILE), JSON.stringify(policy, null, 2) + '\n', 'utf-8');
|
|
100
|
+
}
|
|
101
|
+
// --- Default policy generation ---
|
|
102
|
+
function generateDefaultPolicy(targetDir) {
|
|
103
|
+
const detected = DEFAULT_CONFIG_FILES.filter(f => fs.existsSync(path.join(targetDir, f)));
|
|
104
|
+
return {
|
|
105
|
+
version: 1,
|
|
106
|
+
requiredFiles: detected,
|
|
107
|
+
blockOnUnsigned: true,
|
|
108
|
+
disableHeartbeatOnTamper: true,
|
|
109
|
+
autoRemediate: false,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// --- Compliance checking ---
|
|
113
|
+
function checkPolicyCompliance(targetDir, policy) {
|
|
114
|
+
const storePath = path.join(targetDir, GUARD_DIR, SIGNATURES_FILE);
|
|
115
|
+
let signatures = [];
|
|
116
|
+
try {
|
|
117
|
+
const store = JSON.parse(fs.readFileSync(storePath, 'utf-8'));
|
|
118
|
+
signatures = store.signatures ?? [];
|
|
119
|
+
}
|
|
120
|
+
catch { /* no store */ }
|
|
121
|
+
const sigMap = new Map(signatures.map(s => [s.filePath, s.hash]));
|
|
122
|
+
const requiredUnsigned = [];
|
|
123
|
+
const requiredTampered = [];
|
|
124
|
+
const requiredMissing = [];
|
|
125
|
+
let requiredSigned = 0;
|
|
126
|
+
for (const file of policy.requiredFiles) {
|
|
127
|
+
const fullPath = path.join(targetDir, file);
|
|
128
|
+
const storedHash = sigMap.get(file);
|
|
129
|
+
if (!storedHash) {
|
|
130
|
+
requiredUnsigned.push(file);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (!fs.existsSync(fullPath)) {
|
|
134
|
+
requiredMissing.push(file);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const content = fs.readFileSync(fullPath);
|
|
138
|
+
const currentHash = 'sha256:' + (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
|
|
139
|
+
if (currentHash === storedHash) {
|
|
140
|
+
requiredSigned++;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
requiredTampered.push(file);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const compliant = requiredUnsigned.length === 0 && requiredTampered.length === 0 && requiredMissing.length === 0;
|
|
147
|
+
return { compliant, requiredSigned, requiredUnsigned, requiredTampered, requiredMissing };
|
|
148
|
+
}
|
|
149
|
+
// --- Heartbeat management ---
|
|
150
|
+
function disableHeartbeat(targetDir, reason) {
|
|
151
|
+
const dir = path.join(targetDir, GUARD_DIR);
|
|
152
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
153
|
+
const marker = { disabled: true, reason, disabledAt: new Date().toISOString() };
|
|
154
|
+
fs.writeFileSync(path.join(dir, HEARTBEAT_DISABLED_FILE), JSON.stringify(marker, null, 2) + '\n', 'utf-8');
|
|
155
|
+
}
|
|
156
|
+
function isHeartbeatDisabled(targetDir) {
|
|
157
|
+
const markerPath = path.join(targetDir, GUARD_DIR, HEARTBEAT_DISABLED_FILE);
|
|
158
|
+
if (!fs.existsSync(markerPath))
|
|
159
|
+
return { disabled: false };
|
|
160
|
+
try {
|
|
161
|
+
const data = JSON.parse(fs.readFileSync(markerPath, 'utf-8'));
|
|
162
|
+
return { disabled: true, reason: data.reason, disabledAt: data.disabledAt };
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return { disabled: false };
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function enableHeartbeat(targetDir) {
|
|
169
|
+
const markerPath = path.join(targetDir, GUARD_DIR, HEARTBEAT_DISABLED_FILE);
|
|
170
|
+
if (fs.existsSync(markerPath))
|
|
171
|
+
fs.unlinkSync(markerPath);
|
|
172
|
+
}
|
|
173
|
+
// --- Guard policy subcommand handler ---
|
|
174
|
+
async function guardPolicy(targetDir, action, options) {
|
|
175
|
+
const isJson = options.format === 'json';
|
|
176
|
+
switch (action) {
|
|
177
|
+
case 'init': {
|
|
178
|
+
const policy = generateDefaultPolicy(targetDir);
|
|
179
|
+
saveGuardPolicy(targetDir, policy);
|
|
180
|
+
await emitEvent('policy.created', 'guard.policy.init', targetDir, 'info', 'allowed', {
|
|
181
|
+
requiredFiles: policy.requiredFiles, blockOnUnsigned: policy.blockOnUnsigned, disableHeartbeatOnTamper: policy.disableHeartbeatOnTamper,
|
|
182
|
+
});
|
|
183
|
+
if (isJson) {
|
|
184
|
+
process.stdout.write(JSON.stringify(policy, null, 2) + '\n');
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
process.stdout.write((0, colors_js_1.green)('Guard policy initialized.\n'));
|
|
188
|
+
process.stdout.write((0, colors_js_1.dim)(` Required files: ${policy.requiredFiles.length}\n`));
|
|
189
|
+
for (const f of policy.requiredFiles) {
|
|
190
|
+
process.stdout.write((0, colors_js_1.dim)(` ${f}\n`));
|
|
191
|
+
}
|
|
192
|
+
process.stdout.write((0, colors_js_1.dim)(` Block on unsigned: ${policy.blockOnUnsigned}\n`));
|
|
193
|
+
process.stdout.write((0, colors_js_1.dim)(` Disable heartbeat on tamper: ${policy.disableHeartbeatOnTamper}\n`));
|
|
194
|
+
process.stdout.write((0, colors_js_1.dim)(` Policy file: ${GUARD_DIR}/${POLICY_FILE}\n`));
|
|
195
|
+
}
|
|
196
|
+
return 0;
|
|
197
|
+
}
|
|
198
|
+
case 'show': {
|
|
199
|
+
const policy = loadGuardPolicy(targetDir);
|
|
200
|
+
if (!policy) {
|
|
201
|
+
if (isJson) {
|
|
202
|
+
process.stdout.write(JSON.stringify({ error: 'No guard policy found. Run: opena2a guard policy init' }, null, 2) + '\n');
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
process.stdout.write((0, colors_js_1.yellow)('No guard policy found. Run: opena2a guard policy init\n'));
|
|
206
|
+
}
|
|
207
|
+
return 1;
|
|
208
|
+
}
|
|
209
|
+
if (isJson) {
|
|
210
|
+
process.stdout.write(JSON.stringify(policy, null, 2) + '\n');
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
process.stdout.write((0, colors_js_1.bold)('Guard Policy') + '\n');
|
|
214
|
+
process.stdout.write((0, colors_js_1.gray)('-'.repeat(40)) + '\n');
|
|
215
|
+
process.stdout.write(` Block on unsigned: ${policy.blockOnUnsigned ? (0, colors_js_1.green)('yes') : (0, colors_js_1.dim)('no')}\n`);
|
|
216
|
+
process.stdout.write(` Disable heartbeat on tamper: ${policy.disableHeartbeatOnTamper ? (0, colors_js_1.green)('yes') : (0, colors_js_1.dim)('no')}\n`);
|
|
217
|
+
process.stdout.write(` Auto-remediate: ${policy.autoRemediate ? (0, colors_js_1.green)('yes') : (0, colors_js_1.dim)('no')}\n`);
|
|
218
|
+
process.stdout.write(` Required files (${policy.requiredFiles.length}):\n`);
|
|
219
|
+
for (const f of policy.requiredFiles) {
|
|
220
|
+
process.stdout.write((0, colors_js_1.dim)(` ${f}\n`));
|
|
221
|
+
}
|
|
222
|
+
const hb = isHeartbeatDisabled(targetDir);
|
|
223
|
+
if (hb.disabled) {
|
|
224
|
+
process.stdout.write((0, colors_js_1.red)(` Heartbeat: DISABLED (${hb.reason})\n`));
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
process.stdout.write((0, colors_js_1.green)(' Heartbeat: active\n'));
|
|
228
|
+
}
|
|
229
|
+
process.stdout.write((0, colors_js_1.gray)('-'.repeat(40)) + '\n');
|
|
230
|
+
}
|
|
231
|
+
return 0;
|
|
232
|
+
}
|
|
233
|
+
default:
|
|
234
|
+
if (isJson) {
|
|
235
|
+
process.stdout.write(JSON.stringify({ error: `Unknown policy action: ${action}` }, null, 2) + '\n');
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
process.stderr.write((0, colors_js_1.red)(`Unknown policy action: ${action}\n`));
|
|
239
|
+
process.stderr.write('Usage: opena2a guard policy <init|show>\n');
|
|
240
|
+
}
|
|
241
|
+
return 1;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// --- Testable internals ---
|
|
245
|
+
exports._internals = {
|
|
246
|
+
loadGuardPolicy, saveGuardPolicy, generateDefaultPolicy, checkPolicyCompliance,
|
|
247
|
+
disableHeartbeat, isHeartbeatDisabled, enableHeartbeat, guardPolicy, emitEvent,
|
|
248
|
+
GUARD_DIR, POLICY_FILE, HEARTBEAT_DISABLED_FILE, SIGNATURES_FILE,
|
|
249
|
+
DEFAULT_CONFIG_FILES,
|
|
250
|
+
};
|
|
251
|
+
//# sourceMappingURL=guard-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard-policy.js","sourceRoot":"","sources":["../../src/commands/guard-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill.md and Heartbeat.md signing bridge for ConfigGuard.
|
|
3
|
+
*
|
|
4
|
+
* Signs and verifies SKILL.md / HEARTBEAT.md files using SHA-256 hashing
|
|
5
|
+
* with inline HTML-comment signature blocks (matching HMA signcrypt pattern).
|
|
6
|
+
*/
|
|
7
|
+
export interface SignResult {
|
|
8
|
+
filePath: string;
|
|
9
|
+
hash: string;
|
|
10
|
+
signedAt: string;
|
|
11
|
+
signedBy: string;
|
|
12
|
+
expiresAt?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface VerifyResult {
|
|
15
|
+
filePath: string;
|
|
16
|
+
status: 'pass' | 'tampered' | 'unsigned' | 'expired';
|
|
17
|
+
currentHash?: string;
|
|
18
|
+
expectedHash?: string;
|
|
19
|
+
expiresAt?: string;
|
|
20
|
+
}
|
|
21
|
+
interface SignatureBlock {
|
|
22
|
+
pinnedHash: string;
|
|
23
|
+
signedAt: string;
|
|
24
|
+
signedBy: string;
|
|
25
|
+
expiresAt?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function signSkillFiles(targetDir: string): Promise<SignResult[]>;
|
|
28
|
+
export declare function signHeartbeatFiles(targetDir: string): Promise<SignResult[]>;
|
|
29
|
+
declare function signFiles(files: string[], targetDir: string, withExpiry: boolean): SignResult[];
|
|
30
|
+
export declare function verifySkillSignatures(targetDir: string): Promise<VerifyResult[]>;
|
|
31
|
+
export declare function verifyHeartbeatSignatures(targetDir: string): Promise<VerifyResult[]>;
|
|
32
|
+
declare function verifyFiles(files: string[], targetDir: string, checkExpiry: boolean): VerifyResult[];
|
|
33
|
+
declare function buildSignatureBlock(sig: SignatureBlock): string;
|
|
34
|
+
declare function parseSignatureBlock(content: string): SignatureBlock | null;
|
|
35
|
+
declare function stripSignatureBlock(content: string): string;
|
|
36
|
+
declare function findFiles(targetDir: string, patterns: string[]): string[];
|
|
37
|
+
declare function matchPattern(filename: string, pattern: string): boolean;
|
|
38
|
+
export declare const _internals: {
|
|
39
|
+
findFiles: typeof findFiles;
|
|
40
|
+
matchPattern: typeof matchPattern;
|
|
41
|
+
buildSignatureBlock: typeof buildSignatureBlock;
|
|
42
|
+
parseSignatureBlock: typeof parseSignatureBlock;
|
|
43
|
+
stripSignatureBlock: typeof stripSignatureBlock;
|
|
44
|
+
signFiles: typeof signFiles;
|
|
45
|
+
verifyFiles: typeof verifyFiles;
|
|
46
|
+
SKILL_PATTERNS: string[];
|
|
47
|
+
HEARTBEAT_PATTERNS: string[];
|
|
48
|
+
HEARTBEAT_EXPIRY_DAYS: number;
|
|
49
|
+
SIG_BLOCK_RE: RegExp;
|
|
50
|
+
};
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=guard-signing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard-signing.d.ts","sourceRoot":"","sources":["../../src/commands/guard-signing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,cAAc;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAG7E;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGjF;AAED,iBAAS,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,UAAU,EAAE,CAmBxF;AAID,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAGtF;AAED,wBAAsB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAG1F;AAED,iBAAS,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,YAAY,EAAE,CA+B7F;AAID,iBAAS,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAQxD;AAED,iBAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAenE;AAED,iBAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAID,iBAAS,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAclE;AAED,iBAAS,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKhE;AAID,eAAO,MAAM,UAAU;;;;;;;;;;;;CAKtB,CAAC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Skill.md and Heartbeat.md signing bridge for ConfigGuard.
|
|
4
|
+
*
|
|
5
|
+
* Signs and verifies SKILL.md / HEARTBEAT.md files using SHA-256 hashing
|
|
6
|
+
* with inline HTML-comment signature blocks (matching HMA signcrypt pattern).
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports._internals = void 0;
|
|
43
|
+
exports.signSkillFiles = signSkillFiles;
|
|
44
|
+
exports.signHeartbeatFiles = signHeartbeatFiles;
|
|
45
|
+
exports.verifySkillSignatures = verifySkillSignatures;
|
|
46
|
+
exports.verifyHeartbeatSignatures = verifyHeartbeatSignatures;
|
|
47
|
+
const fs = __importStar(require("node:fs"));
|
|
48
|
+
const os = __importStar(require("node:os"));
|
|
49
|
+
const path = __importStar(require("node:path"));
|
|
50
|
+
const node_crypto_1 = require("node:crypto");
|
|
51
|
+
// --- Constants ---
|
|
52
|
+
const SKILL_PATTERNS = ['SKILL.md', '*.skill.md'];
|
|
53
|
+
const HEARTBEAT_PATTERNS = ['HEARTBEAT.md', '*.heartbeat.md'];
|
|
54
|
+
const HEARTBEAT_EXPIRY_DAYS = 7;
|
|
55
|
+
const SIG_BLOCK_START = '<!-- opena2a-guard';
|
|
56
|
+
const SIG_BLOCK_END = '-->';
|
|
57
|
+
const SIG_BLOCK_RE = /<!-- opena2a-guard\n([\s\S]*?)-->/;
|
|
58
|
+
// --- Signing ---
|
|
59
|
+
async function signSkillFiles(targetDir) {
|
|
60
|
+
const files = findFiles(targetDir, SKILL_PATTERNS);
|
|
61
|
+
return signFiles(files, targetDir, false);
|
|
62
|
+
}
|
|
63
|
+
async function signHeartbeatFiles(targetDir) {
|
|
64
|
+
const files = findFiles(targetDir, HEARTBEAT_PATTERNS);
|
|
65
|
+
return signFiles(files, targetDir, true);
|
|
66
|
+
}
|
|
67
|
+
function signFiles(files, targetDir, withExpiry) {
|
|
68
|
+
const results = [];
|
|
69
|
+
const now = new Date();
|
|
70
|
+
const signedBy = os.userInfo().username + '@opena2a-cli';
|
|
71
|
+
for (const fullPath of files) {
|
|
72
|
+
const relPath = path.relative(targetDir, fullPath);
|
|
73
|
+
const raw = fs.readFileSync(fullPath, 'utf-8');
|
|
74
|
+
const content = stripSignatureBlock(raw);
|
|
75
|
+
const hash = 'sha256:' + (0, node_crypto_1.createHash)('sha256').update(content, 'utf-8').digest('hex');
|
|
76
|
+
const signedAt = now.toISOString();
|
|
77
|
+
const expiresAt = withExpiry ? new Date(now.getTime() + HEARTBEAT_EXPIRY_DAYS * 86400000).toISOString() : undefined;
|
|
78
|
+
const block = buildSignatureBlock({ pinnedHash: hash, signedAt, signedBy, expiresAt });
|
|
79
|
+
fs.writeFileSync(fullPath, content.trimEnd() + '\n\n' + block + '\n', 'utf-8');
|
|
80
|
+
results.push({ filePath: relPath, hash, signedAt, signedBy, expiresAt });
|
|
81
|
+
}
|
|
82
|
+
return results;
|
|
83
|
+
}
|
|
84
|
+
// --- Verification ---
|
|
85
|
+
async function verifySkillSignatures(targetDir) {
|
|
86
|
+
const files = findFiles(targetDir, SKILL_PATTERNS);
|
|
87
|
+
return verifyFiles(files, targetDir, false);
|
|
88
|
+
}
|
|
89
|
+
async function verifyHeartbeatSignatures(targetDir) {
|
|
90
|
+
const files = findFiles(targetDir, HEARTBEAT_PATTERNS);
|
|
91
|
+
return verifyFiles(files, targetDir, true);
|
|
92
|
+
}
|
|
93
|
+
function verifyFiles(files, targetDir, checkExpiry) {
|
|
94
|
+
const results = [];
|
|
95
|
+
for (const fullPath of files) {
|
|
96
|
+
const relPath = path.relative(targetDir, fullPath);
|
|
97
|
+
const raw = fs.readFileSync(fullPath, 'utf-8');
|
|
98
|
+
const parsed = parseSignatureBlock(raw);
|
|
99
|
+
if (!parsed) {
|
|
100
|
+
results.push({ filePath: relPath, status: 'unsigned' });
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const content = stripSignatureBlock(raw);
|
|
104
|
+
const currentHash = 'sha256:' + (0, node_crypto_1.createHash)('sha256').update(content, 'utf-8').digest('hex');
|
|
105
|
+
if (checkExpiry && parsed.expiresAt) {
|
|
106
|
+
const expiry = new Date(parsed.expiresAt);
|
|
107
|
+
if (expiry.getTime() < Date.now()) {
|
|
108
|
+
results.push({ filePath: relPath, status: 'expired', currentHash, expectedHash: parsed.pinnedHash, expiresAt: parsed.expiresAt });
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (currentHash !== parsed.pinnedHash) {
|
|
113
|
+
results.push({ filePath: relPath, status: 'tampered', currentHash, expectedHash: parsed.pinnedHash });
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
results.push({ filePath: relPath, status: 'pass', currentHash, expiresAt: parsed.expiresAt });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return results;
|
|
120
|
+
}
|
|
121
|
+
// --- Signature block helpers ---
|
|
122
|
+
function buildSignatureBlock(sig) {
|
|
123
|
+
const lines = [SIG_BLOCK_START];
|
|
124
|
+
lines.push(`pinned_hash: ${sig.pinnedHash}`);
|
|
125
|
+
lines.push(`signed_at: ${sig.signedAt}`);
|
|
126
|
+
lines.push(`signed_by: ${sig.signedBy}`);
|
|
127
|
+
if (sig.expiresAt)
|
|
128
|
+
lines.push(`expires_at: ${sig.expiresAt}`);
|
|
129
|
+
lines.push(SIG_BLOCK_END);
|
|
130
|
+
return lines.join('\n');
|
|
131
|
+
}
|
|
132
|
+
function parseSignatureBlock(content) {
|
|
133
|
+
const match = SIG_BLOCK_RE.exec(content);
|
|
134
|
+
if (!match)
|
|
135
|
+
return null;
|
|
136
|
+
const body = match[1];
|
|
137
|
+
const fields = new Map();
|
|
138
|
+
for (const line of body.split('\n')) {
|
|
139
|
+
const idx = line.indexOf(':');
|
|
140
|
+
if (idx === -1)
|
|
141
|
+
continue;
|
|
142
|
+
fields.set(line.slice(0, idx).trim(), line.slice(idx + 1).trim());
|
|
143
|
+
}
|
|
144
|
+
const pinnedHash = fields.get('pinned_hash');
|
|
145
|
+
const signedAt = fields.get('signed_at');
|
|
146
|
+
const signedBy = fields.get('signed_by');
|
|
147
|
+
if (!pinnedHash || !signedAt || !signedBy)
|
|
148
|
+
return null;
|
|
149
|
+
return { pinnedHash, signedAt, signedBy, expiresAt: fields.get('expires_at') };
|
|
150
|
+
}
|
|
151
|
+
function stripSignatureBlock(content) {
|
|
152
|
+
return content.replace(SIG_BLOCK_RE, '').trimEnd();
|
|
153
|
+
}
|
|
154
|
+
// --- File discovery ---
|
|
155
|
+
function findFiles(targetDir, patterns) {
|
|
156
|
+
const found = [];
|
|
157
|
+
if (!fs.existsSync(targetDir))
|
|
158
|
+
return found;
|
|
159
|
+
const entries = fs.readdirSync(targetDir, { withFileTypes: true });
|
|
160
|
+
for (const entry of entries) {
|
|
161
|
+
if (!entry.isFile())
|
|
162
|
+
continue;
|
|
163
|
+
for (const pattern of patterns) {
|
|
164
|
+
if (matchPattern(entry.name, pattern)) {
|
|
165
|
+
found.push(path.join(targetDir, entry.name));
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return found;
|
|
171
|
+
}
|
|
172
|
+
function matchPattern(filename, pattern) {
|
|
173
|
+
if (pattern.startsWith('*')) {
|
|
174
|
+
return filename.toLowerCase().endsWith(pattern.slice(1).toLowerCase());
|
|
175
|
+
}
|
|
176
|
+
return filename === pattern;
|
|
177
|
+
}
|
|
178
|
+
// --- Testable internals ---
|
|
179
|
+
exports._internals = {
|
|
180
|
+
findFiles, matchPattern, buildSignatureBlock, parseSignatureBlock,
|
|
181
|
+
stripSignatureBlock, signFiles, verifyFiles,
|
|
182
|
+
SKILL_PATTERNS, HEARTBEAT_PATTERNS, HEARTBEAT_EXPIRY_DAYS,
|
|
183
|
+
SIG_BLOCK_RE,
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=guard-signing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard-signing.js","sourceRoot":"","sources":["../../src/commands/guard-signing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConfigGuard Snapshots -- timestamped snapshots of signature state for rollback.
|
|
3
|
+
*
|
|
4
|
+
* Stores snapshots in .opena2a/guard/snapshots/ as ISO-timestamped JSON files.
|
|
5
|
+
* Supports create, list, restore, and automatic pruning at 20 snapshots.
|
|
6
|
+
*/
|
|
7
|
+
export interface SnapshotInfo {
|
|
8
|
+
id: string;
|
|
9
|
+
createdAt: string;
|
|
10
|
+
fileCount: number;
|
|
11
|
+
path: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SnapshotResult {
|
|
14
|
+
id: string;
|
|
15
|
+
path: string;
|
|
16
|
+
fileCount: number;
|
|
17
|
+
}
|
|
18
|
+
export interface RestoreResult {
|
|
19
|
+
restored: boolean;
|
|
20
|
+
fileCount: number;
|
|
21
|
+
previousId: string | null;
|
|
22
|
+
}
|
|
23
|
+
declare function createSnapshot(targetDir: string): SnapshotResult;
|
|
24
|
+
declare function listSnapshots(targetDir: string): SnapshotInfo[];
|
|
25
|
+
declare function restoreSnapshot(targetDir: string, snapshotId: string): RestoreResult;
|
|
26
|
+
declare function pruneSnapshots(snapshotsDir: string): void;
|
|
27
|
+
interface ResignOptions {
|
|
28
|
+
format?: string;
|
|
29
|
+
ci?: boolean;
|
|
30
|
+
verbose?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function guardResign(targetDir: string, options: ResignOptions): Promise<number>;
|
|
33
|
+
declare function confirmAction(): Promise<boolean>;
|
|
34
|
+
interface SnapshotOptions {
|
|
35
|
+
format?: string;
|
|
36
|
+
args?: string[];
|
|
37
|
+
verbose?: boolean;
|
|
38
|
+
}
|
|
39
|
+
export declare function guardSnapshot(targetDir: string, options: SnapshotOptions): Promise<number>;
|
|
40
|
+
export declare const _internals: {
|
|
41
|
+
createSnapshot: typeof createSnapshot;
|
|
42
|
+
listSnapshots: typeof listSnapshots;
|
|
43
|
+
restoreSnapshot: typeof restoreSnapshot;
|
|
44
|
+
pruneSnapshots: typeof pruneSnapshots;
|
|
45
|
+
guardResign: typeof guardResign;
|
|
46
|
+
guardSnapshot: typeof guardSnapshot;
|
|
47
|
+
confirmAction: typeof confirmAction;
|
|
48
|
+
STORE_DIR: string;
|
|
49
|
+
STORE_FILE: string;
|
|
50
|
+
SNAPSHOTS_DIR: string;
|
|
51
|
+
MAX_SNAPSHOTS: number;
|
|
52
|
+
};
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=guard-snapshots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard-snapshots.d.ts","sourceRoot":"","sources":["../../src/commands/guard-snapshots.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAWD,iBAAS,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAwBzD;AAED,iBAAS,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE,CA6BxD;AAED,iBAAS,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAiC7E;AAID,iBAAS,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAelD;AAID,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAmG5F;AAED,iBAAS,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAWzC;AAED,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDhG;AAID,eAAO,MAAM,UAAU;;;;;;;;;;;;CAItB,CAAC"}
|