@ai-dossier/cli 0.2.1
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 +419 -0
- package/bin/ai-dossier +3 -0
- package/bin/dossier-verify +435 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +77 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/cache.d.ts +3 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +239 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/checksum.d.ts +3 -0
- package/dist/commands/checksum.d.ts.map +1 -0
- package/dist/commands/checksum.js +116 -0
- package/dist/commands/checksum.js.map +1 -0
- package/dist/commands/config-cmd.d.ts +3 -0
- package/dist/commands/config-cmd.d.ts.map +1 -0
- package/dist/commands/config-cmd.js +117 -0
- package/dist/commands/config-cmd.js.map +1 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +130 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +55 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/format.d.ts +3 -0
- package/dist/commands/format.d.ts.map +1 -0
- package/dist/commands/format.js +66 -0
- package/dist/commands/format.js.map +1 -0
- package/dist/commands/from-file.d.ts +3 -0
- package/dist/commands/from-file.d.ts.map +1 -0
- package/dist/commands/from-file.js +136 -0
- package/dist/commands/from-file.js.map +1 -0
- package/dist/commands/get.d.ts +3 -0
- package/dist/commands/get.d.ts.map +1 -0
- package/dist/commands/get.js +65 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/info.d.ts +3 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +159 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +98 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install-skill.d.ts +3 -0
- package/dist/commands/install-skill.d.ts.map +1 -0
- package/dist/commands/install-skill.js +131 -0
- package/dist/commands/install-skill.js.map +1 -0
- package/dist/commands/keys.d.ts +3 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +170 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/lint.d.ts +3 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +105 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +173 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +33 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +19 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/prompt-hook.d.ts +3 -0
- package/dist/commands/prompt-hook.d.ts.map +1 -0
- package/dist/commands/prompt-hook.js +101 -0
- package/dist/commands/prompt-hook.js.map +1 -0
- package/dist/commands/publish.d.ts +3 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +142 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/pull.d.ts +3 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +69 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/remove.d.ts +3 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +65 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/reset-hooks.d.ts +3 -0
- package/dist/commands/reset-hooks.d.ts.map +1 -0
- package/dist/commands/reset-hooks.js +52 -0
- package/dist/commands/reset-hooks.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +281 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +137 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/sign.d.ts +3 -0
- package/dist/commands/sign.d.ts.map +1 -0
- package/dist/commands/sign.js +143 -0
- package/dist/commands/sign.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +152 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/verify.d.ts +3 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +41 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +28 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.d.ts +35 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +87 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +29 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +98 -0
- package/dist/credentials.js.map +1 -0
- package/dist/github-url.d.ts +22 -0
- package/dist/github-url.d.ts.map +1 -0
- package/dist/github-url.js +34 -0
- package/dist/github-url.js.map +1 -0
- package/dist/helpers.d.ts +145 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +597 -0
- package/dist/helpers.js.map +1 -0
- package/dist/hooks.d.ts +38 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +155 -0
- package/dist/hooks.js.map +1 -0
- package/dist/oauth.d.ts +22 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +118 -0
- package/dist/oauth.js.map +1 -0
- package/dist/registry-client.d.ts +86 -0
- package/dist/registry-client.d.ts.map +1 -0
- package/dist/registry-client.js +225 -0
- package/dist/registry-client.js.map +1 -0
- package/package.json +58 -0
package/dist/helpers.js
ADDED
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared helper functions and types for Dossier CLI commands.
|
|
4
|
+
* Extracted from the monolithic bin/dossier entry point.
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.VALID_STATUSES = exports.VALID_RISK_LEVELS = exports.RECOMMENDED_FIELDS = exports.REQUIRED_FIELDS = exports.OFFICIAL_KMS_KEYS = exports.REPO_ROOT = exports.BIN_DIR = exports.CLI_ROOT = void 0;
|
|
11
|
+
exports.validateDossierName = validateDossierName;
|
|
12
|
+
exports.safeDossierPath = safeDossierPath;
|
|
13
|
+
exports.readStdin = readStdin;
|
|
14
|
+
exports.detectLlm = detectLlm;
|
|
15
|
+
exports.downloadUrlToTempFile = downloadUrlToTempFile;
|
|
16
|
+
exports.buildLlmCommand = buildLlmCommand;
|
|
17
|
+
exports.runVerification = runVerification;
|
|
18
|
+
exports.findDossierFilesLocal = findDossierFilesLocal;
|
|
19
|
+
exports.parseListSource = parseListSource;
|
|
20
|
+
exports.findDossierFilesGitHub = findDossierFilesGitHub;
|
|
21
|
+
exports.fetchDossierMetadata = fetchDossierMetadata;
|
|
22
|
+
exports.parseDossierMetadataFromContent = parseDossierMetadataFromContent;
|
|
23
|
+
exports.parseDossierMetadataLocal = parseDossierMetadataLocal;
|
|
24
|
+
exports.verifyDossierQuick = verifyDossierQuick;
|
|
25
|
+
exports.formatTable = formatTable;
|
|
26
|
+
const node_child_process_1 = require("node:child_process");
|
|
27
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
28
|
+
const node_http_1 = __importDefault(require("node:http"));
|
|
29
|
+
const node_https_1 = __importDefault(require("node:https"));
|
|
30
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
31
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
32
|
+
const github_url_1 = require("./github-url");
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Path constants
|
|
35
|
+
// ============================================================================
|
|
36
|
+
/** Root of the CLI package (cli/) */
|
|
37
|
+
exports.CLI_ROOT = node_path_1.default.resolve(__dirname, '..');
|
|
38
|
+
/** The bin/ directory */
|
|
39
|
+
exports.BIN_DIR = node_path_1.default.join(exports.CLI_ROOT, 'bin');
|
|
40
|
+
/** Repository root (parent of cli/) */
|
|
41
|
+
exports.REPO_ROOT = node_path_1.default.resolve(exports.CLI_ROOT, '..');
|
|
42
|
+
// ============================================================================
|
|
43
|
+
// Shared constants
|
|
44
|
+
// ============================================================================
|
|
45
|
+
/** Official KMS keys that require CI/CD signing (not direct CLI use) */
|
|
46
|
+
exports.OFFICIAL_KMS_KEYS = [
|
|
47
|
+
'alias/dossier-official-prod',
|
|
48
|
+
'alias/dossier-official',
|
|
49
|
+
'arn:aws:kms:us-east-1:942039714848:key/d9ccd3fc-b190-49fd-83f7-e94df6620c1d',
|
|
50
|
+
];
|
|
51
|
+
/** Required frontmatter fields per schema spec */
|
|
52
|
+
exports.REQUIRED_FIELDS = ['dossier_schema_version', 'title', 'version'];
|
|
53
|
+
/** Recommended fields (warn if missing) */
|
|
54
|
+
exports.RECOMMENDED_FIELDS = ['objective', 'risk_level', 'status'];
|
|
55
|
+
/** Valid values for risk_level */
|
|
56
|
+
exports.VALID_RISK_LEVELS = ['low', 'medium', 'high', 'critical'];
|
|
57
|
+
/** Valid values for status */
|
|
58
|
+
exports.VALID_STATUSES = ['Draft', 'Stable', 'Deprecated', 'Experimental'];
|
|
59
|
+
// ============================================================================
|
|
60
|
+
// Security helpers
|
|
61
|
+
// ============================================================================
|
|
62
|
+
/**
|
|
63
|
+
* Validate a dossier name to prevent path traversal attacks.
|
|
64
|
+
* Rejects names containing '..' segments or absolute paths.
|
|
65
|
+
* @throws Error if the name is invalid.
|
|
66
|
+
*/
|
|
67
|
+
function validateDossierName(name) {
|
|
68
|
+
const segments = name.split('/');
|
|
69
|
+
for (const segment of segments) {
|
|
70
|
+
if (segment === '..' || segment === '.' || segment === '') {
|
|
71
|
+
throw new Error(`Invalid dossier name: "${name}" contains unsafe path segments`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (node_path_1.default.isAbsolute(name)) {
|
|
75
|
+
throw new Error(`Invalid dossier name: "${name}" must not be an absolute path`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Safely join a base directory with a dossier name and verify the result
|
|
80
|
+
* stays within the base directory.
|
|
81
|
+
* @throws Error if the resolved path escapes the base directory.
|
|
82
|
+
*/
|
|
83
|
+
function safeDossierPath(baseDir, dossierName) {
|
|
84
|
+
validateDossierName(dossierName);
|
|
85
|
+
const resolved = node_path_1.default.resolve(baseDir, ...dossierName.split('/'));
|
|
86
|
+
const resolvedBase = node_path_1.default.resolve(baseDir);
|
|
87
|
+
if (!resolved.startsWith(`${resolvedBase}${node_path_1.default.sep}`) && resolved !== resolvedBase) {
|
|
88
|
+
throw new Error(`Path traversal detected: "${dossierName}" resolves outside base directory`);
|
|
89
|
+
}
|
|
90
|
+
return resolved;
|
|
91
|
+
}
|
|
92
|
+
// ============================================================================
|
|
93
|
+
// Helper functions
|
|
94
|
+
// ============================================================================
|
|
95
|
+
/**
|
|
96
|
+
* Read all data from stdin (piped input) with a timeout.
|
|
97
|
+
* Returns null if stdin is a TTY (interactive terminal).
|
|
98
|
+
*/
|
|
99
|
+
function readStdin(timeoutMs = 5000) {
|
|
100
|
+
return new Promise((resolve) => {
|
|
101
|
+
if (process.stdin.isTTY) {
|
|
102
|
+
resolve(null);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
let data = '';
|
|
106
|
+
const timer = setTimeout(() => {
|
|
107
|
+
process.stdin.removeAllListeners();
|
|
108
|
+
process.stdin.pause();
|
|
109
|
+
resolve(data || null);
|
|
110
|
+
}, timeoutMs);
|
|
111
|
+
process.stdin.setEncoding('utf8');
|
|
112
|
+
process.stdin.on('data', (chunk) => {
|
|
113
|
+
data += chunk;
|
|
114
|
+
});
|
|
115
|
+
process.stdin.on('end', () => {
|
|
116
|
+
clearTimeout(timer);
|
|
117
|
+
resolve(data || null);
|
|
118
|
+
});
|
|
119
|
+
process.stdin.on('error', () => {
|
|
120
|
+
clearTimeout(timer);
|
|
121
|
+
resolve(null);
|
|
122
|
+
});
|
|
123
|
+
process.stdin.resume();
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Detect and resolve which LLM to use.
|
|
128
|
+
* @returns The resolved LLM name, or null if none detected.
|
|
129
|
+
*/
|
|
130
|
+
function detectLlm(llmOption, silent = false) {
|
|
131
|
+
if (llmOption !== 'auto') {
|
|
132
|
+
return llmOption;
|
|
133
|
+
}
|
|
134
|
+
// Auto-detect LLM
|
|
135
|
+
try {
|
|
136
|
+
(0, node_child_process_1.execSync)('command -v claude', { stdio: 'pipe' });
|
|
137
|
+
if (!silent)
|
|
138
|
+
console.log(' Detected: Claude Code');
|
|
139
|
+
return 'claude-code';
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
if (!silent) {
|
|
143
|
+
console.log('❌ No supported LLM detected\n');
|
|
144
|
+
console.log('Supported LLM:');
|
|
145
|
+
console.log(' - Claude Code (install from https://claude.com/claude-code)\n');
|
|
146
|
+
console.log('Or specify manually: --llm claude-code\n');
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Download a URL to a local temp file (synchronous).
|
|
153
|
+
* Returns the temp file path.
|
|
154
|
+
*/
|
|
155
|
+
function downloadUrlToTempFile(url) {
|
|
156
|
+
const resolvedUrl = (0, github_url_1.convertGitHubBlobToRaw)(url);
|
|
157
|
+
const tmpFile = node_path_1.default.join(node_os_1.default.tmpdir(), `dossier-${Date.now()}-${Math.random().toString(36).slice(2)}.ds.md`);
|
|
158
|
+
const result = (0, node_child_process_1.spawnSync)('curl', ['-sL', '-o', tmpFile, '--', resolvedUrl], {
|
|
159
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
160
|
+
timeout: 30000,
|
|
161
|
+
});
|
|
162
|
+
if (result.status !== 0) {
|
|
163
|
+
throw new Error(`Failed to download ${resolvedUrl}: curl exit code ${result.status}`);
|
|
164
|
+
}
|
|
165
|
+
if (!node_fs_1.default.existsSync(tmpFile) || node_fs_1.default.statSync(tmpFile).size === 0) {
|
|
166
|
+
try {
|
|
167
|
+
node_fs_1.default.unlinkSync(tmpFile);
|
|
168
|
+
}
|
|
169
|
+
catch { }
|
|
170
|
+
throw new Error(`Downloaded file is empty: ${resolvedUrl}`);
|
|
171
|
+
}
|
|
172
|
+
return tmpFile;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Build the execution descriptor for a given LLM.
|
|
176
|
+
* File must be a local file path (download URLs first with downloadUrlToTempFile).
|
|
177
|
+
* @returns The execution descriptor, or null for unknown LLM.
|
|
178
|
+
*/
|
|
179
|
+
function buildLlmCommand(llm, file, headless = false) {
|
|
180
|
+
if (llm === 'claude-code') {
|
|
181
|
+
if (headless) {
|
|
182
|
+
const content = node_fs_1.default.readFileSync(file, 'utf8');
|
|
183
|
+
return {
|
|
184
|
+
cmd: 'claude',
|
|
185
|
+
args: ['-p'],
|
|
186
|
+
stdin: content,
|
|
187
|
+
description: `cat "${file}" | claude -p`,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
return {
|
|
192
|
+
cmd: 'claude',
|
|
193
|
+
args: [file],
|
|
194
|
+
description: `claude "${file}"`,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Multi-stage verification pipeline.
|
|
204
|
+
*/
|
|
205
|
+
async function runVerification(file, options) {
|
|
206
|
+
const verifyScript = node_path_1.default.join(exports.BIN_DIR, 'dossier-verify');
|
|
207
|
+
const results = { passed: true, stages: [] };
|
|
208
|
+
console.log('🔐 Running Multi-Stage Verification Pipeline...\n');
|
|
209
|
+
// Stage 1: Integrity Check (checksum + signature)
|
|
210
|
+
if (!options.skipChecksum && !options.skipAllChecks) {
|
|
211
|
+
console.log('📊 Stage 1: Integrity Check (checksum + signature)');
|
|
212
|
+
try {
|
|
213
|
+
(0, node_child_process_1.execSync)(`node "${verifyScript}" "${file}" --exit-code-only 2>/dev/null`, { stdio: 'pipe' });
|
|
214
|
+
console.log(' ✅ PASSED: Checksum and signature valid\n');
|
|
215
|
+
results.stages.push({ stage: 1, name: 'Integrity', passed: true });
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
console.log(' ❌ FAILED: Verification failed');
|
|
219
|
+
console.log(' Run "dossier verify ' + file + '" for details\n');
|
|
220
|
+
results.passed = false;
|
|
221
|
+
results.stages.push({ stage: 1, name: 'Integrity', passed: false });
|
|
222
|
+
return results;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
console.log('⚠️ Stage 1: SKIPPED - Integrity check\n');
|
|
227
|
+
results.stages.push({ stage: 1, name: 'Integrity', skipped: true });
|
|
228
|
+
}
|
|
229
|
+
// Stage 2: Author Whitelist/Blacklist (not yet implemented)
|
|
230
|
+
if (!options.skipAuthorCheck && !options.skipAllChecks) {
|
|
231
|
+
console.log('👤 Stage 2: Author Whitelist/Blacklist');
|
|
232
|
+
console.log(' ⚠️ NOT IMPLEMENTED: Author check');
|
|
233
|
+
console.log(' 📋 [Would check ~/.dossier/authors-whitelist.txt]');
|
|
234
|
+
console.log(' 📋 [Would check ~/.dossier/authors-blacklist.txt]\n');
|
|
235
|
+
results.stages.push({ stage: 2, name: 'Author Check', skipped: true, demo: true });
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
console.log('⚠️ Stage 2: SKIPPED - Author check\n');
|
|
239
|
+
results.stages.push({ stage: 2, name: 'Author Check', skipped: true });
|
|
240
|
+
}
|
|
241
|
+
// Stage 3: Dossier Whitelist/Blacklist (not yet implemented)
|
|
242
|
+
if (!options.skipDossierCheck && !options.skipAllChecks) {
|
|
243
|
+
console.log('📋 Stage 3: Dossier Whitelist/Blacklist');
|
|
244
|
+
console.log(' ⚠️ NOT IMPLEMENTED: Dossier check');
|
|
245
|
+
console.log(' 📋 [Would check ~/.dossier/dossiers-whitelist.txt]');
|
|
246
|
+
console.log(' 📋 [Would check ~/.dossier/dossiers-blacklist.txt]\n');
|
|
247
|
+
results.stages.push({ stage: 3, name: 'Dossier Check', skipped: true, demo: true });
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
console.log('⚠️ Stage 3: SKIPPED - Dossier check\n');
|
|
251
|
+
results.stages.push({ stage: 3, name: 'Dossier Check', skipped: true });
|
|
252
|
+
}
|
|
253
|
+
// Stage 4: Risk Assessment (not yet implemented)
|
|
254
|
+
if (!options.skipRiskAssessment && !options.skipAllChecks) {
|
|
255
|
+
console.log('🔴 Stage 4: Risk Assessment');
|
|
256
|
+
console.log(' ⚠️ NOT IMPLEMENTED: Risk assessment');
|
|
257
|
+
console.log(' 📋 [Would evaluate risk level and prompt for high-risk dossiers]\n');
|
|
258
|
+
results.stages.push({ stage: 4, name: 'Risk Assessment', skipped: true, demo: true });
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
console.log('⚠️ Stage 4: SKIPPED - Risk assessment\n');
|
|
262
|
+
results.stages.push({ stage: 4, name: 'Risk Assessment', skipped: true });
|
|
263
|
+
}
|
|
264
|
+
// Stage 5: Review Dossier (not yet implemented)
|
|
265
|
+
if (!options.skipReview && !options.skipAllChecks) {
|
|
266
|
+
const reviewDossierPath = options.reviewDossier || 'built-in://review-dossier.ds.md';
|
|
267
|
+
console.log('🔍 Stage 5: Review Dossier Analysis');
|
|
268
|
+
console.log(` Using: ${reviewDossierPath}`);
|
|
269
|
+
console.log(' ⚠️ NOT IMPLEMENTED: Review dossier analysis');
|
|
270
|
+
console.log(' 📋 [Would execute review dossier to analyze target]');
|
|
271
|
+
console.log(' 📋 [Would check for dangerous patterns]\n');
|
|
272
|
+
results.stages.push({ stage: 5, name: 'Review Dossier', skipped: true, demo: true });
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
console.log('⚠️ Stage 5: SKIPPED - Review dossier\n');
|
|
276
|
+
results.stages.push({ stage: 5, name: 'Review Dossier', skipped: true });
|
|
277
|
+
}
|
|
278
|
+
return results;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Recursively find all .ds.md files in a local directory.
|
|
282
|
+
*/
|
|
283
|
+
function findDossierFilesLocal(dir, recursive = false) {
|
|
284
|
+
const results = [];
|
|
285
|
+
try {
|
|
286
|
+
const entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
|
|
287
|
+
for (const entry of entries) {
|
|
288
|
+
const fullPath = node_path_1.default.join(dir, entry.name);
|
|
289
|
+
if (entry.isDirectory()) {
|
|
290
|
+
if (entry.name === 'node_modules' || entry.name.startsWith('.')) {
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
if (recursive) {
|
|
294
|
+
results.push(...findDossierFilesLocal(fullPath, recursive));
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
else if (entry.isFile() && entry.name.endsWith('.ds.md')) {
|
|
298
|
+
results.push(fullPath);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
// Silently skip directories we can't read
|
|
304
|
+
}
|
|
305
|
+
return results;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Parse source string to determine type and details.
|
|
309
|
+
*/
|
|
310
|
+
function parseListSource(source) {
|
|
311
|
+
// GitHub shorthand: github:owner/repo or github:owner/repo/path@branch
|
|
312
|
+
if (source.startsWith('github:')) {
|
|
313
|
+
const rest = source.slice(7);
|
|
314
|
+
const [pathPart, branch] = rest.split('@');
|
|
315
|
+
const parts = pathPart.split('/');
|
|
316
|
+
const owner = parts[0];
|
|
317
|
+
const repo = parts[1];
|
|
318
|
+
const subpath = parts.slice(2).join('/') || '';
|
|
319
|
+
return {
|
|
320
|
+
type: 'github',
|
|
321
|
+
owner,
|
|
322
|
+
repo,
|
|
323
|
+
path: subpath,
|
|
324
|
+
branch: branch || 'main',
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// GitHub URL
|
|
328
|
+
if (source.startsWith('https://github.com/') || source.startsWith('http://github.com/')) {
|
|
329
|
+
const url = new URL(source);
|
|
330
|
+
const parts = url.pathname.split('/').filter((p) => p);
|
|
331
|
+
const owner = parts[0];
|
|
332
|
+
const repo = parts[1];
|
|
333
|
+
if (parts[2] === 'tree' && parts.length >= 4) {
|
|
334
|
+
const branch = parts[3];
|
|
335
|
+
const subpath = parts.slice(4).join('/');
|
|
336
|
+
return {
|
|
337
|
+
type: 'github',
|
|
338
|
+
owner,
|
|
339
|
+
repo,
|
|
340
|
+
path: subpath,
|
|
341
|
+
branch,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
type: 'github',
|
|
346
|
+
owner,
|
|
347
|
+
repo,
|
|
348
|
+
path: '',
|
|
349
|
+
branch: 'main',
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
// Default: local path
|
|
353
|
+
return {
|
|
354
|
+
type: 'local',
|
|
355
|
+
path: source,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Fetch GitHub repository tree and find .ds.md files.
|
|
360
|
+
*/
|
|
361
|
+
async function findDossierFilesGitHub(owner, repo, subpath, branch) {
|
|
362
|
+
const apiUrl = `https://api.github.com/repos/${owner}/${repo}/git/trees/${branch}?recursive=1`;
|
|
363
|
+
return new Promise((resolve, reject) => {
|
|
364
|
+
const options = {
|
|
365
|
+
headers: {
|
|
366
|
+
'User-Agent': 'dossier-cli',
|
|
367
|
+
Accept: 'application/vnd.github.v3+json',
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
node_https_1.default
|
|
371
|
+
.get(apiUrl, options, (res) => {
|
|
372
|
+
if (res.statusCode === 404) {
|
|
373
|
+
return reject(new Error(`Repository not found: ${owner}/${repo} (branch: ${branch})`));
|
|
374
|
+
}
|
|
375
|
+
if (res.statusCode === 403) {
|
|
376
|
+
return reject(new Error('GitHub API rate limit exceeded. Try again later or use a local clone.'));
|
|
377
|
+
}
|
|
378
|
+
if (res.statusCode !== 200) {
|
|
379
|
+
return reject(new Error(`GitHub API error: ${res.statusCode} ${res.statusMessage}`));
|
|
380
|
+
}
|
|
381
|
+
let data = '';
|
|
382
|
+
res.on('data', (chunk) => {
|
|
383
|
+
data += chunk;
|
|
384
|
+
});
|
|
385
|
+
res.on('end', () => {
|
|
386
|
+
try {
|
|
387
|
+
const tree = JSON.parse(data);
|
|
388
|
+
if (!tree.tree) {
|
|
389
|
+
return reject(new Error('Invalid response from GitHub API'));
|
|
390
|
+
}
|
|
391
|
+
const dossierFiles = tree.tree
|
|
392
|
+
.filter((item) => {
|
|
393
|
+
if (item.type !== 'blob')
|
|
394
|
+
return false;
|
|
395
|
+
if (!item.path.endsWith('.ds.md'))
|
|
396
|
+
return false;
|
|
397
|
+
if (subpath && !item.path.startsWith(subpath + '/') && item.path !== subpath)
|
|
398
|
+
return false;
|
|
399
|
+
if (item.path.includes('node_modules/'))
|
|
400
|
+
return false;
|
|
401
|
+
return true;
|
|
402
|
+
})
|
|
403
|
+
.map((item) => ({
|
|
404
|
+
path: item.path,
|
|
405
|
+
rawUrl: `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/${item.path}`,
|
|
406
|
+
githubUrl: `https://github.com/${owner}/${repo}/blob/${branch}/${item.path}`,
|
|
407
|
+
}));
|
|
408
|
+
resolve(dossierFiles);
|
|
409
|
+
}
|
|
410
|
+
catch (err) {
|
|
411
|
+
reject(new Error(`Failed to parse GitHub response: ${err.message}`));
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
})
|
|
415
|
+
.on('error', reject);
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Fetch and parse dossier metadata from a URL.
|
|
420
|
+
*/
|
|
421
|
+
async function fetchDossierMetadata(url, displayPath) {
|
|
422
|
+
return new Promise((resolve) => {
|
|
423
|
+
const protocol = url.startsWith('https://') ? node_https_1.default : node_http_1.default;
|
|
424
|
+
protocol
|
|
425
|
+
.get(url, (res) => {
|
|
426
|
+
if (res.statusCode !== 200) {
|
|
427
|
+
resolve({
|
|
428
|
+
path: displayPath,
|
|
429
|
+
filename: node_path_1.default.basename(displayPath),
|
|
430
|
+
title: node_path_1.default.basename(displayPath, '.ds.md'),
|
|
431
|
+
error: `HTTP ${res.statusCode}`,
|
|
432
|
+
});
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
let content = '';
|
|
436
|
+
res.on('data', (chunk) => {
|
|
437
|
+
content += chunk;
|
|
438
|
+
});
|
|
439
|
+
res.on('end', () => {
|
|
440
|
+
resolve(parseDossierMetadataFromContent(content, displayPath));
|
|
441
|
+
});
|
|
442
|
+
})
|
|
443
|
+
.on('error', (err) => {
|
|
444
|
+
resolve({
|
|
445
|
+
path: displayPath,
|
|
446
|
+
filename: node_path_1.default.basename(displayPath),
|
|
447
|
+
title: node_path_1.default.basename(displayPath, '.ds.md'),
|
|
448
|
+
error: err.message,
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Parse dossier metadata from file content.
|
|
455
|
+
*/
|
|
456
|
+
function parseDossierMetadataFromContent(content, filePath) {
|
|
457
|
+
try {
|
|
458
|
+
// Check for ---dossier JSON frontmatter format
|
|
459
|
+
const jsonFrontmatterMatch = content.match(/^---dossier\s*\n([\s\S]*?)\n---/);
|
|
460
|
+
if (jsonFrontmatterMatch) {
|
|
461
|
+
try {
|
|
462
|
+
const frontmatter = JSON.parse(jsonFrontmatterMatch[1]);
|
|
463
|
+
return {
|
|
464
|
+
path: filePath,
|
|
465
|
+
filename: node_path_1.default.basename(filePath),
|
|
466
|
+
title: frontmatter.title || node_path_1.default.basename(filePath, '.ds.md'),
|
|
467
|
+
version: frontmatter.version || '-',
|
|
468
|
+
risk_level: frontmatter.risk_level || 'unknown',
|
|
469
|
+
category: Array.isArray(frontmatter.category)
|
|
470
|
+
? frontmatter.category.join(', ')
|
|
471
|
+
: frontmatter.category || '-',
|
|
472
|
+
status: frontmatter.status || '-',
|
|
473
|
+
signed: !!frontmatter.signature,
|
|
474
|
+
checksum: !!frontmatter.checksum,
|
|
475
|
+
objective: frontmatter.objective || '',
|
|
476
|
+
error: null,
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
catch {
|
|
480
|
+
return {
|
|
481
|
+
path: filePath,
|
|
482
|
+
filename: node_path_1.default.basename(filePath),
|
|
483
|
+
title: node_path_1.default.basename(filePath, '.ds.md'),
|
|
484
|
+
error: 'Invalid JSON frontmatter',
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
// Check for standard YAML frontmatter format
|
|
489
|
+
const yamlFrontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
490
|
+
if (yamlFrontmatterMatch) {
|
|
491
|
+
const frontmatter = {};
|
|
492
|
+
const lines = yamlFrontmatterMatch[1].split('\n');
|
|
493
|
+
for (const line of lines) {
|
|
494
|
+
const match = line.match(/^(\w+):\s*(.*)$/);
|
|
495
|
+
if (match) {
|
|
496
|
+
let value = match[2].trim();
|
|
497
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
498
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
499
|
+
value = value.slice(1, -1);
|
|
500
|
+
}
|
|
501
|
+
frontmatter[match[1]] = value;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return {
|
|
505
|
+
path: filePath,
|
|
506
|
+
filename: node_path_1.default.basename(filePath),
|
|
507
|
+
title: frontmatter.title || node_path_1.default.basename(filePath, '.ds.md'),
|
|
508
|
+
version: frontmatter.version || '-',
|
|
509
|
+
risk_level: frontmatter.risk_level || 'unknown',
|
|
510
|
+
category: frontmatter.category || '-',
|
|
511
|
+
status: frontmatter.status || '-',
|
|
512
|
+
signed: !!frontmatter.signature,
|
|
513
|
+
checksum: !!frontmatter.checksum,
|
|
514
|
+
objective: frontmatter.objective || '',
|
|
515
|
+
error: null,
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
// No frontmatter found
|
|
519
|
+
return {
|
|
520
|
+
path: filePath,
|
|
521
|
+
filename: node_path_1.default.basename(filePath),
|
|
522
|
+
title: node_path_1.default.basename(filePath, '.ds.md'),
|
|
523
|
+
error: 'No frontmatter found',
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
catch (err) {
|
|
527
|
+
return {
|
|
528
|
+
path: filePath,
|
|
529
|
+
filename: node_path_1.default.basename(filePath),
|
|
530
|
+
title: node_path_1.default.basename(filePath, '.ds.md'),
|
|
531
|
+
error: err.message,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Parse dossier metadata from a local file.
|
|
537
|
+
*/
|
|
538
|
+
function parseDossierMetadataLocal(filePath) {
|
|
539
|
+
try {
|
|
540
|
+
const content = node_fs_1.default.readFileSync(filePath, 'utf8');
|
|
541
|
+
return parseDossierMetadataFromContent(content, filePath);
|
|
542
|
+
}
|
|
543
|
+
catch (err) {
|
|
544
|
+
return {
|
|
545
|
+
path: filePath,
|
|
546
|
+
filename: node_path_1.default.basename(filePath),
|
|
547
|
+
title: node_path_1.default.basename(filePath, '.ds.md'),
|
|
548
|
+
error: err.message,
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Verify a dossier file using the verify script (quick check).
|
|
554
|
+
*/
|
|
555
|
+
function verifyDossierQuick(filePath) {
|
|
556
|
+
const verifyScript = node_path_1.default.join(exports.BIN_DIR, 'dossier-verify');
|
|
557
|
+
try {
|
|
558
|
+
(0, node_child_process_1.execSync)(`node "${verifyScript}" "${filePath}" --exit-code-only 2>/dev/null`, {
|
|
559
|
+
stdio: 'pipe',
|
|
560
|
+
});
|
|
561
|
+
return true;
|
|
562
|
+
}
|
|
563
|
+
catch {
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Format output as table.
|
|
569
|
+
*/
|
|
570
|
+
function formatTable(dossiers, showPath = false) {
|
|
571
|
+
if (dossiers.length === 0) {
|
|
572
|
+
return 'No dossiers found.';
|
|
573
|
+
}
|
|
574
|
+
const titleWidth = Math.min(30, Math.max(5, ...dossiers.map((d) => (d.title || '').length)));
|
|
575
|
+
const riskWidth = 8;
|
|
576
|
+
const signedWidth = 6;
|
|
577
|
+
let output = '\n';
|
|
578
|
+
output += 'TITLE'.padEnd(titleWidth + 2);
|
|
579
|
+
output += 'RISK'.padEnd(riskWidth + 2);
|
|
580
|
+
output += 'SIGNED'.padEnd(signedWidth + 2);
|
|
581
|
+
output += showPath ? 'PATH' : 'FILE';
|
|
582
|
+
output += '\n';
|
|
583
|
+
output += '─'.repeat(titleWidth + riskWidth + signedWidth + 50) + '\n';
|
|
584
|
+
for (const d of dossiers) {
|
|
585
|
+
const title = (d.title || d.filename).substring(0, titleWidth);
|
|
586
|
+
const risk = (d.risk_level || 'unknown').toUpperCase().substring(0, riskWidth);
|
|
587
|
+
const signed = d.signed ? '✅' : '⚠️';
|
|
588
|
+
const pathOrFile = showPath ? d.path : d.filename;
|
|
589
|
+
output += title.padEnd(titleWidth + 2);
|
|
590
|
+
output += risk.padEnd(riskWidth + 2);
|
|
591
|
+
output += signed.padEnd(signedWidth + 2);
|
|
592
|
+
output += pathOrFile;
|
|
593
|
+
output += '\n';
|
|
594
|
+
}
|
|
595
|
+
return output;
|
|
596
|
+
}
|
|
597
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code hook integration for Dossier CLI.
|
|
3
|
+
* Manages the UserPromptSubmit hook that triggers automatic dossier discovery.
|
|
4
|
+
*/
|
|
5
|
+
export interface DossierEntry {
|
|
6
|
+
name: string;
|
|
7
|
+
title: string;
|
|
8
|
+
}
|
|
9
|
+
declare const DOSSIER_HOOK_ID = "dossier-discovery-hook";
|
|
10
|
+
declare const DOSSIER_HOOK_COMMAND = "dossier prompt-hook";
|
|
11
|
+
declare const DOSSIER_HOOK_PATTERN: RegExp;
|
|
12
|
+
declare const CLAUDE_SETTINGS_FILE: string;
|
|
13
|
+
declare const DOSSIER_LIST_CACHE_FILE: string;
|
|
14
|
+
declare const CACHE_TTL_MS = 300000;
|
|
15
|
+
/**
|
|
16
|
+
* Install the Dossier discovery hook into Claude Code settings.
|
|
17
|
+
* Returns true if newly installed, false if already present.
|
|
18
|
+
*/
|
|
19
|
+
declare function installClaudeHook(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Remove the Dossier discovery hook from Claude Code settings.
|
|
22
|
+
* Returns true if found and removed, false if not found.
|
|
23
|
+
*/
|
|
24
|
+
declare function removeClaudeHook(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Test whether a user prompt matches the dossier discovery pattern.
|
|
27
|
+
*/
|
|
28
|
+
declare function matchesHookPattern(prompt: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Return cached dossier list if fresh (< 5 minutes), null otherwise.
|
|
31
|
+
*/
|
|
32
|
+
declare function getCachedDossierList(): DossierEntry[] | null;
|
|
33
|
+
/**
|
|
34
|
+
* Write dossier list to cache file.
|
|
35
|
+
*/
|
|
36
|
+
declare function saveDossierListCache(dossiers: DossierEntry[]): void;
|
|
37
|
+
export { DOSSIER_HOOK_ID, DOSSIER_HOOK_COMMAND, DOSSIER_HOOK_PATTERN, CLAUDE_SETTINGS_FILE, DOSSIER_LIST_CACHE_FILE, CACHE_TTL_MS, installClaudeHook, removeClaudeHook, matchesHookPattern, getCachedDossierList, saveDossierListCache, };
|
|
38
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAkBD,QAAA,MAAM,eAAe,2BAA2B,CAAC;AACjD,QAAA,MAAM,oBAAoB,wBAAwB,CAAC;AAEnD,QAAA,MAAM,oBAAoB,QAC0H,CAAC;AAErJ,QAAA,MAAM,oBAAoB,QAAsD,CAAC;AACjF,QAAA,MAAM,uBAAuB,QAAmD,CAAC;AACjF,QAAA,MAAM,YAAY,SAAU,CAAC;AAE7B;;;GAGG;AACH,iBAAS,iBAAiB,IAAI,OAAO,CAoDpC;AAED;;;GAGG;AACH,iBAAS,gBAAgB,IAAI,OAAO,CAkCnC;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAOD;;GAEG;AACH,iBAAS,oBAAoB,IAAI,YAAY,EAAE,GAAG,IAAI,CAerD;AAED;;GAEG;AACH,iBAAS,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAO5D;AAED,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,CAAC"}
|