beakcrypt 0.0.1 → 0.0.2

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ # MIT License
2
+
3
+ Copyright (c) 2025 prudentbird
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # beakcrypt
2
+
3
+ Secure environment variable management with end-to-end encryption. Secrets are encrypted on your machine before leaving it — beakcrypt never sees plaintext values.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g beakcrypt
9
+ ```
10
+
11
+ Requires Node.js 20 or later.
12
+
13
+ ## Quick start
14
+
15
+ ```bash
16
+ # Log in with GitHub
17
+ beakcrypt login
18
+
19
+ # Link your project directory
20
+ beakcrypt link
21
+
22
+ # Push your local .env.local to the cloud
23
+ beakcrypt push
24
+
25
+ # Pull secrets back down on another machine
26
+ beakcrypt pull
27
+ ```
28
+
29
+ ## Commands
30
+
31
+ ### Auth
32
+
33
+ ```
34
+ beakcrypt login Log in via GitHub OAuth
35
+ beakcrypt logout Log out and remove local credentials
36
+ beakcrypt whoami Show the currently logged-in user
37
+ ```
38
+
39
+ ### Project
40
+
41
+ ```
42
+ beakcrypt link Link the current directory to a project
43
+ ```
44
+
45
+ ### Secrets
46
+
47
+ ```
48
+ beakcrypt pull [file] Pull secrets to a local .env file (default: .env.local)
49
+ beakcrypt push [file] Push secrets from a local .env file (default: .env.local)
50
+ beakcrypt run -- <cmd> Run a command with secrets injected as environment variables
51
+ ```
52
+
53
+ All secret commands accept these flags:
54
+
55
+ ```
56
+ -o, --org <slug> Organization slug
57
+ -p, --project <name> Project name
58
+ -e, --env <name> Environment name
59
+ -y, --yes Skip confirmation prompts (push, logout)
60
+ ```
61
+
62
+ ### Secrets management
63
+
64
+ ```
65
+ beakcrypt secrets list List secrets (values masked)
66
+ beakcrypt secrets set <KEY=VALUE...> Set one or more secrets
67
+ beakcrypt secrets remove <KEY...> Remove secrets by key
68
+ beakcrypt secrets clear Delete all secrets in an environment
69
+ ```
70
+
71
+ ### Organizations
72
+
73
+ ```
74
+ beakcrypt org list List your organizations
75
+ ```
76
+
77
+ ### Environments
78
+
79
+ ```
80
+ beakcrypt env list List environments for the linked project
81
+ ```
82
+
83
+ ## Examples
84
+
85
+ ```bash
86
+ # Inject secrets into a dev server
87
+ beakcrypt run -- npm run dev
88
+
89
+ # Push a specific env file to a named environment
90
+ beakcrypt push .env.production -e production
91
+
92
+ # Set individual secrets directly
93
+ beakcrypt secrets set API_KEY=abc123 DATABASE_URL=postgres://...
94
+
95
+ # Pull into a custom file
96
+ beakcrypt pull .env.staging -e staging
97
+ ```
package/dist/index.js CHANGED
@@ -38,8 +38,10 @@ ${pc.red("Error:")} An unexpected error occurred.`);
38
38
  process.exit(1);
39
39
  }
40
40
 
41
- // src/commands/login.ts
42
- import { api } from "@beakcrypt/convex";
41
+ // ../convex/src/_generated/api.js
42
+ import { anyApi, componentsGeneric } from "convex/server";
43
+ var api = anyApi;
44
+ var components = componentsGeneric();
43
45
 
44
46
  // src/lib/global-config.ts
45
47
  import { mkdir, readFile, writeFile, rm } from "fs/promises";
@@ -372,12 +374,6 @@ async function logoutCommand(opts) {
372
374
  success("Logged out. All credentials and keys removed.");
373
375
  }
374
376
 
375
- // src/commands/whoami.ts
376
- import { api as api3 } from "@beakcrypt/convex";
377
-
378
- // src/lib/context.ts
379
- import { api as api2 } from "@beakcrypt/convex";
380
-
381
377
  // src/lib/project-config.ts
382
378
  import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2, appendFile } from "fs/promises";
383
379
  import { existsSync as existsSync2 } from "fs";
@@ -493,12 +489,12 @@ async function resolveContext(flags) {
493
489
  };
494
490
  }
495
491
  async function resolveOrgBySlug(slug) {
496
- const result = await query(api2.organizations.getBySlug, { slug });
492
+ const result = await query(api.organizations.getBySlug, { slug });
497
493
  const org2 = unwrapResult(result);
498
494
  return org2._id;
499
495
  }
