@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,152 @@
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.registerLintCommand = registerLintCommand;
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 registerLintCommand(program, deps) {
46
+ program
47
+ .command("lint")
48
+ .description("Full repo health check — matrix completeness, schema validation, SOPS integrity.\n\n" +
49
+ "Exit codes:\n" +
50
+ " 0 No errors (warnings are allowed)\n" +
51
+ " 1 Errors found")
52
+ .option("--fix", "Auto-fix safe issues (scaffold missing files)")
53
+ .option("--json", "Output raw LintResult JSON")
54
+ .action(async (options) => {
55
+ try {
56
+ const repoRoot = program.opts().repo || process.cwd();
57
+ const parser = new core_1.ManifestParser();
58
+ const manifest = parser.parse(path.join(repoRoot, "clef.yaml"));
59
+ const sopsClient = new core_1.SopsClient(deps.runner);
60
+ const matrixManager = new core_1.MatrixManager();
61
+ const schemaValidator = new core_1.SchemaValidator();
62
+ const lintRunner = new core_1.LintRunner(matrixManager, schemaValidator, sopsClient);
63
+ let result;
64
+ if (options.fix) {
65
+ result = await lintRunner.fix(manifest, repoRoot);
66
+ }
67
+ else {
68
+ result = await lintRunner.run(manifest, repoRoot);
69
+ }
70
+ if (options.json) {
71
+ formatter_1.formatter.raw(JSON.stringify(result, null, 2) + "\n");
72
+ const hasErrors = result.issues.some((i) => i.severity === "error");
73
+ process.exit(hasErrors ? 1 : 0);
74
+ }
75
+ formatLintOutput(result);
76
+ const hasErrors = result.issues.some((i) => i.severity === "error");
77
+ process.exit(hasErrors ? 1 : 0);
78
+ }
79
+ catch (err) {
80
+ if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
81
+ formatter_1.formatter.formatDependencyError(err);
82
+ process.exit(1);
83
+ return;
84
+ }
85
+ formatter_1.formatter.error(err.message);
86
+ process.exit(1);
87
+ }
88
+ });
89
+ }
90
+ function formatLintOutput(result) {
91
+ const errors = result.issues.filter((i) => i.severity === "error");
92
+ const warnings = result.issues.filter((i) => i.severity === "warning");
93
+ const infos = result.issues.filter((i) => i.severity === "info");
94
+ if (result.issues.length === 0) {
95
+ formatter_1.formatter.success(`All clear \u2014 ${result.fileCount} files healthy`);
96
+ return;
97
+ }
98
+ formatter_1.formatter.print("");
99
+ if (errors.length > 0) {
100
+ formatter_1.formatter.print(picocolors_1.default.red(picocolors_1.default.bold(`${(0, symbols_1.sym)("failure")} ${errors.length} error(s)`)));
101
+ for (const issue of errors) {
102
+ const keyRef = issue.key ? ` ${picocolors_1.default.white(issue.key)}` : "";
103
+ const categoryBadge = picocolors_1.default.dim(`[${issue.category}]`);
104
+ formatter_1.formatter.print(` ${picocolors_1.default.red((0, symbols_1.sym)("failure"))} ${categoryBadge} ${issue.file}${keyRef}`);
105
+ formatter_1.formatter.print(` ${issue.message}`);
106
+ if (issue.fixCommand) {
107
+ formatter_1.formatter.hint(issue.fixCommand);
108
+ }
109
+ }
110
+ formatter_1.formatter.print("");
111
+ }
112
+ if (warnings.length > 0) {
113
+ formatter_1.formatter.print(picocolors_1.default.yellow(picocolors_1.default.bold(`${(0, symbols_1.sym)("warning")} ${warnings.length} warning(s)`)));
114
+ for (const issue of warnings) {
115
+ const keyRef = issue.key ? ` ${picocolors_1.default.white(issue.key)}` : "";
116
+ const categoryBadge = picocolors_1.default.dim(`[${issue.category}]`);
117
+ formatter_1.formatter.print(` ${picocolors_1.default.yellow((0, symbols_1.sym)("warning"))} ${categoryBadge} ${issue.file}${keyRef}`);
118
+ formatter_1.formatter.print(` ${issue.message}`);
119
+ if (issue.fixCommand) {
120
+ formatter_1.formatter.hint(issue.fixCommand);
121
+ }
122
+ }
123
+ formatter_1.formatter.print("");
124
+ }
125
+ if (infos.length > 0) {
126
+ formatter_1.formatter.print(picocolors_1.default.blue(picocolors_1.default.bold(`${(0, symbols_1.sym)("info")} ${infos.length} info`)));
127
+ for (const issue of infos) {
128
+ const keyRef = issue.key ? ` ${picocolors_1.default.white(issue.key)}` : "";
129
+ const categoryBadge = picocolors_1.default.dim(`[${issue.category}]`);
130
+ formatter_1.formatter.print(` ${picocolors_1.default.blue((0, symbols_1.sym)("info"))} ${categoryBadge} ${issue.file}${keyRef}`);
131
+ formatter_1.formatter.print(` ${issue.message}`);
132
+ }
133
+ formatter_1.formatter.print("");
134
+ }
135
+ // Summary line
136
+ const parts = [];
137
+ if (errors.length > 0)
138
+ parts.push(picocolors_1.default.red(`${errors.length} error(s)`));
139
+ if (warnings.length > 0)
140
+ parts.push(picocolors_1.default.yellow(`${warnings.length} warning(s)`));
141
+ if (infos.length > 0)
142
+ parts.push(picocolors_1.default.blue(`${infos.length} info`));
143
+ formatter_1.formatter.print(parts.join(", "));
144
+ // Fixable hints at the end
145
+ const fixableIssues = result.issues.filter((i) => i.fixCommand);
146
+ if (fixableIssues.length > 0) {
147
+ for (const issue of fixableIssues) {
148
+ formatter_1.formatter.hint(issue.fixCommand);
149
+ }
150
+ }
151
+ }
152
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.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 registerMergeDriverCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ //# sourceMappingURL=merge-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-driver.d.ts","sourceRoot":"","sources":["../../src/commands/merge-driver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAML,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAsCvB,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GACjC,IAAI,CAqFN"}
@@ -0,0 +1,152 @@
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.registerMergeDriverCommand = registerMergeDriverCommand;
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
+ /**
43
+ * Locate the repo root by walking up from a file path looking for clef.yaml.
44
+ * Falls back to cwd if not found.
45
+ */
46
+ function findRepoRoot(filePath) {
47
+ let dir = path.dirname(path.resolve(filePath));
48
+ for (let i = 0; i < 50; i++) {
49
+ if (fs.existsSync(path.join(dir, "clef.yaml")))
50
+ return dir;
51
+ const parent = path.dirname(dir);
52
+ if (parent === dir)
53
+ break;
54
+ dir = parent;
55
+ }
56
+ throw new Error("Could not find clef.yaml in any parent directory of: " + filePath);
57
+ }
58
+ /**
59
+ * Resolve the age key file path from environment or .clef/config.yaml.
60
+ */
61
+ function resolveAgeKeyFile(repoRoot) {
62
+ if (process.env.SOPS_AGE_KEY_FILE)
63
+ return process.env.SOPS_AGE_KEY_FILE;
64
+ if (process.env.SOPS_AGE_KEY)
65
+ return undefined; // inline key, no file needed
66
+ const configPath = path.join(repoRoot, ".clef", "config.yaml");
67
+ if (fs.existsSync(configPath)) {
68
+ try {
69
+ const config = YAML.parse(fs.readFileSync(configPath, "utf-8"));
70
+ if (config?.age_key_file)
71
+ return config.age_key_file;
72
+ }
73
+ catch {
74
+ // ignore parse errors
75
+ }
76
+ }
77
+ return undefined;
78
+ }
79
+ function registerMergeDriverCommand(program, deps) {
80
+ program
81
+ .command("merge-driver")
82
+ .description("SOPS-aware git merge driver. Called by git during merge conflicts on encrypted files.\n" +
83
+ "Not typically invoked directly — configured via .gitattributes and git config.")
84
+ .argument("<base>", "Path to common ancestor file (%O)")
85
+ .argument("<ours>", "Path to current branch file (%A)")
86
+ .argument("<theirs>", "Path to incoming branch file (%B)")
87
+ .action(async (basePath, oursPath, theirsPath) => {
88
+ try {
89
+ const repoRoot = program.opts().repo || findRepoRoot(oursPath);
90
+ const ageKeyFile = resolveAgeKeyFile(repoRoot);
91
+ const sopsClient = new core_1.SopsClient(deps.runner, ageKeyFile);
92
+ const driver = new core_1.SopsMergeDriver(sopsClient);
93
+ const result = await driver.mergeFiles(basePath, oursPath, theirsPath);
94
+ if (result.clean) {
95
+ // Resolve the manifest and environment for re-encryption
96
+ const manifestPath = path.join(repoRoot, "clef.yaml");
97
+ let manifest;
98
+ let environment;
99
+ if (fs.existsSync(manifestPath)) {
100
+ const parser = new core_1.ManifestParser();
101
+ manifest = parser.parse(manifestPath);
102
+ // Determine the environment by matching against resolved file patterns
103
+ for (const ns of manifest.namespaces) {
104
+ for (const env of manifest.environments) {
105
+ const expected = manifest.file_pattern
106
+ .replace("{namespace}", ns.name)
107
+ .replace("{environment}", env.name);
108
+ const resolvedOurs = path.relative(repoRoot, path.resolve(oursPath));
109
+ if (resolvedOurs === expected ||
110
+ path.basename(oursPath) === path.basename(expected)) {
111
+ environment = env.name;
112
+ break;
113
+ }
114
+ }
115
+ if (environment)
116
+ break;
117
+ }
118
+ }
119
+ if (manifest) {
120
+ await sopsClient.encrypt(oursPath, result.merged, manifest, environment);
121
+ }
122
+ else {
123
+ // Fallback: write merged YAML to ours path without re-encrypting via manifest.
124
+ // This shouldn't happen in a properly configured Clef repo.
125
+ formatter_1.formatter.error("Could not find clef.yaml — cannot re-encrypt merged file.");
126
+ process.exit(1);
127
+ return;
128
+ }
129
+ // Exit 0 signals git that the merge was resolved
130
+ process.exit(0);
131
+ }
132
+ else {
133
+ // Report conflicts to stderr so the user can resolve them
134
+ formatter_1.formatter.error(`Merge conflict in encrypted file: ${result.conflicts.length} key(s) conflict`);
135
+ for (const c of result.conflicts) {
136
+ formatter_1.formatter.failure(` ${c.key}:`);
137
+ formatter_1.formatter.failure(` base: ${c.baseValue ?? "(absent)"}`);
138
+ formatter_1.formatter.failure(` ours: ${c.oursValue ?? "(deleted)"}`);
139
+ formatter_1.formatter.failure(` theirs: ${c.theirsValue ?? "(deleted)"}`);
140
+ }
141
+ formatter_1.formatter.hint("Resolve conflicts manually with: clef set <namespace>/<env> <KEY> <value>");
142
+ // Exit 1 signals git that the merge has unresolved conflicts
143
+ process.exit(1);
144
+ }
145
+ }
146
+ catch (err) {
147
+ formatter_1.formatter.error(`Merge driver failed: ${err.message}`);
148
+ process.exit(1);
149
+ }
150
+ });
151
+ }
152
+ //# sourceMappingURL=merge-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-driver.js","sourceRoot":"","sources":["../../src/commands/merge-driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from "commander";
2
+ import { SubprocessRunner } from "@clef-sh/core";
3
+ export declare function waitForEnter(message: string): Promise<void>;
4
+ export declare function registerRecipientsCommand(program: Command, deps: {
5
+ runner: SubprocessRunner;
6
+ }): void;
7
+ //# sourceMappingURL=recipients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipients.d.ts","sourceRoot":"","sources":["../../src/commands/recipients.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAML,gBAAgB,EAIjB,MAAM,eAAe,CAAC;AAIvB,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3D;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GACjC,IAAI,CAgVN"}