envpush 0.2.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 (61) hide show
  1. package/dist/chunk-2H7UOFLK.js +11 -0
  2. package/dist/chunk-2H7UOFLK.js.map +1 -0
  3. package/dist/chunk-BWPCYXXL.js +50 -0
  4. package/dist/chunk-BWPCYXXL.js.map +1 -0
  5. package/dist/chunk-HL2WXSVD.js +22 -0
  6. package/dist/chunk-HL2WXSVD.js.map +1 -0
  7. package/dist/chunk-HQFY6BB6.js +44 -0
  8. package/dist/chunk-HQFY6BB6.js.map +1 -0
  9. package/dist/chunk-TSUQGF7F.js +27 -0
  10. package/dist/chunk-TSUQGF7F.js.map +1 -0
  11. package/dist/chunk-UWVCYS24.js +63 -0
  12. package/dist/chunk-UWVCYS24.js.map +1 -0
  13. package/dist/chunk-Z23MVAIZ.js +4194 -0
  14. package/dist/chunk-Z23MVAIZ.js.map +1 -0
  15. package/dist/create-ET6VM5GG.js +82 -0
  16. package/dist/create-ET6VM5GG.js.map +1 -0
  17. package/dist/create-M22SN3AK.js +47 -0
  18. package/dist/create-M22SN3AK.js.map +1 -0
  19. package/dist/diff-3BVIP6CW.js +82 -0
  20. package/dist/diff-3BVIP6CW.js.map +1 -0
  21. package/dist/env-JDEDJCKM.js +17 -0
  22. package/dist/env-JDEDJCKM.js.map +1 -0
  23. package/dist/index.js +206 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/init-JIDH7ICC.js +141 -0
  26. package/dist/init-JIDH7ICC.js.map +1 -0
  27. package/dist/invite-code-LVWE5FMM.js +78 -0
  28. package/dist/invite-code-LVWE5FMM.js.map +1 -0
  29. package/dist/join-XR6STHVE.js +50 -0
  30. package/dist/join-XR6STHVE.js.map +1 -0
  31. package/dist/link-YLGQQZQE.js +81 -0
  32. package/dist/link-YLGQQZQE.js.map +1 -0
  33. package/dist/list-4OS4UHKS.js +63 -0
  34. package/dist/list-4OS4UHKS.js.map +1 -0
  35. package/dist/list-YU2RHCZP.js +51 -0
  36. package/dist/list-YU2RHCZP.js.map +1 -0
  37. package/dist/login-ZH5PD5PW.js +72 -0
  38. package/dist/login-ZH5PD5PW.js.map +1 -0
  39. package/dist/logout-XROX3UVL.js +21 -0
  40. package/dist/logout-XROX3UVL.js.map +1 -0
  41. package/dist/members-ADBLZZLN.js +72 -0
  42. package/dist/members-ADBLZZLN.js.map +1 -0
  43. package/dist/pull-MVF276VO.js +50 -0
  44. package/dist/pull-MVF276VO.js.map +1 -0
  45. package/dist/push-WJ2WQRE7.js +111 -0
  46. package/dist/push-WJ2WQRE7.js.map +1 -0
  47. package/dist/register-U2RDF5PD.js +123 -0
  48. package/dist/register-U2RDF5PD.js.map +1 -0
  49. package/dist/server-C2XU2NWC.js +49 -0
  50. package/dist/server-C2XU2NWC.js.map +1 -0
  51. package/dist/set-BDI2SUDG.js +53 -0
  52. package/dist/set-BDI2SUDG.js.map +1 -0
  53. package/dist/switch-5B3A4YIX.js +57 -0
  54. package/dist/switch-5B3A4YIX.js.map +1 -0
  55. package/dist/team-V2D7J34H.js +18 -0
  56. package/dist/team-V2D7J34H.js.map +1 -0
  57. package/dist/unset-5XBSSZX5.js +45 -0
  58. package/dist/unset-5XBSSZX5.js.map +1 -0
  59. package/dist/whoami-7H25CWKV.js +39 -0
  60. package/dist/whoami-7H25CWKV.js.map +1 -0
  61. package/package.json +36 -0
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ chalk,
4
+ handleCancel,
5
+ p
6
+ } from "./chunk-BWPCYXXL.js";
7
+ import {
8
+ getClient
9
+ } from "./chunk-HL2WXSVD.js";
10
+ import {
11
+ handleApiResponse,
12
+ handleError
13
+ } from "./chunk-UWVCYS24.js";
14
+ import {
15
+ loadProjectConfig
16
+ } from "./chunk-TSUQGF7F.js";
17
+ import "./chunk-Z23MVAIZ.js";
18
+ import "./chunk-2H7UOFLK.js";
19
+
20
+ // src/commands/env/create.ts
21
+ import { defineCommand } from "citty";
22
+ var create_default = defineCommand({
23
+ meta: { name: "create", description: "Create a new environment" },
24
+ async run() {
25
+ try {
26
+ p.intro(chalk.bold("evp env create"));
27
+ const projectConfig = await loadProjectConfig();
28
+ if (!projectConfig) {
29
+ p.cancel("No .evp.json found. Run `evp init` or `evp link` first.");
30
+ process.exit(1);
31
+ }
32
+ const { client } = await getClient();
33
+ const projectRes = await client.projects[":teamSlug"][":projectSlug"].$get({
34
+ param: { teamSlug: projectConfig.team, projectSlug: projectConfig.project }
35
+ });
36
+ await handleApiResponse(projectRes);
37
+ const projectData = await projectRes.json();
38
+ const name = await p.text({ message: "Environment name" });
39
+ handleCancel(name);
40
+ const copyOptions = [
41
+ ...projectData.environments.map((e) => ({ value: e.id, label: e.name })),
42
+ { value: "empty", label: "Start empty" }
43
+ ];
44
+ const copyFrom = await p.select({
45
+ message: "Copy secrets from existing environment?",
46
+ options: copyOptions
47
+ });
48
+ handleCancel(copyFrom);
49
+ const s = p.spinner();
50
+ s.start("Creating environment...");
51
+ const createRes = await client.environments[":projectId"].environments.$post({
52
+ param: { projectId: projectData.project.id },
53
+ json: { name }
54
+ });
55
+ await handleApiResponse(createRes);
56
+ const envData = await createRes.json();
57
+ if (copyFrom !== "empty") {
58
+ const secretsRes = await client.secrets[":id"].secrets.$get({
59
+ param: { id: copyFrom }
60
+ });
61
+ await handleApiResponse(secretsRes);
62
+ const secretsData = await secretsRes.json();
63
+ if (secretsData.secrets.length > 0) {
64
+ await client.secrets[":id"].secrets.$put({
65
+ param: { id: envData.environment.id },
66
+ json: { secrets: secretsData.secrets.map((s2) => ({ key: s2.key, value: s2.value })) }
67
+ });
68
+ }
69
+ s.stop(`Created "${envData.environment.name}" with ${secretsData.secrets.length} secrets`);
70
+ } else {
71
+ s.stop(`Created "${envData.environment.name}"`);
72
+ }
73
+ p.outro("Done! Use `evp env switch` to activate.");
74
+ } catch (err) {
75
+ handleError(err);
76
+ }
77
+ }
78
+ });
79
+ export {
80
+ create_default as default
81
+ };
82
+ //# sourceMappingURL=create-ET6VM5GG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/env/create.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { getClient } from \"../../lib/client.js\";\nimport { loadProjectConfig } from \"../../lib/project-config.js\";\nimport { p, handleCancel, chalk } from \"../../lib/ui.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\n\nexport default defineCommand({\n meta: { name: \"create\", description: \"Create a new environment\" },\n async run() {\n try {\n p.intro(chalk.bold(\"evp env create\"));\n\n const projectConfig = await loadProjectConfig();\n if (!projectConfig) {\n p.cancel(\"No .evp.json found. Run `evp init` or `evp link` first.\");\n process.exit(1);\n }\n\n const { client } = await getClient();\n\n // Resolve project\n const projectRes = await client.projects[\":teamSlug\"][\":projectSlug\"].$get({\n param: { teamSlug: projectConfig.team, projectSlug: projectConfig.project },\n });\n await handleApiResponse(projectRes);\n const projectData = await projectRes.json() as {\n project: { id: string };\n environments: { id: string; name: string; slug: string }[];\n };\n\n const name = await p.text({ message: \"Environment name\" });\n handleCancel(name);\n\n // Copy from existing?\n const copyOptions = [\n ...projectData.environments.map((e) => ({ value: e.id, label: e.name })),\n { value: \"empty\", label: \"Start empty\" },\n ];\n const copyFrom = await p.select({\n message: \"Copy secrets from existing environment?\",\n options: copyOptions,\n });\n handleCancel(copyFrom);\n\n const s = p.spinner();\n s.start(\"Creating environment...\");\n\n const createRes = await client.environments[\":projectId\"].environments.$post({\n param: { projectId: projectData.project.id },\n json: { name },\n });\n await handleApiResponse(createRes);\n const envData = await createRes.json() as { environment: { id: string; name: string } };\n\n // Copy secrets if selected\n if (copyFrom !== \"empty\") {\n const secretsRes = await client.secrets[\":id\"].secrets.$get({\n param: { id: copyFrom as string },\n });\n await handleApiResponse(secretsRes);\n const secretsData = await secretsRes.json() as {\n secrets: { key: string; value: string }[];\n };\n\n if (secretsData.secrets.length > 0) {\n await client.secrets[\":id\"].secrets.$put({\n param: { id: envData.environment.id },\n json: { secrets: secretsData.secrets.map((s) => ({ key: s.key, value: s.value })) },\n });\n }\n\n s.stop(`Created \"${envData.environment.name}\" with ${secretsData.secrets.length} secrets`);\n } else {\n s.stop(`Created \"${envData.environment.name}\"`);\n }\n\n p.outro(\"Done! Use `evp env switch` to activate.\");\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAM9B,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,EAChE,MAAM,MAAM;AACV,QAAI;AACF,QAAE,MAAM,MAAM,KAAK,gBAAgB,CAAC;AAEpC,YAAM,gBAAgB,MAAM,kBAAkB;AAC9C,UAAI,CAAC,eAAe;AAClB,UAAE,OAAO,yDAAyD;AAClE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,EAAE,OAAO,IAAI,MAAM,UAAU;AAGnC,YAAM,aAAa,MAAM,OAAO,SAAS,WAAW,EAAE,cAAc,EAAE,KAAK;AAAA,QACzE,OAAO,EAAE,UAAU,cAAc,MAAM,aAAa,cAAc,QAAQ;AAAA,MAC5E,CAAC;AACD,YAAM,kBAAkB,UAAU;AAClC,YAAM,cAAc,MAAM,WAAW,KAAK;AAK1C,YAAM,OAAO,MAAM,EAAE,KAAK,EAAE,SAAS,mBAAmB,CAAC;AACzD,mBAAa,IAAI;AAGjB,YAAM,cAAc;AAAA,QAClB,GAAG,YAAY,aAAa,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,KAAK,EAAE;AAAA,QACvE,EAAE,OAAO,SAAS,OAAO,cAAc;AAAA,MACzC;AACA,YAAM,WAAW,MAAM,EAAE,OAAO;AAAA,QAC9B,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,mBAAa,QAAQ;AAErB,YAAM,IAAI,EAAE,QAAQ;AACpB,QAAE,MAAM,yBAAyB;AAEjC,YAAM,YAAY,MAAM,OAAO,aAAa,YAAY,EAAE,aAAa,MAAM;AAAA,QAC3E,OAAO,EAAE,WAAW,YAAY,QAAQ,GAAG;AAAA,QAC3C,MAAM,EAAE,KAAK;AAAA,MACf,CAAC;AACD,YAAM,kBAAkB,SAAS;AACjC,YAAM,UAAU,MAAM,UAAU,KAAK;AAGrC,UAAI,aAAa,SAAS;AACxB,cAAM,aAAa,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK;AAAA,UAC1D,OAAO,EAAE,IAAI,SAAmB;AAAA,QAClC,CAAC;AACD,cAAM,kBAAkB,UAAU;AAClC,cAAM,cAAc,MAAM,WAAW,KAAK;AAI1C,YAAI,YAAY,QAAQ,SAAS,GAAG;AAClC,gBAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK;AAAA,YACvC,OAAO,EAAE,IAAI,QAAQ,YAAY,GAAG;AAAA,YACpC,MAAM,EAAE,SAAS,YAAY,QAAQ,IAAI,CAACA,QAAO,EAAE,KAAKA,GAAE,KAAK,OAAOA,GAAE,MAAM,EAAE,EAAE;AAAA,UACpF,CAAC;AAAA,QACH;AAEA,UAAE,KAAK,YAAY,QAAQ,YAAY,IAAI,UAAU,YAAY,QAAQ,MAAM,UAAU;AAAA,MAC3F,OAAO;AACL,UAAE,KAAK,YAAY,QAAQ,YAAY,IAAI,GAAG;AAAA,MAChD;AAEA,QAAE,MAAM,yCAAyC;AAAA,IACnD,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":["s"]}
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ chalk,
4
+ handleCancel,
5
+ p
6
+ } from "./chunk-BWPCYXXL.js";
7
+ import {
8
+ getClient
9
+ } from "./chunk-HL2WXSVD.js";
10
+ import {
11
+ handleApiResponse,
12
+ handleError
13
+ } from "./chunk-UWVCYS24.js";
14
+ import "./chunk-Z23MVAIZ.js";
15
+ import "./chunk-2H7UOFLK.js";
16
+
17
+ // src/commands/team/create.ts
18
+ import { defineCommand } from "citty";
19
+ var create_default = defineCommand({
20
+ meta: { name: "create", description: "Create a new team" },
21
+ async run() {
22
+ try {
23
+ p.intro(chalk.bold("evp team create"));
24
+ const name = await p.text({ message: "Team name" });
25
+ handleCancel(name);
26
+ const s = p.spinner();
27
+ s.start("Creating team...");
28
+ const { client } = await getClient();
29
+ const res = await client.teams.$post({ json: { name } });
30
+ await handleApiResponse(res);
31
+ const data = await res.json();
32
+ s.stop("Team created!");
33
+ p.note(
34
+ `Invite code: ${chalk.bold(data.team.invite_code)}
35
+ Share this with your teammates`,
36
+ "Team Invite"
37
+ );
38
+ p.outro("Done!");
39
+ } catch (err) {
40
+ handleError(err);
41
+ }
42
+ }
43
+ });
44
+ export {
45
+ create_default as default
46
+ };
47
+ //# sourceMappingURL=create-M22SN3AK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/team/create.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { getClient } from \"../../lib/client.js\";\nimport { p, handleCancel, chalk } from \"../../lib/ui.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\n\nexport default defineCommand({\n meta: { name: \"create\", description: \"Create a new team\" },\n async run() {\n try {\n p.intro(chalk.bold(\"evp team create\"));\n\n const name = await p.text({ message: \"Team name\" });\n handleCancel(name);\n\n const s = p.spinner();\n s.start(\"Creating team...\");\n\n const { client } = await getClient();\n const res = await client.teams.$post({ json: { name } });\n await handleApiResponse(res);\n\n const data = await res.json() as { team: { invite_code: string; name: string } };\n s.stop(\"Team created!\");\n\n p.note(\n `Invite code: ${chalk.bold(data.team.invite_code)}\\nShare this with your teammates`,\n \"Team Invite\"\n );\n\n p.outro(\"Done!\");\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAK9B,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB;AAAA,EACzD,MAAM,MAAM;AACV,QAAI;AACF,QAAE,MAAM,MAAM,KAAK,iBAAiB,CAAC;AAErC,YAAM,OAAO,MAAM,EAAE,KAAK,EAAE,SAAS,YAAY,CAAC;AAClD,mBAAa,IAAI;AAEjB,YAAM,IAAI,EAAE,QAAQ;AACpB,QAAE,MAAM,kBAAkB;AAE1B,YAAM,EAAE,OAAO,IAAI,MAAM,UAAU;AACnC,YAAM,MAAM,MAAM,OAAO,MAAM,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACvD,YAAM,kBAAkB,GAAG;AAE3B,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAE,KAAK,eAAe;AAEtB,QAAE;AAAA,QACA,gBAAgB,MAAM,KAAK,KAAK,KAAK,WAAW,CAAC;AAAA;AAAA,QACjD;AAAA,MACF;AAEA,QAAE,MAAM,OAAO;AAAA,IACjB,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ resolveEnvironmentId
4
+ } from "./chunk-HQFY6BB6.js";
5
+ import "./chunk-HL2WXSVD.js";
6
+ import {
7
+ handleApiResponse,
8
+ handleError
9
+ } from "./chunk-UWVCYS24.js";
10
+ import "./chunk-TSUQGF7F.js";
11
+ import {
12
+ parseEnvFile
13
+ } from "./chunk-Z23MVAIZ.js";
14
+ import "./chunk-2H7UOFLK.js";
15
+
16
+ // src/commands/secrets/diff.ts
17
+ import { defineCommand } from "citty";
18
+ import { readFile } from "fs/promises";
19
+ import { join } from "path";
20
+ import chalk from "chalk";
21
+ var diff_default = defineCommand({
22
+ meta: { name: "diff", description: "Diff local .env vs remote" },
23
+ async run() {
24
+ try {
25
+ const { client, envId, envName } = await resolveEnvironmentId();
26
+ let localContent;
27
+ try {
28
+ localContent = await readFile(join(process.cwd(), ".env"), "utf-8");
29
+ } catch {
30
+ console.error(chalk.red("No .env file found in current directory."));
31
+ process.exit(1);
32
+ }
33
+ const localVars = parseEnvFile(localContent);
34
+ const res = await client.secrets[":id"].secrets.$get({
35
+ param: { id: envId }
36
+ });
37
+ await handleApiResponse(res);
38
+ const data = await res.json();
39
+ const remoteVars = {};
40
+ for (const s of data.secrets) {
41
+ remoteVars[s.key] = s.value;
42
+ }
43
+ const allKeys = /* @__PURE__ */ new Set([...Object.keys(localVars), ...Object.keys(remoteVars)]);
44
+ let hasChanges = false;
45
+ let unchanged = 0;
46
+ console.log(chalk.dim(`
47
+ Comparing local .env <-> remote (${envName})
48
+ `));
49
+ for (const key of [...allKeys].sort()) {
50
+ const inLocal = key in localVars;
51
+ const inRemote = key in remoteVars;
52
+ if (inLocal && !inRemote) {
53
+ console.log(chalk.green(` + ${key} (local only)`));
54
+ hasChanges = true;
55
+ } else if (!inLocal && inRemote) {
56
+ console.log(chalk.red(` - ${key} (remote only)`));
57
+ hasChanges = true;
58
+ } else if (localVars[key] !== remoteVars[key]) {
59
+ console.log(chalk.yellow(` ~ ${key} (value differs)`));
60
+ hasChanges = true;
61
+ } else {
62
+ unchanged++;
63
+ }
64
+ }
65
+ if (unchanged > 0) {
66
+ console.log(chalk.dim(` ${unchanged} unchanged`));
67
+ }
68
+ console.log();
69
+ if (!hasChanges) {
70
+ console.log(chalk.green("In sync! No differences.\n"));
71
+ } else {
72
+ console.log(chalk.dim("No action taken. Use `evp push` to sync.\n"));
73
+ }
74
+ } catch (err) {
75
+ handleError(err);
76
+ }
77
+ }
78
+ });
79
+ export {
80
+ diff_default as default
81
+ };
82
+ //# sourceMappingURL=diff-3BVIP6CW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/diff.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parseEnvFile } from \"@envpush/shared\";\nimport { resolveEnvironmentId } from \"../../lib/resolve-env.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\nimport chalk from \"chalk\";\n\nexport default defineCommand({\n meta: { name: \"diff\", description: \"Diff local .env vs remote\" },\n async run() {\n try {\n const { client, envId, envName } = await resolveEnvironmentId();\n\n // Read local\n let localContent: string;\n try {\n localContent = await readFile(join(process.cwd(), \".env\"), \"utf-8\");\n } catch {\n console.error(chalk.red(\"No .env file found in current directory.\"));\n process.exit(1);\n }\n const localVars = parseEnvFile(localContent);\n\n // Get remote\n const res = await client.secrets[\":id\"].secrets.$get({\n param: { id: envId },\n });\n await handleApiResponse(res);\n const data = await res.json() as {\n secrets: { key: string; value: string }[];\n };\n const remoteVars: Record<string, string> = {};\n for (const s of data.secrets) {\n remoteVars[s.key] = s.value;\n }\n\n // Compute diff\n const allKeys = new Set([...Object.keys(localVars), ...Object.keys(remoteVars)]);\n let hasChanges = false;\n let unchanged = 0;\n\n console.log(chalk.dim(`\\nComparing local .env <-> remote (${envName})\\n`));\n\n for (const key of [...allKeys].sort()) {\n const inLocal = key in localVars;\n const inRemote = key in remoteVars;\n if (inLocal && !inRemote) {\n console.log(chalk.green(` + ${key} (local only)`));\n hasChanges = true;\n } else if (!inLocal && inRemote) {\n console.log(chalk.red(` - ${key} (remote only)`));\n hasChanges = true;\n } else if (localVars[key] !== remoteVars[key]) {\n console.log(chalk.yellow(` ~ ${key} (value differs)`));\n hasChanges = true;\n } else {\n unchanged++;\n }\n }\n\n if (unchanged > 0) {\n console.log(chalk.dim(` ${unchanged} unchanged`));\n }\n\n console.log();\n if (!hasChanges) {\n console.log(chalk.green(\"In sync! No differences.\\n\"));\n } else {\n console.log(chalk.dim(\"No action taken. Use `evp push` to sync.\\n\"));\n }\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,YAAY;AAIrB,OAAO,WAAW;AAElB,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,4BAA4B;AAAA,EAC/D,MAAM,MAAM;AACV,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,QAAQ,IAAI,MAAM,qBAAqB;AAG9D,UAAI;AACJ,UAAI;AACF,uBAAe,MAAM,SAAS,KAAK,QAAQ,IAAI,GAAG,MAAM,GAAG,OAAO;AAAA,MACpE,QAAQ;AACN,gBAAQ,MAAM,MAAM,IAAI,0CAA0C,CAAC;AACnE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,YAAY,aAAa,YAAY;AAG3C,YAAM,MAAM,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK;AAAA,QACnD,OAAO,EAAE,IAAI,MAAM;AAAA,MACrB,CAAC;AACD,YAAM,kBAAkB,GAAG;AAC3B,YAAM,OAAO,MAAM,IAAI,KAAK;AAG5B,YAAM,aAAqC,CAAC;AAC5C,iBAAW,KAAK,KAAK,SAAS;AAC5B,mBAAW,EAAE,GAAG,IAAI,EAAE;AAAA,MACxB;AAGA,YAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,SAAS,GAAG,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC;AAC/E,UAAI,aAAa;AACjB,UAAI,YAAY;AAEhB,cAAQ,IAAI,MAAM,IAAI;AAAA,mCAAsC,OAAO;AAAA,CAAK,CAAC;AAEzE,iBAAW,OAAO,CAAC,GAAG,OAAO,EAAE,KAAK,GAAG;AACrC,cAAM,UAAU,OAAO;AACvB,cAAM,WAAW,OAAO;AACxB,YAAI,WAAW,CAAC,UAAU;AACxB,kBAAQ,IAAI,MAAM,MAAM,OAAO,GAAG,gBAAgB,CAAC;AACnD,uBAAa;AAAA,QACf,WAAW,CAAC,WAAW,UAAU;AAC/B,kBAAQ,IAAI,MAAM,IAAI,OAAO,GAAG,iBAAiB,CAAC;AAClD,uBAAa;AAAA,QACf,WAAW,UAAU,GAAG,MAAM,WAAW,GAAG,GAAG;AAC7C,kBAAQ,IAAI,MAAM,OAAO,OAAO,GAAG,mBAAmB,CAAC;AACvD,uBAAa;AAAA,QACf,OAAO;AACL;AAAA,QACF;AAAA,MACF;AAEA,UAAI,YAAY,GAAG;AACjB,gBAAQ,IAAI,MAAM,IAAI,OAAO,SAAS,YAAY,CAAC;AAAA,MACrD;AAEA,cAAQ,IAAI;AACZ,UAAI,CAAC,YAAY;AACf,gBAAQ,IAAI,MAAM,MAAM,4BAA4B,CAAC;AAAA,MACvD,OAAO;AACL,gBAAQ,IAAI,MAAM,IAAI,4CAA4C,CAAC;AAAA,MACrE;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import "./chunk-2H7UOFLK.js";
3
+
4
+ // src/commands/env/index.ts
5
+ import { defineCommand } from "citty";
6
+ var env_default = defineCommand({
7
+ meta: { name: "env", description: "Environment management" },
8
+ subCommands: {
9
+ list: () => import("./list-YU2RHCZP.js").then((m) => m.default),
10
+ switch: () => import("./switch-5B3A4YIX.js").then((m) => m.default),
11
+ create: () => import("./create-ET6VM5GG.js").then((m) => m.default)
12
+ }
13
+ });
14
+ export {
15
+ env_default as default
16
+ };
17
+ //# sourceMappingURL=env-JDEDJCKM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/env/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\n\nexport default defineCommand({\n meta: { name: \"env\", description: \"Environment management\" },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n switch: () => import(\"./switch.js\").then((m) => m.default),\n create: () => import(\"./create.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;;AAAA,SAAS,qBAAqB;AAE9B,IAAO,cAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,OAAO,aAAa,yBAAyB;AAAA,EAC3D,aAAa;AAAA,IACX,MAAM,MAAM,OAAO,oBAAW,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACrD,QAAQ,MAAM,OAAO,sBAAa,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACzD,QAAQ,MAAM,OAAO,sBAAa,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EAC3D;AACF,CAAC;","names":[]}
package/dist/index.js ADDED
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ chalk,
4
+ handleCancel,
5
+ p
6
+ } from "./chunk-BWPCYXXL.js";
7
+ import {
8
+ loadProjectConfig
9
+ } from "./chunk-TSUQGF7F.js";
10
+ import {
11
+ loadConfig
12
+ } from "./chunk-Z23MVAIZ.js";
13
+ import "./chunk-2H7UOFLK.js";
14
+
15
+ // src/index.ts
16
+ import { runMain } from "citty";
17
+
18
+ // src/commands/index.ts
19
+ import { defineCommand, runCommand } from "citty";
20
+ var commands = {
21
+ // Secrets
22
+ pull: () => import("./pull-MVF276VO.js").then((m) => m.default),
23
+ push: () => import("./push-WJ2WQRE7.js").then((m) => m.default),
24
+ set: () => import("./set-BDI2SUDG.js").then((m) => m.default),
25
+ unset: () => import("./unset-5XBSSZX5.js").then((m) => m.default),
26
+ list: () => import("./list-4OS4UHKS.js").then((m) => m.default),
27
+ diff: () => import("./diff-3BVIP6CW.js").then((m) => m.default),
28
+ // Environments
29
+ "env list": () => import("./list-YU2RHCZP.js").then((m) => m.default),
30
+ "env switch": () => import("./switch-5B3A4YIX.js").then((m) => m.default),
31
+ "env create": () => import("./create-ET6VM5GG.js").then((m) => m.default),
32
+ // Project
33
+ init: () => import("./init-JIDH7ICC.js").then((m) => m.default),
34
+ link: () => import("./link-YLGQQZQE.js").then((m) => m.default),
35
+ // Team
36
+ "team create": () => import("./create-M22SN3AK.js").then((m) => m.default),
37
+ "team join": () => import("./join-XR6STHVE.js").then((m) => m.default),
38
+ "team members": () => import("./members-ADBLZZLN.js").then((m) => m.default),
39
+ "team invite-code": () => import("./invite-code-LVWE5FMM.js").then((m) => m.default),
40
+ // Account
41
+ server: () => import("./server-C2XU2NWC.js").then((m) => m.default),
42
+ login: () => import("./login-ZH5PD5PW.js").then((m) => m.default),
43
+ register: () => import("./register-U2RDF5PD.js").then((m) => m.default),
44
+ whoami: () => import("./whoami-7H25CWKV.js").then((m) => m.default),
45
+ logout: () => import("./logout-XROX3UVL.js").then((m) => m.default)
46
+ };
47
+ function buildCategories(loggedIn, hasProject) {
48
+ const categories = [];
49
+ if (hasProject) {
50
+ categories.push({
51
+ value: "secrets",
52
+ label: "Secrets",
53
+ hint: "pull, push, set, unset, list, diff",
54
+ items: [
55
+ { value: "pull", label: "Pull", hint: "sync remote \u2192 local .env" },
56
+ { value: "push", label: "Push", hint: "sync local .env \u2192 remote" },
57
+ { value: "set", label: "Set", hint: "set KEY=VALUE remotely" },
58
+ { value: "unset", label: "Unset", hint: "remove a key remotely" },
59
+ { value: "list", label: "List", hint: "show all remote keys" },
60
+ { value: "diff", label: "Diff", hint: "compare local vs remote" }
61
+ ]
62
+ });
63
+ categories.push({
64
+ value: "env",
65
+ label: "Environments",
66
+ hint: "list, switch, create",
67
+ items: [
68
+ { value: "env list", label: "List", hint: "show all environments" },
69
+ { value: "env switch", label: "Switch", hint: "change active environment" },
70
+ { value: "env create", label: "Create", hint: "add a new environment" }
71
+ ]
72
+ });
73
+ }
74
+ if (loggedIn) {
75
+ categories.push({
76
+ value: "project",
77
+ label: "Project",
78
+ hint: "init, link",
79
+ items: [
80
+ { value: "init", label: "Initialize", hint: "set up new project" },
81
+ { value: "link", label: "Link", hint: "link to existing project" }
82
+ ]
83
+ });
84
+ categories.push({
85
+ value: "team",
86
+ label: "Team",
87
+ hint: "create, join, members, invite code",
88
+ items: [
89
+ { value: "team create", label: "Create", hint: "start a new team" },
90
+ { value: "team join", label: "Join", hint: "join with invite code" },
91
+ { value: "team members", label: "Members", hint: "view team members" },
92
+ { value: "team invite-code", label: "Invite code", hint: "show or regenerate" }
93
+ ]
94
+ });
95
+ categories.push({
96
+ value: "account",
97
+ label: "Account",
98
+ hint: "whoami, logout, server",
99
+ items: [
100
+ { value: "whoami", label: "Who am I", hint: "show current user" },
101
+ { value: "logout", label: "Logout", hint: "clear credentials" },
102
+ { value: "server", label: "Server settings", hint: "set or show server URL" }
103
+ ]
104
+ });
105
+ }
106
+ if (!loggedIn) {
107
+ categories.push({
108
+ value: "account",
109
+ label: "Account",
110
+ hint: "login, register, server",
111
+ items: [
112
+ { value: "login", label: "Login", hint: "authenticate" },
113
+ { value: "register", label: "Register", hint: "create account" },
114
+ { value: "server", label: "Server settings", hint: "set or show server URL" }
115
+ ]
116
+ });
117
+ }
118
+ return categories;
119
+ }
120
+ var main = defineCommand({
121
+ meta: {
122
+ name: "evp",
123
+ version: "0.1.0",
124
+ description: "Self-hosted environment variable manager"
125
+ },
126
+ subCommands: {
127
+ server: commands.server,
128
+ register: commands.register,
129
+ login: commands.login,
130
+ logout: commands.logout,
131
+ whoami: commands.whoami,
132
+ team: () => import("./team-V2D7J34H.js").then((m) => m.default),
133
+ init: commands.init,
134
+ link: commands.link,
135
+ env: () => import("./env-JDEDJCKM.js").then((m) => m.default),
136
+ pull: commands.pull,
137
+ push: commands.push,
138
+ set: commands.set,
139
+ unset: commands.unset,
140
+ list: commands.list,
141
+ diff: commands.diff
142
+ },
143
+ async run() {
144
+ p.intro(chalk.bold("evp") + chalk.dim(" v0.1.0"));
145
+ while (true) {
146
+ const [config, projectConfig] = await Promise.all([
147
+ loadConfig(),
148
+ loadProjectConfig()
149
+ ]);
150
+ const loggedIn = !!(config?.server_url && config?.token);
151
+ const hasProject = loggedIn && !!projectConfig;
152
+ if (!loggedIn) {
153
+ p.log.warn("Not logged in. Run " + chalk.cyan("evp login") + " or " + chalk.cyan("evp register") + " to get started.");
154
+ } else if (!hasProject) {
155
+ p.log.warn("No project linked. Run " + chalk.cyan("evp init") + " or " + chalk.cyan("evp link") + " to set up a project.");
156
+ }
157
+ const categories = buildCategories(loggedIn, hasProject);
158
+ const hasMultiple = categories.length > 1;
159
+ let items;
160
+ if (!hasMultiple) {
161
+ items = categories[0].items;
162
+ } else {
163
+ const category = await p.select({
164
+ message: "What would you like to do?",
165
+ options: [
166
+ ...categories.map((c) => ({ value: c.value, label: c.label, hint: c.hint })),
167
+ { value: "exit", label: "Exit", hint: "quit evp" }
168
+ ]
169
+ });
170
+ handleCancel(category);
171
+ if (category === "exit") {
172
+ p.outro("Goodbye!");
173
+ process.exit(0);
174
+ }
175
+ items = categories.find((c) => c.value === category).items;
176
+ }
177
+ const footer = [];
178
+ if (hasMultiple) footer.push({ value: "__back__", label: "Back", hint: "return to menu" });
179
+ footer.push({ value: "__exit__", label: "Exit", hint: "quit evp" });
180
+ const selected = await p.select({
181
+ message: "Select action",
182
+ options: [...items, ...footer]
183
+ });
184
+ handleCancel(selected);
185
+ if (selected === "__exit__") {
186
+ p.outro("Goodbye!");
187
+ process.exit(0);
188
+ }
189
+ if (selected === "__back__") {
190
+ console.log();
191
+ continue;
192
+ }
193
+ const cmd = await commands[selected]();
194
+ await runCommand(cmd, { rawArgs: [] });
195
+ if (selected === "logout") {
196
+ p.outro("Logged out. Goodbye!");
197
+ process.exit(0);
198
+ }
199
+ console.log();
200
+ }
201
+ }
202
+ });
203
+
204
+ // src/index.ts
205
+ runMain(main);
206
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/index.ts"],"sourcesContent":["import { runMain } from \"citty\";\nimport { main } from \"./commands/index.js\";\n\nrunMain(main);\n","import { defineCommand, runCommand, type CommandDef } from \"citty\";\nimport { p, handleCancel, chalk } from \"../lib/ui.js\";\nimport { loadConfig } from \"../lib/config.js\";\nimport { loadProjectConfig } from \"../lib/project-config.js\";\n\nconst commands = {\n // Secrets\n pull: () => import(\"./secrets/pull.js\").then((m) => m.default),\n push: () => import(\"./secrets/push.js\").then((m) => m.default),\n set: () => import(\"./secrets/set.js\").then((m) => m.default),\n unset: () => import(\"./secrets/unset.js\").then((m) => m.default),\n list: () => import(\"./secrets/list.js\").then((m) => m.default),\n diff: () => import(\"./secrets/diff.js\").then((m) => m.default),\n // Environments\n \"env list\": () => import(\"./env/list.js\").then((m) => m.default),\n \"env switch\": () => import(\"./env/switch.js\").then((m) => m.default),\n \"env create\": () => import(\"./env/create.js\").then((m) => m.default),\n // Project\n init: () => import(\"./project/init.js\").then((m) => m.default),\n link: () => import(\"./project/link.js\").then((m) => m.default),\n // Team\n \"team create\": () => import(\"./team/create.js\").then((m) => m.default),\n \"team join\": () => import(\"./team/join.js\").then((m) => m.default),\n \"team members\": () => import(\"./team/members.js\").then((m) => m.default),\n \"team invite-code\": () => import(\"./team/invite-code.js\").then((m) => m.default),\n // Account\n server: () => import(\"./server.js\").then((m) => m.default),\n login: () => import(\"./auth/login.js\").then((m) => m.default),\n register: () => import(\"./auth/register.js\").then((m) => m.default),\n whoami: () => import(\"./auth/whoami.js\").then((m) => m.default),\n logout: () => import(\"./auth/logout.js\").then((m) => m.default),\n} satisfies Record<string, () => Promise<CommandDef>>;\n\ntype CmdKey = keyof typeof commands;\ntype MenuValue = CmdKey | \"__back__\" | \"__exit__\";\ntype MenuItem = { value: MenuValue; label: string; hint: string };\n\ntype Category = {\n value: string;\n label: string;\n hint: string;\n items: MenuItem[];\n};\n\nfunction buildCategories(loggedIn: boolean, hasProject: boolean): Category[] {\n const categories: Category[] = [];\n\n if (hasProject) {\n categories.push({\n value: \"secrets\", label: \"Secrets\", hint: \"pull, push, set, unset, list, diff\",\n items: [\n { value: \"pull\", label: \"Pull\", hint: \"sync remote → local .env\" },\n { value: \"push\", label: \"Push\", hint: \"sync local .env → remote\" },\n { value: \"set\", label: \"Set\", hint: \"set KEY=VALUE remotely\" },\n { value: \"unset\", label: \"Unset\", hint: \"remove a key remotely\" },\n { value: \"list\", label: \"List\", hint: \"show all remote keys\" },\n { value: \"diff\", label: \"Diff\", hint: \"compare local vs remote\" },\n ],\n });\n categories.push({\n value: \"env\", label: \"Environments\", hint: \"list, switch, create\",\n items: [\n { value: \"env list\", label: \"List\", hint: \"show all environments\" },\n { value: \"env switch\", label: \"Switch\", hint: \"change active environment\" },\n { value: \"env create\", label: \"Create\", hint: \"add a new environment\" },\n ],\n });\n }\n\n if (loggedIn) {\n categories.push({\n value: \"project\", label: \"Project\", hint: \"init, link\",\n items: [\n { value: \"init\", label: \"Initialize\", hint: \"set up new project\" },\n { value: \"link\", label: \"Link\", hint: \"link to existing project\" },\n ],\n });\n categories.push({\n value: \"team\", label: \"Team\", hint: \"create, join, members, invite code\",\n items: [\n { value: \"team create\", label: \"Create\", hint: \"start a new team\" },\n { value: \"team join\", label: \"Join\", hint: \"join with invite code\" },\n { value: \"team members\", label: \"Members\", hint: \"view team members\" },\n { value: \"team invite-code\", label: \"Invite code\", hint: \"show or regenerate\" },\n ],\n });\n categories.push({\n value: \"account\", label: \"Account\", hint: \"whoami, logout, server\",\n items: [\n { value: \"whoami\", label: \"Who am I\", hint: \"show current user\" },\n { value: \"logout\", label: \"Logout\", hint: \"clear credentials\" },\n { value: \"server\", label: \"Server settings\", hint: \"set or show server URL\" },\n ],\n });\n }\n\n if (!loggedIn) {\n categories.push({\n value: \"account\", label: \"Account\", hint: \"login, register, server\",\n items: [\n { value: \"login\", label: \"Login\", hint: \"authenticate\" },\n { value: \"register\", label: \"Register\", hint: \"create account\" },\n { value: \"server\", label: \"Server settings\", hint: \"set or show server URL\" },\n ],\n });\n }\n\n return categories;\n}\n\nexport const main = defineCommand({\n meta: {\n name: \"evp\",\n version: \"0.1.0\",\n description: \"Self-hosted environment variable manager\",\n },\n subCommands: {\n server: commands.server,\n register: commands.register,\n login: commands.login,\n logout: commands.logout,\n whoami: commands.whoami,\n team: () => import(\"./team/index.js\").then((m) => m.default),\n init: commands.init,\n link: commands.link,\n env: () => import(\"./env/index.js\").then((m) => m.default),\n pull: commands.pull,\n push: commands.push,\n set: commands.set,\n unset: commands.unset,\n list: commands.list,\n diff: commands.diff,\n },\n async run() {\n p.intro(chalk.bold(\"evp\") + chalk.dim(\" v0.1.0\"));\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const [config, projectConfig] = await Promise.all([\n loadConfig(),\n loadProjectConfig(),\n ]);\n const loggedIn = !!(config?.server_url && config?.token);\n const hasProject = loggedIn && !!projectConfig;\n\n if (!loggedIn) {\n p.log.warn(\"Not logged in. Run \" + chalk.cyan(\"evp login\") + \" or \" + chalk.cyan(\"evp register\") + \" to get started.\");\n } else if (!hasProject) {\n p.log.warn(\"No project linked. Run \" + chalk.cyan(\"evp init\") + \" or \" + chalk.cyan(\"evp link\") + \" to set up a project.\");\n }\n\n const categories = buildCategories(loggedIn, hasProject);\n const hasMultiple = categories.length > 1;\n\n // Single category? Skip straight to its items\n let items: MenuItem[];\n if (!hasMultiple) {\n items = categories[0]!.items;\n } else {\n const category = await p.select({\n message: \"What would you like to do?\",\n options: [\n ...categories.map((c) => ({ value: c.value, label: c.label, hint: c.hint })),\n { value: \"exit\", label: \"Exit\", hint: \"quit evp\" },\n ],\n });\n handleCancel(category);\n if (category === \"exit\") {\n p.outro(\"Goodbye!\");\n process.exit(0);\n }\n items = categories.find((c) => c.value === category)!.items;\n }\n\n const footer: MenuItem[] = [];\n if (hasMultiple) footer.push({ value: \"__back__\", label: \"Back\", hint: \"return to menu\" });\n footer.push({ value: \"__exit__\", label: \"Exit\", hint: \"quit evp\" });\n\n const selected = await p.select({\n message: \"Select action\",\n options: [...items, ...footer],\n });\n handleCancel(selected);\n\n if (selected === \"__exit__\") {\n p.outro(\"Goodbye!\");\n process.exit(0);\n }\n if (selected === \"__back__\") {\n console.log();\n continue;\n }\n\n const cmd = await commands[selected as CmdKey]();\n await runCommand(cmd, { rawArgs: [] });\n\n if (selected === \"logout\") {\n p.outro(\"Logged out. Goodbye!\");\n process.exit(0);\n }\n\n console.log();\n }\n },\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ chalk,
4
+ handleCancel,
5
+ p
6
+ } from "./chunk-BWPCYXXL.js";
7
+ import {
8
+ getClient
9
+ } from "./chunk-HL2WXSVD.js";
10
+ import {
11
+ handleApiResponse,
12
+ handleError
13
+ } from "./chunk-UWVCYS24.js";
14
+ import {
15
+ saveProjectConfig
16
+ } from "./chunk-TSUQGF7F.js";
17
+ import {
18
+ detectProjectInfo,
19
+ parseEnvFile
20
+ } from "./chunk-Z23MVAIZ.js";
21
+ import "./chunk-2H7UOFLK.js";
22
+
23
+ // src/commands/project/init.ts
24
+ import { defineCommand } from "citty";
25
+ import { readFile } from "fs/promises";
26
+ import { join } from "path";
27
+ var init_default = defineCommand({
28
+ meta: { name: "init", description: "Initialize project (smart detection)" },
29
+ async run() {
30
+ try {
31
+ p.intro(chalk.bold("evp init"));
32
+ const cwd = process.cwd();
33
+ const info = await detectProjectInfo(cwd);
34
+ const lines = [];
35
+ if (info.name) lines.push(`Name: ${info.name}`);
36
+ if (info.branch) lines.push(`Branch: ${info.branch}`);
37
+ if (info.hasEnvFile) lines.push(`.env: found (${info.envVarCount} variables)`);
38
+ else lines.push(`.env: not found`);
39
+ if (lines.length) p.note(lines.join("\n"), "Detected project info");
40
+ const { client } = await getClient();
41
+ const teamsRes = await client.teams.mine.$get();
42
+ await handleApiResponse(teamsRes);
43
+ const teamsData = await teamsRes.json();
44
+ if (teamsData.teams.length === 0) {
45
+ p.cancel("No teams. Create one with `evp team create` first.");
46
+ process.exit(1);
47
+ }
48
+ let teamId;
49
+ let teamSlug;
50
+ if (teamsData.teams.length === 1) {
51
+ teamId = teamsData.teams[0].id;
52
+ teamSlug = teamsData.teams[0].slug;
53
+ } else {
54
+ const selected = await p.select({
55
+ message: "Select team",
56
+ options: teamsData.teams.map((t) => ({ value: t.id, label: t.name }))
57
+ });
58
+ handleCancel(selected);
59
+ teamId = selected;
60
+ teamSlug = teamsData.teams.find((t) => t.id === teamId).slug;
61
+ }
62
+ const projectName = await p.text({
63
+ message: "Project name",
64
+ initialValue: info.name || ""
65
+ });
66
+ handleCancel(projectName);
67
+ const suggestedEnv = info.suggestedEnv || "development";
68
+ const envName = await p.text({
69
+ message: `Environment name for branch "${info.branch || "unknown"}"`,
70
+ initialValue: suggestedEnv,
71
+ validate: (v) => {
72
+ if (!v || v.trim().length === 0) return "Environment name is required";
73
+ }
74
+ });
75
+ handleCancel(envName);
76
+ const s = p.spinner();
77
+ s.start("Creating project...");
78
+ const projectRes = await client.projects.$post({
79
+ json: { team_id: teamId, name: projectName }
80
+ });
81
+ await handleApiResponse(projectRes);
82
+ const projectData = await projectRes.json();
83
+ s.stop("Project created!");
84
+ let targetEnv = projectData.environments.find(
85
+ (e) => e.slug === envName || e.name.toLowerCase() === envName.toLowerCase()
86
+ );
87
+ if (!targetEnv) {
88
+ s.start(`Creating environment "${envName}"...`);
89
+ const envRes = await client.environments[":projectId"].environments.$post({
90
+ param: { projectId: projectData.project.id },
91
+ json: { name: envName }
92
+ });
93
+ await handleApiResponse(envRes);
94
+ const envData = await envRes.json();
95
+ targetEnv = envData.environment;
96
+ s.stop(`Created environment "${targetEnv.name}"`);
97
+ }
98
+ if (info.hasEnvFile && info.envVarCount && info.envVarCount > 0) {
99
+ const importEnv = await p.confirm({
100
+ message: `Import ${info.envVarCount} variables from .env to ${envName}?`,
101
+ initialValue: true
102
+ });
103
+ handleCancel(importEnv);
104
+ if (importEnv) {
105
+ s.start(`Pushing ${info.envVarCount} secrets to ${envName}...`);
106
+ const envContent = await readFile(join(cwd, ".env"), "utf-8");
107
+ const vars = parseEnvFile(envContent);
108
+ const secrets = Object.entries(vars).map(([key, value]) => ({ key, value }));
109
+ const pushRes = await client.secrets[":id"].secrets.$put({
110
+ param: { id: targetEnv.id },
111
+ json: { secrets }
112
+ });
113
+ await handleApiResponse(pushRes);
114
+ s.stop(`Pushed ${secrets.length} secrets!`);
115
+ }
116
+ }
117
+ await saveProjectConfig({
118
+ team: teamSlug,
119
+ project: projectData.project.slug,
120
+ environment: targetEnv.slug
121
+ });
122
+ p.log.success("Created .evp.json");
123
+ p.log.info(chalk.dim("Add .evp.json and .env to your .gitignore"));
124
+ p.note(
125
+ [
126
+ `Project: ${projectName}`,
127
+ `Environment: ${targetEnv.name}`,
128
+ info.envVarCount ? `Secrets: ${info.envVarCount} synced` : ""
129
+ ].filter(Boolean).join("\n"),
130
+ "Summary"
131
+ );
132
+ p.outro("Done! Use `evp pull` and `evp push` to sync.");
133
+ } catch (err) {
134
+ handleError(err);
135
+ }
136
+ }
137
+ });
138
+ export {
139
+ init_default as default
140
+ };
141
+ //# sourceMappingURL=init-JIDH7ICC.js.map