@chriscode/hush 2.1.0 → 2.3.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.
@@ -1,5 +1,10 @@
1
1
  import type { HushConfig } from '../types.js';
2
2
  export declare function findConfigPath(root: string): string | null;
3
3
  export declare function loadConfig(root: string): HushConfig;
4
+ export declare function checkSchemaVersion(config: HushConfig): {
5
+ needsMigration: boolean;
6
+ from: number;
7
+ to: number;
8
+ };
4
9
  export declare function validateConfig(config: HushConfig): string[];
5
10
  //# sourceMappingURL=loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAU,MAAM,aAAa,CAAC;AAKtD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ1D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAiBnD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAuB3D"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ1D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAmBnD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAO5G;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAuB3D"}
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { parse as parseYaml } from 'yaml';
4
- import { DEFAULT_SOURCES } from '../types.js';
4
+ import { DEFAULT_SOURCES, CURRENT_SCHEMA_VERSION } from '../types.js';
5
5
  const CONFIG_FILENAMES = ['hush.yaml', 'hush.yml'];
6
6
  export function findConfigPath(root) {
7
7
  for (const filename of CONFIG_FILENAMES) {
@@ -23,10 +23,20 @@ export function loadConfig(root) {
23
23
  const content = readFileSync(configPath, 'utf-8');
24
24
  const parsed = parseYaml(content);
25
25
  return {
26
+ schema_version: parsed.schema_version,
27
+ project: parsed.project,
26
28
  sources: { ...DEFAULT_SOURCES, ...parsed.sources },
27
29
  targets: parsed.targets ?? [{ name: 'root', path: '.', format: 'dotenv' }],
28
30
  };
29
31
  }
32
+ export function checkSchemaVersion(config) {
33
+ const configVersion = config.schema_version ?? 1;
34
+ return {
35
+ needsMigration: configVersion < CURRENT_SCHEMA_VERSION,
36
+ from: configVersion,
37
+ to: CURRENT_SCHEMA_VERSION,
38
+ };
39
+ }
30
40
  export function validateConfig(config) {
31
41
  const errors = [];
32
42
  if (!config.sources.shared) {
@@ -42,7 +52,7 @@ export function validateConfig(config) {
42
52
  if (!target.format) {
43
53
  errors.push(`Target "${target.name}" must have a format`);
44
54
  }
45
- if (!['dotenv', 'wrangler', 'json', 'shell'].includes(target.format)) {
55
+ if (!['dotenv', 'wrangler', 'json', 'shell', 'yaml'].includes(target.format)) {
46
56
  errors.push(`Target "${target.name}" has invalid format "${target.format}"`);
47
57
  }
48
58
  }
@@ -3,4 +3,9 @@ export declare function isAgeKeyConfigured(): boolean;
3
3
  export declare function decrypt(filePath: string): string;
4
4
  export declare function encrypt(inputPath: string, outputPath: string): void;
5
5
  export declare function edit(filePath: string): void;
6
+ /**
7
+ * Set a single key in an encrypted file.
8
+ * Decrypts to memory, updates the key, re-encrypts.
9
+ */
10
+ export declare function setKey(filePath: string, key: string, value: string): void;
6
11
  //# sourceMappingURL=sops.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sops.d.ts","sourceRoot":"","sources":["../../src/core/sops.ts"],"names":[],"mappings":"AAyBA,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6BhD;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAuBnE;AAED,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAqB3C"}
1
+ {"version":3,"file":"sops.d.ts","sourceRoot":"","sources":["../../src/core/sops.ts"],"names":[],"mappings":"AA0BA,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6BhD;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAuBnE;AAED,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAqB3C;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAqDzE"}
package/dist/core/sops.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { execSync, spawnSync } from 'node:child_process';
2
- import { existsSync } from 'node:fs';
2
+ import { existsSync, writeFileSync, unlinkSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
4
5
  function getAgeKeyFile() {
5
6
  if (process.env.SOPS_AGE_KEY_FILE) {
6
7
  return process.env.SOPS_AGE_KEY_FILE;
@@ -89,3 +90,50 @@ export function edit(filePath) {
89
90
  throw new Error(`SOPS edit failed with exit code ${result.status}`);
90
91
  }
91
92
  }
93
+ /**
94
+ * Set a single key in an encrypted file.
95
+ * Decrypts to memory, updates the key, re-encrypts.
96
+ */
97
+ export function setKey(filePath, key, value) {
98
+ if (!isSopsInstalled()) {
99
+ throw new Error('SOPS is not installed. Install with: brew install sops');
100
+ }
101
+ let content = '';
102
+ // If file exists, decrypt it first
103
+ if (existsSync(filePath)) {
104
+ content = decrypt(filePath);
105
+ }
106
+ // Parse existing content into lines
107
+ const lines = content.split('\n').filter(line => line.trim() !== '');
108
+ // Find and update or add the key
109
+ let found = false;
110
+ const updatedLines = lines.map(line => {
111
+ const match = line.match(/^([^=]+)=/);
112
+ if (match && match[1] === key) {
113
+ found = true;
114
+ return `${key}=${value}`;
115
+ }
116
+ return line;
117
+ });
118
+ if (!found) {
119
+ updatedLines.push(`${key}=${value}`);
120
+ }
121
+ const newContent = updatedLines.join('\n') + '\n';
122
+ const tempFile = join(tmpdir(), `hush-temp-${Date.now()}.env`);
123
+ try {
124
+ writeFileSync(tempFile, newContent, 'utf-8');
125
+ // Encrypt temp file to the target
126
+ execSync(`sops --input-type dotenv --output-type dotenv --encrypt "${tempFile}" > "${filePath}"`, {
127
+ encoding: 'utf-8',
128
+ shell: '/bin/bash',
129
+ stdio: ['pipe', 'pipe', 'pipe'],
130
+ env: getSopsEnv(),
131
+ });
132
+ }
133
+ finally {
134
+ // Always clean up temp file
135
+ if (existsSync(tempFile)) {
136
+ unlinkSync(tempFile);
137
+ }
138
+ }
139
+ }
@@ -0,0 +1,16 @@
1
+ export interface AgeKey {
2
+ private: string;
3
+ public: string;
4
+ }
5
+ export declare function ageAvailable(): boolean;
6
+ export declare function ageGenerate(): AgeKey;
7
+ export declare function agePublicFromPrivate(privateKey: string): string;
8
+ export declare function keyPath(project: string): string;
9
+ export declare function keyExists(project: string): boolean;
10
+ export declare function keySave(project: string, key: AgeKey): void;
11
+ export declare function keyLoad(project: string): AgeKey | null;
12
+ export declare function keysList(): {
13
+ project: string;
14
+ public: string;
15
+ }[];
16
+ //# sourceMappingURL=age.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"age.d.ts","sourceRoot":"","sources":["../../src/lib/age.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,wBAAgB,YAAY,IAAI,OAAO,CAOtC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAMpC;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAI1D;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAStD;AAED,wBAAgB,QAAQ,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CAYhE"}
@@ -0,0 +1,61 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
3
+ import { join, dirname } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ const KEYS_DIR = join(homedir(), '.config', 'sops', 'age', 'keys');
6
+ export function ageAvailable() {
7
+ try {
8
+ execSync('which age-keygen', { stdio: 'pipe' });
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ export function ageGenerate() {
16
+ const output = execSync('age-keygen', { encoding: 'utf-8' });
17
+ const pub = output.match(/public key: (age1[a-z0-9]+)/)?.[1];
18
+ const priv = output.match(/(AGE-SECRET-KEY-[A-Z0-9]+)/)?.[1];
19
+ if (!pub || !priv)
20
+ throw new Error('Failed to generate age key');
21
+ return { private: priv, public: pub };
22
+ }
23
+ export function agePublicFromPrivate(privateKey) {
24
+ return execSync(`echo "${privateKey}" | age-keygen -y`, {
25
+ encoding: 'utf-8',
26
+ shell: '/bin/bash',
27
+ }).trim();
28
+ }
29
+ export function keyPath(project) {
30
+ return join(KEYS_DIR, `${project.replace(/\//g, '-')}.txt`);
31
+ }
32
+ export function keyExists(project) {
33
+ return existsSync(keyPath(project));
34
+ }
35
+ export function keySave(project, key) {
36
+ const path = keyPath(project);
37
+ mkdirSync(dirname(path), { recursive: true });
38
+ writeFileSync(path, `# project: ${project}\n# public key: ${key.public}\n${key.private}\n`, { mode: 0o600 });
39
+ }
40
+ export function keyLoad(project) {
41
+ const path = keyPath(project);
42
+ if (!existsSync(path))
43
+ return null;
44
+ const content = readFileSync(path, 'utf-8');
45
+ const pub = content.match(/# public key: (age1[a-z0-9]+)/)?.[1];
46
+ const priv = content.match(/(AGE-SECRET-KEY-[A-Z0-9]+)/)?.[1];
47
+ return pub && priv ? { private: priv, public: pub } : null;
48
+ }
49
+ export function keysList() {
50
+ if (!existsSync(KEYS_DIR))
51
+ return [];
52
+ return readdirSync(KEYS_DIR)
53
+ .filter(f => f.endsWith('.txt'))
54
+ .map(f => {
55
+ const content = readFileSync(join(KEYS_DIR, f), 'utf-8');
56
+ const project = content.match(/# project: (.+)/)?.[1] ?? content.match(/# repo: (.+)/)?.[1];
57
+ const pub = content.match(/# public key: (age1[a-z0-9]+)/)?.[1];
58
+ return project && pub ? { project, public: pub } : null;
59
+ })
60
+ .filter((k) => k !== null);
61
+ }
@@ -0,0 +1,6 @@
1
+ export declare const OP_ITEM_PREFIX = "SOPS Key - ";
2
+ export declare function opAvailable(): boolean;
3
+ export declare function opGetKey(project: string, vault?: string): string | null;
4
+ export declare function opStoreKey(project: string, privateKey: string, publicKey: string, vault?: string): void;
5
+ export declare function opListKeys(vault?: string): string[];
6
+ //# sourceMappingURL=onepassword.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onepassword.d.ts","sourceRoot":"","sources":["../../src/lib/onepassword.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAE5C,wBAAgB,WAAW,IAAI,OAAO,CAOrC;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWvE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAcvG;AAED,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAcnD"}
@@ -0,0 +1,48 @@
1
+ import { execSync, spawnSync } from 'node:child_process';
2
+ export const OP_ITEM_PREFIX = 'SOPS Key - ';
3
+ export function opAvailable() {
4
+ try {
5
+ execSync('op whoami', { stdio: 'pipe' });
6
+ return true;
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ export function opGetKey(project, vault) {
13
+ try {
14
+ const vaultArgs = vault ? ['--vault', vault] : [];
15
+ const result = execSync(['op', 'item', 'get', `${OP_ITEM_PREFIX}${project}`, ...vaultArgs, '--fields', 'password', '--reveal'].join(' '), { encoding: 'utf-8', stdio: 'pipe' });
16
+ return result.trim() || null;
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ export function opStoreKey(project, privateKey, publicKey, vault) {
23
+ const args = [
24
+ 'item', 'create',
25
+ '--category', 'password',
26
+ '--title', `${OP_ITEM_PREFIX}${project}`,
27
+ ...(vault ? ['--vault', vault] : []),
28
+ `password=${privateKey}`,
29
+ `public_key[text]=${publicKey}`,
30
+ ];
31
+ const result = spawnSync('op', args, { stdio: 'pipe', encoding: 'utf-8' });
32
+ if (result.status !== 0) {
33
+ throw new Error(result.stderr || 'Failed to store in 1Password');
34
+ }
35
+ }
36
+ export function opListKeys(vault) {
37
+ try {
38
+ const vaultArgs = vault ? ['--vault', vault] : [];
39
+ const result = execSync(['op', 'item', 'list', '--categories', 'password', ...vaultArgs, '--format', 'json'].join(' '), { encoding: 'utf-8', stdio: 'pipe' });
40
+ const items = JSON.parse(result);
41
+ return items
42
+ .filter(i => i.title.startsWith(OP_ITEM_PREFIX))
43
+ .map(i => i.title.replace(OP_ITEM_PREFIX, ''));
44
+ }
45
+ catch {
46
+ return [];
47
+ }
48
+ }
package/dist/types.d.ts CHANGED
@@ -11,11 +11,15 @@ export interface SourceFiles {
11
11
  shared: string;
12
12
  development: string;
13
13
  production: string;
14
+ local: string;
14
15
  }
15
16
  export interface HushConfig {
17
+ schema_version?: number;
18
+ project?: string;
16
19
  sources: SourceFiles;
17
20
  targets: Target[];
18
21
  }
22
+ export declare const CURRENT_SCHEMA_VERSION = 2;
19
23
  export interface EnvVar {
20
24
  key: string;
21
25
  value: string;
@@ -29,7 +33,19 @@ export interface EncryptOptions {
29
33
  }
30
34
  export interface EditOptions {
31
35
  root: string;
32
- file?: 'shared' | 'development' | 'production';
36
+ file?: 'shared' | 'development' | 'production' | 'local';
37
+ }
38
+ export interface SetOptions {
39
+ root: string;
40
+ file?: 'shared' | 'development' | 'production' | 'local';
41
+ key?: string;
42
+ gui?: boolean;
43
+ }
44
+ export interface RunOptions {
45
+ root: string;
46
+ env: Environment;
47
+ target?: string;
48
+ command: string[];
33
49
  }
34
50
  export interface PushOptions {
35
51
  root: string;
@@ -52,6 +68,7 @@ export interface CheckOptions {
52
68
  quiet: boolean;
53
69
  onlyChanged: boolean;
54
70
  requireSource: boolean;
71
+ allowPlaintext?: boolean;
55
72
  }
56
73
  export type CheckErrorType = 'SOURCE_MISSING' | 'ENCRYPTED_MISSING' | 'DECRYPT_FAILED' | 'SOPS_NOT_INSTALLED';
57
74
  export interface CheckFileResult {
@@ -63,9 +80,14 @@ export interface CheckFileResult {
63
80
  changed: string[];
64
81
  error?: CheckErrorType;
65
82
  }
83
+ export interface PlaintextFileResult {
84
+ file: string;
85
+ keyCount: number;
86
+ }
66
87
  export interface CheckResult {
67
- status: 'ok' | 'drift' | 'error';
88
+ status: 'ok' | 'drift' | 'error' | 'plaintext';
68
89
  files: CheckFileResult[];
90
+ plaintextFiles?: PlaintextFileResult[];
69
91
  }
70
92
  export interface SkillOptions {
71
93
  root: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAC7E,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,YAAY,CAAC;AAEvD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,YAAY,CAAC;CAChD;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,WAAW,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AAE9G,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC;IACjC,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAqBjF,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -1,7 +1,9 @@
1
+ export const CURRENT_SCHEMA_VERSION = 2;
1
2
  export const DEFAULT_SOURCES = {
2
3
  shared: '.env',
3
4
  development: '.env.development',
4
5
  production: '.env.production',
6
+ local: '.env.local',
5
7
  };
6
8
  export const FORMAT_OUTPUT_FILES = {
7
9
  dotenv: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chriscode/hush",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "SOPS-based secrets management for monorepos. Encrypt once, decrypt everywhere.",
5
5
  "type": "module",
6
6
  "bin": {