@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,499 @@
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.registerInitCommand = registerInitCommand;
37
+ exports.scaffoldSopsConfig = scaffoldSopsConfig;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const readline = __importStar(require("readline"));
41
+ const YAML = __importStar(require("yaml"));
42
+ const core_1 = require("@clef-sh/core");
43
+ const formatter_1 = require("../output/formatter");
44
+ const CLEF_DIR = ".clef";
45
+ const CLEF_CONFIG_FILENAME = "config.yaml";
46
+ const DEFAULT_CLEFIGNORE = `# .clefignore
47
+ # Files excluded from clef scan.
48
+ # See https://docs.clef.sh/cli/scan
49
+
50
+ # Dependencies
51
+ node_modules/
52
+ vendor/
53
+ .yarn/
54
+
55
+ # Build output
56
+ dist/
57
+ build/
58
+ .next/
59
+ .nuxt/
60
+
61
+ # Lock files (high entropy but not secrets)
62
+ *.lock
63
+ package-lock.json
64
+ yarn.lock
65
+ `;
66
+ function defaultAgeKeyPath() {
67
+ return path.join(process.env.HOME || process.env.USERPROFILE || "", ".config", "clef", "keys.txt");
68
+ }
69
+ async function isInsideAnyGitRepo(keyPath) {
70
+ const { execFile } = await Promise.resolve().then(() => __importStar(require("child_process")));
71
+ const { promisify } = await Promise.resolve().then(() => __importStar(require("util")));
72
+ const execFileAsync = promisify(execFile);
73
+ const dir = path.dirname(path.resolve(keyPath));
74
+ try {
75
+ const { stdout } = await execFileAsync("git", ["-C", dir, "rev-parse", "--show-toplevel"]);
76
+ return stdout.trim().length > 0;
77
+ }
78
+ catch {
79
+ return false; // git command failed = not a git repo
80
+ }
81
+ }
82
+ async function promptKeyLocation(defaultPath) {
83
+ const answer = await promptWithDefault("Where should your age private key be stored? (must be outside any git repository)", defaultPath);
84
+ const resolved = path.resolve(answer);
85
+ if (await isInsideAnyGitRepo(resolved)) {
86
+ throw new Error(`Key path '${answer}' is inside a git repository. Choose a path outside any git repo to keep your private key secure.`);
87
+ }
88
+ return resolved;
89
+ }
90
+ function registerInitCommand(program, deps) {
91
+ program
92
+ .command("init")
93
+ .description("Initialise a new Clef repo with a manifest, encrypted file matrix, and pre-commit hook")
94
+ .option("--environments <envs>", "Comma-separated list of environments", "dev,staging,production")
95
+ .option("--namespaces <namespaces>", "Comma-separated list of namespaces")
96
+ .option("--backend <backend>", "SOPS encryption backend (age, awskms, gcpkms, pgp)", "age")
97
+ .option("--non-interactive", "Skip interactive prompts and use defaults/flags")
98
+ .option("--random-values", "Scaffold required schema keys with random placeholder values (marks them as pending)")
99
+ .option("--include-optional", "When used with --random-values, also scaffold optional keys")
100
+ .action(async (options) => {
101
+ try {
102
+ const repoRoot = program.opts().repo || process.cwd();
103
+ const manifestPath = path.join(repoRoot, "clef.yaml");
104
+ const clefConfigPath = path.join(repoRoot, CLEF_DIR, CLEF_CONFIG_FILENAME);
105
+ const manifestExists = fs.existsSync(manifestPath);
106
+ const localConfigExists = fs.existsSync(clefConfigPath);
107
+ // Idempotency: both exist — already initialised
108
+ if (manifestExists && localConfigExists) {
109
+ formatter_1.formatter.print("Already initialised. Run 'clef update' to scaffold new environments.");
110
+ process.exit(0);
111
+ return;
112
+ }
113
+ // Second-dev onboarding: manifest exists but local config missing
114
+ if (manifestExists && !localConfigExists) {
115
+ await handleSecondDevOnboarding(repoRoot, clefConfigPath, options);
116
+ return;
117
+ }
118
+ // Full setup: neither exists (or manifest is missing)
119
+ // Check dependencies first — fail fast with a clean error
120
+ try {
121
+ await (0, core_1.assertSops)(deps.runner);
122
+ }
123
+ catch (err) {
124
+ if (err instanceof core_1.SopsMissingError || err instanceof core_1.SopsVersionError) {
125
+ formatter_1.formatter.formatDependencyError(err);
126
+ process.exit(1);
127
+ return;
128
+ }
129
+ /* istanbul ignore next -- only reachable if assertSops throws a non-dependency error */
130
+ throw err;
131
+ }
132
+ await handleFullSetup(repoRoot, manifestPath, clefConfigPath, deps, options);
133
+ }
134
+ catch (err) {
135
+ formatter_1.formatter.error(err.message);
136
+ process.exit(1);
137
+ }
138
+ });
139
+ }
140
+ async function handleSecondDevOnboarding(repoRoot, clefConfigPath, options) {
141
+ let keyPath;
142
+ if (options.nonInteractive || !process.stdin.isTTY) {
143
+ // Non-interactive: use SOPS_AGE_KEY_FILE env or default
144
+ keyPath = process.env.SOPS_AGE_KEY_FILE || defaultAgeKeyPath();
145
+ keyPath = path.resolve(keyPath);
146
+ }
147
+ else {
148
+ keyPath = await promptKeyLocation(defaultAgeKeyPath());
149
+ }
150
+ if (await isInsideAnyGitRepo(keyPath)) {
151
+ throw new Error(`Key path '${keyPath}' is inside a git repository. Choose a path outside any git repo to keep your private key secure.`);
152
+ }
153
+ // Write .clef/config.yaml and .clef/.gitignore
154
+ const clefDir = path.dirname(clefConfigPath);
155
+ if (!fs.existsSync(clefDir)) {
156
+ fs.mkdirSync(clefDir, { recursive: true });
157
+ }
158
+ const config = { age_key_file: keyPath };
159
+ fs.writeFileSync(clefConfigPath, YAML.stringify(config), "utf-8");
160
+ formatter_1.formatter.success("Created .clef/config.yaml");
161
+ const gitignorePath = path.join(clefDir, ".gitignore");
162
+ if (!fs.existsSync(gitignorePath)) {
163
+ fs.writeFileSync(gitignorePath, "*\n", "utf-8");
164
+ formatter_1.formatter.success("Created .clef/.gitignore");
165
+ }
166
+ formatter_1.formatter.section("Next steps:");
167
+ formatter_1.formatter.hint("clef update — scaffold new environments");
168
+ formatter_1.formatter.hint("clef lint — check repo health");
169
+ }
170
+ async function handleFullSetup(repoRoot, manifestPath, clefConfigPath, deps, options) {
171
+ let environments = (options.environments ?? "dev,staging,production")
172
+ .split(",")
173
+ .map((s) => s.trim());
174
+ let namespaces = options.namespaces
175
+ ? options.namespaces.split(",").map((s) => s.trim())
176
+ : [];
177
+ const backend = options.backend ?? "age";
178
+ if (!options.nonInteractive && process.stdin.isTTY) {
179
+ const envAnswer = await promptWithDefault("Environments (comma-separated)", environments.join(","));
180
+ environments = envAnswer.split(",").map((s) => s.trim());
181
+ if (namespaces.length === 0) {
182
+ const nsAnswer = await promptWithDefault("Namespaces (comma-separated)", "");
183
+ if (nsAnswer) {
184
+ namespaces = nsAnswer.split(",").map((s) => s.trim());
185
+ }
186
+ }
187
+ }
188
+ if (namespaces.length === 0) {
189
+ formatter_1.formatter.error("At least one namespace is required. Use --namespaces or provide interactively.");
190
+ process.exit(1);
191
+ return;
192
+ }
193
+ const manifest = {
194
+ version: 1,
195
+ environments: environments.map((name, _i) => ({
196
+ name,
197
+ description: name === "production"
198
+ ? "Live system"
199
+ : name === "staging"
200
+ ? "Pre-production"
201
+ : "Local development",
202
+ ...(name === "production" ? { protected: true } : {}),
203
+ })),
204
+ namespaces: namespaces.map((name) => ({
205
+ name,
206
+ description: `${name.charAt(0).toUpperCase() + name.slice(1)} configuration`,
207
+ })),
208
+ sops: {
209
+ default_backend: backend,
210
+ },
211
+ file_pattern: "{namespace}/{environment}.enc.yaml",
212
+ };
213
+ // Validate the manifest
214
+ const initParser = new core_1.ManifestParser();
215
+ initParser.validate(manifest);
216
+ // Write clef.yaml
217
+ fs.writeFileSync(manifestPath, YAML.stringify(manifest), "utf-8");
218
+ formatter_1.formatter.success("Created clef.yaml");
219
+ // Handle age backend: generate key and write local config
220
+ let ageKeyFile;
221
+ if (backend === "age") {
222
+ // Determine key path
223
+ let keyPath;
224
+ if (options.nonInteractive || !process.stdin.isTTY) {
225
+ keyPath = defaultAgeKeyPath();
226
+ if (await isInsideAnyGitRepo(path.resolve(keyPath))) {
227
+ throw new Error(`Default key path '${keyPath}' is inside a git repository. Set HOME to a non-git location.`);
228
+ }
229
+ }
230
+ else {
231
+ keyPath = await promptKeyLocation(defaultAgeKeyPath());
232
+ }
233
+ // Generate age key pair
234
+ const identity = await (0, core_1.generateAgeIdentity)();
235
+ const keyContent = (0, core_1.formatAgeKeyFile)(identity.privateKey, identity.publicKey);
236
+ // Write key file
237
+ const keyDir = path.dirname(keyPath);
238
+ if (!fs.existsSync(keyDir)) {
239
+ fs.mkdirSync(keyDir, { recursive: true });
240
+ }
241
+ fs.writeFileSync(keyPath, keyContent, { encoding: "utf-8", mode: 0o600 });
242
+ formatter_1.formatter.success(`Generated age key at ${keyPath}`);
243
+ ageKeyFile = keyPath;
244
+ // Write .clef/config.yaml and .clef/.gitignore
245
+ const clefDir = path.dirname(clefConfigPath);
246
+ if (!fs.existsSync(clefDir)) {
247
+ fs.mkdirSync(clefDir, { recursive: true });
248
+ }
249
+ const config = { age_key_file: keyPath };
250
+ fs.writeFileSync(clefConfigPath, YAML.stringify(config), "utf-8");
251
+ formatter_1.formatter.success("Created .clef/config.yaml");
252
+ const gitignorePath = path.join(clefDir, ".gitignore");
253
+ if (!fs.existsSync(gitignorePath)) {
254
+ fs.writeFileSync(gitignorePath, "*\n", "utf-8");
255
+ formatter_1.formatter.success("Created .clef/.gitignore");
256
+ }
257
+ // Generate .sops.yaml using the new public key
258
+ const sopsYamlPath = path.join(repoRoot, ".sops.yaml");
259
+ const sopsConfig = buildSopsYaml(manifest, repoRoot, identity.publicKey);
260
+ fs.writeFileSync(sopsYamlPath, YAML.stringify(sopsConfig), "utf-8");
261
+ formatter_1.formatter.success("Created .sops.yaml");
262
+ }
263
+ else {
264
+ // Non-age backend: generate .sops.yaml without a key
265
+ const sopsYamlPath = path.join(repoRoot, ".sops.yaml");
266
+ const sopsConfig = buildSopsYaml(manifest, repoRoot, undefined);
267
+ fs.writeFileSync(sopsYamlPath, YAML.stringify(sopsConfig), "utf-8");
268
+ formatter_1.formatter.success("Created .sops.yaml");
269
+ }
270
+ // Scaffold the matrix
271
+ const sopsClient = new core_1.SopsClient(deps.runner, ageKeyFile);
272
+ const matrixManager = new core_1.MatrixManager();
273
+ const cells = matrixManager.resolveMatrix(manifest, repoRoot);
274
+ let scaffoldedCount = 0;
275
+ for (const cell of cells) {
276
+ if (!cell.exists) {
277
+ try {
278
+ await matrixManager.scaffoldCell(cell, sopsClient, manifest);
279
+ scaffoldedCount++;
280
+ }
281
+ catch (err) {
282
+ formatter_1.formatter.warn(`Could not scaffold ${cell.namespace}/${cell.environment}: ${err.message}`);
283
+ }
284
+ }
285
+ }
286
+ if (scaffoldedCount > 0) {
287
+ formatter_1.formatter.success(`Scaffolded ${scaffoldedCount} encrypted file(s)`);
288
+ }
289
+ // --random-values: populate schema keys with random placeholders
290
+ if (options.randomValues) {
291
+ const schemaValidator = new core_1.SchemaValidator();
292
+ let pendingTotal = 0;
293
+ for (const ns of manifest.namespaces) {
294
+ if (!ns.schema) {
295
+ formatter_1.formatter.warn(`${ns.name} — no schema defined, skipped.\n` +
296
+ ` To scaffold manually: clef set ${ns.name}/<environment> <KEY> --random`);
297
+ continue;
298
+ }
299
+ /* istanbul ignore next -- init creates namespaces without schema; this path only runs if a user edits clef.yaml before running init */
300
+ await scaffoldRandomValues(ns, manifest, schemaValidator, sopsClient, repoRoot, options.includeOptional,
301
+ /* istanbul ignore next */ (count) => {
302
+ pendingTotal += count;
303
+ });
304
+ }
305
+ /* istanbul ignore next -- pendingTotal is always 0 during init since namespaces have no schema */
306
+ if (pendingTotal > 0) {
307
+ formatter_1.formatter.success(`Scaffolded ${pendingTotal} random placeholder value(s) — replace with real secrets using clef set`);
308
+ }
309
+ }
310
+ // Create .clefignore if it doesn't exist
311
+ const clefignorePath = path.join(repoRoot, ".clefignore");
312
+ if (!fs.existsSync(clefignorePath)) {
313
+ fs.writeFileSync(clefignorePath, DEFAULT_CLEFIGNORE, "utf-8");
314
+ formatter_1.formatter.success("Created .clefignore");
315
+ }
316
+ else {
317
+ formatter_1.formatter.print(" .clefignore already exists — skipping");
318
+ }
319
+ // Install git hooks and merge driver
320
+ try {
321
+ const git = new core_1.GitIntegration(deps.runner);
322
+ await git.installPreCommitHook(repoRoot);
323
+ formatter_1.formatter.success("Installed pre-commit hook");
324
+ await git.installMergeDriver(repoRoot);
325
+ formatter_1.formatter.success("Configured SOPS merge driver");
326
+ }
327
+ catch {
328
+ formatter_1.formatter.warn("Could not install git hooks. Run 'clef hooks install' inside a git repository.");
329
+ }
330
+ formatter_1.formatter.section("Next steps:");
331
+ formatter_1.formatter.hint("clef set <namespace>/<env> <KEY> <value> \u2014 add a secret");
332
+ formatter_1.formatter.hint("clef scan \u2014 check for existing plaintext secrets");
333
+ formatter_1.formatter.hint("clef lint \u2014 check repo health");
334
+ formatter_1.formatter.hint("clef ui \u2014 open the web UI");
335
+ }
336
+ /**
337
+ * Generate .sops.yaml from a manifest and write it to disk.
338
+ * Used by `clef init` and `clef doctor --fix`.
339
+ */
340
+ function scaffoldSopsConfig(repoRoot) {
341
+ const manifestPath = path.join(repoRoot, "clef.yaml");
342
+ const parser = new core_1.ManifestParser();
343
+ const manifest = parser.parse(manifestPath);
344
+ const sopsYamlPath = path.join(repoRoot, ".sops.yaml");
345
+ // Resolve age public key from environment or local config
346
+ let agePublicKey;
347
+ if (manifest.sops.default_backend === "age") {
348
+ agePublicKey = resolveAgePublicKeyFromEnvOrFile(repoRoot);
349
+ }
350
+ const sopsConfig = buildSopsYaml(manifest, repoRoot, agePublicKey);
351
+ fs.writeFileSync(sopsYamlPath, YAML.stringify(sopsConfig), "utf-8");
352
+ }
353
+ function buildSopsYaml(manifest, _repoRoot, agePublicKey) {
354
+ const creationRules = [];
355
+ for (const ns of manifest.namespaces) {
356
+ for (const env of manifest.environments) {
357
+ const pathRegex = `${ns.name}/${env.name}\\.enc\\.yaml$`;
358
+ const rule = { path_regex: pathRegex };
359
+ // Resolve the effective backend for this environment, respecting per-env overrides
360
+ const backend = env.sops?.backend ?? manifest.sops.default_backend;
361
+ switch (backend) {
362
+ case "age": {
363
+ const envRecipients = (0, core_1.resolveRecipientsForEnvironment)(manifest, env.name);
364
+ if (envRecipients && envRecipients.length > 0) {
365
+ const keys = envRecipients.map((r) => (typeof r === "string" ? r : r.key));
366
+ rule.age = keys.join(",");
367
+ }
368
+ else if (agePublicKey) {
369
+ rule.age = agePublicKey;
370
+ }
371
+ break;
372
+ }
373
+ case "awskms": {
374
+ const arn = env.sops?.aws_kms_arn ?? manifest.sops.aws_kms_arn;
375
+ if (arn) {
376
+ rule.kms = arn;
377
+ }
378
+ break;
379
+ }
380
+ case "gcpkms": {
381
+ const resourceId = env.sops?.gcp_kms_resource_id ?? manifest.sops.gcp_kms_resource_id;
382
+ if (resourceId) {
383
+ rule.gcp_kms = resourceId;
384
+ }
385
+ break;
386
+ }
387
+ case "pgp": {
388
+ const fingerprint = env.sops?.pgp_fingerprint ?? manifest.sops.pgp_fingerprint;
389
+ if (fingerprint) {
390
+ rule.pgp = fingerprint;
391
+ }
392
+ break;
393
+ }
394
+ }
395
+ creationRules.push(rule);
396
+ }
397
+ }
398
+ return { creation_rules: creationRules };
399
+ }
400
+ /**
401
+ * Resolve the age public key for .sops.yaml generation.
402
+ * Checks (in order): SOPS_AGE_KEY_FILE env, SOPS_AGE_KEY env, .clef/config.yaml, default path.
403
+ */
404
+ function resolveAgePublicKeyFromEnvOrFile(repoRoot) {
405
+ // 1. Try SOPS_AGE_KEY_FILE env
406
+ if (process.env.SOPS_AGE_KEY_FILE) {
407
+ const pubKey = extractAgePublicKey(process.env.SOPS_AGE_KEY_FILE);
408
+ if (pubKey)
409
+ return pubKey;
410
+ }
411
+ // 2. Try SOPS_AGE_KEY env (inline key — extract public key comment)
412
+ if (process.env.SOPS_AGE_KEY) {
413
+ const match = process.env.SOPS_AGE_KEY.match(/# public key: (age1[a-z0-9]+)/);
414
+ if (match)
415
+ return match[1];
416
+ }
417
+ // 3. Try .clef/config.yaml
418
+ const clefConfigPath = path.join(repoRoot, CLEF_DIR, CLEF_CONFIG_FILENAME);
419
+ if (fs.existsSync(clefConfigPath)) {
420
+ try {
421
+ const config = YAML.parse(fs.readFileSync(clefConfigPath, "utf-8"));
422
+ if (config?.age_key_file) {
423
+ const pubKey = extractAgePublicKey(config.age_key_file);
424
+ if (pubKey)
425
+ return pubKey;
426
+ }
427
+ }
428
+ catch {
429
+ // ignore parse errors
430
+ }
431
+ }
432
+ // 4. Try default SOPS path
433
+ const defaultPath = path.join(process.env.HOME || process.env.USERPROFILE || "", ".config", "sops", "age", "keys.txt");
434
+ const pubKey = extractAgePublicKey(defaultPath);
435
+ if (pubKey)
436
+ return pubKey;
437
+ return undefined;
438
+ }
439
+ function extractAgePublicKey(keyFilePath) {
440
+ try {
441
+ if (!fs.existsSync(keyFilePath))
442
+ return undefined;
443
+ const content = fs.readFileSync(keyFilePath, "utf-8");
444
+ const match = content.match(/# public key: (age1[a-z0-9]+)/);
445
+ return match ? match[1] : undefined;
446
+ }
447
+ catch {
448
+ return undefined;
449
+ }
450
+ }
451
+ /* istanbul ignore next -- only reachable if a namespace has a schema field, which init never sets */
452
+ async function scaffoldRandomValues(ns, manifest, schemaValidator, sopsClient, repoRoot, includeOptional, addCount) {
453
+ let schema;
454
+ try {
455
+ schema = schemaValidator.loadSchema(path.join(repoRoot, ns.schema));
456
+ }
457
+ catch {
458
+ formatter_1.formatter.warn(`Could not load schema for namespace '${ns.name}' — skipping random scaffolding.`);
459
+ return;
460
+ }
461
+ const keysToScaffold = Object.entries(schema.keys).filter(([, def]) => includeOptional ? true : def.required);
462
+ if (keysToScaffold.length === 0)
463
+ return;
464
+ for (const env of manifest.environments) {
465
+ const filePath = path.join(repoRoot, manifest.file_pattern.replace("{namespace}", ns.name).replace("{environment}", env.name));
466
+ try {
467
+ const decrypted = await sopsClient.decrypt(filePath);
468
+ const pendingKeys = [];
469
+ for (const [keyName] of keysToScaffold) {
470
+ if (decrypted.values[keyName] === undefined) {
471
+ decrypted.values[keyName] = (0, core_1.generateRandomValue)();
472
+ pendingKeys.push(keyName);
473
+ }
474
+ }
475
+ if (pendingKeys.length > 0) {
476
+ await sopsClient.encrypt(filePath, decrypted.values, manifest, env.name);
477
+ await (0, core_1.markPending)(filePath, pendingKeys, "clef init --random-values");
478
+ addCount(pendingKeys.length);
479
+ }
480
+ }
481
+ catch (err) {
482
+ formatter_1.formatter.warn(`Could not scaffold random values for ${ns.name}/${env.name}: ${err.message}`);
483
+ }
484
+ }
485
+ }
486
+ function promptWithDefault(message, defaultValue) {
487
+ const rl = readline.createInterface({
488
+ input: process.stdin,
489
+ output: process.stderr,
490
+ });
491
+ const prompt = defaultValue ? `${message} [${defaultValue}]: ` : `${message}: `;
492
+ return new Promise((resolve) => {
493
+ rl.question(prompt, (answer) => {
494
+ rl.close();
495
+ resolve(answer.trim() || defaultValue);
496
+ });
497
+ });
498
+ }
499
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqFA,kDA6DC;AA2QD,gDAYC;AAzaD,uCAAyB;AACzB,2CAA6B;AAC7B,mDAAqC;AACrC,2CAA6B;AAE7B,wCAiBuB;AACvB,mDAAgD;AAEhD,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAE3C,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;CAmB1B,CAAC;AAEF,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,IAAI,CACd,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EACjD,SAAS,EACT,MAAM,EACN,UAAU,CACX,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC/C,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,eAAe,GAAC,CAAC;IACnD,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,CAAC,sCAAsC;IACtD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IAClD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,mFAAmF,EACnF,WAAW,CACZ,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,MAAM,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,aAAa,MAAM,mGAAmG,CACvH,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB,EAAE,IAAkC;IACtF,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,wFAAwF,CACzF;SACA,MAAM,CACL,uBAAuB,EACvB,sCAAsC,EACtC,wBAAwB,CACzB;SACA,MAAM,CAAC,2BAA2B,EAAE,oCAAoC,CAAC;SACzE,MAAM,CAAC,qBAAqB,EAAE,oDAAoD,EAAE,KAAK,CAAC;SAC1F,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,CAAC;SAC9E,MAAM,CACL,iBAAiB,EACjB,sFAAsF,CACvF;SACA,MAAM,CAAC,oBAAoB,EAAE,6DAA6D,CAAC;SAC3F,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAI,OAAO,CAAC,IAAI,EAAE,CAAC,IAAe,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAClE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACtD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;YAE3E,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACnD,MAAM,iBAAiB,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAExD,gDAAgD;YAChD,IAAI,cAAc,IAAI,iBAAiB,EAAE,CAAC;gBACxC,qBAAS,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;gBACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,kEAAkE;YAClE,IAAI,cAAc,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzC,MAAM,yBAAyB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;gBACnE,OAAO;YACT,CAAC;YAED,sDAAsD;YACtD,0DAA0D;YAC1D,IAAI,CAAC;gBACH,MAAM,IAAA,iBAAU,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,uBAAgB,IAAI,GAAG,YAAY,uBAAgB,EAAE,CAAC;oBACvE,qBAAS,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;oBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAChB,OAAO;gBACT,CAAC;gBACD,wFAAwF;gBACxF,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,MAAM,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/E,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;AAED,KAAK,UAAU,yBAAyB,CACtC,QAAgB,EAChB,cAAsB,EACtB,OAAqC;IAErC,IAAI,OAAe,CAAC;IAEpB,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnD,wDAAwD;QACxD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,iBAAiB,EAAE,CAAC;QAC/D,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,MAAM,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,aAAa,OAAO,mGAAmG,CACxH,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,MAAM,GAAoB,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,qBAAS,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAChD,qBAAS,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IAED,qBAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACjC,qBAAS,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC3D,qBAAS,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,QAAgB,EAChB,YAAoB,EACpB,cAAsB,EACtB,IAAkC,EAClC,OAOC;IAED,IAAI,YAAY,GAAa,CAAC,OAAO,CAAC,YAAY,IAAI,wBAAwB,CAAC;SAC5E,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,IAAI,UAAU,GAAa,OAAO,CAAC,UAAU;QAC3C,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAW,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAEjD,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,MAAM,iBAAiB,CACvC,gCAAgC,EAChC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CACvB,CAAC;QACF,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAEzD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;YAC7E,IAAI,QAAQ,EAAE,CAAC;gBACb,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,qBAAS,CAAC,KAAK,CACb,gFAAgF,CACjF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAiB;QAC7B,OAAO,EAAE,CAAC;QACV,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5C,IAAI;YACJ,WAAW,EACT,IAAI,KAAK,YAAY;gBACnB,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,IAAI,KAAK,SAAS;oBAClB,CAAC,CAAC,gBAAgB;oBAClB,CAAC,CAAC,mBAAmB;YAC3B,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI;YACJ,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB;SAC7E,CAAC,CAAC;QACH,IAAI,EAAE;YACJ,eAAe,EAAE,OAAkD;SACpE;QACD,YAAY,EAAE,oCAAoC;KACnD,CAAC;IAEF,wBAAwB;IACxB,MAAM,UAAU,GAAG,IAAI,qBAAc,EAAE,CAAC;IACxC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE9B,kBAAkB;IAClB,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,qBAAS,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEvC,0DAA0D;IAC1D,IAAI,UAA8B,CAAC;IACnC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,qBAAqB;QACrB,IAAI,OAAe,CAAC;QACpB,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnD,OAAO,GAAG,iBAAiB,EAAE,CAAC;YAC9B,IAAI,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CACb,qBAAqB,OAAO,+DAA+D,CAC5F,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,wBAAwB;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAmB,GAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAA,uBAAgB,EAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QAE7E,iBAAiB;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,qBAAS,CAAC,OAAO,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;QACrD,UAAU,GAAG,OAAO,CAAC;QAErB,+CAA+C;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,MAAM,GAAoB,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,qBAAS,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAChD,qBAAS,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;QAED,+CAA+C;QAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,qBAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,qDAAqD;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,qBAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,IAAI,iBAAU,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,oBAAa,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,aAAa,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE9D,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC7D,eAAe,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qBAAS,CAAC,IAAI,CACZ,sBAAsB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,KAAM,GAAa,CAAC,OAAO,EAAE,CACtF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,qBAAS,CAAC,OAAO,CAAC,cAAc,eAAe,oBAAoB,CAAC,CAAC;IACvE,CAAC;IAED,iEAAiE;IACjE,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,eAAe,GAAG,IAAI,sBAAe,EAAE,CAAC;QAC9C,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;gBACf,qBAAS,CAAC,IAAI,CACZ,GAAG,EAAE,CAAC,IAAI,kCAAkC;oBAC1C,oCAAoC,EAAE,CAAC,IAAI,+BAA+B,CAC7E,CAAC;gBACF,SAAS;YACX,CAAC;YAED,uIAAuI;YACvI,MAAM,oBAAoB,CACxB,EAAE,EACF,QAAQ,EACR,eAAe,EACf,UAAU,EACV,QAAQ,EACR,OAAO,CAAC,eAAe;YACvB,0BAA0B,CAAC,CAAC,KAAa,EAAE,EAAE;gBAC3C,YAAY,IAAI,KAAK,CAAC;YACxB,CAAC,CACF,CAAC;QACJ,CAAC;QAED,kGAAkG;QAClG,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,qBAAS,CAAC,OAAO,CACf,cAAc,YAAY,yEAAyE,CACpG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC9D,qBAAS,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,qBAAS,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,qBAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,GAAG,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACzC,qBAAS,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC/C,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACvC,qBAAS,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,qBAAS,CAAC,IAAI,CACZ,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,qBAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACjC,qBAAS,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAChF,qBAAS,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACzE,qBAAS,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACtD,qBAAS,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,QAAgB;IACjD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,qBAAc,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACvD,0DAA0D;IAC1D,IAAI,YAAgC,CAAC;IACrC,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;QAC5C,YAAY,GAAG,gCAAgC,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,aAAa,CACpB,QAAsB,EACtB,SAAiB,EACjB,YAAgC;IAEhC,MAAM,aAAa,GAA8B,EAAE,CAAC;IAEpD,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,gBAAgB,CAAC;YACzD,MAAM,IAAI,GAA4B,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;YAEhE,mFAAmF;YACnF,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC;YAEnE,QAAQ,OAAO,EAAE,CAAC;gBAChB,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,aAAa,GAAG,IAAA,sCAA+B,EAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC1E,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC3E,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC5B,CAAC;yBAAM,IAAI,YAAY,EAAE,CAAC;wBACxB,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;oBAC1B,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;oBAC/D,IAAI,GAAG,EAAE,CAAC;wBACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;oBACjB,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,mBAAmB,IAAI,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC;oBACtF,IAAI,UAAU,EAAE,CAAC;wBACf,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;oBAC5B,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,EAAE,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC;oBAC/E,IAAI,WAAW,EAAE,CAAC;wBAChB,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;oBACzB,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;YAED,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAS,gCAAgC,CAAC,QAAgB;IACxD,+BAA+B;IAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClE,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IAED,oEAAoE;IACpE,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9E,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,2BAA2B;IAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAC3E,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAoB,CAAC;YACvF,IAAI,MAAM,EAAE,YAAY,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACxD,IAAI,MAAM;oBAAE,OAAO,MAAM,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EACjD,SAAS,EACT,MAAM,EACN,KAAK,EACL,UAAU,CACX,CAAC;IACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,WAAmB;IAC9C,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,SAAS,CAAC;QAClD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,KAAK,UAAU,oBAAoB,CACjC,EAAqC,EACrC,QAAsB,EACtB,eAAgC,EAChC,UAAsB,EACtB,QAAgB,EAChB,eAAoC,EACpC,QAAiC;IAEjC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAO,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,qBAAS,CAAC,IAAI,CACZ,wCAAwC,EAAE,CAAC,IAAI,kCAAkC,CAClF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CACpE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CACtC,CAAC;IAEF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAExC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,QAAQ,EACR,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,CACzF,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,WAAW,GAAa,EAAE,CAAC;YAEjC,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,cAAc,EAAE,CAAC;gBACvC,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC5C,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAA,0BAAmB,GAAE,CAAC;oBAClD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzE,MAAM,IAAA,kBAAW,EAAC,QAAQ,EAAE,WAAW,EAAE,2BAA2B,CAAC,CAAC;gBACtE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qBAAS,CAAC,IAAI,CACZ,wCAAwC,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CACzF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,YAAoB;IAC9D,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC;IAEhF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAc,EAAE,EAAE;YACrC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ import { SubprocessRunner } from "@clef-sh/core";
3
+ export declare function registerLintCommand(program: Command, deps: {
4
+ runner: SubprocessRunner;
5
+ }): void;
6
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EASL,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAIvB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAiD9F"}