@principle2026/vault 1.0.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.
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Keychain - Keychain operations
3
+ *
4
+ * Uses keytar for cross-platform keychain access
5
+ */
6
+ /**
7
+ * Save encrypted master key to keychain
8
+ */
9
+ export declare function saveMasterKey(encryptedKey: string): Promise<void>;
10
+ /**
11
+ * Get encrypted master key from keychain
12
+ */
13
+ export declare function getMasterKey(): Promise<string | null>;
14
+ /**
15
+ * Delete master key
16
+ */
17
+ export declare function deleteMasterKey(): Promise<boolean>;
18
+ /**
19
+ * Save salt
20
+ */
21
+ export declare function saveSalt(salt: string): Promise<void>;
22
+ /**
23
+ * Get salt
24
+ */
25
+ export declare function getSalt(): Promise<string | null>;
26
+ /**
27
+ * Check if keychain is available
28
+ */
29
+ export declare function isKeychainAvailable(): Promise<boolean>;
30
+ //# sourceMappingURL=Keychain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Keychain.d.ts","sourceRoot":"","sources":["../src/Keychain.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;GAEG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE3D;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAExD;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;AAED;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEtD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQ5D"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Keychain - Keychain operations
3
+ *
4
+ * Uses keytar for cross-platform keychain access
5
+ */
6
+ import keytar from 'keytar';
7
+ const SERVICE_NAME = 'vault-skill';
8
+ const ACCOUNT_KEY = 'master-key';
9
+ const ACCOUNT_SALT = 'salt';
10
+ /**
11
+ * Save encrypted master key to keychain
12
+ */
13
+ export async function saveMasterKey(encryptedKey) {
14
+ await keytar.setPassword(SERVICE_NAME, ACCOUNT_KEY, encryptedKey);
15
+ }
16
+ /**
17
+ * Get encrypted master key from keychain
18
+ */
19
+ export async function getMasterKey() {
20
+ return await keytar.getPassword(SERVICE_NAME, ACCOUNT_KEY);
21
+ }
22
+ /**
23
+ * Delete master key
24
+ */
25
+ export async function deleteMasterKey() {
26
+ return await keytar.deletePassword(SERVICE_NAME, ACCOUNT_KEY);
27
+ }
28
+ /**
29
+ * Save salt
30
+ */
31
+ export async function saveSalt(salt) {
32
+ await keytar.setPassword(SERVICE_NAME, ACCOUNT_SALT, salt);
33
+ }
34
+ /**
35
+ * Get salt
36
+ */
37
+ export async function getSalt() {
38
+ return await keytar.getPassword(SERVICE_NAME, ACCOUNT_SALT);
39
+ }
40
+ /**
41
+ * Check if keychain is available
42
+ */
43
+ export async function isKeychainAvailable() {
44
+ try {
45
+ // Try a simple operation to detect availability
46
+ await keytar.getPassword(SERVICE_NAME, '__test__');
47
+ return true;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ //# sourceMappingURL=Keychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Keychain.js","sourceRoot":"","sources":["../src/Keychain.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,MAAM,YAAY,GAAG,aAAa,CAAA;AAClC,MAAM,WAAW,GAAG,YAAY,CAAA;AAChC,MAAM,YAAY,GAAG,MAAM,CAAA;AAE3B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,YAAoB;IAEpB,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO,MAAM,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,gDAAgD;QAChD,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Store - Data storage
3
+ *
4
+ * Handles iCloud and local storage
5
+ */
6
+ export interface StoredData {
7
+ version: string;
8
+ user_id: string;
9
+ created_at: string;
10
+ updated_at: string;
11
+ secrets: Record<string, SecretEntry>;
12
+ }
13
+ export interface SecretEntry {
14
+ value: string;
15
+ description: string;
16
+ created_at: string;
17
+ updated_at: string;
18
+ }
19
+ export interface StorageLocation {
20
+ path: string;
21
+ type: 'icloud' | 'local';
22
+ }
23
+ /**
24
+ * Detect and get best storage location
25
+ */
26
+ export declare function getStorageLocation(): Promise<StorageLocation>;
27
+ /**
28
+ * Read stored data
29
+ */
30
+ export declare function readStore(): Promise<StoredData | null>;
31
+ /**
32
+ * Write stored data
33
+ */
34
+ export declare function writeStore(data: StoredData): Promise<void>;
35
+ /**
36
+ * Initialize storage
37
+ */
38
+ export declare function initStore(userId: string): Promise<StoredData>;
39
+ /**
40
+ * Get storage location info
41
+ */
42
+ export declare function getStorageInfo(): Promise<{
43
+ type: 'icloud' | 'local';
44
+ path: string;
45
+ available: boolean;
46
+ }>;
47
+ //# sourceMappingURL=Store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../src/Store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAA;CACzB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CAcnE;AAoBD;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAa5D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAShE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAcnE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAC9C,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;CACnB,CAAC,CAOD"}
package/dist/Store.js ADDED
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Store - Data storage
3
+ *
4
+ * Handles iCloud and local storage
5
+ */
6
+ import { readFile, writeFile, mkdir } from 'fs/promises';
7
+ import { existsSync } from 'fs';
8
+ import { join, dirname } from 'path';
9
+ import { homedir } from 'os';
10
+ // iCloud path (macOS)
11
+ const ICLOUD_BASE = join(homedir(), 'Library', 'Mobile Documents', 'com~apple~CloudDocs');
12
+ // Local fallback path
13
+ const LOCAL_BASE = join(homedir(), '.vault');
14
+ // Data directory and file
15
+ const VAULT_DIR = '.vault-data';
16
+ const SECRETS_FILE = 'secrets.json';
17
+ /**
18
+ * Detect and get best storage location
19
+ */
20
+ export async function getStorageLocation() {
21
+ // Prefer iCloud
22
+ if (existsSync(ICLOUD_BASE)) {
23
+ return {
24
+ path: join(ICLOUD_BASE, VAULT_DIR),
25
+ type: 'icloud',
26
+ };
27
+ }
28
+ // Fallback to local
29
+ return {
30
+ path: join(LOCAL_BASE, VAULT_DIR),
31
+ type: 'local',
32
+ };
33
+ }
34
+ /**
35
+ * Get full data file path
36
+ */
37
+ async function getDataFilePath() {
38
+ const location = await getStorageLocation();
39
+ return join(location.path, SECRETS_FILE);
40
+ }
41
+ /**
42
+ * Ensure directory exists
43
+ */
44
+ async function ensureDir(filePath) {
45
+ const dir = dirname(filePath);
46
+ if (!existsSync(dir)) {
47
+ await mkdir(dir, { recursive: true, mode: 0o700 });
48
+ }
49
+ }
50
+ /**
51
+ * Read stored data
52
+ */
53
+ export async function readStore() {
54
+ try {
55
+ const filePath = await getDataFilePath();
56
+ if (!existsSync(filePath)) {
57
+ return null;
58
+ }
59
+ const content = await readFile(filePath, 'utf-8');
60
+ return JSON.parse(content);
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ /**
67
+ * Write stored data
68
+ */
69
+ export async function writeStore(data) {
70
+ const filePath = await getDataFilePath();
71
+ await ensureDir(filePath);
72
+ // Update timestamp
73
+ data.updated_at = new Date().toISOString();
74
+ const content = JSON.stringify(data, null, 2);
75
+ await writeFile(filePath, content, { mode: 0o600, encoding: 'utf-8' });
76
+ }
77
+ /**
78
+ * Initialize storage
79
+ */
80
+ export async function initStore(userId) {
81
+ const location = await getStorageLocation();
82
+ const data = {
83
+ version: '1.0',
84
+ user_id: userId,
85
+ created_at: new Date().toISOString(),
86
+ updated_at: new Date().toISOString(),
87
+ secrets: {},
88
+ };
89
+ await writeStore(data);
90
+ return data;
91
+ }
92
+ /**
93
+ * Get storage location info
94
+ */
95
+ export async function getStorageInfo() {
96
+ const location = await getStorageLocation();
97
+ return {
98
+ type: location.type,
99
+ path: location.path,
100
+ available: existsSync(location.path),
101
+ };
102
+ }
103
+ //# sourceMappingURL=Store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Store.js","sourceRoot":"","sources":["../src/Store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Vault CLI - Command line entry point
4
+ *
5
+ * Usage: vault <command> [args]
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
package/dist/index.js ADDED
@@ -0,0 +1,342 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Vault CLI - Command line entry point
4
+ *
5
+ * Usage: vault <command> [args]
6
+ */
7
+ import { deleteSecret, getSecret, getVaultStatus, initVault, listSecrets, resetVault, setSecret, } from './tools.js';
8
+ import { checkInitialized, confirm, error, info, password, question, runSetup, showStatusSummary, showWelcome, success, } from './CLI.js';
9
+ /**
10
+ * Show help
11
+ */
12
+ function showHelp() {
13
+ console.log(`
14
+ 🔐 Vault - AI-Powered Secret Management
15
+
16
+ Usage: vault <command> [args]
17
+
18
+ Commands:
19
+ (none) Interactive mode (default)
20
+ init Initialize Vault (guided setup)
21
+ get <key> Get a secret
22
+ set <key> [value] Set a secret (reads from stdin if no value)
23
+ list List all secrets
24
+ delete <key> Delete a secret
25
+ status Check Vault status
26
+ reset Reset Vault (⚠️ deletes all data)
27
+
28
+ Options:
29
+ -d, --description Secret description (for set command)
30
+
31
+ Examples:
32
+ vault # Interactive mode
33
+ vault init # Guided setup
34
+ vault set openai_key # Will prompt for value
35
+ vault get openai_key
36
+ vault list
37
+ `);
38
+ }
39
+ /**
40
+ * Handle init command
41
+ */
42
+ async function handleInit(username) {
43
+ // Check if already initialized
44
+ const isInitialized = await checkInitialized();
45
+ if (isInitialized) {
46
+ const reset = await confirm('Vault is already initialized. Do you want to reset and start over?');
47
+ if (!reset) {
48
+ info('Vault already set up. Use "vault status" to check.');
49
+ return;
50
+ }
51
+ const sure = await confirm('This will delete all your secrets. Are you sure?');
52
+ if (!sure) {
53
+ info('Cancelled.');
54
+ return;
55
+ }
56
+ await resetVault();
57
+ info('Vault has been reset.');
58
+ }
59
+ let setupUsername;
60
+ let setupPassphrase;
61
+ if (username) {
62
+ // Non-interactive mode (backward compatible)
63
+ console.log('Set a new passphrase (at least 8 characters)');
64
+ const passphrase1 = await password('Passphrase: ');
65
+ if (passphrase1.length < 8) {
66
+ error('Passphrase must be at least 8 characters');
67
+ process.exit(1);
68
+ }
69
+ const passphrase2 = await password('Confirm: ');
70
+ if (passphrase1 !== passphrase2) {
71
+ error('Passphrases do not match');
72
+ process.exit(1);
73
+ }
74
+ setupUsername = username;
75
+ setupPassphrase = passphrase1;
76
+ }
77
+ else {
78
+ // Interactive guided setup
79
+ const setup = await runSetup();
80
+ setupUsername = setup.username;
81
+ setupPassphrase = setup.passphrase;
82
+ }
83
+ const result = await initVault(setupUsername, setupPassphrase);
84
+ if (result.success) {
85
+ success('Vault initialized successfully!');
86
+ info(`Your secrets are stored in: ${result.storagePath}`);
87
+ info('Use "vault set <key>" to add your first secret.');
88
+ }
89
+ else {
90
+ error(result.message);
91
+ }
92
+ process.exit(result.success ? 0 : 1);
93
+ }
94
+ /**
95
+ * Handle get command
96
+ */
97
+ async function handleGet(key) {
98
+ const passphrase = await password('Passphrase: ');
99
+ const value = await getSecret(key, passphrase);
100
+ console.log(value);
101
+ }
102
+ /**
103
+ * Handle set command
104
+ */
105
+ async function handleSet(args) {
106
+ const key = args[0];
107
+ if (!key) {
108
+ error('Please provide a key name');
109
+ console.error('Usage: vault set <key> [value]');
110
+ console.error('Usage: echo "secret" | vault set <key>');
111
+ process.exit(1);
112
+ }
113
+ // Parse options
114
+ let value = args[1];
115
+ let description = '';
116
+ for (let i = 1; i < args.length; i++) {
117
+ if (args[i] === '-d' || args[i] === '--description') {
118
+ description = args[i + 1] || '';
119
+ i++;
120
+ }
121
+ }
122
+ // Check if value is piped from stdin
123
+ const stdin = process.stdin;
124
+ const isPiped = !stdin.isTTY;
125
+ if (isPiped) {
126
+ // Read from pipe
127
+ value = await new Promise((resolve) => {
128
+ let data = '';
129
+ stdin.on('data', (chunk) => {
130
+ data += chunk;
131
+ });
132
+ stdin.on('end', () => {
133
+ resolve(data.trim());
134
+ });
135
+ stdin.resume();
136
+ });
137
+ }
138
+ else if (!value) {
139
+ // No value provided, prompt for it
140
+ value = await question('Secret value: ');
141
+ }
142
+ const passphrase = await password('Passphrase: ');
143
+ const result = await setSecret(key, value, passphrase, description);
144
+ if (result.success) {
145
+ success(result.message);
146
+ }
147
+ else {
148
+ error(result.message);
149
+ }
150
+ process.exit(result.success ? 0 : 1);
151
+ }
152
+ /**
153
+ * Handle list command
154
+ */
155
+ async function handleList() {
156
+ const passphrase = await password('Passphrase: ');
157
+ const secrets = await listSecrets(passphrase);
158
+ if (secrets.length === 0) {
159
+ info('No secrets saved yet');
160
+ }
161
+ else {
162
+ console.log('');
163
+ console.log('📋 Saved secrets:');
164
+ console.log('══════════════════════════════════════════');
165
+ for (const { key, description } of secrets) {
166
+ const desc = description ? ` - ${description}` : '';
167
+ console.log(` ${key}${desc}`);
168
+ }
169
+ console.log('══════════════════════════════════════════');
170
+ console.log(` Total: ${secrets.length} secret(s)`);
171
+ }
172
+ }
173
+ /**
174
+ * Handle delete command
175
+ */
176
+ async function handleDelete(key) {
177
+ const sure = await confirm(`Delete secret "${key}"?`);
178
+ if (!sure) {
179
+ info('Cancelled.');
180
+ process.exit(0);
181
+ }
182
+ const passphrase = await password('Passphrase: ');
183
+ const result = await deleteSecret(key, passphrase);
184
+ if (result.success) {
185
+ success(result.message);
186
+ }
187
+ else {
188
+ error(result.message);
189
+ }
190
+ process.exit(result.success ? 0 : 1);
191
+ }
192
+ /**
193
+ * Handle status command
194
+ */
195
+ async function handleStatus() {
196
+ const status = await getVaultStatus();
197
+ showStatusSummary(status);
198
+ }
199
+ /**
200
+ * Handle reset command
201
+ */
202
+ async function handleReset() {
203
+ const sure = await confirm('This will delete ALL your secrets. This action cannot be undone. Continue?');
204
+ if (!sure) {
205
+ info('Cancelled.');
206
+ return;
207
+ }
208
+ const reallySure = await confirm('Are you REALLY sure? Type "yes" to confirm: ');
209
+ if (reallySure) {
210
+ const result = await resetVault();
211
+ if (result.success) {
212
+ success('Vault has been reset. Run "vault init" to set up again.');
213
+ }
214
+ else {
215
+ error(result.message);
216
+ }
217
+ }
218
+ else {
219
+ info('Cancelled.');
220
+ }
221
+ }
222
+ /**
223
+ * Handle interactive mode (no command)
224
+ */
225
+ async function handleInteractive() {
226
+ showWelcome();
227
+ // Check if initialized
228
+ const isInitialized = await checkInitialized();
229
+ if (!isInitialized) {
230
+ // First time setup
231
+ info('First time setup detected.');
232
+ console.log('');
233
+ await handleInit();
234
+ return;
235
+ }
236
+ // Show status and offer options
237
+ const status = await getVaultStatus();
238
+ showStatusSummary(status);
239
+ console.log(`
240
+ What would you like to do?
241
+ 1. Add a new secret
242
+ 2. View a secret
243
+ 3. List all secrets
244
+ 4. Delete a secret
245
+ 5. Show status
246
+ 0. Exit
247
+ `);
248
+ const choice = await question('Choose [1-5, 0]: ');
249
+ switch (choice.trim()) {
250
+ case '1': {
251
+ const key = await question('Key name: ');
252
+ await handleSet([key]);
253
+ break;
254
+ }
255
+ case '2': {
256
+ const key = await question('Key name: ');
257
+ await handleGet(key);
258
+ break;
259
+ }
260
+ case '3':
261
+ await handleList();
262
+ break;
263
+ case '4': {
264
+ const key = await question('Key to delete: ');
265
+ await handleDelete(key);
266
+ break;
267
+ }
268
+ case '5':
269
+ await handleStatus();
270
+ break;
271
+ case '0':
272
+ info('Goodbye!');
273
+ break;
274
+ default:
275
+ info('Invalid choice.');
276
+ }
277
+ }
278
+ /**
279
+ * Main function
280
+ */
281
+ async function main() {
282
+ const args = process.argv.slice(2);
283
+ // Show help
284
+ if (args.length === 0 || args[0] === '-h' || args[0] === '--help') {
285
+ showHelp();
286
+ process.exit(0);
287
+ }
288
+ const command = args[0];
289
+ try {
290
+ switch (command) {
291
+ case 'init':
292
+ await handleInit(args[1]); // Optional username parameter
293
+ break;
294
+ case 'get':
295
+ if (!args[1]) {
296
+ error('Please provide a key name');
297
+ console.error('Usage: vault get <key>');
298
+ process.exit(1);
299
+ }
300
+ await handleGet(args[1]);
301
+ break;
302
+ case 'set':
303
+ await handleSet(args.slice(1));
304
+ break;
305
+ case 'list':
306
+ await handleList();
307
+ break;
308
+ case 'delete':
309
+ if (!args[1]) {
310
+ error('Please provide a key name');
311
+ console.error('Usage: vault delete <key>');
312
+ process.exit(1);
313
+ }
314
+ await handleDelete(args[1]);
315
+ break;
316
+ case 'status':
317
+ await handleStatus();
318
+ break;
319
+ case 'reset':
320
+ await handleReset();
321
+ break;
322
+ default:
323
+ // Maybe they typed "vault openai_key" instead of "vault get openai_key"?
324
+ // Try to be helpful
325
+ error(`Unknown command: ${command}`);
326
+ console.error('');
327
+ console.error('Did you mean:');
328
+ console.error(` vault get ${command}`);
329
+ console.error('');
330
+ console.error('Run "vault --help" for usage');
331
+ process.exit(1);
332
+ }
333
+ }
334
+ catch (err) {
335
+ const message = err instanceof Error ? err.message : String(err);
336
+ error(message);
337
+ process.exit(1);
338
+ }
339
+ }
340
+ // Run
341
+ main();
342
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}