500
496
  async function resolveProjectByName(orgId, name) {
501
- const result = await query(api2.projects.getByName, {
497
+ const result = await query(api.projects.getByName, {
502
498
  orgId,
503
499
  name
504
500
  });
@@ -507,12 +503,12 @@ async function resolveProjectByName(orgId, name) {
507
503
  }
508
504
  async function resolveEnvId(projectId, envName) {
509
505
  if (envName === "local") {
510
- await mutation(api2.environments.ensurePersonalLocal, {
506
+ await mutation(api.environments.ensurePersonalLocal, {
511
507
  projectId,
512
508
  syncFromDev: false
513
509
  });
514
510
  }
515
- const result = await query(api2.environments.list, {
511
+ const result = await query(api.environments.list, {
516
512
  projectId
517
513
  });
518
514
  const envs = unwrapResult(result);
@@ -524,7 +520,7 @@ async function resolveEnvId(projectId, envName) {
524
520
  }
525
521
  async function interactiveLink() {
526
522
  requireInteractive("link");
527
- const orgsResult = await query(api2.organizations.list, {});
523
+ const orgsResult = await query(api.organizations.list, {});
528
524
  const orgs = unwrapResult(orgsResult);
529
525
  if (orgs.length === 0) {
530
526
  throw new CliError("You don't belong to any organizations.");
@@ -551,7 +547,7 @@ async function interactiveLink() {
551
547
  message: "Enter project name:",
552
548
  validate: (v) => v.trim().length > 0 ? true : "Project name is required"
553
549
  });
554
- const createResult = await mutation(api2.projects.create, {
550
+ const createResult = await mutation(api.projects.create, {
555
551
  name: name.trim(),
556
552
  orgId
557
553
  });
@@ -560,7 +556,7 @@ async function interactiveLink() {
560
556
  projectName = project.name;
561
557
  success(`Created project "${projectName}" in ${selectedOrg.name}`);
562
558
  } else {
563
- const projectsResult = await query(api2.projects.list, {
559
+ const projectsResult = await query(api.projects.list, {
564
560
  orgId
565
561
  });
566
562
  const projects = unwrapResult(projectsResult);
@@ -579,11 +575,11 @@ async function interactiveLink() {
579
575
  );
580
576
  projectName = selectedProject.name;
581
577
  }
582
- await mutation(api2.environments.ensurePersonalLocal, {
578
+ await mutation(api.environments.ensurePersonalLocal, {
583
579
  projectId,
584
580
  syncFromDev: false
585
581
  });
586
- const envsResult = await query(api2.environments.list, {
582
+ const envsResult = await query(api.environments.list, {
587
583
  projectId
588
584
  });
589
585
  const envs = unwrapResult(envsResult);
@@ -615,7 +611,7 @@ async function interactiveLink() {
615
611
  // src/commands/whoami.ts
616
612
  async function whoamiCommand() {
617
613
  await ensureAuth();
618
- const user = await query(api3.auth.getCurrentUser, {});
614
+ const user = await query(api.auth.getCurrentUser, {});
619
615
  if (!user) {
620
616
  throw new CliError(
621
617
  "Could not retrieve user info. Try `beakcrypt login` again."
@@ -727,9 +723,6 @@ function base64ToBuffer(base64) {
727
723
  return bytes.buffer;
728
724
  }
729
725
 
730
- // src/lib/key-manager.ts
731
- import { api as api4 } from "@beakcrypt/convex";
732
-
733
726
  // src/lib/key-store.ts
734
727
  import { mkdir as mkdir3, readFile as readFile3, writeFile as writeFile3, rm as rm2 } from "fs/promises";
735
728
  import { existsSync as existsSync3 } from "fs";
@@ -771,7 +764,7 @@ async function ensureOrgKey(orgId) {
771
764
  return await unwrapOrgKey(stored.wrappedOrgKey, stored.privateKey);
772
765
  }
773
766
  if (stored?.keyId) {
774
- const keyResult = await query(api4.keys.getMyKey, {
767
+ const keyResult = await query(api.keys.getMyKey, {
775
768
  orgId,
776
769
  publicKey: JSON.stringify(stored.publicKey)
777
770
  });
@@ -801,7 +794,7 @@ async function registerNewDevice(orgId) {
801
794
  try {
802
795
  keyPair = await generateKeyPair();
803
796
  spinner.text = "Registering device with organization...";
804
- const result = await mutation(api4.keys.registerKey, {
797
+ const result = await mutation(api.keys.registerKey, {
805
798
  orgId,
806
799
  publicKey: JSON.stringify(keyPair.publicKey),
807
800
  sessionToken
@@ -849,7 +842,7 @@ async function waitForApproval(orgId, stored) {
849
842
  spinner.indent = 2;
850
843
  while (true) {
851
844
  await new Promise((r) => setTimeout(r, 5e3));
852
- const result = await query(api4.keys.getMyKey, {
845
+ const result = await query(api.keys.getMyKey, {
853
846
  orgId,
854
847
  publicKey: JSON.stringify(stored.publicKey)
855
848
  });
@@ -880,7 +873,6 @@ async function linkCommand() {
880
873
  // src/commands/pull.ts
881
874
  import { resolve } from "path";
882
875
  import ora3 from "ora";
883
- import { api as api5 } from "@beakcrypt/convex";
884
876
 
885
877
  // src/lib/env-file.ts
886
878
  import { readFile as readFile4, writeFile as writeFile4 } from "fs/promises";
@@ -937,7 +929,7 @@ async function pullCommand(file, opts) {
937
929
  const ctx = await resolveContext(opts);
938
930
  const spinner = ora3("Pulling secrets...").start();
939
931
  const orgKey = await ensureOrgKey(ctx.orgId);
940
- const secretsResult = await query(api5.secrets.list, {
932
+ const secretsResult = await query(api.secrets.list, {
941
933
  environmentId: ctx.environmentId
942
934
  });
943
935
  const secrets2 = unwrapResult(secretsResult);
@@ -956,7 +948,6 @@ async function pullCommand(file, opts) {
956
948
  import { resolve as resolve2 } from "path";
957
949
  import { existsSync as existsSync5 } from "fs";
958
950
  import ora4 from "ora";
959
- import { api as api6 } from "@beakcrypt/convex";
960
951
  async function pushCommand(file, opts) {
961
952
  const filePath = resolve2(file ?? ".env.local");
962
953
  if (!existsSync5(filePath)) {
@@ -983,7 +974,7 @@ async function pushCommand(file, opts) {
983
974
  const encrypted = await encryptSecret(value, orgKey);
984
975
  encryptedSecrets.push({ key, encryptedValue: encrypted });
985
976
  }
986
- const result = await mutation(api6.secrets.bulkCreate, {
977
+ const result = await mutation(api.secrets.bulkCreate, {
987
978
  environmentId: ctx.environmentId,
988
979
  secrets: encryptedSecrets,
989
980
  overwrite: true
@@ -998,7 +989,6 @@ async function pushCommand(file, opts) {
998
989
  // src/commands/run.ts
999
990
  import { spawn } from "child_process";
1000
991
  import ora5 from "ora";
1001
- import { api as api7 } from "@beakcrypt/convex";
1002
992
  async function runCommand(args, opts) {
1003
993
  if (args.length === 0) {
1004
994
  throw new CliError(
@@ -1008,7 +998,7 @@ async function runCommand(args, opts) {
1008
998
  const ctx = await resolveContext(opts);
1009
999
  const spinner = ora5("Loading secrets...").start();
1010
1000
  const orgKey = await ensureOrgKey(ctx.orgId);
1011
- const secretsResult = await query(api7.secrets.list, {
1001
+ const secretsResult = await query(api.secrets.list, {
1012
1002
  environmentId: ctx.environmentId
1013
1003
  });
1014
1004
  const secrets2 = unwrapResult(secretsResult);
@@ -1031,10 +1021,9 @@ async function runCommand(args, opts) {
1031
1021
  }
1032
1022
 
1033
1023
  // src/commands/secrets/list.ts
1034
- import { api as api8 } from "@beakcrypt/convex";
1035
1024
  async function secretsListCommand(opts) {
1036
1025
  const ctx = await resolveContext(opts);
1037
- const result = await query(api8.secrets.list, {
1026
+ const result = await query(api.secrets.list, {
1038
1027
  environmentId: ctx.environmentId
1039
1028
  });
1040
1029
  const secrets2 = unwrapResult(result);
@@ -1062,7 +1051,6 @@ ${dim(`${secrets2.length} secret${secrets2.length === 1 ? "" : "s"}`)}
1062
1051
 
1063
1052
  // src/commands/secrets/set.ts
1064
1053
  import ora6 from "ora";
1065
- import { api as api9 } from "@beakcrypt/convex";
1066
1054
  async function secretsSetCommand(pairs, opts) {
1067
1055
  if (pairs.length === 0) {
1068
1056
  throw new CliError(
@@ -1088,7 +1076,7 @@ async function secretsSetCommand(pairs, opts) {
1088
1076
  const encrypted = await encryptSecret(value, orgKey);
1089
1077
  encryptedSecrets.push({ key, encryptedValue: encrypted });
1090
1078
  }
1091
- const result = await mutation(api9.secrets.bulkCreate, {
1079
+ const result = await mutation(api.secrets.bulkCreate, {
1092
1080
  environmentId: ctx.environmentId,
1093
1081
  secrets: encryptedSecrets,
1094
1082
  overwrite: true
@@ -1102,7 +1090,6 @@ async function secretsSetCommand(pairs, opts) {
1102
1090
 
1103
1091
  // src/commands/secrets/remove.ts
1104
1092
  import ora7 from "ora";
1105
- import { api as api10 } from "@beakcrypt/convex";
1106
1093
  async function secretsRemoveCommand(keys, opts) {
1107
1094
  if (keys.length === 0) {
1108
1095
  throw new CliError(
@@ -1111,7 +1098,7 @@ async function secretsRemoveCommand(keys, opts) {
1111
1098
  }
1112
1099
  const ctx = await resolveContext(opts);
1113
1100
  const spinner = ora7("Removing secrets...").start();
1114
- const secretsResult = await query(api10.secrets.list, {
1101
+ const secretsResult = await query(api.secrets.list, {
1115
1102
  environmentId: ctx.environmentId
1116
1103
  });
1117
1104
  const secrets2 = unwrapResult(secretsResult);
@@ -1120,7 +1107,7 @@ async function secretsRemoveCommand(keys, opts) {
1120
1107
  for (const key of keys) {
1121
1108
  const secret = secrets2.find((s) => s.key === key);
1122
1109
  if (secret) {
1123
- const result = await mutation(api10.secrets.remove, {
1110
+ const result = await mutation(api.secrets.remove, {
1124
1111
  id: secret._id
1125
1112
  });
1126
1113
  unwrapResult(result);
@@ -1142,7 +1129,6 @@ async function secretsRemoveCommand(keys, opts) {
1142
1129
 
1143
1130
  // src/commands/secrets/clear.ts
1144
1131
  import ora8 from "ora";
1145
- import { api as api11 } from "@beakcrypt/convex";
1146
1132
  async function secretsClearCommand(opts) {
1147
1133
  const ctx = await resolveContext(opts);
1148
1134
  if (!opts.yes) {
@@ -1152,7 +1138,7 @@ async function secretsClearCommand(opts) {
1152
1138
  if (!confirmed) return;
1153
1139
  }
1154
1140
  const spinner = ora8("Clearing secrets...").start();
1155
- const result = await mutation(api11.secrets.removeAll, {
1141
+ const result = await mutation(api.secrets.removeAll, {
1156
1142
  environmentId: ctx.environmentId
1157
1143
  });
1158
1144
  const summary = unwrapResult(result);
@@ -1163,10 +1149,9 @@ async function secretsClearCommand(opts) {
1163
1149
  }
1164
1150
 
1165
1151
  // src/commands/org/list.ts
1166
- import { api as api12 } from "@beakcrypt/convex";
1167
1152
  async function orgListCommand() {
1168
1153
  await ensureAuth();
1169
- const result = await query(api12.organizations.list, {});
1154
+ const result = await query(api.organizations.list, {});
1170
1155
  const orgs = unwrapResult(result);
1171
1156
  if (orgs.length === 0) {
1172
1157
  info("You don't belong to any organizations.");
@@ -1181,10 +1166,9 @@ async function orgListCommand() {
1181
1166
  }
1182
1167
 
1183
1168
  // src/commands/env/list.ts
1184
- import { api as api13 } from "@beakcrypt/convex";
1185
1169
  async function envListCommand(opts) {
1186
1170
  const ctx = await resolveContext({ ...opts, env: "development" });
1187
- const result = await query(api13.environments.list, {
1171
+ const result = await query(api.environments.list, {
1188
1172
  projectId: ctx.projectId
1189
1173
  });
1190
1174
  const envs = unwrapResult(result);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/errors.ts","../src/commands/login.ts","../src/lib/global-config.ts","../src/lib/auth.ts","../src/lib/output.ts","../src/lib/convex-client.ts","../src/lib/interactive.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/lib/context.ts","../src/lib/project-config.ts","../src/lib/key-manager.ts","../../crypto/src/core.ts","../src/lib/key-store.ts","../src/commands/link.ts","../src/commands/pull.ts","../src/lib/env-file.ts","../src/commands/push.ts","../src/commands/run.ts","../src/commands/secrets/list.ts","../src/commands/secrets/set.ts","../src/commands/secrets/remove.ts","../src/commands/secrets/clear.ts","../src/commands/org/list.ts","../src/commands/env/list.ts","../src/interactive-mode.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { handleError } from \"./lib/errors\";\nimport { loginCommand } from \"./commands/login\";\nimport { logoutCommand } from \"./commands/logout\";\nimport { whoamiCommand } from \"./commands/whoami\";\nimport { linkCommand } from \"./commands/link\";\nimport { pullCommand } from \"./commands/pull\";\nimport { pushCommand } from \"./commands/push\";\nimport { runCommand } from \"./commands/run\";\nimport { secretsListCommand } from \"./commands/secrets/list\";\nimport { secretsSetCommand } from \"./commands/secrets/set\";\nimport { secretsRemoveCommand } from \"./commands/secrets/remove\";\nimport { secretsClearCommand } from \"./commands/secrets/clear\";\nimport { orgListCommand } from \"./commands/org/list\";\nimport { envListCommand } from \"./commands/env/list\";\nimport { interactiveMode } from \"./interactive-mode\";\n\nconst program = new Command();\n\nprogram\n .name(\"beakcrypt\")\n .description(\"Secure environment variable management with E2E encryption\")\n .version(\"0.1.0\")\n .action(async () => {\n try {\n await interactiveMode();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Auth commands\nprogram\n .command(\"login\")\n .description(\"Log in to Beakcrypt via GitHub OAuth\")\n .action(async () => {\n try {\n await loginCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Log out and remove all credentials\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n await logoutCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show current user info\")\n .action(async () => {\n try {\n await whoamiCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Project linking\nprogram\n .command(\"link\")\n .description(\"Link this directory to a Beakcrypt project\")\n .action(async () => {\n try {\n await linkCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Secret sync commands\nprogram\n .command(\"pull [file]\")\n .description(\"Pull secrets to a local .env file\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (file, opts) => {\n try {\n await pullCommand(file, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"push [file]\")\n .description(\"Push secrets from a local .env file\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (file, opts) => {\n try {\n await pushCommand(file, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"run\")\n .description(\"Run a command with injected secrets\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .allowUnknownOption()\n .action(async (opts, cmd) => {\n try {\n await runCommand(cmd.args, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\n// Secrets subcommands\nconst secrets = program.command(\"secrets\").description(\"Manage secrets\");\n\nsecrets\n .command(\"list\")\n .description(\"List secrets (values masked)\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (opts) => {\n try {\n await secretsListCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"set <pairs...>\")\n .description(\"Set secrets (KEY=VALUE)\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (pairs, opts) => {\n try {\n await secretsSetCommand(pairs, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"remove <keys...>\")\n .description(\"Remove secrets by key\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (keys, opts) => {\n try {\n await secretsRemoveCommand(keys, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"clear\")\n .description(\"Delete all secrets in an environment\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n await secretsClearCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\n// Org subcommands\nconst org = program.command(\"org\").description(\"Manage organizations\");\n\norg\n .command(\"list\")\n .description(\"List your organizations\")\n .action(async () => {\n try {\n await orgListCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Env subcommands\nconst env = program.command(\"env\").description(\"Manage environments\");\n\nenv\n .command(\"list\")\n .description(\"List environments for the linked project\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .action(async (opts) => {\n try {\n await envListCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram.parse();\n","import pc from \"picocolors\";\nimport type { Result } from \"@beakcrypt/shared\";\n\nexport class CliError extends Error {\n constructor(\n message: string,\n public readonly hint?: string,\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\nexport function handleResultError(result: {\n ok: false;\n code: string;\n error: string;\n}): never {\n throw new CliError(result.error, `Error code: ${result.code}`);\n}\n\nexport function unwrapResult<T>(result: Result<T>): T {\n if (!result.ok) {\n handleResultError(result);\n }\n return result.data;\n}\n\nexport function handleError(error: unknown): void {\n if (error instanceof CliError) {\n console.error(`\\n${pc.red(\"Error:\")} ${error.message}`);\n if (error.hint) {\n console.error(`${pc.dim(error.hint)}`);\n }\n } else if (error instanceof Error) {\n console.error(`\\n${pc.red(\"Error:\")} ${error.message}`);\n } else {\n console.error(`\\n${pc.red(\"Error:\")} An unexpected error occurred.`);\n }\n process.exit(1);\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { getAuthConfig } from \"../lib/global-config\";\nimport { loginFlow, getDefaultUrls, validateUrls } from \"../lib/auth\";\nimport { query } from \"../lib/convex-client\";\nimport * as output from \"../lib/output\";\n\nexport async function loginCommand(): Promise<void> {\n const existing = await getAuthConfig();\n if (existing) {\n output.info(\"Already logged in. Refreshing session...\");\n }\n\n const urls = existing\n ? {\n siteUrl: existing.siteUrl,\n convexUrl: existing.convexUrl,\n convexSiteUrl: existing.convexSiteUrl,\n }\n : getDefaultUrls();\n\n validateUrls(urls);\n await loginFlow(urls.siteUrl, urls.convexUrl, urls.convexSiteUrl);\n try {\n const user = await query(api.auth.getCurrentUser, {});\n if (user) {\n output.success(`Logged in as ${output.bold(user.email)}`);\n } else {\n output.success(\"Logged in successfully.\");\n }\n } catch {\n output.success(\"Logged in successfully.\");\n }\n}\n","import { mkdir, readFile, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface AuthConfig {\n sessionToken: string;\n convexUrl: string;\n convexSiteUrl: string;\n siteUrl: string;\n}\n\nconst CONFIG_DIR = join(homedir(), \".beakcrypt\");\nconst AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport async function ensureConfigDir(): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n}\n\nexport async function getAuthConfig(): Promise<AuthConfig | null> {\n if (!existsSync(AUTH_FILE)) return null;\n try {\n const data = await readFile(AUTH_FILE, \"utf-8\");\n return JSON.parse(data) as AuthConfig;\n } catch {\n return null;\n }\n}\n\nexport async function saveAuthConfig(config: AuthConfig): Promise<void> {\n await ensureConfigDir();\n await writeFile(AUTH_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport async function clearAuthConfig(): Promise<void> {\n if (existsSync(AUTH_FILE)) {\n await rm(AUTH_FILE);\n }\n}\n\nexport async function clearAllConfig(): Promise<void> {\n if (existsSync(CONFIG_DIR)) {\n await rm(CONFIG_DIR, { recursive: true });\n }\n}\n\nexport function isLoggedIn(): boolean {\n return existsSync(AUTH_FILE);\n}\n","import {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport ora from \"ora\";\nimport pc from \"picocolors\";\nimport { saveAuthConfig, type AuthConfig } from \"./global-config\";\nimport { CliError } from \"./errors\";\nimport * as output from \"./output\";\n\ninterface AuthResult {\n sessionToken: string;\n}\n\nfunction startCallbackServer(): Promise<{\n port: number;\n waitForToken: () => Promise<AuthResult>;\n}> {\n return new Promise((resolve, reject) => {\n let resolveToken: (result: AuthResult) => void;\n const tokenPromise = new Promise<AuthResult>((res) => {\n resolveToken = res;\n });\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url ?? \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const sessionToken = url.searchParams.get(\"session_token\");\n if (sessionToken) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"display:flex;justify-content:center;align-items:center;height:100vh;font-family:system-ui;background:#0a0a0a;color:#fafafa\">\n\t\t\t\t\t\t\t\t<div style=\"text-align:center\">\n\t\t\t\t\t\t\t\t\t<h1>Authenticated!</h1>\n\t\t\t\t\t\t\t\t\t<p>You can close this tab and return to the terminal.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n resolveToken!({ sessionToken });\n setTimeout(() => server.close(), 500);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing session_token parameter\");\n }\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n });\n\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n reject(new Error(\"Failed to start callback server\"));\n return;\n }\n resolve({\n port: addr.port,\n waitForToken: () => tokenPromise,\n });\n });\n\n server.on(\"error\", reject);\n });\n}\n\nexport async function loginFlow(\n siteUrl: string,\n convexUrl: string,\n convexSiteUrl: string,\n): Promise<AuthConfig> {\n const { port, waitForToken } = await startCallbackServer();\n const callbackUrl = `http://localhost:${port}/callback`;\n const loginUrl = `${siteUrl}/auth/cli?callback=${encodeURIComponent(callbackUrl)}`;\n\n const isTTY = process.stdin.isTTY;\n\n if (isTTY) {\n output.info(`Opening browser to log in...`);\n console.log(`${pc.dim(\"If the browser doesn't open, visit:\")}`);\n console.log(`${output.link(loginUrl)}\\n`);\n\n try {\n await open(loginUrl);\n } catch {\n // Browser failed to open — URL already printed above\n }\n } else {\n console.log(`Visit this URL to log in:\\n${output.link(loginUrl)}\\n`);\n }\n\n const spinner = ora(\"Waiting for authentication...\").start();\n\n const result = await waitForToken();\n spinner.stop();\n\n const config: AuthConfig = {\n sessionToken: result.sessionToken,\n convexUrl,\n convexSiteUrl,\n siteUrl,\n };\n\n await saveAuthConfig(config);\n return config;\n}\n\nexport function getDefaultUrls(): {\n siteUrl: string;\n convexUrl: string;\n convexSiteUrl: string;\n} {\n return {\n siteUrl: process.env.BEAKCRYPT_SITE_URL ?? \"https://app.beakcrypt.com\",\n convexUrl: process.env.BEAKCRYPT_CONVEX_URL ?? \"\",\n convexSiteUrl: process.env.BEAKCRYPT_CONVEX_SITE_URL ?? \"\",\n };\n}\n\nexport function validateUrls(urls: {\n convexUrl: string;\n convexSiteUrl: string;\n}): void {\n if (!urls.convexUrl) {\n throw new CliError(\n \"BEAKCRYPT_CONVEX_URL is not configured.\",\n \"Set the BEAKCRYPT_CONVEX_URL environment variable or configure it in ~/.beakcrypt/auth.json\",\n );\n }\n if (!urls.convexSiteUrl) {\n throw new CliError(\n \"BEAKCRYPT_CONVEX_SITE_URL is not configured.\",\n \"Set the BEAKCRYPT_CONVEX_SITE_URL environment variable or configure it in ~/.beakcrypt/auth.json\",\n );\n }\n}\n","import pc from \"picocolors\";\n\nexport function success(message: string): void {\n console.log(`${pc.green(\"✓\")} ${message}`);\n}\n\nexport function info(message: string): void {\n console.log(`${pc.blue(\"ℹ\")} ${message}`);\n}\n\nexport function warn(message: string): void {\n console.log(`${pc.yellow(\"⚠\")} ${message}`);\n}\n\nexport function error(message: string): void {\n console.error(`${pc.red(\"✗\")} ${message}`);\n}\n\nexport function dim(message: string): string {\n return pc.dim(message);\n}\n\nexport function bold(message: string): string {\n return pc.bold(message);\n}\n\nexport function link(url: string): string {\n return pc.cyan(pc.underline(url));\n}\n\nexport function table(rows: string[][], headers?: string[]): void {\n const allRows = headers ? [headers, ...rows] : rows;\n const colWidths: number[] = [];\n\n for (const row of allRows) {\n for (let i = 0; i < row.length; i++) {\n colWidths[i] = Math.max(colWidths[i] ?? 0, (row[i] ?? \"\").length);\n }\n }\n\n for (let i = 0; i < allRows.length; i++) {\n const row = allRows[i]!;\n const line = row\n .map((cell, j) => (cell ?? \"\").padEnd(colWidths[j] ?? 0))\n .join(\" \");\n\n if (i === 0 && headers) {\n console.log(pc.bold(line));\n console.log(colWidths.map((w) => \"─\".repeat(w)).join(\"──\"));\n } else {\n console.log(line);\n }\n }\n}\n","import { ConvexHttpClient } from \"convex/browser\";\nimport {\n type FunctionReference,\n type FunctionArgs,\n type FunctionReturnType,\n} from \"convex/server\";\nimport { getAuthConfig, type AuthConfig } from \"./global-config\";\nimport { CliError } from \"./errors\";\n\nlet clientInstance: ConvexHttpClient | null = null;\nlet cachedAuth: AuthConfig | null = null;\n\nasync function getConvexToken(auth: AuthConfig): Promise<string> {\n // The Convex /api/auth/convex/token endpoint is a GET that uses the bearer\n // plugin: it expects the raw session token ID (without the HMAC signature)\n // in an Authorization: Bearer header, then re-signs and verifies it.\n const url = `${auth.convexSiteUrl}/api/auth/convex/token`;\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${auth.sessionToken}`,\n },\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n console.error(`Token exchange failed: ${res.status} ${res.statusText}`);\n console.error(`URL: ${url}`);\n if (body) console.error(`Body: ${body}`);\n throw new CliError(\"Session expired. Please run `beakcrypt login` again.\");\n }\n\n const data = (await res.json()) as { token: string };\n return data.token;\n}\n\nexport async function getClient(): Promise<ConvexHttpClient> {\n const auth = await getAuthConfig();\n if (!auth) {\n throw new CliError(\"Not logged in. Run `beakcrypt login` first.\");\n }\n cachedAuth = auth;\n\n if (!clientInstance) {\n clientInstance = new ConvexHttpClient(auth.convexUrl);\n }\n\n const token = await getConvexToken(auth);\n clientInstance.setAuth(token);\n return clientInstance;\n}\n\nexport async function query<F extends FunctionReference<\"query\">>(\n fn: F,\n args: FunctionArgs<F>,\n): Promise<FunctionReturnType<F>> {\n const client = await getClient();\n return client.query(fn, args);\n}\n\nexport async function mutation<F extends FunctionReference<\"mutation\">>(\n fn: F,\n args: FunctionArgs<F>,\n): Promise<FunctionReturnType<F>> {\n const client = await getClient();\n return client.mutation(fn, args);\n}\n\nexport function getSessionToken(): string | null {\n return cachedAuth?.sessionToken ?? null;\n}\n\nexport function getSiteUrl(): string {\n if (!cachedAuth) throw new CliError(\"Not logged in.\");\n return cachedAuth.siteUrl;\n}\n","import prompts from \"prompts\";\nimport { CliError } from \"./errors\";\n\nexport function isInteractive(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n\nexport function requireInteractive(command: string): void {\n if (!isInteractive()) {\n throw new CliError(\n `Cannot run interactive prompts in non-interactive mode.`,\n `Run \\`beakcrypt ${command}\\` in an interactive terminal, or provide required flags.`,\n );\n }\n}\n\nexport async function select<T extends string>(opts: {\n message: string;\n choices: { title: string; value: T; description?: string }[];\n}): Promise<T> {\n const { value } = await prompts(\n {\n type: \"select\",\n name: \"value\",\n message: opts.message,\n choices: opts.choices,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as T;\n}\n\nexport async function confirm(\n message: string,\n initial = false,\n): Promise<boolean> {\n const { value } = await prompts(\n {\n type: \"confirm\",\n name: \"value\",\n message,\n initial,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as boolean;\n}\n\nexport async function text(opts: {\n message: string;\n placeholder?: string;\n validate?: (value: string) => string | true;\n}): Promise<string> {\n const { value } = await prompts(\n {\n type: \"text\",\n name: \"value\",\n message: opts.message,\n ...(opts.placeholder ? { initial: opts.placeholder } : {}),\n validate: opts.validate\n ? (v: string) => {\n const result = opts.validate!(v);\n return result === true ? true : result;\n }\n : undefined,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as string;\n}\n","import { clearAllConfig, isLoggedIn } from \"../lib/global-config\";\nimport * as interactive from \"../lib/interactive\";\nimport * as output from \"../lib/output\";\n\nexport async function logoutCommand(opts: { yes?: boolean }): Promise<void> {\n if (!isLoggedIn()) {\n output.info(\"Not currently logged in.\");\n return;\n }\n\n if (!opts.yes) {\n const confirmed = await interactive.confirm(\n \"This will remove all credentials and device keys. Continue?\",\n );\n if (!confirmed) return;\n }\n\n await clearAllConfig();\n output.success(\"Logged out. All credentials and keys removed.\");\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../lib/convex-client\";\nimport { CliError } from \"../lib/errors\";\nimport { ensureAuth } from \"../lib/context\";\nimport * as output from \"../lib/output\";\n\nexport async function whoamiCommand(): Promise<void> {\n await ensureAuth();\n\n const user = await query(api.auth.getCurrentUser, {});\n if (!user) {\n throw new CliError(\n \"Could not retrieve user info. Try `beakcrypt login` again.\",\n );\n }\n\n console.log();\n console.log(` ${output.bold(\"Email:\")} ${user.email}`);\n console.log(` ${output.bold(\"Name:\")} ${user.name}`);\n console.log();\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { getAuthConfig } from \"./global-config\";\nimport {\n getProjectConfig,\n saveProjectConfig,\n type ProjectConfig,\n} from \"./project-config\";\nimport { query, mutation } from \"./convex-client\";\nimport { unwrapResult, CliError } from \"./errors\";\nimport * as interactive from \"./interactive\";\nimport * as output from \"./output\";\nimport { loginCommand } from \"../commands/login\";\n\nexport interface ResolvedContext {\n orgId: string;\n orgSlug: string;\n projectId: string;\n projectName: string;\n envName: string;\n environmentId: string;\n}\n\ninterface ContextFlags {\n org?: string;\n project?: string;\n env?: string;\n}\n\nexport async function ensureAuth(): Promise<void> {\n const auth = await getAuthConfig();\n if (auth) return;\n\n if (!interactive.isInteractive()) {\n throw new CliError(\"Not logged in. Run `beakcrypt login` first.\");\n }\n\n const shouldLogin = await interactive.confirm(\n \"You're not logged in. Log in now?\",\n true,\n );\n if (!shouldLogin) process.exit(0);\n await loginCommand();\n}\n\nexport async function resolveContext(\n flags: ContextFlags,\n): Promise<ResolvedContext> {\n await ensureAuth();\n\n const projectConfig = await getProjectConfig();\n\n const orgId = flags.org\n ? await resolveOrgBySlug(flags.org)\n : projectConfig?.orgId;\n const orgSlug = flags.org ?? projectConfig?.orgSlug;\n const projectId = flags.project\n ? await resolveProjectByName(orgId!, flags.project)\n : projectConfig?.projectId;\n const projectName = flags.project ?? projectConfig?.projectName;\n const envName = flags.env ?? projectConfig?.defaultEnv;\n\n if (!orgId || !projectId || !envName || !orgSlug || !projectName) {\n if (!interactive.isInteractive()) {\n throw new CliError(\n \"No project linked in this directory.\",\n \"Run `beakcrypt link` to connect this directory to a project.\",\n );\n }\n\n const config = await interactiveLink();\n const envId = await resolveEnvId(\n config.projectId,\n flags.env ?? config.defaultEnv,\n );\n return {\n orgId: config.orgId,\n orgSlug: config.orgSlug,\n projectId: config.projectId,\n projectName: config.projectName,\n envName: flags.env ?? config.defaultEnv,\n environmentId: envId,\n };\n }\n\n const envId = await resolveEnvId(projectId, envName);\n return {\n orgId,\n orgSlug,\n projectId,\n projectName,\n envName,\n environmentId: envId,\n };\n}\n\nasync function resolveOrgBySlug(slug: string): Promise<string> {\n const result = await query(api.organizations.getBySlug, { slug });\n const org = unwrapResult(result);\n return org._id;\n}\n\nasync function resolveProjectByName(\n orgId: string,\n name: string,\n): Promise<string> {\n const result = await query(api.projects.getByName, {\n orgId: orgId as never,\n name,\n });\n const project = unwrapResult(result);\n return project._id;\n}\n\nasync function resolveEnvId(\n projectId: string,\n envName: string,\n): Promise<string> {\n if (envName === \"local\") {\n await mutation(api.environments.ensurePersonalLocal, {\n projectId: projectId as never,\n syncFromDev: false,\n });\n }\n\n const result = await query(api.environments.list, {\n projectId: projectId as never,\n });\n const envs = unwrapResult(result);\n const env = envs.find((e: { name: string }) => e.name === envName);\n if (!env) {\n throw new CliError(`Environment \"${envName}\" not found.`);\n }\n return env._id;\n}\n\nexport async function interactiveLink(): Promise<ProjectConfig> {\n interactive.requireInteractive(\"link\");\n\n const orgsResult = await query(api.organizations.list, {});\n const orgs = unwrapResult(orgsResult);\n\n if (orgs.length === 0) {\n throw new CliError(\"You don't belong to any organizations.\");\n }\n\n const orgId = await interactive.select({\n message: \"Select an organization:\",\n choices: orgs.map((o: { _id: string; name: string; slug: string }) => ({\n title: `${o.name} (${o.slug})`,\n value: o._id,\n })),\n });\n const selectedOrg = orgs.find((o: { _id: string }) => o._id === orgId)!;\n\n const action = await interactive.select({\n message: \"What would you like to do?\",\n choices: [\n { title: \"Link to an existing project\", value: \"link\" as const },\n { title: \"Create a new project\", value: \"create\" as const },\n ],\n });\n\n let projectId: string;\n let projectName: string;\n\n if (action === \"create\") {\n const name = await interactive.text({\n message: \"Enter project name:\",\n validate: (v: string) =>\n v.trim().length > 0 ? true : \"Project name is required\",\n });\n const createResult = await mutation(api.projects.create, {\n name: name.trim(),\n orgId: orgId as never,\n });\n const project = unwrapResult(createResult);\n projectId = project._id;\n projectName = project.name;\n output.success(`Created project \"${projectName}\" in ${selectedOrg.name}`);\n } else {\n const projectsResult = await query(api.projects.list, {\n orgId: orgId as never,\n });\n const projects = unwrapResult(projectsResult);\n\n if (projects.length === 0) {\n throw new CliError(\"No projects in this organization. Create one first.\");\n }\n\n projectId = await interactive.select({\n message: \"Select a project:\",\n choices: projects.map((p: { _id: string; name: string }) => ({\n title: p.name,\n value: p._id,\n })),\n });\n const selectedProject = projects.find(\n (p: { _id: string }) => p._id === projectId,\n )!;\n projectName = selectedProject.name;\n }\n\n await mutation(api.environments.ensurePersonalLocal, {\n projectId: projectId as never,\n syncFromDev: false,\n });\n\n const envsResult = await query(api.environments.list, {\n projectId: projectId as never,\n });\n const envs = unwrapResult(envsResult);\n\n const defaultEnv = await interactive.select({\n message: \"Select a default environment:\",\n choices: envs.map(\n (e: { _id: string; name: string; isPersonal?: boolean }) => ({\n title: e.isPersonal ? `${e.name} (personal)` : e.name,\n value: e.name,\n }),\n ),\n });\n\n const config: ProjectConfig = {\n orgId,\n orgSlug: selectedOrg.slug,\n projectId,\n projectName,\n defaultEnv,\n };\n\n const configDir = await saveProjectConfig(config);\n output.success(\n `Linked to ${selectedOrg.slug}/${projectName} (${defaultEnv})`,\n );\n output.info(`Created ${configDir}/project.json`);\n output.info(`Added .beakcrypt to .gitignore`);\n\n return config;\n}\n","import { mkdir, readFile, writeFile, appendFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\n\nexport interface ProjectConfig {\n orgId: string;\n orgSlug: string;\n projectId: string;\n projectName: string;\n defaultEnv: string;\n}\n\nconst CONFIG_DIR_NAME = \".beakcrypt\";\nconst CONFIG_FILE_NAME = \"project.json\";\n\nexport function findProjectConfigDir(startDir?: string): string | null {\n let dir = startDir ?? process.cwd();\n const root = dirname(dir) === dir ? dir : \"/\";\n\n while (true) {\n const configPath = join(dir, CONFIG_DIR_NAME, CONFIG_FILE_NAME);\n if (existsSync(configPath)) {\n return join(dir, CONFIG_DIR_NAME);\n }\n const parent = dirname(dir);\n if (parent === dir || dir === root) break;\n dir = parent;\n }\n return null;\n}\n\nexport async function getProjectConfig(\n startDir?: string,\n): Promise<ProjectConfig | null> {\n const configDir = findProjectConfigDir(startDir);\n if (!configDir) return null;\n try {\n const data = await readFile(join(configDir, CONFIG_FILE_NAME), \"utf-8\");\n return JSON.parse(data) as ProjectConfig;\n } catch {\n return null;\n }\n}\n\nexport async function saveProjectConfig(\n config: ProjectConfig,\n dir?: string,\n): Promise<string> {\n const baseDir = dir ?? process.cwd();\n const configDir = join(baseDir, CONFIG_DIR_NAME);\n await mkdir(configDir, { recursive: true });\n await writeFile(\n join(configDir, CONFIG_FILE_NAME),\n JSON.stringify(config, null, 2),\n );\n await ensureGitignore(baseDir);\n return configDir;\n}\n\nasync function ensureGitignore(baseDir: string): Promise<void> {\n const gitignorePath = join(baseDir, \".gitignore\");\n\n if (existsSync(gitignorePath)) {\n const content = await readFile(gitignorePath, \"utf-8\");\n if (content.includes(CONFIG_DIR_NAME)) return;\n const suffix = content.endsWith(\"\\n\") ? \"\" : \"\\n\";\n await appendFile(\n gitignorePath,\n `${suffix}\\n# Beakcrypt CLI\\n${CONFIG_DIR_NAME}\\n`,\n );\n } else {\n await writeFile(gitignorePath, `# Beakcrypt CLI\\n${CONFIG_DIR_NAME}\\n`);\n }\n}\n","import ora from \"ora\";\nimport open from \"open\";\nimport {\n generateKeyPair,\n unwrapOrgKey as cryptoUnwrapOrgKey,\n} from \"@beakcrypt/crypto\";\nimport { api } from \"@beakcrypt/convex\";\nimport { query, mutation, getSessionToken, getSiteUrl } from \"./convex-client\";\nimport {\n getStoredKey,\n saveKey,\n updateWrappedOrgKey,\n type StoredKeyData,\n} from \"./key-store\";\nimport { unwrapResult } from \"./errors\";\nimport { getProjectConfig } from \"./project-config\";\nimport * as output from \"./output\";\n\nexport async function ensureOrgKey(orgId: string): Promise<string> {\n const stored = await getStoredKey(orgId);\n\n if (stored?.wrappedOrgKey) {\n return await cryptoUnwrapOrgKey(stored.wrappedOrgKey, stored.privateKey);\n }\n\n if (stored?.keyId) {\n // Key exists but no wrapped org key — check backend for approval\n const keyResult = await query(api.keys.getMyKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(stored.publicKey),\n });\n const keyRecord = unwrapResult(keyResult);\n\n if (keyRecord?.status === \"active\" && keyRecord.wrappedOrgKey) {\n await updateWrappedOrgKey(orgId, keyRecord.wrappedOrgKey);\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n stored.privateKey,\n );\n }\n\n if (keyRecord?.status === \"pending\") {\n return await waitForApproval(orgId, stored);\n }\n\n throw new Error(\n \"Device key is not active. An admin may need to approve this device.\",\n );\n }\n\n // No key pair — register new device\n return await registerNewDevice(orgId);\n}\n\nasync function registerNewDevice(orgId: string): Promise<string> {\n const sessionToken = getSessionToken();\n if (!sessionToken) throw new Error(\"Not logged in\");\n\n const spinner = ora(\"Generating device keys...\").start();\n\n let keyPair: Awaited<ReturnType<typeof generateKeyPair>>;\n let keyRecord: ReturnType<typeof unwrapResult<any>>;\n\n try {\n keyPair = await generateKeyPair();\n\n spinner.text = \"Registering device with organization...\";\n\n const result = await mutation(api.keys.registerKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(keyPair.publicKey),\n sessionToken,\n });\n\n keyRecord = unwrapResult(result);\n spinner.stop();\n } catch (err) {\n spinner.fail(\"Device registration failed.\");\n throw err;\n }\n\n const stored: StoredKeyData = {\n publicKey: keyPair.publicKey,\n privateKey: keyPair.privateKey,\n keyId: keyRecord._id,\n wrappedOrgKey: keyRecord.wrappedOrgKey,\n };\n\n await saveKey(orgId, stored);\n\n if (keyRecord.status === \"active\" && keyRecord.wrappedOrgKey) {\n output.success(\"Device registered and activated.\");\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n keyPair.privateKey,\n );\n }\n\n // Pending approval\n return await waitForApproval(orgId, stored);\n}\n\nasync function waitForApproval(\n orgId: string,\n stored: StoredKeyData,\n): Promise<string> {\n // Try to open the browser for auto-approval (same-user, new device scenario)\n try {\n const projectConfig = await getProjectConfig();\n if (projectConfig?.orgSlug && stored.keyId) {\n const siteUrl = getSiteUrl();\n const approveUrl = `${siteUrl}/${projectConfig.orgSlug}/sessions?approveSession=${stored.keyId}`;\n\n output.info(\"Opening browser to approve this device...\");\n console.log(`${output.dim(\"If the browser doesn't open, visit:\")}`);\n console.log(`${output.link(approveUrl)}\\n`);\n\n try {\n await open(approveUrl);\n } catch {\n // Browser failed to open — URL already printed above\n }\n }\n } catch {\n // Could not determine approval URL — fall through to polling\n }\n\n const spinner = ora(\"Waiting for device to be approved...\").start();\n spinner.indent = 2;\n\n while (true) {\n await new Promise((r) => setTimeout(r, 5000));\n\n const result = await query(api.keys.getMyKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(stored.publicKey),\n });\n const keyRecord = unwrapResult(result);\n\n if (keyRecord?.status === \"active\" && keyRecord.wrappedOrgKey) {\n spinner.stop();\n await updateWrappedOrgKey(orgId, keyRecord.wrappedOrgKey);\n output.success(\"Device approved!\");\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n stored.privateKey,\n );\n }\n\n if (keyRecord?.status === \"revoked\") {\n spinner.stop();\n throw new Error(\"Device key was revoked. Re-run `beakcrypt login`.\");\n }\n }\n}\n","export interface ExportedKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n}\n\nexport const RSA_ALGORITHM: RsaHashedKeyGenParams = {\n name: \"RSA-OAEP\",\n modulusLength: 4096,\n publicExponent: new Uint8Array([1, 0, 1]),\n hash: \"SHA-256\",\n};\n\nexport const AES_ALGORITHM = \"AES-GCM\";\nexport const AES_KEY_LENGTH = 256;\nexport const IV_BYTE_LENGTH = 12;\n\nexport async function generateKeyPair(): Promise<ExportedKeyPair> {\n const keyPair = await crypto.subtle.generateKey(RSA_ALGORITHM, true, [\n \"wrapKey\",\n \"unwrapKey\",\n ]);\n\n const [publicKey, privateKey] = await Promise.all([\n crypto.subtle.exportKey(\"jwk\", keyPair.publicKey),\n crypto.subtle.exportKey(\"jwk\", keyPair.privateKey),\n ]);\n\n return { publicKey, privateKey };\n}\n\nexport async function generateOrgKey(): Promise<string> {\n const key = await crypto.subtle.generateKey(\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const raw = await crypto.subtle.exportKey(\"raw\", key);\n return bufferToBase64(raw);\n}\n\nexport async function wrapOrgKey(\n orgKeyBase64: string,\n publicKeyJwk: JsonWebKey,\n): Promise<string> {\n const publicKey = await crypto.subtle.importKey(\n \"jwk\",\n publicKeyJwk,\n RSA_ALGORITHM,\n false,\n [\"wrapKey\"],\n );\n\n const orgKey = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const wrapped = await crypto.subtle.wrapKey(\"raw\", orgKey, publicKey, {\n name: \"RSA-OAEP\",\n });\n\n return bufferToBase64(wrapped);\n}\n\nexport async function unwrapOrgKey(\n wrappedKeyBase64: string,\n privateKeyJwk: JsonWebKey,\n): Promise<string> {\n const privateKey = await crypto.subtle.importKey(\n \"jwk\",\n privateKeyJwk,\n RSA_ALGORITHM,\n false,\n [\"unwrapKey\"],\n );\n\n const orgKey = await crypto.subtle.unwrapKey(\n \"raw\",\n base64ToBuffer(wrappedKeyBase64),\n privateKey,\n { name: \"RSA-OAEP\" },\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const raw = await crypto.subtle.exportKey(\"raw\", orgKey);\n return bufferToBase64(raw);\n}\n\nexport async function encryptSecret(\n plaintext: string,\n orgKeyBase64: string,\n): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM },\n false,\n [\"encrypt\"],\n );\n\n const iv = crypto.getRandomValues(new Uint8Array(IV_BYTE_LENGTH));\n const encoded = new TextEncoder().encode(plaintext);\n\n const ciphertext = await crypto.subtle.encrypt(\n { name: AES_ALGORITHM, iv },\n key,\n encoded,\n );\n\n return `${bufferToBase64(iv.buffer)}:${bufferToBase64(ciphertext)}`;\n}\n\nexport async function decryptSecret(\n encryptedValue: string,\n orgKeyBase64: string,\n): Promise<string> {\n const [ivBase64, ciphertextBase64] = encryptedValue.split(\":\");\n if (!ivBase64 || !ciphertextBase64) {\n throw new Error(\n \"Invalid encrypted value format — expected 'iv:ciphertext'\",\n );\n }\n\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM },\n false,\n [\"decrypt\"],\n );\n\n const decrypted = await crypto.subtle.decrypt(\n { name: AES_ALGORITHM, iv: base64ToBuffer(ivBase64) },\n key,\n base64ToBuffer(ciphertextBase64),\n );\n\n return new TextDecoder().decode(decrypted);\n}\n\nexport function bufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n return btoa(binary);\n}\n\nexport function base64ToBuffer(base64: string): ArrayBuffer {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n","import { mkdir, readFile, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"./global-config\";\n\nexport interface StoredKeyData {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n wrappedOrgKey?: string;\n}\n\nfunction getKeysDir(): string {\n return join(getConfigDir(), \"keys\");\n}\n\nfunction getKeyFile(orgId: string): string {\n return join(getKeysDir(), `${orgId}.json`);\n}\n\nexport async function getStoredKey(\n orgId: string,\n): Promise<StoredKeyData | null> {\n const file = getKeyFile(orgId);\n if (!existsSync(file)) return null;\n try {\n const data = await readFile(file, \"utf-8\");\n return JSON.parse(data) as StoredKeyData;\n } catch {\n return null;\n }\n}\n\nexport async function saveKey(\n orgId: string,\n data: StoredKeyData,\n): Promise<void> {\n const dir = getKeysDir();\n await mkdir(dir, { recursive: true });\n await writeFile(getKeyFile(orgId), JSON.stringify(data, null, 2), {\n mode: 0o600,\n });\n}\n\nexport async function updateWrappedOrgKey(\n orgId: string,\n wrappedOrgKey: string,\n): Promise<void> {\n const existing = await getStoredKey(orgId);\n if (!existing) throw new Error(`No key stored for org ${orgId}`);\n existing.wrappedOrgKey = wrappedOrgKey;\n await saveKey(orgId, existing);\n}\n\nexport async function removeKey(orgId: string): Promise<void> {\n const file = getKeyFile(orgId);\n if (existsSync(file)) {\n await rm(file);\n }\n}\n\nexport async function clearAllKeys(): Promise<void> {\n const dir = getKeysDir();\n if (existsSync(dir)) {\n await rm(dir, { recursive: true });\n }\n}\n","import { ensureAuth, interactiveLink } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\n\nexport async function linkCommand(): Promise<void> {\n await ensureAuth();\n const config = await interactiveLink();\n await ensureOrgKey(config.orgId);\n}\n","import { resolve } from \"node:path\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { decryptSecret } from \"@beakcrypt/crypto\";\nimport { query } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { writeEnvFile } from \"../lib/env-file\";\nimport { unwrapResult } from \"../lib/errors\";\nimport * as output from \"../lib/output\";\n\nexport async function pullCommand(\n file: string | undefined,\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n const filePath = resolve(file ?? \".env.local\");\n const ctx = await resolveContext(opts);\n\n const spinner = ora(\"Pulling secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n const decrypted: Record<string, string> = {};\n for (const secret of secrets) {\n decrypted[secret.key] = await decryptSecret(secret.encryptedValue, orgKey);\n }\n\n await writeEnvFile(filePath, decrypted);\n spinner.stop();\n\n output.success(\n `Pulled ${secrets.length} secret${secrets.length === 1 ? \"\" : \"s\"} to ${file ?? \".env.local\"}`,\n );\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\n\nexport function parseEnvFile(content: string): Record<string, string> {\n const env: Record<string, string> = {};\n\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // Strip surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n if (key) {\n env[key] = value;\n }\n }\n\n return env;\n}\n\nexport function serializeEnvFile(env: Record<string, string>): string {\n const lines: string[] = [\n \"# Generated by Beakcrypt CLI\",\n `# ${new Date().toISOString()}`,\n \"\",\n ];\n\n const sorted = Object.entries(env).sort(([a], [b]) => a.localeCompare(b));\n\n for (const [key, value] of sorted) {\n // Quote values that contain spaces, #, or newlines\n if (/[\\s#]/.test(value)) {\n lines.push(`${key}=\"${value}\"`);\n } else {\n lines.push(`${key}=${value}`);\n }\n }\n\n lines.push(\"\"); // trailing newline\n return lines.join(\"\\n\");\n}\n\nexport async function readEnvFile(\n filePath: string,\n): Promise<Record<string, string>> {\n if (!existsSync(filePath)) {\n return {};\n }\n const content = await readFile(filePath, \"utf-8\");\n return parseEnvFile(content);\n}\n\nexport async function writeEnvFile(\n filePath: string,\n env: Record<string, string>,\n): Promise<void> {\n await writeFile(filePath, serializeEnvFile(env));\n}\n","import { resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { encryptSecret } from \"@beakcrypt/crypto\";\nimport { mutation } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { readEnvFile } from \"../lib/env-file\";\nimport { unwrapResult, CliError } from \"../lib/errors\";\nimport * as interactive from \"../lib/interactive\";\nimport * as output from \"../lib/output\";\n\nexport async function pushCommand(\n file: string | undefined,\n opts: { org?: string; project?: string; env?: string; yes?: boolean },\n): Promise<void> {\n const filePath = resolve(file ?? \".env.local\");\n\n if (!existsSync(filePath)) {\n throw new CliError(`File not found: ${filePath}`);\n }\n\n const ctx = await resolveContext(opts);\n const env = await readEnvFile(filePath);\n const keys = Object.keys(env);\n\n if (keys.length === 0) {\n output.info(\"No secrets found in file.\");\n return;\n }\n\n if (!opts.yes) {\n output.info(\n `Pushing ${keys.length} secret${keys.length === 1 ? \"\" : \"s\"} to ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})`,\n );\n const confirmed = await interactive.confirm(\"Continue?\", true);\n if (!confirmed) return;\n }\n\n const spinner = ora(\"Encrypting and pushing secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const encryptedSecrets: { key: string; encryptedValue: string }[] = [];\n for (const [key, value] of Object.entries(env)) {\n const encrypted = await encryptSecret(value, orgKey);\n encryptedSecrets.push({ key, encryptedValue: encrypted });\n }\n\n const result = await mutation(api.secrets.bulkCreate, {\n environmentId: ctx.environmentId as never,\n secrets: encryptedSecrets,\n overwrite: true,\n });\n const summary = unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Pushed ${summary.created} created, ${summary.updated} updated, ${summary.skipped} skipped`,\n );\n}\n","import { spawn } from \"node:child_process\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { decryptSecret } from \"@beakcrypt/crypto\";\nimport { query } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { unwrapResult, CliError } from \"../lib/errors\";\n\nexport async function runCommand(\n args: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (args.length === 0) {\n throw new CliError(\n \"No command provided. Usage: beakcrypt run -- <command>\",\n );\n }\n\n const ctx = await resolveContext(opts);\n\n const spinner = ora(\"Loading secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n const decrypted: Record<string, string> = {};\n for (const secret of secrets) {\n decrypted[secret.key] = await decryptSecret(secret.encryptedValue, orgKey);\n }\n\n spinner.stop();\n\n const [command, ...commandArgs] = args;\n const child = spawn(command!, commandArgs, {\n stdio: \"inherit\",\n env: { ...process.env, ...decrypted },\n });\n\n child.on(\"close\", (code) => {\n process.exit(code ?? 0);\n });\n\n child.on(\"error\", (err) => {\n throw new CliError(`Failed to run command: ${err.message}`);\n });\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsListCommand(opts: {\n org?: string;\n project?: string;\n env?: string;\n}): Promise<void> {\n const ctx = await resolveContext(opts);\n\n const result = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(result);\n\n if (secrets.length === 0) {\n output.info(\n `No secrets in ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})`,\n );\n return;\n }\n\n console.log(\n `\\n${output.bold(`${ctx.orgSlug}/${ctx.projectName}`)} ${output.dim(`(${ctx.envName})`)}\\n`,\n );\n\n output.table(\n secrets.map((s: { key: string }) => [s.key, \"••••••••\"]),\n [\"Key\", \"Value\"],\n );\n\n console.log(\n `\\n${output.dim(`${secrets.length} secret${secrets.length === 1 ? \"\" : \"s\"}`)}\\n`,\n );\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { encryptSecret } from \"@beakcrypt/crypto\";\nimport { mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { ensureOrgKey } from \"../../lib/key-manager\";\nimport { unwrapResult, CliError } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsSetCommand(\n pairs: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (pairs.length === 0) {\n throw new CliError(\n \"No key=value pairs provided. Usage: beakcrypt secrets set KEY=VALUE\",\n );\n }\n\n const parsed: { key: string; value: string }[] = [];\n for (const pair of pairs) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n throw new CliError(`Invalid format: \"${pair}\". Use KEY=VALUE.`);\n }\n parsed.push({\n key: pair.slice(0, eqIndex),\n value: pair.slice(eqIndex + 1),\n });\n }\n\n const ctx = await resolveContext(opts);\n const spinner = ora(\"Setting secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const encryptedSecrets: { key: string; encryptedValue: string }[] = [];\n for (const { key, value } of parsed) {\n const encrypted = await encryptSecret(value, orgKey);\n encryptedSecrets.push({ key, encryptedValue: encrypted });\n }\n\n const result = await mutation(api.secrets.bulkCreate, {\n environmentId: ctx.environmentId as never,\n secrets: encryptedSecrets,\n overwrite: true,\n });\n unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Set ${parsed.length} secret${parsed.length === 1 ? \"\" : \"s\"} in ${ctx.envName}`,\n );\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { query, mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult, CliError } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsRemoveCommand(\n keys: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (keys.length === 0) {\n throw new CliError(\n \"No keys provided. Usage: beakcrypt secrets remove KEY [KEY2...]\",\n );\n }\n\n const ctx = await resolveContext(opts);\n const spinner = ora(\"Removing secrets...\").start();\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n let removed = 0;\n const notFound: string[] = [];\n\n for (const key of keys) {\n const secret = secrets.find((s: { key: string }) => s.key === key);\n if (secret) {\n const result = await mutation(api.secrets.remove, {\n id: secret._id as never,\n });\n unwrapResult(result);\n removed++;\n } else {\n notFound.push(key);\n }\n }\n\n spinner.stop();\n\n if (removed > 0) {\n output.success(\n `Removed ${removed} secret${removed === 1 ? \"\" : \"s\"} from ${ctx.envName}`,\n );\n }\n if (notFound.length > 0) {\n output.warn(`Not found: ${notFound.join(\", \")}`);\n }\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as interactive from \"../../lib/interactive\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsClearCommand(opts: {\n org?: string;\n project?: string;\n env?: string;\n yes?: boolean;\n}): Promise<void> {\n const ctx = await resolveContext(opts);\n\n if (!opts.yes) {\n const confirmed = await interactive.confirm(\n `Delete ALL secrets in ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})?`,\n );\n if (!confirmed) return;\n }\n\n const spinner = ora(\"Clearing secrets...\").start();\n\n const result = await mutation(api.secrets.removeAll, {\n environmentId: ctx.environmentId as never,\n });\n const summary = unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Deleted ${summary.deleted} secret${summary.deleted === 1 ? \"\" : \"s\"}`,\n );\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { ensureAuth } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function orgListCommand(): Promise<void> {\n await ensureAuth();\n\n const result = await query(api.organizations.list, {});\n const orgs = unwrapResult(result);\n\n if (orgs.length === 0) {\n output.info(\"You don't belong to any organizations.\");\n return;\n }\n\n console.log();\n output.table(\n orgs.map((o: { name: string; slug: string }) => [o.name, o.slug]),\n [\"Name\", \"Slug\"],\n );\n console.log();\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function envListCommand(opts: {\n org?: string;\n project?: string;\n}): Promise<void> {\n const ctx = await resolveContext({ ...opts, env: \"development\" });\n\n const result = await query(api.environments.list, {\n projectId: ctx.projectId as never,\n });\n const envs = unwrapResult(result);\n\n if (envs.length === 0) {\n output.info(\"No environments found.\");\n return;\n }\n\n console.log(\n `\\n${output.bold(`${ctx.orgSlug}/${ctx.projectName}`)} environments:\\n`,\n );\n\n output.table(\n envs.map((e: { name: string; isPersonal?: boolean }) => [\n e.name,\n e.isPersonal ? \"personal\" : \"shared\",\n ]),\n [\"Name\", \"Type\"],\n );\n console.log();\n}\n","import pc from \"picocolors\";\nimport { getAuthConfig } from \"./lib/global-config\";\nimport { getProjectConfig } from \"./lib/project-config\";\nimport * as interactive from \"./lib/interactive\";\nimport * as output from \"./lib/output\";\nimport { loginCommand } from \"./commands/login\";\nimport { linkCommand } from \"./commands/link\";\nimport { pullCommand } from \"./commands/pull\";\nimport { pushCommand } from \"./commands/push\";\nimport { secretsListCommand } from \"./commands/secrets/list\";\n\nexport async function interactiveMode(): Promise<void> {\n interactive.requireInteractive(\"(no args)\");\n\n console.log(`\\n${pc.bold(\"Beakcrypt\")} ${pc.dim(\"v0.1.0\")}\\n`);\n\n // Check auth\n const auth = await getAuthConfig();\n if (!auth) {\n const shouldLogin = await interactive.confirm(\n \"You're not logged in. Log in now?\",\n true,\n );\n if (!shouldLogin) process.exit(0);\n await loginCommand();\n }\n\n // Check project link\n const config = await getProjectConfig();\n if (!config) {\n output.info(\"No project linked in this directory.\");\n const shouldLink = await interactive.confirm(\n \"Link to a project now?\",\n true,\n );\n if (!shouldLink) process.exit(0);\n await linkCommand();\n return;\n }\n\n // Show linked project and action menu\n console.log(\n `Linked to ${output.bold(`${config.orgSlug}/${config.projectName}`)} ${output.dim(`(${config.defaultEnv}`)})`,\n );\n console.log();\n\n const action = await interactive.select({\n message: \"What would you like to do?\",\n choices: [\n { title: \"Pull secrets (.env.local)\", value: \"pull\" as const },\n { title: \"Push secrets (.env.local)\", value: \"push\" as const },\n { title: \"List secrets\", value: \"list\" as const },\n { title: \"Change project link\", value: \"link\" as const },\n ],\n });\n\n switch (action) {\n case \"pull\":\n await pullCommand(undefined, {});\n break;\n case \"push\":\n await pushCommand(undefined, {});\n break;\n case \"list\":\n await secretsListCommand({});\n break;\n case \"link\":\n await linkCommand();\n break;\n }\n}\n"],"mappings":"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","names":["pc","pc","pc","resolve","pc","api","api","mkdir","readFile","writeFile","existsSync","join","envId","api","org","env","api","ora","open","api","mkdir","readFile","writeFile","rm","existsSync","join","join","existsSync","readFile","mkdir","writeFile","api","ora","open","ora","api","readFile","writeFile","existsSync","env","ora","api","secrets","resolve","existsSync","ora","api","resolve","existsSync","env","ora","api","ora","api","ora","api","secrets","api","api","secrets","ora","api","ora","api","ora","api","ora","api","secrets","ora","api","ora","api","api","api","api","api","pc","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/errors.ts","../../convex/src/_generated/api.js","../src/lib/global-config.ts","../src/lib/auth.ts","../src/lib/output.ts","../src/lib/convex-client.ts","../src/commands/login.ts","../src/lib/interactive.ts","../src/commands/logout.ts","../src/lib/project-config.ts","../src/lib/context.ts","../src/commands/whoami.ts","../src/lib/key-manager.ts","../../crypto/src/core.ts","../src/lib/key-store.ts","../src/commands/link.ts","../src/commands/pull.ts","../src/lib/env-file.ts","../src/commands/push.ts","../src/commands/run.ts","../src/commands/secrets/list.ts","../src/commands/secrets/set.ts","../src/commands/secrets/remove.ts","../src/commands/secrets/clear.ts","../src/commands/org/list.ts","../src/commands/env/list.ts","../src/interactive-mode.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { handleError } from \"./lib/errors\";\nimport { loginCommand } from \"./commands/login\";\nimport { logoutCommand } from \"./commands/logout\";\nimport { whoamiCommand } from \"./commands/whoami\";\nimport { linkCommand } from \"./commands/link\";\nimport { pullCommand } from \"./commands/pull\";\nimport { pushCommand } from \"./commands/push\";\nimport { runCommand } from \"./commands/run\";\nimport { secretsListCommand } from \"./commands/secrets/list\";\nimport { secretsSetCommand } from \"./commands/secrets/set\";\nimport { secretsRemoveCommand } from \"./commands/secrets/remove\";\nimport { secretsClearCommand } from \"./commands/secrets/clear\";\nimport { orgListCommand } from \"./commands/org/list\";\nimport { envListCommand } from \"./commands/env/list\";\nimport { interactiveMode } from \"./interactive-mode\";\n\nconst program = new Command();\n\nprogram\n .name(\"beakcrypt\")\n .description(\"Secure environment variable management with E2E encryption\")\n .version(\"0.1.0\")\n .action(async () => {\n try {\n await interactiveMode();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Auth commands\nprogram\n .command(\"login\")\n .description(\"Log in to Beakcrypt via GitHub OAuth\")\n .action(async () => {\n try {\n await loginCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Log out and remove all credentials\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n await logoutCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show current user info\")\n .action(async () => {\n try {\n await whoamiCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Project linking\nprogram\n .command(\"link\")\n .description(\"Link this directory to a Beakcrypt project\")\n .action(async () => {\n try {\n await linkCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Secret sync commands\nprogram\n .command(\"pull [file]\")\n .description(\"Pull secrets to a local .env file\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (file, opts) => {\n try {\n await pullCommand(file, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"push [file]\")\n .description(\"Push secrets from a local .env file\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (file, opts) => {\n try {\n await pushCommand(file, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"run\")\n .description(\"Run a command with injected secrets\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .allowUnknownOption()\n .action(async (opts, cmd) => {\n try {\n await runCommand(cmd.args, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\n// Secrets subcommands\nconst secrets = program.command(\"secrets\").description(\"Manage secrets\");\n\nsecrets\n .command(\"list\")\n .description(\"List secrets (values masked)\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (opts) => {\n try {\n await secretsListCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"set <pairs...>\")\n .description(\"Set secrets (KEY=VALUE)\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (pairs, opts) => {\n try {\n await secretsSetCommand(pairs, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"remove <keys...>\")\n .description(\"Remove secrets by key\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (keys, opts) => {\n try {\n await secretsRemoveCommand(keys, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"clear\")\n .description(\"Delete all secrets in an environment\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n await secretsClearCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\n// Org subcommands\nconst org = program.command(\"org\").description(\"Manage organizations\");\n\norg\n .command(\"list\")\n .description(\"List your organizations\")\n .action(async () => {\n try {\n await orgListCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Env subcommands\nconst env = program.command(\"env\").description(\"Manage environments\");\n\nenv\n .command(\"list\")\n .description(\"List environments for the linked project\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .action(async (opts) => {\n try {\n await envListCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram.parse();\n","import pc from \"picocolors\";\nimport type { Result } from \"@beakcrypt/shared\";\n\nexport class CliError extends Error {\n constructor(\n message: string,\n public readonly hint?: string,\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\nexport function handleResultError(result: {\n ok: false;\n code: string;\n error: string;\n}): never {\n throw new CliError(result.error, `Error code: ${result.code}`);\n}\n\nexport function unwrapResult<T>(result: Result<T>): T {\n if (!result.ok) {\n handleResultError(result);\n }\n return result.data;\n}\n\nexport function handleError(error: unknown): void {\n if (error instanceof CliError) {\n console.error(`\\n${pc.red(\"Error:\")} ${error.message}`);\n if (error.hint) {\n console.error(`${pc.dim(error.hint)}`);\n }\n } else if (error instanceof Error) {\n console.error(`\\n${pc.red(\"Error:\")} ${error.message}`);\n } else {\n console.error(`\\n${pc.red(\"Error:\")} An unexpected error occurred.`);\n }\n process.exit(1);\n}\n","/* eslint-disable */\n/**\n * Generated `api` utility.\n *\n * THIS CODE IS AUTOMATICALLY GENERATED.\n *\n * To regenerate, run `npx convex dev`.\n * @module\n */\n\nimport { anyApi, componentsGeneric } from \"convex/server\";\n\n/**\n * A utility for referencing Convex functions in your app's API.\n *\n * Usage:\n * ```js\n * const myFunctionReference = api.myModule.myFunction;\n * ```\n */\nexport const api = anyApi;\nexport const internal = anyApi;\nexport const components = componentsGeneric();\n","import { mkdir, readFile, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface AuthConfig {\n sessionToken: string;\n convexUrl: string;\n convexSiteUrl: string;\n siteUrl: string;\n}\n\nconst CONFIG_DIR = join(homedir(), \".beakcrypt\");\nconst AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport async function ensureConfigDir(): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n}\n\nexport async function getAuthConfig(): Promise<AuthConfig | null> {\n if (!existsSync(AUTH_FILE)) return null;\n try {\n const data = await readFile(AUTH_FILE, \"utf-8\");\n return JSON.parse(data) as AuthConfig;\n } catch {\n return null;\n }\n}\n\nexport async function saveAuthConfig(config: AuthConfig): Promise<void> {\n await ensureConfigDir();\n await writeFile(AUTH_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport async function clearAuthConfig(): Promise<void> {\n if (existsSync(AUTH_FILE)) {\n await rm(AUTH_FILE);\n }\n}\n\nexport async function clearAllConfig(): Promise<void> {\n if (existsSync(CONFIG_DIR)) {\n await rm(CONFIG_DIR, { recursive: true });\n }\n}\n\nexport function isLoggedIn(): boolean {\n return existsSync(AUTH_FILE);\n}\n","import {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport ora from \"ora\";\nimport pc from \"picocolors\";\nimport { saveAuthConfig, type AuthConfig } from \"./global-config\";\nimport { CliError } from \"./errors\";\nimport * as output from \"./output\";\n\ninterface AuthResult {\n sessionToken: string;\n}\n\nfunction startCallbackServer(): Promise<{\n port: number;\n waitForToken: () => Promise<AuthResult>;\n}> {\n return new Promise((resolve, reject) => {\n let resolveToken: (result: AuthResult) => void;\n const tokenPromise = new Promise<AuthResult>((res) => {\n resolveToken = res;\n });\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url ?? \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const sessionToken = url.searchParams.get(\"session_token\");\n if (sessionToken) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"display:flex;justify-content:center;align-items:center;height:100vh;font-family:system-ui;background:#0a0a0a;color:#fafafa\">\n\t\t\t\t\t\t\t\t<div style=\"text-align:center\">\n\t\t\t\t\t\t\t\t\t<h1>Authenticated!</h1>\n\t\t\t\t\t\t\t\t\t<p>You can close this tab and return to the terminal.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n resolveToken!({ sessionToken });\n setTimeout(() => server.close(), 500);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing session_token parameter\");\n }\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n });\n\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n reject(new Error(\"Failed to start callback server\"));\n return;\n }\n resolve({\n port: addr.port,\n waitForToken: () => tokenPromise,\n });\n });\n\n server.on(\"error\", reject);\n });\n}\n\nexport async function loginFlow(\n siteUrl: string,\n convexUrl: string,\n convexSiteUrl: string,\n): Promise<AuthConfig> {\n const { port, waitForToken } = await startCallbackServer();\n const callbackUrl = `http://localhost:${port}/callback`;\n const loginUrl = `${siteUrl}/auth/cli?callback=${encodeURIComponent(callbackUrl)}`;\n\n const isTTY = process.stdin.isTTY;\n\n if (isTTY) {\n output.info(`Opening browser to log in...`);\n console.log(`${pc.dim(\"If the browser doesn't open, visit:\")}`);\n console.log(`${output.link(loginUrl)}\\n`);\n\n try {\n await open(loginUrl);\n } catch {\n // Browser failed to open — URL already printed above\n }\n } else {\n console.log(`Visit this URL to log in:\\n${output.link(loginUrl)}\\n`);\n }\n\n const spinner = ora(\"Waiting for authentication...\").start();\n\n const result = await waitForToken();\n spinner.stop();\n\n const config: AuthConfig = {\n sessionToken: result.sessionToken,\n convexUrl,\n convexSiteUrl,\n siteUrl,\n };\n\n await saveAuthConfig(config);\n return config;\n}\n\nexport function getDefaultUrls(): {\n siteUrl: string;\n convexUrl: string;\n convexSiteUrl: string;\n} {\n return {\n siteUrl: process.env.BEAKCRYPT_SITE_URL ?? \"https://app.beakcrypt.com\",\n convexUrl: process.env.BEAKCRYPT_CONVEX_URL ?? \"\",\n convexSiteUrl: process.env.BEAKCRYPT_CONVEX_SITE_URL ?? \"\",\n };\n}\n\nexport function validateUrls(urls: {\n convexUrl: string;\n convexSiteUrl: string;\n}): void {\n if (!urls.convexUrl) {\n throw new CliError(\n \"BEAKCRYPT_CONVEX_URL is not configured.\",\n \"Set the BEAKCRYPT_CONVEX_URL environment variable or configure it in ~/.beakcrypt/auth.json\",\n );\n }\n if (!urls.convexSiteUrl) {\n throw new CliError(\n \"BEAKCRYPT_CONVEX_SITE_URL is not configured.\",\n \"Set the BEAKCRYPT_CONVEX_SITE_URL environment variable or configure it in ~/.beakcrypt/auth.json\",\n );\n }\n}\n","import pc from \"picocolors\";\n\nexport function success(message: string): void {\n console.log(`${pc.green(\"✓\")} ${message}`);\n}\n\nexport function info(message: string): void {\n console.log(`${pc.blue(\"ℹ\")} ${message}`);\n}\n\nexport function warn(message: string): void {\n console.log(`${pc.yellow(\"⚠\")} ${message}`);\n}\n\nexport function error(message: string): void {\n console.error(`${pc.red(\"✗\")} ${message}`);\n}\n\nexport function dim(message: string): string {\n return pc.dim(message);\n}\n\nexport function bold(message: string): string {\n return pc.bold(message);\n}\n\nexport function link(url: string): string {\n return pc.cyan(pc.underline(url));\n}\n\nexport function table(rows: string[][], headers?: string[]): void {\n const allRows = headers ? [headers, ...rows] : rows;\n const colWidths: number[] = [];\n\n for (const row of allRows) {\n for (let i = 0; i < row.length; i++) {\n colWidths[i] = Math.max(colWidths[i] ?? 0, (row[i] ?? \"\").length);\n }\n }\n\n for (let i = 0; i < allRows.length; i++) {\n const row = allRows[i]!;\n const line = row\n .map((cell, j) => (cell ?? \"\").padEnd(colWidths[j] ?? 0))\n .join(\" \");\n\n if (i === 0 && headers) {\n console.log(pc.bold(line));\n console.log(colWidths.map((w) => \"─\".repeat(w)).join(\"──\"));\n } else {\n console.log(line);\n }\n }\n}\n","import { ConvexHttpClient } from \"convex/browser\";\nimport {\n type FunctionReference,\n type FunctionArgs,\n type FunctionReturnType,\n} from \"convex/server\";\nimport { getAuthConfig, type AuthConfig } from \"./global-config\";\nimport { CliError } from \"./errors\";\n\nlet clientInstance: ConvexHttpClient | null = null;\nlet cachedAuth: AuthConfig | null = null;\n\nasync function getConvexToken(auth: AuthConfig): Promise<string> {\n // The Convex /api/auth/convex/token endpoint is a GET that uses the bearer\n // plugin: it expects the raw session token ID (without the HMAC signature)\n // in an Authorization: Bearer header, then re-signs and verifies it.\n const url = `${auth.convexSiteUrl}/api/auth/convex/token`;\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${auth.sessionToken}`,\n },\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n console.error(`Token exchange failed: ${res.status} ${res.statusText}`);\n console.error(`URL: ${url}`);\n if (body) console.error(`Body: ${body}`);\n throw new CliError(\"Session expired. Please run `beakcrypt login` again.\");\n }\n\n const data = (await res.json()) as { token: string };\n return data.token;\n}\n\nexport async function getClient(): Promise<ConvexHttpClient> {\n const auth = await getAuthConfig();\n if (!auth) {\n throw new CliError(\"Not logged in. Run `beakcrypt login` first.\");\n }\n cachedAuth = auth;\n\n if (!clientInstance) {\n clientInstance = new ConvexHttpClient(auth.convexUrl);\n }\n\n const token = await getConvexToken(auth);\n clientInstance.setAuth(token);\n return clientInstance;\n}\n\nexport async function query<F extends FunctionReference<\"query\">>(\n fn: F,\n args: FunctionArgs<F>,\n): Promise<FunctionReturnType<F>> {\n const client = await getClient();\n return client.query(fn, args);\n}\n\nexport async function mutation<F extends FunctionReference<\"mutation\">>(\n fn: F,\n args: FunctionArgs<F>,\n): Promise<FunctionReturnType<F>> {\n const client = await getClient();\n return client.mutation(fn, args);\n}\n\nexport function getSessionToken(): string | null {\n return cachedAuth?.sessionToken ?? null;\n}\n\nexport function getSiteUrl(): string {\n if (!cachedAuth) throw new CliError(\"Not logged in.\");\n return cachedAuth.siteUrl;\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { getAuthConfig } from \"../lib/global-config\";\nimport { loginFlow, getDefaultUrls, validateUrls } from \"../lib/auth\";\nimport { query } from \"../lib/convex-client\";\nimport * as output from \"../lib/output\";\n\nexport async function loginCommand(): Promise<void> {\n const existing = await getAuthConfig();\n if (existing) {\n output.info(\"Already logged in. Refreshing session...\");\n }\n\n const urls = existing\n ? {\n siteUrl: existing.siteUrl,\n convexUrl: existing.convexUrl,\n convexSiteUrl: existing.convexSiteUrl,\n }\n : getDefaultUrls();\n\n validateUrls(urls);\n await loginFlow(urls.siteUrl, urls.convexUrl, urls.convexSiteUrl);\n try {\n const user = await query(api.auth.getCurrentUser, {});\n if (user) {\n output.success(`Logged in as ${output.bold(user.email)}`);\n } else {\n output.success(\"Logged in successfully.\");\n }\n } catch {\n output.success(\"Logged in successfully.\");\n }\n}\n","import prompts from \"prompts\";\nimport { CliError } from \"./errors\";\n\nexport function isInteractive(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n\nexport function requireInteractive(command: string): void {\n if (!isInteractive()) {\n throw new CliError(\n `Cannot run interactive prompts in non-interactive mode.`,\n `Run \\`beakcrypt ${command}\\` in an interactive terminal, or provide required flags.`,\n );\n }\n}\n\nexport async function select<T extends string>(opts: {\n message: string;\n choices: { title: string; value: T; description?: string }[];\n}): Promise<T> {\n const { value } = await prompts(\n {\n type: \"select\",\n name: \"value\",\n message: opts.message,\n choices: opts.choices,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as T;\n}\n\nexport async function confirm(\n message: string,\n initial = false,\n): Promise<boolean> {\n const { value } = await prompts(\n {\n type: \"confirm\",\n name: \"value\",\n message,\n initial,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as boolean;\n}\n\nexport async function text(opts: {\n message: string;\n placeholder?: string;\n validate?: (value: string) => string | true;\n}): Promise<string> {\n const { value } = await prompts(\n {\n type: \"text\",\n name: \"value\",\n message: opts.message,\n ...(opts.placeholder ? { initial: opts.placeholder } : {}),\n validate: opts.validate\n ? (v: string) => {\n const result = opts.validate!(v);\n return result === true ? true : result;\n }\n : undefined,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as string;\n}\n","import { clearAllConfig, isLoggedIn } from \"../lib/global-config\";\nimport * as interactive from \"../lib/interactive\";\nimport * as output from \"../lib/output\";\n\nexport async function logoutCommand(opts: { yes?: boolean }): Promise<void> {\n if (!isLoggedIn()) {\n output.info(\"Not currently logged in.\");\n return;\n }\n\n if (!opts.yes) {\n const confirmed = await interactive.confirm(\n \"This will remove all credentials and device keys. Continue?\",\n );\n if (!confirmed) return;\n }\n\n await clearAllConfig();\n output.success(\"Logged out. All credentials and keys removed.\");\n}\n","import { mkdir, readFile, writeFile, appendFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\n\nexport interface ProjectConfig {\n orgId: string;\n orgSlug: string;\n projectId: string;\n projectName: string;\n defaultEnv: string;\n}\n\nconst CONFIG_DIR_NAME = \".beakcrypt\";\nconst CONFIG_FILE_NAME = \"project.json\";\n\nexport function findProjectConfigDir(startDir?: string): string | null {\n let dir = startDir ?? process.cwd();\n const root = dirname(dir) === dir ? dir : \"/\";\n\n while (true) {\n const configPath = join(dir, CONFIG_DIR_NAME, CONFIG_FILE_NAME);\n if (existsSync(configPath)) {\n return join(dir, CONFIG_DIR_NAME);\n }\n const parent = dirname(dir);\n if (parent === dir || dir === root) break;\n dir = parent;\n }\n return null;\n}\n\nexport async function getProjectConfig(\n startDir?: string,\n): Promise<ProjectConfig | null> {\n const configDir = findProjectConfigDir(startDir);\n if (!configDir) return null;\n try {\n const data = await readFile(join(configDir, CONFIG_FILE_NAME), \"utf-8\");\n return JSON.parse(data) as ProjectConfig;\n } catch {\n return null;\n }\n}\n\nexport async function saveProjectConfig(\n config: ProjectConfig,\n dir?: string,\n): Promise<string> {\n const baseDir = dir ?? process.cwd();\n const configDir = join(baseDir, CONFIG_DIR_NAME);\n await mkdir(configDir, { recursive: true });\n await writeFile(\n join(configDir, CONFIG_FILE_NAME),\n JSON.stringify(config, null, 2),\n );\n await ensureGitignore(baseDir);\n return configDir;\n}\n\nasync function ensureGitignore(baseDir: string): Promise<void> {\n const gitignorePath = join(baseDir, \".gitignore\");\n\n if (existsSync(gitignorePath)) {\n const content = await readFile(gitignorePath, \"utf-8\");\n if (content.includes(CONFIG_DIR_NAME)) return;\n const suffix = content.endsWith(\"\\n\") ? \"\" : \"\\n\";\n await appendFile(\n gitignorePath,\n `${suffix}\\n# Beakcrypt CLI\\n${CONFIG_DIR_NAME}\\n`,\n );\n } else {\n await writeFile(gitignorePath, `# Beakcrypt CLI\\n${CONFIG_DIR_NAME}\\n`);\n }\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { getAuthConfig } from \"./global-config\";\nimport {\n getProjectConfig,\n saveProjectConfig,\n type ProjectConfig,\n} from \"./project-config\";\nimport { query, mutation } from \"./convex-client\";\nimport { unwrapResult, CliError } from \"./errors\";\nimport * as interactive from \"./interactive\";\nimport * as output from \"./output\";\nimport { loginCommand } from \"../commands/login\";\n\nexport interface ResolvedContext {\n orgId: string;\n orgSlug: string;\n projectId: string;\n projectName: string;\n envName: string;\n environmentId: string;\n}\n\ninterface ContextFlags {\n org?: string;\n project?: string;\n env?: string;\n}\n\nexport async function ensureAuth(): Promise<void> {\n const auth = await getAuthConfig();\n if (auth) return;\n\n if (!interactive.isInteractive()) {\n throw new CliError(\"Not logged in. Run `beakcrypt login` first.\");\n }\n\n const shouldLogin = await interactive.confirm(\n \"You're not logged in. Log in now?\",\n true,\n );\n if (!shouldLogin) process.exit(0);\n await loginCommand();\n}\n\nexport async function resolveContext(\n flags: ContextFlags,\n): Promise<ResolvedContext> {\n await ensureAuth();\n\n const projectConfig = await getProjectConfig();\n\n const orgId = flags.org\n ? await resolveOrgBySlug(flags.org)\n : projectConfig?.orgId;\n const orgSlug = flags.org ?? projectConfig?.orgSlug;\n const projectId = flags.project\n ? await resolveProjectByName(orgId!, flags.project)\n : projectConfig?.projectId;\n const projectName = flags.project ?? projectConfig?.projectName;\n const envName = flags.env ?? projectConfig?.defaultEnv;\n\n if (!orgId || !projectId || !envName || !orgSlug || !projectName) {\n if (!interactive.isInteractive()) {\n throw new CliError(\n \"No project linked in this directory.\",\n \"Run `beakcrypt link` to connect this directory to a project.\",\n );\n }\n\n const config = await interactiveLink();\n const envId = await resolveEnvId(\n config.projectId,\n flags.env ?? config.defaultEnv,\n );\n return {\n orgId: config.orgId,\n orgSlug: config.orgSlug,\n projectId: config.projectId,\n projectName: config.projectName,\n envName: flags.env ?? config.defaultEnv,\n environmentId: envId,\n };\n }\n\n const envId = await resolveEnvId(projectId, envName);\n return {\n orgId,\n orgSlug,\n projectId,\n projectName,\n envName,\n environmentId: envId,\n };\n}\n\nasync function resolveOrgBySlug(slug: string): Promise<string> {\n const result = await query(api.organizations.getBySlug, { slug });\n const org = unwrapResult(result);\n return org._id;\n}\n\nasync function resolveProjectByName(\n orgId: string,\n name: string,\n): Promise<string> {\n const result = await query(api.projects.getByName, {\n orgId: orgId as never,\n name,\n });\n const project = unwrapResult(result);\n return project._id;\n}\n\nasync function resolveEnvId(\n projectId: string,\n envName: string,\n): Promise<string> {\n if (envName === \"local\") {\n await mutation(api.environments.ensurePersonalLocal, {\n projectId: projectId as never,\n syncFromDev: false,\n });\n }\n\n const result = await query(api.environments.list, {\n projectId: projectId as never,\n });\n const envs = unwrapResult(result);\n const env = envs.find((e: { name: string }) => e.name === envName);\n if (!env) {\n throw new CliError(`Environment \"${envName}\" not found.`);\n }\n return env._id;\n}\n\nexport async function interactiveLink(): Promise<ProjectConfig> {\n interactive.requireInteractive(\"link\");\n\n const orgsResult = await query(api.organizations.list, {});\n const orgs = unwrapResult(orgsResult);\n\n if (orgs.length === 0) {\n throw new CliError(\"You don't belong to any organizations.\");\n }\n\n const orgId = await interactive.select({\n message: \"Select an organization:\",\n choices: orgs.map((o: { _id: string; name: string; slug: string }) => ({\n title: `${o.name} (${o.slug})`,\n value: o._id,\n })),\n });\n const selectedOrg = orgs.find((o: { _id: string }) => o._id === orgId)!;\n\n const action = await interactive.select({\n message: \"What would you like to do?\",\n choices: [\n { title: \"Link to an existing project\", value: \"link\" as const },\n { title: \"Create a new project\", value: \"create\" as const },\n ],\n });\n\n let projectId: string;\n let projectName: string;\n\n if (action === \"create\") {\n const name = await interactive.text({\n message: \"Enter project name:\",\n validate: (v: string) =>\n v.trim().length > 0 ? true : \"Project name is required\",\n });\n const createResult = await mutation(api.projects.create, {\n name: name.trim(),\n orgId: orgId as never,\n });\n const project = unwrapResult(createResult);\n projectId = project._id;\n projectName = project.name;\n output.success(`Created project \"${projectName}\" in ${selectedOrg.name}`);\n } else {\n const projectsResult = await query(api.projects.list, {\n orgId: orgId as never,\n });\n const projects = unwrapResult(projectsResult);\n\n if (projects.length === 0) {\n throw new CliError(\"No projects in this organization. Create one first.\");\n }\n\n projectId = await interactive.select({\n message: \"Select a project:\",\n choices: projects.map((p: { _id: string; name: string }) => ({\n title: p.name,\n value: p._id,\n })),\n });\n const selectedProject = projects.find(\n (p: { _id: string }) => p._id === projectId,\n )!;\n projectName = selectedProject.name;\n }\n\n await mutation(api.environments.ensurePersonalLocal, {\n projectId: projectId as never,\n syncFromDev: false,\n });\n\n const envsResult = await query(api.environments.list, {\n projectId: projectId as never,\n });\n const envs = unwrapResult(envsResult);\n\n const defaultEnv = await interactive.select({\n message: \"Select a default environment:\",\n choices: envs.map(\n (e: { _id: string; name: string; isPersonal?: boolean }) => ({\n title: e.isPersonal ? `${e.name} (personal)` : e.name,\n value: e.name,\n }),\n ),\n });\n\n const config: ProjectConfig = {\n orgId,\n orgSlug: selectedOrg.slug,\n projectId,\n projectName,\n defaultEnv,\n };\n\n const configDir = await saveProjectConfig(config);\n output.success(\n `Linked to ${selectedOrg.slug}/${projectName} (${defaultEnv})`,\n );\n output.info(`Created ${configDir}/project.json`);\n output.info(`Added .beakcrypt to .gitignore`);\n\n return config;\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../lib/convex-client\";\nimport { CliError } from \"../lib/errors\";\nimport { ensureAuth } from \"../lib/context\";\nimport * as output from \"../lib/output\";\n\nexport async function whoamiCommand(): Promise<void> {\n await ensureAuth();\n\n const user = await query(api.auth.getCurrentUser, {});\n if (!user) {\n throw new CliError(\n \"Could not retrieve user info. Try `beakcrypt login` again.\",\n );\n }\n\n console.log();\n console.log(` ${output.bold(\"Email:\")} ${user.email}`);\n console.log(` ${output.bold(\"Name:\")} ${user.name}`);\n console.log();\n}\n","import ora from \"ora\";\nimport open from \"open\";\nimport {\n generateKeyPair,\n unwrapOrgKey as cryptoUnwrapOrgKey,\n} from \"@beakcrypt/crypto\";\nimport { api } from \"@beakcrypt/convex\";\nimport { query, mutation, getSessionToken, getSiteUrl } from \"./convex-client\";\nimport {\n getStoredKey,\n saveKey,\n updateWrappedOrgKey,\n type StoredKeyData,\n} from \"./key-store\";\nimport { unwrapResult } from \"./errors\";\nimport { getProjectConfig } from \"./project-config\";\nimport * as output from \"./output\";\n\nexport async function ensureOrgKey(orgId: string): Promise<string> {\n const stored = await getStoredKey(orgId);\n\n if (stored?.wrappedOrgKey) {\n return await cryptoUnwrapOrgKey(stored.wrappedOrgKey, stored.privateKey);\n }\n\n if (stored?.keyId) {\n // Key exists but no wrapped org key — check backend for approval\n const keyResult = await query(api.keys.getMyKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(stored.publicKey),\n });\n const keyRecord = unwrapResult(keyResult);\n\n if (keyRecord?.status === \"active\" && keyRecord.wrappedOrgKey) {\n await updateWrappedOrgKey(orgId, keyRecord.wrappedOrgKey);\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n stored.privateKey,\n );\n }\n\n if (keyRecord?.status === \"pending\") {\n return await waitForApproval(orgId, stored);\n }\n\n throw new Error(\n \"Device key is not active. An admin may need to approve this device.\",\n );\n }\n\n // No key pair — register new device\n return await registerNewDevice(orgId);\n}\n\nasync function registerNewDevice(orgId: string): Promise<string> {\n const sessionToken = getSessionToken();\n if (!sessionToken) throw new Error(\"Not logged in\");\n\n const spinner = ora(\"Generating device keys...\").start();\n\n let keyPair: Awaited<ReturnType<typeof generateKeyPair>>;\n let keyRecord: ReturnType<typeof unwrapResult<any>>;\n\n try {\n keyPair = await generateKeyPair();\n\n spinner.text = \"Registering device with organization...\";\n\n const result = await mutation(api.keys.registerKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(keyPair.publicKey),\n sessionToken,\n });\n\n keyRecord = unwrapResult(result);\n spinner.stop();\n } catch (err) {\n spinner.fail(\"Device registration failed.\");\n throw err;\n }\n\n const stored: StoredKeyData = {\n publicKey: keyPair.publicKey,\n privateKey: keyPair.privateKey,\n keyId: keyRecord._id,\n wrappedOrgKey: keyRecord.wrappedOrgKey,\n };\n\n await saveKey(orgId, stored);\n\n if (keyRecord.status === \"active\" && keyRecord.wrappedOrgKey) {\n output.success(\"Device registered and activated.\");\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n keyPair.privateKey,\n );\n }\n\n // Pending approval\n return await waitForApproval(orgId, stored);\n}\n\nasync function waitForApproval(\n orgId: string,\n stored: StoredKeyData,\n): Promise<string> {\n // Try to open the browser for auto-approval (same-user, new device scenario)\n try {\n const projectConfig = await getProjectConfig();\n if (projectConfig?.orgSlug && stored.keyId) {\n const siteUrl = getSiteUrl();\n const approveUrl = `${siteUrl}/${projectConfig.orgSlug}/sessions?approveSession=${stored.keyId}`;\n\n output.info(\"Opening browser to approve this device...\");\n console.log(`${output.dim(\"If the browser doesn't open, visit:\")}`);\n console.log(`${output.link(approveUrl)}\\n`);\n\n try {\n await open(approveUrl);\n } catch {\n // Browser failed to open — URL already printed above\n }\n }\n } catch {\n // Could not determine approval URL — fall through to polling\n }\n\n const spinner = ora(\"Waiting for device to be approved...\").start();\n spinner.indent = 2;\n\n while (true) {\n await new Promise((r) => setTimeout(r, 5000));\n\n const result = await query(api.keys.getMyKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(stored.publicKey),\n });\n const keyRecord = unwrapResult(result);\n\n if (keyRecord?.status === \"active\" && keyRecord.wrappedOrgKey) {\n spinner.stop();\n await updateWrappedOrgKey(orgId, keyRecord.wrappedOrgKey);\n output.success(\"Device approved!\");\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n stored.privateKey,\n );\n }\n\n if (keyRecord?.status === \"revoked\") {\n spinner.stop();\n throw new Error(\"Device key was revoked. Re-run `beakcrypt login`.\");\n }\n }\n}\n","export interface ExportedKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n}\n\nexport const RSA_ALGORITHM: RsaHashedKeyGenParams = {\n name: \"RSA-OAEP\",\n modulusLength: 4096,\n publicExponent: new Uint8Array([1, 0, 1]),\n hash: \"SHA-256\",\n};\n\nexport const AES_ALGORITHM = \"AES-GCM\";\nexport const AES_KEY_LENGTH = 256;\nexport const IV_BYTE_LENGTH = 12;\n\nexport async function generateKeyPair(): Promise<ExportedKeyPair> {\n const keyPair = await crypto.subtle.generateKey(RSA_ALGORITHM, true, [\n \"wrapKey\",\n \"unwrapKey\",\n ]);\n\n const [publicKey, privateKey] = await Promise.all([\n crypto.subtle.exportKey(\"jwk\", keyPair.publicKey),\n crypto.subtle.exportKey(\"jwk\", keyPair.privateKey),\n ]);\n\n return { publicKey, privateKey };\n}\n\nexport async function generateOrgKey(): Promise<string> {\n const key = await crypto.subtle.generateKey(\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const raw = await crypto.subtle.exportKey(\"raw\", key);\n return bufferToBase64(raw);\n}\n\nexport async function wrapOrgKey(\n orgKeyBase64: string,\n publicKeyJwk: JsonWebKey,\n): Promise<string> {\n const publicKey = await crypto.subtle.importKey(\n \"jwk\",\n publicKeyJwk,\n RSA_ALGORITHM,\n false,\n [\"wrapKey\"],\n );\n\n const orgKey = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const wrapped = await crypto.subtle.wrapKey(\"raw\", orgKey, publicKey, {\n name: \"RSA-OAEP\",\n });\n\n return bufferToBase64(wrapped);\n}\n\nexport async function unwrapOrgKey(\n wrappedKeyBase64: string,\n privateKeyJwk: JsonWebKey,\n): Promise<string> {\n const privateKey = await crypto.subtle.importKey(\n \"jwk\",\n privateKeyJwk,\n RSA_ALGORITHM,\n false,\n [\"unwrapKey\"],\n );\n\n const orgKey = await crypto.subtle.unwrapKey(\n \"raw\",\n base64ToBuffer(wrappedKeyBase64),\n privateKey,\n { name: \"RSA-OAEP\" },\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const raw = await crypto.subtle.exportKey(\"raw\", orgKey);\n return bufferToBase64(raw);\n}\n\nexport async function encryptSecret(\n plaintext: string,\n orgKeyBase64: string,\n): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM },\n false,\n [\"encrypt\"],\n );\n\n const iv = crypto.getRandomValues(new Uint8Array(IV_BYTE_LENGTH));\n const encoded = new TextEncoder().encode(plaintext);\n\n const ciphertext = await crypto.subtle.encrypt(\n { name: AES_ALGORITHM, iv },\n key,\n encoded,\n );\n\n return `${bufferToBase64(iv.buffer)}:${bufferToBase64(ciphertext)}`;\n}\n\nexport async function decryptSecret(\n encryptedValue: string,\n orgKeyBase64: string,\n): Promise<string> {\n const [ivBase64, ciphertextBase64] = encryptedValue.split(\":\");\n if (!ivBase64 || !ciphertextBase64) {\n throw new Error(\n \"Invalid encrypted value format — expected 'iv:ciphertext'\",\n );\n }\n\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM },\n false,\n [\"decrypt\"],\n );\n\n const decrypted = await crypto.subtle.decrypt(\n { name: AES_ALGORITHM, iv: base64ToBuffer(ivBase64) },\n key,\n base64ToBuffer(ciphertextBase64),\n );\n\n return new TextDecoder().decode(decrypted);\n}\n\nexport function bufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n return btoa(binary);\n}\n\nexport function base64ToBuffer(base64: string): ArrayBuffer {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n","import { mkdir, readFile, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"./global-config\";\n\nexport interface StoredKeyData {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n wrappedOrgKey?: string;\n}\n\nfunction getKeysDir(): string {\n return join(getConfigDir(), \"keys\");\n}\n\nfunction getKeyFile(orgId: string): string {\n return join(getKeysDir(), `${orgId}.json`);\n}\n\nexport async function getStoredKey(\n orgId: string,\n): Promise<StoredKeyData | null> {\n const file = getKeyFile(orgId);\n if (!existsSync(file)) return null;\n try {\n const data = await readFile(file, \"utf-8\");\n return JSON.parse(data) as StoredKeyData;\n } catch {\n return null;\n }\n}\n\nexport async function saveKey(\n orgId: string,\n data: StoredKeyData,\n): Promise<void> {\n const dir = getKeysDir();\n await mkdir(dir, { recursive: true });\n await writeFile(getKeyFile(orgId), JSON.stringify(data, null, 2), {\n mode: 0o600,\n });\n}\n\nexport async function updateWrappedOrgKey(\n orgId: string,\n wrappedOrgKey: string,\n): Promise<void> {\n const existing = await getStoredKey(orgId);\n if (!existing) throw new Error(`No key stored for org ${orgId}`);\n existing.wrappedOrgKey = wrappedOrgKey;\n await saveKey(orgId, existing);\n}\n\nexport async function removeKey(orgId: string): Promise<void> {\n const file = getKeyFile(orgId);\n if (existsSync(file)) {\n await rm(file);\n }\n}\n\nexport async function clearAllKeys(): Promise<void> {\n const dir = getKeysDir();\n if (existsSync(dir)) {\n await rm(dir, { recursive: true });\n }\n}\n","import { ensureAuth, interactiveLink } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\n\nexport async function linkCommand(): Promise<void> {\n await ensureAuth();\n const config = await interactiveLink();\n await ensureOrgKey(config.orgId);\n}\n","import { resolve } from \"node:path\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { decryptSecret } from \"@beakcrypt/crypto\";\nimport { query } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { writeEnvFile } from \"../lib/env-file\";\nimport { unwrapResult } from \"../lib/errors\";\nimport * as output from \"../lib/output\";\n\nexport async function pullCommand(\n file: string | undefined,\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n const filePath = resolve(file ?? \".env.local\");\n const ctx = await resolveContext(opts);\n\n const spinner = ora(\"Pulling secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n const decrypted: Record<string, string> = {};\n for (const secret of secrets) {\n decrypted[secret.key] = await decryptSecret(secret.encryptedValue, orgKey);\n }\n\n await writeEnvFile(filePath, decrypted);\n spinner.stop();\n\n output.success(\n `Pulled ${secrets.length} secret${secrets.length === 1 ? \"\" : \"s\"} to ${file ?? \".env.local\"}`,\n );\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\n\nexport function parseEnvFile(content: string): Record<string, string> {\n const env: Record<string, string> = {};\n\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // Strip surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n if (key) {\n env[key] = value;\n }\n }\n\n return env;\n}\n\nexport function serializeEnvFile(env: Record<string, string>): string {\n const lines: string[] = [\n \"# Generated by Beakcrypt CLI\",\n `# ${new Date().toISOString()}`,\n \"\",\n ];\n\n const sorted = Object.entries(env).sort(([a], [b]) => a.localeCompare(b));\n\n for (const [key, value] of sorted) {\n // Quote values that contain spaces, #, or newlines\n if (/[\\s#]/.test(value)) {\n lines.push(`${key}=\"${value}\"`);\n } else {\n lines.push(`${key}=${value}`);\n }\n }\n\n lines.push(\"\"); // trailing newline\n return lines.join(\"\\n\");\n}\n\nexport async function readEnvFile(\n filePath: string,\n): Promise<Record<string, string>> {\n if (!existsSync(filePath)) {\n return {};\n }\n const content = await readFile(filePath, \"utf-8\");\n return parseEnvFile(content);\n}\n\nexport async function writeEnvFile(\n filePath: string,\n env: Record<string, string>,\n): Promise<void> {\n await writeFile(filePath, serializeEnvFile(env));\n}\n","import { resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { encryptSecret } from \"@beakcrypt/crypto\";\nimport { mutation } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { readEnvFile } from \"../lib/env-file\";\nimport { unwrapResult, CliError } from \"../lib/errors\";\nimport * as interactive from \"../lib/interactive\";\nimport * as output from \"../lib/output\";\n\nexport async function pushCommand(\n file: string | undefined,\n opts: { org?: string; project?: string; env?: string; yes?: boolean },\n): Promise<void> {\n const filePath = resolve(file ?? \".env.local\");\n\n if (!existsSync(filePath)) {\n throw new CliError(`File not found: ${filePath}`);\n }\n\n const ctx = await resolveContext(opts);\n const env = await readEnvFile(filePath);\n const keys = Object.keys(env);\n\n if (keys.length === 0) {\n output.info(\"No secrets found in file.\");\n return;\n }\n\n if (!opts.yes) {\n output.info(\n `Pushing ${keys.length} secret${keys.length === 1 ? \"\" : \"s\"} to ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})`,\n );\n const confirmed = await interactive.confirm(\"Continue?\", true);\n if (!confirmed) return;\n }\n\n const spinner = ora(\"Encrypting and pushing secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const encryptedSecrets: { key: string; encryptedValue: string }[] = [];\n for (const [key, value] of Object.entries(env)) {\n const encrypted = await encryptSecret(value, orgKey);\n encryptedSecrets.push({ key, encryptedValue: encrypted });\n }\n\n const result = await mutation(api.secrets.bulkCreate, {\n environmentId: ctx.environmentId as never,\n secrets: encryptedSecrets,\n overwrite: true,\n });\n const summary = unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Pushed ${summary.created} created, ${summary.updated} updated, ${summary.skipped} skipped`,\n );\n}\n","import { spawn } from \"node:child_process\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { decryptSecret } from \"@beakcrypt/crypto\";\nimport { query } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { unwrapResult, CliError } from \"../lib/errors\";\n\nexport async function runCommand(\n args: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (args.length === 0) {\n throw new CliError(\n \"No command provided. Usage: beakcrypt run -- <command>\",\n );\n }\n\n const ctx = await resolveContext(opts);\n\n const spinner = ora(\"Loading secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n const decrypted: Record<string, string> = {};\n for (const secret of secrets) {\n decrypted[secret.key] = await decryptSecret(secret.encryptedValue, orgKey);\n }\n\n spinner.stop();\n\n const [command, ...commandArgs] = args;\n const child = spawn(command!, commandArgs, {\n stdio: \"inherit\",\n env: { ...process.env, ...decrypted },\n });\n\n child.on(\"close\", (code) => {\n process.exit(code ?? 0);\n });\n\n child.on(\"error\", (err) => {\n throw new CliError(`Failed to run command: ${err.message}`);\n });\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsListCommand(opts: {\n org?: string;\n project?: string;\n env?: string;\n}): Promise<void> {\n const ctx = await resolveContext(opts);\n\n const result = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(result);\n\n if (secrets.length === 0) {\n output.info(\n `No secrets in ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})`,\n );\n return;\n }\n\n console.log(\n `\\n${output.bold(`${ctx.orgSlug}/${ctx.projectName}`)} ${output.dim(`(${ctx.envName})`)}\\n`,\n );\n\n output.table(\n secrets.map((s: { key: string }) => [s.key, \"••••••••\"]),\n [\"Key\", \"Value\"],\n );\n\n console.log(\n `\\n${output.dim(`${secrets.length} secret${secrets.length === 1 ? \"\" : \"s\"}`)}\\n`,\n );\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { encryptSecret } from \"@beakcrypt/crypto\";\nimport { mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { ensureOrgKey } from \"../../lib/key-manager\";\nimport { unwrapResult, CliError } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsSetCommand(\n pairs: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (pairs.length === 0) {\n throw new CliError(\n \"No key=value pairs provided. Usage: beakcrypt secrets set KEY=VALUE\",\n );\n }\n\n const parsed: { key: string; value: string }[] = [];\n for (const pair of pairs) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n throw new CliError(`Invalid format: \"${pair}\". Use KEY=VALUE.`);\n }\n parsed.push({\n key: pair.slice(0, eqIndex),\n value: pair.slice(eqIndex + 1),\n });\n }\n\n const ctx = await resolveContext(opts);\n const spinner = ora(\"Setting secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const encryptedSecrets: { key: string; encryptedValue: string }[] = [];\n for (const { key, value } of parsed) {\n const encrypted = await encryptSecret(value, orgKey);\n encryptedSecrets.push({ key, encryptedValue: encrypted });\n }\n\n const result = await mutation(api.secrets.bulkCreate, {\n environmentId: ctx.environmentId as never,\n secrets: encryptedSecrets,\n overwrite: true,\n });\n unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Set ${parsed.length} secret${parsed.length === 1 ? \"\" : \"s\"} in ${ctx.envName}`,\n );\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { query, mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult, CliError } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsRemoveCommand(\n keys: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (keys.length === 0) {\n throw new CliError(\n \"No keys provided. Usage: beakcrypt secrets remove KEY [KEY2...]\",\n );\n }\n\n const ctx = await resolveContext(opts);\n const spinner = ora(\"Removing secrets...\").start();\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n let removed = 0;\n const notFound: string[] = [];\n\n for (const key of keys) {\n const secret = secrets.find((s: { key: string }) => s.key === key);\n if (secret) {\n const result = await mutation(api.secrets.remove, {\n id: secret._id as never,\n });\n unwrapResult(result);\n removed++;\n } else {\n notFound.push(key);\n }\n }\n\n spinner.stop();\n\n if (removed > 0) {\n output.success(\n `Removed ${removed} secret${removed === 1 ? \"\" : \"s\"} from ${ctx.envName}`,\n );\n }\n if (notFound.length > 0) {\n output.warn(`Not found: ${notFound.join(\", \")}`);\n }\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as interactive from \"../../lib/interactive\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsClearCommand(opts: {\n org?: string;\n project?: string;\n env?: string;\n yes?: boolean;\n}): Promise<void> {\n const ctx = await resolveContext(opts);\n\n if (!opts.yes) {\n const confirmed = await interactive.confirm(\n `Delete ALL secrets in ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})?`,\n );\n if (!confirmed) return;\n }\n\n const spinner = ora(\"Clearing secrets...\").start();\n\n const result = await mutation(api.secrets.removeAll, {\n environmentId: ctx.environmentId as never,\n });\n const summary = unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Deleted ${summary.deleted} secret${summary.deleted === 1 ? \"\" : \"s\"}`,\n );\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { ensureAuth } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function orgListCommand(): Promise<void> {\n await ensureAuth();\n\n const result = await query(api.organizations.list, {});\n const orgs = unwrapResult(result);\n\n if (orgs.length === 0) {\n output.info(\"You don't belong to any organizations.\");\n return;\n }\n\n console.log();\n output.table(\n orgs.map((o: { name: string; slug: string }) => [o.name, o.slug]),\n [\"Name\", \"Slug\"],\n );\n console.log();\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function envListCommand(opts: {\n org?: string;\n project?: string;\n}): Promise<void> {\n const ctx = await resolveContext({ ...opts, env: \"development\" });\n\n const result = await query(api.environments.list, {\n projectId: ctx.projectId as never,\n });\n const envs = unwrapResult(result);\n\n if (envs.length === 0) {\n output.info(\"No environments found.\");\n return;\n }\n\n console.log(\n `\\n${output.bold(`${ctx.orgSlug}/${ctx.projectName}`)} environments:\\n`,\n );\n\n output.table(\n envs.map((e: { name: string; isPersonal?: boolean }) => [\n e.name,\n e.isPersonal ? \"personal\" : \"shared\",\n ]),\n [\"Name\", \"Type\"],\n );\n console.log();\n}\n","import pc from \"picocolors\";\nimport { getAuthConfig } from \"./lib/global-config\";\nimport { getProjectConfig } from \"./lib/project-config\";\nimport * as interactive from \"./lib/interactive\";\nimport * as output from \"./lib/output\";\nimport { loginCommand } from \"./commands/login\";\nimport { linkCommand } from \"./commands/link\";\nimport { pullCommand } from \"./commands/pull\";\nimport { pushCommand } from \"./commands/push\";\nimport { secretsListCommand } from \"./commands/secrets/list\";\n\nexport async function interactiveMode(): Promise<void> {\n interactive.requireInteractive(\"(no args)\");\n\n console.log(`\\n${pc.bold(\"Beakcrypt\")} ${pc.dim(\"v0.1.0\")}\\n`);\n\n // Check auth\n const auth = await getAuthConfig();\n if (!auth) {\n const shouldLogin = await interactive.confirm(\n \"You're not logged in. Log in now?\",\n true,\n );\n if (!shouldLogin) process.exit(0);\n await loginCommand();\n }\n\n // Check project link\n const config = await getProjectConfig();\n if (!config) {\n output.info(\"No project linked in this directory.\");\n const shouldLink = await interactive.confirm(\n \"Link to a project now?\",\n true,\n );\n if (!shouldLink) process.exit(0);\n await linkCommand();\n return;\n }\n\n // Show linked project and action menu\n console.log(\n `Linked to ${output.bold(`${config.orgSlug}/${config.projectName}`)} ${output.dim(`(${config.defaultEnv}`)})`,\n );\n console.log();\n\n const action = await interactive.select({\n message: \"What would you like to do?\",\n choices: [\n { title: \"Pull secrets (.env.local)\", value: \"pull\" as const },\n { title: \"Push secrets (.env.local)\", value: \"push\" as const },\n { title: \"List secrets\", value: \"list\" as const },\n { title: \"Change project link\", value: \"link\" as const },\n ],\n });\n\n switch (action) {\n case \"pull\":\n await pullCommand(undefined, {});\n break;\n case \"push\":\n await pushCommand(undefined, {});\n break;\n case \"list\":\n await secretsListCommand({});\n break;\n case \"link\":\n await linkCommand();\n break;\n }\n}\n"],"mappings":"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","names":["pc","pc","pc","resolve","pc","mkdir","readFile","writeFile","existsSync","join","envId","org","env","ora","open","mkdir","readFile","writeFile","rm","existsSync","join","join","existsSync","readFile","mkdir","writeFile","ora","open","ora","readFile","writeFile","existsSync","env","ora","secrets","resolve","existsSync","ora","resolve","existsSync","env","ora","ora","ora","secrets","secrets","ora","ora","ora","ora","secrets","ora","ora","pc","pc"]}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "beakcrypt",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Secure environment variable management with E2E encryption",
5
+ "homepage": "https://beakcrypt.com",
5
6
  "type": "module",
6
7
  "bin": {
7
8
  "beakcrypt": "./dist/index.js"
@@ -9,27 +10,35 @@
9
10
  "exports": {
10
11
  ".": "./dist/index.js"
11
12
  },
13
+ "keywords": [
14
+ "env",
15
+ "secrets",
16
+ "encryption",
17
+ "environment-variables",
18
+ "secret-management",
19
+ "e2e-encryption",
20
+ "dotenv",
21
+ "cli",
22
+ "devtools"
23
+ ],
12
24
  "files": [
13
- "dist"
25
+ "dist",
26
+ "README.md"
14
27
  ],
15
28
  "engines": {
16
- "node": ">=22"
29
+ "node": ">=20"
17
30
  },
18
31
  "publishConfig": {
19
- "access": "public"
32
+ "access": "public",
33
+ "provenance": true
20
34
  },
21
- "private": false,
22
- "scripts": {
23
- "build": "tsup",
24
- "dev": "tsup --watch",
25
- "typecheck": "tsgo --pretty --noEmit",
26
- "lint": "eslint",
27
- "format": "prettier --write ."
35
+ "repository": {
36
+ "type": "git",
37
+ "directory": "packages/cli",
38
+ "url": "https://github.com/prudentbird/beakcrypt.git"
28
39
  },
40
+ "private": false,
29
41
  "dependencies": {
30
- "@beakcrypt/convex": "workspace:*",
31
- "@beakcrypt/crypto": "workspace:*",
32
- "@beakcrypt/shared": "workspace:*",
33
42
  "commander": "^13.1.0",
34
43
  "convex": "^1.32.0",
35
44
  "dotenv": "^16.5.0",
@@ -39,13 +48,23 @@
39
48
  "prompts": "^2.4.2"
40
49
  },
41
50
  "devDependencies": {
42
- "@beakcrypt/eslint-config": "workspace:*",
43
- "@beakcrypt/typescript-config": "workspace:*",
44
51
  "@types/node": "^25.3.2",
45
52
  "@types/prompts": "^2.4.9",
46
53
  "@typescript/native-preview": "7.0.0-dev.20260228.1",
47
54
  "eslint": "^10.0.2",
48
55
  "prettier": "^3.8.1",
49
- "tsup": "^8.5.0"
56
+ "tsup": "^8.5.0",
57
+ "@beakcrypt/convex": "0.0.1",
58
+ "@beakcrypt/shared": "0.0.1",
59
+ "@beakcrypt/crypto": "0.0.1",
60
+ "@beakcrypt/eslint-config": "0.0.1",
61
+ "@beakcrypt/typescript-config": "0.0.1"
62
+ },
63
+ "scripts": {
64
+ "build": "tsup",
65
+ "dev": "tsup --watch",
66
+ "typecheck": "tsgo --pretty --noEmit",
67
+ "lint": "eslint",
68
+ "format": "prettier --write ."
50
69
  }
51
- }
70
+ }