dc-ops-cli 1.7.0 → 1.9.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/README.md +71 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +83 -4
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/interactive.d.ts +32 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +217 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/commands/template.d.ts +55 -0
- package/dist/commands/template.d.ts.map +1 -0
- package/dist/commands/template.js +226 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -1
- package/dist/templates/builtins.d.ts +8 -0
- package/dist/templates/builtins.d.ts.map +1 -0
- package/dist/templates/builtins.js +37 -0
- package/dist/templates/builtins.js.map +1 -0
- package/dist/utils/templates.d.ts +23 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +76 -0
- package/dist/utils/templates.js.map +1 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -9,9 +9,14 @@ Easy secret retrieval from 1Password with smart fallbacks and interactive prompt
|
|
|
9
9
|
- 🔐 **Smart retrieval** - Get secrets with automatic fallback prompts
|
|
10
10
|
- 🧠 **Smart field detection** - Auto-detects the right field based on item type (API keys use `credential`, logins use `password`)
|
|
11
11
|
- 📝 **Interactive prompts** - Create secrets on-the-fly if not found
|
|
12
|
+
- 🧭 **Interactive mode** - Fuzzy browse vaults and items
|
|
13
|
+
- 🧩 **Templates** - Create common secret sets in one command
|
|
12
14
|
- 📋 **List & search** - Browse your vault items
|
|
13
15
|
- ⭐ **Favorites** - Quick access to your most-used secrets
|
|
14
16
|
- 📤 **Export** - Generate .env files from your vault
|
|
17
|
+
- ⚙️ **Config file** - Defaults via `.opsrc` (vault, field, envFile, parallel)
|
|
18
|
+
- 🔁 **Session caching** - Cache OP_SESSION tokens to reduce prompts
|
|
19
|
+
- ✅ **Validated env mappings** - Schema checks for `.env.ops` / `.env.ops.json`
|
|
15
20
|
- 🔍 **Inspect** - Discover available fields for any secret
|
|
16
21
|
- 🏦 **Vaults** - List and browse available vaults
|
|
17
22
|
- 💡 **Smart suggestions** - Get hints when secrets or fields aren't found
|
|
@@ -172,6 +177,9 @@ Then run:
|
|
|
172
177
|
```bash
|
|
173
178
|
ops run -- node app.js
|
|
174
179
|
|
|
180
|
+
# Resolve secrets in parallel (default: 5)
|
|
181
|
+
ops run --parallel 10 -- node app.js
|
|
182
|
+
|
|
175
183
|
# Or inline mappings
|
|
176
184
|
ops run --env API_KEY=MY_API_KEY_SECRET -- node app.js
|
|
177
185
|
|
|
@@ -179,6 +187,68 @@ ops run --env API_KEY=MY_API_KEY_SECRET -- node app.js
|
|
|
179
187
|
ops run --verbose --env API_KEY=MY_API_KEY_SECRET -- node app.js
|
|
180
188
|
```
|
|
181
189
|
|
|
190
|
+
You can also use JSON mapping files with schema validation:
|
|
191
|
+
|
|
192
|
+
```json
|
|
193
|
+
{
|
|
194
|
+
"API_KEY": "MY_API_KEY_SECRET",
|
|
195
|
+
"DB_PASSWORD": "MY_DB_PASSWORD"
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Save as `.env.ops.json` and run `ops run -- node app.js` to load it.
|
|
200
|
+
|
|
201
|
+
### Templates
|
|
202
|
+
|
|
203
|
+
Create common secret sets from a template:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
# List templates
|
|
207
|
+
ops template list
|
|
208
|
+
|
|
209
|
+
# Apply a built-in template
|
|
210
|
+
ops template apply postgres --vault Work
|
|
211
|
+
|
|
212
|
+
# Provide values inline
|
|
213
|
+
ops template apply api --value API_KEY=secret --value API_URL=https://api.example.com
|
|
214
|
+
|
|
215
|
+
# Create a custom template
|
|
216
|
+
ops template create my-service --fields "API_KEY,API_SECRET,WEBHOOK_URL"
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Interactive mode
|
|
220
|
+
|
|
221
|
+
Browse vaults and items with a fuzzy finder:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
ops interactive
|
|
225
|
+
# or
|
|
226
|
+
ops i
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Choose an item, then copy/get/inspect it from the action menu.
|
|
230
|
+
|
|
231
|
+
### Config file (.opsrc)
|
|
232
|
+
|
|
233
|
+
Set defaults in `~/.opsrc` or `.opsrc` in your project (JSON or YAML):
|
|
234
|
+
|
|
235
|
+
```yaml
|
|
236
|
+
vault: Work
|
|
237
|
+
field: password
|
|
238
|
+
envFile: .env.ops
|
|
239
|
+
parallel: 8
|
|
240
|
+
sessionCache:
|
|
241
|
+
enabled: true
|
|
242
|
+
path: ~/.config/ops-cli/session.json
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Use a custom path with `OPS_CONFIG=/path/to/.opsrc`.
|
|
246
|
+
|
|
247
|
+
### Session caching
|
|
248
|
+
|
|
249
|
+
By default ops stores OP_SESSION tokens in `~/.config/ops-cli/session.json`.
|
|
250
|
+
Disable with `OPS_NO_SESSION_CACHE=1` or `OPS_SESSION_CACHE=0`.
|
|
251
|
+
|
|
182
252
|
### Resolve a share link
|
|
183
253
|
|
|
184
254
|
```bash
|
|
@@ -401,4 +471,4 @@ npm run build
|
|
|
401
471
|
|
|
402
472
|
## License
|
|
403
473
|
|
|
404
|
-
MIT
|
|
474
|
+
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAieH,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
|
@@ -14,7 +14,7 @@ _ops_completion() {
|
|
|
14
14
|
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
15
15
|
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
16
16
|
|
|
17
|
-
commands="get set copy list search favorites vaults inspect export import resolve run completion"
|
|
17
|
+
commands="get set copy list search favorites vaults inspect export import resolve run interactive template completion"
|
|
18
18
|
|
|
19
19
|
case "\${COMP_CWORD}" in
|
|
20
20
|
1)
|
|
@@ -45,6 +45,10 @@ _ops_completion() {
|
|
|
45
45
|
COMPREPLY=( $(compgen -W "password credential username notesPlain api-key token" -- "\${cur}") )
|
|
46
46
|
return 0
|
|
47
47
|
;;
|
|
48
|
+
template)
|
|
49
|
+
COMPREPLY=( $(compgen -W "list create apply" -- "\${cur}") )
|
|
50
|
+
return 0
|
|
51
|
+
;;
|
|
48
52
|
--format)
|
|
49
53
|
COMPREPLY=( $(compgen -W "env json" -- "\${cur}") )
|
|
50
54
|
return 0
|
|
@@ -91,7 +95,13 @@ _ops_completion() {
|
|
|
91
95
|
opts="-j --json -q --quiet --no-color"
|
|
92
96
|
;;
|
|
93
97
|
run)
|
|
94
|
-
opts="-v --vault -f --field -e --env --env-file --verbose --no-color"
|
|
98
|
+
opts="-v --vault -f --field -e --env --env-file --parallel --verbose --no-color"
|
|
99
|
+
;;
|
|
100
|
+
interactive)
|
|
101
|
+
opts="-v --vault -f --field --no-color"
|
|
102
|
+
;;
|
|
103
|
+
template)
|
|
104
|
+
opts="list create apply --no-color"
|
|
95
105
|
;;
|
|
96
106
|
completion)
|
|
97
107
|
opts="bash zsh fish"
|
|
@@ -129,6 +139,8 @@ _ops() {
|
|
|
129
139
|
'import:Import secrets from .env file'
|
|
130
140
|
'resolve:Resolve 1Password share link'
|
|
131
141
|
'run:Run command with secrets injected'
|
|
142
|
+
'interactive:Interactive browsing mode'
|
|
143
|
+
'template:Manage secret templates'
|
|
132
144
|
'completion:Generate shell completion script'
|
|
133
145
|
)
|
|
134
146
|
|
|
@@ -284,9 +296,60 @@ _ops() {
|
|
|
284
296
|
'*-e[Map env to secret]:mapping:' \\
|
|
285
297
|
'*--env[Map env to secret]:mapping:' \\
|
|
286
298
|
'--env-file[Env mapping file]:file:_files' \\
|
|
299
|
+
'--parallel[Max concurrent secret lookups]:count:' \\
|
|
287
300
|
'--verbose[Show injected secrets]' \\
|
|
288
301
|
'--no-color[Disable colors]'
|
|
289
302
|
;;
|
|
303
|
+
template)
|
|
304
|
+
_arguments \\
|
|
305
|
+
'1:subcommand:(list create apply)' \\
|
|
306
|
+
'*::arg:->template_args'
|
|
307
|
+
case "$state" in
|
|
308
|
+
template_args)
|
|
309
|
+
case "$words[2]" in
|
|
310
|
+
list)
|
|
311
|
+
_arguments \\
|
|
312
|
+
'-j[Output as JSON]' \\
|
|
313
|
+
'--json[Output as JSON]' \\
|
|
314
|
+
'-q[Suppress output]' \\
|
|
315
|
+
'--quiet[Suppress output]' \\
|
|
316
|
+
'--no-color[Disable colors]'
|
|
317
|
+
;;
|
|
318
|
+
create)
|
|
319
|
+
_arguments \\
|
|
320
|
+
'1:template name:' \\
|
|
321
|
+
'--fields[Template fields]:fields:' \\
|
|
322
|
+
'--description[Template description]:description:' \\
|
|
323
|
+
'--force[Overwrite existing template]' \\
|
|
324
|
+
'-q[Suppress output]' \\
|
|
325
|
+
'--quiet[Suppress output]' \\
|
|
326
|
+
'--no-color[Disable colors]'
|
|
327
|
+
;;
|
|
328
|
+
apply)
|
|
329
|
+
_arguments \\
|
|
330
|
+
'1:template name:' \\
|
|
331
|
+
'-v[Vault name]:vault:_ops_vaults' \\
|
|
332
|
+
'--vault[Vault name]:vault:_ops_vaults' \\
|
|
333
|
+
'-f[Field name]:field:(password credential username notesPlain api-key token)' \\
|
|
334
|
+
'--field[Field name]:field:(password credential username notesPlain api-key token)' \\
|
|
335
|
+
'--value[Provide field value]:pair:' \\
|
|
336
|
+
'--no-input[Disable prompts]' \\
|
|
337
|
+
'-q[Suppress output]' \\
|
|
338
|
+
'--quiet[Suppress output]' \\
|
|
339
|
+
'--no-color[Disable colors]'
|
|
340
|
+
;;
|
|
341
|
+
esac
|
|
342
|
+
;;
|
|
343
|
+
esac
|
|
344
|
+
;;
|
|
345
|
+
interactive)
|
|
346
|
+
_arguments \\
|
|
347
|
+
'-v[Vault name]:vault:_ops_vaults' \\
|
|
348
|
+
'--vault[Vault name]:vault:_ops_vaults' \\
|
|
349
|
+
'-f[Field name]:field:(password credential username notesPlain api-key token)' \\
|
|
350
|
+
'--field[Field name]:field:(password credential username notesPlain api-key token)' \\
|
|
351
|
+
'--no-color[Disable colors]'
|
|
352
|
+
;;
|
|
290
353
|
completion)
|
|
291
354
|
_arguments '1:shell:(bash zsh fish)'
|
|
292
355
|
;;
|
|
@@ -335,6 +398,8 @@ complete -c ops -n __fish_use_subcommand -a export -d 'Export secrets as .env or
|
|
|
335
398
|
complete -c ops -n __fish_use_subcommand -a import -d 'Import secrets from .env file'
|
|
336
399
|
complete -c ops -n __fish_use_subcommand -a resolve -d 'Resolve 1Password share link'
|
|
337
400
|
complete -c ops -n __fish_use_subcommand -a run -d 'Run command with secrets injected'
|
|
401
|
+
complete -c ops -n __fish_use_subcommand -a interactive -d 'Interactive browsing mode'
|
|
402
|
+
complete -c ops -n __fish_use_subcommand -a template -d 'Manage secret templates'
|
|
338
403
|
complete -c ops -n __fish_use_subcommand -a completion -d 'Generate shell completion script'
|
|
339
404
|
|
|
340
405
|
# Common options
|
|
@@ -377,8 +442,22 @@ complete -c ops -n '__fish_seen_subcommand_from import' -l dry-run -d 'Preview w
|
|
|
377
442
|
# run command options
|
|
378
443
|
complete -c ops -n '__fish_seen_subcommand_from run' -l env -s e -d 'Map env to secret'
|
|
379
444
|
complete -c ops -n '__fish_seen_subcommand_from run' -l env-file -r -d 'Env mapping file'
|
|
445
|
+
complete -c ops -n '__fish_seen_subcommand_from run' -l parallel -d 'Max concurrent secret lookups'
|
|
380
446
|
complete -c ops -n '__fish_seen_subcommand_from run' -l verbose -d 'Show injected secrets'
|
|
381
447
|
|
|
448
|
+
# interactive command options
|
|
449
|
+
complete -c ops -n '__fish_seen_subcommand_from interactive' -l field -s f -d 'Field name'
|
|
450
|
+
|
|
451
|
+
# template command options
|
|
452
|
+
complete -c ops -n '__fish_seen_subcommand_from template' -a 'list create apply' -d 'Template subcommand'
|
|
453
|
+
complete -c ops -n '__fish_seen_subcommand_from template; and __fish_seen_subcommand_from apply' -l vault -s v -d 'Vault name'
|
|
454
|
+
complete -c ops -n '__fish_seen_subcommand_from template; and __fish_seen_subcommand_from apply' -l field -s f -d 'Field name'
|
|
455
|
+
complete -c ops -n '__fish_seen_subcommand_from template; and __fish_seen_subcommand_from apply' -l value -d 'Provide field value'
|
|
456
|
+
complete -c ops -n '__fish_seen_subcommand_from template; and __fish_seen_subcommand_from apply' -l no-input -d 'Disable prompts'
|
|
457
|
+
complete -c ops -n '__fish_seen_subcommand_from template; and __fish_seen_subcommand_from create' -l fields -d 'Template fields'
|
|
458
|
+
complete -c ops -n '__fish_seen_subcommand_from template; and __fish_seen_subcommand_from create' -l description -d 'Template description'
|
|
459
|
+
complete -c ops -n '__fish_seen_subcommand_from template; and __fish_seen_subcommand_from create' -l force -d 'Overwrite existing template'
|
|
460
|
+
|
|
382
461
|
# completion command - shell argument
|
|
383
462
|
complete -c ops -n '__fish_seen_subcommand_from completion' -a 'bash zsh fish' -d 'Shell type'
|
|
384
463
|
|
|
@@ -387,7 +466,7 @@ function __fish_ops_vaults
|
|
|
387
466
|
command -v op &>/dev/null; and op vault list --format=json 2>/dev/null | jq -r '.[].name' 2>/dev/null
|
|
388
467
|
end
|
|
389
468
|
|
|
390
|
-
complete -c ops -n '__fish_seen_subcommand_from get set copy list search favorites inspect export import run' -l vault -s v -xa '(__fish_ops_vaults)'
|
|
469
|
+
complete -c ops -n '__fish_seen_subcommand_from get set copy list search favorites inspect export import run interactive' -l vault -s v -xa '(__fish_ops_vaults)'
|
|
391
470
|
|
|
392
471
|
# Dynamic item completion (if op CLI available)
|
|
393
472
|
function __fish_ops_items
|
|
@@ -397,7 +476,7 @@ end
|
|
|
397
476
|
complete -c ops -n '__fish_seen_subcommand_from get copy inspect' -xa '(__fish_ops_items)'
|
|
398
477
|
|
|
399
478
|
# Field completion
|
|
400
|
-
complete -c ops -n '__fish_seen_subcommand_from get set copy' -l field -s f -xa 'password credential username notesPlain api-key token'
|
|
479
|
+
complete -c ops -n '__fish_seen_subcommand_from get set copy interactive' -l field -s f -xa 'password credential username notesPlain api-key token'
|
|
401
480
|
`;
|
|
402
481
|
export async function completionCommand(shell, options) {
|
|
403
482
|
const targetShell = shell || detectShell();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yBAAyB;AACzB,MAAM,cAAc,GAAG
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import autocompletePrompt from 'inquirer-autocomplete-prompt';
|
|
3
|
+
import { checkOpCli, listItems, listVaults, getItem } from '../utils/op.js';
|
|
4
|
+
import { applyColorConfig, isInteractiveInput, resolveBooleanOption, resolveField, resolveVault } from '../utils/cli.js';
|
|
5
|
+
import { copyCommand } from './copy.js';
|
|
6
|
+
import { getCommand } from './get.js';
|
|
7
|
+
import { inspectCommand } from './inspect.js';
|
|
8
|
+
export interface InteractiveOptions {
|
|
9
|
+
vault?: string;
|
|
10
|
+
field?: string;
|
|
11
|
+
color?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface InteractiveDependencies {
|
|
14
|
+
checkOpCli: typeof checkOpCli;
|
|
15
|
+
listVaults: typeof listVaults;
|
|
16
|
+
listItems: typeof listItems;
|
|
17
|
+
getItem: typeof getItem;
|
|
18
|
+
prompt: typeof inquirer.prompt;
|
|
19
|
+
registerPrompt: typeof inquirer.registerPrompt;
|
|
20
|
+
autocompletePrompt: typeof autocompletePrompt;
|
|
21
|
+
applyColorConfig: typeof applyColorConfig;
|
|
22
|
+
isInteractiveInput: typeof isInteractiveInput;
|
|
23
|
+
resolveBooleanOption: typeof resolveBooleanOption;
|
|
24
|
+
resolveVault: typeof resolveVault;
|
|
25
|
+
resolveField: typeof resolveField;
|
|
26
|
+
copyCommand: typeof copyCommand;
|
|
27
|
+
getCommand: typeof getCommand;
|
|
28
|
+
inspectCommand: typeof inspectCommand;
|
|
29
|
+
}
|
|
30
|
+
export declare function createInteractiveCommand(overrides?: Partial<InteractiveDependencies>): (options: InteractiveOptions) => Promise<void>;
|
|
31
|
+
export declare const interactiveCommand: (options: InteractiveOptions) => Promise<void>;
|
|
32
|
+
//# sourceMappingURL=interactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,kBAAkB,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAC/B,cAAc,EAAE,OAAO,QAAQ,CAAC,cAAc,CAAC;IAC/C,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,cAAc,EAAE,OAAO,cAAc,CAAC;CACvC;AA2KD,wBAAgB,wBAAwB,CACtC,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAiFhD;AAED,eAAO,MAAM,kBAAkB,YAnFlB,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAmFY,CAAC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import autocompletePrompt from 'inquirer-autocomplete-prompt';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { checkOpCli, listItems, listVaults, getItem } from '../utils/op.js';
|
|
5
|
+
import { applyColorConfig, isInteractiveInput, resolveBooleanOption, resolveField, resolveVault, } from '../utils/cli.js';
|
|
6
|
+
import { OpError } from '../utils/types.js';
|
|
7
|
+
import { copyCommand } from './copy.js';
|
|
8
|
+
import { getCommand } from './get.js';
|
|
9
|
+
import { inspectCommand } from './inspect.js';
|
|
10
|
+
const defaultDependencies = {
|
|
11
|
+
checkOpCli,
|
|
12
|
+
listVaults,
|
|
13
|
+
listItems,
|
|
14
|
+
getItem,
|
|
15
|
+
prompt: inquirer.prompt,
|
|
16
|
+
registerPrompt: inquirer.registerPrompt,
|
|
17
|
+
autocompletePrompt,
|
|
18
|
+
applyColorConfig,
|
|
19
|
+
isInteractiveInput,
|
|
20
|
+
resolveBooleanOption,
|
|
21
|
+
resolveVault,
|
|
22
|
+
resolveField,
|
|
23
|
+
copyCommand,
|
|
24
|
+
getCommand,
|
|
25
|
+
inspectCommand,
|
|
26
|
+
};
|
|
27
|
+
const BACK_TO_VAULTS = '__back_to_vaults__';
|
|
28
|
+
const BACK_TO_ITEMS = '__back_to_items__';
|
|
29
|
+
function normalize(value) {
|
|
30
|
+
return value.toLowerCase();
|
|
31
|
+
}
|
|
32
|
+
function fuzzyScore(candidate, query) {
|
|
33
|
+
if (!query)
|
|
34
|
+
return 1;
|
|
35
|
+
const haystack = normalize(candidate);
|
|
36
|
+
const needle = normalize(query);
|
|
37
|
+
if (haystack.includes(needle)) {
|
|
38
|
+
return 1000 - haystack.indexOf(needle);
|
|
39
|
+
}
|
|
40
|
+
let score = 0;
|
|
41
|
+
let lastIndex = -1;
|
|
42
|
+
for (const char of needle) {
|
|
43
|
+
const nextIndex = haystack.indexOf(char, lastIndex + 1);
|
|
44
|
+
if (nextIndex === -1)
|
|
45
|
+
return -1;
|
|
46
|
+
const gap = nextIndex - lastIndex;
|
|
47
|
+
score += Math.max(1, 10 - gap);
|
|
48
|
+
lastIndex = nextIndex;
|
|
49
|
+
}
|
|
50
|
+
return score;
|
|
51
|
+
}
|
|
52
|
+
function filterChoices(values, input, limit = 50) {
|
|
53
|
+
const query = input?.trim() ?? '';
|
|
54
|
+
const scored = values
|
|
55
|
+
.map((value) => ({ value, score: fuzzyScore(value, query) }))
|
|
56
|
+
.filter((entry) => entry.score >= 0)
|
|
57
|
+
.sort((a, b) => b.score - a.score)
|
|
58
|
+
.slice(0, limit);
|
|
59
|
+
return scored.map((entry) => entry.value);
|
|
60
|
+
}
|
|
61
|
+
function createAutocompleteSource(values) {
|
|
62
|
+
return async (_answers, input) => {
|
|
63
|
+
return filterChoices(values, input);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async function promptForVault(deps) {
|
|
67
|
+
const vaults = deps.listVaults();
|
|
68
|
+
if (vaults.length === 0) {
|
|
69
|
+
throw new OpError('No vaults found for this account.', 1);
|
|
70
|
+
}
|
|
71
|
+
const choices = vaults.map((vault) => vault.name);
|
|
72
|
+
const answer = await deps.prompt([
|
|
73
|
+
{
|
|
74
|
+
type: 'autocomplete',
|
|
75
|
+
name: 'vault',
|
|
76
|
+
message: 'Select a vault:',
|
|
77
|
+
source: createAutocompleteSource(choices),
|
|
78
|
+
},
|
|
79
|
+
]);
|
|
80
|
+
if (!answer.vault) {
|
|
81
|
+
throw new OpError('No vault selected.', 2);
|
|
82
|
+
}
|
|
83
|
+
return answer.vault;
|
|
84
|
+
}
|
|
85
|
+
async function promptForItem(vault, deps) {
|
|
86
|
+
const items = deps.listItems(vault);
|
|
87
|
+
if (items.length === 0) {
|
|
88
|
+
throw new OpError(`No items found in vault "${vault}".`, 1);
|
|
89
|
+
}
|
|
90
|
+
const choices = [
|
|
91
|
+
{ name: '⬅ Back to vaults', value: BACK_TO_VAULTS },
|
|
92
|
+
...items.map((item) => ({ name: item.title, value: item.title })),
|
|
93
|
+
];
|
|
94
|
+
const answer = await deps.prompt([
|
|
95
|
+
{
|
|
96
|
+
type: 'autocomplete',
|
|
97
|
+
name: 'item',
|
|
98
|
+
message: `Select an item from ${vault}:`,
|
|
99
|
+
source: async (_answers, input) => {
|
|
100
|
+
const filtered = filterChoices(choices.map((choice) => choice.name), input);
|
|
101
|
+
return choices.filter((choice) => filtered.includes(choice.name));
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
]);
|
|
105
|
+
if (answer.item === BACK_TO_VAULTS) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return answer.item ?? null;
|
|
109
|
+
}
|
|
110
|
+
async function promptForAction(deps) {
|
|
111
|
+
const answer = await deps.prompt([
|
|
112
|
+
{
|
|
113
|
+
type: 'list',
|
|
114
|
+
name: 'action',
|
|
115
|
+
message: 'Choose an action:',
|
|
116
|
+
choices: [
|
|
117
|
+
{ name: 'Copy to clipboard', value: 'copy' },
|
|
118
|
+
{ name: 'Get secret (print value)', value: 'get' },
|
|
119
|
+
{ name: 'Inspect item fields', value: 'inspect' },
|
|
120
|
+
{ name: '⬅ Back to items', value: BACK_TO_ITEMS },
|
|
121
|
+
{ name: 'Exit', value: 'exit' },
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
]);
|
|
125
|
+
return answer.action ?? 'exit';
|
|
126
|
+
}
|
|
127
|
+
function renderItemDetails(itemName, vault, deps) {
|
|
128
|
+
const item = deps.getItem(itemName, vault);
|
|
129
|
+
if (!item)
|
|
130
|
+
return;
|
|
131
|
+
console.log(chalk.cyan(`\nItem: ${item.title}`));
|
|
132
|
+
console.log(chalk.gray(`Vault: ${vault}`));
|
|
133
|
+
if (item.category) {
|
|
134
|
+
console.log(chalk.gray(`Category: ${item.category}`));
|
|
135
|
+
}
|
|
136
|
+
if (item.fields && item.fields.length > 0) {
|
|
137
|
+
const labels = item.fields
|
|
138
|
+
.map((field) => field.label)
|
|
139
|
+
.filter((label) => Boolean(label))
|
|
140
|
+
.join(', ');
|
|
141
|
+
if (labels.length > 0) {
|
|
142
|
+
console.log(chalk.gray(`Fields: ${labels}`));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export function createInteractiveCommand(overrides = {}) {
|
|
147
|
+
const deps = { ...defaultDependencies, ...overrides };
|
|
148
|
+
return async function interactiveCommand(options) {
|
|
149
|
+
try {
|
|
150
|
+
if (!deps.isInteractiveInput()) {
|
|
151
|
+
throw new OpError('Interactive mode requires a TTY.', 2);
|
|
152
|
+
}
|
|
153
|
+
deps.checkOpCli();
|
|
154
|
+
const envNoColor = deps.resolveBooleanOption(undefined, 'OPS_NO_COLOR');
|
|
155
|
+
const noColor = options.color === false || envNoColor;
|
|
156
|
+
deps.applyColorConfig(noColor);
|
|
157
|
+
deps.registerPrompt('autocomplete', deps.autocompletePrompt);
|
|
158
|
+
const field = deps.resolveField(options.field);
|
|
159
|
+
let selectedVault = options.vault ? deps.resolveVault(options.vault) : undefined;
|
|
160
|
+
while (true) {
|
|
161
|
+
if (!selectedVault) {
|
|
162
|
+
selectedVault = await promptForVault(deps);
|
|
163
|
+
}
|
|
164
|
+
const selectedItem = await promptForItem(selectedVault, deps);
|
|
165
|
+
if (!selectedItem) {
|
|
166
|
+
selectedVault = undefined;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
renderItemDetails(selectedItem, selectedVault, deps);
|
|
170
|
+
while (true) {
|
|
171
|
+
const action = await promptForAction(deps);
|
|
172
|
+
if (action === 'exit')
|
|
173
|
+
return;
|
|
174
|
+
if (action === BACK_TO_ITEMS) {
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
if (action === 'copy') {
|
|
178
|
+
await deps.copyCommand(selectedItem, {
|
|
179
|
+
vault: selectedVault,
|
|
180
|
+
field,
|
|
181
|
+
quiet: true,
|
|
182
|
+
color: options.color,
|
|
183
|
+
});
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (action === 'get') {
|
|
187
|
+
await deps.getCommand(selectedItem, {
|
|
188
|
+
vault: selectedVault,
|
|
189
|
+
field,
|
|
190
|
+
quiet: false,
|
|
191
|
+
color: options.color,
|
|
192
|
+
});
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (action === 'inspect') {
|
|
196
|
+
await deps.inspectCommand(selectedItem, {
|
|
197
|
+
vault: selectedVault,
|
|
198
|
+
json: false,
|
|
199
|
+
quiet: false,
|
|
200
|
+
color: options.color,
|
|
201
|
+
});
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
if (error instanceof OpError) {
|
|
209
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
210
|
+
process.exit(error.exitCode);
|
|
211
|
+
}
|
|
212
|
+
throw error;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
export const interactiveCommand = createInteractiveCommand();
|
|
217
|
+
//# sourceMappingURL=interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/commands/interactive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import { applyColorConfig, createSpinner, isInteractiveInput, resolveBooleanOption, resolveField, resolveVault } from '../utils/cli.js';
|
|
3
|
+
import { setSecret, checkOpCli } from '../utils/op.js';
|
|
4
|
+
import { type CustomTemplate } from '../utils/templates.js';
|
|
5
|
+
export interface SecretTemplate {
|
|
6
|
+
name: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
fields: string[];
|
|
9
|
+
source: 'builtin' | 'custom';
|
|
10
|
+
}
|
|
11
|
+
export declare function parseTemplateFields(input: string): string[];
|
|
12
|
+
export interface TemplateListOptions {
|
|
13
|
+
json?: boolean;
|
|
14
|
+
quiet?: boolean;
|
|
15
|
+
color?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface TemplateCreateOptions {
|
|
18
|
+
fields?: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
force?: boolean;
|
|
21
|
+
quiet?: boolean;
|
|
22
|
+
color?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface TemplateApplyOptions {
|
|
25
|
+
vault?: string;
|
|
26
|
+
field?: string;
|
|
27
|
+
values?: string[];
|
|
28
|
+
input?: boolean;
|
|
29
|
+
quiet?: boolean;
|
|
30
|
+
color?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface TemplateDependencies {
|
|
33
|
+
checkOpCli: typeof checkOpCli;
|
|
34
|
+
setSecret: typeof setSecret;
|
|
35
|
+
prompt: typeof inquirer.prompt;
|
|
36
|
+
createSpinner: typeof createSpinner;
|
|
37
|
+
applyColorConfig: typeof applyColorConfig;
|
|
38
|
+
isInteractiveInput: typeof isInteractiveInput;
|
|
39
|
+
resolveBooleanOption: typeof resolveBooleanOption;
|
|
40
|
+
resolveVault: typeof resolveVault;
|
|
41
|
+
resolveField: typeof resolveField;
|
|
42
|
+
parseTemplateFields: typeof parseTemplateFields;
|
|
43
|
+
loadCustomTemplates: () => Record<string, CustomTemplate>;
|
|
44
|
+
saveCustomTemplates: (templates: Record<string, CustomTemplate>) => void;
|
|
45
|
+
isBuiltinTemplate: (name: string) => boolean;
|
|
46
|
+
getTemplateByName: (name: string) => SecretTemplate | undefined;
|
|
47
|
+
mergeTemplates: (custom: Record<string, CustomTemplate>) => SecretTemplate[];
|
|
48
|
+
}
|
|
49
|
+
export declare function createTemplateListCommand(overrides?: Partial<TemplateDependencies>): (options: TemplateListOptions) => Promise<void>;
|
|
50
|
+
export declare function createTemplateCreateCommand(overrides?: Partial<TemplateDependencies>): (name: string, options: TemplateCreateOptions) => Promise<void>;
|
|
51
|
+
export declare function createTemplateApplyCommand(overrides?: Partial<TemplateDependencies>): (name: string, options: TemplateApplyOptions) => Promise<void>;
|
|
52
|
+
export declare const templateListCommand: (options: TemplateListOptions) => Promise<void>;
|
|
53
|
+
export declare const templateCreateCommand: (name: string, options: TemplateCreateOptions) => Promise<void>;
|
|
54
|
+
export declare const templateApplyCommand: (name: string, options: TemplateApplyOptions) => Promise<void>;
|
|
55
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/commands/template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { applyColorConfig, createSpinner, isInteractiveInput, resolveBooleanOption, resolveField, resolveVault, } from '../utils/cli.js';
|
|
4
|
+
import { OpError } from '../utils/types.js';
|
|
5
|
+
import { setSecret, checkOpCli } from '../utils/op.js';
|
|
6
|
+
import { createTemplateStore } from '../utils/templates.js';
|
|
7
|
+
import { builtinTemplates, getBuiltinTemplate, } from '../templates/builtins.js';
|
|
8
|
+
export function parseTemplateFields(input) {
|
|
9
|
+
const parts = input
|
|
10
|
+
.split(/[\s,]+/)
|
|
11
|
+
.map((value) => value.trim())
|
|
12
|
+
.filter((value) => value.length > 0);
|
|
13
|
+
if (parts.length === 0) {
|
|
14
|
+
throw new OpError('Template fields are required.', 2);
|
|
15
|
+
}
|
|
16
|
+
const seen = new Set();
|
|
17
|
+
const fields = [];
|
|
18
|
+
for (const part of parts) {
|
|
19
|
+
const normalized = part.toUpperCase();
|
|
20
|
+
if (seen.has(normalized))
|
|
21
|
+
continue;
|
|
22
|
+
seen.add(normalized);
|
|
23
|
+
fields.push(normalized);
|
|
24
|
+
}
|
|
25
|
+
return fields;
|
|
26
|
+
}
|
|
27
|
+
function normalizeTemplateName(name) {
|
|
28
|
+
return name.trim().toLowerCase();
|
|
29
|
+
}
|
|
30
|
+
function toSecretTemplate(template, source) {
|
|
31
|
+
return {
|
|
32
|
+
name: template.name,
|
|
33
|
+
description: template.description,
|
|
34
|
+
fields: template.fields,
|
|
35
|
+
source,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function mergeTemplates(custom) {
|
|
39
|
+
const customTemplates = Object.values(custom).map((template) => toSecretTemplate(template, 'custom'));
|
|
40
|
+
const builtins = builtinTemplates.map((template) => toSecretTemplate(template, 'builtin'));
|
|
41
|
+
return [...builtins, ...customTemplates];
|
|
42
|
+
}
|
|
43
|
+
function getTemplateByName(name, custom) {
|
|
44
|
+
const normalized = normalizeTemplateName(name);
|
|
45
|
+
const builtin = getBuiltinTemplate(normalized);
|
|
46
|
+
if (builtin)
|
|
47
|
+
return toSecretTemplate(builtin, 'builtin');
|
|
48
|
+
const customTemplate = custom[normalized];
|
|
49
|
+
if (!customTemplate)
|
|
50
|
+
return undefined;
|
|
51
|
+
return toSecretTemplate(customTemplate, 'custom');
|
|
52
|
+
}
|
|
53
|
+
function parseKeyValuePairs(pairs) {
|
|
54
|
+
if (!pairs || pairs.length === 0)
|
|
55
|
+
return {};
|
|
56
|
+
const mapping = {};
|
|
57
|
+
for (const pair of pairs) {
|
|
58
|
+
const separatorIndex = pair.indexOf('=');
|
|
59
|
+
if (separatorIndex <= 0) {
|
|
60
|
+
throw new OpError('Invalid --value format. Use KEY=VALUE (example: --value API_KEY=secret).', 2);
|
|
61
|
+
}
|
|
62
|
+
const key = pair.slice(0, separatorIndex).trim().toUpperCase();
|
|
63
|
+
const value = pair.slice(separatorIndex + 1).trim();
|
|
64
|
+
if (!key || !value) {
|
|
65
|
+
throw new OpError('Invalid --value format. Use KEY=VALUE (example: --value API_KEY=secret).', 2);
|
|
66
|
+
}
|
|
67
|
+
mapping[key] = value;
|
|
68
|
+
}
|
|
69
|
+
return mapping;
|
|
70
|
+
}
|
|
71
|
+
const templateStore = createTemplateStore();
|
|
72
|
+
const defaultDependencies = {
|
|
73
|
+
checkOpCli,
|
|
74
|
+
setSecret,
|
|
75
|
+
prompt: inquirer.prompt,
|
|
76
|
+
createSpinner,
|
|
77
|
+
applyColorConfig,
|
|
78
|
+
isInteractiveInput,
|
|
79
|
+
resolveBooleanOption,
|
|
80
|
+
resolveVault,
|
|
81
|
+
resolveField,
|
|
82
|
+
parseTemplateFields,
|
|
83
|
+
loadCustomTemplates: () => templateStore.loadCustomTemplates(),
|
|
84
|
+
saveCustomTemplates: (templates) => templateStore.saveCustomTemplates(templates),
|
|
85
|
+
isBuiltinTemplate: (name) => Boolean(getBuiltinTemplate(name)),
|
|
86
|
+
getTemplateByName: (name) => getTemplateByName(name, templateStore.loadCustomTemplates()),
|
|
87
|
+
mergeTemplates: (custom) => mergeTemplates(custom),
|
|
88
|
+
};
|
|
89
|
+
export function createTemplateListCommand(overrides = {}) {
|
|
90
|
+
const deps = { ...defaultDependencies, ...overrides };
|
|
91
|
+
return async function templateListCommand(options) {
|
|
92
|
+
try {
|
|
93
|
+
const envNoColor = deps.resolveBooleanOption(undefined, 'OPS_NO_COLOR');
|
|
94
|
+
const noColor = options.color === false || envNoColor;
|
|
95
|
+
deps.applyColorConfig(noColor);
|
|
96
|
+
const customTemplates = deps.loadCustomTemplates();
|
|
97
|
+
const allTemplates = deps.mergeTemplates(customTemplates);
|
|
98
|
+
if (options.json) {
|
|
99
|
+
console.log(JSON.stringify(allTemplates, null, 2));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (!options.quiet) {
|
|
103
|
+
console.log(chalk.cyan('Available templates:'));
|
|
104
|
+
}
|
|
105
|
+
for (const template of allTemplates) {
|
|
106
|
+
const label = template.source === 'builtin' ? 'built-in' : 'custom';
|
|
107
|
+
console.log(chalk.white(` ${template.name} (${label}) - ${template.fields.join(', ')}`));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error instanceof OpError) {
|
|
112
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
113
|
+
process.exit(error.exitCode);
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export function createTemplateCreateCommand(overrides = {}) {
|
|
120
|
+
const deps = { ...defaultDependencies, ...overrides };
|
|
121
|
+
return async function templateCreateCommand(name, options) {
|
|
122
|
+
try {
|
|
123
|
+
if (!name || name.trim().length === 0) {
|
|
124
|
+
throw new OpError('Template name is required.', 2);
|
|
125
|
+
}
|
|
126
|
+
const envNoColor = deps.resolveBooleanOption(undefined, 'OPS_NO_COLOR');
|
|
127
|
+
const noColor = options.color === false || envNoColor;
|
|
128
|
+
deps.applyColorConfig(noColor);
|
|
129
|
+
if (!options.fields) {
|
|
130
|
+
throw new OpError('Template fields are required (use --fields).', 2);
|
|
131
|
+
}
|
|
132
|
+
const normalizedName = normalizeTemplateName(name);
|
|
133
|
+
if (deps.isBuiltinTemplate(normalizedName)) {
|
|
134
|
+
throw new OpError(`Template "${normalizedName}" is built-in and cannot be overwritten.`, 2);
|
|
135
|
+
}
|
|
136
|
+
const fields = deps.parseTemplateFields(options.fields);
|
|
137
|
+
const templates = deps.loadCustomTemplates();
|
|
138
|
+
if (templates[normalizedName] && !options.force) {
|
|
139
|
+
throw new OpError(`Template "${normalizedName}" already exists. Use --force to overwrite.`, 2);
|
|
140
|
+
}
|
|
141
|
+
templates[normalizedName] = {
|
|
142
|
+
name: normalizedName,
|
|
143
|
+
description: options.description,
|
|
144
|
+
fields,
|
|
145
|
+
};
|
|
146
|
+
deps.saveCustomTemplates(templates);
|
|
147
|
+
if (!options.quiet) {
|
|
148
|
+
console.log(chalk.green(`Template "${normalizedName}" saved.`));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
if (error instanceof OpError) {
|
|
153
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
154
|
+
process.exit(error.exitCode);
|
|
155
|
+
}
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
export function createTemplateApplyCommand(overrides = {}) {
|
|
161
|
+
const deps = { ...defaultDependencies, ...overrides };
|
|
162
|
+
return async function templateApplyCommand(name, options) {
|
|
163
|
+
try {
|
|
164
|
+
if (!name || name.trim().length === 0) {
|
|
165
|
+
throw new OpError('Template name is required.', 2);
|
|
166
|
+
}
|
|
167
|
+
deps.checkOpCli();
|
|
168
|
+
const envNoColor = deps.resolveBooleanOption(undefined, 'OPS_NO_COLOR');
|
|
169
|
+
const envNoInput = deps.resolveBooleanOption(undefined, 'OPS_NO_INPUT');
|
|
170
|
+
const noColor = options.color === false || envNoColor;
|
|
171
|
+
const noInput = options.input === false || envNoInput;
|
|
172
|
+
const canPrompt = !noInput && deps.isInteractiveInput();
|
|
173
|
+
deps.applyColorConfig(noColor);
|
|
174
|
+
const template = deps.getTemplateByName(name);
|
|
175
|
+
if (!template) {
|
|
176
|
+
throw new OpError(`Template "${name}" not found.`, 1);
|
|
177
|
+
}
|
|
178
|
+
const vault = deps.resolveVault(options.vault);
|
|
179
|
+
const field = deps.resolveField(options.field);
|
|
180
|
+
const providedValues = parseKeyValuePairs(options.values);
|
|
181
|
+
const resolvedValues = {};
|
|
182
|
+
for (const templateField of template.fields) {
|
|
183
|
+
const provided = providedValues[templateField];
|
|
184
|
+
if (provided) {
|
|
185
|
+
resolvedValues[templateField] = provided;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (!canPrompt) {
|
|
189
|
+
throw new OpError(`Missing value for ${templateField}. Use --value ${templateField}=... or enable prompts.`, 2);
|
|
190
|
+
}
|
|
191
|
+
const answer = await deps.prompt([
|
|
192
|
+
{
|
|
193
|
+
type: 'password',
|
|
194
|
+
name: 'value',
|
|
195
|
+
message: `Enter value for ${templateField}:`,
|
|
196
|
+
mask: '*',
|
|
197
|
+
validate: (input) => input.length > 0 || 'Value cannot be empty',
|
|
198
|
+
},
|
|
199
|
+
]);
|
|
200
|
+
resolvedValues[templateField] = answer.value;
|
|
201
|
+
}
|
|
202
|
+
const spinner = deps.createSpinner(`Saving ${template.fields.length} secret${template.fields.length === 1 ? '' : 's'}...`, options.quiet === true);
|
|
203
|
+
for (const [key, value] of Object.entries(resolvedValues)) {
|
|
204
|
+
deps.setSecret(key, value, vault, field);
|
|
205
|
+
}
|
|
206
|
+
spinner.succeed(chalk.green('Template secrets saved.'));
|
|
207
|
+
if (!options.quiet) {
|
|
208
|
+
console.log(chalk.cyan('\nCreated secrets:'));
|
|
209
|
+
for (const key of Object.keys(resolvedValues)) {
|
|
210
|
+
console.log(chalk.white(` ${key}`));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
if (error instanceof OpError) {
|
|
216
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
217
|
+
process.exit(error.exitCode);
|
|
218
|
+
}
|
|
219
|
+
throw error;
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
export const templateListCommand = createTemplateListCommand();
|
|
224
|
+
export const templateCreateCommand = createTemplateCreateCommand();
|
|
225
|
+
export const templateApplyCommand = createTemplateApplyCommand();
|
|
226
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/commands/template.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAuB,MAAM,uBAAuB,CAAC;AACjF,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GAEnB,MAAM,0BAA0B,CAAC;AASlC,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,OAAO,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,SAAS;QACnC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,gBAAgB,CACvB,QAAmD,EACnD,MAA4B;IAE5B,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,MAAsC;IAEtC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC7D,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACrC,CAAC;IACF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACjD,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CACtC,CAAC;IAEF,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,eAAe,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAY,EACZ,MAAsC;IAEtC,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,OAAO;QAAE,OAAO,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEzD,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,cAAc;QAAE,OAAO,SAAS,CAAC;IAEtC,OAAO,gBAAgB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA2B;IACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE5C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,OAAO,CACf,0EAA0E,EAC1E,CAAC,CACF,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEpD,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,OAAO,CACf,0EAA0E,EAC1E,CAAC,CACF,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AA2CD,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;AAE5C,MAAM,mBAAmB,GAAyB;IAChD,UAAU;IACV,SAAS;IACT,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,mBAAmB;IACnB,mBAAmB,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,mBAAmB,EAAE;IAC9D,mBAAmB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,SAAS,CAAC;IAChF,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC9D,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,mBAAmB,EAAE,CAAC;IACzF,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;CACnD,CAAC;AAEF,MAAM,UAAU,yBAAyB,CACvC,YAA2C,EAAE;IAE7C,MAAM,IAAI,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,SAAS,EAAE,CAAC;IAEtD,OAAO,KAAK,UAAU,mBAAmB,CACvC,OAA4B;QAE5B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC;YACtD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAE/B,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;YAE1D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAClD,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACpE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CACT,KAAK,QAAQ,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChE,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,YAA2C,EAAE;IAE7C,MAAM,IAAI,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,SAAS,EAAE,CAAC;IAEtD,OAAO,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,OAA8B;QAE9B,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC;YACtD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAE/B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,IAAI,OAAO,CAAC,8CAA8C,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,OAAO,CAAC,aAAa,cAAc,0CAA0C,EAAE,CAAC,CAAC,CAAC;YAC9F,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE7C,IAAI,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChD,MAAM,IAAI,OAAO,CACf,aAAa,cAAc,6CAA6C,EACxE,CAAC,CACF,CAAC;YACJ,CAAC;YAED,SAAS,CAAC,cAAc,CAAC,GAAG;gBAC1B,IAAI,EAAE,cAAc;gBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,MAAM;aACP,CAAC;YAEF,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAEpC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,cAAc,UAAU,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,YAA2C,EAAE;IAE7C,MAAM,IAAI,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,SAAS,EAAE,CAAC;IAEtD,OAAO,KAAK,UAAU,oBAAoB,CACxC,IAAY,EACZ,OAA6B;QAE7B,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;YACrD,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAElB,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACxE,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC;YACtD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC;YACtD,MAAM,SAAS,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAExD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,OAAO,CAAC,aAAa,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,cAAc,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE1D,MAAM,cAAc,GAA2B,EAAE,CAAC;YAElD,KAAK,MAAM,aAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC5C,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;gBAC/C,IAAI,QAAQ,EAAE,CAAC;oBACb,cAAc,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;oBACzC,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,IAAI,OAAO,CACf,qBAAqB,aAAa,iBAAiB,aAAa,yBAAyB,EACzF,CAAC,CACF,CAAC;gBACJ,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;oBAC/B;wBACE,IAAI,EAAE,UAAU;wBAChB,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,mBAAmB,aAAa,GAAG;wBAC5C,IAAI,EAAE,GAAG;wBACT,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,uBAAuB;qBACzE;iBACF,CAAC,CAAC;gBACH,cAAc,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,KAAe,CAAC;YACzD,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAChC,UAAU,QAAQ,CAAC,MAAM,CAAC,MAAM,UAAU,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EACtF,OAAO,CAAC,KAAK,KAAK,IAAI,CACvB,CAAC;YAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAExD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;oBAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,yBAAyB,EAAE,CAAC;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,EAAE,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,9 +13,11 @@ import { inspectCommand } from './commands/inspect.js';
|
|
|
13
13
|
import { vaultsCommand } from './commands/vaults.js';
|
|
14
14
|
import { completionCommand } from './commands/completion.js';
|
|
15
15
|
import { getManyCommand } from './commands/get-many.js';
|
|
16
|
+
import { templateApplyCommand, templateCreateCommand, templateListCommand } from './commands/template.js';
|
|
16
17
|
import { setRetryOptions } from './utils/op.js';
|
|
17
18
|
import { isRetryDisabled } from './utils/retry.js';
|
|
18
19
|
import { loadSessionCacheIntoEnv, persistSessionCacheFromEnv } from './utils/session-cache.js';
|
|
20
|
+
import { interactiveCommand } from './commands/interactive.js';
|
|
19
21
|
// Dynamic version from package.json
|
|
20
22
|
const require = createRequire(import.meta.url);
|
|
21
23
|
const pkg = require('../package.json');
|
|
@@ -193,12 +195,49 @@ program
|
|
|
193
195
|
.option('-q, --quiet', 'suppress non-essential output')
|
|
194
196
|
.option('--no-color', 'disable color output')
|
|
195
197
|
.action(resolveCommand);
|
|
198
|
+
program
|
|
199
|
+
.command('interactive')
|
|
200
|
+
.alias('i')
|
|
201
|
+
.description('Browse vaults and items interactively')
|
|
202
|
+
.option('-v, --vault <vault>', 'vault name (default: OPS_VAULT or Private)')
|
|
203
|
+
.option('-f, --field <field>', 'field name (default: OPS_FIELD or password)')
|
|
204
|
+
.option('--no-color', 'disable color output')
|
|
205
|
+
.action(interactiveCommand);
|
|
196
206
|
program
|
|
197
207
|
.command('completion [shell]')
|
|
198
208
|
.description('Generate shell completion script (bash, zsh, fish)')
|
|
199
209
|
.option('-q, --quiet', 'suppress non-essential output')
|
|
200
210
|
.option('--no-color', 'disable color output')
|
|
201
211
|
.action(completionCommand);
|
|
212
|
+
const template = program
|
|
213
|
+
.command('template')
|
|
214
|
+
.description('Manage secret templates');
|
|
215
|
+
template
|
|
216
|
+
.command('list')
|
|
217
|
+
.description('List available templates')
|
|
218
|
+
.option('-j, --json', 'output as JSON')
|
|
219
|
+
.option('-q, --quiet', 'suppress non-essential output')
|
|
220
|
+
.option('--no-color', 'disable color output')
|
|
221
|
+
.action(templateListCommand);
|
|
222
|
+
template
|
|
223
|
+
.command('create <name>')
|
|
224
|
+
.description('Create a custom template')
|
|
225
|
+
.option('--fields <fields>', 'comma or space separated field names (e.g. API_KEY,API_SECRET)')
|
|
226
|
+
.option('--description <description>', 'template description')
|
|
227
|
+
.option('--force', 'overwrite existing custom template')
|
|
228
|
+
.option('-q, --quiet', 'suppress non-essential output')
|
|
229
|
+
.option('--no-color', 'disable color output')
|
|
230
|
+
.action(templateCreateCommand);
|
|
231
|
+
template
|
|
232
|
+
.command('apply <name>')
|
|
233
|
+
.description('Apply a template and create secrets')
|
|
234
|
+
.option('-v, --vault <vault>', 'vault name (default: OPS_VAULT or Private)')
|
|
235
|
+
.option('-f, --field <field>', 'field name (default: OPS_FIELD or password)')
|
|
236
|
+
.option('--value <pair>', 'provide field value (repeatable, e.g. --value API_KEY=secret)', (value, previous = []) => [...previous, value], [])
|
|
237
|
+
.option('--no-input', 'disable prompts (fail if input is required)')
|
|
238
|
+
.option('-q, --quiet', 'suppress non-essential output')
|
|
239
|
+
.option('--no-color', 'disable color output')
|
|
240
|
+
.action(templateApplyCommand);
|
|
202
241
|
// Error handling
|
|
203
242
|
process.on('uncaughtException', (error) => {
|
|
204
243
|
console.error('Unexpected error:', error.message);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface SecretTemplateDefinition {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
fields: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare const builtinTemplates: SecretTemplateDefinition[];
|
|
7
|
+
export declare function getBuiltinTemplate(name: string): SecretTemplateDefinition | undefined;
|
|
8
|
+
//# sourceMappingURL=builtins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../src/templates/builtins.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,eAAO,MAAM,gBAAgB,EAAE,wBAAwB,EA+BtD,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CAGrF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const builtinTemplates = [
|
|
2
|
+
{
|
|
3
|
+
name: 'postgres',
|
|
4
|
+
description: 'Postgres connection fields',
|
|
5
|
+
fields: ['DB_HOST', 'DB_PORT', 'DB_USER', 'DB_PASSWORD', 'DB_NAME'],
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
name: 'mysql',
|
|
9
|
+
description: 'MySQL connection fields',
|
|
10
|
+
fields: ['DB_HOST', 'DB_PORT', 'DB_USER', 'DB_PASSWORD', 'DB_NAME'],
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'redis',
|
|
14
|
+
description: 'Redis connection fields',
|
|
15
|
+
fields: ['REDIS_URL', 'REDIS_PASSWORD'],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'oauth',
|
|
19
|
+
description: 'OAuth client fields',
|
|
20
|
+
fields: ['CLIENT_ID', 'CLIENT_SECRET', 'REDIRECT_URI'],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'api',
|
|
24
|
+
description: 'Generic API credentials',
|
|
25
|
+
fields: ['API_KEY', 'API_SECRET', 'API_URL'],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'smtp',
|
|
29
|
+
description: 'SMTP credentials',
|
|
30
|
+
fields: ['SMTP_HOST', 'SMTP_PORT', 'SMTP_USER', 'SMTP_PASSWORD'],
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
export function getBuiltinTemplate(name) {
|
|
34
|
+
const normalized = name.toLowerCase();
|
|
35
|
+
return builtinTemplates.find((template) => template.name === normalized);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=builtins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/templates/builtins.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,gBAAgB,GAA+B;IAC1D;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,4BAA4B;QACzC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,CAAC;KACpE;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,yBAAyB;QACtC,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,CAAC;KACpE;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,yBAAyB;QACtC,MAAM,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC;KACxC;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,qBAAqB;QAClC,MAAM,EAAE,CAAC,WAAW,EAAE,eAAe,EAAE,cAAc,CAAC;KACvD;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,yBAAyB;QACtC,MAAM,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC;KAC7C;IACD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,kBAAkB;QAC/B,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,CAAC;KACjE;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { join, dirname } from 'path';
|
|
4
|
+
export interface CustomTemplate {
|
|
5
|
+
name: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
fields: string[];
|
|
8
|
+
}
|
|
9
|
+
interface TemplateStoreDependencies {
|
|
10
|
+
existsSync: typeof existsSync;
|
|
11
|
+
readFileSync: typeof readFileSync;
|
|
12
|
+
writeFileSync: typeof writeFileSync;
|
|
13
|
+
mkdirSync: typeof mkdirSync;
|
|
14
|
+
homedir: typeof homedir;
|
|
15
|
+
join: typeof join;
|
|
16
|
+
dirname: typeof dirname;
|
|
17
|
+
}
|
|
18
|
+
export declare function createTemplateStore(overrides?: Partial<TemplateStoreDependencies>): {
|
|
19
|
+
loadCustomTemplates: () => Record<string, CustomTemplate>;
|
|
20
|
+
saveCustomTemplates: (templates: Record<string, CustomTemplate>) => void;
|
|
21
|
+
};
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGrC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD,UAAU,yBAAyB;IACjC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,IAAI,EAAE,OAAO,IAAI,CAAC;IAClB,OAAO,EAAE,OAAO,OAAO,CAAC;CACzB;AAqCD,wBAAgB,mBAAmB,CAAC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM;+BAGpD,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;qCAyBtB,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,KAAG,IAAI;EAkB9E"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { join, dirname } from 'path';
|
|
4
|
+
import { OpError } from './types.js';
|
|
5
|
+
const defaultDeps = {
|
|
6
|
+
existsSync,
|
|
7
|
+
readFileSync,
|
|
8
|
+
writeFileSync,
|
|
9
|
+
mkdirSync,
|
|
10
|
+
homedir,
|
|
11
|
+
join,
|
|
12
|
+
dirname,
|
|
13
|
+
};
|
|
14
|
+
function getTemplatesPath(deps) {
|
|
15
|
+
return deps.join(deps.homedir(), '.config', 'ops-cli', 'templates.json');
|
|
16
|
+
}
|
|
17
|
+
function validateTemplatePayload(payload) {
|
|
18
|
+
if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
|
|
19
|
+
throw new OpError('Invalid templates file format.', 2);
|
|
20
|
+
}
|
|
21
|
+
if (!payload.templates || typeof payload.templates !== 'object') {
|
|
22
|
+
throw new OpError('Invalid templates file format.', 2);
|
|
23
|
+
}
|
|
24
|
+
for (const [name, template] of Object.entries(payload.templates)) {
|
|
25
|
+
if (!template || !Array.isArray(template.fields)) {
|
|
26
|
+
throw new OpError(`Invalid template "${name}" in templates file.`, 2);
|
|
27
|
+
}
|
|
28
|
+
for (const field of template.fields) {
|
|
29
|
+
if (typeof field !== 'string' || field.trim().length === 0) {
|
|
30
|
+
throw new OpError(`Invalid field in template "${name}".`, 2);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function createTemplateStore(overrides = {}) {
|
|
36
|
+
const deps = { ...defaultDeps, ...overrides };
|
|
37
|
+
function loadCustomTemplates() {
|
|
38
|
+
const path = getTemplatesPath(deps);
|
|
39
|
+
if (!deps.existsSync(path))
|
|
40
|
+
return {};
|
|
41
|
+
const content = deps.readFileSync(path, 'utf-8');
|
|
42
|
+
try {
|
|
43
|
+
const parsed = JSON.parse(content);
|
|
44
|
+
validateTemplatePayload(parsed);
|
|
45
|
+
const templates = {};
|
|
46
|
+
for (const [name, template] of Object.entries(parsed.templates)) {
|
|
47
|
+
templates[name] = {
|
|
48
|
+
name,
|
|
49
|
+
description: template.description,
|
|
50
|
+
fields: template.fields,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return templates;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const message = error instanceof Error ? error.message : 'Unable to parse templates file.';
|
|
57
|
+
throw new OpError(message, 2);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function saveCustomTemplates(templates) {
|
|
61
|
+
const path = getTemplatesPath(deps);
|
|
62
|
+
const payload = {
|
|
63
|
+
templates: {},
|
|
64
|
+
};
|
|
65
|
+
for (const [name, template] of Object.entries(templates)) {
|
|
66
|
+
payload.templates[name] = {
|
|
67
|
+
description: template.description,
|
|
68
|
+
fields: template.fields,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
deps.mkdirSync(deps.dirname(path), { recursive: true, mode: 0o700 });
|
|
72
|
+
deps.writeFileSync(path, JSON.stringify(payload, null, 2), { mode: 0o600 });
|
|
73
|
+
}
|
|
74
|
+
return { loadCustomTemplates, saveCustomTemplates };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dc-ops-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "Easy secret retrieval from 1Password with smart fallbacks",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"cross-spawn": "^7.0.3",
|
|
48
48
|
"dotenv": "^16.4.5",
|
|
49
49
|
"inquirer": "^9.2.12",
|
|
50
|
+
"inquirer-autocomplete-prompt": "^3.0.1",
|
|
50
51
|
"ora": "^7.0.1",
|
|
51
52
|
"yaml": "^2.8.2"
|
|
52
53
|
},
|