@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,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|