@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,110 @@
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.registerExportCommand = registerExportCommand;
37
+ const path = __importStar(require("path"));
38
+ const core_1 = require("@clef-sh/core");
39
+ const formatter_1 = require("../output/formatter");
40
+ function registerExportCommand(program, deps) {
41
+ program
42
+ .command("export <target>")
43
+ .description("Print decrypted secrets as shell export statements to stdout.\n\n" +
44
+ " target: namespace/environment (e.g. payments/production)\n\n" +
45
+ "Usage:\n" +
46
+ " eval $(clef export payments/production --format env)\n\n" +
47
+ "Exit codes:\n" +
48
+ " 0 Values printed successfully\n" +
49
+ " 1 Decryption error or invalid arguments")
50
+ .option("--format <format>", "Output format (only 'env' is supported)", "env")
51
+ .option("--no-export", "Omit the 'export' keyword — output bare KEY=value pairs")
52
+ .action(async (target, options) => {
53
+ try {
54
+ // Reject unsupported formats with a clear explanation
55
+ if (options.format !== "env") {
56
+ if (options.format === "dotenv" ||
57
+ options.format === "json" ||
58
+ options.format === "yaml") {
59
+ formatter_1.formatter.error(`Format '${options.format}' is not supported. ` +
60
+ "Clef does not support output formats that encourage writing plaintext secrets to disk.\n\n" +
61
+ "Use one of these patterns instead:\n" +
62
+ " clef exec payments/production -- node server.js (recommended — injects secrets via env)\n" +
63
+ " eval $(clef export payments/production --format env) (shell eval pattern)");
64
+ }
65
+ else {
66
+ formatter_1.formatter.error(`Unknown format '${options.format}'. Only 'env' is supported.\n\n` +
67
+ "Usage: clef export payments/production --format env");
68
+ }
69
+ process.exit(1);
70
+ return;
71
+ }
72
+ const [namespace, environment] = parseTarget(target);
73
+ const repoRoot = program.opts().repo || process.cwd();
74
+ const parser = new core_1.ManifestParser();
75
+ const manifest = parser.parse(path.join(repoRoot, "clef.yaml"));
76
+ const filePath = path.join(repoRoot, manifest.file_pattern
77
+ .replace("{namespace}", namespace)
78
+ .replace("{environment}", environment));
79
+ const sopsClient = new core_1.SopsClient(deps.runner);
80
+ const decrypted = await sopsClient.decrypt(filePath);
81
+ const consumption = new core_1.ConsumptionClient();
82
+ const output = consumption.formatExport(decrypted, "env", !options.export);
83
+ // Warn on Linux about /proc visibility
84
+ if (process.platform === "linux") {
85
+ formatter_1.formatter.warn("Exported values will be visible in /proc/<pid>/environ to processes with ptrace access. Use clef exec when possible.");
86
+ }
87
+ // Raw output — no labels, no colour
88
+ formatter_1.formatter.raw(output);
89
+ }
90
+ catch (err) {
91
+ if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
92
+ formatter_1.formatter.formatDependencyError(err);
93
+ process.exit(1);
94
+ return;
95
+ }
96
+ // Never leak decrypted values in error messages
97
+ const message = err instanceof Error ? err.message : "Export failed";
98
+ formatter_1.formatter.error(message);
99
+ process.exit(1);
100
+ }
101
+ });
102
+ }
103
+ function parseTarget(target) {
104
+ const parts = target.split("/");
105
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
106
+ throw new Error(`Invalid target "${target}". Expected format: namespace/environment`);
107
+ }
108
+ return [parts[0], parts[1]];
109
+ }
110
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.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 registerGetCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAKL,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAgD7F"}
@@ -0,0 +1,85 @@
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.registerGetCommand = registerGetCommand;
37
+ const path = __importStar(require("path"));
38
+ const core_1 = require("@clef-sh/core");
39
+ const formatter_1 = require("../output/formatter");
40
+ function registerGetCommand(program, deps) {
41
+ program
42
+ .command("get <target> <key>")
43
+ .description("Get a single decrypted value. Output is raw (no labels, no colour) for piping.\n\n" +
44
+ " target: namespace/environment (e.g. payments/production)\n" +
45
+ " key: the key name to retrieve\n\n" +
46
+ "Exit codes:\n" +
47
+ " 0 Value found and printed\n" +
48
+ " 1 Key not found or decryption error")
49
+ .action(async (target, key) => {
50
+ try {
51
+ const [namespace, environment] = parseTarget(target);
52
+ const repoRoot = program.opts().repo || process.cwd();
53
+ const parser = new core_1.ManifestParser();
54
+ const manifest = parser.parse(path.join(repoRoot, "clef.yaml"));
55
+ const filePath = path.join(repoRoot, manifest.file_pattern
56
+ .replace("{namespace}", namespace)
57
+ .replace("{environment}", environment));
58
+ const sopsClient = new core_1.SopsClient(deps.runner);
59
+ const decrypted = await sopsClient.decrypt(filePath);
60
+ if (!(key in decrypted.values)) {
61
+ formatter_1.formatter.error(`Key '${key}' not found in ${namespace}/${environment}. Available keys: ${Object.keys(decrypted.values).join(", ") || "(none)"}`);
62
+ process.exit(1);
63
+ return;
64
+ }
65
+ formatter_1.formatter.keyValue(key, decrypted.values[key]);
66
+ }
67
+ catch (err) {
68
+ if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
69
+ formatter_1.formatter.formatDependencyError(err);
70
+ process.exit(1);
71
+ return;
72
+ }
73
+ formatter_1.formatter.error(err.message);
74
+ process.exit(1);
75
+ }
76
+ });
77
+ }
78
+ function parseTarget(target) {
79
+ const parts = target.split("/");
80
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
81
+ throw new Error(`Invalid target "${target}". Expected format: namespace/environment`);
82
+ }
83
+ return [parts[0], parts[1]];
84
+ }
85
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,gDAgDC;AA3DD,2CAA6B;AAE7B,wCAMuB;AACvB,mDAAgD;AAEhD,SAAgB,kBAAkB,CAAC,OAAgB,EAAE,IAAkC;IACrF,OAAO;SACJ,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CACV,oFAAoF;QAClF,8DAA8D;QAC9D,wCAAwC;QACxC,eAAe;QACf,gCAAgC;QAChC,wCAAwC,CAC3C;SACA,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,GAAW,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,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,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,QAAQ,EACR,QAAQ,CAAC,YAAY;iBAClB,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC;iBACjC,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC,CACzC,CAAC;YAEF,MAAM,UAAU,GAAG,IAAI,iBAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAErD,IAAI,CAAC,CAAC,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,qBAAS,CAAC,KAAK,CACb,QAAQ,GAAG,kBAAkB,SAAS,IAAI,WAAW,qBAAqB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CACjI,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,qBAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,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,qBAAS,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,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 registerHooksCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAkB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIjE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAsD/F"}
@@ -0,0 +1,89 @@
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.registerHooksCommand = registerHooksCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const core_1 = require("@clef-sh/core");
40
+ const formatter_1 = require("../output/formatter");
41
+ const symbols_1 = require("../output/symbols");
42
+ function registerHooksCommand(program, deps) {
43
+ const hooks = program.command("hooks").description("Manage git hooks for Clef");
44
+ hooks
45
+ .command("install")
46
+ .description("Install the Clef pre-commit hook that blocks unencrypted secret commits")
47
+ .action(async () => {
48
+ try {
49
+ const repoRoot = program.opts().repo || process.cwd();
50
+ const hookPath = path.join(repoRoot, ".git", "hooks", "pre-commit");
51
+ // Check if hook already exists
52
+ if (fs.existsSync(hookPath)) {
53
+ const content = fs.readFileSync(hookPath, "utf-8");
54
+ if (content.includes("clef") || content.includes("SOPS")) {
55
+ const confirmed = await formatter_1.formatter.confirm("A Clef pre-commit hook already exists. Overwrite?");
56
+ if (!confirmed) {
57
+ formatter_1.formatter.info("Aborted.");
58
+ return;
59
+ }
60
+ }
61
+ else {
62
+ const confirmed = await formatter_1.formatter.confirm("A pre-commit hook already exists (not Clef). Overwrite?");
63
+ if (!confirmed) {
64
+ formatter_1.formatter.info("Aborted. You can manually add Clef checks to your existing hook.");
65
+ return;
66
+ }
67
+ }
68
+ }
69
+ const git = new core_1.GitIntegration(deps.runner);
70
+ await git.installPreCommitHook(repoRoot);
71
+ formatter_1.formatter.success("Pre-commit hook installed");
72
+ formatter_1.formatter.print(` ${(0, symbols_1.sym)("pending")} ${hookPath}`);
73
+ formatter_1.formatter.hint("Hook checks SOPS metadata on staged .enc files and runs: clef scan --staged");
74
+ // Also ensure the merge driver is configured (idempotent)
75
+ try {
76
+ await git.installMergeDriver(repoRoot);
77
+ formatter_1.formatter.success("SOPS merge driver configured");
78
+ }
79
+ catch {
80
+ formatter_1.formatter.warn("Could not configure SOPS merge driver. Run inside a git repository.");
81
+ }
82
+ }
83
+ catch (err) {
84
+ formatter_1.formatter.error(err.message);
85
+ process.exit(1);
86
+ }
87
+ });
88
+ }
89
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,oDAsDC;AA7DD,uCAAyB;AACzB,2CAA6B;AAE7B,wCAAiE;AACjE,mDAAgD;AAChD,+CAAwC;AAExC,SAAgB,oBAAoB,CAAC,OAAgB,EAAE,IAAkC;IACvF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAEhF,KAAK;SACF,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,yEAAyE,CAAC;SACtF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAI,OAAO,CAAC,IAAI,EAAE,CAAC,IAAe,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YAEpE,+BAA+B;YAC/B,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzD,MAAM,SAAS,GAAG,MAAM,qBAAS,CAAC,OAAO,CACvC,mDAAmD,CACpD,CAAC;oBACF,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,qBAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAC3B,OAAO;oBACT,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,SAAS,GAAG,MAAM,qBAAS,CAAC,OAAO,CACvC,yDAAyD,CAC1D,CAAC;oBACF,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,qBAAS,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;wBACnF,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,qBAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,GAAG,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAEzC,qBAAS,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;YAC/C,qBAAS,CAAC,KAAK,CAAC,MAAM,IAAA,aAAG,EAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;YACrD,qBAAS,CAAC,IAAI,CACZ,6EAA6E,CAC9E,CAAC;YAEF,0DAA0D;YAC1D,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBACvC,qBAAS,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAS,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qBAAS,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ import { SubprocessRunner } from "@clef-sh/core";
3
+ export declare function registerImportCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAML,gBAAgB,EAGjB,MAAM,eAAe,CAAC;AAgBvB,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAuMhG"}
@@ -0,0 +1,210 @@
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.registerImportCommand = registerImportCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const core_1 = require("@clef-sh/core");
40
+ const formatter_1 = require("../output/formatter");
41
+ const symbols_1 = require("../output/symbols");
42
+ async function readStdin() {
43
+ return new Promise((resolve, reject) => {
44
+ let data = "";
45
+ process.stdin.setEncoding("utf-8");
46
+ process.stdin.on("data", (chunk) => {
47
+ data += chunk;
48
+ });
49
+ process.stdin.on("end", () => resolve(data));
50
+ process.stdin.on("error", reject);
51
+ });
52
+ }
53
+ function registerImportCommand(program, deps) {
54
+ program
55
+ .command("import <target> [source]")
56
+ .description("Bulk-import secrets from a file (dotenv, JSON, or YAML) into an encrypted SOPS file.\n\n" +
57
+ " target: namespace/environment (e.g. database/staging)\n" +
58
+ " source: path to the source file (required unless --stdin is used)\n\n" +
59
+ "Exit codes:\n" +
60
+ " 0 Success or dry run complete\n" +
61
+ " 1 Partial failure (some keys failed to encrypt)\n" +
62
+ " 2 Could not start (missing manifest, invalid target, file not found, parse error)")
63
+ .option("--format <format>", "Override format detection (dotenv, json, yaml)")
64
+ .option("--prefix <string>", "Only import keys starting with this prefix")
65
+ .option("--keys <keys>", "Only import specific keys (comma-separated)")
66
+ .option("--overwrite", "Overwrite existing keys", false)
67
+ .option("--dry-run", "Preview without encrypting", false)
68
+ .option("--stdin", "Read source from stdin", false)
69
+ .action(async (target, source, opts) => {
70
+ try {
71
+ // Validate target format
72
+ const parts = target.split("/");
73
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
74
+ formatter_1.formatter.error(`Invalid target '${target}'. Expected format: namespace/environment (e.g. database/staging)`);
75
+ process.exit(2);
76
+ return;
77
+ }
78
+ const [namespace, environment] = parts;
79
+ // Validate format option
80
+ const validFormats = ["dotenv", "json", "yaml"];
81
+ if (opts.format && !validFormats.includes(opts.format)) {
82
+ formatter_1.formatter.error(`Unknown format '${opts.format}'. Supported formats: dotenv, json, yaml`);
83
+ process.exit(2);
84
+ return;
85
+ }
86
+ const repoRoot = program.opts().repo || process.cwd();
87
+ const parser = new core_1.ManifestParser();
88
+ let manifest;
89
+ try {
90
+ manifest = parser.parse(path.join(repoRoot, "clef.yaml"));
91
+ }
92
+ catch (err) {
93
+ formatter_1.formatter.error(err.message);
94
+ process.exit(2);
95
+ return;
96
+ }
97
+ // Check for protected environment
98
+ const matrixManager = new core_1.MatrixManager();
99
+ if (matrixManager.isProtectedEnvironment(manifest, environment)) {
100
+ const confirmed = await formatter_1.formatter.confirm(`This is a protected environment (${environment}). Confirm?`);
101
+ if (!confirmed) {
102
+ formatter_1.formatter.info("Aborted.");
103
+ return;
104
+ }
105
+ }
106
+ // Read source content
107
+ let content;
108
+ let sourcePath = null;
109
+ if (opts.stdin) {
110
+ content = await readStdin();
111
+ }
112
+ else if (source) {
113
+ if (!fs.existsSync(source)) {
114
+ formatter_1.formatter.error(`Source file not found: ${source}`);
115
+ process.exit(2);
116
+ return;
117
+ }
118
+ try {
119
+ content = fs.readFileSync(source, "utf-8");
120
+ sourcePath = source;
121
+ }
122
+ catch (err) {
123
+ formatter_1.formatter.error(`Could not read source file: ${err.message}`);
124
+ process.exit(2);
125
+ return;
126
+ }
127
+ }
128
+ else {
129
+ formatter_1.formatter.error("No source specified. Provide a file path or use --stdin to read from stdin.");
130
+ process.exit(2);
131
+ return;
132
+ }
133
+ // Parse keys option
134
+ const keysFilter = opts.keys ? opts.keys.split(",").map((k) => k.trim()) : undefined;
135
+ const sourceLabel = sourcePath ? path.basename(sourcePath) : "stdin";
136
+ if (opts.dryRun) {
137
+ formatter_1.formatter.print(`Dry run — nothing will be encrypted.`);
138
+ formatter_1.formatter.print(`Previewing import to ${namespace}/${environment} from ${sourceLabel}...\n`);
139
+ }
140
+ else {
141
+ formatter_1.formatter.print(`Importing to ${namespace}/${environment} from ${sourceLabel}...\n`);
142
+ }
143
+ const sopsClient = new core_1.SopsClient(deps.runner);
144
+ const importRunner = new core_1.ImportRunner(sopsClient);
145
+ let result;
146
+ try {
147
+ result = await importRunner.import(target, sourcePath, content, manifest, repoRoot, {
148
+ format: opts.format,
149
+ prefix: opts.prefix,
150
+ keys: keysFilter,
151
+ overwrite: opts.overwrite,
152
+ dryRun: opts.dryRun,
153
+ });
154
+ }
155
+ catch (err) {
156
+ // Re-throw dependency errors so the outer handler can format them
157
+ if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
158
+ throw err;
159
+ }
160
+ formatter_1.formatter.error(err.message);
161
+ process.exit(2);
162
+ return;
163
+ }
164
+ // Show warnings
165
+ for (const warning of result.warnings) {
166
+ formatter_1.formatter.print(` ${(0, symbols_1.sym)("warning")} ${warning}`);
167
+ }
168
+ if (opts.dryRun) {
169
+ // Show dry run preview
170
+ for (const key of result.imported) {
171
+ formatter_1.formatter.print(` ${(0, symbols_1.sym)("arrow")} ${key.padEnd(20)} would import`);
172
+ }
173
+ for (const key of result.skipped) {
174
+ formatter_1.formatter.print(` ${(0, symbols_1.sym)("skipped")} ${key.padEnd(20)} would skip \u2014 already exists`);
175
+ }
176
+ formatter_1.formatter.print(`\nDry run complete: ${result.imported.length} would import, ${result.skipped.length} would skip.`);
177
+ formatter_1.formatter.print(`Run without --dry-run to apply.`);
178
+ }
179
+ else {
180
+ // Show actual import results
181
+ for (const key of result.imported) {
182
+ formatter_1.formatter.print(` ${(0, symbols_1.sym)("success")} ${key.padEnd(12)} ${(0, symbols_1.sym)("locked")} imported`);
183
+ }
184
+ for (const key of result.skipped) {
185
+ formatter_1.formatter.print(` ${(0, symbols_1.sym)("skipped")} ${key.padEnd(12)} skipped \u2014 already exists (--overwrite to replace)`);
186
+ }
187
+ for (const { key, error: keyError } of result.failed) {
188
+ formatter_1.formatter.print(` ${(0, symbols_1.sym)("failure")} ${key.padEnd(12)} failed \u2014 encrypt error: ${keyError}`);
189
+ }
190
+ formatter_1.formatter.print(`\n${result.imported.length} imported, ${result.skipped.length} skipped, ${result.failed.length} failed.`);
191
+ if (result.failed.length > 0) {
192
+ for (const { key } of result.failed) {
193
+ formatter_1.formatter.hint(`clef set ${target} ${key} (retry failed key)`);
194
+ }
195
+ process.exit(1);
196
+ }
197
+ }
198
+ }
199
+ catch (err) {
200
+ if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
201
+ formatter_1.formatter.formatDependencyError(err);
202
+ process.exit(1);
203
+ return;
204
+ }
205
+ formatter_1.formatter.error(err.message);
206
+ process.exit(1);
207
+ }
208
+ });
209
+ }
210
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Command } from "commander";
2
+ import { SubprocessRunner } from "@clef-sh/core";
3
+ export declare function registerInitCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ /**
7
+ * Generate .sops.yaml from a manifest and write it to disk.
8
+ * Used by `clef init` and `clef doctor --fix`.
9
+ */
10
+ export declare function scaffoldSopsConfig(repoRoot: string): void;
11
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAQL,gBAAgB,EASjB,MAAM,eAAe,CAAC;AA+DvB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CA6D9F;AAuQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAYzD"}