@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,137 @@
|
|
|
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.registerSetCommand = registerSetCommand;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const core_1 = require("@clef-sh/core");
|
|
39
|
+
const formatter_1 = require("../output/formatter");
|
|
40
|
+
const symbols_1 = require("../output/symbols");
|
|
41
|
+
function registerSetCommand(program, deps) {
|
|
42
|
+
program
|
|
43
|
+
.command("set <target> <key> [value]")
|
|
44
|
+
.description("Set a secret value. If value is omitted, prompts securely (hidden input).\n\n" +
|
|
45
|
+
" target: namespace/environment (e.g. payments/staging)\n" +
|
|
46
|
+
" key: the key name to set\n" +
|
|
47
|
+
" value: optional — if omitted, prompts with hidden input\n\n" +
|
|
48
|
+
"The plaintext value is never written to disk or printed to stdout.\n\n" +
|
|
49
|
+
"Exit codes:\n" +
|
|
50
|
+
" 0 value set successfully\n" +
|
|
51
|
+
" 1 operation failed")
|
|
52
|
+
.option("--random", "Generate a cryptographically random placeholder value and mark the key as pending")
|
|
53
|
+
.action(async (target, key, value, opts) => {
|
|
54
|
+
try {
|
|
55
|
+
if (opts.random && value !== undefined) {
|
|
56
|
+
formatter_1.formatter.error("Cannot use --random and provide a value simultaneously.\n" +
|
|
57
|
+
"Use --random to generate a placeholder, or provide a value to set it directly.");
|
|
58
|
+
process.exit(1);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (value !== undefined && !opts.random) {
|
|
62
|
+
formatter_1.formatter.warn("Secret passed as a command-line argument is visible in shell history.\n" +
|
|
63
|
+
` Consider using the interactive prompt instead: clef set ${target} ${key}`);
|
|
64
|
+
}
|
|
65
|
+
const [namespace, environment] = parseTarget(target);
|
|
66
|
+
const repoRoot = program.opts().repo || process.cwd();
|
|
67
|
+
const parser = new core_1.ManifestParser();
|
|
68
|
+
const manifest = parser.parse(path.join(repoRoot, "clef.yaml"));
|
|
69
|
+
// Check for protected environment
|
|
70
|
+
const matrixManager = new core_1.MatrixManager();
|
|
71
|
+
if (matrixManager.isProtectedEnvironment(manifest, environment)) {
|
|
72
|
+
const confirmed = await formatter_1.formatter.confirm(`This is a protected environment (${environment}). Confirm?`);
|
|
73
|
+
if (!confirmed) {
|
|
74
|
+
formatter_1.formatter.info("Aborted.");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Determine the value
|
|
79
|
+
let secretValue;
|
|
80
|
+
let isPendingValue = false;
|
|
81
|
+
if (opts.random) {
|
|
82
|
+
secretValue = (0, core_1.generateRandomValue)();
|
|
83
|
+
isPendingValue = true;
|
|
84
|
+
}
|
|
85
|
+
else if (value === undefined) {
|
|
86
|
+
secretValue = await formatter_1.formatter.secretPrompt(`Enter value for ${key}`);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
secretValue = value;
|
|
90
|
+
}
|
|
91
|
+
const filePath = path.join(repoRoot, manifest.file_pattern
|
|
92
|
+
.replace("{namespace}", namespace)
|
|
93
|
+
.replace("{environment}", environment));
|
|
94
|
+
const sopsClient = new core_1.SopsClient(deps.runner);
|
|
95
|
+
const decrypted = await sopsClient.decrypt(filePath);
|
|
96
|
+
decrypted.values[key] = secretValue;
|
|
97
|
+
await sopsClient.encrypt(filePath, decrypted.values, manifest, environment);
|
|
98
|
+
// Update pending metadata
|
|
99
|
+
if (isPendingValue) {
|
|
100
|
+
try {
|
|
101
|
+
await (0, core_1.markPendingWithRetry)(filePath, [key], "clef set --random");
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
formatter_1.formatter.warn(`${key} was encrypted but pending state could not be recorded.\n` +
|
|
105
|
+
" The value is set but will not appear as pending in the UI or lint.\n" +
|
|
106
|
+
" To manually mark it pending, edit .clef-meta.yaml.");
|
|
107
|
+
}
|
|
108
|
+
formatter_1.formatter.success(`${key} set in ${namespace}/${environment} ${(0, symbols_1.sym)("locked")}`);
|
|
109
|
+
formatter_1.formatter.print(` ${(0, symbols_1.sym)("pending")} Marked as pending \u2014 replace with a real value before deploying`);
|
|
110
|
+
formatter_1.formatter.hint(`clef set ${namespace}/${environment} ${key}`);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Normal set resolves any pending state for this key
|
|
114
|
+
await (0, core_1.markResolved)(filePath, [key]);
|
|
115
|
+
formatter_1.formatter.success(`${key} set in ${namespace}/${environment}`);
|
|
116
|
+
formatter_1.formatter.hint(`Commit: git add ${manifest.file_pattern.replace("{namespace}", namespace).replace("{environment}", environment)}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
|
|
121
|
+
formatter_1.formatter.formatDependencyError(err);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
formatter_1.formatter.error(err.message);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function parseTarget(target) {
|
|
131
|
+
const parts = target.split("/");
|
|
132
|
+
if (parts.length !== 2 || !parts[0] || !parts[1]) {
|
|
133
|
+
throw new Error(`Invalid target "${target}". Expected format: namespace/environment`);
|
|
134
|
+
}
|
|
135
|
+
return [parts[0], parts[1]];
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../src/commands/set.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 registerUiCommand(program: Command, deps: {
|
|
4
|
+
runner: SubprocessRunner;
|
|
5
|
+
}): void;
|
|
6
|
+
export declare function isHeadless(): boolean;
|
|
7
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKjD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAgE5F;AAED,wBAAgB,UAAU,IAAI,OAAO,CAiBpC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerUiCommand = registerUiCommand;
|
|
4
|
+
exports.isHeadless = isHeadless;
|
|
5
|
+
const server_1 = require("@clef-sh/ui/dist/server");
|
|
6
|
+
const formatter_1 = require("../output/formatter");
|
|
7
|
+
const symbols_1 = require("../output/symbols");
|
|
8
|
+
function registerUiCommand(program, deps) {
|
|
9
|
+
program
|
|
10
|
+
.command("ui")
|
|
11
|
+
.description("Open the Clef local web UI in your browser")
|
|
12
|
+
.option("--port <port>", "Port to serve the UI on", "7777")
|
|
13
|
+
.option("--no-open", "Don't automatically open the browser")
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
const port = parseInt(options.port, 10);
|
|
16
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
17
|
+
formatter_1.formatter.error(`Invalid port '${options.port}'. Must be a number between 1 and 65535.`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const repoRoot = program.opts().repo || process.cwd();
|
|
22
|
+
let handle;
|
|
23
|
+
try {
|
|
24
|
+
handle = await (0, server_1.startServer)(port, repoRoot, deps.runner);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const message = err instanceof Error ? err.message : "Unknown error";
|
|
28
|
+
formatter_1.formatter.error(`Failed to start UI server: ${message}`);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const tokenUrl = `${handle.url}?token=${handle.token}`;
|
|
33
|
+
formatter_1.formatter.print(`${(0, symbols_1.sym)("clef")} Starting Clef UI...\n`);
|
|
34
|
+
formatter_1.formatter.print(` ${(0, symbols_1.sym)("locked")} Server ${handle.url}`);
|
|
35
|
+
formatter_1.formatter.print(` ${(0, symbols_1.sym)("copied")} Token ${handle.token}`);
|
|
36
|
+
if (options.open) {
|
|
37
|
+
if (isHeadless()) {
|
|
38
|
+
formatter_1.formatter.info(`Browser auto-open skipped (no display detected). Open ${tokenUrl} manually.`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
formatter_1.formatter.print(`\n Opening browser...`);
|
|
42
|
+
try {
|
|
43
|
+
await openBrowser(tokenUrl, deps.runner);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
formatter_1.formatter.warn(`Could not open browser automatically. Visit ${tokenUrl} manually.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
formatter_1.formatter.print(` Press Ctrl+C to stop.`);
|
|
51
|
+
// Graceful shutdown
|
|
52
|
+
await new Promise((resolve) => {
|
|
53
|
+
const shutdown = async () => {
|
|
54
|
+
formatter_1.formatter.print("\nShutting down...");
|
|
55
|
+
await handle.stop();
|
|
56
|
+
resolve();
|
|
57
|
+
};
|
|
58
|
+
process.on("SIGINT", () => {
|
|
59
|
+
shutdown();
|
|
60
|
+
});
|
|
61
|
+
process.on("SIGTERM", () => {
|
|
62
|
+
shutdown();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function isHeadless() {
|
|
68
|
+
// CI environment — universal headless signal
|
|
69
|
+
if (process.env.CI) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
// SSH session — no local display
|
|
73
|
+
if (process.env.SSH_TTY) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
// Linux without a display server
|
|
77
|
+
if (process.platform === "linux" && !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
async function openBrowser(url, runner) {
|
|
83
|
+
const platform = process.platform;
|
|
84
|
+
let command;
|
|
85
|
+
switch (platform) {
|
|
86
|
+
case "darwin":
|
|
87
|
+
command = "open";
|
|
88
|
+
break;
|
|
89
|
+
case "linux":
|
|
90
|
+
command = "xdg-open";
|
|
91
|
+
break;
|
|
92
|
+
case "win32":
|
|
93
|
+
command = "start";
|
|
94
|
+
break;
|
|
95
|
+
default:
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
await runner.run(command, [url]);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAKL,gBAAgB,EAGjB,MAAM,eAAe,CAAC;AAMvB,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAuFhG"}
|
|
@@ -0,0 +1,119 @@
|
|
|
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.registerUpdateCommand = registerUpdateCommand;
|
|
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 CLEF_DIR = ".clef";
|
|
43
|
+
const CLEF_CONFIG_FILENAME = "config.yaml";
|
|
44
|
+
function registerUpdateCommand(program, deps) {
|
|
45
|
+
program
|
|
46
|
+
.command("update")
|
|
47
|
+
.description("Scaffold any missing matrix cells from the existing manifest.\n\n" +
|
|
48
|
+
"Run after adding environments or namespaces to clef.yaml.\n\n" +
|
|
49
|
+
"Exit codes:\n" +
|
|
50
|
+
" 0 All cells up to date or newly scaffolded\n" +
|
|
51
|
+
" 1 Error reading manifest or scaffolding files")
|
|
52
|
+
.action(async () => {
|
|
53
|
+
try {
|
|
54
|
+
const repoRoot = program.opts().repo || process.cwd();
|
|
55
|
+
const manifestPath = path.join(repoRoot, "clef.yaml");
|
|
56
|
+
if (!fs.existsSync(manifestPath)) {
|
|
57
|
+
formatter_1.formatter.error("clef.yaml not found. Run 'clef init' to initialise this repository.");
|
|
58
|
+
process.exit(1);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const parser = new core_1.ManifestParser();
|
|
62
|
+
const manifest = parser.parse(manifestPath);
|
|
63
|
+
// Read ageKeyFile from .clef/config.yaml if present and env vars not already set
|
|
64
|
+
let ageKeyFile;
|
|
65
|
+
if (manifest.sops.default_backend === "age" &&
|
|
66
|
+
!process.env.SOPS_AGE_KEY &&
|
|
67
|
+
!process.env.SOPS_AGE_KEY_FILE) {
|
|
68
|
+
const clefConfigPath = path.join(repoRoot, CLEF_DIR, CLEF_CONFIG_FILENAME);
|
|
69
|
+
if (fs.existsSync(clefConfigPath)) {
|
|
70
|
+
try {
|
|
71
|
+
const config = YAML.parse(fs.readFileSync(clefConfigPath, "utf-8"));
|
|
72
|
+
ageKeyFile = config?.age_key_file;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// ignore parse errors
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const sopsClient = new core_1.SopsClient(deps.runner, ageKeyFile);
|
|
80
|
+
const matrixManager = new core_1.MatrixManager();
|
|
81
|
+
const cells = matrixManager.resolveMatrix(manifest, repoRoot);
|
|
82
|
+
const missing = cells.filter((c) => !c.exists);
|
|
83
|
+
if (missing.length === 0) {
|
|
84
|
+
formatter_1.formatter.success("Matrix is up to date.");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
let scaffoldedCount = 0;
|
|
88
|
+
let failedCount = 0;
|
|
89
|
+
for (const cell of missing) {
|
|
90
|
+
try {
|
|
91
|
+
await matrixManager.scaffoldCell(cell, sopsClient, manifest);
|
|
92
|
+
scaffoldedCount++;
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
failedCount++;
|
|
96
|
+
formatter_1.formatter.warn(`Could not scaffold ${cell.namespace}/${cell.environment}: ${err.message}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (scaffoldedCount > 0) {
|
|
100
|
+
formatter_1.formatter.success(`Scaffolded ${scaffoldedCount} encrypted file(s)`);
|
|
101
|
+
}
|
|
102
|
+
if (failedCount > 0) {
|
|
103
|
+
formatter_1.formatter.error(`${failedCount} cell(s) could not be scaffolded.`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
|
|
110
|
+
formatter_1.formatter.formatDependencyError(err);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
formatter_1.formatter.error(err.message);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const commander_1 = require("commander");
|
|
4
|
+
const subprocess_1 = require("./subprocess");
|
|
5
|
+
const init_1 = require("./commands/init");
|
|
6
|
+
const get_1 = require("./commands/get");
|
|
7
|
+
const set_1 = require("./commands/set");
|
|
8
|
+
const delete_1 = require("./commands/delete");
|
|
9
|
+
const diff_1 = require("./commands/diff");
|
|
10
|
+
const lint_1 = require("./commands/lint");
|
|
11
|
+
const rotate_1 = require("./commands/rotate");
|
|
12
|
+
const hooks_1 = require("./commands/hooks");
|
|
13
|
+
const ui_1 = require("./commands/ui");
|
|
14
|
+
const exec_1 = require("./commands/exec");
|
|
15
|
+
const export_1 = require("./commands/export");
|
|
16
|
+
const doctor_1 = require("./commands/doctor");
|
|
17
|
+
const update_1 = require("./commands/update");
|
|
18
|
+
const scan_1 = require("./commands/scan");
|
|
19
|
+
const import_1 = require("./commands/import");
|
|
20
|
+
const recipients_1 = require("./commands/recipients");
|
|
21
|
+
const merge_driver_1 = require("./commands/merge-driver");
|
|
22
|
+
const formatter_1 = require("./output/formatter");
|
|
23
|
+
const symbols_1 = require("./output/symbols");
|
|
24
|
+
const core_1 = require("@clef-sh/core");
|
|
25
|
+
const VERSION = "0.1.0";
|
|
26
|
+
const program = new commander_1.Command();
|
|
27
|
+
const runner = new subprocess_1.NodeSubprocessRunner();
|
|
28
|
+
const deps = { runner };
|
|
29
|
+
// Commands blocked when --repo is a git URL (read-only remote mode).
|
|
30
|
+
// Subcommand parents (hooks, recipients) are checked separately.
|
|
31
|
+
const REMOTE_WRITE_COMMANDS = new Set([
|
|
32
|
+
"set",
|
|
33
|
+
"delete",
|
|
34
|
+
"rotate",
|
|
35
|
+
"init",
|
|
36
|
+
"import",
|
|
37
|
+
"ui",
|
|
38
|
+
"update",
|
|
39
|
+
"merge-driver",
|
|
40
|
+
]);
|
|
41
|
+
function isWriteCommand(name, parentName) {
|
|
42
|
+
if (REMOTE_WRITE_COMMANDS.has(name))
|
|
43
|
+
return true;
|
|
44
|
+
if (parentName === "recipients" && (name === "add" || name === "remove"))
|
|
45
|
+
return true;
|
|
46
|
+
if (parentName === "hooks")
|
|
47
|
+
return true;
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
program
|
|
51
|
+
.name("clef")
|
|
52
|
+
.option("--repo <path>", "Path to the Clef repository root or a git URL (SSH or HTTPS)")
|
|
53
|
+
.option("--branch <branch>", "Branch to check out when --repo is a git URL (default: remote HEAD)")
|
|
54
|
+
.option("--plain", "Plain output, no emoji or colour");
|
|
55
|
+
// Resolve --plain and remote --repo before any command runs.
|
|
56
|
+
program.hook("preAction", async (_thisCommand, actionCommand) => {
|
|
57
|
+
const opts = program.opts();
|
|
58
|
+
if (opts.plain) {
|
|
59
|
+
(0, symbols_1.setPlainMode)(true);
|
|
60
|
+
}
|
|
61
|
+
if (opts.repo && (0, core_1.isGitUrl)(opts.repo)) {
|
|
62
|
+
const commandName = actionCommand.name();
|
|
63
|
+
const parentName = actionCommand.parent?.name();
|
|
64
|
+
if (isWriteCommand(commandName, parentName)) {
|
|
65
|
+
formatter_1.formatter.error(`'clef ${commandName}' is not supported when --repo is a URL. ` +
|
|
66
|
+
`Clone the repository locally to make changes.`);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const localPath = await (0, core_1.resolveRemoteRepo)(opts.repo, opts.branch, runner);
|
|
71
|
+
program.setOptionValue("repo", localPath);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
formatter_1.formatter.error(`Remote repository error: ${err.message}`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// Custom help
|
|
80
|
+
program.addHelpText("beforeAll", () => {
|
|
81
|
+
const clef = (0, symbols_1.isPlainMode)() ? "clef" : symbols_1.symbols.clef;
|
|
82
|
+
return `${clef} Clef \u2014 git-native secrets management\n`;
|
|
83
|
+
});
|
|
84
|
+
program.description("Organise, encrypt, and manage secrets across\n" +
|
|
85
|
+
" environments. Built on SOPS and age.\n\n" +
|
|
86
|
+
" Docs: https://docs.clef.sh");
|
|
87
|
+
// Custom version display
|
|
88
|
+
program.configureOutput({
|
|
89
|
+
writeOut: (str) => process.stdout.write(str),
|
|
90
|
+
writeErr: (str) => process.stderr.write(str),
|
|
91
|
+
outputError: (str, write) => write(str),
|
|
92
|
+
});
|
|
93
|
+
// Override version display to include 𝄞
|
|
94
|
+
program.version(VERSION, "-V, --version", "output the version number");
|
|
95
|
+
program.on("option:version", () => {
|
|
96
|
+
const clef = (0, symbols_1.isPlainMode)() ? "clef" : symbols_1.symbols.clef;
|
|
97
|
+
process.stdout.write(`${clef} clef ${VERSION}\n`);
|
|
98
|
+
process.exit(0);
|
|
99
|
+
});
|
|
100
|
+
(0, init_1.registerInitCommand)(program, deps);
|
|
101
|
+
(0, get_1.registerGetCommand)(program, deps);
|
|
102
|
+
(0, set_1.registerSetCommand)(program, deps);
|
|
103
|
+
(0, delete_1.registerDeleteCommand)(program, deps);
|
|
104
|
+
(0, diff_1.registerDiffCommand)(program, deps);
|
|
105
|
+
(0, lint_1.registerLintCommand)(program, deps);
|
|
106
|
+
(0, rotate_1.registerRotateCommand)(program, deps);
|
|
107
|
+
(0, hooks_1.registerHooksCommand)(program, deps);
|
|
108
|
+
(0, ui_1.registerUiCommand)(program, deps);
|
|
109
|
+
(0, exec_1.registerExecCommand)(program, deps);
|
|
110
|
+
(0, export_1.registerExportCommand)(program, deps);
|
|
111
|
+
(0, import_1.registerImportCommand)(program, deps);
|
|
112
|
+
(0, doctor_1.registerDoctorCommand)(program, deps);
|
|
113
|
+
(0, update_1.registerUpdateCommand)(program, deps);
|
|
114
|
+
(0, scan_1.registerScanCommand)(program, deps);
|
|
115
|
+
(0, recipients_1.registerRecipientsCommand)(program, deps);
|
|
116
|
+
(0, merge_driver_1.registerMergeDriverCommand)(program, deps);
|
|
117
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
118
|
+
formatter_1.formatter.error(err.message);
|
|
119
|
+
process.exit(1);
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SopsMissingError, SopsVersionError } from "@clef-sh/core";
|
|
2
|
+
export declare const formatter: {
|
|
3
|
+
success(message: string): void;
|
|
4
|
+
failure(message: string): void;
|
|
5
|
+
error(message: string): void;
|
|
6
|
+
warn(message: string): void;
|
|
7
|
+
info(message: string): void;
|
|
8
|
+
hint(message: string): void;
|
|
9
|
+
keyValue(key: string, value: string): void;
|
|
10
|
+
pendingItem(key: string, days: number): void;
|
|
11
|
+
recipientItem(label: string, keyPreview: string): void;
|
|
12
|
+
section(label: string): void;
|
|
13
|
+
print(message: string): void;
|
|
14
|
+
raw(message: string): void;
|
|
15
|
+
table(rows: string[][], columns: string[]): void;
|
|
16
|
+
confirm(prompt: string): Promise<boolean>;
|
|
17
|
+
formatDependencyError(err: SopsMissingError | SopsVersionError): void;
|
|
18
|
+
secretPrompt(prompt: string): Promise<string>;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOnE,eAAO,MAAM,SAAS;qBACH,MAAM,GAAG,IAAI;qBAKb,MAAM,GAAG,IAAI;mBAKf,MAAM,GAAG,IAAI;kBAKd,MAAM,GAAG,IAAI;kBAKb,MAAM,GAAG,IAAI;kBAKb,MAAM,GAAG,IAAI;kBAKb,MAAM,SAAS,MAAM,GAAG,IAAI;qBAOzB,MAAM,QAAQ,MAAM,GAAG,IAAI;yBAMvB,MAAM,cAAc,MAAM,GAAG,IAAI;mBAMvC,MAAM,GAAG,IAAI;mBAIb,MAAM,GAAG,IAAI;iBAIf,MAAM,GAAG,IAAI;gBAId,MAAM,EAAE,EAAE,WAAW,MAAM,EAAE,GAAG,IAAI;oBAqB1B,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;+BAcpB,gBAAgB,GAAG,gBAAgB,GAAG,IAAI;yBAoB1C,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA4CpD,CAAC"}
|