getmyenv 0.1.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +12 -4
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +81 -51
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/backup.d.ts.map +1 -1
  7. package/dist/commands/backup.js +15 -6
  8. package/dist/commands/backup.js.map +1 -1
  9. package/dist/commands/link.d.ts +16 -0
  10. package/dist/commands/link.d.ts.map +1 -0
  11. package/dist/commands/link.js +116 -0
  12. package/dist/commands/link.js.map +1 -0
  13. package/dist/commands/pull.d.ts +15 -0
  14. package/dist/commands/pull.d.ts.map +1 -0
  15. package/dist/commands/pull.js +157 -0
  16. package/dist/commands/pull.js.map +1 -0
  17. package/dist/commands/push.d.ts +15 -0
  18. package/dist/commands/push.d.ts.map +1 -0
  19. package/dist/commands/push.js +259 -0
  20. package/dist/commands/push.js.map +1 -0
  21. package/dist/commands/restore.d.ts.map +1 -1
  22. package/dist/commands/restore.js +27 -14
  23. package/dist/commands/restore.js.map +1 -1
  24. package/dist/commands/run.d.ts +1 -0
  25. package/dist/commands/run.d.ts.map +1 -1
  26. package/dist/commands/run.js +66 -25
  27. package/dist/commands/run.js.map +1 -1
  28. package/dist/commands/token.d.ts +19 -0
  29. package/dist/commands/token.d.ts.map +1 -0
  30. package/dist/commands/token.js +188 -0
  31. package/dist/commands/token.js.map +1 -0
  32. package/dist/commands/whoami.d.ts +6 -0
  33. package/dist/commands/whoami.d.ts.map +1 -0
  34. package/dist/commands/whoami.js +51 -0
  35. package/dist/commands/whoami.js.map +1 -0
  36. package/dist/lib/api.d.ts +17 -10
  37. package/dist/lib/api.d.ts.map +1 -1
  38. package/dist/lib/api.js +77 -28
  39. package/dist/lib/api.js.map +1 -1
  40. package/dist/lib/bootstrap.d.ts +20 -0
  41. package/dist/lib/bootstrap.d.ts.map +1 -0
  42. package/dist/lib/bootstrap.js +64 -0
  43. package/dist/lib/bootstrap.js.map +1 -0
  44. package/dist/lib/confirm.d.ts +17 -0
  45. package/dist/lib/confirm.d.ts.map +1 -0
  46. package/dist/lib/confirm.js +26 -0
  47. package/dist/lib/confirm.js.map +1 -0
  48. package/dist/lib/credentials.d.ts +65 -4
  49. package/dist/lib/credentials.d.ts.map +1 -1
  50. package/dist/lib/credentials.js +256 -17
  51. package/dist/lib/credentials.js.map +1 -1
  52. package/dist/lib/fs.d.ts +19 -1
  53. package/dist/lib/fs.d.ts.map +1 -1
  54. package/dist/lib/fs.js +88 -59
  55. package/dist/lib/fs.js.map +1 -1
  56. package/dist/lib/pek.d.ts +32 -0
  57. package/dist/lib/pek.d.ts.map +1 -0
  58. package/dist/lib/pek.js +81 -0
  59. package/dist/lib/pek.js.map +1 -0
  60. package/package.json +1 -1
  61. package/dist/commands/add.d.ts +0 -8
  62. package/dist/commands/add.d.ts.map +0 -1
  63. package/dist/commands/add.js +0 -64
  64. package/dist/commands/add.js.map +0 -1
  65. package/dist/commands/export.d.ts +0 -9
  66. package/dist/commands/export.d.ts.map +0 -1
  67. package/dist/commands/export.js +0 -48
  68. package/dist/commands/export.js.map +0 -1
  69. package/dist/commands/init.d.ts +0 -2
  70. package/dist/commands/init.d.ts.map +0 -1
  71. package/dist/commands/init.js +0 -58
  72. package/dist/commands/init.js.map +0 -1
  73. package/dist/commands/login.d.ts +0 -6
  74. package/dist/commands/login.d.ts.map +0 -1
  75. package/dist/commands/login.js +0 -35
  76. package/dist/commands/login.js.map +0 -1
  77. package/dist/commands/logout.d.ts +0 -2
  78. package/dist/commands/logout.d.ts.map +0 -1
  79. package/dist/commands/logout.js +0 -13
  80. package/dist/commands/logout.js.map +0 -1
  81. package/dist/commands/migrate.d.ts +0 -13
  82. package/dist/commands/migrate.d.ts.map +0 -1
  83. package/dist/commands/migrate.js +0 -127
  84. package/dist/commands/migrate.js.map +0 -1
  85. package/dist/commands/status.d.ts +0 -7
  86. package/dist/commands/status.d.ts.map +0 -1
  87. package/dist/commands/status.js +0 -76
  88. package/dist/commands/status.js.map +0 -1
