@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.
- package/README.md +117 -0
- package/SKILL.md +117 -0
- package/dist/CLI.d.ts +58 -0
- package/dist/CLI.d.ts.map +1 -0
- package/dist/CLI.js +180 -0
- package/dist/CLI.js.map +1 -0
- package/dist/Crypto.d.ts +43 -0
- package/dist/Crypto.d.ts.map +1 -0
- package/dist/Crypto.js +136 -0
- package/dist/Crypto.js.map +1 -0
- package/dist/Keychain.d.ts +30 -0
- package/dist/Keychain.d.ts.map +1 -0
- package/dist/Keychain.js +53 -0
- package/dist/Keychain.js.map +1 -0
- package/dist/Store.d.ts +47 -0
- package/dist/Store.d.ts.map +1 -0
- package/dist/Store.js +103 -0
- package/dist/Store.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +342 -0
- package/dist/index.js.map +1 -0
- package/dist/tools.d.ts +65 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +252 -0
- package/dist/tools.js.map +1 -0
- package/package.json +62 -0
|
@@ -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"}
|
package/dist/Keychain.js
ADDED
|
@@ -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"}
|
package/dist/Store.d.ts
ADDED
|
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAE5B,sBAAsB;AACtB,MAAM,WAAW,GAAG,IAAI,CACtB,OAAO,EAAE,EACT,SAAS,EACT,kBAAkB,EAClB,qBAAqB,CACtB,CAAA;AAED,sBAAsB;AACtB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAA;AAE5C,0BAA0B;AAC1B,MAAM,SAAS,GAAG,aAAa,CAAA;AAC/B,MAAM,YAAY,GAAG,cAAc,CAAA;AAsBnC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,gBAAgB;IAChB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;YAClC,IAAI,EAAE,QAAQ;SACf,CAAA;IACH,CAAC;IAED,oBAAoB;IACpB,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;QACjC,IAAI,EAAE,OAAO;KACd,CAAA;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe;IAC5B,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAA;IAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;AAC1C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,QAAgB;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACpD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAA;QAExC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAgB;IAC/C,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAA;IACxC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAA;IAEzB,mBAAmB;IACnB,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAE1C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAC7C,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAA;IAE3C,MAAM,IAAI,GAAe;QACvB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,OAAO,EAAE,EAAE;KACZ,CAAA;IAED,MAAM,UAAU,CAAC,IAAI,CAAC,CAAA;IAEtB,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAKlC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAA;IAC3C,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;KACrC,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|