@ai-dossier/cli 0.4.1 → 0.5.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 +147 -25
- package/bin/dossier-verify +6 -440
- package/dist/cli.js +82 -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 +229 -69
- package/dist/commands/config-cmd.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +17 -8
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +24 -8
- 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 +18 -6
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/history.d.ts +6 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +80 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +19 -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 +55 -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 +22 -55
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +31 -14
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +17 -43
- 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 +192 -48
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +33 -29
- 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 +179 -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 +29 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +133 -3
- 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 +122 -54
- 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 +10 -10
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +25 -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 +62 -15
- package/dist/registry-client.d.ts.map +1 -1
- package/dist/registry-client.js +11 -14
- package/dist/registry-client.js.map +1 -1
- package/dist/run-log.d.ts +37 -0
- package/dist/run-log.d.ts.map +1 -0
- package/dist/run-log.js +78 -0
- package/dist/run-log.js.map +1 -0
- 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/dist/write-auth.d.ts +24 -0
- package/dist/write-auth.d.ts.map +1 -0
- package/dist/write-auth.js +85 -0
- package/dist/write-auth.js.map +1 -0
- package/package.json +1 -1
package/dist/config.js
CHANGED
|
@@ -2,20 +2,27 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Configuration management for Dossier CLI
|
|
4
4
|
* Handles reading and writing user preferences to ~/.dossier/config.json
|
|
5
|
+
* and multi-registry configuration.
|
|
5
6
|
*/
|
|
6
7
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
8
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
9
|
};
|
|
9
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.DEFAULT_CONFIG = exports.CONFIG_FILE = exports.CONFIG_DIR = void 0;
|
|
11
|
+
exports.DEFAULT_REGISTRY_URL = exports.DEFAULT_CONFIG = exports.CONFIG_FILE = exports.CONFIG_DIR = void 0;
|
|
11
12
|
exports.ensureConfigDir = ensureConfigDir;
|
|
12
13
|
exports.loadConfig = loadConfig;
|
|
13
14
|
exports.saveConfig = saveConfig;
|
|
14
15
|
exports.getConfig = getConfig;
|
|
15
16
|
exports.setConfig = setConfig;
|
|
17
|
+
exports.loadProjectConfig = loadProjectConfig;
|
|
18
|
+
exports.resolveRegistries = resolveRegistries;
|
|
19
|
+
exports.resolveWriteRegistry = resolveWriteRegistry;
|
|
20
|
+
exports.resolveRegistryByName = resolveRegistryByName;
|
|
16
21
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
17
22
|
const node_os_1 = __importDefault(require("node:os"));
|
|
18
23
|
const node_path_1 = __importDefault(require("node:path"));
|
|
24
|
+
const DEFAULT_REGISTRY_URL = 'https://dossier-registry.vercel.app';
|
|
25
|
+
exports.DEFAULT_REGISTRY_URL = DEFAULT_REGISTRY_URL;
|
|
19
26
|
const CONFIG_DIR = node_path_1.default.join(node_os_1.default.homedir(), '.dossier');
|
|
20
27
|
exports.CONFIG_DIR = CONFIG_DIR;
|
|
21
28
|
const CONFIG_FILE = node_path_1.default.join(CONFIG_DIR, 'config.json');
|
|
@@ -47,8 +54,8 @@ function loadConfig() {
|
|
|
47
54
|
// Merge with defaults to ensure all keys exist
|
|
48
55
|
return { ...DEFAULT_CONFIG, ...config };
|
|
49
56
|
}
|
|
50
|
-
catch (
|
|
51
|
-
console.error(
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error(`⚠️ Warning: Could not read config file (${error.message}), using defaults`);
|
|
52
59
|
return { ...DEFAULT_CONFIG };
|
|
53
60
|
}
|
|
54
61
|
}
|
|
@@ -84,4 +91,127 @@ function setConfig(key, value) {
|
|
|
84
91
|
config[key] = value;
|
|
85
92
|
return saveConfig(config);
|
|
86
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Load project-level .dossierrc.json by walking up from cwd.
|
|
96
|
+
*/
|
|
97
|
+
function loadProjectConfig() {
|
|
98
|
+
let dir = process.cwd();
|
|
99
|
+
const root = node_path_1.default.parse(dir).root;
|
|
100
|
+
while (dir !== root) {
|
|
101
|
+
const rcFile = node_path_1.default.join(dir, '.dossierrc.json');
|
|
102
|
+
if (node_fs_1.default.existsSync(rcFile)) {
|
|
103
|
+
try {
|
|
104
|
+
return JSON.parse(node_fs_1.default.readFileSync(rcFile, 'utf8'));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
console.error(`⚠️ Warning: Invalid .dossierrc.json at ${rcFile}`);
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
dir = node_path_1.default.dirname(dir);
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Resolve all configured registries, merging user + project config.
|
|
117
|
+
* Resolution priority:
|
|
118
|
+
* 1. CLI --registry flag (handled by caller)
|
|
119
|
+
* 2. DOSSIER_REGISTRY_URL env var → virtual "env" registry
|
|
120
|
+
* 3. Project-level .dossierrc.json
|
|
121
|
+
* 4. User-level ~/.dossier/config.json
|
|
122
|
+
* 5. Hardcoded default (public registry)
|
|
123
|
+
*/
|
|
124
|
+
/**
|
|
125
|
+
* Internal: resolve registries from pre-loaded configs (avoids redundant file reads).
|
|
126
|
+
*/
|
|
127
|
+
function resolveRegistriesFromConfig(userConfig, projectConfig) {
|
|
128
|
+
// Merge registries: project overlays user (project wins on name conflicts)
|
|
129
|
+
const merged = {};
|
|
130
|
+
if (userConfig.registries) {
|
|
131
|
+
for (const [name, entry] of Object.entries(userConfig.registries)) {
|
|
132
|
+
merged[name] = entry;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (projectConfig?.registries) {
|
|
136
|
+
for (const [name, entry] of Object.entries(projectConfig.registries)) {
|
|
137
|
+
if (name in merged) {
|
|
138
|
+
// Project config cannot override user-configured registries (credential exfiltration vector)
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
merged[name] = entry;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// DOSSIER_REGISTRY_URL env var creates a virtual "env" registry
|
|
145
|
+
const envUrl = process.env.DOSSIER_REGISTRY_URL;
|
|
146
|
+
if (envUrl) {
|
|
147
|
+
merged.env = { url: envUrl };
|
|
148
|
+
}
|
|
149
|
+
// If no registries configured at all, use hardcoded default
|
|
150
|
+
if (Object.keys(merged).length === 0) {
|
|
151
|
+
return [{ name: 'public', url: DEFAULT_REGISTRY_URL }];
|
|
152
|
+
}
|
|
153
|
+
return Object.entries(merged).map(([name, entry]) => ({
|
|
154
|
+
name,
|
|
155
|
+
url: entry.url,
|
|
156
|
+
readonly: entry.readonly,
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
function resolveRegistries() {
|
|
160
|
+
return resolveRegistriesFromConfig(loadConfig(), loadProjectConfig());
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Resolve which single registry to use for write operations.
|
|
164
|
+
* Priority: --registry flag > defaultRegistry (project > user) > first registry
|
|
165
|
+
*/
|
|
166
|
+
function resolveWriteRegistry(registryFlag) {
|
|
167
|
+
const userConfig = loadConfig();
|
|
168
|
+
const projectConfig = loadProjectConfig();
|
|
169
|
+
const registries = resolveRegistriesFromConfig(userConfig, projectConfig);
|
|
170
|
+
if (registryFlag) {
|
|
171
|
+
const found = registries.find((r) => r.name === registryFlag);
|
|
172
|
+
if (!found) {
|
|
173
|
+
const names = registries.map((r) => r.name).join(', ');
|
|
174
|
+
throw new Error(`Registry '${registryFlag}' not found. Available: ${names}. Run 'dossier config --list-registries' to see configured registries.`);
|
|
175
|
+
}
|
|
176
|
+
if (found.readonly) {
|
|
177
|
+
throw new Error(`Registry '${registryFlag}' is read-only`);
|
|
178
|
+
}
|
|
179
|
+
return found;
|
|
180
|
+
}
|
|
181
|
+
const defaultName = projectConfig?.defaultRegistry || userConfig.defaultRegistry;
|
|
182
|
+
if (defaultName) {
|
|
183
|
+
const found = registries.find((r) => r.name === defaultName);
|
|
184
|
+
if (found) {
|
|
185
|
+
if (found.readonly) {
|
|
186
|
+
throw new Error(`Default registry '${defaultName}' is read-only`);
|
|
187
|
+
}
|
|
188
|
+
return found;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Find first registry marked as default
|
|
192
|
+
for (const reg of registries) {
|
|
193
|
+
const allConfigs = { ...userConfig.registries, ...projectConfig?.registries };
|
|
194
|
+
const entry = allConfigs[reg.name];
|
|
195
|
+
if (entry?.default && !reg.readonly) {
|
|
196
|
+
return reg;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Fall back to first non-readonly registry
|
|
200
|
+
const writable = registries.find((r) => !r.readonly);
|
|
201
|
+
if (writable)
|
|
202
|
+
return writable;
|
|
203
|
+
throw new Error('No writable registry configured. All registries are read-only.');
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Resolve a single registry by name (for auth commands).
|
|
207
|
+
*/
|
|
208
|
+
function resolveRegistryByName(name) {
|
|
209
|
+
const registries = resolveRegistries();
|
|
210
|
+
const found = registries.find((r) => r.name === name);
|
|
211
|
+
if (!found) {
|
|
212
|
+
const names = registries.map((r) => r.name).join(', ');
|
|
213
|
+
throw new Error(`Registry '${name}' not found. Available: ${names}`);
|
|
214
|
+
}
|
|
215
|
+
return found;
|
|
216
|
+
}
|
|
87
217
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/credentials.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Credential storage for Dossier registry authentication.
|
|
3
|
-
* Stores credentials at ~/.dossier/credentials.json with secure file permissions.
|
|
3
|
+
* Stores per-registry credentials at ~/.dossier/credentials.json with secure file permissions.
|
|
4
|
+
* Auto-migrates old flat format to keyed-by-registry format.
|
|
4
5
|
*/
|
|
5
6
|
export interface Credentials {
|
|
6
7
|
token: string;
|
|
@@ -10,21 +11,25 @@ export interface Credentials {
|
|
|
10
11
|
}
|
|
11
12
|
declare const CREDENTIALS_FILE: string;
|
|
12
13
|
/**
|
|
13
|
-
* Save credentials
|
|
14
|
+
* Save credentials for a specific registry.
|
|
14
15
|
*/
|
|
15
|
-
declare function saveCredentials(credentials: Credentials): void;
|
|
16
|
+
declare function saveCredentials(credentials: Credentials, registryName?: string): void;
|
|
16
17
|
/**
|
|
17
|
-
* Load credentials
|
|
18
|
-
*
|
|
18
|
+
* Load credentials for a specific registry.
|
|
19
|
+
* Falls back to "public" for backward compatibility.
|
|
19
20
|
*/
|
|
20
|
-
declare function loadCredentials(): Credentials | null;
|
|
21
|
+
declare function loadCredentials(registryName?: string): Credentials | null;
|
|
21
22
|
/**
|
|
22
|
-
* Delete
|
|
23
|
+
* Delete credentials for a specific registry, or all if no name given.
|
|
23
24
|
*/
|
|
24
|
-
declare function deleteCredentials(): boolean;
|
|
25
|
+
declare function deleteCredentials(registryName?: string): boolean;
|
|
25
26
|
/**
|
|
26
27
|
* Check if credentials are expired.
|
|
27
28
|
*/
|
|
28
29
|
declare function isExpired(credentials: Pick<Credentials, 'expiresAt'>): boolean;
|
|
29
|
-
|
|
30
|
+
/**
|
|
31
|
+
* List all registries that have stored credentials.
|
|
32
|
+
*/
|
|
33
|
+
declare function listCredentialRegistries(): string[];
|
|
34
|
+
export { CREDENTIALS_FILE, saveCredentials, loadCredentials, deleteCredentials, isExpired, listCredentialRegistries, };
|
|
30
35
|
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAID,QAAA,MAAM,gBAAgB,QAA4C,CAAC;AA8GnE;;GAEG;AACH,iBAAS,eAAe,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,SAAW,GAAG,IAAI,CAIhF;AAED;;;GAGG;AACH,iBAAS,eAAe,CAAC,YAAY,SAAW,GAAG,WAAW,GAAG,IAAI,CAGpE;AAED;;GAEG;AACH,iBAAS,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAiBzD;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,OAAO,CASvE;AAED;;GAEG;AACH,iBAAS,wBAAwB,IAAI,MAAM,EAAE,CAG5C;AAED,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,wBAAwB,GACzB,CAAC"}
|
package/dist/credentials.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Credential storage for Dossier registry authentication.
|
|
4
|
-
* Stores credentials at ~/.dossier/credentials.json with secure file permissions.
|
|
4
|
+
* Stores per-registry credentials at ~/.dossier/credentials.json with secure file permissions.
|
|
5
|
+
* Auto-migrates old flat format to keyed-by-registry format.
|
|
5
6
|
*/
|
|
6
7
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
8
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -12,83 +13,145 @@ exports.saveCredentials = saveCredentials;
|
|
|
12
13
|
exports.loadCredentials = loadCredentials;
|
|
13
14
|
exports.deleteCredentials = deleteCredentials;
|
|
14
15
|
exports.isExpired = isExpired;
|
|
16
|
+
exports.listCredentialRegistries = listCredentialRegistries;
|
|
15
17
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
16
18
|
const node_path_1 = __importDefault(require("node:path"));
|
|
17
19
|
const config_1 = require("./config");
|
|
18
20
|
const CREDENTIALS_FILE = node_path_1.default.join(config_1.CONFIG_DIR, 'credentials.json');
|
|
19
21
|
exports.CREDENTIALS_FILE = CREDENTIALS_FILE;
|
|
20
22
|
/**
|
|
21
|
-
*
|
|
23
|
+
* Read and parse the credentials file, returning the raw JSON.
|
|
22
24
|
*/
|
|
23
|
-
function
|
|
24
|
-
if (!node_fs_1.default.existsSync(
|
|
25
|
-
|
|
25
|
+
function readCredentialsFile() {
|
|
26
|
+
if (!node_fs_1.default.existsSync(CREDENTIALS_FILE)) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
// Verify file permissions haven't been loosened
|
|
31
|
+
const stats = node_fs_1.default.statSync(CREDENTIALS_FILE);
|
|
32
|
+
const otherPerms = stats.mode & 0o077;
|
|
33
|
+
if (otherPerms !== 0) {
|
|
34
|
+
console.error(`⚠️ Warning: ${CREDENTIALS_FILE} has insecure permissions (${(stats.mode & 0o777).toString(8)}). ` +
|
|
35
|
+
`Expected 0600. Credentials may have been compromised. Fixing permissions.`);
|
|
36
|
+
node_fs_1.default.chmodSync(CREDENTIALS_FILE, 0o600);
|
|
37
|
+
}
|
|
38
|
+
return JSON.parse(node_fs_1.default.readFileSync(CREDENTIALS_FILE, 'utf8'));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error(`⚠️ Warning: Could not parse credentials file ${CREDENTIALS_FILE} (${error.message})`);
|
|
42
|
+
return null;
|
|
26
43
|
}
|
|
27
44
|
}
|
|
28
45
|
/**
|
|
29
|
-
*
|
|
46
|
+
* Detect whether the credentials file uses old flat format.
|
|
47
|
+
* Old format has `token` and `username` at the top level.
|
|
30
48
|
*/
|
|
31
|
-
function
|
|
32
|
-
|
|
33
|
-
const data = {
|
|
34
|
-
token: credentials.token,
|
|
35
|
-
username: credentials.username,
|
|
36
|
-
orgs: credentials.orgs || [],
|
|
37
|
-
expires_at: credentials.expiresAt || null,
|
|
38
|
-
};
|
|
39
|
-
node_fs_1.default.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
49
|
+
function isOldFormat(data) {
|
|
50
|
+
return typeof data.token === 'string' && typeof data.username === 'string';
|
|
40
51
|
}
|
|
41
52
|
/**
|
|
42
|
-
* Load credentials
|
|
43
|
-
* The env var takes precedence when set.
|
|
53
|
+
* Load the full credentials store, auto-migrating old format if needed.
|
|
44
54
|
*/
|
|
45
|
-
function
|
|
55
|
+
function loadCredentialsStore() {
|
|
56
|
+
// Check env var first — creates virtual credentials for "env" registry
|
|
46
57
|
const envToken = process.env.DOSSIER_REGISTRY_TOKEN;
|
|
58
|
+
const raw = readCredentialsFile();
|
|
59
|
+
const store = {};
|
|
60
|
+
if (raw) {
|
|
61
|
+
if (isOldFormat(raw)) {
|
|
62
|
+
// Auto-migrate: flat → keyed by "public"
|
|
63
|
+
store.public = {
|
|
64
|
+
token: raw.token,
|
|
65
|
+
username: raw.username,
|
|
66
|
+
orgs: raw.orgs || [],
|
|
67
|
+
expiresAt: raw.expires_at || null,
|
|
68
|
+
};
|
|
69
|
+
// Write back migrated format
|
|
70
|
+
saveCredentialsStore(store);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// New format: each key is a registry name
|
|
74
|
+
for (const [name, value] of Object.entries(raw)) {
|
|
75
|
+
const entry = value;
|
|
76
|
+
if (entry && typeof entry.token === 'string' && typeof entry.username === 'string') {
|
|
77
|
+
store[name] = {
|
|
78
|
+
token: entry.token,
|
|
79
|
+
username: entry.username,
|
|
80
|
+
orgs: entry.orgs || [],
|
|
81
|
+
expiresAt: entry.expires_at || entry.expiresAt || null,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
47
87
|
if (envToken) {
|
|
48
|
-
|
|
88
|
+
store.env = {
|
|
49
89
|
token: envToken,
|
|
50
90
|
username: process.env.DOSSIER_REGISTRY_USER || 'token-auth',
|
|
51
91
|
orgs: process.env.DOSSIER_REGISTRY_ORGS ? process.env.DOSSIER_REGISTRY_ORGS.split(',') : [],
|
|
52
92
|
expiresAt: null,
|
|
53
93
|
};
|
|
54
94
|
}
|
|
55
|
-
|
|
56
|
-
|
|
95
|
+
return store;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Save the full credentials store to file.
|
|
99
|
+
*/
|
|
100
|
+
function saveCredentialsStore(store) {
|
|
101
|
+
(0, config_1.ensureConfigDir)();
|
|
102
|
+
const data = {};
|
|
103
|
+
for (const [name, creds] of Object.entries(store)) {
|
|
104
|
+
if (name === 'env')
|
|
105
|
+
continue; // Don't persist env-var credentials
|
|
106
|
+
data[name] = {
|
|
107
|
+
token: creds.token,
|
|
108
|
+
username: creds.username,
|
|
109
|
+
orgs: creds.orgs || [],
|
|
110
|
+
expires_at: creds.expiresAt || null,
|
|
111
|
+
};
|
|
57
112
|
}
|
|
58
113
|
try {
|
|
59
|
-
|
|
60
|
-
const stats = node_fs_1.default.statSync(CREDENTIALS_FILE);
|
|
61
|
-
const otherPerms = stats.mode & 0o077;
|
|
62
|
-
if (otherPerms !== 0) {
|
|
63
|
-
console.error(`⚠️ Warning: ${CREDENTIALS_FILE} has insecure permissions (${(stats.mode & 0o777).toString(8)}). ` +
|
|
64
|
-
`Expected 0600. Credentials may have been compromised. Fixing permissions.`);
|
|
65
|
-
node_fs_1.default.chmodSync(CREDENTIALS_FILE, 0o600);
|
|
66
|
-
}
|
|
67
|
-
const raw = node_fs_1.default.readFileSync(CREDENTIALS_FILE, 'utf8');
|
|
68
|
-
const data = JSON.parse(raw);
|
|
69
|
-
if (!data.token || !data.username) {
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
return {
|
|
73
|
-
token: data.token,
|
|
74
|
-
username: data.username,
|
|
75
|
-
orgs: data.orgs || [],
|
|
76
|
-
expiresAt: data.expires_at || null,
|
|
77
|
-
};
|
|
114
|
+
node_fs_1.default.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
78
115
|
}
|
|
79
|
-
catch {
|
|
80
|
-
|
|
116
|
+
catch (error) {
|
|
117
|
+
throw new Error(`Failed to save credentials to ${CREDENTIALS_FILE}: ${error.message}`);
|
|
81
118
|
}
|
|
82
119
|
}
|
|
83
120
|
/**
|
|
84
|
-
*
|
|
121
|
+
* Save credentials for a specific registry.
|
|
85
122
|
*/
|
|
86
|
-
function
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
123
|
+
function saveCredentials(credentials, registryName = 'public') {
|
|
124
|
+
const store = loadCredentialsStore();
|
|
125
|
+
store[registryName] = credentials;
|
|
126
|
+
saveCredentialsStore(store);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Load credentials for a specific registry.
|
|
130
|
+
* Falls back to "public" for backward compatibility.
|
|
131
|
+
*/
|
|
132
|
+
function loadCredentials(registryName = 'public') {
|
|
133
|
+
const store = loadCredentialsStore();
|
|
134
|
+
return store[registryName] || null;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Delete credentials for a specific registry, or all if no name given.
|
|
138
|
+
*/
|
|
139
|
+
function deleteCredentials(registryName) {
|
|
140
|
+
if (!registryName) {
|
|
141
|
+
// Delete entire file (backward compat)
|
|
142
|
+
if (node_fs_1.default.existsSync(CREDENTIALS_FILE)) {
|
|
143
|
+
node_fs_1.default.unlinkSync(CREDENTIALS_FILE);
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
90
147
|
}
|
|
91
|
-
|
|
148
|
+
const store = loadCredentialsStore();
|
|
149
|
+
if (!(registryName in store)) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
delete store[registryName];
|
|
153
|
+
saveCredentialsStore(store);
|
|
154
|
+
return true;
|
|
92
155
|
}
|
|
93
156
|
/**
|
|
94
157
|
* Check if credentials are expired.
|
|
@@ -97,12 +160,17 @@ function isExpired(credentials) {
|
|
|
97
160
|
if (!credentials.expiresAt) {
|
|
98
161
|
return false;
|
|
99
162
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
return false;
|
|
163
|
+
const expires = new Date(credentials.expiresAt);
|
|
164
|
+
if (Number.isNaN(expires.getTime())) {
|
|
165
|
+
return true;
|
|
106
166
|
}
|
|
167
|
+
return Date.now() > expires.getTime();
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* List all registries that have stored credentials.
|
|
171
|
+
*/
|
|
172
|
+
function listCredentialRegistries() {
|
|
173
|
+
const store = loadCredentialsStore();
|
|
174
|
+
return Object.keys(store);
|
|
107
175
|
}
|
|
108
176
|
//# sourceMappingURL=credentials.js.map
|
package/dist/credentials.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/help.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom grouped help formatter for Commander.
|
|
3
|
+
* Groups commands by category instead of a flat list.
|
|
4
|
+
*/
|
|
5
|
+
import type { Command, Help } from 'commander';
|
|
6
|
+
export declare function formatHelpGrouped(cmd: Command, helper: Help): string;
|
|
7
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAc/C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,MAAM,CA4EpE"}
|
package/dist/help.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Custom grouped help formatter for Commander.
|
|
4
|
+
* Groups commands by category instead of a flat list.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.formatHelpGrouped = formatHelpGrouped;
|
|
8
|
+
const CATEGORIES = [
|
|
9
|
+
{ name: 'Getting Started', commands: ['init', 'create', 'from-file'] },
|
|
10
|
+
{ name: 'Verify & Run', commands: ['verify', 'run', 'validate', 'lint', 'format'] },
|
|
11
|
+
{
|
|
12
|
+
name: 'Registry',
|
|
13
|
+
commands: ['search', 'list', 'info', 'get', 'pull', 'export', 'publish', 'remove'],
|
|
14
|
+
},
|
|
15
|
+
{ name: 'Skills', commands: ['install-skill', 'skill-export'] },
|
|
16
|
+
{ name: 'Security', commands: ['sign', 'checksum', 'keys'] },
|
|
17
|
+
{ name: 'Auth & Config', commands: ['login', 'logout', 'whoami', 'config', 'cache'] },
|
|
18
|
+
];
|
|
19
|
+
function formatHelpGrouped(cmd, helper) {
|
|
20
|
+
const termWidth = helper.padWidth(cmd, helper);
|
|
21
|
+
const helpWidth = helper.helpWidth || 80;
|
|
22
|
+
const itemIndentWidth = 2;
|
|
23
|
+
const itemSeparatorWidth = 2;
|
|
24
|
+
function formatItem(term, description) {
|
|
25
|
+
if (description) {
|
|
26
|
+
const fullText = `${term.padEnd(termWidth + itemSeparatorWidth)}${description}`;
|
|
27
|
+
return helper.wrap(fullText, helpWidth - itemIndentWidth, termWidth + itemSeparatorWidth);
|
|
28
|
+
}
|
|
29
|
+
return term;
|
|
30
|
+
}
|
|
31
|
+
function formatList(items) {
|
|
32
|
+
return items.join('\n').replace(/^/gm, ' '.repeat(itemIndentWidth));
|
|
33
|
+
}
|
|
34
|
+
let output = '';
|
|
35
|
+
// Usage
|
|
36
|
+
output += `Usage: ${helper.commandUsage(cmd)}\n\n`;
|
|
37
|
+
// Description
|
|
38
|
+
const desc = helper.commandDescription(cmd);
|
|
39
|
+
if (desc) {
|
|
40
|
+
output += `${desc}\n\n`;
|
|
41
|
+
}
|
|
42
|
+
// Build command map from visible commands
|
|
43
|
+
const visibleCommands = helper.visibleCommands(cmd);
|
|
44
|
+
const commandMap = new Map();
|
|
45
|
+
for (const sub of visibleCommands) {
|
|
46
|
+
commandMap.set(sub.name(), sub);
|
|
47
|
+
}
|
|
48
|
+
// Grouped commands by category
|
|
49
|
+
const categorized = new Set();
|
|
50
|
+
for (const category of CATEGORIES) {
|
|
51
|
+
const items = [];
|
|
52
|
+
for (const name of category.commands) {
|
|
53
|
+
const sub = commandMap.get(name);
|
|
54
|
+
if (sub) {
|
|
55
|
+
items.push(formatItem(helper.subcommandTerm(sub), helper.subcommandDescription(sub)));
|
|
56
|
+
categorized.add(name);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (items.length > 0) {
|
|
60
|
+
output += `${category.name}:\n`;
|
|
61
|
+
output += `${formatList(items)}\n\n`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// "Other" catch-all for uncategorized visible commands (e.g. help)
|
|
65
|
+
const otherItems = [];
|
|
66
|
+
for (const sub of visibleCommands) {
|
|
67
|
+
if (!categorized.has(sub.name())) {
|
|
68
|
+
otherItems.push(formatItem(helper.subcommandTerm(sub), helper.subcommandDescription(sub)));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (otherItems.length > 0) {
|
|
72
|
+
output += 'Other:\n';
|
|
73
|
+
output += `${formatList(otherItems)}\n\n`;
|
|
74
|
+
}
|
|
75
|
+
// Options
|
|
76
|
+
const optionItems = [];
|
|
77
|
+
for (const opt of helper.visibleOptions(cmd)) {
|
|
78
|
+
optionItems.push(formatItem(helper.optionTerm(opt), helper.optionDescription(opt)));
|
|
79
|
+
}
|
|
80
|
+
if (optionItems.length > 0) {
|
|
81
|
+
output += 'Options:\n';
|
|
82
|
+
output += `${formatList(optionItems)}\n\n`;
|
|
83
|
+
}
|
|
84
|
+
return output;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=help.js.map
|
package/dist/help.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
|
package/dist/helpers.d.ts
CHANGED
|
@@ -7,28 +7,20 @@ import { RECOMMENDED_FIELDS, REQUIRED_FIELDS, VALID_RISK_LEVELS, VALID_STATUSES
|
|
|
7
7
|
export declare const CLI_ROOT: string;
|
|
8
8
|
/** The bin/ directory */
|
|
9
9
|
export declare const BIN_DIR: string;
|
|
10
|
-
/** Repository root (parent of cli/) */
|
|
11
|
-
export declare const REPO_ROOT: string;
|
|
12
10
|
/** Official KMS keys that require CI/CD signing (not direct CLI use) */
|
|
13
11
|
export declare const OFFICIAL_KMS_KEYS: string[];
|
|
14
12
|
export { RECOMMENDED_FIELDS, REQUIRED_FIELDS, VALID_RISK_LEVELS, VALID_STATUSES };
|
|
15
13
|
export interface VerificationOptions {
|
|
16
14
|
skipChecksum?: boolean;
|
|
17
15
|
skipAllChecks?: boolean;
|
|
18
|
-
skipAuthorCheck?: boolean;
|
|
19
|
-
skipDossierCheck?: boolean;
|
|
20
|
-
skipRiskAssessment?: boolean;
|
|
21
|
-
skipReview?: boolean;
|
|
22
16
|
force?: boolean;
|
|
23
17
|
noPrompt?: boolean;
|
|
24
|
-
reviewDossier?: string;
|
|
25
18
|
}
|
|
26
19
|
export interface VerificationStage {
|
|
27
20
|
stage: number;
|
|
28
21
|
name: string;
|
|
29
22
|
passed?: boolean;
|
|
30
23
|
skipped?: boolean;
|
|
31
|
-
demo?: boolean;
|
|
32
24
|
}
|
|
33
25
|
export interface VerificationResult {
|
|
34
26
|
passed: boolean;
|
|
@@ -129,11 +121,19 @@ export declare function parseDossierMetadataFromContent(content: string, filePat
|
|
|
129
121
|
*/
|
|
130
122
|
export declare function parseDossierMetadataLocal(filePath: string): DossierMetadata;
|
|
131
123
|
/**
|
|
132
|
-
* Verify a dossier file using the
|
|
124
|
+
* Verify a dossier file (quick check using the TS module directly).
|
|
133
125
|
*/
|
|
134
|
-
export declare function verifyDossierQuick(filePath: string): boolean
|
|
126
|
+
export declare function verifyDossierQuick(filePath: string): Promise<boolean>;
|
|
135
127
|
/**
|
|
136
128
|
* Format output as table.
|
|
137
129
|
*/
|
|
138
130
|
export declare function formatTable(dossiers: DossierMetadata[], showPath?: boolean): string;
|
|
131
|
+
/**
|
|
132
|
+
* Print registry errors to stderr in a consistent format.
|
|
133
|
+
* Used across commands when multi-registry lookups partially or fully fail.
|
|
134
|
+
*/
|
|
135
|
+
export declare function printRegistryErrors(errors: ReadonlyArray<{
|
|
136
|
+
registry: string;
|
|
137
|
+
error: string;
|
|
138
|
+
}>, style?: 'indent' | 'warning'): void;
|
|
139
139
|
//# sourceMappingURL=helpers.d.ts.map
|