@clef-sh/cli 0.1.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 (86) hide show
  1. package/bin/clef.js +2 -0
  2. package/dist/commands/delete.d.ts +6 -0
  3. package/dist/commands/delete.d.ts.map +1 -0
  4. package/dist/commands/delete.js +130 -0
  5. package/dist/commands/delete.js.map +1 -0
  6. package/dist/commands/diff.d.ts +6 -0
  7. package/dist/commands/diff.d.ts.map +1 -0
  8. package/dist/commands/diff.js +168 -0
  9. package/dist/commands/diff.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +6 -0
  11. package/dist/commands/doctor.d.ts.map +1 -0
  12. package/dist/commands/doctor.js +331 -0
  13. package/dist/commands/doctor.js.map +1 -0
  14. package/dist/commands/exec.d.ts +6 -0
  15. package/dist/commands/exec.d.ts.map +1 -0
  16. package/dist/commands/exec.js +187 -0
  17. package/dist/commands/exec.js.map +1 -0
  18. package/dist/commands/export.d.ts +6 -0
  19. package/dist/commands/export.d.ts.map +1 -0
  20. package/dist/commands/export.js +110 -0
  21. package/dist/commands/export.js.map +1 -0
  22. package/dist/commands/get.d.ts +6 -0
  23. package/dist/commands/get.d.ts.map +1 -0
  24. package/dist/commands/get.js +85 -0
  25. package/dist/commands/get.js.map +1 -0
  26. package/dist/commands/hooks.d.ts +6 -0
  27. package/dist/commands/hooks.d.ts.map +1 -0
  28. package/dist/commands/hooks.js +89 -0
  29. package/dist/commands/hooks.js.map +1 -0
  30. package/dist/commands/import.d.ts +6 -0
  31. package/dist/commands/import.d.ts.map +1 -0
  32. package/dist/commands/import.js +210 -0
  33. package/dist/commands/import.js.map +1 -0
  34. package/dist/commands/init.d.ts +11 -0
  35. package/dist/commands/init.d.ts.map +1 -0
  36. package/dist/commands/init.js +499 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/lint.d.ts +6 -0
  39. package/dist/commands/lint.d.ts.map +1 -0
  40. package/dist/commands/lint.js +152 -0
  41. package/dist/commands/lint.js.map +1 -0
  42. package/dist/commands/merge-driver.d.ts +6 -0
  43. package/dist/commands/merge-driver.d.ts.map +1 -0
  44. package/dist/commands/merge-driver.js +152 -0
  45. package/dist/commands/merge-driver.js.map +1 -0
  46. package/dist/commands/recipients.d.ts +7 -0
  47. package/dist/commands/recipients.d.ts.map +1 -0
  48. package/dist/commands/recipients.js +316 -0
  49. package/dist/commands/recipients.js.map +1 -0
  50. package/dist/commands/rotate.d.ts +6 -0
  51. package/dist/commands/rotate.d.ts.map +1 -0
  52. package/dist/commands/rotate.js +97 -0
  53. package/dist/commands/rotate.js.map +1 -0
  54. package/dist/commands/scan.d.ts +6 -0
  55. package/dist/commands/scan.d.ts.map +1 -0
  56. package/dist/commands/scan.js +152 -0
  57. package/dist/commands/scan.js.map +1 -0
  58. package/dist/commands/set.d.ts +6 -0
  59. package/dist/commands/set.d.ts.map +1 -0
  60. package/dist/commands/set.js +137 -0
  61. package/dist/commands/set.js.map +1 -0
  62. package/dist/commands/ui.d.ts +7 -0
  63. package/dist/commands/ui.d.ts.map +1 -0
  64. package/dist/commands/ui.js +100 -0
  65. package/dist/commands/ui.js.map +1 -0
  66. package/dist/commands/update.d.ts +6 -0
  67. package/dist/commands/update.d.ts.map +1 -0
  68. package/dist/commands/update.js +119 -0
  69. package/dist/commands/update.js.map +1 -0
  70. package/dist/index.d.ts +2 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +121 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/output/formatter.d.ts +20 -0
  75. package/dist/output/formatter.d.ts.map +1 -0
  76. package/dist/output/formatter.js +191 -0
  77. package/dist/output/formatter.js.map +1 -0
  78. package/dist/output/symbols.d.ts +21 -0
  79. package/dist/output/symbols.d.ts.map +1 -0
  80. package/dist/output/symbols.js +59 -0
  81. package/dist/output/symbols.js.map +1 -0
  82. package/dist/subprocess.d.ts +5 -0
  83. package/dist/subprocess.d.ts.map +1 -0
  84. package/dist/subprocess.js +27 -0
  85. package/dist/subprocess.js.map +1 -0
  86. package/package.json +40 -0
