@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
package/README.md ADDED
@@ -0,0 +1,199 @@
1
+ # 🌲 EnvTree CLI
2
+
3
+ Securely manage, encrypt, and share environment variables across teams — from the command line.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # 1. First-time setup
9
+ et init
10
+
11
+ # 2. Create a wallet (a group of secrets)
12
+ et wallet create my-project
13
+
14
+ # 3. Store a secret
15
+ et push my-project DATABASE_URL "postgres://user:pass@host/db"
16
+
17
+ # 4. Sync all secrets to your local .env
18
+ et pull my-project
19
+ ```
20
+
21
+ That's it. Your secrets are **end-to-end encrypted** — the server never sees the plaintext.
22
+
23
+ ---
24
+
25
+ ## Installation
26
+
27
+ ```bash
28
+ # From the monorepo
29
+ cd apps/cli
30
+ pnpm build
31
+ pnpm link --global
32
+
33
+ # Now you can use:
34
+ et --help
35
+ ```
36
+
37
+ > Both `et` and `envtree` work as command names.
38
+
39
+ ---
40
+
41
+ ## Command Reference
42
+
43
+ ### Getting Started
44
+
45
+ | Command | Description |
46
+ | ------------------------------------ | ---------------------------------------------- |
47
+ | `et init` | Guided setup wizard (create account or log in) |
48
+ | `et signup` | Create a new account |
49
+ | `et login` | Log in (interactive) |
50
+ | `et login -e user@email.com -p pass` | Log in (non-interactive, for CI) |
51
+ | `et logout` | Log out |
52
+ | `et whoami` | Show current user info |
53
+ | `et delete-account` | Permanently delete your account |
54
+
55
+ ### Secrets (Shortcuts)
56
+
57
+ | Command | Description |
58
+ | -------------------------------- | -------------------------------- |
59
+ | `et push <wallet> <key> <value>` | Encrypt & store a secret |
60
+ | `et pull <wallet>` | Sync all secrets to local `.env` |
61
+ | `et pull <wallet> -o .env.prod` | Write secrets to a specific file |
62
+
63
+ ### Secret Management
64
+
65
+ | Command | Description |
66
+ | ----------------------------------------- | -------------------------------------- |
67
+ | `et secret set <wallet> <key> <value>` | Same as `et push` |
68
+ | `et secret update <wallet> <key> <value>` | Update an existing secret |
69
+ | `et secret get <wallet> <key>` | Decrypt & display a single secret |
70
+ | `et secret get <wallet> <key> -s` | Decrypt & save to `.env` |
71
+ | `et secret list <wallet>` | List all secret keys in a wallet |
72
+ | `et secret pull <wallet> --sync` | Sync all secrets to `.env` |
73
+ | `et secret delete <wallet> <key>` | Delete a secret |
74
+ | `et secret share <wallet>` | Re-encrypt all secrets for all members |
75
+
76
+ ### Wallets
77
+
78
+ | Command | Description |
79
+ | ------------------------------------------ | --------------------------------- |
80
+ | `et wallet create <name>` | Create a new wallet |
81
+ | `et wallet create <name> -d "description"` | Create with description |
82
+ | `et wallet list` | List all wallets (owned + shared) |
83
+ | `et wallet delete <name>` | Delete a wallet (owner only) |
84
+
85
+ ### Team Members
86
+
87
+ | Command | Description |
88
+ | ---------------------------------------- | ---------------------------- |
89
+ | `et member add <wallet> <user>` | Add a member (default: read) |
90
+ | `et member add <wallet> <user> -r write` | Add with write access |
91
+ | `et member add <wallet> <user> -r admin` | Add as admin |
92
+ | `et member list <wallet>` | List wallet members |
93
+ | `et member remove <wallet> <user>` | Remove a member |
94
+
95
+ ### Configuration
96
+
97
+ | Command | Description |
98
+ | ---------------------------- | -------------------------- |
99
+ | `et config show` | Show current configuration |
100
+ | `et config set server <url>` | Change the API server URL |
101
+
102
+ ---
103
+
104
+ ## Typical Workflow
105
+
106
+ ### Solo Developer
107
+
108
+ ```bash
109
+ et init # One-time setup
110
+ et wallet create production # Create a wallet
111
+ et push production DB_URL "postgres://…" # Add secrets
112
+ et push production API_KEY "sk-…"
113
+ et pull production # Sync to .env — done!
114
+ ```
115
+
116
+ ### Sharing with a Team
117
+
118
+ ```bash
119
+ # Owner
120
+ et wallet create staging
121
+ et push staging DB_URL "postgres://…"
122
+ et member add staging alice --role write # Add a teammate
123
+
124
+ # IMPORTANT: Re-encrypt secrets for new member
125
+ et secret share staging
126
+
127
+ # Alice (on her machine)
128
+ et init # One-time setup
129
+ et pull staging # Sync shared secrets
130
+ ```
131
+
132
+ ### CI/CD Pipeline
133
+
134
+ ```bash
135
+ # Non-interactive login
136
+ et login -e ci@company.com -p "$CI_PASSWORD"
137
+ et pull production -o .env
138
+ ```
139
+
140
+ ---
141
+
142
+ ## How It Works
143
+
144
+ ```
145
+ ┌─────────────┐ ┌──────────────┐
146
+ │ Your CLI │ ── encrypt locally ──▶ │ Server │
147
+ │ (et push) │ with recipient's │ (only sees │
148
+ │ │ public key │ ciphertext) │
149
+ └─────────────┘ └──────────────┘
150
+
151
+ ┌─────────────┐ ┌──────────────┐
152
+ │ Your CLI │ ◀── download ──────── │ Server │
153
+ │ (et pull) │ decrypt locally │ (returns │
154
+ │ │ with YOUR key │ ciphertext) │
155
+ └─────────────┘ └──────────────┘
156
+ ```
157
+
158
+ - **Public key** → stored on server (anyone can encrypt _for_ you)
159
+ - **Private key** → stored at `~/.envtree/private_key` (never leaves your machine)
160
+ - **Encryption** → X25519 SealedBox (NaCl/libsodium)
161
+
162
+ ---
163
+
164
+ ## Local Files
165
+
166
+ | Path | Purpose |
167
+ | ------------------------ | --------------------------------------- |
168
+ | `~/.envtree/config.json` | Session token, server URL |
169
+ | `~/.envtree/private_key` | Your encryption private key (chmod 600) |
170
+ | `.env` | Local env file created by `et pull` |
171
+
172
+ ---
173
+
174
+ ## Roles
175
+
176
+ | Role | Read | Write | Manage Members |
177
+ | ------- | ---- | ----- | -------------- |
178
+ | `read` | ✅ | ❌ | ❌ |
179
+ | `write` | ✅ | ✅ | ❌ |
180
+ | `admin` | ✅ | ✅ | ✅ |
181
+ | `owner` | ✅ | ✅ | ✅ |
182
+
183
+ ---
184
+
185
+ ## Troubleshooting
186
+
187
+ ### "Invalid or expired token"
188
+
189
+ Your session has expired. Run `et login` again.
190
+
191
+ ### "Secret not found" but `secret list` shows it
192
+
193
+ The secret was encrypted for a different public key. Run `et secret share <wallet>` to re-encrypt for your current key.
194
+
195
+ ### Changing server URL
196
+
197
+ ```bash
198
+ et config set server https://api.envtree.dev
199
+ ```
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerAuthCommands(program: Command): void;
@@ -0,0 +1,220 @@
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.registerAuthCommands = registerAuthCommands;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const ora_1 = __importDefault(require("ora"));
10
+ const api_1 = require("../lib/api");
11
+ const config_1 = require("../lib/config");
12
+ const crypto_1 = require("../lib/crypto");
13
+ const key_store_1 = require("../lib/key-store");
14
+ function registerAuthCommands(program) {
15
+ // ── signup ──
16
+ program
17
+ .command("signup")
18
+ .description("Create a new EnvTree account")
19
+ .action(async () => {
20
+ const answers = await inquirer_1.default.prompt([
21
+ { type: "input", name: "email", message: "Email:" },
22
+ { type: "input", name: "username", message: "Username:" },
23
+ {
24
+ type: "password",
25
+ name: "password",
26
+ message: "Password:",
27
+ mask: "*",
28
+ },
29
+ {
30
+ type: "password",
31
+ name: "confirmPassword",
32
+ message: "Confirm Password:",
33
+ mask: "*",
34
+ },
35
+ ]);
36
+ if (answers.password !== answers.confirmPassword) {
37
+ console.log(chalk_1.default.red("Passwords do not match"));
38
+ return;
39
+ }
40
+ const spinner = (0, ora_1.default)("Creating account...").start();
41
+ try {
42
+ const result = await (0, api_1.apiRequest)("POST", "/auth/signup", {
43
+ email: answers.email,
44
+ password: answers.password,
45
+ username: answers.username,
46
+ }, false);
47
+ if (!result.session) {
48
+ spinner.succeed("Account created! Please verify your email, then run: et login");
49
+ return;
50
+ }
51
+ (0, config_1.saveSession)({
52
+ access_token: result.session.access_token,
53
+ refresh_token: result.session.refresh_token,
54
+ user_id: result.user.id,
55
+ email: answers.email,
56
+ username: answers.username,
57
+ });
58
+ spinner.text = "Generating encryption keys...";
59
+ const keys = await (0, crypto_1.generateKeys)();
60
+ (0, key_store_1.savePrivateKey)(keys.private_key);
61
+ await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
62
+ public_key: keys.public_key,
63
+ });
64
+ spinner.succeed(chalk_1.default.green("Account created & keys generated!"));
65
+ console.log(chalk_1.default.dim(` User: ${answers.username} (${answers.email})`));
66
+ console.log(chalk_1.default.dim(" Private key saved to ~/.envtree/private_key"));
67
+ }
68
+ catch (err) {
69
+ spinner.fail(chalk_1.default.red(`Signup failed: ${err.message}`));
70
+ }
71
+ finally {
72
+ (0, crypto_1.shutdown)();
73
+ }
74
+ });
75
+ // ── login ──
76
+ program
77
+ .command("login")
78
+ .description("Log in to your EnvTree account")
79
+ .option("-e, --email <email>", "Email (non-interactive)")
80
+ .option("-p, --password <password>", "Password (non-interactive)")
81
+ .action(async (opts) => {
82
+ let email = opts.email;
83
+ let password = opts.password;
84
+ // Interactive mode if flags not provided
85
+ if (!email || !password) {
86
+ const answers = await inquirer_1.default.prompt([
87
+ ...(!email
88
+ ? [{ type: "input", name: "email", message: "Email:" }]
89
+ : []),
90
+ ...(!password
91
+ ? [
92
+ {
93
+ type: "password",
94
+ name: "password",
95
+ message: "Password:",
96
+ mask: "*",
97
+ },
98
+ ]
99
+ : []),
100
+ ]);
101
+ email = email || answers.email;
102
+ password = password || answers.password;
103
+ }
104
+ const spinner = (0, ora_1.default)("Logging in...").start();
105
+ try {
106
+ const result = await (0, api_1.apiRequest)("POST", "/auth/login", { email, password }, false);
107
+ (0, config_1.saveSession)({
108
+ access_token: result.session.access_token,
109
+ refresh_token: result.session.refresh_token,
110
+ user_id: result.user.id,
111
+ email: result.user.email,
112
+ username: email,
113
+ });
114
+ // Fetch profile to get real username
115
+ const profileResult = await (0, api_1.apiRequest)("GET", "/profile/me", undefined, true);
116
+ if (profileResult.profile?.username) {
117
+ (0, config_1.saveSession)({
118
+ access_token: result.session.access_token,
119
+ refresh_token: result.session.refresh_token,
120
+ user_id: result.user.id,
121
+ email: result.user.email,
122
+ username: profileResult.profile.username,
123
+ });
124
+ }
125
+ // Always sync public key with server
126
+ if ((0, key_store_1.hasPrivateKey)()) {
127
+ // Derive public key from existing private key and upload it
128
+ spinner.text = "Syncing encryption keys...";
129
+ const privateKey = require("../lib/key-store").getPrivateKey();
130
+ const publicKey = await (0, crypto_1.derivePublicKey)(privateKey);
131
+ await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
132
+ public_key: publicKey,
133
+ });
134
+ spinner.succeed(chalk_1.default.green("Logged in!"));
135
+ }
136
+ else {
137
+ // Generate a new keypair
138
+ spinner.text = "Generating encryption keys...";
139
+ const keys = await (0, crypto_1.generateKeys)();
140
+ (0, key_store_1.savePrivateKey)(keys.private_key);
141
+ await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
142
+ public_key: keys.public_key,
143
+ });
144
+ spinner.succeed(chalk_1.default.green("Logged in & keys generated!"));
145
+ console.log(chalk_1.default.dim(" Private key saved to ~/.envtree/private_key"));
146
+ }
147
+ console.log(chalk_1.default.dim(` User: ${result.user.email}`));
148
+ }
149
+ catch (err) {
150
+ spinner.fail(chalk_1.default.red(`Login failed: ${err.message}`));
151
+ }
152
+ finally {
153
+ (0, crypto_1.shutdown)();
154
+ }
155
+ });
156
+ // ── logout ──
157
+ program
158
+ .command("logout")
159
+ .description("Log out of your EnvTree account")
160
+ .action(() => {
161
+ (0, config_1.clearSession)();
162
+ console.log(chalk_1.default.green("Logged out"));
163
+ });
164
+ // ── whoami ──
165
+ program
166
+ .command("whoami")
167
+ .description("Show the current logged-in user")
168
+ .action(async () => {
169
+ const session = (0, config_1.getSession)();
170
+ if (!session) {
171
+ console.log(chalk_1.default.yellow("Not logged in. Run: et login"));
172
+ return;
173
+ }
174
+ try {
175
+ const result = await (0, api_1.apiRequest)("GET", "/profile/me");
176
+ console.log(chalk_1.default.bold("EnvTree User"));
177
+ console.log(` Username: ${result.profile.username}`);
178
+ console.log(` Email: ${result.profile.email}`);
179
+ console.log(` Public Key: ${result.profile.public_key ? result.profile.public_key.substring(0, 20) + "..." : chalk_1.default.yellow("not set")}`);
180
+ }
181
+ catch {
182
+ console.log(chalk_1.default.dim(` Username: ${session.username}`));
183
+ console.log(chalk_1.default.dim(` Email: ${session.email}`));
184
+ console.log(chalk_1.default.yellow(" (offline — showing cached info)"));
185
+ }
186
+ });
187
+ // ── delete-account ──
188
+ program
189
+ .command("delete-account")
190
+ .description("Permanently delete your EnvTree account")
191
+ .action(async () => {
192
+ const session = (0, config_1.getSession)();
193
+ if (!session) {
194
+ console.log(chalk_1.default.yellow("Not logged in. Run: et login"));
195
+ return;
196
+ }
197
+ const { confirm } = await inquirer_1.default.prompt([
198
+ {
199
+ type: "confirm",
200
+ name: "confirm",
201
+ message: chalk_1.default.red("⚠ This will permanently delete your account and all your wallets. Are you sure?"),
202
+ default: false,
203
+ },
204
+ ]);
205
+ if (!confirm) {
206
+ console.log(chalk_1.default.dim("Cancelled."));
207
+ return;
208
+ }
209
+ const spinner = (0, ora_1.default)("Deleting account...").start();
210
+ try {
211
+ await (0, api_1.apiRequest)("DELETE", "/auth/account");
212
+ (0, config_1.clearSession)();
213
+ spinner.succeed(chalk_1.default.green("Account deleted. Goodbye!"));
214
+ }
215
+ catch (err) {
216
+ spinner.fail(chalk_1.default.red(`Failed: ${err.message}`));
217
+ }
218
+ });
219
+ }
220
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerConfigCommands(program: Command): void;
@@ -0,0 +1,42 @@
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.registerConfigCommands = registerConfigCommands;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const config_1 = require("../lib/config");
9
+ function registerConfigCommands(program) {
10
+ const config = program
11
+ .command("config")
12
+ .description("Manage CLI configuration");
13
+ // ── config show ──
14
+ config
15
+ .command("show")
16
+ .description("Display current configuration")
17
+ .action(() => {
18
+ const cfg = (0, config_1.getConfig)();
19
+ console.log(chalk_1.default.bold("\nEnvTree Config"));
20
+ console.log(` Server: ${chalk_1.default.cyan(cfg.server_url)}`);
21
+ console.log(` Session: ${cfg.session ? chalk_1.default.green("active") + chalk_1.default.dim(` (${cfg.session.email})`) : chalk_1.default.yellow("none")}`);
22
+ console.log(chalk_1.default.dim(` Config: ~/.envtree/config.json`));
23
+ console.log(chalk_1.default.dim(` Keys: ~/.envtree/private_key`));
24
+ console.log("");
25
+ });
26
+ // ── config set ──
27
+ config
28
+ .command("set <key> <value>")
29
+ .description("Set a configuration value (e.g. server URL)")
30
+ .action((key, value) => {
31
+ const cfg = (0, config_1.getConfig)();
32
+ if (key === "server" || key === "server_url") {
33
+ cfg.server_url = value;
34
+ (0, config_1.saveConfig)(cfg);
35
+ console.log(chalk_1.default.green(`Server URL set to: ${value}`));
36
+ }
37
+ else {
38
+ console.log(chalk_1.default.red(`Unknown config key: "${key}". Available: server`));
39
+ }
40
+ });
41
+ }
42
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;;;;AAIA,wDA0CC;AA7CD,kDAA0B;AAC1B,0CAAsD;AAEtD,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE3C,oBAAoB;IACpB,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,GAAG,GAAG,IAAA,kBAAS,GAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CACT,eAAe,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,eAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACnH,CAAC;QACF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAChD,CAAC;QACF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAChD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,mBAAmB;IACnB,MAAM;SACH,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAA,kBAAS,GAAE,CAAC;QAExB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAC7C,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC;YACvB,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,wBAAwB,GAAG,sBAAsB,CAAC,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerInitCommand(program: Command): void;
@@ -0,0 +1,159 @@
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.registerInitCommand = registerInitCommand;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const ora_1 = __importDefault(require("ora"));
10
+ const api_1 = require("../lib/api");
11
+ const config_1 = require("../lib/config");
12
+ const crypto_1 = require("../lib/crypto");
13
+ const key_store_1 = require("../lib/key-store");
14
+ function registerInitCommand(program) {
15
+ program
16
+ .command("init")
17
+ .description("First-time setup — create an account or log in")
18
+ .action(async () => {
19
+ console.log(chalk_1.default.bold("\n🌲 Welcome to EnvTree!\n"));
20
+ const { action } = await inquirer_1.default.prompt([
21
+ {
22
+ type: "list",
23
+ name: "action",
24
+ message: "What would you like to do?",
25
+ choices: [
26
+ { name: "Create a new account", value: "signup" },
27
+ { name: "Log in to existing account", value: "login" },
28
+ ],
29
+ },
30
+ ]);
31
+ if (action === "signup") {
32
+ const answers = await inquirer_1.default.prompt([
33
+ { type: "input", name: "email", message: "Email:" },
34
+ { type: "input", name: "username", message: "Username:" },
35
+ {
36
+ type: "password",
37
+ name: "password",
38
+ message: "Password:",
39
+ mask: "*",
40
+ },
41
+ {
42
+ type: "password",
43
+ name: "confirmPassword",
44
+ message: "Confirm Password:",
45
+ mask: "*",
46
+ },
47
+ ]);
48
+ if (answers.password !== answers.confirmPassword) {
49
+ console.log(chalk_1.default.red("\n Passwords do not match"));
50
+ return;
51
+ }
52
+ const spinner = (0, ora_1.default)("Creating account...").start();
53
+ try {
54
+ const result = await (0, api_1.apiRequest)("POST", "/auth/signup", {
55
+ email: answers.email,
56
+ password: answers.password,
57
+ username: answers.username,
58
+ }, false);
59
+ if (!result.session) {
60
+ spinner.succeed("Account created! Check your email, then run: et login");
61
+ return;
62
+ }
63
+ (0, config_1.saveSession)({
64
+ access_token: result.session.access_token,
65
+ refresh_token: result.session.refresh_token,
66
+ user_id: result.user.id,
67
+ email: answers.email,
68
+ username: answers.username,
69
+ });
70
+ spinner.text = "Generating encryption keys...";
71
+ const keys = await (0, crypto_1.generateKeys)();
72
+ (0, key_store_1.savePrivateKey)(keys.private_key);
73
+ await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
74
+ public_key: keys.public_key,
75
+ });
76
+ spinner.succeed(chalk_1.default.green("All set! You're ready to go."));
77
+ console.log(chalk_1.default.dim(` User: ${answers.username} (${answers.email})`));
78
+ console.log("");
79
+ console.log(chalk_1.default.bold(" Next steps:"));
80
+ console.log(chalk_1.default.cyan(" et wallet create my-project ") +
81
+ chalk_1.default.dim("Create a wallet"));
82
+ console.log(chalk_1.default.cyan(' et push my-project API_KEY "sk-..." ') +
83
+ chalk_1.default.dim("Store a secret"));
84
+ console.log(chalk_1.default.cyan(" et pull my-project ") +
85
+ chalk_1.default.dim("Sync to .env"));
86
+ console.log("");
87
+ }
88
+ catch (err) {
89
+ spinner.fail(chalk_1.default.red(`Signup failed: ${err.message}`));
90
+ }
91
+ finally {
92
+ (0, crypto_1.shutdown)();
93
+ }
94
+ }
95
+ else {
96
+ // Login flow
97
+ const answers = await inquirer_1.default.prompt([
98
+ { type: "input", name: "email", message: "Email:" },
99
+ {
100
+ type: "password",
101
+ name: "password",
102
+ message: "Password:",
103
+ mask: "*",
104
+ },
105
+ ]);
106
+ const spinner = (0, ora_1.default)("Logging in...").start();
107
+ try {
108
+ const result = await (0, api_1.apiRequest)("POST", "/auth/login", {
109
+ email: answers.email,
110
+ password: answers.password,
111
+ }, false);
112
+ (0, config_1.saveSession)({
113
+ access_token: result.session.access_token,
114
+ refresh_token: result.session.refresh_token,
115
+ user_id: result.user.id,
116
+ email: result.user.email,
117
+ username: answers.email,
118
+ });
119
+ const profileResult = await (0, api_1.apiRequest)("GET", "/profile/me", undefined, true);
120
+ if (profileResult.profile?.username) {
121
+ (0, config_1.saveSession)({
122
+ access_token: result.session.access_token,
123
+ refresh_token: result.session.refresh_token,
124
+ user_id: result.user.id,
125
+ email: result.user.email,
126
+ username: profileResult.profile.username,
127
+ });
128
+ }
129
+ // Always sync public key with server
130
+ if ((0, key_store_1.hasPrivateKey)()) {
131
+ spinner.text = "Syncing encryption keys...";
132
+ const pk = (0, key_store_1.getPrivateKey)();
133
+ const publicKey = await (0, crypto_1.derivePublicKey)(pk);
134
+ await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
135
+ public_key: publicKey,
136
+ });
137
+ }
138
+ else {
139
+ spinner.text = "Generating encryption keys...";
140
+ const keys = await (0, crypto_1.generateKeys)();
141
+ (0, key_store_1.savePrivateKey)(keys.private_key);
142
+ await (0, api_1.apiRequest)("PUT", "/profile/public-key", {
143
+ public_key: keys.public_key,
144
+ });
145
+ }
146
+ spinner.succeed(chalk_1.default.green("Logged in! You're ready to go."));
147
+ console.log(chalk_1.default.dim(` User: ${result.user.email}`));
148
+ console.log("");
149
+ }
150
+ catch (err) {
151
+ spinner.fail(chalk_1.default.red(`Login failed: ${err.message}`));
152
+ }
153
+ finally {
154
+ (0, crypto_1.shutdown)();
155
+ }
156
+ }
157
+ });
158
+ }
159
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerMemberCommands(program: Command): void;