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 +21 -0
- package/README.md +97 -0
- package/dist/index.js +27 -43
- package/dist/index.js.map +1 -1
- package/package.json +37 -18
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/
|
|
42
|
-
import {
|
|
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(
|
|
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(
|
|
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(
|
|
506
|
+
await mutation(api.environments.ensurePersonalLocal, {
|
|
511
507
|
projectId,
|
|
512
508
|
syncFromDev: false
|
|
513
509
|
});
|
|
514
510
|
}
|
|
515
|
-
const result = await query(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
578
|
+
await mutation(api.environments.ensurePersonalLocal, {
|
|
583
579
|
projectId,
|
|
584
580
|
syncFromDev: false
|
|
585
581
|
});
|
|
586
|
-
const envsResult = await query(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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.
|
|
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": ">=
|
|
29
|
+
"node": ">=20"
|
|
17
30
|
},
|
|
18
31
|
"publishConfig": {
|
|
19
|
-
"access": "public"
|
|
32
|
+
"access": "public",
|
|
33
|
+
"provenance": true
|
|
20
34
|
},
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
"
|
|
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
|
+
}
|