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
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Pure pieces of `getmyenv run`: validate and merge. Names only in any output.
3
+ */
4
+ /** The child never sees the CLI's own settings (token, API URL, config dir). */
5
+ export function withoutOwnEnv(parent) {
6
+ const env = {};
7
+ for (const [k, v] of Object.entries(parent)) {
8
+ if (!k.toUpperCase().startsWith("GETMYENV_"))
9
+ env[k] = v;
10
+ }
11
+ return env;
12
+ }
13
+ function present(parent, name) {
14
+ const v = parent[name];
15
+ return v !== undefined && v !== "";
16
+ }
17
+ /**
18
+ * Merge context values into the parent env.
19
+ * The context wins unless keepExisting is set. A key missing in the context is
20
+ * satisfied when the parent env already has it (for example from `op run`).
21
+ */
22
+ export function mergeEnv(parent, values, missing, keepExisting) {
23
+ const env = withoutOwnEnv(parent);
24
+ const applied = [];
25
+ const overridden = [];
26
+ const kept = [];
27
+ const entries = [];
28
+ for (const name of Object.keys(values).sort()) {
29
+ if (present(parent, name)) {
30
+ if (keepExisting) {
31
+ kept.push(name);
32
+ entries.push({ name, origin: "parent-kept" });
33
+ continue;
34
+ }
35
+ if (parent[name] !== values[name]) {
36
+ overridden.push(name);
37
+ entries.push({ name, origin: "context-overrides-parent" });
38
+ }
39
+ else {
40
+ entries.push({ name, origin: "context" });
41
+ }
42
+ }
43
+ else {
44
+ entries.push({ name, origin: "context" });
45
+ }
46
+ env[name] = values[name];
47
+ applied.push(name);
48
+ }
49
+ const filledByParent = [];
50
+ const unresolved = [];
51
+ for (const m of [...missing].sort((a, b) => a.name.localeCompare(b.name))) {
52
+ if (present(parent, m.name)) {
53
+ filledByParent.push(m.name);
54
+ entries.push({ name: m.name, origin: "parent-fills-missing", reason: m.reason });
55
+ }
56
+ else {
57
+ unresolved.push(m);
58
+ entries.push({ name: m.name, origin: "missing", reason: m.reason });
59
+ }
60
+ }
61
+ entries.sort((a, b) => a.name.localeCompare(b.name));
62
+ return { env, applied, overridden, kept, filledByParent, unresolved, entries };
63
+ }
64
+ /** Error text when keys are unresolved and --allow-missing is not set. Null when fine. */
65
+ export function validationError(result, contextSlug, allowMissing) {
66
+ if (allowMissing || result.unresolved.length === 0)
67
+ return null;
68
+ const lines = result.unresolved.map((m) => ` ${m.name}${m.reason === "expired" ? " (expired)" : ""}`);
69
+ return [
70
+ `${result.unresolved.length} variable(s) have no value in ${contextSlug}:`,
71
+ ...lines,
72
+ `Set them: npx getmyenv set NAME -c ${contextSlug}`,
73
+ "Or run anyway: --allow-missing",
74
+ ].join("\n");
75
+ }
76
+ const ORIGIN_TEXT = {
77
+ context: (ctx) => `getmyenv (${ctx})`,
78
+ "context-overrides-parent": (ctx) => `getmyenv (${ctx}), replaces parent env`,
79
+ "parent-kept": () => "parent env (--keep-existing)",
80
+ "parent-fills-missing": (ctx, reason) => `parent env (${reason === "expired" ? "expired" : "missing"} in ${ctx})`,
81
+ missing: (ctx, reason) => `not set (${reason === "expired" ? "expired" : "missing"} in ${ctx})`,
82
+ };
83
+ /**
84
+ * One cmd.exe command line from argv. Windows needs the shell to find `npm.cmd`
85
+ * and friends, and Node does not quote args passed alongside `shell: true`.
86
+ * cmd expands %VAR% even inside quotes, so each % is closed out of the quotes
87
+ * and escaped with ^.
88
+ */
89
+ export function windowsCommandLine(args) {
90
+ return args
91
+ .map((a) => {
92
+ if (a === "")
93
+ return '""';
94
+ if (!/[\s"&|<>^()%]/.test(a))
95
+ return a;
96
+ const escaped = a.replace(/(\\*)"/g, '$1$1\\"').replace(/(\\+)$/, "$1$1");
97
+ return `"${escaped.replace(/%/g, '"^%"')}"`;
98
+ })
99
+ .join(" ");
100
+ }
101
+ /** Exit code for a child that ended by signal: 128 + signal number, like a shell. */
102
+ export function signalExitCode(signal, numbers) {
103
+ const n = numbers[signal];
104
+ return typeof n === "number" ? 128 + n : 1;
105
+ }
106
+ /** `--explain` output. Names and origins only, never values. */
107
+ export function explainLines(result, contextSlug) {
108
+ const width = Math.max(4, ...result.entries.map((e) => e.name.length));
109
+ const lines = result.entries.map((e) => ` ${e.name.padEnd(width)} ${ORIGIN_TEXT[e.origin](contextSlug, e.reason)}`);
110
+ lines.push("");
111
+ lines.push(` ${result.applied.length} from getmyenv, ${result.overridden.length} replaced, ${result.kept.length} kept, ${result.filledByParent.length} from parent env, ${result.unresolved.length} not set`);
112
+ return lines;
113
+ }
114
+ //# sourceMappingURL=run-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-env.js","sourceRoot":"","sources":["../../src/lib/run-env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type UnlockOpts = {
2
+ isGuest: boolean;
3
+ /** Enables the OS keychain cache for open contexts. */
4
+ projectId?: string;
5
+ /** Wrapped key from the server, or null when the project has none yet. */
6
+ wrapped: unknown | null;
7
+ /** Open contexts only: read and refresh `.getmyenv/key.json`. */
8
+ cache: boolean;
9
+ /** Create a project key when none exists (first `set` / `import`). */
10
+ allowCreate?: boolean;
11
+ vaultPasswordStdin?: boolean;
12
+ /** --api-url, so the keychain entry matches the one `lock --api-url` clears. */
13
+ apiUrl?: string;
14
+ };
15
+ /**
16
+ * Unwrap the project key with the Vault password (or the guest passphrase in
17
+ * claim.json). Retries a wrong password up to 3 times in a terminal.
18
+ */
19
+ export declare function unlockProjectKey(opts: UnlockOpts): Promise<{
20
+ pek: Uint8Array;
21
+ wrappedRaw: string;
22
+ created: boolean;
23
+ }>;
24
+ //# sourceMappingURL=unlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlock.d.ts","sourceRoot":"","sources":["../../src/lib/unlock.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,iEAAiE;IACjE,KAAK,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,GACf,OAAO,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAsCpE"}
@@ -0,0 +1,87 @@
1
+ import pc from "picocolors";
2
+ import { hasCachedKey, loadPek } from "./pek.js";
3
+ import { resolveVaultPassword } from "./guest-key.js";
4
+ import { resolveApiUrl } from "./api.js";
5
+ import { KEYCHAIN_TTL_MS, keychainAccount, keychainEnabled, readCachedPek, storeCachedPek, } from "./keychain.js";
6
+ /**
7
+ * Unwrap the project key with the Vault password (or the guest passphrase in
8
+ * claim.json). Retries a wrong password up to 3 times in a terminal.
9
+ */
10
+ export async function unlockProjectKey(opts) {
11
+ const known = opts.wrapped != null
12
+ ? typeof opts.wrapped === "string"
13
+ ? opts.wrapped
14
+ : JSON.stringify(opts.wrapped)
15
+ : null;
16
+ if (memo && (known === memo.wrappedRaw || (known == null && opts.cache))) {
17
+ return { pek: memo.pek, wrappedRaw: memo.wrappedRaw, created: false };
18
+ }
19
+ const account = canUseKeychain(opts)
20
+ ? keychainAccount(resolveApiUrl(opts.apiUrl), opts.projectId)
21
+ : null;
22
+ if (account && known != null) {
23
+ const pek = await readCachedPek(account, known);
24
+ if (pek) {
25
+ memo = { pek, wrappedRaw: known };
26
+ return { pek, wrappedRaw: known, created: false };
27
+ }
28
+ }
29
+ const result = await unlockWithPassword(opts);
30
+ memo = { pek: result.pek, wrappedRaw: result.wrappedRaw };
31
+ // Stored only after a password typed at a terminal. Reading also works when
32
+ // stdin is piped, e.g. `printf %s "$VALUE" | getmyenv set KEY --stdin`.
33
+ if (account &&
34
+ process.stdin.isTTY === true &&
35
+ (await storeCachedPek(account, result.wrappedRaw, result.pek))) {
36
+ console.error(pc.dim(`Unlocked on this machine for ${KEYCHAIN_TTL_MS / 3_600_000} hours (OS keychain). Forget it with: npx getmyenv lock\n`));
37
+ }
38
+ return result;
39
+ }
40
+ /** Open contexts on a real account. Never CI, servers, guests or --vault-password-stdin. */
41
+ function canUseKeychain(opts) {
42
+ return (opts.cache &&
43
+ !opts.isGuest &&
44
+ !opts.vaultPasswordStdin &&
45
+ Boolean(opts.projectId) &&
46
+ keychainEnabled());
47
+ }
48
+ /** One unlock per process: several uploads in one command prompt once. */
49
+ let memo = null;
50
+ async function unlockWithPassword(opts) {
51
+ const creating = opts.allowCreate === true &&
52
+ opts.wrapped == null &&
53
+ !(opts.cache && hasCachedKey());
54
+ if (creating && !opts.isGuest) {
55
+ console.error(pc.dim("Choose a Vault password. It stays on this machine. We store an encrypted key only.\n"));
56
+ }
57
+ const interactive = process.stdin.isTTY && !opts.vaultPasswordStdin && !opts.isGuest;
58
+ const maxAttempts = creating || !interactive ? 1 : 3;
59
+ for (let attempt = 1;; attempt++) {
60
+ const password = await resolveVaultPassword({
61
+ isGuest: opts.isGuest,
62
+ vaultPasswordStdin: opts.vaultPasswordStdin,
63
+ create: creating,
64
+ });
65
+ try {
66
+ return await loadPek({
67
+ password,
68
+ cache: opts.cache,
69
+ wrapped: opts.wrapped ?? undefined,
70
+ allowCreate: opts.allowCreate,
71
+ });
72
+ }
73
+ catch (err) {
74
+ if (err instanceof Error && /no key yet/i.test(err.message))
75
+ throw err;
76
+ if (opts.isGuest) {
77
+ throw new Error("Could not unlock with the claim.json passphrase. Restore claim.json from the repo.");
78
+ }
79
+ if (attempt < maxAttempts) {
80
+ console.error(pc.red("Wrong Vault password. Try again.\n"));
81
+ continue;
82
+ }
83
+ throw new Error("Could not unlock. Check your Vault password.");
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=unlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlock.js","sourceRoot":"","sources":["../../src/lib/unlock.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,11 @@
4
4
  */
5
5
  /** Simple semver compare for x.y.z (no prerelease). Returns -1 / 0 / 1. */
6
6
  export declare function compareSemver(a: string, b: string): number;
7
+ /** One line for the nudge, or null when up to date or unknown. */
8
+ export declare function updateLine(current: string, latest: string | null): string | null;
7
9
  /**
8
- * If a newer version exists, suggest updating first.
9
- * TTY: default No on continue (exit 0). Non-TTY: warn and continue.
10
+ * Soft update nudge. Never blocks and never exits: one line on stderr from the
11
+ * cached npm version, refreshed in the background once a day. Skipped in CI.
10
12
  */
11
13
  export declare function maybeSuggestUpdate(): Promise<void>;
12
14
  //# sourceMappingURL=update-check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU1D;AA6ED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CA0CxD"}
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU1D;AA8ED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAGhF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBxD"}
@@ -2,12 +2,12 @@
2
2
  * Soft update nudge: compare running CLI_VERSION to npm latest.
3
3
  * Cache under ~/.config/getmyenv. Fail-open on network errors.
4
4
  */
5
+ import { spawn } from "node:child_process";
5
6
  import fs from "node:fs";
6
7
  import os from "node:os";
7
8
  import path from "node:path";
8
9
  import pc from "picocolors";
9
10
  import { CLI_VERSION } from "./api.js";
10
- import { promptConfirm } from "./fs.js";
11
11
  const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
12
12
  const FETCH_TIMEOUT_MS = 2500;
13
13
  function configDir() {
@@ -46,43 +46,6 @@ function readCache() {
46
46
  return null;
47
47
  }
48
48
  }
49
- function writeCache(latest) {
50
- try {
51
- const dir = configDir();
52
- fs.mkdirSync(dir, { recursive: true });
53
- const payload = {
54
- latest,
55
- checkedAt: new Date().toISOString(),
56
- };
57
- fs.writeFileSync(cachePath(), JSON.stringify(payload, null, 2), {
58
- mode: 0o600,
59
- });
60
- }
61
- catch {
62
- /* ignore */
63
- }
64
- }
65
- async function fetchLatestFromNpm() {
66
- const ctrl = new AbortController();
67
- const timer = setTimeout(() => ctrl.abort(), FETCH_TIMEOUT_MS);
68
- try {
69
- const res = await fetch("https://registry.npmjs.org/getmyenv/latest", {
70
- signal: ctrl.signal,
71
- headers: { Accept: "application/json" },
72
- });
73
- if (!res.ok)
74
- return null;
75
- const data = (await res.json());
76
- const v = data.version?.trim();
77
- return v || null;
78
- }
79
- catch {
80
- return null;
81
- }
82
- finally {
83
- clearTimeout(timer);
84
- }
85
- }
86
49
  function looksLikeGlobalBin() {
87
50
  const argv1 = (process.argv[1] ?? "").toLowerCase();
88
51
  if (argv1.includes(`${path.sep}npx${path.sep}`) || argv1.includes("npm-cache")) {
@@ -104,46 +67,69 @@ function updateCommand() {
104
67
  ? "npm i -g getmyenv@latest"
105
68
  : "npx getmyenv@latest";
106
69
  }
70
+ /** Refresh the cache in a detached process so the command never waits on npm. */
71
+ function refreshInBackground() {
72
+ const script = `(${fetchAndCache.toString()})(${JSON.stringify(cachePath())}, ${FETCH_TIMEOUT_MS})`;
73
+ try {
74
+ const child = spawn(process.execPath, ["-e", script], {
75
+ detached: true,
76
+ stdio: "ignore",
77
+ windowsHide: true,
78
+ });
79
+ child.on("error", () => undefined);
80
+ child.unref();
81
+ }
82
+ catch {
83
+ /* fail open */
84
+ }
85
+ }
86
+ /** Runs in the background child. Self-contained: no imports from this module. */
87
+ async function fetchAndCache(file, timeoutMs) {
88
+ const fs = await import("node:fs");
89
+ const path = await import("node:path");
90
+ const ctrl = new AbortController();
91
+ setTimeout(() => ctrl.abort(), timeoutMs).unref();
92
+ try {
93
+ const res = await fetch("https://registry.npmjs.org/getmyenv/latest", { signal: ctrl.signal });
94
+ if (!res.ok)
95
+ return;
96
+ const data = (await res.json());
97
+ if (!data.version)
98
+ return;
99
+ fs.mkdirSync(path.dirname(file), { recursive: true });
100
+ fs.writeFileSync(file, JSON.stringify({ latest: data.version, checkedAt: new Date().toISOString() }), {
101
+ mode: 0o600,
102
+ });
103
+ }
104
+ catch {
105
+ /* fail open */
106
+ }
107
+ }
108
+ /** One line for the nudge, or null when up to date or unknown. */
109
+ export function updateLine(current, latest) {
110
+ if (!latest || compareSemver(current, latest) >= 0)
111
+ return null;
112
+ return `getmyenv ${latest} is available (you have ${current}). Update: ${updateCommand()}`;
113
+ }
107
114
  /**
108
- * If a newer version exists, suggest updating first.
109
- * TTY: default No on continue (exit 0). Non-TTY: warn and continue.
115
+ * Soft update nudge. Never blocks and never exits: one line on stderr from the
116
+ * cached npm version, refreshed in the background once a day. Skipped in CI.
110
117
  */
111
118
  export async function maybeSuggestUpdate() {
112
- if (process.env.GETMYENV_SKIP_UPDATE === "1")
119
+ const ci = process.env.CI?.trim().toLowerCase();
120
+ if (process.env.GETMYENV_SKIP_UPDATE === "1" || (ci && ci !== "false" && ci !== "0"))
113
121
  return;
114
- // --version / -V only: skip nudge noise
115
122
  if (process.argv.includes("-V") ||
116
123
  process.argv.includes("--version") ||
117
124
  process.argv.includes("-h") ||
118
125
  process.argv.includes("--help")) {
119
126
  return;
120
127
  }
121
- let latest = null;
122
128
  const cached = readCache();
123
- if (cached) {
124
- latest = cached.latest;
125
- }
126
- else {
127
- latest = await fetchLatestFromNpm();
128
- if (latest)
129
- writeCache(latest);
130
- }
131
- if (!latest)
132
- return;
133
- if (compareSemver(CLI_VERSION, latest) >= 0)
134
- return;
135
- const cmd = updateCommand();
136
- const line = `Newer getmyenv: ${latest} (you have ${CLI_VERSION}). Update first: ${cmd}`;
137
- if (!process.stdin.isTTY || !process.stdout.isTTY) {
138
- console.error(pc.yellow(`getmyenv: ${line}`));
139
- return;
140
- }
141
- console.log(pc.yellow(`\n${line}\n`));
142
- const cont = await promptConfirm(`Continue with ${CLI_VERSION} anyway?`, { defaultYes: false });
143
- if (!cont) {
144
- console.log(pc.dim(`Run: ${cmd}\n`));
145
- process.exit(0);
146
- }
147
- console.log("");
129
+ if (!cached)
130
+ refreshInBackground();
131
+ const line = updateLine(CLI_VERSION, cached?.latest ?? null);
132
+ if (line)
133
+ console.error(pc.yellow(line));
148
134
  }
149
135
  //# sourceMappingURL=update-check.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ContextInfo } from "./api.js";
2
+ import type { Linked } from "./bootstrap.js";
3
+ /** Fail fast before prompting or encrypting. Mirrors the server's `checkWrite`, which still enforces it. */
4
+ export declare function assertWritable(linked: Linked, ctx: ContextInfo): void;
5
+ /**
6
+ * Encrypt values locally and upload ciphertext to one open context.
7
+ * Empty values are declared as keys with no value in this context.
8
+ */
9
+ export declare function uploadValues(input: {
10
+ linked: Linked;
11
+ context: ContextInfo;
12
+ pairs: Record<string, string>;
13
+ prune?: boolean;
14
+ expiresAt?: string | null;
15
+ vaultPasswordStdin?: boolean;
16
+ }): Promise<{
17
+ set: string[];
18
+ pruned: string[];
19
+ declared: string[];
20
+ }>;
21
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,4GAA4G;AAC5G,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CASrE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA8CnE"}
@@ -0,0 +1,53 @@
1
+ import { encryptSecret, serializePayload } from "@getmyenv/crypto";
2
+ import { unlockProjectKey } from "./unlock.js";
3
+ /** Fail fast before prompting or encrypting. Mirrors the server's `checkWrite`, which still enforces it. */
4
+ export function assertWritable(linked, ctx) {
5
+ if (linked.who.token.kind === "server") {
6
+ throw new Error("Server tokens are read-only. Set values in the dashboard.");
7
+ }
8
+ if (ctx.protection === "locked") {
9
+ throw new Error(`${ctx.slug} is locked. The CLI is read-only there. Set values in the dashboard.`);
10
+ }
11
+ }
12
+ /**
13
+ * Encrypt values locally and upload ciphertext to one open context.
14
+ * Empty values are declared as keys with no value in this context.
15
+ */
16
+ export async function uploadValues(input) {
17
+ const { linked, context } = input;
18
+ assertWritable(linked, context);
19
+ const filled = Object.entries(input.pairs).filter(([, v]) => v !== "");
20
+ const declare = Object.entries(input.pairs)
21
+ .filter(([, v]) => v === "")
22
+ .map(([k]) => k);
23
+ let values = [];
24
+ let wrappedProjectKey;
25
+ if (filled.length > 0) {
26
+ const { wrappedProjectKey: serverWrapped } = await linked.client.request("GET", "/api/cli/vault");
27
+ const { pek, wrappedRaw, created } = await unlockProjectKey({
28
+ isGuest: linked.who.isGuest,
29
+ projectId: linked.who.project.id,
30
+ wrapped: serverWrapped,
31
+ cache: true,
32
+ allowCreate: true,
33
+ vaultPasswordStdin: input.vaultPasswordStdin,
34
+ apiUrl: linked.apiUrl,
35
+ });
36
+ if (serverWrapped == null || created) {
37
+ wrappedProjectKey = JSON.parse(wrappedRaw);
38
+ }
39
+ values = filled.map(([name, value]) => ({
40
+ name,
41
+ ciphertext: serializePayload(encryptSecret(pek, value)),
42
+ ...(input.expiresAt !== undefined ? { expiresAt: input.expiresAt } : {}),
43
+ }));
44
+ }
45
+ return linked.client.request("POST", "/api/cli/values", {
46
+ context: context.slug,
47
+ ...(wrappedProjectKey ? { wrappedProjectKey } : {}),
48
+ values,
49
+ ...(input.prune ? { prune: true } : {}),
50
+ ...(declare.length > 0 ? { declare } : {}),
51
+ });
52
+ }
53
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,4GAA4G;AAC5G,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,GAAgB;IAC7D,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,CAAC,IAAI,sEAAsE,CAClF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAOlC;IACC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAClC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEnB,IAAI,MAAM,GAA2E,EAAE,CAAC;IACxF,IAAI,iBAAsD,CAAC;IAE3D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAErE,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,CAAC;YAC1D,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;YAC3B,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAChC,OAAO,EAAE,aAAa;YACtB,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,IAAI;YACjB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QACH,IAAI,aAAa,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;YACrC,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAA4B,CAAC;QACxE,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI;YACJ,UAAU,EAAE,gBAAgB,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvD,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAC1B,MAAM,EACN,iBAAiB,EACjB;QACE,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM;QACN,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3C,CACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "getmyenv",
3
- "version": "0.5.2",
3
+ "version": "0.6.0",
4
4
  "description": "CLI for getmyenv - encrypted environment variables for any language",
5
5
  "type": "module",
6
6
  "bin": {
@@ -33,8 +33,9 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@getmyenv/crypto": "0.1.0",
37
- "@getmyenv/shared": "0.1.0",
36
+ "@getmyenv/crypto": "0.2.0",
37
+ "@getmyenv/shared": "0.2.0",
38
+ "@napi-rs/keyring": "^2.1.0",
38
39
  "commander": "^13.1.0",
39
40
  "dotenv": "^16.4.7",
40
41
  "ora": "^8.2.0",
@@ -49,6 +50,7 @@
49
50
  "node": ">=24"
50
51
  },
51
52
  "scripts": {
53
+ "prebuild": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
52
54
  "build": "tsc -p tsconfig.json",
53
55
  "dev": "tsc -p tsconfig.json --watch",
54
56
  "start": "node dist/bin.js",
@@ -1,6 +0,0 @@
1
- /**
2
- * Forget this folder: wipe local .getmyenv/ auth files.
3
- * Does not delete the cloud project or ciphertext.
4
- */
5
- export declare function deleteCommand(): Promise<void>;
6
- //# sourceMappingURL=delete.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAsDnD"}