@ai-dossier/cli 0.4.1 → 0.4.2
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 +30 -25
- package/bin/dossier-verify +6 -440
- package/dist/cli.js +80 -21
- package/dist/cli.js.map +1 -1
- package/dist/commands/cache.d.ts.map +1 -1
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/checksum.js.map +1 -1
- package/dist/commands/commands.d.ts.map +1 -1
- package/dist/commands/commands.js +4 -2
- package/dist/commands/commands.js.map +1 -1
- package/dist/commands/config-cmd.d.ts.map +1 -1
- package/dist/commands/config-cmd.js +170 -7
- package/dist/commands/config-cmd.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +19 -8
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +15 -5
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/format.d.ts.map +1 -1
- package/dist/commands/format.js.map +1 -1
- package/dist/commands/get.d.ts.map +1 -1
- package/dist/commands/get.js +19 -6
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +20 -6
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/install-skill.d.ts.map +1 -1
- package/dist/commands/install-skill.js +16 -9
- package/dist/commands/install-skill.js.map +1 -1
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +54 -41
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +25 -5
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +22 -5
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/prompt-hook.d.ts.map +1 -1
- package/dist/commands/prompt-hook.js +4 -13
- package/dist/commands/prompt-hook.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +35 -22
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +23 -8
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +25 -12
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/reset-hooks.js +1 -1
- package/dist/commands/reset-hooks.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +75 -48
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +29 -27
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/sign.js.map +1 -1
- package/dist/commands/skill-export.d.ts +3 -0
- package/dist/commands/skill-export.d.ts.map +1 -0
- package/dist/commands/skill-export.js +218 -0
- package/dist/commands/skill-export.js.map +1 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +1 -8
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +108 -25
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config.d.ts +38 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +128 -1
- package/dist/config.js.map +1 -1
- package/dist/credentials.d.ts +14 -9
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +119 -49
- package/dist/credentials.js.map +1 -1
- package/dist/help.d.ts +7 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +86 -0
- package/dist/help.js.map +1 -0
- package/dist/helpers.d.ts +2 -10
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +10 -28
- package/dist/helpers.js.map +1 -1
- package/dist/multi-registry.d.ts +71 -0
- package/dist/multi-registry.d.ts.map +1 -0
- package/dist/multi-registry.js +136 -0
- package/dist/multi-registry.js.map +1 -0
- package/dist/registry-client.d.ts +64 -8
- package/dist/registry-client.d.ts.map +1 -1
- package/dist/registry-client.js +13 -0
- package/dist/registry-client.js.map +1 -1
- package/dist/verify-dossier.d.ts +28 -0
- package/dist/verify-dossier.d.ts.map +1 -0
- package/dist/verify-dossier.js +329 -0
- package/dist/verify-dossier.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dossier verification module.
|
|
4
|
+
*
|
|
5
|
+
* Provides integrity (checksum), authenticity (signature), and risk
|
|
6
|
+
* assessment for local files and remote URLs.
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.downloadFile = downloadFile;
|
|
13
|
+
exports.checkSignature = checkSignature;
|
|
14
|
+
exports.verifyDossier = verifyDossier;
|
|
15
|
+
exports.parseArgs = parseArgs;
|
|
16
|
+
exports.showHelp = showHelp;
|
|
17
|
+
exports.main = main;
|
|
18
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
19
|
+
const node_http_1 = __importDefault(require("node:http"));
|
|
20
|
+
const node_https_1 = __importDefault(require("node:https"));
|
|
21
|
+
const core_1 = require("@ai-dossier/core");
|
|
22
|
+
const github_url_1 = require("./github-url");
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Terminal colors
|
|
25
|
+
// ============================================================================
|
|
26
|
+
const colors = {
|
|
27
|
+
reset: '\x1b[0m',
|
|
28
|
+
bright: '\x1b[1m',
|
|
29
|
+
red: '\x1b[31m',
|
|
30
|
+
green: '\x1b[32m',
|
|
31
|
+
yellow: '\x1b[33m',
|
|
32
|
+
cyan: '\x1b[36m',
|
|
33
|
+
};
|
|
34
|
+
function log(message, color = 'reset') {
|
|
35
|
+
console.log(`${colors[color]}${message}${colors.reset}`);
|
|
36
|
+
}
|
|
37
|
+
function error(message) {
|
|
38
|
+
log(`\u274C ${message}`, 'red');
|
|
39
|
+
}
|
|
40
|
+
function success(message) {
|
|
41
|
+
log(`\u2705 ${message}`, 'green');
|
|
42
|
+
}
|
|
43
|
+
function warning(message) {
|
|
44
|
+
log(`\u26A0\uFE0F ${message}`, 'yellow');
|
|
45
|
+
}
|
|
46
|
+
function info(message) {
|
|
47
|
+
log(`\u2139\uFE0F ${message}`, 'cyan');
|
|
48
|
+
}
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Download with redirect depth limit
|
|
51
|
+
// ============================================================================
|
|
52
|
+
const MAX_REDIRECTS = 10;
|
|
53
|
+
async function downloadFile(url, redirectCount = 0) {
|
|
54
|
+
if (redirectCount >= MAX_REDIRECTS) {
|
|
55
|
+
throw new Error(`Too many redirects (max ${MAX_REDIRECTS})`);
|
|
56
|
+
}
|
|
57
|
+
const resolvedUrl = redirectCount === 0 ? (0, github_url_1.convertGitHubBlobToRaw)(url) : url;
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
const protocol = resolvedUrl.startsWith('https://') ? node_https_1.default : node_http_1.default;
|
|
60
|
+
protocol
|
|
61
|
+
.get(resolvedUrl, (res) => {
|
|
62
|
+
if (res.statusCode === 301 || res.statusCode === 302) {
|
|
63
|
+
const location = res.headers.location;
|
|
64
|
+
if (!location) {
|
|
65
|
+
return reject(new Error(`Redirect without Location header from ${resolvedUrl}`));
|
|
66
|
+
}
|
|
67
|
+
return downloadFile(location, redirectCount + 1)
|
|
68
|
+
.then(resolve)
|
|
69
|
+
.catch(reject);
|
|
70
|
+
}
|
|
71
|
+
if (res.statusCode !== 200) {
|
|
72
|
+
return reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage}`));
|
|
73
|
+
}
|
|
74
|
+
let data = '';
|
|
75
|
+
res.on('data', (chunk) => {
|
|
76
|
+
data += chunk;
|
|
77
|
+
});
|
|
78
|
+
res.on('end', () => resolve(data));
|
|
79
|
+
})
|
|
80
|
+
.on('error', reject);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async function checkSignature(body, frontmatter) {
|
|
84
|
+
if (!frontmatter.signature) {
|
|
85
|
+
return {
|
|
86
|
+
present: false,
|
|
87
|
+
verified: false,
|
|
88
|
+
trusted: false,
|
|
89
|
+
message: 'No signature present',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const signature = frontmatter.signature;
|
|
93
|
+
const trustedKeys = (0, core_1.loadTrustedKeys)();
|
|
94
|
+
const isTrusted = (signature.key_id != null && trustedKeys.has(signature.key_id)) ||
|
|
95
|
+
(signature.public_key != null && trustedKeys.has(signature.public_key));
|
|
96
|
+
const result = await (0, core_1.verifySignature)(body, signature);
|
|
97
|
+
if (result.valid) {
|
|
98
|
+
let trustedName = '';
|
|
99
|
+
if (isTrusted) {
|
|
100
|
+
trustedName =
|
|
101
|
+
(signature.key_id ? trustedKeys.get(signature.key_id) : undefined) ||
|
|
102
|
+
(signature.public_key ? trustedKeys.get(signature.public_key) : undefined) ||
|
|
103
|
+
'';
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
present: true,
|
|
107
|
+
verified: true,
|
|
108
|
+
trusted: isTrusted,
|
|
109
|
+
message: isTrusted
|
|
110
|
+
? `Verified signature from trusted source: ${trustedName}`
|
|
111
|
+
: 'Valid signature but key is not in trusted list',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (result.error) {
|
|
115
|
+
return {
|
|
116
|
+
present: true,
|
|
117
|
+
verified: false,
|
|
118
|
+
trusted: false,
|
|
119
|
+
message: `Verification error: ${result.error}`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
present: true,
|
|
124
|
+
verified: false,
|
|
125
|
+
trusted: isTrusted,
|
|
126
|
+
message: 'Signature verification FAILED',
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// ============================================================================
|
|
130
|
+
// Main verification
|
|
131
|
+
// ============================================================================
|
|
132
|
+
async function verifyDossier(input, options) {
|
|
133
|
+
try {
|
|
134
|
+
log(`\n${colors.bright}\uD83D\uDD10 Dossier Verification Tool${colors.reset}\n`);
|
|
135
|
+
const isUrl = input.startsWith('http://') || input.startsWith('https://');
|
|
136
|
+
let content;
|
|
137
|
+
if (isUrl) {
|
|
138
|
+
info(`Downloading: ${input}`);
|
|
139
|
+
content = await downloadFile(input);
|
|
140
|
+
success('Downloaded successfully');
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
info(`Reading: ${input}`);
|
|
144
|
+
content = node_fs_1.default.readFileSync(input, 'utf8');
|
|
145
|
+
success('File read successfully');
|
|
146
|
+
}
|
|
147
|
+
// Parse dossier (using core directly)
|
|
148
|
+
info('Parsing dossier...');
|
|
149
|
+
const parsed = (0, core_1.parseDossierContent)(content);
|
|
150
|
+
const { frontmatter, body } = parsed;
|
|
151
|
+
success(`Parsed: ${frontmatter.title} v${frontmatter.version}`);
|
|
152
|
+
if (options.verbose) {
|
|
153
|
+
console.log(`\n${colors.bright}Dossier Metadata:${colors.reset}`);
|
|
154
|
+
console.log(` Title: ${frontmatter.title}`);
|
|
155
|
+
console.log(` Version: ${frontmatter.version}`);
|
|
156
|
+
console.log(` Risk Level: ${frontmatter.risk_level ?? 'not specified'}`);
|
|
157
|
+
}
|
|
158
|
+
// Verify checksum (using core directly)
|
|
159
|
+
console.log(`\n${colors.bright}\uD83D\uDCCA Integrity Check:${colors.reset}`);
|
|
160
|
+
const integrityResult = (0, core_1.verifyIntegrity)(body, frontmatter.checksum?.hash);
|
|
161
|
+
const checksumPassed = integrityResult.status === 'valid';
|
|
162
|
+
if (checksumPassed) {
|
|
163
|
+
success('Checksum VALID - content has not been tampered with');
|
|
164
|
+
if (options.verbose) {
|
|
165
|
+
console.log(` Hash: ${integrityResult.actualHash}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
error('Checksum INVALID - content has been modified!');
|
|
170
|
+
if (options.verbose) {
|
|
171
|
+
console.log(` Declared: ${integrityResult.expectedHash}`);
|
|
172
|
+
console.log(` Actual: ${integrityResult.actualHash}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Verify signature
|
|
176
|
+
console.log(`\n${colors.bright}\uD83D\uDD0F Authenticity Check:${colors.reset}`);
|
|
177
|
+
const signatureResult = await checkSignature(body, frontmatter);
|
|
178
|
+
if (signatureResult.present) {
|
|
179
|
+
if (signatureResult.verified && signatureResult.trusted) {
|
|
180
|
+
success('Signature VERIFIED - from trusted author');
|
|
181
|
+
}
|
|
182
|
+
else if (signatureResult.verified && !signatureResult.trusted) {
|
|
183
|
+
warning(signatureResult.message);
|
|
184
|
+
if (frontmatter.signature?.signed_by) {
|
|
185
|
+
console.log(` Signed by: ${frontmatter.signature.signed_by}`);
|
|
186
|
+
}
|
|
187
|
+
console.log(`\n ${colors.cyan}To trust this signer, run:${colors.reset}`);
|
|
188
|
+
const sig = frontmatter.signature;
|
|
189
|
+
const publicKey = sig?.public_key || sig?.key_id;
|
|
190
|
+
const identifier = sig?.signed_by
|
|
191
|
+
? sig.signed_by.split('<')[0].trim().toLowerCase().replace(/\s+/g, '-')
|
|
192
|
+
: 'unknown-signer';
|
|
193
|
+
console.log(` ${colors.bright}dossier keys add "${publicKey}" "${identifier}"${colors.reset}\n`);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
warning(signatureResult.message);
|
|
197
|
+
if (frontmatter.signature?.signed_by) {
|
|
198
|
+
console.log(` Signed by: ${frontmatter.signature.signed_by}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
warning('No signature present (dossier is unsigned)');
|
|
204
|
+
}
|
|
205
|
+
// Assess risk (using core function)
|
|
206
|
+
console.log(`\n${colors.bright}\uD83D\uDD34 Risk Assessment:${colors.reset}`);
|
|
207
|
+
const checksumStatus = { passed: checksumPassed };
|
|
208
|
+
const signatureStatus = {
|
|
209
|
+
present: signatureResult.present,
|
|
210
|
+
verified: signatureResult.verified,
|
|
211
|
+
trusted: signatureResult.trusted,
|
|
212
|
+
};
|
|
213
|
+
const risk = (0, core_1.assessVerificationRisk)(frontmatter.risk_level, checksumStatus, signatureStatus);
|
|
214
|
+
const riskColors = {
|
|
215
|
+
low: 'green',
|
|
216
|
+
medium: 'yellow',
|
|
217
|
+
high: 'yellow',
|
|
218
|
+
critical: 'red',
|
|
219
|
+
};
|
|
220
|
+
log(` Risk Level: ${risk.level.toUpperCase()}`, riskColors[risk.level] || 'reset');
|
|
221
|
+
if (risk.issues.length > 0) {
|
|
222
|
+
console.log(`\n Issues Found:`);
|
|
223
|
+
risk.issues.forEach((issue) => {
|
|
224
|
+
console.log(` - ${issue}`);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// Recommendation
|
|
228
|
+
console.log(`\n${colors.bright}Recommendation:${colors.reset}`, risk.recommendation);
|
|
229
|
+
if (risk.recommendation === 'BLOCK') {
|
|
230
|
+
error('\nDO NOT EXECUTE this dossier');
|
|
231
|
+
console.log(' Security verification failed.');
|
|
232
|
+
console.log(' This dossier may have been tampered with or is from an untrusted source.\n');
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
else if (risk.level === 'medium' || risk.level === 'high') {
|
|
236
|
+
warning('\nProceed with CAUTION');
|
|
237
|
+
console.log(' Review the dossier code before executing.');
|
|
238
|
+
console.log(' Consider the risk level and your trust in the source.\n');
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
success('\nSafe to execute');
|
|
243
|
+
console.log(' Dossier passed security verification.\n');
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
error(`\nVerification failed: ${err.message}`);
|
|
249
|
+
if (options.verbose) {
|
|
250
|
+
console.error(err);
|
|
251
|
+
}
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function parseArgs() {
|
|
256
|
+
const args = process.argv.slice(2);
|
|
257
|
+
const options = {
|
|
258
|
+
verbose: false,
|
|
259
|
+
help: false,
|
|
260
|
+
input: null,
|
|
261
|
+
};
|
|
262
|
+
for (const arg of args) {
|
|
263
|
+
if (arg === '--verbose' || arg === '-v') {
|
|
264
|
+
options.verbose = true;
|
|
265
|
+
}
|
|
266
|
+
else if (arg === '--help' || arg === '-h') {
|
|
267
|
+
options.help = true;
|
|
268
|
+
}
|
|
269
|
+
else if (!options.input) {
|
|
270
|
+
options.input = arg;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return options;
|
|
274
|
+
}
|
|
275
|
+
function showHelp() {
|
|
276
|
+
console.log(`
|
|
277
|
+
${colors.bright}Dossier Verification CLI${colors.reset}
|
|
278
|
+
|
|
279
|
+
${colors.bright}Usage:${colors.reset}
|
|
280
|
+
dossier-verify <file-or-url> Verify dossier security
|
|
281
|
+
dossier-verify --verbose <file-or-url> Show detailed verification
|
|
282
|
+
|
|
283
|
+
${colors.bright}Exit Codes:${colors.reset}
|
|
284
|
+
0 - Verification passed (safe to execute)
|
|
285
|
+
1 - Verification failed (do not execute)
|
|
286
|
+
2 - Error occurred (cannot verify)
|
|
287
|
+
|
|
288
|
+
${colors.bright}Examples:${colors.reset}
|
|
289
|
+
# Verify local file
|
|
290
|
+
dossier-verify path/to/dossier.ds.md
|
|
291
|
+
|
|
292
|
+
# Verify remote dossier
|
|
293
|
+
dossier-verify https://example.com/dossier.ds.md
|
|
294
|
+
|
|
295
|
+
# Use in shell script
|
|
296
|
+
if dossier-verify "$URL"; then
|
|
297
|
+
claude-code "run $URL"
|
|
298
|
+
else
|
|
299
|
+
echo "Security verification failed"
|
|
300
|
+
fi
|
|
301
|
+
|
|
302
|
+
${colors.bright}Security Checks:${colors.reset}
|
|
303
|
+
\u2713 SHA256 checksum verification (required)
|
|
304
|
+
\u2713 Signature verification (if present)
|
|
305
|
+
\u2713 Trusted keys check
|
|
306
|
+
\u2713 Risk level assessment
|
|
307
|
+
|
|
308
|
+
${colors.bright}More Information:${colors.reset}
|
|
309
|
+
Documentation: https://github.com/imboard/ai-dossier
|
|
310
|
+
Security: SECURITY_STATUS.md
|
|
311
|
+
Protocol: PROTOCOL.md
|
|
312
|
+
`);
|
|
313
|
+
}
|
|
314
|
+
// ============================================================================
|
|
315
|
+
// CLI entry point
|
|
316
|
+
// ============================================================================
|
|
317
|
+
async function main() {
|
|
318
|
+
const options = parseArgs();
|
|
319
|
+
if (options.help || !options.input) {
|
|
320
|
+
showHelp();
|
|
321
|
+
process.exit(options.help ? 0 : 2);
|
|
322
|
+
}
|
|
323
|
+
const passed = await verifyDossier(options.input, options);
|
|
324
|
+
if (!passed) {
|
|
325
|
+
process.exit(1);
|
|
326
|
+
}
|
|
327
|
+
process.exit(0);
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=verify-dossier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-dossier.js","sourceRoot":"","sources":["../src/verify-dossier.ts"],"names":[],"mappings":"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"}
|