@etree/cli 2.0.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.
Files changed (60) hide show
  1. package/README.md +199 -0
  2. package/dist/commands/auth.d.ts +2 -0
  3. package/dist/commands/auth.js +220 -0
  4. package/dist/commands/auth.js.map +1 -0
  5. package/dist/commands/config.d.ts +2 -0
  6. package/dist/commands/config.js +42 -0
  7. package/dist/commands/config.js.map +1 -0
  8. package/dist/commands/init.d.ts +2 -0
  9. package/dist/commands/init.js +159 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/member.d.ts +2 -0
  12. package/dist/commands/member.js +119 -0
  13. package/dist/commands/member.js.map +1 -0
  14. package/dist/commands/secret.d.ts +13 -0
  15. package/dist/commands/secret.js +307 -0
  16. package/dist/commands/secret.js.map +1 -0
  17. package/dist/commands/shortcuts.d.ts +7 -0
  18. package/dist/commands/shortcuts.js +26 -0
  19. package/dist/commands/shortcuts.js.map +1 -0
  20. package/dist/commands/wallet.d.ts +2 -0
  21. package/dist/commands/wallet.js +88 -0
  22. package/dist/commands/wallet.js.map +1 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.js +43 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/lib/api.d.ts +15 -0
  27. package/dist/lib/api.js +40 -0
  28. package/dist/lib/api.js.map +1 -0
  29. package/dist/lib/config.d.ts +17 -0
  30. package/dist/lib/config.js +91 -0
  31. package/dist/lib/config.js.map +1 -0
  32. package/dist/lib/crypto.d.ts +23 -0
  33. package/dist/lib/crypto.js +173 -0
  34. package/dist/lib/crypto.js.map +1 -0
  35. package/dist/lib/env-manager.d.ts +11 -0
  36. package/dist/lib/env-manager.js +88 -0
  37. package/dist/lib/env-manager.js.map +1 -0
  38. package/dist/lib/key-store.d.ts +16 -0
  39. package/dist/lib/key-store.js +83 -0
  40. package/dist/lib/key-store.js.map +1 -0
  41. package/dist/test-e2e.d.ts +1 -0
  42. package/dist/test-e2e.js +84 -0
  43. package/dist/test-e2e.js.map +1 -0
  44. package/eslint.config.mjs +4 -0
  45. package/package.json +30 -0
  46. package/src/commands/auth.ts +258 -0
  47. package/src/commands/config.ts +47 -0
  48. package/src/commands/init.ts +187 -0
  49. package/src/commands/member.ts +146 -0
  50. package/src/commands/secret.ts +381 -0
  51. package/src/commands/shortcuts.ts +25 -0
  52. package/src/commands/wallet.ts +97 -0
  53. package/src/index.ts +50 -0
  54. package/src/lib/api.ts +57 -0
  55. package/src/lib/config.ts +70 -0
  56. package/src/lib/crypto.ts +173 -0
  57. package/src/lib/env-manager.ts +60 -0
  58. package/src/lib/key-store.ts +51 -0
  59. package/src/test-e2e.ts +106 -0
  60. package/tsconfig.json +18 -0
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerMemberCommands = registerMemberCommands;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const api_1 = require("../lib/api");
10
+ /**
11
+ * Helper: find a wallet ID by name from the user's wallets.
12
+ */
13
+ async function findWalletId(name) {
14
+ const result = await api_1.api.get("/wallets");
15
+ const owned = result.owned.find((w) => w.name === name);
16
+ if (owned)
17
+ return owned.id;
18
+ const shared = result.shared.find((w) => w.name === name);
19
+ if (shared)
20
+ return shared.id;
21
+ return null;
22
+ }
23
+ function registerMemberCommands(program) {
24
+ const member = program.command("member").description("Manage wallet members");
25
+ // ── member add ──
26
+ member
27
+ .command("add <wallet> <username>")
28
+ .description("Add a member to a wallet")
29
+ .option("-r, --role <role>", "Role: admin, read, write", "read")
30
+ .action(async (walletName, username, opts) => {
31
+ const spinner = (0, ora_1.default)("Adding member...").start();
32
+ try {
33
+ const walletId = await findWalletId(walletName);
34
+ if (!walletId) {
35
+ spinner.fail(chalk_1.default.red(`Wallet "${walletName}" not found`));
36
+ return;
37
+ }
38
+ const result = await api_1.api.post(`/wallets/${walletId}/members`, {
39
+ username,
40
+ role: opts.role,
41
+ });
42
+ spinner.succeed(chalk_1.default.green(`Added "${username}" as ${opts.role} to "${walletName}"`));
43
+ if (result.public_key) {
44
+ console.log(chalk_1.default.dim(` Their public key: ${result.public_key.substring(0, 20)}...`));
45
+ console.log(chalk_1.default.yellow(" ⚠ Remember to re-encrypt secrets for this user:"));
46
+ console.log(chalk_1.default.yellow(` envtree secret share ${walletName}`));
47
+ }
48
+ }
49
+ catch (err) {
50
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
51
+ }
52
+ });
53
+ // ── member list ──
54
+ member
55
+ .command("list <wallet>")
56
+ .alias("ls")
57
+ .description("List members of a wallet")
58
+ .action(async (walletName) => {
59
+ const spinner = (0, ora_1.default)("Fetching members...").start();
60
+ try {
61
+ const walletId = await findWalletId(walletName);
62
+ if (!walletId) {
63
+ spinner.fail(chalk_1.default.red(`Wallet "${walletName}" not found`));
64
+ return;
65
+ }
66
+ const result = await api_1.api.get(`/wallets/${walletId}/members`);
67
+ spinner.stop();
68
+ console.log(chalk_1.default.bold(`\nMembers of "${walletName}"`));
69
+ // Owner
70
+ if (result.owner) {
71
+ console.log(` ${chalk_1.default.cyan(result.owner.username)} ${chalk_1.default.dim(`(${result.owner.email})`)} ${chalk_1.default.green("[owner]")}`);
72
+ }
73
+ // Members
74
+ if (result.members && result.members.length > 0) {
75
+ for (const m of result.members) {
76
+ const roleColor = m.role === "admin"
77
+ ? chalk_1.default.magenta
78
+ : m.role === "write"
79
+ ? chalk_1.default.blue
80
+ : chalk_1.default.dim;
81
+ console.log(` ${chalk_1.default.cyan(m.user.username)} ${chalk_1.default.dim(`(${m.user.email})`)} ${roleColor(`[${m.role}]`)}`);
82
+ }
83
+ }
84
+ else {
85
+ console.log(chalk_1.default.dim(" No additional members"));
86
+ }
87
+ console.log("");
88
+ }
89
+ catch (err) {
90
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
91
+ }
92
+ });
93
+ // ── member remove ──
94
+ member
95
+ .command("remove <wallet> <username>")
96
+ .description("Remove a member from a wallet")
97
+ .action(async (walletName, username) => {
98
+ const spinner = (0, ora_1.default)("Removing member...").start();
99
+ try {
100
+ const walletId = await findWalletId(walletName);
101
+ if (!walletId) {
102
+ spinner.fail(chalk_1.default.red(`Wallet "${walletName}" not found`));
103
+ return;
104
+ }
105
+ // Look up user ID by username
106
+ const profileResult = await api_1.api.get(`/profile/${username}`);
107
+ if (!profileResult.profile) {
108
+ spinner.fail(chalk_1.default.red(`User "${username}" not found`));
109
+ return;
110
+ }
111
+ await api_1.api.delete(`/wallets/${walletId}/members/${profileResult.profile.id}`);
112
+ spinner.succeed(chalk_1.default.green(`Removed "${username}" from "${walletName}"`));
113
+ }
114
+ catch (err) {
115
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
116
+ }
117
+ });
118
+ }
119
+ //# sourceMappingURL=member.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"member.js","sourceRoot":"","sources":["../../src/commands/member.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Shared logic for pushing a secret (used by `secret set` and top-level `push`).
4
+ */
5
+ export declare function pushSecret(walletName: string, keyName: string, value: string): Promise<void>;
6
+ /**
7
+ * Shared logic for pulling secrets (used by `secret pull` and top-level `pull`).
8
+ */
9
+ export declare function pullSecrets(walletName: string, opts: {
10
+ output?: string;
11
+ sync?: boolean;
12
+ }): Promise<void>;
13
+ export declare function registerSecretCommands(program: Command): void;
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.pushSecret = pushSecret;
7
+ exports.pullSecrets = pullSecrets;
8
+ exports.registerSecretCommands = registerSecretCommands;
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const ora_1 = __importDefault(require("ora"));
11
+ const api_1 = require("../lib/api");
12
+ const crypto_1 = require("../lib/crypto");
13
+ const key_store_1 = require("../lib/key-store");
14
+ const env_manager_1 = require("../lib/env-manager");
15
+ /**
16
+ * Helper: find a wallet ID by name.
17
+ */
18
+ async function findWalletId(name) {
19
+ const result = await api_1.api.get("/wallets");
20
+ const owned = result.owned.find((w) => w.name === name);
21
+ if (owned)
22
+ return owned.id;
23
+ const shared = result.shared.find((w) => w.name === name);
24
+ if (shared)
25
+ return shared.id;
26
+ return null;
27
+ }
28
+ /**
29
+ * Get all public keys of wallet members (owner + members).
30
+ */
31
+ async function getWalletPublicKeys(walletId) {
32
+ const result = await api_1.api.get(`/wallets/${walletId}/members`);
33
+ const keys = [];
34
+ if (result.owner?.public_key) {
35
+ keys.push(result.owner.public_key);
36
+ }
37
+ if (result.members) {
38
+ for (const m of result.members) {
39
+ if (m.user?.public_key) {
40
+ keys.push(m.user.public_key);
41
+ }
42
+ }
43
+ }
44
+ return keys;
45
+ }
46
+ /**
47
+ * Shared logic for pushing a secret (used by `secret set` and top-level `push`).
48
+ */
49
+ async function pushSecret(walletName, keyName, value) {
50
+ const spinner = (0, ora_1.default)("Encrypting and saving secret...").start();
51
+ try {
52
+ const walletId = await findWalletId(walletName);
53
+ if (!walletId) {
54
+ spinner.fail(chalk_1.default.red(`Wallet "${walletName}" not found`));
55
+ return;
56
+ }
57
+ spinner.text = "Fetching member public keys...";
58
+ const publicKeys = await getWalletPublicKeys(walletId);
59
+ if (publicKeys.length === 0) {
60
+ spinner.fail(chalk_1.default.red("No members with public keys found"));
61
+ return;
62
+ }
63
+ spinner.text = `Encrypting for ${publicKeys.length} member(s)...`;
64
+ const secrets = [];
65
+ for (const pk of publicKeys) {
66
+ const ciphertext = await (0, crypto_1.encrypt)(value, pk);
67
+ secrets.push({
68
+ key_name: keyName,
69
+ encrypted_value: ciphertext,
70
+ encrypted_for: pk,
71
+ });
72
+ }
73
+ spinner.text = "Uploading encrypted secrets...";
74
+ await api_1.api.post(`/wallets/${walletId}/secrets`, { secrets });
75
+ spinner.succeed(chalk_1.default.green(`Secret "${keyName}" saved (encrypted for ${publicKeys.length} member(s))`));
76
+ }
77
+ catch (err) {
78
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
79
+ }
80
+ finally {
81
+ (0, crypto_1.shutdown)();
82
+ }
83
+ }
84
+ /**
85
+ * Shared logic for pulling secrets (used by `secret pull` and top-level `pull`).
86
+ */
87
+ async function pullSecrets(walletName, opts) {
88
+ const privateKey = (0, key_store_1.requirePrivateKey)();
89
+ const spinner = (0, ora_1.default)("Pulling secrets...").start();
90
+ try {
91
+ const walletId = await findWalletId(walletName);
92
+ if (!walletId) {
93
+ spinner.fail(chalk_1.default.red(`Wallet "${walletName}" not found`));
94
+ return;
95
+ }
96
+ const result = await api_1.api.get(`/wallets/${walletId}/secrets`);
97
+ if (result.secrets.length === 0) {
98
+ spinner.warn(chalk_1.default.yellow(`No secrets found in wallet "${walletName}"`));
99
+ return;
100
+ }
101
+ spinner.text = `Decrypting ${result.secrets.length} secret(s)...`;
102
+ const lines = [];
103
+ lines.push(`# EnvTree — ${walletName}`);
104
+ lines.push(`# Generated at ${new Date().toISOString()}`);
105
+ lines.push("");
106
+ const decrypted = [];
107
+ for (const secret of result.secrets) {
108
+ try {
109
+ const plaintext = await (0, crypto_1.decrypt)(secret.encrypted_value, privateKey);
110
+ lines.push(`${secret.key_name}=${plaintext}`);
111
+ decrypted.push({ key: secret.key_name, value: plaintext });
112
+ }
113
+ catch {
114
+ lines.push(`# FAILED TO DECRYPT: ${secret.key_name}`);
115
+ }
116
+ }
117
+ const outputStr = lines.join("\n") + "\n";
118
+ if (opts.sync) {
119
+ // Sync directly into the local .env
120
+ spinner.text = "Syncing secrets to .env...";
121
+ for (const { key, value } of decrypted) {
122
+ (0, env_manager_1.updateEnvFile)(key, value);
123
+ }
124
+ (0, env_manager_1.ensureGitIgnore)(".env");
125
+ spinner.succeed(chalk_1.default.green(`${decrypted.length} secret(s) synced to .env`));
126
+ }
127
+ else if (opts.output) {
128
+ const fs = require("fs");
129
+ fs.writeFileSync(opts.output, outputStr);
130
+ spinner.succeed(chalk_1.default.green(`${result.secrets.length} secret(s) written to ${opts.output}`));
131
+ }
132
+ else {
133
+ spinner.stop();
134
+ console.log(outputStr);
135
+ }
136
+ }
137
+ catch (err) {
138
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
139
+ }
140
+ finally {
141
+ (0, crypto_1.shutdown)();
142
+ }
143
+ }
144
+ function registerSecretCommands(program) {
145
+ const secret = program
146
+ .command("secret")
147
+ .description("Manage encrypted secrets");
148
+ // ── secret set ──
149
+ secret
150
+ .command("set <wallet> <key> <value>")
151
+ .description("Encrypt & store a secret for all wallet members")
152
+ .action(pushSecret);
153
+ // ── secret update ──
154
+ secret
155
+ .command("update <wallet> <key> <value>")
156
+ .description("Update an existing secret's value (re-encrypts for all members)")
157
+ .action(pushSecret);
158
+ // ── secret get ──
159
+ secret
160
+ .command("get <wallet> <key>")
161
+ .description("Decrypt and display a specific secret")
162
+ .option("-s, --save", "Save the value to your local .env file")
163
+ .action(async (walletName, keyName, opts) => {
164
+ const privateKey = (0, key_store_1.requirePrivateKey)();
165
+ const spinner = (0, ora_1.default)("Fetching and decrypting...").start();
166
+ try {
167
+ const walletId = await findWalletId(walletName);
168
+ if (!walletId) {
169
+ spinner.fail(chalk_1.default.red(`Wallet "${walletName}" not found`));
170
+ return;
171
+ }
172
+ const result = await api_1.api.get(`/wallets/${walletId}/secrets`);
173
+ const secret = result.secrets.find((s) => s.key_name === keyName);
174
+ if (!secret) {
175
+ spinner.fail(chalk_1.default.red(`Secret "${keyName}" not found in wallet "${walletName}"`));
176
+ return;
177
+ }
178
+ spinner.text = "Decrypting...";
179
+ const plaintext = await (0, crypto_1.decrypt)(secret.encrypted_value, privateKey);
180
+ if (opts.save) {
181
+ spinner.text = "Saving to .env...";
182
+ (0, env_manager_1.updateEnvFile)(keyName, plaintext);
183
+ (0, env_manager_1.ensureGitIgnore)(".env");
184
+ spinner.succeed(chalk_1.default.green(`Secret "${keyName}" saved to .env`));
185
+ }
186
+ else {
187
+ spinner.stop();
188
+ console.log(`${chalk_1.default.cyan(keyName)}=${plaintext}`);
189
+ }
190
+ }
191
+ catch (err) {
192
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
193
+ }
194
+ finally {
195
+ (0, crypto_1.shutdown)();
196
+ }
197
+ });
198
+ // ── secret list ──
199
+ secret
200
+ .command("list <wallet>")
201
+ .alias("ls")
202
+ .description("List all secret keys in a wallet")
203
+ .action(async (walletName) => {
204
+ const spinner = (0, ora_1.default)("Fetching secrets...").start();
205
+ try {
206
+ const walletId = await findWalletId(walletName);
207
+ if (!walletId) {
208
+ spinner.fail(chalk_1.default.red(`Wallet "${walletName}" not found`));
209
+ return;
210
+ }
211
+ const result = await api_1.api.get(`/wallets/${walletId}/secrets/all`);
212
+ spinner.stop();
213
+ if (result.keys.length === 0) {
214
+ console.log(chalk_1.default.yellow(`No secrets in wallet "${walletName}"`));
215
+ return;
216
+ }
217
+ console.log(chalk_1.default.bold(`\nSecrets in "${walletName}"`));
218
+ for (const key of result.keys) {
219
+ console.log(` ${chalk_1.default.cyan(key)}`);
220
+ }
221
+ console.log(chalk_1.default.dim(`\n ${result.keys.length} secret(s) total\n`));
222
+ }
223
+ catch (err) {
224
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
225
+ }
226
+ });
227
+ // ── secret pull ──
228
+ secret
229
+ .command("pull <wallet>")
230
+ .description("Pull and decrypt all secrets")
231
+ .option("-o, --output <file>", "Write to a file instead of stdout")
232
+ .option("--sync", "Sync all secrets directly to your local .env")
233
+ .action(async (walletName, opts) => {
234
+ await pullSecrets(walletName, opts);
235
+ });
236
+ // ── secret delete ──
237
+ secret
238
+ .command("delete <wallet> <key>")
239
+ .alias("rm")
240
+ .description("Delete a secret from a wallet")
241
+ .action(async (walletName, keyName) => {
242
+ const spinner = (0, ora_1.default)("Deleting secret...").start();
243
+ try {
244
+ const walletId = await findWalletId(walletName);
245
+ if (!walletId) {
246
+ spinner.fail(chalk_1.default.red(`Wallet "${walletName}" not found`));
247
+ return;
248
+ }
249
+ const result = await api_1.api.get(`/wallets/${walletId}/secrets`);
250
+ const secret = result.secrets.find((s) => s.key_name === keyName);
251
+ if (!secret) {
252
+ spinner.fail(chalk_1.default.red(`Secret "${keyName}" not found`));
253
+ return;
254
+ }
255
+ await api_1.api.delete(`/wallets/${walletId}/secrets/${secret.id}`);
256
+ spinner.succeed(chalk_1.default.green(`Secret "${keyName}" deleted from "${walletName}"`));
257
+ }
258
+ catch (err) {
259
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
260
+ }
261
+ });
262
+ // ── secret share ──
263
+ secret
264
+ .command("share <wallet>")
265
+ .description("Re-encrypt all secrets for all current wallet members")
266
+ .action(async (walletName) => {
267
+ const privateKey = (0, key_store_1.requirePrivateKey)();
268
+ const spinner = (0, ora_1.default)("Re-encrypting secrets for all members...").start();
269
+ try {
270
+ const walletId = await findWalletId(walletName);
271
+ if (!walletId) {
272
+ spinner.fail(chalk_1.default.red(`Wallet "${walletName}" not found`));
273
+ return;
274
+ }
275
+ const mySecrets = await api_1.api.get(`/wallets/${walletId}/secrets`);
276
+ if (mySecrets.secrets.length === 0) {
277
+ spinner.warn(chalk_1.default.yellow("No secrets to share"));
278
+ return;
279
+ }
280
+ const publicKeys = await getWalletPublicKeys(walletId);
281
+ spinner.text = `Re-encrypting ${mySecrets.secrets.length} secret(s) for ${publicKeys.length} member(s)...`;
282
+ const allSecrets = [];
283
+ for (const secret of mySecrets.secrets) {
284
+ const plaintext = await (0, crypto_1.decrypt)(secret.encrypted_value, privateKey);
285
+ for (const pk of publicKeys) {
286
+ const ciphertext = await (0, crypto_1.encrypt)(plaintext, pk);
287
+ allSecrets.push({
288
+ key_name: secret.key_name,
289
+ encrypted_value: ciphertext,
290
+ encrypted_for: pk,
291
+ });
292
+ }
293
+ }
294
+ await api_1.api.post(`/wallets/${walletId}/secrets`, {
295
+ secrets: allSecrets,
296
+ });
297
+ spinner.succeed(chalk_1.default.green(`${mySecrets.secrets.length} secret(s) re-encrypted for ${publicKeys.length} member(s)`));
298
+ }
299
+ catch (err) {
300
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
301
+ }
302
+ finally {
303
+ (0, crypto_1.shutdown)();
304
+ }
305
+ });
306
+ }
307
+ //# sourceMappingURL=secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret.js","sourceRoot":"","sources":["../../src/commands/secret.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Register top-level shortcut commands:
4
+ * et push <wallet> <key> <value> → secret set
5
+ * et pull <wallet> → secret pull --sync
6
+ */
7
+ export declare function registerShortcuts(program: Command): void;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerShortcuts = registerShortcuts;
4
+ const secret_1 = require("./secret");
5
+ /**
6
+ * Register top-level shortcut commands:
7
+ * et push <wallet> <key> <value> → secret set
8
+ * et pull <wallet> → secret pull --sync
9
+ */
10
+ function registerShortcuts(program) {
11
+ // ── et push ──
12
+ program
13
+ .command("push <wallet> <key> <value>")
14
+ .description("Shortcut: Encrypt & store a secret (same as: secret set)")
15
+ .action(secret_1.pushSecret);
16
+ // ── et pull ──
17
+ program
18
+ .command("pull <wallet>")
19
+ .description("Shortcut: Sync all secrets to local .env (same as: secret pull --sync)")
20
+ .option("-o, --output <file>", "Write to a file instead of syncing to .env")
21
+ .action(async (walletName, opts) => {
22
+ // Default behavior: --sync (write to .env)
23
+ await (0, secret_1.pullSecrets)(walletName, { sync: !opts.output, output: opts.output });
24
+ });
25
+ }
26
+ //# sourceMappingURL=shortcuts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../../src/commands/shortcuts.ts"],"names":[],"mappings":";;AAQA,8CAgBC;AAvBD,qCAAmD;AAEnD;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,OAAgB;IAChD,gBAAgB;IAChB,OAAO;SACJ,OAAO,CAAC,6BAA6B,CAAC;SACtC,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,mBAAU,CAAC,CAAC;IAEtB,gBAAgB;IAChB,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,wEAAwE,CAAC;SACrF,MAAM,CAAC,qBAAqB,EAAE,4CAA4C,CAAC;SAC3E,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,IAAyB,EAAE,EAAE;QAC9D,2CAA2C;QAC3C,MAAM,IAAA,oBAAW,EAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerWalletCommands(program: Command): void;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerWalletCommands = registerWalletCommands;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const api_1 = require("../lib/api");
10
+ function registerWalletCommands(program) {
11
+ const wallet = program.command("wallet").description("Manage key wallets");
12
+ // ── wallet create ──
13
+ wallet
14
+ .command("create <name>")
15
+ .description("Create a new key wallet")
16
+ .option("-d, --description <desc>", "Wallet description")
17
+ .action(async (name, opts) => {
18
+ const spinner = (0, ora_1.default)("Creating wallet...").start();
19
+ try {
20
+ const result = await api_1.api.post("/wallets", {
21
+ name,
22
+ description: opts.description,
23
+ });
24
+ spinner.succeed(chalk_1.default.green(`Wallet "${name}" created`));
25
+ console.log(chalk_1.default.dim(` ID: ${result.wallet.id}`));
26
+ }
27
+ catch (err) {
28
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
29
+ }
30
+ });
31
+ // ── wallet list ──
32
+ wallet
33
+ .command("list")
34
+ .alias("ls")
35
+ .description("List all your wallets")
36
+ .action(async () => {
37
+ const spinner = (0, ora_1.default)("Fetching wallets...").start();
38
+ try {
39
+ const result = await api_1.api.get("/wallets");
40
+ spinner.stop();
41
+ if (result.owned.length === 0 && result.shared.length === 0) {
42
+ console.log(chalk_1.default.yellow("No wallets found. Create one with: envtree wallet create <name>"));
43
+ return;
44
+ }
45
+ if (result.owned.length > 0) {
46
+ console.log(chalk_1.default.bold("\nOwned Wallets"));
47
+ for (const w of result.owned) {
48
+ console.log(` ${chalk_1.default.cyan(w.name)} ${chalk_1.default.dim(`(${w.id.substring(0, 8)}...)`)}`);
49
+ if (w.description)
50
+ console.log(` ${chalk_1.default.dim(w.description)}`);
51
+ }
52
+ }
53
+ if (result.shared.length > 0) {
54
+ console.log(chalk_1.default.bold("\nShared Wallets"));
55
+ for (const w of result.shared) {
56
+ console.log(` ${chalk_1.default.cyan(w.name)} ${chalk_1.default.dim(`[${w.role}]`)} ${chalk_1.default.dim(`(${w.id?.substring(0, 8)}...)`)}`);
57
+ }
58
+ }
59
+ console.log("");
60
+ }
61
+ catch (err) {
62
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
63
+ }
64
+ });
65
+ // ── wallet delete ──
66
+ wallet
67
+ .command("delete <name>")
68
+ .description("Delete a wallet (owner only)")
69
+ .action(async (name) => {
70
+ const spinner = (0, ora_1.default)("Finding wallet...").start();
71
+ try {
72
+ // Find wallet by name
73
+ const listResult = await api_1.api.get("/wallets");
74
+ const target = listResult.owned.find((w) => w.name === name);
75
+ if (!target) {
76
+ spinner.fail(chalk_1.default.red(`Wallet "${name}" not found or you are not the owner`));
77
+ return;
78
+ }
79
+ spinner.text = "Deleting wallet...";
80
+ await api_1.api.delete(`/wallets/${target.id}`);
81
+ spinner.succeed(chalk_1.default.green(`Wallet "${name}" deleted`));
82
+ }
83
+ catch (err) {
84
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
85
+ }
86
+ });
87
+ }
88
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const auth_1 = require("./commands/auth");
6
+ const wallet_1 = require("./commands/wallet");
7
+ const member_1 = require("./commands/member");
8
+ const secret_1 = require("./commands/secret");
9
+ const init_1 = require("./commands/init");
10
+ const config_1 = require("./commands/config");
11
+ const shortcuts_1 = require("./commands/shortcuts");
12
+ const program = new commander_1.Command();
13
+ program
14
+ .name("et")
15
+ .description("EnvTree — Securely manage and share environment variables")
16
+ .version("1.0.0")
17
+ .addHelpText("after", `
18
+ Quick Start:
19
+ $ et init First-time setup (signup/login)
20
+ $ et push <wallet> <key> <value> Encrypt & store a secret
21
+ $ et pull <wallet> Sync all secrets to local .env
22
+ $ et whoami Check current user
23
+
24
+ Examples:
25
+ $ et init
26
+ $ et push production DB_URL "postgres://..."
27
+ $ et pull production
28
+ $ et pull production -o .env.production
29
+ $ et secret list production
30
+ $ et member add production alice --role write
31
+ `);
32
+ // Core commands
33
+ (0, auth_1.registerAuthCommands)(program);
34
+ (0, init_1.registerInitCommand)(program);
35
+ (0, config_1.registerConfigCommands)(program);
36
+ // Resource commands
37
+ (0, wallet_1.registerWalletCommands)(program);
38
+ (0, member_1.registerMemberCommands)(program);
39
+ (0, secret_1.registerSecretCommands)(program);
40
+ // Top-level shortcuts
41
+ (0, shortcuts_1.registerShortcuts)(program);
42
+ program.parse(process.argv);
43
+ //# sourceMappingURL=index.js.map