dc-ops-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +310 -0
  2. package/dist/commands/copy.d.ts +23 -0
  3. package/dist/commands/copy.d.ts.map +1 -0
  4. package/dist/commands/copy.js +74 -0
  5. package/dist/commands/copy.js.map +1 -0
  6. package/dist/commands/export.d.ts +14 -0
  7. package/dist/commands/export.d.ts.map +1 -0
  8. package/dist/commands/export.js +111 -0
  9. package/dist/commands/export.js.map +1 -0
  10. package/dist/commands/get.d.ts +31 -0
  11. package/dist/commands/get.d.ts.map +1 -0
  12. package/dist/commands/get.js +142 -0
  13. package/dist/commands/get.js.map +1 -0
  14. package/dist/commands/import.d.ts +27 -0
  15. package/dist/commands/import.d.ts.map +1 -0
  16. package/dist/commands/import.js +129 -0
  17. package/dist/commands/import.js.map +1 -0
  18. package/dist/commands/inspect.d.ts +20 -0
  19. package/dist/commands/inspect.d.ts.map +1 -0
  20. package/dist/commands/inspect.js +73 -0
  21. package/dist/commands/inspect.js.map +1 -0
  22. package/dist/commands/list.d.ts +11 -0
  23. package/dist/commands/list.d.ts.map +1 -0
  24. package/dist/commands/list.js +90 -0
  25. package/dist/commands/list.js.map +1 -0
  26. package/dist/commands/resolve.d.ts +18 -0
  27. package/dist/commands/resolve.d.ts.map +1 -0
  28. package/dist/commands/resolve.js +143 -0
  29. package/dist/commands/resolve.js.map +1 -0
  30. package/dist/commands/run.d.ts +29 -0
  31. package/dist/commands/run.d.ts.map +1 -0
  32. package/dist/commands/run.js +127 -0
  33. package/dist/commands/run.js.map +1 -0
  34. package/dist/commands/set.d.ts +12 -0
  35. package/dist/commands/set.d.ts.map +1 -0
  36. package/dist/commands/set.js +86 -0
  37. package/dist/commands/set.js.map +1 -0
  38. package/dist/commands/vaults.d.ts +18 -0
  39. package/dist/commands/vaults.d.ts.map +1 -0
  40. package/dist/commands/vaults.js +54 -0
  41. package/dist/commands/vaults.js.map +1 -0
  42. package/dist/index.d.ts +3 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +161 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/utils/cli.d.ts +8 -0
  47. package/dist/utils/cli.d.ts.map +1 -0
  48. package/dist/utils/cli.js +53 -0
  49. package/dist/utils/cli.js.map +1 -0
  50. package/dist/utils/io.d.ts +2 -0
  51. package/dist/utils/io.d.ts.map +1 -0
  52. package/dist/utils/io.js +8 -0
  53. package/dist/utils/io.js.map +1 -0
  54. package/dist/utils/op.d.ts +68 -0
  55. package/dist/utils/op.d.ts.map +1 -0
  56. package/dist/utils/op.js +358 -0
  57. package/dist/utils/op.js.map +1 -0
  58. package/dist/utils/types.d.ts +31 -0
  59. package/dist/utils/types.d.ts.map +1 -0
  60. package/dist/utils/types.js +9 -0
  61. package/dist/utils/types.js.map +1 -0
  62. package/package.json +52 -0
