@rmartz/envctl 3.1.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 (190) hide show
  1. package/README.md +79 -0
  2. package/dist/envctl.d.ts +3 -0
  3. package/dist/envctl.d.ts.map +1 -0
  4. package/dist/envctl.js +36 -0
  5. package/dist/envctl.js.map +1 -0
  6. package/dist/lib/auth.d.ts +21 -0
  7. package/dist/lib/auth.d.ts.map +1 -0
  8. package/dist/lib/auth.js +148 -0
  9. package/dist/lib/auth.js.map +1 -0
  10. package/dist/lib/check-firebase.d.ts +6 -0
  11. package/dist/lib/check-firebase.d.ts.map +1 -0
  12. package/dist/lib/check-firebase.js +81 -0
  13. package/dist/lib/check-firebase.js.map +1 -0
  14. package/dist/lib/check-live.d.ts +3 -0
  15. package/dist/lib/check-live.d.ts.map +1 -0
  16. package/dist/lib/check-live.js +50 -0
  17. package/dist/lib/check-live.js.map +1 -0
  18. package/dist/lib/check.d.ts +9 -0
  19. package/dist/lib/check.d.ts.map +1 -0
  20. package/dist/lib/check.js +165 -0
  21. package/dist/lib/check.js.map +1 -0
  22. package/dist/lib/cli/help.d.ts +4 -0
  23. package/dist/lib/cli/help.d.ts.map +1 -0
  24. package/dist/lib/cli/help.js +52 -0
  25. package/dist/lib/cli/help.js.map +1 -0
  26. package/dist/lib/cli/registry.d.ts +19 -0
  27. package/dist/lib/cli/registry.d.ts.map +1 -0
  28. package/dist/lib/cli/registry.js +111 -0
  29. package/dist/lib/cli/registry.js.map +1 -0
  30. package/dist/lib/cli/router.d.ts +22 -0
  31. package/dist/lib/cli/router.d.ts.map +1 -0
  32. package/dist/lib/cli/router.js +98 -0
  33. package/dist/lib/cli/router.js.map +1 -0
  34. package/dist/lib/cli/version.d.ts +2 -0
  35. package/dist/lib/cli/version.d.ts.map +1 -0
  36. package/dist/lib/cli/version.js +58 -0
  37. package/dist/lib/cli/version.js.map +1 -0
  38. package/dist/lib/commands/auth.d.ts +2 -0
  39. package/dist/lib/commands/auth.d.ts.map +1 -0
  40. package/dist/lib/commands/auth.js +33 -0
  41. package/dist/lib/commands/auth.js.map +1 -0
  42. package/dist/lib/commands/bootstrap-args.d.ts +11 -0
  43. package/dist/lib/commands/bootstrap-args.d.ts.map +1 -0
  44. package/dist/lib/commands/bootstrap-args.js +111 -0
  45. package/dist/lib/commands/bootstrap-args.js.map +1 -0
  46. package/dist/lib/commands/bootstrap.d.ts +5 -0
  47. package/dist/lib/commands/bootstrap.d.ts.map +1 -0
  48. package/dist/lib/commands/bootstrap.js +166 -0
  49. package/dist/lib/commands/bootstrap.js.map +1 -0
  50. package/dist/lib/commands/check.d.ts +3 -0
  51. package/dist/lib/commands/check.d.ts.map +1 -0
  52. package/dist/lib/commands/check.js +47 -0
  53. package/dist/lib/commands/check.js.map +1 -0
  54. package/dist/lib/commands/config-pull.d.ts +12 -0
  55. package/dist/lib/commands/config-pull.d.ts.map +1 -0
  56. package/dist/lib/commands/config-pull.js +161 -0
  57. package/dist/lib/commands/config-pull.js.map +1 -0
  58. package/dist/lib/commands/config-push-args.d.ts +9 -0
  59. package/dist/lib/commands/config-push-args.d.ts.map +1 -0
  60. package/dist/lib/commands/config-push-args.js +108 -0
  61. package/dist/lib/commands/config-push-args.js.map +1 -0
  62. package/dist/lib/commands/config-push.d.ts +6 -0
  63. package/dist/lib/commands/config-push.d.ts.map +1 -0
  64. package/dist/lib/commands/config-push.js +166 -0
  65. package/dist/lib/commands/config-push.js.map +1 -0
  66. package/dist/lib/commands/deployment-config.d.ts +9 -0
  67. package/dist/lib/commands/deployment-config.d.ts.map +1 -0
  68. package/dist/lib/commands/deployment-config.js +73 -0
  69. package/dist/lib/commands/deployment-config.js.map +1 -0
  70. package/dist/lib/commands/env-plan.d.ts +4 -0
  71. package/dist/lib/commands/env-plan.d.ts.map +1 -0
  72. package/dist/lib/commands/env-plan.js +85 -0
  73. package/dist/lib/commands/env-plan.js.map +1 -0
  74. package/dist/lib/commands/env.d.ts +4 -0
  75. package/dist/lib/commands/env.d.ts.map +1 -0
  76. package/dist/lib/commands/env.js +122 -0
  77. package/dist/lib/commands/env.js.map +1 -0
  78. package/dist/lib/commands/init.d.ts +3 -0
  79. package/dist/lib/commands/init.d.ts.map +1 -0
  80. package/dist/lib/commands/init.js +59 -0
  81. package/dist/lib/commands/init.js.map +1 -0
  82. package/dist/lib/commands/secrets-args.d.ts +13 -0
  83. package/dist/lib/commands/secrets-args.d.ts.map +1 -0
  84. package/dist/lib/commands/secrets-args.js +136 -0
  85. package/dist/lib/commands/secrets-args.js.map +1 -0
  86. package/dist/lib/commands/secrets-plan.d.ts +9 -0
  87. package/dist/lib/commands/secrets-plan.d.ts.map +1 -0
  88. package/dist/lib/commands/secrets-plan.js +109 -0
  89. package/dist/lib/commands/secrets-plan.js.map +1 -0
  90. package/dist/lib/commands/secrets.d.ts +7 -0
  91. package/dist/lib/commands/secrets.d.ts.map +1 -0
  92. package/dist/lib/commands/secrets.js +191 -0
  93. package/dist/lib/commands/secrets.js.map +1 -0
  94. package/dist/lib/deployments.d.ts +4 -0
  95. package/dist/lib/deployments.d.ts.map +1 -0
  96. package/dist/lib/deployments.js +83 -0
  97. package/dist/lib/deployments.js.map +1 -0
  98. package/dist/lib/environments.d.ts +4 -0
  99. package/dist/lib/environments.d.ts.map +1 -0
  100. package/dist/lib/environments.js +97 -0
  101. package/dist/lib/environments.js.map +1 -0
  102. package/dist/lib/firebase-credential.d.ts +28 -0
  103. package/dist/lib/firebase-credential.d.ts.map +1 -0
  104. package/dist/lib/firebase-credential.js +50 -0
  105. package/dist/lib/firebase-credential.js.map +1 -0
  106. package/dist/lib/firebase-invalidate.d.ts +4 -0
  107. package/dist/lib/firebase-invalidate.d.ts.map +1 -0
  108. package/dist/lib/firebase-invalidate.js +61 -0
  109. package/dist/lib/firebase-invalidate.js.map +1 -0
  110. package/dist/lib/firebase-vars.d.ts +14 -0
  111. package/dist/lib/firebase-vars.d.ts.map +1 -0
  112. package/dist/lib/firebase-vars.js +40 -0
  113. package/dist/lib/firebase-vars.js.map +1 -0
  114. package/dist/lib/firebase.d.ts +20 -0
  115. package/dist/lib/firebase.d.ts.map +1 -0
  116. package/dist/lib/firebase.js +189 -0
  117. package/dist/lib/firebase.js.map +1 -0
  118. package/dist/lib/gcp.d.ts +4 -0
  119. package/dist/lib/gcp.d.ts.map +1 -0
  120. package/dist/lib/gcp.js +53 -0
  121. package/dist/lib/gcp.js.map +1 -0
  122. package/dist/lib/generated-secrets.d.ts +16 -0
  123. package/dist/lib/generated-secrets.d.ts.map +1 -0
  124. package/dist/lib/generated-secrets.js +68 -0
  125. package/dist/lib/generated-secrets.js.map +1 -0
  126. package/dist/lib/logger.d.ts +7 -0
  127. package/dist/lib/logger.d.ts.map +1 -0
  128. package/dist/lib/logger.js +60 -0
  129. package/dist/lib/logger.js.map +1 -0
  130. package/dist/lib/manifest/index.d.ts +6 -0
  131. package/dist/lib/manifest/index.d.ts.map +1 -0
  132. package/dist/lib/manifest/index.js +15 -0
  133. package/dist/lib/manifest/index.js.map +1 -0
  134. package/dist/lib/manifest/parse.d.ts +11 -0
  135. package/dist/lib/manifest/parse.d.ts.map +1 -0
  136. package/dist/lib/manifest/parse.js +214 -0
  137. package/dist/lib/manifest/parse.js.map +1 -0
  138. package/dist/lib/manifest/resolve.d.ts +9 -0
  139. package/dist/lib/manifest/resolve.d.ts.map +1 -0
  140. package/dist/lib/manifest/resolve.js +34 -0
  141. package/dist/lib/manifest/resolve.js.map +1 -0
  142. package/dist/lib/manifest/types.d.ts +57 -0
  143. package/dist/lib/manifest/types.d.ts.map +1 -0
  144. package/dist/lib/manifest/types.js +12 -0
  145. package/dist/lib/manifest/types.js.map +1 -0
  146. package/dist/lib/manifest/write.d.ts +3 -0
  147. package/dist/lib/manifest/write.d.ts.map +1 -0
  148. package/dist/lib/manifest/write.js +110 -0
  149. package/dist/lib/manifest/write.js.map +1 -0
  150. package/dist/lib/project.d.ts +6 -0
  151. package/dist/lib/project.d.ts.map +1 -0
  152. package/dist/lib/project.js +56 -0
  153. package/dist/lib/project.js.map +1 -0
  154. package/dist/lib/providers/deployment.d.ts +19 -0
  155. package/dist/lib/providers/deployment.d.ts.map +1 -0
  156. package/dist/lib/providers/deployment.js +62 -0
  157. package/dist/lib/providers/deployment.js.map +1 -0
  158. package/dist/lib/providers/registry.d.ts +5 -0
  159. package/dist/lib/providers/registry.d.ts.map +1 -0
  160. package/dist/lib/providers/registry.js +31 -0
  161. package/dist/lib/providers/registry.js.map +1 -0
  162. package/dist/lib/providers/service.d.ts +35 -0
  163. package/dist/lib/providers/service.d.ts.map +1 -0
  164. package/dist/lib/providers/service.js +81 -0
  165. package/dist/lib/providers/service.js.map +1 -0
  166. package/dist/lib/rotation-preflight.d.ts +11 -0
  167. package/dist/lib/rotation-preflight.d.ts.map +1 -0
  168. package/dist/lib/rotation-preflight.js +47 -0
  169. package/dist/lib/rotation-preflight.js.map +1 -0
  170. package/dist/lib/rotation.d.ts +33 -0
  171. package/dist/lib/rotation.d.ts.map +1 -0
  172. package/dist/lib/rotation.js +168 -0
  173. package/dist/lib/rotation.js.map +1 -0
  174. package/dist/lib/sentry.d.ts +5 -0
  175. package/dist/lib/sentry.d.ts.map +1 -0
  176. package/dist/lib/sentry.js +132 -0
  177. package/dist/lib/sentry.js.map +1 -0
  178. package/dist/lib/subprocess.d.ts +8 -0
  179. package/dist/lib/subprocess.d.ts.map +1 -0
  180. package/dist/lib/subprocess.js +30 -0
  181. package/dist/lib/subprocess.js.map +1 -0
  182. package/dist/lib/targets.d.ts +3 -0
  183. package/dist/lib/targets.d.ts.map +1 -0
  184. package/dist/lib/targets.js +25 -0
  185. package/dist/lib/targets.js.map +1 -0
  186. package/dist/lib/vercel-api.d.ts +50 -0
  187. package/dist/lib/vercel-api.d.ts.map +1 -0
  188. package/dist/lib/vercel-api.js +176 -0
  189. package/dist/lib/vercel-api.js.map +1 -0
  190. package/package.json +53 -0
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.mkWarning = exports.mkError = void 0;
37
+ exports.checkStatic = checkStatic;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const deployment_config_1 = require("./commands/deployment-config");
41
+ const manifest_1 = require("./manifest");
42
+ const registry_1 = require("./providers/registry");
43
+ const service_1 = require("./providers/service");
44
+ const targets_1 = require("./targets");
45
+ const mkError = (message) => ({
46
+ severity: "error",
47
+ message,
48
+ });
49
+ exports.mkError = mkError;
50
+ const mkWarning = (message) => ({
51
+ severity: "warning",
52
+ message,
53
+ });
54
+ exports.mkWarning = mkWarning;
55
+ // Static (offline) validation of a project's deployment config: it reads only
56
+ // the in-repo config, never the network. `--live` reconciliation against the
57
+ // provider lives in check-live.ts.
58
+ function checkStatic(workingDir) {
59
+ const configDir = (0, deployment_config_1.deploymentDir)(workingDir);
60
+ if (!fs.existsSync((0, manifest_1.manifestFilePath)(configDir)) &&
61
+ !fs.existsSync((0, deployment_config_1.environmentsFile)(workingDir)))
62
+ return [
63
+ (0, exports.mkError)(`No deployment config found in ${configDir} — run 'envctl init' to scaffold it.`),
64
+ ];
65
+ let manifest;
66
+ try {
67
+ manifest = (0, manifest_1.parseManifest)(configDir);
68
+ }
69
+ catch (e) {
70
+ return [
71
+ (0, exports.mkError)(`deployment/manifest.yml failed to parse: ${e instanceof Error ? e.message : String(e)}`),
72
+ ];
73
+ }
74
+ const declared = new Set(manifest.environments);
75
+ const validTargets = new Set(deployment_config_1.VALID_TARGETS);
76
+ const isVercel = (manifest.deployments[0]?.provider ?? "vercel") === "vercel";
77
+ return [
78
+ ...checkEnvResolution(manifest, configDir, isVercel, validTargets),
79
+ ...checkDeploymentTargets(manifest, declared, validTargets),
80
+ ...checkOrphanOverlays(configDir, declared),
81
+ ...checkProvidersRegistered(manifest),
82
+ ...checkScopes(manifest, declared),
83
+ ...checkIdentity(workingDir, isVercel),
84
+ ];
85
+ }
86
+ // Every declared environment must resolve to a target valid for the provider.
87
+ // Only meaningful for Vercel (the sole registered provider); an unregistered
88
+ // provider is flagged by checkProvidersRegistered instead.
89
+ function checkEnvResolution(manifest, configDir, isVercel, validTargets) {
90
+ if (!isVercel)
91
+ return [];
92
+ const resolve = (0, targets_1.envTargetResolver)(configDir);
93
+ return manifest.environments
94
+ .filter((env) => !validTargets.has(resolve(env)))
95
+ .map((env) => (0, exports.mkError)(`environment '${env}' resolves to invalid target '${resolve(env)}' — add a deployments[].targets entry mapping it to one of: ${[...validTargets].join(", ")}.`));
96
+ }
97
+ // Each deployments[].targets key must be a declared environment, and (for
98
+ // Vercel) each value must be a valid target.
99
+ function checkDeploymentTargets(manifest, declared, validTargets) {
100
+ const findings = [];
101
+ for (const dep of manifest.deployments) {
102
+ for (const [env, target] of Object.entries(dep.targets)) {
103
+ if (!declared.has(env))
104
+ findings.push((0, exports.mkError)(`deployment '${dep.provider}' maps undeclared environment '${env}' — declare it under environments or remove the mapping.`));
105
+ if (dep.provider === "vercel" && !validTargets.has(target))
106
+ findings.push((0, exports.mkError)(`deployment '${dep.provider}' maps '${env}' to invalid target '${target}' — valid targets: ${[...validTargets].join(", ")}.`));
107
+ }
108
+ }
109
+ return findings;
110
+ }
111
+ // A per-environment overlay file (deployment/<env>.yml) whose name is not a
112
+ // declared environment is an orphan: it will never be pushed and usually means
113
+ // a typo or a stale file.
114
+ function checkOrphanOverlays(configDir, declared) {
115
+ if (!fs.existsSync(configDir))
116
+ return [];
117
+ const reserved = new Set(["manifest.yml", "environments.yml"]);
118
+ return fs
119
+ .readdirSync(configDir)
120
+ .filter((f) => f.endsWith(".yml") && !reserved.has(f))
121
+ .filter((f) => !declared.has(f.slice(0, -".yml".length)))
122
+ .map((f) => (0, exports.mkError)(`overlay file '${f}' has no matching environment — declare '${f.slice(0, -".yml".length)}' or remove deployment/${f}.`));
123
+ }
124
+ // Every deployment and service `provider:` must be registered.
125
+ function checkProvidersRegistered(manifest) {
126
+ const findings = [];
127
+ const knownDeployments = new Set(registry_1.KNOWN_DEPLOYMENT_PROVIDERS);
128
+ for (const dep of manifest.deployments)
129
+ if (!knownDeployments.has(dep.provider))
130
+ findings.push((0, exports.mkError)(`unknown deployment provider '${dep.provider}' — envctl supports: ${[...knownDeployments].join(", ")}.`));
131
+ const knownServices = new Set((0, service_1.serviceProviders)().map((p) => p.provider));
132
+ for (const svc of manifest.services)
133
+ if (!knownServices.has(svc.provider))
134
+ findings.push((0, exports.mkError)(`unknown service provider '${svc.provider}' — envctl supports: ${[...knownServices].join(", ")}.`));
135
+ return findings;
136
+ }
137
+ // Service and variable-group `environments:` may only reference declared
138
+ // environments.
139
+ function checkScopes(manifest, declared) {
140
+ const findings = [];
141
+ for (const svc of manifest.services)
142
+ for (const env of svc.environments ?? [])
143
+ if (!declared.has(env))
144
+ findings.push((0, exports.mkError)(`service '${svc.provider}' is scoped to undeclared environment '${env}'.`));
145
+ for (const group of manifest.variableGroups)
146
+ for (const env of group.environments ?? [])
147
+ if (!declared.has(env))
148
+ findings.push((0, exports.mkError)(`variable group '${group.name}' is scoped to undeclared environment '${env}'.`));
149
+ return findings;
150
+ }
151
+ // The Vercel deployment provider's identity should resolve. Missing identity is
152
+ // a warning, not an error: the manifest is still valid — identity is only
153
+ // needed once you push or rotate.
154
+ function checkIdentity(workingDir, isVercel) {
155
+ if (!isVercel)
156
+ return [];
157
+ const linked = fs.existsSync(path.join(workingDir, ".vercel", "project.json")) ||
158
+ Boolean(process.env.VERCEL_PROJECT_ID);
159
+ return linked
160
+ ? []
161
+ : [
162
+ (0, exports.mkWarning)("Vercel project identity not resolved — .vercel/project.json is missing and VERCEL_PROJECT_ID is unset. Required for 'config push' and 'secrets', not for validation."),
163
+ ];
164
+ }
165
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/lib/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CommandGroup, Registry } from "./registry";
2
+ export declare function renderTopHelp(registry: Registry): string;
3
+ export declare function renderGroupHelp(group: CommandGroup): string;
4
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKzD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAyBxD;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAqB3D"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderTopHelp = renderTopHelp;
4
+ exports.renderGroupHelp = renderGroupHelp;
5
+ // Renders the top-level help: usage plus the list of command groups. With an
6
+ // empty registry the groups section is omitted, so the output stays coherent
7
+ // until command groups land.
8
+ function renderTopHelp(registry) {
9
+ const lines = [
10
+ "envctl — manage deploy configuration and provider secrets across projects",
11
+ "",
12
+ "Usage:",
13
+ " envctl [-C <dir>] <group> <command> [args]",
14
+ " envctl --version",
15
+ " envctl --help",
16
+ "",
17
+ "Global flags:",
18
+ " -C, --working-dir <dir> Project root to operate on (default: current directory)",
19
+ " -h, --help Show help",
20
+ " --version Print the envctl version",
21
+ ];
22
+ if (registry.length > 0) {
23
+ lines.push("", "Command groups:");
24
+ const width = Math.max(...registry.map((g) => g.name.length));
25
+ for (const group of registry) {
26
+ lines.push(` ${group.name.padEnd(width)} ${group.summary}`);
27
+ }
28
+ lines.push("", "Run 'envctl <group> --help' for a group's commands.");
29
+ }
30
+ return lines.join("\n");
31
+ }
32
+ // Renders help for a single group: its commands and their summaries.
33
+ function renderGroupHelp(group) {
34
+ const usage = group.commands.length === 0 && group.run
35
+ ? ` envctl ${group.name}`
36
+ : ` envctl ${group.name} <command> [args]`;
37
+ const lines = [
38
+ `envctl ${group.name} — ${group.summary}`,
39
+ "",
40
+ "Usage:",
41
+ usage,
42
+ ];
43
+ if (group.commands.length > 0) {
44
+ lines.push("", "Commands:");
45
+ const width = Math.max(...group.commands.map((c) => c.name.length));
46
+ for (const command of group.commands) {
47
+ lines.push(` ${command.name.padEnd(width)} ${command.summary}`);
48
+ }
49
+ }
50
+ return lines.join("\n");
51
+ }
52
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/lib/cli/help.ts"],"names":[],"mappings":";;AAKA,sCAyBC;AAGD,0CAqBC;AApDD,6EAA6E;AAC7E,6EAA6E;AAC7E,6BAA6B;AAC7B,SAAgB,aAAa,CAAC,QAAkB;IAC9C,MAAM,KAAK,GAAG;QACZ,2EAA2E;QAC3E,EAAE;QACF,QAAQ;QACR,8CAA8C;QAC9C,oBAAoB;QACpB,iBAAiB;QACjB,EAAE;QACF,eAAe;QACf,qFAAqF;QACrF,uCAAuC;QACvC,sDAAsD;KACvD,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,qDAAqD,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,qEAAqE;AACrE,SAAgB,eAAe,CAAC,KAAmB;IACjD,MAAM,KAAK,GACT,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG;QACtC,CAAC,CAAC,YAAY,KAAK,CAAC,IAAI,EAAE;QAC1B,CAAC,CAAC,YAAY,KAAK,CAAC,IAAI,mBAAmB,CAAC;IAChD,MAAM,KAAK,GAAG;QACZ,UAAU,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE;QACzC,EAAE;QACF,QAAQ;QACR,KAAK;KACN,CAAC;IAEF,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface CommandContext {
2
+ workingDir: string;
3
+ }
4
+ export interface Command {
5
+ name: string;
6
+ summary: string;
7
+ run(ctx: CommandContext, args: string[]): void | Promise<void>;
8
+ }
9
+ export interface CommandGroup {
10
+ name: string;
11
+ summary: string;
12
+ commands: Command[];
13
+ run?: Command["run"];
14
+ }
15
+ export type Registry = CommandGroup[];
16
+ export declare function buildRegistry(): Registry;
17
+ export declare function findGroup(registry: Registry, name: string): CommandGroup | undefined;
18
+ export declare function findCommand(group: CommandGroup, name: string): Command | undefined;
19
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/registry.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAE7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IAIpB,GAAG,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;CACtB;AAED,MAAM,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;AAItC,wBAAgB,aAAa,IAAI,QAAQ,CAsFxC;AAED,wBAAgB,SAAS,CACvB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,GACX,YAAY,GAAG,SAAS,CAE1B;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,GAAG,SAAS,CAErB"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ // The command registry — the single extension point for the CLI surface.
3
+ // Later milestones add their groups here (config, env, secrets, auth) without
4
+ // touching the router or entrypoint.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildRegistry = buildRegistry;
7
+ exports.findGroup = findGroup;
8
+ exports.findCommand = findCommand;
9
+ const auth_1 = require("../commands/auth");
10
+ const bootstrap_1 = require("../commands/bootstrap");
11
+ const check_1 = require("../commands/check");
12
+ const config_pull_1 = require("../commands/config-pull");
13
+ const config_push_1 = require("../commands/config-push");
14
+ const env_1 = require("../commands/env");
15
+ const init_1 = require("../commands/init");
16
+ const secrets_1 = require("../commands/secrets");
17
+ // The live registry. The router and help output are driven entirely by whatever
18
+ // is listed here; later milestones add their groups (env, secrets, auth).
19
+ function buildRegistry() {
20
+ return [
21
+ {
22
+ name: "config",
23
+ summary: "Manage environment variables",
24
+ commands: [
25
+ {
26
+ name: "push",
27
+ summary: "Push public (non-secret) env vars to the provider",
28
+ run: config_push_1.configPushCommand,
29
+ },
30
+ {
31
+ name: "pull",
32
+ summary: "Materialize an environment into a local dotenv file",
33
+ run: config_pull_1.runConfigPull,
34
+ },
35
+ ],
36
+ },
37
+ {
38
+ name: "env",
39
+ summary: "Define project environments and their target mappings",
40
+ commands: [
41
+ {
42
+ name: "add",
43
+ summary: "Add an environment and its target mapping",
44
+ run: env_1.runEnvAdd,
45
+ },
46
+ {
47
+ name: "list",
48
+ summary: "List defined environments and their provider targets",
49
+ run: env_1.runEnvList,
50
+ },
51
+ {
52
+ name: "pull",
53
+ summary: "Deprecated: use 'config pull'",
54
+ run: config_pull_1.runEnvPullDeprecated,
55
+ },
56
+ ],
57
+ },
58
+ {
59
+ name: "init",
60
+ summary: "Scaffold the deployment/ config in this project",
61
+ commands: [],
62
+ run: init_1.runInit,
63
+ },
64
+ {
65
+ name: "bootstrap",
66
+ summary: "Configure a project end to end: push config, init secrets, pull local env",
67
+ commands: [],
68
+ run: bootstrap_1.runBootstrapCommand,
69
+ },
70
+ {
71
+ name: "check",
72
+ summary: "Validate the project's deployment config (read-only)",
73
+ commands: [],
74
+ run: check_1.runCheck,
75
+ },
76
+ {
77
+ name: "secrets",
78
+ summary: "Atomically rotate and bootstrap provider secrets",
79
+ commands: [
80
+ {
81
+ name: "rotate",
82
+ summary: "Rotate Firebase/Sentry secrets, redeploy, then invalidate",
83
+ run: secrets_1.runSecretsRotate,
84
+ },
85
+ {
86
+ name: "init",
87
+ summary: "Bootstrap provider secrets for a fresh project",
88
+ run: secrets_1.runSecretsInit,
89
+ },
90
+ ],
91
+ },
92
+ {
93
+ name: "auth",
94
+ summary: "Inspect provider credentials",
95
+ commands: [
96
+ {
97
+ name: "status",
98
+ summary: "Show which providers are authenticated and how",
99
+ run: auth_1.runAuthStatus,
100
+ },
101
+ ],
102
+ },
103
+ ];
104
+ }
105
+ function findGroup(registry, name) {
106
+ return registry.find((g) => g.name === name);
107
+ }
108
+ function findCommand(group, name) {
109
+ return group.commands.find((c) => c.name === name);
110
+ }
111
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/lib/cli/registry.ts"],"names":[],"mappings":";AAAA,yEAAyE;AACzE,8EAA8E;AAC9E,qCAAqC;;AAoCrC,sCAsFC;AAED,8BAKC;AAED,kCAKC;AAtID,2CAAiD;AACjD,qDAA4D;AAC5D,6CAA6C;AAC7C,yDAA8E;AAC9E,yDAA4D;AAC5D,yCAAwD;AACxD,2CAA2C;AAC3C,iDAAuE;AAyBvE,gFAAgF;AAChF,0EAA0E;AAC1E,SAAgB,aAAa;IAC3B,OAAO;QACL;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,8BAA8B;YACvC,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,mDAAmD;oBAC5D,GAAG,EAAE,+BAAiB;iBACvB;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,qDAAqD;oBAC9D,GAAG,EAAE,2BAAa;iBACnB;aACF;SACF;QACD;YACE,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,uDAAuD;YAChE,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,2CAA2C;oBACpD,GAAG,EAAE,eAAS;iBACf;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,sDAAsD;oBAC/D,GAAG,EAAE,gBAAU;iBAChB;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,+BAA+B;oBACxC,GAAG,EAAE,kCAAoB;iBAC1B;aACF;SACF;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,iDAAiD;YAC1D,QAAQ,EAAE,EAAE;YACZ,GAAG,EAAE,cAAO;SACb;QACD;YACE,IAAI,EAAE,WAAW;YACjB,OAAO,EACL,2EAA2E;YAC7E,QAAQ,EAAE,EAAE;YACZ,GAAG,EAAE,+BAAmB;SACzB;QACD;YACE,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,sDAAsD;YAC/D,QAAQ,EAAE,EAAE;YACZ,GAAG,EAAE,gBAAQ;SACd;QACD;YACE,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,kDAAkD;YAC3D,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,2DAA2D;oBACpE,GAAG,EAAE,0BAAgB;iBACtB;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,gDAAgD;oBACzD,GAAG,EAAE,wBAAc;iBACpB;aACF;SACF;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,8BAA8B;YACvC,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,gDAAgD;oBACzD,GAAG,EAAE,oBAAa;iBACnB;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,SAAS,CACvB,QAAkB,EAClB,IAAY;IAEZ,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,WAAW,CACzB,KAAmB,EACnB,IAAY;IAEZ,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Command, CommandGroup, Registry } from "./registry";
2
+ export interface GlobalArgs {
3
+ workingDir: string;
4
+ rest: string[];
5
+ }
6
+ export declare function extractGlobalArgs(argv: string[], cwd: string): GlobalArgs;
7
+ export type RouteResult = {
8
+ kind: "version";
9
+ } | {
10
+ kind: "help";
11
+ group?: CommandGroup;
12
+ } | {
13
+ kind: "run";
14
+ group: CommandGroup;
15
+ command: Command;
16
+ args: string[];
17
+ } | {
18
+ kind: "error";
19
+ message: string;
20
+ };
21
+ export declare function route(tokens: string[], registry: Registry): RouteResult;
22
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/router.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKlE,MAAM,WAAW,UAAU;IAEzB,UAAU,EAAE,MAAM,CAAC;IAEnB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAKD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAmBzE;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvC,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAsCvE"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.extractGlobalArgs = extractGlobalArgs;
37
+ exports.route = route;
38
+ const path = __importStar(require("path"));
39
+ const logger_1 = require("../logger");
40
+ const registry_1 = require("./registry");
41
+ const HELP_FLAGS = new Set(["-h", "--help"]);
42
+ // Pulls the global -C/--working-dir flag out of argv wherever it appears,
43
+ // resolving its value against `cwd`. Defaults to `cwd` when absent. Throws a
44
+ // FatalError (via err) when the flag is given without a directory value.
45
+ function extractGlobalArgs(argv, cwd) {
46
+ let workingDir = cwd;
47
+ const rest = [];
48
+ for (let i = 0; i < argv.length; i++) {
49
+ const arg = argv[i];
50
+ if (arg === "-C" || arg === "--working-dir") {
51
+ const value = argv[i + 1];
52
+ if (value === undefined) {
53
+ (0, logger_1.err)(`${arg} requires a directory argument`);
54
+ }
55
+ workingDir = path.resolve(cwd, value);
56
+ i++; // consume the value
57
+ continue;
58
+ }
59
+ rest.push(arg);
60
+ }
61
+ return { workingDir, rest };
62
+ }
63
+ // Pure routing over the non-global tokens. Returns a description of what the
64
+ // entrypoint should do; performs no IO so it is fully unit-testable.
65
+ function route(tokens, registry) {
66
+ const [first, second, ...rest] = tokens;
67
+ if (first === undefined || HELP_FLAGS.has(first)) {
68
+ return { kind: "help" };
69
+ }
70
+ if (first === "--version") {
71
+ return { kind: "version" };
72
+ }
73
+ const group = (0, registry_1.findGroup)(registry, first);
74
+ if (!group) {
75
+ return { kind: "error", message: `unknown command: ${first}` };
76
+ }
77
+ // A runnable leaf group (e.g. `init`) with no subcommand runs directly.
78
+ if (second === undefined && group.run) {
79
+ return {
80
+ kind: "run",
81
+ group,
82
+ command: { name: group.name, summary: group.summary, run: group.run },
83
+ args: [],
84
+ };
85
+ }
86
+ if (second === undefined || HELP_FLAGS.has(second)) {
87
+ return { kind: "help", group };
88
+ }
89
+ const command = (0, registry_1.findCommand)(group, second);
90
+ if (!command) {
91
+ return {
92
+ kind: "error",
93
+ message: `unknown command: ${group.name} ${second}`,
94
+ };
95
+ }
96
+ return { kind: "run", group, command, args: rest };
97
+ }
98
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/lib/cli/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function readPackageVersion(fromDir: string): string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/lib/cli/version.ts"],"names":[],"mappings":"AAOA,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgB1D"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.readPackageVersion = readPackageVersion;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ // Walks up from `fromDir` to the nearest package.json and returns its version.
40
+ // Works both when running compiled (dist/envctl.js → repo root) and under
41
+ // Vitest (src/lib/cli → repo root), since neither layout has an intervening
42
+ // package.json. Throws a plain Error if none is found.
43
+ function readPackageVersion(fromDir) {
44
+ let dir = fromDir;
45
+ for (;;) {
46
+ const pkgPath = path.join(dir, "package.json");
47
+ if (fs.existsSync(pkgPath)) {
48
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
49
+ return pkg.version ?? "0.0.0";
50
+ }
51
+ const parent = path.dirname(dir);
52
+ if (parent === dir) {
53
+ throw new Error(`package.json not found above ${fromDir}`);
54
+ }
55
+ dir = parent;
56
+ }
57
+ }
58
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/lib/cli/version.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,gDAgBC;AAvBD,uCAAyB;AACzB,2CAA6B;AAE7B,+EAA+E;AAC/E,0EAA0E;AAC1E,4EAA4E;AAC5E,uDAAuD;AACvD,SAAgB,kBAAkB,CAAC,OAAe;IAChD,IAAI,GAAG,GAAG,OAAO,CAAC;IAClB,SAAS,CAAC;QACR,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAEvD,CAAC;YACF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;QAChC,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runAuthStatus(): void;
2
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/lib/commands/auth.ts"],"names":[],"mappings":"AAiBA,wBAAgB,aAAa,IAAI,IAAI,CA0BpC"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runAuthStatus = runAuthStatus;
4
+ const auth_1 = require("../auth");
5
+ const logger_1 = require("../logger");
6
+ // `envctl auth status` — read-only report of each provider's credential state
7
+ // and source. envctl stores nothing itself; writing credentials is delegated to
8
+ // the providers' own CLIs (vercel login / gcloud auth login / sentry-cli login).
9
+ function runAuthStatus() {
10
+ const reports = [
11
+ {
12
+ name: "vercel",
13
+ state: (0, auth_1.vercelAuthState)(),
14
+ hint: "set VERCEL_TOKEN or run `vercel login`",
15
+ },
16
+ {
17
+ name: "gcp",
18
+ state: (0, auth_1.gcpAuthState)(),
19
+ hint: "install the gcloud CLI and run `gcloud auth login`",
20
+ },
21
+ {
22
+ name: "sentry",
23
+ state: (0, auth_1.sentryAuthState)(),
24
+ hint: "set SENTRY_AUTH_TOKEN or run `sentry-cli login`",
25
+ },
26
+ ];
27
+ for (const { name, state, hint } of reports) {
28
+ (0, logger_1.log)(state.authenticated
29
+ ? `${name.padEnd(7)} authenticated (${state.source})`
30
+ : `${name.padEnd(7)} not authenticated — ${hint}`);
31
+ }
32
+ }
33
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/lib/commands/auth.ts"],"names":[],"mappings":";;AAiBA,sCA0BC;AA3CD,kCAKiB;AACjB,sCAAgC;AAQhC,8EAA8E;AAC9E,gFAAgF;AAChF,iFAAiF;AACjF,SAAgB,aAAa;IAC3B,MAAM,OAAO,GAAqB;QAChC;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAA,sBAAe,GAAE;YACxB,IAAI,EAAE,wCAAwC;SAC/C;QACD;YACE,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,IAAA,mBAAY,GAAE;YACrB,IAAI,EAAE,oDAAoD;SAC3D;QACD;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAA,sBAAe,GAAE;YACxB,IAAI,EAAE,iDAAiD;SACxD;KACF,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QAC5C,IAAA,YAAG,EACD,KAAK,CAAC,aAAa;YACjB,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,KAAK,CAAC,MAAM,GAAG;YACrD,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,wBAAwB,IAAI,EAAE,CACpD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface BootstrapOptions {
2
+ targetEnv: string;
3
+ workingDir: string;
4
+ deploymentDir: string;
5
+ dryRun: boolean;
6
+ pull: boolean;
7
+ out: string;
8
+ }
9
+ export declare const BOOTSTRAP_USAGE = "Usage: envctl bootstrap [OPTIONS]\n\nConfigure a project end to end in one pass: push public environment variables,\ninitialize any provider secrets that are not yet present, then materialize a\nlocal dotenv file for development. Idempotent \u2014 safe to re-run: public vars are\nupserted, and a secret that already exists is left in place (use\n'envctl secrets rotate' to rotate it) rather than re-initialized.\n\nPreconditions: a linked Vercel project (.vercel/project.json, from\n'vercel link'), the Vercel CLI on PATH, an authenticated gcloud for Firebase,\nand a Sentry token for Sentry. Run 'envctl auth status' to check.\n\nOPTIONS:\n --env <name|all> Environment(s) for the public-config and secrets\n phases (default: all)\n --deployment-dir <path> Path to the deployment config directory, resolved\n against the project root (default: deployment)\n --out <path> Dotenv file the pull phase writes, resolved against\n the project root (default: .env.local)\n --no-pull Skip the local dotenv pull phase\n --dry-run Print the plan for every phase without making changes\n -h, --help Show this help";
10
+ export declare function parseBootstrapArgs(args: string[], workingDir: string): BootstrapOptions;
11
+ //# sourceMappingURL=bootstrap-args.d.ts.map