getmyenv 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.md +57 -13
  2. package/dist/bin.js +1 -24
  3. package/dist/bin.js.map +1 -1
  4. package/dist/cli.d.ts +10 -0
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +179 -101
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/backup.d.ts +2 -1
  9. package/dist/commands/backup.d.ts.map +1 -1
  10. package/dist/commands/backup.js +15 -25
  11. package/dist/commands/backup.js.map +1 -1
  12. package/dist/commands/claim.d.ts +2 -1
  13. package/dist/commands/claim.d.ts.map +1 -1
  14. package/dist/commands/claim.js +114 -82
  15. package/dist/commands/claim.js.map +1 -1
  16. package/dist/commands/context.d.ts +11 -0
  17. package/dist/commands/context.d.ts.map +1 -0
  18. package/dist/commands/context.js +53 -0
  19. package/dist/commands/context.js.map +1 -0
  20. package/dist/commands/export.d.ts +11 -0
  21. package/dist/commands/export.d.ts.map +1 -0
  22. package/dist/commands/export.js +67 -0
  23. package/dist/commands/export.js.map +1 -0
  24. package/dist/commands/guest.d.ts +9 -3
  25. package/dist/commands/guest.d.ts.map +1 -1
  26. package/dist/commands/guest.js +32 -30
  27. package/dist/commands/guest.js.map +1 -1
  28. package/dist/commands/import.d.ts +26 -0
  29. package/dist/commands/import.d.ts.map +1 -0
  30. package/dist/commands/import.js +168 -0
  31. package/dist/commands/import.js.map +1 -0
  32. package/dist/commands/lock.d.ts +5 -0
  33. package/dist/commands/lock.d.ts.map +1 -0
  34. package/dist/commands/lock.js +18 -0
  35. package/dist/commands/lock.js.map +1 -0
  36. package/dist/commands/ls.d.ts +6 -0
  37. package/dist/commands/ls.d.ts.map +1 -0
  38. package/dist/commands/ls.js +37 -0
  39. package/dist/commands/ls.js.map +1 -0
  40. package/dist/commands/restore.d.ts +7 -2
  41. package/dist/commands/restore.d.ts.map +1 -1
  42. package/dist/commands/restore.js +58 -51
  43. package/dist/commands/restore.js.map +1 -1
  44. package/dist/commands/run.d.ts +7 -5
  45. package/dist/commands/run.d.ts.map +1 -1
  46. package/dist/commands/run.js +97 -185
  47. package/dist/commands/run.js.map +1 -1
  48. package/dist/commands/set.d.ts +16 -0
  49. package/dist/commands/set.d.ts.map +1 -0
  50. package/dist/commands/set.js +111 -0
  51. package/dist/commands/set.js.map +1 -0
  52. package/dist/commands/start.d.ts +16 -0
  53. package/dist/commands/start.d.ts.map +1 -0
  54. package/dist/commands/start.js +118 -0
  55. package/dist/commands/start.js.map +1 -0
  56. package/dist/commands/status.d.ts +5 -0
  57. package/dist/commands/status.d.ts.map +1 -0
  58. package/dist/commands/status.js +40 -0
  59. package/dist/commands/status.js.map +1 -0
  60. package/dist/commands/unlink.d.ts +9 -0
  61. package/dist/commands/unlink.d.ts.map +1 -0
  62. package/dist/commands/unlink.js +70 -0
  63. package/dist/commands/unlink.js.map +1 -0
  64. package/dist/lib/api-url.d.ts +12 -0
  65. package/dist/lib/api-url.d.ts.map +1 -1
  66. package/dist/lib/api-url.js +32 -0
  67. package/dist/lib/api-url.js.map +1 -1
  68. package/dist/lib/api.d.ts +35 -23
  69. package/dist/lib/api.d.ts.map +1 -1
  70. package/dist/lib/api.js +23 -59
  71. package/dist/lib/api.js.map +1 -1
  72. package/dist/lib/authorize.d.ts +13 -6
  73. package/dist/lib/authorize.d.ts.map +1 -1
  74. package/dist/lib/authorize.js +68 -63
  75. package/dist/lib/authorize.js.map +1 -1
  76. package/dist/lib/bootstrap.d.ts +18 -15
  77. package/dist/lib/bootstrap.d.ts.map +1 -1
  78. package/dist/lib/bootstrap.js +59 -58
  79. package/dist/lib/bootstrap.js.map +1 -1
  80. package/dist/lib/confirm.js +4 -4
  81. package/dist/lib/confirm.js.map +1 -1
  82. package/dist/lib/context.d.ts +12 -0
  83. package/dist/lib/context.d.ts.map +1 -0
  84. package/dist/lib/context.js +43 -0
  85. package/dist/lib/context.js.map +1 -0
  86. package/dist/lib/credentials.d.ts +8 -9
  87. package/dist/lib/credentials.d.ts.map +1 -1
  88. package/dist/lib/credentials.js +2 -10
  89. package/dist/lib/credentials.js.map +1 -1
  90. package/dist/lib/fs.d.ts +26 -37
  91. package/dist/lib/fs.d.ts.map +1 -1
  92. package/dist/lib/fs.js +112 -327
  93. package/dist/lib/fs.js.map +1 -1
  94. package/dist/lib/guest-key.d.ts +8 -6
  95. package/dist/lib/guest-key.d.ts.map +1 -1
  96. package/dist/lib/guest-key.js +26 -3
  97. package/dist/lib/guest-key.js.map +1 -1
  98. package/dist/lib/identity.d.ts +9 -11
  99. package/dist/lib/identity.d.ts.map +1 -1
  100. package/dist/lib/identity.js +34 -24
  101. package/dist/lib/identity.js.map +1 -1
  102. package/dist/lib/keychain.d.ts +21 -0
  103. package/dist/lib/keychain.d.ts.map +1 -0
  104. package/dist/lib/keychain.js +124 -0
  105. package/dist/lib/keychain.js.map +1 -0
  106. package/dist/lib/pek.d.ts +15 -22
  107. package/dist/lib/pek.d.ts.map +1 -1
  108. package/dist/lib/pek.js +31 -51
  109. package/dist/lib/pek.js.map +1 -1
  110. package/dist/lib/run-env.d.ts +50 -0
  111. package/dist/lib/run-env.d.ts.map +1 -0
  112. package/dist/lib/run-env.js +114 -0
  113. package/dist/lib/run-env.js.map +1 -0
  114. package/dist/lib/unlock.d.ts +24 -0
  115. package/dist/lib/unlock.d.ts.map +1 -0
  116. package/dist/lib/unlock.js +87 -0
  117. package/dist/lib/unlock.js.map +1 -0
  118. package/dist/lib/update-check.d.ts +4 -2
  119. package/dist/lib/update-check.d.ts.map +1 -1
  120. package/dist/lib/update-check.js +54 -68
  121. package/dist/lib/update-check.js.map +1 -1
  122. package/dist/lib/upload.d.ts +21 -0
  123. package/dist/lib/upload.d.ts.map +1 -0
  124. package/dist/lib/upload.js +53 -0
  125. package/dist/lib/upload.js.map +1 -0
  126. package/package.json +5 -3
  127. package/dist/commands/delete.d.ts +0 -6
  128. package/dist/commands/delete.d.ts.map +0 -1
  129. package/dist/commands/delete.js +0 -55
  130. package/dist/commands/delete.js.map +0 -1
  131. package/dist/commands/link.d.ts +0 -16
  132. package/dist/commands/link.d.ts.map +0 -1
  133. package/dist/commands/link.js +0 -142
  134. package/dist/commands/link.js.map +0 -1
  135. package/dist/commands/pull.d.ts +0 -15
  136. package/dist/commands/pull.d.ts.map +0 -1
  137. package/dist/commands/pull.js +0 -159
  138. package/dist/commands/pull.js.map +0 -1
  139. package/dist/commands/push.d.ts +0 -15
  140. package/dist/commands/push.d.ts.map +0 -1
  141. package/dist/commands/push.js +0 -262
  142. package/dist/commands/push.js.map +0 -1
  143. package/dist/commands/remove.d.ts +0 -11
  144. package/dist/commands/remove.d.ts.map +0 -1
  145. package/dist/commands/remove.js +0 -39
  146. package/dist/commands/remove.js.map +0 -1
  147. package/dist/commands/token.d.ts +0 -14
  148. package/dist/commands/token.d.ts.map +0 -1
  149. package/dist/commands/token.js +0 -132
  150. package/dist/commands/token.js.map +0 -1
  151. package/dist/commands/whoami.d.ts +0 -6
  152. package/dist/commands/whoami.d.ts.map +0 -1
  153. package/dist/commands/whoami.js +0 -46
  154. package/dist/commands/whoami.js.map +0 -1
  155. package/dist/lib/env-name.d.ts +0 -3
  156. package/dist/lib/env-name.d.ts.map +0 -1
  157. package/dist/lib/env-name.js +0 -5
  158. package/dist/lib/env-name.js.map +0 -1
  159. package/dist/lib/guest-key.test.d.ts +0 -2
  160. package/dist/lib/guest-key.test.d.ts.map +0 -1
  161. package/dist/lib/guest-key.test.js.map +0 -1