@@ -0,0 +1,331 @@
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.registerDoctorCommand = registerDoctorCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const YAML = __importStar(require("yaml"));
40
+ const core_1 = require("@clef-sh/core");
41
+ const formatter_1 = require("../output/formatter");
42
+ const symbols_1 = require("../output/symbols");
43
+ const init_1 = require("./init");
44
+ function registerDoctorCommand(program, deps) {
45
+ program
46
+ .command("doctor")
47
+ .description("Check your environment for required dependencies and configuration.\n\n" +
48
+ "Exit codes:\n" +
49
+ " 0 All checks pass\n" +
50
+ " 1 One or more checks failed")
51
+ .option("--json", "Output the full status as JSON")
52
+ .option("--fix", "Attempt to auto-fix issues (runs clef init if .sops.yaml is the only failure)")
53
+ .action(async (options) => {
54
+ const repoRoot = program.opts().repo || process.cwd();
55
+ const clefVersion = program.version() ?? "unknown";
56
+ const checks = [];
57
+ const depStatus = await (0, core_1.checkAll)(deps.runner);
58
+ // 1. Clef version (always passes)
59
+ checks.push({
60
+ name: "clef",
61
+ ok: true,
62
+ detail: `v${clefVersion}`,
63
+ });
64
+ // 2. sops
65
+ if (depStatus.sops) {
66
+ checks.push({
67
+ name: "sops",
68
+ ok: depStatus.sops.satisfied,
69
+ detail: depStatus.sops.satisfied
70
+ ? `v${depStatus.sops.installed} (required >= ${depStatus.sops.required})`
71
+ : `v${depStatus.sops.installed} (required >= ${depStatus.sops.required})`,
72
+ hint: depStatus.sops.satisfied ? undefined : depStatus.sops.installHint,
73
+ });
74
+ }
75
+ else {
76
+ checks.push({
77
+ name: "sops",
78
+ ok: false,
79
+ detail: "not installed",
80
+ hint: getSopsInstallHint(),
81
+ });
82
+ }
83
+ // 3. git
84
+ if (depStatus.git) {
85
+ checks.push({
86
+ name: "git",
87
+ ok: depStatus.git.satisfied,
88
+ detail: depStatus.git.satisfied
89
+ ? `v${depStatus.git.installed} (required >= ${depStatus.git.required})`
90
+ : `v${depStatus.git.installed} (required >= ${depStatus.git.required})`,
91
+ hint: depStatus.git.satisfied ? undefined : depStatus.git.installHint,
92
+ });
93
+ }
94
+ else {
95
+ checks.push({
96
+ name: "git",
97
+ ok: false,
98
+ detail: "not installed",
99
+ hint: "see https://git-scm.com/downloads",
100
+ });
101
+ }
102
+ // 5. manifest
103
+ const manifestPath = path.join(repoRoot, "clef.yaml");
104
+ const manifestFound = fs.existsSync(manifestPath);
105
+ checks.push({
106
+ name: "manifest",
107
+ ok: manifestFound,
108
+ detail: manifestFound ? "clef.yaml found" : "clef.yaml not found",
109
+ hint: manifestFound ? undefined : "run: clef init",
110
+ });
111
+ // 6. age key
112
+ const ageKeyResult = checkAgeKey(repoRoot);
113
+ checks.push(ageKeyResult);
114
+ // 7. .sops.yaml
115
+ const sopsYamlPath = path.join(repoRoot, ".sops.yaml");
116
+ const sopsYamlFound = fs.existsSync(sopsYamlPath);
117
+ checks.push({
118
+ name: ".sops.yaml",
119
+ ok: sopsYamlFound,
120
+ detail: sopsYamlFound ? "found" : "not found",
121
+ hint: sopsYamlFound ? undefined : "run: clef init",
122
+ });
123
+ // 8. .clefignore
124
+ const clefignorePath = path.join(repoRoot, ".clefignore");
125
+ const clefignoreFound = fs.existsSync(clefignorePath);
126
+ let clefignoreRuleCount = 0;
127
+ if (clefignoreFound) {
128
+ try {
129
+ const content = fs.readFileSync(clefignorePath, "utf-8");
130
+ clefignoreRuleCount = content
131
+ .split("\n")
132
+ .filter((l) => l.trim() && !l.trim().startsWith("#") && !l.trim().startsWith("ignore-pattern:")).length;
133
+ }
134
+ catch {
135
+ // unreadable — count stays 0
136
+ }
137
+ }
138
+ checks.push({
139
+ name: "scanner",
140
+ ok: clefignoreFound,
141
+ detail: clefignoreFound
142
+ ? `.clefignore found (${clefignoreRuleCount} rules)`
143
+ : "no .clefignore found",
144
+ hint: clefignoreFound
145
+ ? undefined
146
+ : "run clef init or create manually — see https://docs.clef.sh/cli/scan#clefignore",
147
+ });
148
+ // 9. merge driver
149
+ const git = new core_1.GitIntegration(deps.runner);
150
+ const mergeDriverStatus = await git.checkMergeDriver(repoRoot);
151
+ const mergeDriverOk = mergeDriverStatus.gitConfig && mergeDriverStatus.gitattributes;
152
+ const mergeDriverDetails = [];
153
+ if (!mergeDriverStatus.gitConfig)
154
+ mergeDriverDetails.push("git config missing");
155
+ if (!mergeDriverStatus.gitattributes)
156
+ mergeDriverDetails.push(".gitattributes missing");
157
+ checks.push({
158
+ name: "merge driver",
159
+ ok: mergeDriverOk,
160
+ detail: mergeDriverOk ? "SOPS merge driver configured" : mergeDriverDetails.join(", "),
161
+ hint: mergeDriverOk ? undefined : "run: clef hooks install",
162
+ });
163
+ // --fix: if the only failure is .sops.yaml missing, run clef init
164
+ if (options.fix) {
165
+ const failures = checks.filter((c) => !c.ok);
166
+ const onlySopsYamlMissing = failures.length === 1 && failures[0].name === ".sops.yaml" && !sopsYamlFound;
167
+ if (onlySopsYamlMissing) {
168
+ formatter_1.formatter.info("Attempting to fix: generating .sops.yaml from manifest...");
169
+ try {
170
+ (0, init_1.scaffoldSopsConfig)(repoRoot);
171
+ const nowFound = fs.existsSync(sopsYamlPath);
172
+ if (nowFound) {
173
+ const sopsYamlCheck = checks.find((c) => c.name === ".sops.yaml");
174
+ if (sopsYamlCheck) {
175
+ sopsYamlCheck.ok = true;
176
+ sopsYamlCheck.detail = "found (fixed)";
177
+ delete sopsYamlCheck.hint;
178
+ }
179
+ formatter_1.formatter.success(".sops.yaml created from manifest.");
180
+ }
181
+ }
182
+ catch {
183
+ formatter_1.formatter.error("Failed to generate .sops.yaml. Run 'clef init' manually to diagnose.");
184
+ }
185
+ }
186
+ else if (failures.length > 0) {
187
+ formatter_1.formatter.warn("--fix cannot resolve these issues automatically.");
188
+ }
189
+ }
190
+ // JSON output
191
+ if (options.json) {
192
+ const json = {
193
+ clef: { version: clefVersion, ok: true },
194
+ sops: {
195
+ version: depStatus.sops?.installed ?? null,
196
+ required: core_1.REQUIREMENTS.sops,
197
+ ok: depStatus.sops?.satisfied ?? false,
198
+ },
199
+ git: {
200
+ version: depStatus.git?.installed ?? null,
201
+ required: core_1.REQUIREMENTS.git,
202
+ ok: depStatus.git?.satisfied ?? false,
203
+ },
204
+ manifest: { found: manifestFound, ok: manifestFound },
205
+ ageKey: {
206
+ source: ageKeyResult.ok ? (process.env.SOPS_AGE_KEY ? "env" : "file") : null,
207
+ recipients: countAgeRecipients(sopsYamlPath),
208
+ ok: ageKeyResult.ok,
209
+ },
210
+ sopsYaml: {
211
+ found: checks.find((c) => c.name === ".sops.yaml").ok,
212
+ ok: checks.find((c) => c.name === ".sops.yaml").ok,
213
+ ...(!checks.find((c) => c.name === ".sops.yaml").ok ? { fix: "clef init" } : {}),
214
+ },
215
+ scanner: {
216
+ clefignoreFound: checks.find((c) => c.name === "scanner")?.ok ?? false,
217
+ ok: checks.find((c) => c.name === "scanner")?.ok ?? false,
218
+ },
219
+ mergeDriver: {
220
+ gitConfig: mergeDriverStatus.gitConfig,
221
+ gitattributes: mergeDriverStatus.gitattributes,
222
+ ok: mergeDriverOk,
223
+ },
224
+ };
225
+ formatter_1.formatter.raw(JSON.stringify(json, null, 2) + "\n");
226
+ const hasFailures = checks.some((c) => !c.ok);
227
+ process.exit(hasFailures ? 1 : 0);
228
+ return;
229
+ }
230
+ // Pretty output
231
+ formatter_1.formatter.print("\nDiagnosing...\n");
232
+ const nameWidth = Math.max(...checks.map((c) => c.name.length));
233
+ for (const check of checks) {
234
+ const icon = check.ok ? (0, symbols_1.sym)("success") : (0, symbols_1.sym)("failure");
235
+ const name = check.name.padEnd(nameWidth);
236
+ formatter_1.formatter.print(`${icon} ${name} ${check.detail}`);
237
+ if (check.hint) {
238
+ formatter_1.formatter.hint(check.hint);
239
+ }
240
+ }
241
+ formatter_1.formatter.print("");
242
+ const failures = checks.filter((c) => !c.ok);
243
+ if (failures.length === 0) {
244
+ formatter_1.formatter.success("Everything looks good.");
245
+ }
246
+ else {
247
+ formatter_1.formatter.error(`${failures.length} issue${failures.length > 1 ? "s" : ""} found.`);
248
+ }
249
+ formatter_1.formatter.hint("clef scan \u2014 check for plaintext secrets");
250
+ process.exit(failures.length > 0 ? 1 : 0);
251
+ });
252
+ }
253
+ function checkAgeKey(repoRoot) {
254
+ // Check SOPS_AGE_KEY env var first
255
+ if (process.env.SOPS_AGE_KEY) {
256
+ return {
257
+ name: "age key",
258
+ ok: true,
259
+ detail: "loaded (via SOPS_AGE_KEY env var)",
260
+ };
261
+ }
262
+ // Check SOPS_AGE_KEY_FILE or default path
263
+ const defaultKeyPath = path.join(process.env.HOME || process.env.USERPROFILE || "", ".config", "sops", "age", "keys.txt");
264
+ const sopsAgeKeyFile = process.env.SOPS_AGE_KEY_FILE || defaultKeyPath;
265
+ if (fs.existsSync(sopsAgeKeyFile)) {
266
+ return {
267
+ name: "age key",
268
+ ok: true,
269
+ detail: `loaded (from ${sopsAgeKeyFile})`,
270
+ };
271
+ }
272
+ // Check .clef/config.yaml age_key_file
273
+ const clefConfigPath = path.join(repoRoot, ".clef", "config.yaml");
274
+ if (fs.existsSync(clefConfigPath)) {
275
+ try {
276
+ const configContent = fs.readFileSync(clefConfigPath, "utf-8");
277
+ const config = YAML.parse(configContent);
278
+ if (config?.age_key_file) {
279
+ if (fs.existsSync(config.age_key_file)) {
280
+ return {
281
+ name: "age key",
282
+ ok: true,
283
+ detail: `loaded (from ${config.age_key_file})`,
284
+ };
285
+ }
286
+ }
287
+ }
288
+ catch {
289
+ // Failed to parse config — fall through
290
+ }
291
+ }
292
+ return {
293
+ name: "age key",
294
+ ok: false,
295
+ detail: "not configured",
296
+ hint: "set SOPS_AGE_KEY_FILE or run: clef init to auto-generate your age key",
297
+ };
298
+ }
299
+ function countAgeRecipients(sopsYamlPath) {
300
+ try {
301
+ if (!fs.existsSync(sopsYamlPath))
302
+ return 0;
303
+ const content = fs.readFileSync(sopsYamlPath, "utf-8");
304
+ const config = YAML.parse(content);
305
+ if (!config?.creation_rules || !Array.isArray(config.creation_rules)) {
306
+ return 0;
307
+ }
308
+ const recipients = new Set();
309
+ for (const rule of config.creation_rules) {
310
+ if (typeof rule.age === "string") {
311
+ // age field may contain comma-separated recipients
312
+ for (const r of rule.age.split(",")) {
313
+ const trimmed = r.trim();
314
+ if (trimmed) {
315
+ recipients.add(trimmed);
316
+ }
317
+ }
318
+ }
319
+ }
320
+ return recipients.size;
321
+ }
322
+ catch {
323
+ return 0;
324
+ }
325
+ }
326
+ function getSopsInstallHint() {
327
+ if (process.platform === "darwin")
328
+ return "brew install sops";
329
+ return "see https://github.com/getsops/sops/releases";
330
+ }
331
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ import { SubprocessRunner } from "@clef-sh/core";
3
+ export declare function registerExecCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAML,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAOvB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAgI9F"}
@@ -0,0 +1,187 @@
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.registerExecCommand = registerExecCommand;
37
+ const path = __importStar(require("path"));
38
+ const child_process_1 = require("child_process");
39
+ const core_1 = require("@clef-sh/core");
40
+ const formatter_1 = require("../output/formatter");
41
+ function collect(value, previous) {
42
+ return previous.concat([value]);
43
+ }
44
+ function registerExecCommand(program, deps) {
45
+ program
46
+ .command("exec <target>")
47
+ .description("Run a command with decrypted secrets injected as environment variables.\n\n" +
48
+ " target: namespace/environment (e.g. payments/production)\n\n" +
49
+ "Everything after -- is the command to run:\n" +
50
+ " clef exec payments/production -- node server.js\n\n" +
51
+ "Exit codes:\n" +
52
+ " The exit code matches the child process exactly.\n" +
53
+ " 1 if Clef itself fails (decryption error, bad arguments)")
54
+ .option("--only <keys>", "Comma-separated list of keys to inject (ignores all others)")
55
+ .option("--prefix <string>", "Prefix all injected key names (e.g. --prefix APP_)")
56
+ .option("--no-override", "Do not override existing environment variables")
57
+ .option("--also <target>", "Also inject secrets from another namespace/environment (repeatable)", collect, [])
58
+ .allowUnknownOption(true)
59
+ .action(async (target, options) => {
60
+ try {
61
+ // Parse everything after -- as the child command
62
+ const dashIndex = process.argv.indexOf("--");
63
+ if (dashIndex === -1) {
64
+ formatter_1.formatter.error("Missing command to execute. Use -- to separate the command:\n\n" +
65
+ " clef exec payments/production -- node server.js\n\n" +
66
+ "The -- separator is required to distinguish Clef flags from the child command.");
67
+ process.exit(1);
68
+ return;
69
+ }
70
+ const childArgs = process.argv.slice(dashIndex + 1);
71
+ if (childArgs.length === 0) {
72
+ formatter_1.formatter.error("Missing command to execute after --.\n\n" +
73
+ " clef exec payments/production -- node server.js");
74
+ process.exit(1);
75
+ return;
76
+ }
77
+ const [namespace, environment] = parseTarget(target);
78
+ const repoRoot = program.opts().repo || process.cwd();
79
+ const parser = new core_1.ManifestParser();
80
+ const manifest = parser.parse(path.join(repoRoot, "clef.yaml"));
81
+ // Warn on protected environments (but do not block)
82
+ const envDef = manifest.environments.find((e) => e.name === environment);
83
+ if (envDef?.protected) {
84
+ formatter_1.formatter.warn(`Executing in protected environment '${environment}'.`);
85
+ }
86
+ const sopsClient = new core_1.SopsClient(deps.runner);
87
+ // Decrypt primary target
88
+ const primaryFilePath = path.join(repoRoot, manifest.file_pattern
89
+ .replace("{namespace}", namespace)
90
+ .replace("{environment}", environment));
91
+ const primaryDecrypted = await sopsClient.decrypt(primaryFilePath);
92
+ // Merge values: primary first, then --also targets in order (later overrides earlier)
93
+ let mergedValues = { ...primaryDecrypted.values };
94
+ for (const alsoTarget of options.also) {
95
+ try {
96
+ const [alsoNs, alsoEnv] = parseTarget(alsoTarget);
97
+ const alsoFilePath = path.join(repoRoot, manifest.file_pattern
98
+ .replace("{namespace}", alsoNs)
99
+ .replace("{environment}", alsoEnv));
100
+ const alsoDecrypted = await sopsClient.decrypt(alsoFilePath);
101
+ mergedValues = { ...mergedValues, ...alsoDecrypted.values };
102
+ }
103
+ catch (err) {
104
+ throw new Error(`Failed to decrypt --also '${alsoTarget}': ${err.message}`);
105
+ }
106
+ }
107
+ const consumption = new core_1.ConsumptionClient();
108
+ const execOptions = {
109
+ only: options.only ? options.only.split(",").map((k) => k.trim()) : undefined,
110
+ prefix: options.prefix,
111
+ noOverride: !options.override,
112
+ };
113
+ const childEnv = consumption.prepareEnvironment({ values: mergedValues, metadata: primaryDecrypted.metadata }, process.env, execOptions);
114
+ // Spawn child process with inherited stdio — values injected via env, never via shell
115
+ const childCommand = childArgs[0];
116
+ const childCommandArgs = childArgs.slice(1);
117
+ const exitCode = await spawnChild(childCommand, childCommandArgs, childEnv);
118
+ process.exit(exitCode);
119
+ }
120
+ catch (err) {
121
+ if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
122
+ formatter_1.formatter.formatDependencyError(err);
123
+ process.exit(1);
124
+ return;
125
+ }
126
+ // Never leak decrypted values in error messages
127
+ const message = err instanceof Error ? err.message : "Execution failed";
128
+ formatter_1.formatter.error(message);
129
+ process.exit(1);
130
+ }
131
+ });
132
+ }
133
+ function spawnChild(command, args, env) {
134
+ return new Promise((resolve) => {
135
+ let child;
136
+ try {
137
+ child = (0, child_process_1.spawn)(command, args, {
138
+ env,
139
+ stdio: "inherit",
140
+ });
141
+ }
142
+ catch {
143
+ formatter_1.formatter.error(`Failed to start command '${command}'. Ensure it exists and is executable.`);
144
+ resolve(1);
145
+ return;
146
+ }
147
+ child.on("error", () => {
148
+ formatter_1.formatter.error(`Failed to start command '${command}'. Ensure it exists and is executable.`);
149
+ resolve(1);
150
+ });
151
+ child.on("exit", (code, signal) => {
152
+ // Clean up signal handlers
153
+ process.off("SIGTERM", sigtermHandler);
154
+ process.off("SIGINT", sigintHandler);
155
+ if (signal) {
156
+ // Process was killed by a signal — map to conventional exit code
157
+ const signalCodes = {
158
+ SIGHUP: 129,
159
+ SIGINT: 130,
160
+ SIGTERM: 143,
161
+ };
162
+ resolve(signalCodes[signal] ?? 128);
163
+ }
164
+ else {
165
+ resolve(code ?? 1);
166
+ }
167
+ });
168
+ // Forward signals to child with SIGKILL fallback
169
+ const sigtermHandler = () => {
170
+ child.kill("SIGTERM");
171
+ // Give child 5s to clean up, then force kill
172
+ /* istanbul ignore next -- timer callback only fires if child hangs; not testable without real timers */
173
+ setTimeout(() => child.kill("SIGKILL"), 5000).unref();
174
+ };
175
+ const sigintHandler = () => child.kill("SIGINT");
176
+ process.on("SIGTERM", sigtermHandler);
177
+ process.on("SIGINT", sigintHandler);
178
+ });
179
+ }
180
+ function parseTarget(target) {
181
+ const parts = target.split("/");
182
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
183
+ throw new Error(`Invalid target "${target}". Expected format: namespace/environment`);
184
+ }
185
+ return [parts[0], parts[1]];
186
+ }
187
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,kDAgIC;AAjJD,2CAA6B;AAC7B,iDAAoD;AAEpD,wCAOuB;AACvB,mDAAgD;AAEhD,SAAS,OAAO,CAAC,KAAa,EAAE,QAAkB;IAChD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB,EAAE,IAAkC;IACtF,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CACV,6EAA6E;QAC3E,gEAAgE;QAChE,8CAA8C;QAC9C,uDAAuD;QACvD,eAAe;QACf,sDAAsD;QACtD,6DAA6D,CAChE;SACA,MAAM,CAAC,eAAe,EAAE,6DAA6D,CAAC;SACtF,MAAM,CAAC,mBAAmB,EAAE,oDAAoD,CAAC;SACjF,MAAM,CAAC,eAAe,EAAE,gDAAgD,CAAC;SACzE,MAAM,CACL,iBAAiB,EACjB,qEAAqE,EACrE,OAAO,EACP,EAAE,CACH;SACA,kBAAkB,CAAC,IAAI,CAAC;SACxB,MAAM,CACL,KAAK,EACH,MAAc,EACd,OAA8E,EAC9E,EAAE;QACF,IAAI,CAAC;YACH,iDAAiD;YACjD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAE7C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;gBACrB,qBAAS,CAAC,KAAK,CACb,iEAAiE;oBAC/D,uDAAuD;oBACvD,gFAAgF,CACnF,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YAEpD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,qBAAS,CAAC,KAAK,CACb,0CAA0C;oBACxC,mDAAmD,CACtD,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAI,OAAO,CAAC,IAAI,EAAE,CAAC,IAAe,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAElE,MAAM,MAAM,GAAG,IAAI,qBAAc,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;YAEhE,oDAAoD;YACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;YACzE,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;gBACtB,qBAAS,CAAC,IAAI,CAAC,uCAAuC,WAAW,IAAI,CAAC,CAAC;YACzE,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,iBAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE/C,yBAAyB;YACzB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,QAAQ,EACR,QAAQ,CAAC,YAAY;iBAClB,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC;iBACjC,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC,CACzC,CAAC;YACF,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAEnE,sFAAsF;YACtF,IAAI,YAAY,GAAG,EAAE,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAElD,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACH,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;oBAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,QAAQ,EACR,QAAQ,CAAC,YAAY;yBAClB,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC;yBAC9B,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CACrC,CAAC;oBACF,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;oBAC7D,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;gBAC9D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CACb,6BAA6B,UAAU,MAAO,GAAa,CAAC,OAAO,EAAE,CACtE,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,wBAAiB,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7E,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;aAC9B,CAAC;YAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,kBAAkB,CAC7C,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EAAE,EAC7D,OAAO,CAAC,GAAyC,EACjD,WAAW,CACZ,CAAC;YAEF,sFAAsF;YACtF,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAE5C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,uBAAgB,IAAI,GAAG,YAAY,uBAAgB,EAAE,CAAC;gBACvE,qBAAS,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,gDAAgD;YAChD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;YACxE,qBAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,IAAc,EAAE,GAA2B;IAC9E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,KAAmB,CAAC;QAExB,IAAI,CAAC;YACH,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,EAAE,IAAI,EAAE;gBAC3B,GAAG;gBACH,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,qBAAS,CAAC,KAAK,CAAC,4BAA4B,OAAO,wCAAwC,CAAC,CAAC;YAC7F,OAAO,CAAC,CAAC,CAAC,CAAC;YACX,OAAO;QACT,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,qBAAS,CAAC,KAAK,CAAC,4BAA4B,OAAO,wCAAwC,CAAC,CAAC;YAC7F,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAChC,2BAA2B;YAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAErC,IAAI,MAAM,EAAE,CAAC;gBACX,iEAAiE;gBACjE,MAAM,WAAW,GAA2B;oBAC1C,MAAM,EAAE,GAAG;oBACX,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,GAAG;iBACb,CAAC;gBACF,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,iDAAiD;QACjD,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,6CAA6C;YAC7C,wGAAwG;YACxG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACxD,CAAC,CAAC;QACF,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACtC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,2CAA2C,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ import { SubprocessRunner } from "@clef-sh/core";
3
+ export declare function registerExportCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAML,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAgFhG"}