@chriscode/hush 5.0.0 → 5.0.2

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 (77) hide show
  1. package/dist/cli.js +39 -26
  2. package/dist/commands/check.d.ts +3 -3
  3. package/dist/commands/check.d.ts.map +1 -1
  4. package/dist/commands/check.js +27 -31
  5. package/dist/commands/decrypt.d.ts +2 -2
  6. package/dist/commands/decrypt.d.ts.map +1 -1
  7. package/dist/commands/decrypt.js +52 -55
  8. package/dist/commands/edit.d.ts +2 -2
  9. package/dist/commands/edit.d.ts.map +1 -1
  10. package/dist/commands/edit.js +10 -12
  11. package/dist/commands/encrypt.d.ts +2 -2
  12. package/dist/commands/encrypt.d.ts.map +1 -1
  13. package/dist/commands/encrypt.js +27 -29
  14. package/dist/commands/expansions.d.ts +2 -2
  15. package/dist/commands/expansions.d.ts.map +1 -1
  16. package/dist/commands/expansions.js +46 -44
  17. package/dist/commands/has.d.ts +2 -2
  18. package/dist/commands/has.d.ts.map +1 -1
  19. package/dist/commands/has.js +12 -15
  20. package/dist/commands/init.d.ts +2 -2
  21. package/dist/commands/init.d.ts.map +1 -1
  22. package/dist/commands/init.js +92 -100
  23. package/dist/commands/inspect.d.ts +2 -2
  24. package/dist/commands/inspect.d.ts.map +1 -1
  25. package/dist/commands/inspect.js +14 -16
  26. package/dist/commands/keys.d.ts +2 -1
  27. package/dist/commands/keys.d.ts.map +1 -1
  28. package/dist/commands/keys.js +47 -49
  29. package/dist/commands/list.d.ts +2 -2
  30. package/dist/commands/list.d.ts.map +1 -1
  31. package/dist/commands/list.js +11 -14
  32. package/dist/commands/migrate.d.ts +2 -1
  33. package/dist/commands/migrate.d.ts.map +1 -1
  34. package/dist/commands/migrate.js +38 -37
  35. package/dist/commands/push.d.ts +2 -2
  36. package/dist/commands/push.d.ts.map +1 -1
  37. package/dist/commands/push.js +41 -45
  38. package/dist/commands/resolve.d.ts +2 -2
  39. package/dist/commands/resolve.d.ts.map +1 -1
  40. package/dist/commands/resolve.js +25 -28
  41. package/dist/commands/run.d.ts +2 -2
  42. package/dist/commands/run.d.ts.map +1 -1
  43. package/dist/commands/run.js +35 -39
  44. package/dist/commands/set.d.ts +2 -2
  45. package/dist/commands/set.d.ts.map +1 -1
  46. package/dist/commands/set.js +61 -70
  47. package/dist/commands/skill.d.ts +2 -2
  48. package/dist/commands/skill.d.ts.map +1 -1
  49. package/dist/commands/skill.js +149 -459
  50. package/dist/commands/status.d.ts +2 -2
  51. package/dist/commands/status.d.ts.map +1 -1
  52. package/dist/commands/status.js +48 -52
  53. package/dist/commands/template.d.ts +2 -2
  54. package/dist/commands/template.d.ts.map +1 -1
  55. package/dist/commands/template.js +36 -39
  56. package/dist/commands/trace.d.ts +2 -2
  57. package/dist/commands/trace.d.ts.map +1 -1
  58. package/dist/commands/trace.js +16 -19
  59. package/dist/config/loader.js +3 -3
  60. package/dist/context.d.ts +3 -0
  61. package/dist/context.d.ts.map +1 -0
  62. package/dist/context.js +60 -0
  63. package/dist/core/parse.js +3 -3
  64. package/dist/core/sops.js +9 -9
  65. package/dist/core/template.d.ts +2 -2
  66. package/dist/core/template.d.ts.map +1 -1
  67. package/dist/core/template.js +11 -12
  68. package/dist/lib/age.js +9 -9
  69. package/dist/lib/fs.d.ts +25 -0
  70. package/dist/lib/fs.d.ts.map +1 -0
  71. package/dist/lib/fs.js +36 -0
  72. package/dist/lib/onepassword.d.ts.map +1 -1
  73. package/dist/lib/onepassword.js +41 -4
  74. package/dist/types.d.ts +92 -0
  75. package/dist/types.d.ts.map +1 -1
  76. package/dist/utils/version-check.js +5 -5
  77. package/package.json +3 -2