@@ -1,113 +1,145 @@
1
- import { exec } from "node:child_process";
2
1
  import pc from "picocolors";
3
2
  import { parseWrappedKey, rewrapProjectKey, serializeWrappedKey, } from "@getmyenv/crypto";
4
- import { clearClaimFile, ensureGitignoreHasEnv, promptHidden, readClaimFile, writeProjectMeta, } from "../lib/fs.js";
5
- import { writeFolderToken } from "../lib/credentials.js";
6
- import { writeCachedWrappedKey } from "../lib/pek.js";
7
- import { ApiClient, resolveApiUrl } from "../lib/api.js";
8
- function openBrowser(url) {
9
- const platform = process.platform;
10
- const cmd = platform === "win32"
11
- ? `start "" "${url}"`
12
- : platform === "darwin"
13
- ? `open "${url}"`
14
- : `xdg-open "${url}"`;
15
- exec(cmd, () => undefined);
3
+ import { clearClaimFile, ensureGitignoreHasEnv, promptHidden, readClaimFile, readProjectMeta, writeProjectMeta, } from "../lib/fs.js";
4
+ import { readFolderToken, writeFolderToken } from "../lib/credentials.js";
5
+ import { writeCachedKey } from "../lib/pek.js";
6
+ import { ApiClient, ApiError, resolveApiUrl } from "../lib/api.js";
7
+ import { authorizeFolder, openBrowser, sleep } from "../lib/authorize.js";
8
+ async function askNewVaultPassword() {
9
+ console.error(pc.dim("Choose a Vault password. It stays on this machine. We store an encrypted key only.\n"));
10
+ const password = await promptHidden("New Vault password (hidden): ");
11
+ if (!password)
12
+ throw new Error("Vault password required to claim.");
13
+ const confirm = await promptHidden("Confirm Vault password (hidden): ");
14
+ if (password !== confirm)
15
+ throw new Error("Passwords did not match. Run claim again.");
16
+ return password;
16
17
  }
17
- function sleep(ms) {
18
- return new Promise((resolve) => setTimeout(resolve, ms));
18
+ /** Swap the guest-passphrase wrap for a Vault password wrap. Ciphertext stays the same. */
19
+ async function finishRewrap(owned, claim, password) {
20
+ const { wrappedProjectKey } = await owned.request("GET", "/api/cli/vault");
21
+ if (wrappedProjectKey != null) {
22
+ const current = typeof wrappedProjectKey === "string" ? wrappedProjectKey : JSON.stringify(wrappedProjectKey);
23
+ const rewrapped = serializeWrappedKey(await rewrapProjectKey(claim.passphrase, password, parseWrappedKey(current)));
24
+ await owned.request("POST", "/api/cli/vault", {
25
+ wrappedProjectKey: JSON.parse(rewrapped),
26
+ claimCode: claim.claimCode,
27
+ });
28
+ writeCachedKey(rewrapped);
29
+ }
30
+ clearClaimFile();
31
+ ensureGitignoreHasEnv();
32
+ console.error(`\n${pc.green("✓")} Claimed ${pc.bold(claim.projectName)}. Vault password set.`);
33
+ console.error(pc.dim("claim.json was removed. Commit that change. Production (locked) is now available in the dashboard.\n"));
34
+ }
35
+ /** A signed-in folder token for the claimed project: reuse this folder's, or sign in. */
36
+ async function ownerClient(apiUrl, claim) {
37
+ const existing = readFolderToken();
38
+ if (existing?.projectId === claim.projectId) {
39
+ const client = new ApiClient(apiUrl, existing.token);
40
+ try {
41
+ const who = await client.request("GET", "/api/cli/whoami");
42
+ if (!who.isGuest && who.token.kind === "folder")
43
+ return client;
44
+ }
45
+ catch (err) {
46
+ if (!(err instanceof ApiError))
47
+ throw err;
48
+ }
49
+ }
50
+ console.error(pc.dim("Sign in and pick this project to finish.\n"));
51
+ const who = await authorizeFolder({ apiUrl });
52
+ if (who.project.id !== claim.projectId) {
53
+ throw new Error(`You picked ${who.project.name}. Run claim again and pick ${claim.projectName}.`);
54
+ }
55
+ const token = readFolderToken()?.token;
56
+ if (!token)
57
+ throw new Error("Sign-in did not save a token. Run claim again.");
58
+ return new ApiClient(apiUrl, token);
59
+ }
60
+ /** Claimed in the browser, but the CLI never finished. Finish with claim.json. */
61
+ async function resumeClaim(apiUrl, claim) {
62
+ console.error(pc.dim("This project is already claimed. Finishing the Vault password setup.\n"));
63
+ const owned = await ownerClient(apiUrl, claim);
64
+ const vault = await owned.request("GET", "/api/cli/vault");
65
+ if (!vault.rewrapPending) {
66
+ clearClaimFile();
67
+ console.error(`${pc.green("✓")} ${pc.bold(claim.projectName)} is already set up. claim.json was removed.\n`);
68
+ return;
69
+ }
70
+ const password = await askNewVaultPassword();
71
+ await finishRewrap(owned, claim, password);
19
72
  }
20
73
  /**
21
- * Claim a guest project: browser ownership transfer, then rewrap vault password.
74
+ * Claim a guest project: sign in and take ownership in the browser, then
75
+ * rewrap the project key with a Vault password.
22
76
  */
23
77
  export async function claimCommand(opts = {}) {
24
- console.log(pc.bold("\ngetmyenv claim\n"));
78
+ console.error(pc.bold("\ngetmyenv claim\n"));
25
79
  const claim = readClaimFile();
26
80
  if (!claim) {
27
- throw new Error("No .getmyenv/claim.json in this folder. Run guest in the project that created it, or clone a repo that committed claim.json.");
28
- }
29
- const apiUrl = opts.apiUrl?.trim() ||
30
- process.env.GETMYENV_API_URL?.trim() ||
31
- resolveApiUrl(opts.apiUrl);
32
- const claimUrl = `${apiUrl.replace(/\/$/, "")}/claim?code=${encodeURIComponent(claim.claimCode)}`;
33
- console.log("Open this URL to claim the project:\n");
34
- console.log(` ${claimUrl}\n`);
35
- if (process.stdin.isTTY) {
36
- openBrowser(claimUrl);
37
- console.log(pc.dim("Opened in your browser. Waiting...\n"));
81
+ throw new Error("No .getmyenv/claim.json in this folder. Run claim in the folder that created the guest project, or in a clone that has claim.json.");
38
82
  }
39
- else {
40
- console.log(pc.dim("Waiting for claim approval...\n"));
83
+ if (!process.stdin.isTTY) {
84
+ throw new Error("Claim needs a terminal to set a Vault password. Run: npx getmyenv claim");
41
85
  }
86
+ const apiUrl = resolveApiUrl(opts.apiUrl);
42
87
  const client = new ApiClient(apiUrl);
43
- const deadline = Date.now() + 10 * 60 * 1000;
88
+ const start = await client.request("POST", "/api/claim/start", {
89
+ claimCode: claim.claimCode,
90
+ });
91
+ if (start.status === "invalid") {
92
+ throw new Error("This claim code is not valid. Check .getmyenv/claim.json.");
93
+ }
94
+ if (start.status === "expired") {
95
+ throw new Error("This guest project expired more than 30 days ago. It can no longer be claimed.");
96
+ }
97
+ if (start.status === "claimed") {
98
+ await resumeClaim(apiUrl, claim);
99
+ return;
100
+ }
101
+ if (start.status !== "claimable")
102
+ throw new Error("Unexpected claim status. Run claim again.");
103
+ const session = start;
104
+ const password = await askNewVaultPassword();
105
+ const base = apiUrl.replace(/\/$/, "");
106
+ const claimUrl = `${base}/claim?code=${encodeURIComponent(claim.claimCode)}&session=${encodeURIComponent(session.sessionId)}`;
107
+ console.error("\nOpen this URL to claim the project:\n");
108
+ console.error(` ${claimUrl}\n`);
109
+ openBrowser(claimUrl);
110
+ console.error(pc.dim("Opened in your browser. Waiting...\n"));
111
+ const deadline = new Date(session.expiresAt).getTime();
44
112
  let newToken = null;
45
113
  while (Date.now() < deadline) {
46
- let poll;
47
- try {
48
- poll = await client.request("GET", `/api/claim/poll?claimCode=${encodeURIComponent(claim.claimCode)}`);
49
- }
50
- catch (err) {
51
- const msg = err instanceof Error ? err.message : String(err);
52
- throw new Error(`Could not poll claim: ${msg}`);
53
- }
114
+ const poll = await client.request("POST", "/api/claim/poll", {
115
+ claimCode: claim.claimCode,
116
+ sessionId: session.sessionId,
117
+ pollSecret: session.pollSecret,
118
+ });
54
119
  if (poll.status === "approved" && poll.token) {
55
120
  newToken = poll.token;
56
121
  break;
57
122
  }
58
123
  if (poll.status === "consumed") {
59
- throw new Error("Claim already finished on this code. Run: npx getmyenv run -- <cmd>");
124
+ throw new Error("This claim session was already used. Run claim again.");
60
125
  }
61
126
  if (poll.status === "expired") {
62
- throw new Error("Claim session expired. Open the claim URL again.");
127
+ throw new Error("Claim session expired. Run claim again.");
63
128
  }
64
129
  const remaining = Math.max(0, Math.ceil((deadline - Date.now()) / 1000));
65
- process.stdout.write(`\r${pc.dim(`Waiting... ${String(remaining).padStart(2, "0")}s`)} `);
130
+ process.stderr.write(`\r${pc.dim(`Waiting... ${String(remaining).padStart(2, "0")}s`)} `);
66
131
  await sleep(2000);
67
132
  }
68
- process.stdout.write("\n");
69
- if (!newToken) {
70
- throw new Error("Claim timed out. Open the URL and try again.");
71
- }
72
- writeFolderToken({
73
- token: newToken,
74
- apiUrl,
75
- cliScope: "development",
76
- projectId: claim.projectId,
77
- projectName: claim.projectName,
78
- });
133
+ process.stderr.write("\n");
134
+ if (!newToken)
135
+ throw new Error("Claim timed out. Run claim again.");
136
+ writeFolderToken({ token: newToken, apiUrl, projectId: claim.projectId });
137
+ const meta = readProjectMeta();
79
138
  writeProjectMeta({
139
+ ...(meta ?? {}),
80
140
  projectId: claim.projectId,
81
141
  projectName: claim.projectName,
82
- apiUrl,
83
- environment: "development",
84
142
  });
85
- const owned = new ApiClient(apiUrl, newToken);
86
- if (!process.stdin.isTTY) {
87
- clearClaimFile();
88
- ensureGitignoreHasEnv();
89
- console.log(`${pc.green("✓")} Claimed ${claim.projectName}. Set a Vault password with a TTY: npx getmyenv claim\n`);
90
- return;
91
- }
92
- console.log(pc.dim("Set a Vault password. This rewraps the project key. Secret ciphertext stays the same.\n"));
93
- const password = await promptHidden("New Vault password: ");
94
- if (!password) {
95
- throw new Error("Vault password required to finish claim.");
96
- }
97
- const confirm = await promptHidden("Confirm Vault password: ");
98
- if (password !== confirm) {
99
- throw new Error("Passwords did not match.");
100
- }
101
- const exported = await owned.request("GET", `/api/cli/projects/${encodeURIComponent(claim.projectId)}/export?environment=development`);
102
- const currentWrapped = typeof exported.wrappedProjectKey === "string"
103
- ? exported.wrappedProjectKey
104
- : JSON.stringify(exported.wrappedProjectKey);
105
- const rewrapped = await rewrapProjectKey(claim.passphrase, password, parseWrappedKey(currentWrapped));
106
- const wrappedRaw = serializeWrappedKey(rewrapped);
107
- await owned.request("POST", `/api/cli/projects/${encodeURIComponent(claim.projectId)}/vault`, { wrappedProjectKey: JSON.parse(wrappedRaw) });
108
- writeCachedWrappedKey(wrappedRaw);
109
- clearClaimFile();
110
- ensureGitignoreHasEnv();
111
- console.log(`\n${pc.green("✓")} Claimed ${pc.bold(claim.projectName)}. Vault password set.\n`);
143
+ await finishRewrap(new ApiClient(apiUrl, newToken), claim, password);
112
144
  }
113
145
  //# sourceMappingURL=claim.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ type Opts = {
2
+ apiUrl?: string;
3
+ };
4
+ export declare function contextListCommand(opts: Opts): Promise<void>;
5
+ export declare function contextCreateCommand(name: string, opts: Opts & {
6
+ from?: string;
7
+ use?: boolean;
8
+ }): Promise<void>;
9
+ export declare function contextUseCommand(slug: string, opts: Opts): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAKA,KAAK,IAAI,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/E"}
@@ -0,0 +1,53 @@
1
+ import pc from "picocolors";
2
+ import { readProjectMeta, writeProjectMeta } from "../lib/fs.js";
3
+ import { ensureTokenAndLink } from "../lib/bootstrap.js";
4
+ import { defaultContextSlug, findContext } from "../lib/context.js";
5
+ export async function contextListCommand(opts) {
6
+ const { who, meta } = await ensureTokenAndLink({ apiUrl: opts.apiUrl, quiet: true });
7
+ const current = defaultContextSlug(who, meta);
8
+ const width = Math.max(...who.contexts.map((c) => c.slug.length), 4);
9
+ for (const c of who.contexts) {
10
+ const marker = c.slug === current ? pc.green("*") : " ";
11
+ const prot = c.protection === "locked" ? pc.yellow("locked") : pc.dim("open ");
12
+ console.log(`${marker} ${c.slug.padEnd(width)} ${prot} ${c.name}`);
13
+ }
14
+ }
15
+ export async function contextCreateCommand(name, opts) {
16
+ const { who, client } = await ensureTokenAndLink({ apiUrl: opts.apiUrl, quiet: true });
17
+ let from;
18
+ if (opts.from) {
19
+ const source = findContext(who.contexts, opts.from);
20
+ if (!source)
21
+ throw new Error(`No context "${opts.from}".`);
22
+ if (source.protection === "locked") {
23
+ throw new Error(`${source.slug} is locked. Copy from it in the dashboard.`);
24
+ }
25
+ from = source.slug;
26
+ }
27
+ const created = await client.request("POST", "/api/cli/contexts", { name, ...(from ? { from } : {}) });
28
+ console.log(`${pc.green("✓")} Context ${pc.bold(created.name)} (${created.slug}), open${from ? `, values copied from ${from}` : ""}`);
29
+ if (opts.use) {
30
+ const meta = readProjectMeta();
31
+ writeProjectMeta({ ...(meta ?? {}), context: created.slug });
32
+ console.log(pc.dim(`Default context for this folder: ${created.slug}`));
33
+ }
34
+ else {
35
+ console.log(pc.dim(`Run with it: npx getmyenv run ${created.slug} -- <command>`));
36
+ }
37
+ }
38
+ export async function contextUseCommand(slug, opts) {
39
+ const { who } = await ensureTokenAndLink({ apiUrl: opts.apiUrl, quiet: true });
40
+ const ctx = findContext(who.contexts, slug);
41
+ if (!ctx) {
42
+ const available = who.contexts.map((c) => c.slug).join(", ");
43
+ throw new Error(`No context "${slug}". Available: ${available}`);
44
+ }
45
+ if (ctx.protection === "locked" && who.token.kind !== "server") {
46
+ throw new Error(`${ctx.slug} is locked. This folder's token reads open contexts only. Locked contexts are read on servers with a server token.`);
47
+ }
48
+ const meta = readProjectMeta();
49
+ writeProjectMeta({ ...(meta ?? {}), context: ctx.slug });
50
+ console.log(`${pc.green("✓")} Default context for this folder: ${pc.bold(ctx.slug)}`);
51
+ console.log(pc.dim("Saved in .getmyenv/project.json."));
52
+ }
53
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type ExportOpts = {
2
+ context?: string;
3
+ apiUrl?: string;
4
+ output?: string;
5
+ stdout?: boolean;
6
+ yes?: boolean;
7
+ vaultPasswordStdin?: boolean;
8
+ };
9
+ /** `export`: write one open context to a plaintext file, for tools that need one. */
10
+ export declare function exportCommand(opts: ExportOpts): Promise<void>;
11
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,qFAAqF;AACrF,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DnE"}
@@ -0,0 +1,67 @@
1
+ import fs from "node:fs";
2
+ import pc from "picocolors";
3
+ import { decryptSecret, parsePayload } from "@getmyenv/crypto";
4
+ import { EXPORT_WARNING, formatDotenvValue } from "@getmyenv/shared";
5
+ import { ensureGitignoreHas, ensureGitignoreHasEnv, parseEnvFile } from "../lib/fs.js";
6
+ import { ensureTokenAndLink } from "../lib/bootstrap.js";
7
+ import { resolveContext } from "../lib/context.js";
8
+ import { confirmDiff } from "../lib/confirm.js";
9
+ import { unlockProjectKey } from "../lib/unlock.js";
10
+ /** `export`: write one open context to a plaintext file, for tools that need one. */
11
+ export async function exportCommand(opts) {
12
+ const log = opts.stdout ? (l = "") => console.error(l) : (l = "") => console.log(l);
13
+ const linked = await ensureTokenAndLink({ apiUrl: opts.apiUrl, quiet: opts.stdout });
14
+ const ctx = resolveContext(linked.who, linked.meta, opts.context);
15
+ if (ctx.protection === "locked") {
16
+ throw new Error(`${ctx.slug} is locked. Export it in the dashboard.`);
17
+ }
18
+ log(pc.yellow(EXPORT_WARNING));
19
+ const data = await linked.client.request("GET", `/api/cli/values?context=${encodeURIComponent(ctx.slug)}`);
20
+ const remote = {};
21
+ if (data.values.length > 0) {
22
+ const { pek } = await unlockProjectKey({
23
+ isGuest: linked.who.isGuest,
24
+ projectId: linked.who.project.id,
25
+ wrapped: data.wrappedProjectKey,
26
+ cache: true,
27
+ vaultPasswordStdin: opts.vaultPasswordStdin,
28
+ apiUrl: linked.apiUrl,
29
+ });
30
+ for (const v of data.values)
31
+ remote[v.name] = decryptSecret(pek, parsePayload(v.ciphertext));
32
+ }
33
+ const lines = [
34
+ `# Exported by getmyenv from ${ctx.slug}. Plaintext. Do not commit.`,
35
+ ...Object.entries(remote).map(([k, v]) => `${k}=${formatDotenvValue(v)}`),
36
+ ...data.missing.map((m) => `# ${m.name} has no value in ${ctx.slug}`),
37
+ ];
38
+ if (opts.stdout) {
39
+ process.stdout.write(lines.join("\n") + "\n");
40
+ return;
41
+ }
42
+ const out = opts.output || ".env";
43
+ if (fs.existsSync(out)) {
44
+ const local = parseEnvFile(out);
45
+ const conflicts = Object.keys(remote)
46
+ .filter((k) => k in local && local[k] !== remote[k])
47
+ .map((name) => ({ name, detail: "local value differs" }));
48
+ const dropped = Object.keys(local)
49
+ .filter((k) => !(k in remote))
50
+ .map((name) => ({ name, detail: "only in the local file, will be removed" }));
51
+ const ok = await confirmDiff({
52
+ conflicts: [...conflicts, ...dropped],
53
+ action: `Overwrite ${out}`,
54
+ yes: opts.yes,
55
+ });
56
+ if (!ok) {
57
+ log(pc.dim("Kept the existing file."));
58
+ return;
59
+ }
60
+ }
61
+ fs.writeFileSync(out, lines.join("\n") + "\n", { mode: 0o600 });
62
+ fs.chmodSync(out, 0o600);
63
+ ensureGitignoreHasEnv();
64
+ ensureGitignoreHas(out);
65
+ log(`${pc.green("✓")} Wrote ${Object.keys(remote).length} variable(s) from ${ctx.slug} to ${out}`);
66
+ }
67
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,16 @@ export type GuestOpts = {
2
2
  name?: string;
3
3
  apiUrl?: string;
4
4
  };
5
+ export declare function folderNameHint(): string;
5
6
  /**
6
- * Create an unclaimed guest project (AI scaffolding path).
7
- * Writes token.json (gitignored). Writes project.json + claim.json for handoff.
8
- * claim.json holds the guest wrapping passphrase until claim - prefer private repos until then.
7
+ * Create an unclaimed guest project with one open context, Development.
8
+ * Writes token.json and key.json (gitignored), project.json and claim.json (committed).
9
+ * claim.json holds the guest passphrase inside the project folder until claim.
9
10
  */
11
+ export declare function createGuestProject(opts?: GuestOpts): Promise<{
12
+ projectId: string;
13
+ projectName: string;
14
+ guestExpiresAt: string;
15
+ }>;
10
16
  export declare function guestCommand(opts?: GuestOpts): Promise<void>;
11
17
  //# sourceMappingURL=guest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"guest.d.ts","sourceRoot":"","sources":["../../src/commands/guest.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAMF;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EtE"}
1
+ {"version":3,"file":"guest.d.ts","sourceRoot":"","sources":["../../src/commands/guest.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC,CA2DD;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE"}
@@ -2,51 +2,43 @@ import { randomBytes } from "node:crypto";
2
2
  import path from "node:path";
3
3
  import pc from "picocolors";
4
4
  import { createWrappedProjectKey, serializeWrappedKey, } from "@getmyenv/crypto";
5
- import { ensureGitignoreHasEnv, writeClaimFile, writeProjectMeta, } from "../lib/fs.js";
6
- import { writeFolderToken } from "../lib/credentials.js";
7
- import { writeCachedWrappedKey } from "../lib/pek.js";
5
+ import { ensureGitignoreHasEnv, readProjectMeta, writeClaimFile, writeProjectMeta, } from "../lib/fs.js";
6
+ import { readFolderToken, writeFolderToken } from "../lib/credentials.js";
7
+ import { writeCachedKey } from "../lib/pek.js";
8
8
  import { ApiClient, resolveApiUrl } from "../lib/api.js";
9
- function folderNameHint() {
9
+ export function folderNameHint() {
10
10
  return path.basename(process.cwd()) || "project";
11
11
  }
12
12
  /**
13
- * Create an unclaimed guest project (AI scaffolding path).
14
- * Writes token.json (gitignored). Writes project.json + claim.json for handoff.
15
- * claim.json holds the guest wrapping passphrase until claim - prefer private repos until then.
13
+ * Create an unclaimed guest project with one open context, Development.
14
+ * Writes token.json and key.json (gitignored), project.json and claim.json (committed).
15
+ * claim.json holds the guest passphrase inside the project folder until claim.
16
16
  */
17
- export async function guestCommand(opts = {}) {
18
- console.log(pc.bold("\ngetmyenv guest\n"));
19
- const apiUrl = opts.apiUrl?.trim() ||
20
- process.env.GETMYENV_API_URL?.trim() ||
21
- resolveApiUrl(opts.apiUrl);
17
+ export async function createGuestProject(opts = {}) {
18
+ if (readFolderToken() || readProjectMeta()?.projectId) {
19
+ throw new Error("This folder is already linked. Run: npx getmyenv (or npx getmyenv unlink first)");
20
+ }
21
+ const apiUrl = resolveApiUrl(opts.apiUrl);
22
22
  const name = (opts.name?.trim() || folderNameHint()).slice(0, 120);
23
23
  const passphrase = randomBytes(32).toString("base64url");
24
24
  const { wrapped } = await createWrappedProjectKey(passphrase);
25
25
  const wrappedRaw = serializeWrappedKey(wrapped);
26
- const client = new ApiClient(apiUrl);
27
26
  let created;
28
27
  try {
29
- created = await client.request("POST", "/api/anon-projects", {
28
+ created = await new ApiClient(apiUrl).request("POST", "/api/anon-projects", {
30
29
  name,
31
30
  wrappedProjectKey: wrappedRaw,
32
31
  });
33
32
  }
34
33
  catch (err) {
35
34
  const msg = err instanceof Error ? err.message : String(err);
36
- throw new Error(`Could not create guest project: ${msg}`);
35
+ throw new Error(`Could not create a guest project: ${msg}`);
37
36
  }
38
- writeFolderToken({
39
- token: created.token,
40
- apiUrl,
41
- cliScope: "development",
42
- projectId: created.projectId,
43
- projectName: created.projectName,
44
- });
37
+ writeFolderToken({ token: created.token, apiUrl, projectId: created.projectId });
45
38
  writeProjectMeta({
46
39
  projectId: created.projectId,
47
40
  projectName: created.projectName,
48
- apiUrl,
49
- environment: "development",
41
+ context: created.context,
50
42
  });
51
43
  writeClaimFile({
52
44
  claimCode: created.claimCode,
@@ -55,12 +47,22 @@ export async function guestCommand(opts = {}) {
55
47
  projectName: created.projectName,
56
48
  guestExpiresAt: created.guestExpiresAt,
57
49
  });
58
- writeCachedWrappedKey(wrappedRaw);
50
+ writeCachedKey(wrappedRaw);
59
51
  ensureGitignoreHasEnv();
60
- const daysLeft = Math.max(0, Math.ceil((new Date(created.guestExpiresAt).getTime() - Date.now()) /
61
- (24 * 60 * 60 * 1000)));
62
- console.log(`${pc.green("✓")} Guest project ${pc.bold(created.projectName)} (${created.projectId})`);
63
- console.log(pc.dim(`Expires in ~${daysLeft} days. Commit project.json and claim.json. Do not commit token.json.`));
64
- console.log(pc.yellow(`\nClaim: npx getmyenv claim\n`));
52
+ const daysLeft = Math.max(0, Math.ceil((new Date(created.guestExpiresAt).getTime() - Date.now()) / 86_400_000));
53
+ console.error(`${pc.green("✓")} Guest project ${pc.bold(created.projectName)}. Context: development.`);
54
+ console.error(pc.dim(`Expires in ${daysLeft} days unless claimed. Commit .getmyenv/project.json. Commit claim.json to private repos only. token.json and key.json stay local.`));
55
+ console.error(pc.dim("claim.json holds the guest passphrase until you claim.\n"));
56
+ return created;
57
+ }
58
+ export async function guestCommand(opts = {}) {
59
+ console.error(pc.bold("\ngetmyenv guest\n"));
60
+ await createGuestProject(opts);
61
+ console.error("Next:");
62
+ console.error(pc.cyan(" npx getmyenv import ") + pc.dim("# from .env"));
63
+ console.error(pc.cyan(" npx getmyenv set API_KEY ") + pc.dim("# or one at a time"));
64
+ console.error(pc.cyan(" npx getmyenv run -- npm start ") + pc.dim("# your start command"));
65
+ console.error(pc.cyan(" npx getmyenv claim ") + pc.dim("# keep it, with an account"));
66
+ console.error("");
65
67
  }
66
68
  //# sourceMappingURL=guest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"guest.js","sourceRoot":"","sources":["../../src/commands/guest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guest.js","sourceRoot":"","sources":["../../src/commands/guest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export type ImportOpts = {
2
+ context?: string;
3
+ apiUrl?: string;
4
+ prune?: boolean;
5
+ dryRun?: boolean;
6
+ yes?: boolean;
7
+ vaultPasswordStdin?: boolean;
8
+ };
9
+ type Target = {
10
+ slug: string;
11
+ files: string[];
12
+ };
13
+ /**
14
+ * Plan which file goes to which context.
15
+ * `.env.<slug>` maps to that context. `.env` and `.env.local` go to the
16
+ * default context, or to -c when given.
17
+ */
18
+ export declare function planImport(files: string[], opts: {
19
+ explicitFile: boolean;
20
+ context?: string;
21
+ defaultSlug: string;
22
+ }): Target[];
23
+ /** `import [file]`: encrypt .env values locally and upload them to contexts. */
24
+ export declare function importCommand(file: string | undefined, opts: ImportOpts): Promise<void>;
25
+ export {};
26
+ //# sourceMappingURL=import.d.ts.map