@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
package/bin/clef.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require("../dist/index.js");
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ import { SubprocessRunner } from "@clef-sh/core";
3
+ export declare function registerDeleteCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAQL,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CA2GhG"}
@@ -0,0 +1,130 @@
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.registerDeleteCommand = registerDeleteCommand;
37
+ const path = __importStar(require("path"));
38
+ const core_1 = require("@clef-sh/core");
39
+ const formatter_1 = require("../output/formatter");
40
+ function registerDeleteCommand(program, deps) {
41
+ program
42
+ .command("delete <target> <key>")
43
+ .description("Delete a key from an encrypted file.\n\n" +
44
+ " target: namespace/environment (e.g. payments/staging)\n" +
45
+ " or just namespace when using --all-envs\n" +
46
+ " key: the key name to delete\n" +
47
+ " --all-envs: delete the key from all environments in the namespace\n\n" +
48
+ "Exit codes:\n" +
49
+ " 0 key deleted successfully\n" +
50
+ " 1 operation failed")
51
+ .option("--all-envs", "Delete from all environments in the namespace")
52
+ .action(async (target, key, options) => {
53
+ try {
54
+ const repoRoot = program.opts().repo || process.cwd();
55
+ const parser = new core_1.ManifestParser();
56
+ const manifest = parser.parse(path.join(repoRoot, "clef.yaml"));
57
+ const sopsClient = new core_1.SopsClient(deps.runner);
58
+ const matrixManager = new core_1.MatrixManager();
59
+ if (options.allEnvs) {
60
+ // target is just the namespace
61
+ const namespace = target.includes("/") ? target.split("/")[0] : target;
62
+ const protectedEnvs = manifest.environments.filter((e) => e.protected).map((e) => e.name);
63
+ const envNames = manifest.environments.map((e) => e.name).join(", ");
64
+ const protectedNote = protectedEnvs.length > 0
65
+ ? ` including protected environments: ${protectedEnvs.join(", ")}`
66
+ : "";
67
+ const confirmed = await formatter_1.formatter.confirm(`This will delete '${key}' from ${manifest.environments.length} environments (${envNames})${protectedNote}.\nType the key name to confirm:`);
68
+ if (!confirmed) {
69
+ formatter_1.formatter.info("Aborted.");
70
+ return;
71
+ }
72
+ const bulkOps = new core_1.BulkOps();
73
+ await bulkOps.deleteAcrossEnvironments(namespace, key, manifest, sopsClient, repoRoot);
74
+ formatter_1.formatter.success(`Deleted '${key}' from ${namespace} in all environments`);
75
+ }
76
+ else {
77
+ const [namespace, environment] = parseTarget(target);
78
+ // Check for protected environment
79
+ if (matrixManager.isProtectedEnvironment(manifest, environment)) {
80
+ const protConfirmed = await formatter_1.formatter.confirm(`This is a protected environment (${environment}). Are you sure you want to delete '${key}'?`);
81
+ if (!protConfirmed) {
82
+ formatter_1.formatter.info("Aborted.");
83
+ return;
84
+ }
85
+ }
86
+ const confirmed = await formatter_1.formatter.confirm(`Delete '${key}' from ${namespace}/${environment}?`);
87
+ if (!confirmed) {
88
+ formatter_1.formatter.info("Aborted.");
89
+ return;
90
+ }
91
+ const filePath = path.join(repoRoot, manifest.file_pattern
92
+ .replace("{namespace}", namespace)
93
+ .replace("{environment}", environment));
94
+ const decrypted = await sopsClient.decrypt(filePath);
95
+ if (!(key in decrypted.values)) {
96
+ formatter_1.formatter.error(`Key '${key}' not found in ${namespace}/${environment}.`);
97
+ process.exit(1);
98
+ }
99
+ delete decrypted.values[key];
100
+ await sopsClient.encrypt(filePath, decrypted.values, manifest, environment);
101
+ // Clean up pending metadata if it exists
102
+ try {
103
+ await (0, core_1.markResolved)(filePath, [key]);
104
+ }
105
+ catch {
106
+ formatter_1.formatter.warn(`Key deleted but pending metadata could not be cleaned up. Run clef lint to verify.`);
107
+ }
108
+ formatter_1.formatter.success(`Deleted '${key}' from ${namespace}/${environment}`);
109
+ formatter_1.formatter.hint(`Commit: git add ${manifest.file_pattern.replace("{namespace}", namespace).replace("{environment}", environment)}`);
110
+ }
111
+ }
112
+ catch (err) {
113
+ if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
114
+ formatter_1.formatter.formatDependencyError(err);
115
+ process.exit(1);
116
+ return;
117
+ }
118
+ formatter_1.formatter.error(err.message);
119
+ process.exit(1);
120
+ }
121
+ });
122
+ }
123
+ function parseTarget(target) {
124
+ const parts = target.split("/");
125
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
126
+ throw new Error(`Invalid target "${target}". Expected format: namespace/environment`);
127
+ }
128
+ return [parts[0], parts[1]];
129
+ }
130
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.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 registerDiffCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAQL,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAIvB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAuF9F"}
@@ -0,0 +1,168 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerDiffCommand = registerDiffCommand;
40
+ const path = __importStar(require("path"));
41
+ const picocolors_1 = __importDefault(require("picocolors"));
42
+ const core_1 = require("@clef-sh/core");
43
+ const formatter_1 = require("../output/formatter");
44
+ const symbols_1 = require("../output/symbols");
45
+ function registerDiffCommand(program, deps) {
46
+ program
47
+ .command("diff <namespace> <env-a> <env-b>")
48
+ .description("Compare secrets between two environments for a namespace.\n\n" +
49
+ "Exit codes:\n" +
50
+ " 0 No differences\n" +
51
+ " 1 Differences found")
52
+ .option("--show-identical", "Include identical keys in the output")
53
+ .option("--show-values", "Show plaintext values instead of masking them")
54
+ .option("--json", "Output raw DiffResult JSON")
55
+ .action(async (namespace, envA, envB, options) => {
56
+ try {
57
+ const repoRoot = program.opts().repo || process.cwd();
58
+ const parser = new core_1.ManifestParser();
59
+ const manifest = parser.parse(path.join(repoRoot, "clef.yaml"));
60
+ const sopsClient = new core_1.SopsClient(deps.runner);
61
+ const diffEngine = new core_1.DiffEngine();
62
+ const result = await diffEngine.diffFiles(namespace, envA, envB, manifest, sopsClient, repoRoot);
63
+ // Warn if showing values for a protected environment
64
+ if (options.showValues) {
65
+ const matrixManager = new core_1.MatrixManager();
66
+ if (matrixManager.isProtectedEnvironment(manifest, envA) ||
67
+ matrixManager.isProtectedEnvironment(manifest, envB)) {
68
+ formatter_1.formatter.warn("Warning: printing plaintext values for protected environment.");
69
+ }
70
+ }
71
+ if (options.json) {
72
+ const jsonOutput = options.showValues
73
+ ? result
74
+ : {
75
+ ...result,
76
+ rows: result.rows.map((r) => ({
77
+ ...r,
78
+ valueA: r.valueA !== null ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" : null,
79
+ valueB: r.valueB !== null ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" : null,
80
+ masked: true,
81
+ })),
82
+ };
83
+ formatter_1.formatter.raw(JSON.stringify(jsonOutput, null, 2) + "\n");
84
+ const hasDiffs = result.rows.some((r) => r.status !== "identical");
85
+ process.exit(hasDiffs ? 1 : 0);
86
+ }
87
+ formatDiffOutput(result, envA, envB, options.showIdentical ?? false, options.showValues ?? false);
88
+ const hasDiffs = result.rows.some((r) => r.status !== "identical");
89
+ process.exit(hasDiffs ? 1 : 0);
90
+ }
91
+ catch (err) {
92
+ if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
93
+ formatter_1.formatter.formatDependencyError(err);
94
+ process.exit(1);
95
+ return;
96
+ }
97
+ formatter_1.formatter.error(err.message);
98
+ process.exit(1);
99
+ }
100
+ });
101
+ }
102
+ const MASKED = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
103
+ function formatDiffOutput(result, envA, envB, showIdentical, showValues) {
104
+ const filteredRows = showIdentical
105
+ ? result.rows
106
+ : result.rows.filter((r) => r.status !== "identical");
107
+ if (filteredRows.length === 0) {
108
+ formatter_1.formatter.success(`No differences between ${envA} and ${envB} for ${result.namespace}`);
109
+ return;
110
+ }
111
+ // Summary
112
+ const changed = result.rows.filter((r) => r.status === "changed").length;
113
+ const missingA = result.rows.filter((r) => r.status === "missing_a").length;
114
+ const missingB = result.rows.filter((r) => r.status === "missing_b").length;
115
+ const identical = result.rows.filter((r) => r.status === "identical").length;
116
+ const parts = [];
117
+ if (changed > 0)
118
+ parts.push(`${changed} changed`);
119
+ if (missingA > 0)
120
+ parts.push(`${missingA} missing in ${envA}`);
121
+ if (missingB > 0)
122
+ parts.push(`${missingB} missing in ${envB}`);
123
+ if (identical > 0)
124
+ parts.push(`${identical} identical`);
125
+ formatter_1.formatter.print(`\n${result.namespace}: ${parts.join(", ")}\n`);
126
+ // Table
127
+ const rows = [];
128
+ for (const row of filteredRows) {
129
+ let valueA;
130
+ let valueB;
131
+ let status;
132
+ switch (row.status) {
133
+ case "changed":
134
+ valueA = picocolors_1.default.yellow(showValues ? (row.valueA ?? "") : MASKED);
135
+ valueB = picocolors_1.default.cyan(showValues ? (row.valueB ?? "") : MASKED);
136
+ status = `${(0, symbols_1.sym)("warning")} ${picocolors_1.default.yellow("changed")}`;
137
+ break;
138
+ case "missing_a":
139
+ valueA = picocolors_1.default.red(picocolors_1.default.italic("(not set)"));
140
+ valueB = showValues ? (row.valueB ?? "") : MASKED;
141
+ status = `${(0, symbols_1.sym)("failure")} ${picocolors_1.default.red(`missing in ${envA}`)}`;
142
+ break;
143
+ case "missing_b":
144
+ valueA = showValues ? (row.valueA ?? "") : MASKED;
145
+ valueB = picocolors_1.default.red(picocolors_1.default.italic("(not set)"));
146
+ status = `${(0, symbols_1.sym)("failure")} ${picocolors_1.default.red(`missing in ${envB}`)}`;
147
+ break;
148
+ case "identical":
149
+ valueA = showValues ? (row.valueA ?? "") : MASKED;
150
+ valueB = showValues ? (row.valueB ?? "") : MASKED;
151
+ status = `${(0, symbols_1.sym)("success")} ${picocolors_1.default.green("identical")}`;
152
+ break;
153
+ }
154
+ rows.push([row.key, valueA, valueB, status]);
155
+ }
156
+ formatter_1.formatter.table(rows, ["Key", envA, envB, "Status"]);
157
+ // Fix hints for missing keys
158
+ const missingRows = result.rows.filter((r) => r.status === "missing_a" || r.status === "missing_b");
159
+ if (missingRows.length > 0) {
160
+ formatter_1.formatter.print("");
161
+ formatter_1.formatter.hint("Fix:");
162
+ for (const row of missingRows) {
163
+ const missingEnv = row.status === "missing_a" ? envA : envB;
164
+ formatter_1.formatter.hint(`clef set ${result.namespace}/${missingEnv} ${row.key} <value>`);
165
+ }
166
+ }
167
+ }
168
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.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 registerDoctorCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAA0C,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAuBzF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAoOhG"}