@@ -0,0 +1,64 @@
1
+ import { promptConfirm, readProjectMeta, } from "../lib/fs.js";
2
+ import { ApiClient, ensureSessionToken, getSessionToken, resolveApiUrl, } from "../lib/api.js";
3
+ import { linkCommand } from "../commands/link.js";
4
+ import { tokenCommand } from "../commands/token.js";
5
+ /**
6
+ * Ensure a CLI token exists (TTY runs token), then ensure this folder is linked
7
+ * to the token project (TTY confirms + link). Returns whoami + linked ids.
8
+ */
9
+ export async function ensureTokenAndLink(opts) {
10
+ if (!getSessionToken()) {
11
+ if (!process.stdin.isTTY) {
12
+ throw new Error("No CLI token. Run: npx getmyenv token");
13
+ }
14
+ await tokenCommand({
15
+ apiUrl: opts.apiUrl,
16
+ skipLinkOffer: true,
17
+ });
18
+ }
19
+ let meta = readProjectMeta();
20
+ let token = await ensureSessionToken(meta?.projectId);
21
+ const apiUrl = resolveApiUrl(opts.apiUrl, meta?.projectId);
22
+ const client = new ApiClient(apiUrl, token);
23
+ const who = await client.request("GET", "/api/cli/whoami");
24
+ if (meta?.projectId && String(meta.projectId) !== String(who.projectId)) {
25
+ throw new Error([
26
+ `Linked project (${meta.projectName ?? meta.projectId}) does not match this token (${who.projectName}, ${who.projectId}).`,
27
+ "Run: npx getmyenv link --force",
28
+ "Or create a CLI token for this project on /cli.",
29
+ ].join("\n"));
30
+ }
31
+ if (!meta?.projectId) {
32
+ if (opts.forceLink || process.stdin.isTTY) {
33
+ if (!opts.forceLink && process.stdin.isTTY) {
34
+ const ok = await promptConfirm(`Folder is not linked. Link to token project and ${opts.action}?`, { defaultYes: true });
35
+ if (!ok) {
36
+ throw new Error("Run: npx getmyenv link first");
37
+ }
38
+ }
39
+ await linkCommand(undefined, {
40
+ apiUrl,
41
+ force: true,
42
+ env: who.cliScope,
43
+ skipPushOffer: true,
44
+ });
45
+ meta = readProjectMeta();
46
+ token = await ensureSessionToken(meta?.projectId);
47
+ }
48
+ }
49
+ if (!meta?.projectId) {
50
+ throw new Error([
51
+ "No project is linked to this folder.",
52
+ "Create a project in the dashboard (/projects/new), create a CLI token,",
53
+ "then: npx getmyenv token && npx getmyenv link",
54
+ ].join("\n"));
55
+ }
56
+ return {
57
+ who,
58
+ apiUrl,
59
+ token,
60
+ projectId: String(meta.projectId),
61
+ projectName: meta.projectName ?? who.projectName,
62
+ };
63
+ }
64
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export type ConflictItem = {
2
+ name: string;
3
+ /** Short human detail, e.g. "local differs from remote". */
4
+ detail?: string;
5
+ };
6
+ /**
7
+ * Prompt only when there are conflicts. Returns true to proceed.
8
+ * Non-TTY: requires `yes` to be true when conflicts exist.
9
+ */
10
+ export declare function confirmDiff(opts: {
11
+ conflicts: ConflictItem[];
12
+ /** What will happen if the user confirms, e.g. "Overwrite local values". */
13
+ action: string;
14
+ /** Skip the prompt when true (still returns false if conflicts and non-TTY without yes). */
15
+ yes?: boolean;
16
+ }): Promise<boolean>;
17
+ //# sourceMappingURL=confirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../src/lib/confirm.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBnB"}
@@ -0,0 +1,26 @@
1
+ import pc from "picocolors";
2
+ import { promptConfirm } from "./fs.js";
3
+ /**
4
+ * Prompt only when there are conflicts. Returns true to proceed.
5
+ * Non-TTY: requires `yes` to be true when conflicts exist.
6
+ */
7
+ export async function confirmDiff(opts) {
8
+ const { conflicts, action, yes } = opts;
9
+ if (conflicts.length === 0)
10
+ return true;
11
+ console.log(pc.yellow(`\n${conflicts.length} conflict(s):`));
12
+ for (const c of conflicts.slice(0, 20)) {
13
+ console.log(` ${c.name}${c.detail ? pc.dim(` - ${c.detail}`) : ""}`);
14
+ }
15
+ if (conflicts.length > 20) {
16
+ console.log(pc.dim(` …and ${conflicts.length - 20} more`));
17
+ }
18
+ console.log("");
19
+ if (yes)
20
+ return true;
21
+ if (!process.stdin.isTTY) {
22
+ throw new Error(`Conflicts require confirmation. Re-run with --yes to ${action.toLowerCase()}.`);
23
+ }
24
+ return promptConfirm(`${action}?`, { defaultYes: false });
25
+ }
26
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../src/lib/confirm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAQxC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAMjC;IACC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,SAAS,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IAErB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,wDAAwD,MAAM,CAAC,WAAW,EAAE,GAAG,CAChF,CAAC;IACJ,CAAC;IAED,OAAO,aAAa,CAAC,GAAG,MAAM,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5D,CAAC"}
@@ -1,9 +1,70 @@
1
- export type Credentials = {
1
+ export type CliScope = "development" | "production";
2
+ export type TokenEntry = {
3
+ token: string;
4
+ apiUrl?: string;
5
+ projectName: string;
6
+ cliScope: CliScope;
7
+ addedAt: string;
8
+ };
9
+ /** Credentials file format v2: one token per project. */
10
+ export type CredentialsV2 = {
11
+ version: 2;
12
+ tokens: Record<string, TokenEntry>;
13
+ /** Default project id (string or number from older writes). */
14
+ default?: number | string;
15
+ };
16
+ /** Legacy single-token file. */
17
+ export type CredentialsV1 = {
2
18
  token: string;
3
19
  apiUrl?: string;
4
20
  };
5
- export declare function readCredentials(): Credentials | null;
6
- export declare function writeCredentials(creds: Credentials): string;
7
- export declare function clearCredentials(): boolean;
8
21
  export declare function credentialsFilePath(): string;
22
+ export declare function readCredentialsV2(): CredentialsV2 | null;
23
+ /** Legacy v1 blob, if present and not yet migrated. */
24
+ export declare function readCredentialsV1(): CredentialsV1 | null;
25
+ export declare function writeCredentialsV2(creds: CredentialsV2): string;
26
+ export declare function upsertTokenEntry(projectId: string | number, entry: Omit<TokenEntry, "addedAt"> & {
27
+ addedAt?: string;
28
+ }, opts?: {
29
+ setDefault?: boolean;
30
+ }): string;
31
+ export declare function removeTokenEntry(projectId: string | number): boolean;
32
+ export declare function clearAllCredentials(): boolean;
33
+ export declare function setDefaultProject(projectId: string | number): boolean;
34
+ export declare function findTokenByNameOrId(nameOrId: string): {
35
+ projectId: string;
36
+ entry: TokenEntry;
37
+ } | null;
38
+ export type ResolvedToken = {
39
+ token: string;
40
+ apiUrl?: string;
41
+ projectId?: string;
42
+ entry?: TokenEntry;
43
+ source: "env" | "linked" | "default" | "v1" | "single";
44
+ };
45
+ /**
46
+ * Selection: GETMYENV_TOKEN > linked projectId entry > default > single entry > v1.
47
+ */
48
+ export declare function resolveStoredToken(linkedProjectId?: string | number | null): ResolvedToken | null;
49
+ /**
50
+ * Migrate a v1 credentials file into v2 using whoami metadata.
51
+ * Returns the new store, or null if nothing to migrate / whoami failed.
52
+ */
53
+ export declare function migrateV1ToV2(meta: {
54
+ projectId: string | number;
55
+ projectName: string;
56
+ cliScope: CliScope;
57
+ apiUrl?: string;
58
+ }): CredentialsV2 | null;
59
+ /** @deprecated Prefer resolveStoredToken / readCredentialsV2. */
60
+ export declare function readCredentials(): {
61
+ token: string;
62
+ apiUrl?: string;
63
+ } | null;
64
+ /** @deprecated Prefer upsertTokenEntry. */
65
+ export declare function writeCredentials(creds: {
66
+ token: string;
67
+ apiUrl?: string;
68
+ }): string;
69
+ export declare function clearCredentials(): boolean;
9
70
  //# sourceMappingURL=credentials.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAMF,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAgBpD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAQ3D;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAK1C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,YAAY,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,yDAAyD;AACzD,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B,CAAC;AAEF,gCAAgC;AAChC,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAMF,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAyBD,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CA+BxD;AAED,uDAAuD;AACvD,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAUxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAqB/D;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EACzD,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,MAAM,CAgBR;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAepE;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAK7C;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAQrE;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GACf;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAiBjD;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,CAAC;CACxD,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GACvC,aAAa,GAAG,IAAI,CAsDtB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,GAAG,IAAI,CAmBvB;AAED,iEAAiE;AACjE,wBAAgB,eAAe,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAI3E;AAED,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAsBT;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C"}
@@ -4,43 +4,282 @@ import { getConfigDir } from "./fs.js";
4
4
  function credentialsPath() {
5
5
  return path.join(getConfigDir(), "credentials.json");
6
6
  }
7
- export function readCredentials() {
7
+ export function credentialsFilePath() {
8
+ return credentialsPath();
9
+ }
10
+ function readRaw() {
8
11
  const file = credentialsPath();
9
12
  if (!fs.existsSync(file))
10
13
  return null;
11
14
  try {
12
- const data = JSON.parse(fs.readFileSync(file, "utf8"));
13
- if (!data.token || typeof data.token !== "string")
14
- return null;
15
- return {
16
- token: data.token.trim(),
17
- apiUrl: typeof data.apiUrl === "string" && data.apiUrl.trim()
18
- ? data.apiUrl.trim()
19
- : undefined,
20
- };
15
+ return JSON.parse(fs.readFileSync(file, "utf8"));
21
16
  }
22
17
  catch {
23
18
  return null;
24
19
  }
25
20
  }
26
- export function writeCredentials(creds) {
21
+ function isV2(data) {
22
+ if (!data || typeof data !== "object")
23
+ return false;
24
+ const d = data;
25
+ return d.version === 2 && d.tokens != null && typeof d.tokens === "object";
26
+ }
27
+ function isV1(data) {
28
+ if (!data || typeof data !== "object")
29
+ return false;
30
+ const d = data;
31
+ if (d.version === 2)
32
+ return false;
33
+ return typeof d.token === "string" && d.token.trim().length > 0;
34
+ }
35
+ export function readCredentialsV2() {
36
+ const raw = readRaw();
37
+ if (!isV2(raw))
38
+ return null;
39
+ const tokens = {};
40
+ for (const [id, entry] of Object.entries(raw.tokens)) {
41
+ if (!entry || typeof entry !== "object")
42
+ continue;
43
+ const e = entry;
44
+ if (!e.token || typeof e.token !== "string")
45
+ continue;
46
+ const scope = e.cliScope === "production" ? "production" : "development";
47
+ tokens[String(id)] = {
48
+ token: e.token.trim(),
49
+ apiUrl: typeof e.apiUrl === "string" && e.apiUrl.trim()
50
+ ? e.apiUrl.trim()
51
+ : undefined,
52
+ projectName: typeof e.projectName === "string" && e.projectName.trim()
53
+ ? e.projectName.trim()
54
+ : String(id),
55
+ cliScope: scope,
56
+ addedAt: typeof e.addedAt === "string" && e.addedAt
57
+ ? e.addedAt
58
+ : new Date().toISOString(),
59
+ };
60
+ }
61
+ return {
62
+ version: 2,
63
+ tokens,
64
+ default: raw.default != null ? raw.default : undefined,
65
+ };
66
+ }
67
+ /** Legacy v1 blob, if present and not yet migrated. */
68
+ export function readCredentialsV1() {
69
+ const raw = readRaw();
70
+ if (!isV1(raw))
71
+ return null;
72
+ return {
73
+ token: raw.token.trim(),
74
+ apiUrl: typeof raw.apiUrl === "string" && raw.apiUrl.trim()
75
+ ? raw.apiUrl.trim()
76
+ : undefined,
77
+ };
78
+ }
79
+ export function writeCredentialsV2(creds) {
27
80
  const file = credentialsPath();
28
- const payload = { token: creds.token.trim() };
29
- if (creds.apiUrl?.trim())
30
- payload.apiUrl = creds.apiUrl.trim();
81
+ const tokens = {};
82
+ for (const [id, entry] of Object.entries(creds.tokens)) {
83
+ tokens[String(id)] = {
84
+ token: entry.token.trim(),
85
+ projectName: entry.projectName,
86
+ cliScope: entry.cliScope,
87
+ addedAt: entry.addedAt,
88
+ ...(entry.apiUrl?.trim() ? { apiUrl: entry.apiUrl.trim() } : {}),
89
+ };
90
+ }
91
+ const payload = {
92
+ version: 2,
93
+ tokens,
94
+ ...(creds.default != null ? { default: creds.default } : {}),
95
+ };
31
96
  fs.writeFileSync(file, JSON.stringify(payload, null, 2) + "\n", {
32
97
  mode: 0o600,
33
98
  });
34
99
  return file;
35
100
  }
36
- export function clearCredentials() {
101
+ export function upsertTokenEntry(projectId, entry, opts) {
102
+ const id = String(projectId);
103
+ const existing = readCredentialsV2() ?? { version: 2, tokens: {} };
104
+ existing.tokens[id] = {
105
+ token: entry.token.trim(),
106
+ projectName: entry.projectName,
107
+ cliScope: entry.cliScope,
108
+ addedAt: entry.addedAt ?? new Date().toISOString(),
109
+ ...(entry.apiUrl?.trim() ? { apiUrl: entry.apiUrl.trim() } : {}),
110
+ };
111
+ if (opts?.setDefault !== false) {
112
+ existing.default = id;
113
+ }
114
+ else if (existing.default == null) {
115
+ existing.default = id;
116
+ }
117
+ return writeCredentialsV2(existing);
118
+ }
119
+ export function removeTokenEntry(projectId) {
120
+ const store = readCredentialsV2();
121
+ if (!store)
122
+ return false;
123
+ const id = String(projectId);
124
+ if (!store.tokens[id])
125
+ return false;
126
+ delete store.tokens[id];
127
+ if (String(store.default) === id) {
128
+ const remaining = Object.keys(store.tokens);
129
+ store.default = remaining[0];
130
+ }
131
+ if (Object.keys(store.tokens).length === 0) {
132
+ return clearAllCredentials();
133
+ }
134
+ writeCredentialsV2(store);
135
+ return true;
136
+ }
137
+ export function clearAllCredentials() {
37
138
  const file = credentialsPath();
38
139
  if (!fs.existsSync(file))
39
140
  return false;
40
141
  fs.unlinkSync(file);
41
142
  return true;
42
143
  }
43
- export function credentialsFilePath() {
44
- return credentialsPath();
144
+ export function setDefaultProject(projectId) {
145
+ const store = readCredentialsV2();
146
+ if (!store)
147
+ return false;
148
+ const id = String(projectId);
149
+ if (!store.tokens[id])
150
+ return false;
151
+ store.default = id;
152
+ writeCredentialsV2(store);
153
+ return true;
154
+ }
155
+ export function findTokenByNameOrId(nameOrId) {
156
+ const store = readCredentialsV2();
157
+ if (!store)
158
+ return null;
159
+ const needle = nameOrId.trim().toLowerCase();
160
+ if (store.tokens[nameOrId.trim()]) {
161
+ return { projectId: nameOrId.trim(), entry: store.tokens[nameOrId.trim()] };
162
+ }
163
+ const matches = Object.entries(store.tokens).filter(([id, e]) => id === nameOrId.trim() ||
164
+ e.projectName.toLowerCase() === needle ||
165
+ e.projectName.toLowerCase().includes(needle));
166
+ if (matches.length === 1) {
167
+ return { projectId: matches[0][0], entry: matches[0][1] };
168
+ }
169
+ return null;
170
+ }
171
+ /**
172
+ * Selection: GETMYENV_TOKEN > linked projectId entry > default > single entry > v1.
173
+ */
174
+ export function resolveStoredToken(linkedProjectId) {
175
+ const fromEnv = process.env.GETMYENV_TOKEN?.trim();
176
+ if (fromEnv) {
177
+ return { token: fromEnv, source: "env" };
178
+ }
179
+ const store = readCredentialsV2();
180
+ if (store) {
181
+ if (linkedProjectId != null) {
182
+ const id = String(linkedProjectId);
183
+ const entry = store.tokens[id];
184
+ if (entry) {
185
+ return {
186
+ token: entry.token,
187
+ apiUrl: entry.apiUrl,
188
+ projectId: id,
189
+ entry,
190
+ source: "linked",
191
+ };
192
+ }
193
+ }
194
+ if (store.default != null) {
195
+ const id = String(store.default);
196
+ const entry = store.tokens[id];
197
+ if (entry) {
198
+ return {
199
+ token: entry.token,
200
+ apiUrl: entry.apiUrl,
201
+ projectId: id,
202
+ entry,
203
+ source: "default",
204
+ };
205
+ }
206
+ }
207
+ const ids = Object.keys(store.tokens);
208
+ if (ids.length === 1) {
209
+ const id = ids[0];
210
+ const entry = store.tokens[id];
211
+ return {
212
+ token: entry.token,
213
+ apiUrl: entry.apiUrl,
214
+ projectId: id,
215
+ entry,
216
+ source: "single",
217
+ };
218
+ }
219
+ return null;
220
+ }
221
+ const v1 = readCredentialsV1();
222
+ if (v1) {
223
+ return { token: v1.token, apiUrl: v1.apiUrl, source: "v1" };
224
+ }
225
+ return null;
226
+ }
227
+ /**
228
+ * Migrate a v1 credentials file into v2 using whoami metadata.
229
+ * Returns the new store, or null if nothing to migrate / whoami failed.
230
+ */
231
+ export function migrateV1ToV2(meta) {
232
+ const v1 = readCredentialsV1();
233
+ if (!v1)
234
+ return null;
235
+ const id = String(meta.projectId);
236
+ const store = {
237
+ version: 2,
238
+ tokens: {
239
+ [id]: {
240
+ token: v1.token,
241
+ apiUrl: meta.apiUrl ?? v1.apiUrl,
242
+ projectName: meta.projectName,
243
+ cliScope: meta.cliScope,
244
+ addedAt: new Date().toISOString(),
245
+ },
246
+ },
247
+ default: id,
248
+ };
249
+ writeCredentialsV2(store);
250
+ return store;
251
+ }
252
+ /** @deprecated Prefer resolveStoredToken / readCredentialsV2. */
253
+ export function readCredentials() {
254
+ const resolved = resolveStoredToken();
255
+ if (!resolved)
256
+ return null;
257
+ return { token: resolved.token, apiUrl: resolved.apiUrl };
258
+ }
259
+ /** @deprecated Prefer upsertTokenEntry. */
260
+ export function writeCredentials(creds) {
261
+ const existing = readCredentialsV2();
262
+ if (existing && Object.keys(existing.tokens).length > 0) {
263
+ const id = String(existing.default ?? Object.keys(existing.tokens)[0] ?? "unknown");
264
+ const prev = existing.tokens[id];
265
+ return upsertTokenEntry(id, {
266
+ token: creds.token,
267
+ apiUrl: creds.apiUrl ?? prev?.apiUrl,
268
+ projectName: prev?.projectName ?? id,
269
+ cliScope: prev?.cliScope ?? "development",
270
+ });
271
+ }
272
+ // Write a temporary v1-shaped file until whoami upgrades it.
273
+ const file = credentialsPath();
274
+ const payload = { token: creds.token.trim() };
275
+ if (creds.apiUrl?.trim())
276
+ payload.apiUrl = creds.apiUrl.trim();
277
+ fs.writeFileSync(file, JSON.stringify(payload, null, 2) + "\n", {
278
+ mode: 0o600,
279
+ });
280
+ return file;
281
+ }
282
+ export function clearCredentials() {
283
+ return clearAllCredentials();
45
284
  }
46
285
  //# sourceMappingURL=credentials.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAOvC,SAAS,eAAe;IACtB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAgB,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/D,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACxB,MAAM,EACJ,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;gBACnD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;gBACpB,CAAC,CAAC,SAAS;SAChB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAgB,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;IAC3D,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;QAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC/D,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAC9D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
package/dist/lib/fs.d.ts CHANGED
@@ -2,7 +2,8 @@ export type ProjectMeta = {
2
2
  projectId?: string;
3
3
  projectName?: string;
4
4
  apiUrl?: string;
5
- protectionMode?: "simple" | "advanced";
5
+ /** Default -e when omitted (from token scope at link time). */
6
+ defaultEnv?: "development" | "production";
6
7
  };
7
8
  export type RequirementsMeta = {
8
9
  required: string[];
@@ -15,9 +16,15 @@ export declare function writeRequirements(required: string[], cwd?: string): voi
15
16
  export declare function readRequirements(cwd?: string): string[];
16
17
  /** OS user config for machine identity - never in the repo. */
17
18
  export declare function getConfigDir(): string;
19
+ /**
20
+ * Read one line from a TTY without using raw mode.
21
+ * Safe to call after promptHidden.
22
+ */
23
+ export declare function readLine(question: string): Promise<string>;
18
24
  /**
19
25
  * Read a secret from stdin (TTY-hidden, or piped via --vault-password-stdin).
20
26
  * Refuses to echo secrets on a non-TTY unless allowStdin is true.
27
+ * Always restores stdin so a later promptConfirm / promptChoice can run.
21
28
  */
22
29
  export declare function promptHidden(question: string, opts?: {
23
30
  allowStdin?: boolean;
@@ -27,6 +34,10 @@ export declare function promptConfirm(question: string, opts?: {
27
34
  }): Promise<boolean>;
28
35
  /** 1-based numbered choice. Empty input selects defaultIndex (0-based). */
29
36
  export declare function promptChoice(question: string, options: string[], defaultIndex?: number): Promise<number>;
37
+ /** Throw with clear next steps when this folder has no linked project. */
38
+ export declare function requireLinkedProject(meta: ProjectMeta | null): asserts meta is ProjectMeta & {
39
+ projectId: NonNullable<ProjectMeta["projectId"]>;
40
+ };
30
41
  export declare function ensureGitignoreHasEnv(cwd?: string): void;
31
42
  /** First-class languages shown on landing / docs. */
32
43
  export type DetectedLanguage = "node" | "python" | "ruby" | "rust" | "go" | "php" | "java" | "dotnet";
@@ -51,6 +62,13 @@ export declare function isEnvSampleFile(filePath: string): boolean;
51
62
  export declare function listEnvFiles(cwd?: string): string[];
52
63
  /** First candidate from listEnvFiles, or null. */
53
64
  export declare function findEnvFile(cwd?: string): string | null;
65
+ /** Basename contains "production" (e.g. .env.production, .env.production.local). */
66
+ export declare function isProductionEnvFilename(filePath: string): boolean;
67
+ /**
68
+ * Env files safe to push: every .env* candidate except production-named files.
69
+ * Production values belong in the dashboard, not in the repo.
70
+ */
71
+ export declare function listPushEnvFiles(cwd?: string): string[];
54
72
  /** Infer CLI -e name from an env file basename. */
55
73
  export declare function inferEnvNameFromFile(filePath: string): string;
56
74
  //# sourceMappingURL=fs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/lib/fs.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,wBAAgB,cAAc,CAAC,GAAG,SAAgB,GAAG,MAAM,CAE1D;AAED,wBAAgB,YAAY,CAAC,GAAG,SAAgB,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,GAAG,SAAgB,GAAG,WAAW,GAAG,IAAI,CAIvE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,SAAgB,GAAG,IAAI,CAQ7E;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,SAAgB,GAClB,IAAI,CASN;AAED,wBAAgB,gBAAgB,CAAC,GAAG,SAAgB,GAAG,MAAM,EAAE,CAK9D;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,OAAO,CAAC,MAAM,CAAC,CA2CjB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,YAAY,SAAI,GACf,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,SAAgB,GAAG,IAAI,CAc/D;AAED,qDAAqD;AACrD,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,QAAQ,GACR,MAAM,GACN,MAAM,GACN,IAAI,GACJ,KAAK,GACL,MAAM,GACN,QAAQ,CAAC;AAuGb,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,GAAG,SAAgB,GAAG,KAAK,CAAC;IAC1D,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAmBD;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,IAAI,EAAE,MAAM,GACX,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,SAAgB,GAAG,MAAM,EAAE,CAwD5D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBrE;AAsCD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOzD;AAsBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,SAAgB,GAAG,MAAM,EAAE,CA6B1D;AAED,kDAAkD;AAClD,wBAAgB,WAAW,CAAC,GAAG,SAAgB,GAAG,MAAM,GAAG,IAAI,CAE9D;AAED,mDAAmD;AACnD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK7D"}
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/lib/fs.ts"],"names":[],"mappings":"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"}