@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.
- package/bin/clef.js +2 -0
- package/dist/commands/delete.d.ts +6 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +130 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/diff.d.ts +6 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +168 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +331 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/exec.d.ts +6 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +187 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +110 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/get.d.ts +6 -0
- package/dist/commands/get.d.ts.map +1 -0
- package/dist/commands/get.js +85 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/hooks.d.ts +6 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +89 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/import.d.ts +6 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +210 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +499 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +6 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +152 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/merge-driver.d.ts +6 -0
- package/dist/commands/merge-driver.d.ts.map +1 -0
- package/dist/commands/merge-driver.js +152 -0
- package/dist/commands/merge-driver.js.map +1 -0
- package/dist/commands/recipients.d.ts +7 -0
- package/dist/commands/recipients.d.ts.map +1 -0
- package/dist/commands/recipients.js +316 -0
- package/dist/commands/recipients.js.map +1 -0
- package/dist/commands/rotate.d.ts +6 -0
- package/dist/commands/rotate.d.ts.map +1 -0
- package/dist/commands/rotate.js +97 -0
- package/dist/commands/rotate.js.map +1 -0
- package/dist/commands/scan.d.ts +6 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +152 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/set.d.ts +6 -0
- package/dist/commands/set.d.ts.map +1 -0
- package/dist/commands/set.js +137 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/ui.d.ts +7 -0
- package/dist/commands/ui.d.ts.map +1 -0
- package/dist/commands/ui.js +100 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/commands/update.d.ts +6 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +119 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +121 -0
- package/dist/index.js.map +1 -0
- package/dist/output/formatter.d.ts +20 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +191 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/symbols.d.ts +21 -0
- package/dist/output/symbols.d.ts.map +1 -0
- package/dist/output/symbols.js +59 -0
- package/dist/output/symbols.js.map +1 -0
- package/dist/subprocess.d.ts +5 -0
- package/dist/subprocess.d.ts.map +1 -0
- package/dist/subprocess.js +27 -0
- package/dist/subprocess.js.map +1 -0
- 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 @@
|
|
|
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"}
|