@@ -0,0 +1,142 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import { getSecret, setSecret, checkOpCli, itemExists, getItemFields, findSimilarItems } from '../utils/op.js';
4
+ import { applyColorConfig, createSpinner, isInteractiveInput, resolveBooleanOption, resolveField, resolveVault, } from '../utils/cli.js';
5
+ import { OpError } from '../utils/types.js';
6
+ const defaultDependencies = {
7
+ getSecret,
8
+ setSecret,
9
+ checkOpCli,
10
+ itemExists,
11
+ getItemFields,
12
+ findSimilarItems,
13
+ prompt: inquirer.prompt,
14
+ applyColorConfig,
15
+ createSpinner,
16
+ isInteractiveInput,
17
+ resolveBooleanOption,
18
+ resolveField,
19
+ resolveVault,
20
+ };
21
+ export function createGetCommand(overrides = {}) {
22
+ const deps = { ...defaultDependencies, ...overrides };
23
+ return async function getCommand(name, options) {
24
+ try {
25
+ // Validate name is not empty
26
+ if (!name || name.trim().length === 0) {
27
+ throw new OpError('Secret name cannot be empty.', 2);
28
+ }
29
+ deps.checkOpCli();
30
+ if (options.json && (options.plain || options.silent)) {
31
+ throw new OpError('Use either --json or --plain/--silent, not both.', 2);
32
+ }
33
+ const vault = deps.resolveVault(options.vault);
34
+ const field = deps.resolveField(options.field);
35
+ const envQuiet = deps.resolveBooleanOption(undefined, 'OPS_QUIET');
36
+ const quiet = options.quiet === true || envQuiet;
37
+ const envNoInput = deps.resolveBooleanOption(undefined, 'OPS_NO_INPUT');
38
+ const envNoColor = deps.resolveBooleanOption(undefined, 'OPS_NO_COLOR');
39
+ const outputMode = options.json
40
+ ? 'json'
41
+ : options.plain || options.silent
42
+ ? 'plain'
43
+ : 'human';
44
+ const noInput = options.input === false || envNoInput || outputMode !== 'human';
45
+ const noColor = options.color === false || envNoColor;
46
+ deps.applyColorConfig(noColor);
47
+ const quietSpinner = quiet || outputMode !== 'human';
48
+ const spinner = deps.createSpinner('Fetching secret from 1Password...', quietSpinner);
49
+ const secret = deps.getSecret(name, vault, field);
50
+ if (secret !== null) {
51
+ if (!quietSpinner) {
52
+ spinner.succeed(chalk.green('Secret retrieved!'));
53
+ }
54
+ if (outputMode === 'json') {
55
+ console.log(JSON.stringify({ name, vault, field, value: secret }, null, 2));
56
+ return;
57
+ }
58
+ if (outputMode === 'plain') {
59
+ console.log(secret);
60
+ return;
61
+ }
62
+ if (!quiet) {
63
+ console.log(chalk.cyan('\nSecret value:'));
64
+ }
65
+ console.log(chalk.white(secret));
66
+ return;
67
+ }
68
+ // Determine if item exists but field is wrong, or item doesn't exist at all
69
+ const exists = deps.itemExists(name, vault);
70
+ if (exists) {
71
+ // Item exists but field not found - suggest available fields
72
+ const fields = deps.getItemFields(name, vault);
73
+ if (!quietSpinner) {
74
+ spinner.fail(chalk.yellow(`Field "${field}" not found on item "${name}"`));
75
+ }
76
+ let errorMessage = `Field "${field}" not found.`;
77
+ if (fields.length > 0) {
78
+ errorMessage += ` Available fields: ${fields.join(', ')}`;
79
+ errorMessage += `\nTry: ops get "${name}" --field ${fields[0]}`;
80
+ }
81
+ else {
82
+ errorMessage += ` Use: ops inspect "${name}" to see available fields.`;
83
+ }
84
+ throw new OpError(errorMessage, 1);
85
+ }
86
+ if (!quietSpinner) {
87
+ spinner.fail(chalk.yellow(`Secret "${name}" not found in vault "${vault}"`));
88
+ }
89
+ // Suggest similar names
90
+ const similar = deps.findSimilarItems(name, vault);
91
+ if (similar.length > 0 && !noInput) {
92
+ console.log(chalk.cyan('\nDid you mean?'));
93
+ for (const suggestion of similar) {
94
+ console.log(chalk.white(` - ${suggestion}`));
95
+ }
96
+ }
97
+ const canPrompt = !noInput && deps.isInteractiveInput();
98
+ if (!canPrompt) {
99
+ throw new OpError('Secret not found. Use ops set to create it.', 1);
100
+ }
101
+ const answers = await deps.prompt([
102
+ {
103
+ type: 'confirm',
104
+ name: 'create',
105
+ message: 'Would you like to create this secret now?',
106
+ default: true,
107
+ },
108
+ ]);
109
+ if (!answers.create) {
110
+ console.log(chalk.gray('Operation cancelled.'));
111
+ return;
112
+ }
113
+ const valueAnswer = await deps.prompt([
114
+ {
115
+ type: 'password',
116
+ name: 'value',
117
+ message: 'Enter secret value:',
118
+ mask: '*',
119
+ validate: (input) => input.length > 0 || 'Secret value cannot be empty',
120
+ },
121
+ ]);
122
+ const storeSpinner = deps.createSpinner('Storing secret in 1Password...', quietSpinner);
123
+ deps.setSecret(name, valueAnswer.value, vault, field);
124
+ if (!quietSpinner) {
125
+ storeSpinner.succeed(chalk.green('Secret stored successfully!'));
126
+ }
127
+ if (!quiet) {
128
+ console.log(chalk.cyan('\nYou can retrieve it anytime with:'));
129
+ console.log(chalk.white(` ops get ${name}`));
130
+ }
131
+ }
132
+ catch (error) {
133
+ if (error instanceof OpError) {
134
+ console.error(chalk.red(`Error: ${error.message}`));
135
+ process.exit(error.exitCode);
136
+ }
137
+ throw error;
138
+ }
139
+ };
140
+ }
141
+ export const getCommand = createGetCommand();
142
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC/G,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;AA6B5C,MAAM,mBAAmB,GAAoB;IAC3C,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa;IACb,gBAAgB;IAChB,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,gBAAgB;IAChB,aAAa;IACb,kBAAkB;IAClB,oBAAoB;IACpB,YAAY;IACZ,YAAY;CACb,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAC9B,YAAsC,EAAE;IAExC,MAAM,IAAI,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,SAAS,EAAE,CAAC;IAEtD,OAAO,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,OAAmB;QAEnB,IAAI,CAAC;YACH,6BAA6B;YAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAElB,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,OAAO,CAAC,kDAAkD,EAAE,CAAC,CAAC,CAAC;YAC3E,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,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC;YACjD,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,UAAU,GAAG,OAAO,CAAC,IAAI;gBAC7B,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM;oBACjC,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,OAAO,CAAC;YACZ,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,UAAU,IAAI,UAAU,KAAK,OAAO,CAAC;YAChF,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC;YAEtD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAE/B,MAAM,YAAY,GAAG,KAAK,IAAI,UAAU,KAAK,OAAO,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,mCAAmC,EAAE,YAAY,CAAC,CAAC;YAEtF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAElD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACpD,CAAC;gBAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC5E,OAAO;gBACT,CAAC;gBAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACpB,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC7C,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjC,OAAO;YACT,CAAC;YAED,4EAA4E;YAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAE5C,IAAI,MAAM,EAAE,CAAC;gBACX,6DAA6D;gBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,wBAAwB,IAAI,GAAG,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBAED,IAAI,YAAY,GAAG,UAAU,KAAK,cAAc,CAAC;gBACjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,YAAY,IAAI,sBAAsB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1D,YAAY,IAAI,mBAAmB,IAAI,aAAa,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,CAAC;qBAAM,CAAC;oBACN,YAAY,IAAI,sBAAsB,IAAI,4BAA4B,CAAC;gBACzE,CAAC;gBACD,MAAM,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,yBAAyB,KAAK,GAAG,CAAC,CAAC,CAAC;YAC/E,CAAC;YAED,wBAAwB;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC3C,KAAK,MAAM,UAAU,IAAI,OAAO,EAAE,CAAC;oBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAExD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,OAAO,CAAC,6CAA6C,EAAE,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;gBAChC;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,2CAA2C;oBACpD,OAAO,EAAE,IAAI;iBACd;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;gBACpC;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,qBAAqB;oBAC9B,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAC1B,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,8BAA8B;iBACrD;aACF,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,gCAAgC,EAAE,YAAY,CAAC,CAAC;YACxF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC;YAChD,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,UAAU,GAAG,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { readFileSync } from 'fs';
2
+ import inquirer from 'inquirer';
3
+ import { checkOpCli, getItem, createItem, updateItem } from '../utils/op.js';
4
+ import { applyColorConfig, createSpinner, resolveBooleanOption, resolveVault } from '../utils/cli.js';
5
+ export interface ImportOptions {
6
+ vault?: string;
7
+ quiet?: boolean;
8
+ color?: boolean;
9
+ dryRun?: boolean;
10
+ }
11
+ export interface ImportDependencies {
12
+ checkOpCli: typeof checkOpCli;
13
+ readFileSync: typeof readFileSync;
14
+ parseEnv: (content: string) => Record<string, string>;
15
+ getItem: typeof getItem;
16
+ createItem: typeof createItem;
17
+ updateItem: typeof updateItem;
18
+ prompt: typeof inquirer.prompt;
19
+ isInteractive: () => boolean;
20
+ createSpinner: typeof createSpinner;
21
+ applyColorConfig: typeof applyColorConfig;
22
+ resolveBooleanOption: typeof resolveBooleanOption;
23
+ resolveVault: typeof resolveVault;
24
+ }
25
+ export declare function createImportCommand(overrides?: Partial<ImportDependencies>): (filePath: string, options: ImportOptions) => Promise<void>;
26
+ export declare const importCommand: (filePath: string, options: ImportOptions) => Promise<void>;
27
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACb,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,MAAM,EAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAC/B,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,YAAY,EAAE,OAAO,YAAY,CAAC;CACnC;AAiBD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAoI7D;AAED,eAAO,MAAM,aAAa,aAtIZ,MAAM,WAAW,aAAa,KAAK,OAAO,CAAC,IAAI,CAsIX,CAAC"}
@@ -0,0 +1,129 @@
1
+ import { readFileSync } from 'fs';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ import dotenv from 'dotenv';
5
+ import { checkOpCli, getItem, createItem, updateItem } from '../utils/op.js';
6
+ import { applyColorConfig, createSpinner, resolveBooleanOption, resolveVault, } from '../utils/cli.js';
7
+ import { OpError } from '../utils/types.js';
8
+ const defaultDependencies = {
9
+ checkOpCli,
10
+ readFileSync,
11
+ parseEnv: (content) => dotenv.parse(content),
12
+ getItem,
13
+ createItem,
14
+ updateItem,
15
+ prompt: inquirer.prompt,
16
+ isInteractive: () => Boolean(process.stdin.isTTY),
17
+ createSpinner,
18
+ applyColorConfig,
19
+ resolveBooleanOption,
20
+ resolveVault,
21
+ };
22
+ export function createImportCommand(overrides = {}) {
23
+ const deps = { ...defaultDependencies, ...overrides };
24
+ return async function importCommand(filePath, options) {
25
+ try {
26
+ const envQuiet = deps.resolveBooleanOption(undefined, 'OPS_QUIET');
27
+ const quiet = options.quiet === true || envQuiet;
28
+ const envNoColor = deps.resolveBooleanOption(undefined, 'OPS_NO_COLOR');
29
+ const noColor = options.color === false || envNoColor;
30
+ deps.applyColorConfig(noColor);
31
+ deps.checkOpCli();
32
+ const vault = deps.resolveVault(options.vault);
33
+ let contents;
34
+ try {
35
+ contents = deps.readFileSync(filePath, 'utf-8');
36
+ }
37
+ catch (error) {
38
+ const message = error instanceof Error ? error.message : 'Unable to read file.';
39
+ throw new OpError(`Failed to read "${filePath}": ${message}`, 2);
40
+ }
41
+ let parsed;
42
+ try {
43
+ parsed = deps.parseEnv(contents);
44
+ }
45
+ catch (error) {
46
+ const message = error instanceof Error ? error.message : 'Unable to parse env file.';
47
+ throw new OpError(`Failed to parse "${filePath}": ${message}`, 2);
48
+ }
49
+ const entries = Object.entries(parsed);
50
+ if (entries.length === 0) {
51
+ if (!quiet) {
52
+ console.log(chalk.yellow('No entries found to import.'));
53
+ }
54
+ return;
55
+ }
56
+ const dryRunPrefix = options.dryRun ? '[DRY RUN] ' : '';
57
+ const spinner = deps.createSpinner(`${dryRunPrefix}Importing ${entries.length} secrets into "${vault}"...`, quiet);
58
+ const imported = [];
59
+ const updated = [];
60
+ const skipped = [];
61
+ const canPrompt = deps.isInteractive();
62
+ for (const [key, value] of entries) {
63
+ spinner.text = `${dryRunPrefix}Importing ${key}...`;
64
+ const existing = deps.getItem(key, vault);
65
+ if (existing) {
66
+ if (options.dryRun) {
67
+ // In dry-run mode, assume update would happen (no prompt)
68
+ updated.push(key);
69
+ continue;
70
+ }
71
+ if (!canPrompt) {
72
+ skipped.push(key);
73
+ continue;
74
+ }
75
+ const { action } = await deps.prompt([
76
+ {
77
+ type: 'list',
78
+ name: 'action',
79
+ message: `Secret "${key}" already exists. Update it?`,
80
+ choices: [
81
+ { name: 'Update', value: 'update' },
82
+ { name: 'Skip', value: 'skip' },
83
+ ],
84
+ default: 'skip',
85
+ },
86
+ ]);
87
+ if (action === 'skip') {
88
+ skipped.push(key);
89
+ continue;
90
+ }
91
+ deps.updateItem(key, value, vault, 'password');
92
+ updated.push(key);
93
+ continue;
94
+ }
95
+ if (!options.dryRun) {
96
+ deps.createItem(key, value, vault, 'password');
97
+ }
98
+ imported.push(key);
99
+ }
100
+ if (!quiet) {
101
+ const wouldVerb = options.dryRun ? 'Would import' : 'Imported';
102
+ const wouldUpdate = options.dryRun ? 'would update' : 'updated';
103
+ spinner.succeed(chalk.green(`${dryRunPrefix}${wouldVerb} ${imported.length}, ${wouldUpdate} ${updated.length}, skipped ${skipped.length}.`));
104
+ const reportTitle = options.dryRun ? '\n[DRY RUN] Import preview:' : '\nImport report:';
105
+ console.log(chalk.cyan(reportTitle));
106
+ if (imported.length) {
107
+ const importLabel = options.dryRun ? 'Would import' : 'Imported';
108
+ console.log(chalk.green(` ${importLabel}: ${imported.join(', ')}`));
109
+ }
110
+ if (updated.length) {
111
+ const updateLabel = options.dryRun ? 'Would update' : 'Updated';
112
+ console.log(chalk.yellow(` ${updateLabel}: ${updated.join(', ')}`));
113
+ }
114
+ if (skipped.length) {
115
+ console.log(chalk.gray(` Skipped: ${skipped.join(', ')}`));
116
+ }
117
+ }
118
+ }
119
+ catch (error) {
120
+ if (error instanceof OpError) {
121
+ console.error(chalk.red(`Error: ${error.message}`));
122
+ process.exit(error.exitCode);
123
+ }
124
+ throw error;
125
+ }
126
+ };
127
+ }
128
+ export const importCommand = createImportCommand();
129
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { getItem, checkOpCli } from '../utils/op.js';
2
+ import { applyColorConfig, createSpinner, resolveBooleanOption, resolveVault } from '../utils/cli.js';
3
+ export interface InspectOptions {
4
+ vault?: string;
5
+ json?: boolean;
6
+ quiet?: boolean;
7
+ color?: boolean;
8
+ }
9
+ export interface InspectDependencies {
10
+ getItem: typeof getItem;
11
+ checkOpCli: typeof checkOpCli;
12
+ applyColorConfig: typeof applyColorConfig;
13
+ createSpinner: typeof createSpinner;
14
+ resolveBooleanOption: typeof resolveBooleanOption;
15
+ resolveVault: typeof resolveVault;
16
+ log: (message: string) => void;
17
+ }
18
+ export declare function createInspectCommand(overrides?: Partial<InspectDependencies>): (name: string, options: InspectOptions) => Promise<void>;
19
+ export declare const inspectCommand: (name: string, options: InspectOptions) => Promise<void>;
20
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACb,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAYD,wBAAgB,oBAAoB,CAClC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAuE1D;AAED,eAAO,MAAM,cAAc,SAzEjB,MAAM,WAAW,cAAc,KAAK,OAAO,CAAC,IAAI,CAyEN,CAAC"}
@@ -0,0 +1,73 @@
1
+ import chalk from 'chalk';
2
+ import { getItem, checkOpCli } from '../utils/op.js';
3
+ import { applyColorConfig, createSpinner, resolveBooleanOption, resolveVault, } from '../utils/cli.js';
4
+ import { OpError } from '../utils/types.js';
5
+ const defaultDependencies = {
6
+ getItem,
7
+ checkOpCli,
8
+ applyColorConfig,
9
+ createSpinner,
10
+ resolveBooleanOption,
11
+ resolveVault,
12
+ log: console.log,
13
+ };
14
+ export function createInspectCommand(overrides = {}) {
15
+ const deps = { ...defaultDependencies, ...overrides };
16
+ return async function inspectCommand(name, options) {
17
+ try {
18
+ // Validate name is not empty
19
+ if (!name || name.trim().length === 0) {
20
+ throw new OpError('Item name cannot be empty.', 2);
21
+ }
22
+ deps.checkOpCli();
23
+ const vault = deps.resolveVault(options.vault);
24
+ const envQuiet = deps.resolveBooleanOption(undefined, 'OPS_QUIET');
25
+ const quiet = options.quiet === true || envQuiet;
26
+ const envNoColor = deps.resolveBooleanOption(undefined, 'OPS_NO_COLOR');
27
+ const noColor = options.color === false || envNoColor;
28
+ deps.applyColorConfig(noColor);
29
+ const spinner = deps.createSpinner(`Inspecting "${name}"...`, quiet);
30
+ const item = deps.getItem(name, vault);
31
+ if (!item) {
32
+ spinner.fail(chalk.yellow(`Item "${name}" not found in vault "${vault}"`));
33
+ throw new OpError(`Item not found. Use ops list to see available items.`, 1);
34
+ }
35
+ spinner.succeed(chalk.green(`Found item "${name}"`));
36
+ if (options.json) {
37
+ deps.log(JSON.stringify({
38
+ title: item.title,
39
+ vault: item.vault || vault,
40
+ category: item.category,
41
+ fields: item.fields?.map((f) => ({
42
+ label: f.label,
43
+ type: f.type,
44
+ id: f.id,
45
+ })) || [],
46
+ }, null, 2));
47
+ return;
48
+ }
49
+ deps.log(chalk.cyan(`\nItem: ${chalk.white(item.title)}`));
50
+ deps.log(chalk.cyan(`Vault: ${chalk.white(item.vault || vault)}`));
51
+ deps.log(chalk.cyan(`Category: ${chalk.white(item.category)}`));
52
+ deps.log(chalk.cyan('\nFields:'));
53
+ if (!item.fields || item.fields.length === 0) {
54
+ deps.log(chalk.gray(' (no fields)'));
55
+ return;
56
+ }
57
+ for (const field of item.fields) {
58
+ if (field.label) {
59
+ deps.log(chalk.white(` - ${field.label} ${chalk.gray(`(${field.type})`)}`));
60
+ }
61
+ }
62
+ }
63
+ catch (error) {
64
+ if (error instanceof OpError) {
65
+ console.error(chalk.red(`Error: ${error.message}`));
66
+ process.exit(error.exitCode);
67
+ }
68
+ throw error;
69
+ }
70
+ };
71
+ }
72
+ export const inspectCommand = createInspectCommand();
73
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface ListOptions {
2
+ vault?: string;
3
+ search?: string;
4
+ json?: boolean;
5
+ plain?: boolean;
6
+ favorites?: boolean;
7
+ quiet?: boolean;
8
+ color?: boolean;
9
+ }
10
+ export declare function listCommand(options: ListOptions): Promise<void>;
11
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GrE"}
@@ -0,0 +1,90 @@
1
+ import chalk from 'chalk';
2
+ import { listItems, searchItems, listFavorites, checkOpCli } from '../utils/op.js';
3
+ import { applyColorConfig, createSpinner, resolveBooleanOption, resolveVault, } from '../utils/cli.js';
4
+ import { OpError } from '../utils/types.js';
5
+ export async function listCommand(options) {
6
+ try {
7
+ checkOpCli();
8
+ if (options.json && options.plain) {
9
+ throw new OpError('Use either --json or --plain, not both.', 2);
10
+ }
11
+ const vault = resolveVault(options.vault);
12
+ const envQuiet = resolveBooleanOption(undefined, 'OPS_QUIET');
13
+ const quiet = options.quiet === true || envQuiet;
14
+ const envNoColor = resolveBooleanOption(undefined, 'OPS_NO_COLOR');
15
+ const noColor = options.color === false || envNoColor;
16
+ applyColorConfig(noColor);
17
+ const loadingMsg = options.favorites
18
+ ? `Loading favorites from vault "${vault}"...`
19
+ : options.search
20
+ ? `Searching for "${options.search}" in vault "${vault}"...`
21
+ : `Loading items from vault "${vault}"...`;
22
+ const quietSpinner = Boolean(quiet || options.json || options.plain);
23
+ const spinner = createSpinner(loadingMsg, quietSpinner);
24
+ const items = options.favorites
25
+ ? listFavorites(vault)
26
+ : options.search
27
+ ? searchItems(options.search, vault)
28
+ : listItems(vault);
29
+ if (!quietSpinner) {
30
+ spinner.stop();
31
+ }
32
+ if (items.length === 0) {
33
+ if (options.json) {
34
+ console.log('[]');
35
+ return;
36
+ }
37
+ if (options.plain) {
38
+ return;
39
+ }
40
+ const msg = options.favorites
41
+ ? 'No favorites found. Mark items as favorites in 1Password to see them here.'
42
+ : options.search
43
+ ? `No items found matching "${options.search}".`
44
+ : 'No items found.';
45
+ console.log(chalk.yellow(msg));
46
+ return;
47
+ }
48
+ if (options.json) {
49
+ console.log(JSON.stringify(items, null, 2));
50
+ return;
51
+ }
52
+ if (options.plain) {
53
+ items.forEach((item) => {
54
+ const favorite = item.favorite ? 'true' : 'false';
55
+ console.log(`${item.title}\t${item.category}\t${item.id}\t${favorite}`);
56
+ });
57
+ return;
58
+ }
59
+ // Display as table
60
+ const header = options.favorites
61
+ ? `\nFavorites in vault "${vault}":\n`
62
+ : options.search
63
+ ? `\nSearch results for "${options.search}" in vault "${vault}":\n`
64
+ : `\nItems in vault "${vault}":\n`;
65
+ console.log(chalk.bold.cyan(header));
66
+ const maxTitleLength = Math.max(...items.map((item) => item.title.length), 10);
67
+ // Header
68
+ console.log(chalk.gray(`${'TITLE'.padEnd(maxTitleLength + 2)} ${'CATEGORY'.padEnd(15)} ID`));
69
+ console.log(chalk.gray('─'.repeat(maxTitleLength + 50)));
70
+ // Items
71
+ items.forEach((item) => {
72
+ const star = item.favorite ? chalk.yellow('⭐ ') : ' ';
73
+ console.log(`${star}${chalk.white(item.title.padEnd(maxTitleLength - 1))} ${chalk.cyan(item.category.padEnd(15))} ${chalk.gray(item.id)}`);
74
+ });
75
+ const totalMsg = options.favorites
76
+ ? `\nTotal: ${items.length} favorites`
77
+ : options.search
78
+ ? `\nTotal: ${items.length} matching items`
79
+ : `\nTotal: ${items.length} items`;
80
+ console.log(chalk.gray(totalMsg));
81
+ }
82
+ catch (error) {
83
+ if (error instanceof OpError) {
84
+ console.error(chalk.red(`Error: ${error.message}`));
85
+ process.exit(error.exitCode);
86
+ }
87
+ throw error;
88
+ }
89
+ }
90
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { checkOpCli } from '../utils/op.js';
2
+ import { applyColorConfig, createSpinner, resolveBooleanOption } from '../utils/cli.js';
3
+ import type { OpItem } from '../utils/types.js';
4
+ export interface ResolveOptions {
5
+ json?: boolean;
6
+ quiet?: boolean;
7
+ color?: boolean;
8
+ }
9
+ export interface ResolveDependencies {
10
+ checkOpCli: typeof checkOpCli;
11
+ resolveShareLink: (shareLink: string) => OpItem;
12
+ createSpinner: typeof createSpinner;
13
+ applyColorConfig: typeof applyColorConfig;
14
+ resolveBooleanOption: typeof resolveBooleanOption;
15
+ }
16
+ export declare function createResolveCommand(overrides?: Partial<ResolveDependencies>): (shareLink: string, options: ResolveOptions) => Promise<void>;
17
+ export declare const resolveCommand: (shareLink: string, options: ResolveOptions) => Promise<void>;
18
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAwB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAW,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAChD,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;CACnD;AAqFD,wBAAgB,oBAAoB,CAClC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAkG/D;AAED,eAAO,MAAM,cAAc,cApGZ,MAAM,WAAW,cAAc,KAAK,OAAO,CAAC,IAAI,CAoGX,CAAC"}