@@ -1,13 +1,11 @@
1
- import { existsSync, unlinkSync, readFileSync } from 'node:fs';
2
1
  import { join } from 'node:path';
3
2
  import pc from 'picocolors';
4
- import { loadConfig } from '../config/loader.js';
5
3
  import { encrypt as sopsEncrypt, decrypt as sopsDecrypt } from '../core/sops.js';
6
4
  import { parseEnvContent } from '../core/parse.js';
7
- export async function encryptCommand(options) {
5
+ export async function encryptCommand(ctx, options) {
8
6
  const { root } = options;
9
- const config = loadConfig(root);
10
- console.log(pc.blue('Encrypting secrets...\n'));
7
+ const config = ctx.config.loadConfig(root);
8
+ ctx.logger.log(pc.blue('Encrypting secrets...\n'));
11
9
  const sourceFiles = [
12
10
  { key: 'shared', path: config.sources.shared },
13
11
  { key: 'development', path: config.sources.development },
@@ -17,14 +15,14 @@ export async function encryptCommand(options) {
17
15
  for (const { key, path } of sourceFiles) {
18
16
  const sourcePath = join(root, path);
19
17
  const encryptedPath = sourcePath + '.encrypted';
20
- if (!existsSync(sourcePath)) {
21
- console.log(pc.dim(` ${path} - not found, skipping`));
18
+ if (!ctx.fs.existsSync(sourcePath)) {
19
+ ctx.logger.log(pc.dim(` ${path} - not found, skipping`));
22
20
  continue;
23
21
  }
24
- const sourceContent = readFileSync(sourcePath, 'utf-8');
22
+ const sourceContent = ctx.fs.readFileSync(sourcePath, 'utf-8');
25
23
  const vars = parseEnvContent(sourceContent);
26
24
  sopsEncrypt(sourcePath, encryptedPath);
27
- console.log(pc.green(` ${path}`) + pc.dim(` -> ${path}.encrypted (${vars.length} vars)`));
25
+ ctx.logger.log(pc.green(` ${path}`) + pc.dim(` -> ${path}.encrypted (${vars.length} vars)`));
28
26
  encryptedFiles.push({
29
27
  sourcePath,
30
28
  encryptedPath,
@@ -33,48 +31,48 @@ export async function encryptCommand(options) {
33
31
  });
34
32
  }
35
33
  if (encryptedFiles.length === 0) {
36
- console.error(pc.red('\nNo source files found to encrypt'));
37
- console.error(pc.dim('Create at least .hush with your secrets'));
38
- process.exit(1);
34
+ ctx.logger.error(pc.red('\nNo source files found to encrypt'));
35
+ ctx.logger.error(pc.dim('Create at least .hush with your secrets'));
36
+ ctx.process.exit(1);
39
37
  }
40
- console.log(pc.blue('\nVerifying encryption...'));
38
+ ctx.logger.log(pc.blue('\nVerifying encryption...'));
41
39
  let allVerified = true;
42
40
  for (const file of encryptedFiles) {
43
41
  try {
44
42
  const decrypted = sopsDecrypt(file.encryptedPath);
45
43
  const decryptedVars = parseEnvContent(decrypted);
46
44
  if (decryptedVars.length === file.originalKeyCount) {
47
- console.log(pc.green(` ${file.displayPath}.encrypted - verified (${decryptedVars.length} vars)`));
45
+ ctx.logger.log(pc.green(` ${file.displayPath}.encrypted - verified (${decryptedVars.length} vars)`));
48
46
  }
49
47
  else {
50
- console.log(pc.yellow(` ${file.displayPath}.encrypted - warning: expected ${file.originalKeyCount} vars, got ${decryptedVars.length}`));
48
+ ctx.logger.log(pc.yellow(` ${file.displayPath}.encrypted - warning: expected ${file.originalKeyCount} vars, got ${decryptedVars.length}`));
51
49
  allVerified = false;
52
50
  }
53
51
  }
54
52
  catch (error) {
55
- console.log(pc.red(` ${file.displayPath}.encrypted - FAILED to decrypt`));
56
- console.log(pc.dim(` ${error.message}`));
53
+ ctx.logger.log(pc.red(` ${file.displayPath}.encrypted - FAILED to decrypt`));
54
+ ctx.logger.log(pc.dim(` ${error.message}`));
57
55
  allVerified = false;
58
56
  }
59
57
  }
60
58
  if (!allVerified) {
61
- console.log(pc.yellow('\nEncryption completed but verification failed.'));
62
- console.log(pc.yellow('Plaintext files have NOT been deleted. Please check your setup.'));
63
- process.exit(1);
59
+ ctx.logger.log(pc.yellow('\nEncryption completed but verification failed.'));
60
+ ctx.logger.log(pc.yellow('Plaintext files have NOT been deleted. Please check your setup.'));
61
+ ctx.process.exit(1);
64
62
  }
65
- console.log(pc.blue('\nCleaning up plaintext files...'));
63
+ ctx.logger.log(pc.blue('\nCleaning up plaintext files...'));
66
64
  for (const file of encryptedFiles) {
67
65
  try {
68
- unlinkSync(file.sourcePath);
69
- console.log(pc.green(` Deleted ${file.displayPath}`));
66
+ ctx.fs.unlinkSync(file.sourcePath);
67
+ ctx.logger.log(pc.green(` Deleted ${file.displayPath}`));
70
68
  }
71
69
  catch (error) {
72
- console.log(pc.yellow(` Could not delete ${file.displayPath}: ${error.message}`));
70
+ ctx.logger.log(pc.yellow(` Could not delete ${file.displayPath}: ${error.message}`));
73
71
  }
74
72
  }
75
- console.log(pc.green(pc.bold(`\n✓ Encrypted ${encryptedFiles.length} file(s) and removed plaintext`)));
76
- console.log(pc.dim('\nNext steps:'));
77
- console.log(pc.dim(' 1. Commit the .encrypted files to git'));
78
- console.log(pc.dim(' 2. Use "npx hush run -- <command>" to run with secrets'));
79
- console.log(pc.dim(' 3. Use "npx hush inspect" to see what variables are set'));
73
+ ctx.logger.log(pc.green(pc.bold(`\n✓ Encrypted ${encryptedFiles.length} file(s) and removed plaintext`)));
74
+ ctx.logger.log(pc.dim('\nNext steps:'));
75
+ ctx.logger.log(pc.dim(' 1. Commit the .encrypted files to git'));
76
+ ctx.logger.log(pc.dim(' 2. Use "npx hush run -- <command>" to run with secrets'));
77
+ ctx.logger.log(pc.dim(' 3. Use "npx hush inspect" to see what variables are set'));
80
78
  }
@@ -1,7 +1,7 @@
1
- import type { Environment } from '../types.js';
1
+ import type { Environment, HushContext } from '../types.js';
2
2
  export interface ExpansionsOptions {
3
3
  root: string;
4
4
  env: Environment;
5
5
  }
6
- export declare function expansionsCommand(options: ExpansionsOptions): Promise<void>;
6
+ export declare function expansionsCommand(ctx: HushContext, options: ExpansionsOptions): Promise<void>;
7
7
  //# sourceMappingURL=expansions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expansions.d.ts","sourceRoot":"","sources":["../../src/commands/expansions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAU,MAAM,aAAa,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,WAAW,CAAC;CAClB;AA+DD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDjF"}
1
+ {"version":3,"file":"expansions.d.ts","sourceRoot":"","sources":["../../src/commands/expansions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAU,WAAW,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,WAAW,CAAC;CAClB;AAqED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDnG"}
@@ -1,32 +1,34 @@
1
- import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
1
  import { join, relative } from 'node:path';
3
2
  import pc from 'picocolors';
4
- import { findProjectRoot } from '../config/loader.js';
5
3
  import { parseEnvContent } from '../core/parse.js';
6
- const TEMPLATE_FILES = ['.env', '.env.development', '.env.production', '.env.local'];
7
- function findTemplateDirectories(projectRoot, maxDepth = 4) {
4
+ const TEMPLATE_FILES = ['.hush', '.hush.development', '.hush.production', '.hush.local'];
5
+ function findTemplateDirectories(ctx, projectRoot, maxDepth = 4) {
8
6
  const templateDirs = [];
9
7
  function walk(dir, depth) {
10
8
  if (depth > maxDepth)
11
9
  return;
12
- const hasTemplate = TEMPLATE_FILES.some(f => existsSync(join(dir, f)));
10
+ const hasTemplate = TEMPLATE_FILES.some(f => ctx.fs.existsSync(join(dir, f)));
13
11
  if (hasTemplate && dir !== projectRoot) {
14
12
  templateDirs.push(dir);
15
13
  }
16
14
  try {
17
- const entries = readdirSync(dir, { withFileTypes: true });
15
+ const entries = ctx.fs.readdirSync(dir);
18
16
  for (const entry of entries) {
19
- if (!entry.isDirectory())
17
+ const entryName = typeof entry === 'string' ? entry : entry.name;
18
+ if (entryName.startsWith('.') || entryName === 'node_modules')
20
19
  continue;
21
- if (entry.name.startsWith('.'))
20
+ if (entryName === 'dist' || entryName === 'build')
22
21
  continue;
23
- if (entry.name === 'node_modules')
22
+ const entryPath = join(dir, entryName);
23
+ try {
24
+ const stat = ctx.fs.statSync(entryPath);
25
+ if (stat.isDirectory()) {
26
+ walk(entryPath, depth + 1);
27
+ }
28
+ }
29
+ catch {
24
30
  continue;
25
- if (entry.name === 'dist')
26
- continue;
27
- if (entry.name === 'build')
28
- continue;
29
- walk(join(dir, entry.name), depth + 1);
31
+ }
30
32
  }
31
33
  }
32
34
  catch {
@@ -36,19 +38,19 @@ function findTemplateDirectories(projectRoot, maxDepth = 4) {
36
38
  walk(projectRoot, 0);
37
39
  return templateDirs;
38
40
  }
39
- function loadTemplateVars(dir, env) {
41
+ function loadTemplateVars(ctx, dir, env) {
40
42
  const varSources = [];
41
- const basePath = join(dir, '.env');
42
- if (existsSync(basePath)) {
43
- varSources.push(parseEnvContent(readFileSync(basePath, 'utf-8')));
43
+ const basePath = join(dir, '.hush');
44
+ if (ctx.fs.existsSync(basePath)) {
45
+ varSources.push(parseEnvContent(ctx.fs.readFileSync(basePath, 'utf-8')));
44
46
  }
45
- const envPath = join(dir, env === 'development' ? '.env.development' : '.env.production');
46
- if (existsSync(envPath)) {
47
- varSources.push(parseEnvContent(readFileSync(envPath, 'utf-8')));
47
+ const envPath = join(dir, env === 'development' ? '.hush.development' : '.hush.production');
48
+ if (ctx.fs.existsSync(envPath)) {
49
+ varSources.push(parseEnvContent(ctx.fs.readFileSync(envPath, 'utf-8')));
48
50
  }
49
- const localPath = join(dir, '.env.local');
50
- if (existsSync(localPath)) {
51
- varSources.push(parseEnvContent(readFileSync(localPath, 'utf-8')));
51
+ const localPath = join(dir, '.hush.local');
52
+ if (ctx.fs.existsSync(localPath)) {
53
+ varSources.push(parseEnvContent(ctx.fs.readFileSync(localPath, 'utf-8')));
52
54
  }
53
55
  const merged = {};
54
56
  for (const vars of varSources) {
@@ -58,46 +60,46 @@ function loadTemplateVars(dir, env) {
58
60
  }
59
61
  return Object.entries(merged).map(([key, value]) => ({ key, value }));
60
62
  }
61
- export async function expansionsCommand(options) {
63
+ export async function expansionsCommand(ctx, options) {
62
64
  const { root, env } = options;
63
- const projectInfo = findProjectRoot(root);
65
+ const projectInfo = ctx.config.findProjectRoot(root);
64
66
  if (!projectInfo) {
65
- console.error(pc.red('No hush.yaml found in current directory or any parent directory.'));
66
- console.error(pc.dim('Run: npx hush init'));
67
- process.exit(1);
67
+ ctx.logger.error(pc.red('No hush.yaml found in current directory or any parent directory.'));
68
+ ctx.logger.error(pc.dim('Run: npx hush init'));
69
+ ctx.process.exit(1);
68
70
  }
69
71
  const { projectRoot } = projectInfo;
70
- const templateDirs = findTemplateDirectories(projectRoot);
72
+ const templateDirs = findTemplateDirectories(ctx, projectRoot);
71
73
  if (templateDirs.length === 0) {
72
- console.log(pc.yellow('No subdirectory templates found.'));
73
- console.log(pc.dim('Templates are .env files in subdirectories that reference root secrets.'));
74
- console.log(pc.dim('Create apps/myapp/.env with content like: MY_VAR=${ROOT_SECRET}'));
74
+ ctx.logger.log(pc.yellow('No subdirectory templates found.'));
75
+ ctx.logger.log(pc.dim('Templates are .hush files in subdirectories that reference root secrets.'));
76
+ ctx.logger.log(pc.dim('Create apps/myapp/.hush with content like: MY_VAR=${ROOT_SECRET}'));
75
77
  return;
76
78
  }
77
- console.log('');
78
- console.log(pc.bold(`Expansion Graph (from ${projectRoot})`));
79
- console.log(pc.dim(`Environment: ${env}`));
80
- console.log('');
79
+ ctx.logger.log('');
80
+ ctx.logger.log(pc.bold(`Expansion Graph (from ${projectRoot})`));
81
+ ctx.logger.log(pc.dim(`Environment: ${env}`));
82
+ ctx.logger.log('');
81
83
  for (const dir of templateDirs) {
82
84
  const relPath = relative(projectRoot, dir);
83
- const vars = loadTemplateVars(dir, env);
85
+ const vars = loadTemplateVars(ctx, dir, env);
84
86
  const expansions = vars.filter(v => v.value.includes('${'));
85
87
  const literals = vars.filter(v => !v.value.includes('${'));
86
- console.log(pc.cyan(`${relPath}/`));
88
+ ctx.logger.log(pc.cyan(`${relPath}/`));
87
89
  if (expansions.length > 0) {
88
90
  for (const { key, value } of expansions) {
89
91
  const isEnvRef = value.includes('${env:');
90
92
  const symbol = isEnvRef ? pc.blue('←') : pc.green('←');
91
- console.log(` ${key.padEnd(30)} ${symbol} ${pc.dim(value)}`);
93
+ ctx.logger.log(` ${key.padEnd(30)} ${symbol} ${pc.dim(value)}`);
92
94
  }
93
95
  }
94
96
  if (literals.length > 0) {
95
97
  for (const { key } of literals) {
96
- console.log(` ${key.padEnd(30)} ${pc.dim('= (literal)')}`);
98
+ ctx.logger.log(` ${key.padEnd(30)} ${pc.dim('= (literal)')}`);
97
99
  }
98
100
  }
99
- console.log('');
101
+ ctx.logger.log('');
100
102
  }
101
- console.log(pc.dim(`Found ${templateDirs.length} subdirectory templates.`));
102
- console.log('');
103
+ ctx.logger.log(pc.dim(`Found ${templateDirs.length} subdirectory templates.`));
104
+ ctx.logger.log('');
103
105
  }
@@ -1,9 +1,9 @@
1
- import type { Environment } from '../types.js';
1
+ import type { Environment, HushContext } from '../types.js';
2
2
  export interface HasOptions {
3
3
  root: string;
4
4
  env: Environment;
5
5
  key: string;
6
6
  quiet: boolean;
7
7
  }
8
- export declare function hasCommand(options: HasOptions): Promise<void>;
8
+ export declare function hasCommand(ctx: HushContext, options: HasOptions): Promise<void>;
9
9
  //# sourceMappingURL=has.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"has.d.ts","sourceRoot":"","sources":["../../src/commands/has.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAU,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,WAAW,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CnE"}
1
+ {"version":3,"file":"has.d.ts","sourceRoot":"","sources":["../../src/commands/has.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAU,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,WAAW,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CrF"}
@@ -1,30 +1,27 @@
1
- import { existsSync } from 'node:fs';
2
1
  import { join } from 'node:path';
3
2
  import pc from 'picocolors';
4
- import { loadConfig } from '../config/loader.js';
5
3
  import { interpolateVars } from '../core/interpolate.js';
6
4
  import { mergeVars } from '../core/merge.js';
7
5
  import { parseEnvContent } from '../core/parse.js';
8
- import { decrypt as sopsDecrypt } from '../core/sops.js';
9
- export async function hasCommand(options) {
6
+ export async function hasCommand(ctx, options) {
10
7
  const { root, env, key, quiet } = options;
11
- const config = loadConfig(root);
8
+ const config = ctx.config.loadConfig(root);
12
9
  const sharedEncrypted = join(root, config.sources.shared + '.encrypted');
13
10
  const envEncrypted = join(root, config.sources[env] + '.encrypted');
14
11
  const varSources = [];
15
- if (existsSync(sharedEncrypted)) {
16
- const content = sopsDecrypt(sharedEncrypted);
12
+ if (ctx.fs.existsSync(sharedEncrypted)) {
13
+ const content = ctx.sops.decrypt(sharedEncrypted);
17
14
  varSources.push(parseEnvContent(content));
18
15
  }
19
- if (existsSync(envEncrypted)) {
20
- const content = sopsDecrypt(envEncrypted);
16
+ if (ctx.fs.existsSync(envEncrypted)) {
17
+ const content = ctx.sops.decrypt(envEncrypted);
21
18
  varSources.push(parseEnvContent(content));
22
19
  }
23
20
  if (varSources.length === 0) {
24
21
  if (!quiet) {
25
- console.error(pc.red('No encrypted files found'));
22
+ ctx.logger.error(pc.red('No encrypted files found'));
26
23
  }
27
- process.exit(2);
24
+ ctx.process.exit(2);
28
25
  }
29
26
  const merged = mergeVars(...varSources);
30
27
  const interpolated = interpolateVars(merged);
@@ -32,14 +29,14 @@ export async function hasCommand(options) {
32
29
  const exists = found !== undefined && found.value.length > 0;
33
30
  if (!quiet) {
34
31
  if (exists) {
35
- console.log(pc.green(`${key} is set (${found.value.length} chars)`));
32
+ ctx.logger.log(pc.green(`${key} is set (${found.value.length} chars)`));
36
33
  }
37
34
  else if (found) {
38
- console.log(pc.yellow(`${key} exists but is empty`));
35
+ ctx.logger.log(pc.yellow(`${key} exists but is empty`));
39
36
  }
40
37
  else {
41
- console.log(pc.red(`${key} not found`));
38
+ ctx.logger.log(pc.red(`${key} not found`));
42
39
  }
43
40
  }
44
- process.exit(exists ? 0 : 1);
41
+ ctx.process.exit(exists ? 0 : 1);
45
42
  }
@@ -1,3 +1,3 @@
1
- import type { InitOptions } from '../types.js';
2
- export declare function initCommand(options: InitOptions): Promise<void>;
1
+ import type { HushContext, InitOptions } from '../types.js';
2
+ export declare function initCommand(ctx: HushContext, options: InitOptions): Promise<void>;
3
3
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAc,WAAW,EAAU,MAAM,aAAa,CAAC;AAyKnE,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFrE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,WAAW,EAAE,WAAW,EAAU,MAAM,aAAa,CAAC;AAsKhF,wBAAsB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFvF"}