@vultisig/cli 0.1.0-alpha.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +6 -0
  2. package/dist/index.js +3185 -361
  3. package/package.json +4 -3
  4. package/dist/adapters/cli-context.js +0 -25
  5. package/dist/adapters/cli-context.js.map +0 -1
  6. package/dist/adapters/cli-runner.js +0 -47
  7. package/dist/adapters/cli-runner.js.map +0 -1
  8. package/dist/adapters/index.js +0 -6
  9. package/dist/adapters/index.js.map +0 -1
  10. package/dist/commands/balance.js +0 -65
  11. package/dist/commands/balance.js.map +0 -1
  12. package/dist/commands/chains.js +0 -46
  13. package/dist/commands/chains.js.map +0 -1
  14. package/dist/commands/index.js +0 -12
  15. package/dist/commands/index.js.map +0 -1
  16. package/dist/commands/settings.js +0 -151
  17. package/dist/commands/settings.js.map +0 -1
  18. package/dist/commands/swap.js +0 -180
  19. package/dist/commands/swap.js.map +0 -1
  20. package/dist/commands/tokens.js +0 -116
  21. package/dist/commands/tokens.js.map +0 -1
  22. package/dist/commands/transaction.js +0 -99
  23. package/dist/commands/transaction.js.map +0 -1
  24. package/dist/commands/vault-management.js +0 -360
  25. package/dist/commands/vault-management.js.map +0 -1
  26. package/dist/core/command-context.js +0 -81
  27. package/dist/core/command-context.js.map +0 -1
  28. package/dist/core/index.js +0 -7
  29. package/dist/core/index.js.map +0 -1
  30. package/dist/core/password-manager.js +0 -92
  31. package/dist/core/password-manager.js.map +0 -1
  32. package/dist/core/types.js +0 -2
  33. package/dist/core/types.js.map +0 -1
  34. package/dist/index.js.map +0 -1
  35. package/dist/interactive/completer.js +0 -170
  36. package/dist/interactive/completer.js.map +0 -1
  37. package/dist/interactive/event-buffer.js +0 -186
  38. package/dist/interactive/event-buffer.js.map +0 -1
  39. package/dist/interactive/index.js +0 -9
  40. package/dist/interactive/index.js.map +0 -1
  41. package/dist/interactive/session.js +0 -525
  42. package/dist/interactive/session.js.map +0 -1
  43. package/dist/interactive/shell-commands.js +0 -167
  44. package/dist/interactive/shell-commands.js.map +0 -1
  45. package/dist/interactive/shell-context.js +0 -112
  46. package/dist/interactive/shell-context.js.map +0 -1
  47. package/dist/lib/completion.js +0 -375
  48. package/dist/lib/completion.js.map +0 -1
  49. package/dist/lib/config.js +0 -172
  50. package/dist/lib/config.js.map +0 -1
  51. package/dist/lib/errors.js +0 -163
  52. package/dist/lib/errors.js.map +0 -1
  53. package/dist/lib/index.js +0 -9
  54. package/dist/lib/index.js.map +0 -1
  55. package/dist/lib/output.js +0 -155
  56. package/dist/lib/output.js.map +0 -1
  57. package/dist/lib/version.js +0 -210
  58. package/dist/lib/version.js.map +0 -1
  59. package/dist/ui.js +0 -286
  60. package/dist/ui.js.map +0 -1
@@ -1,167 +0,0 @@
1
- import chalk from 'chalk';
2
- import Table from 'cli-table3';
3
- import inquirer from 'inquirer';
4
- import ora from 'ora';
5
- /**
6
- * Format time remaining in human-readable format
7
- */
8
- export function formatTimeRemaining(ms) {
9
- if (!ms || ms <= 0)
10
- return 'expired';
11
- const seconds = Math.floor(ms / 1000);
12
- const minutes = Math.floor(seconds / 60);
13
- const remainingSeconds = seconds % 60;
14
- if (minutes > 0) {
15
- return `${minutes}m ${remainingSeconds}s`;
16
- }
17
- return `${remainingSeconds}s`;
18
- }
19
- /**
20
- * Execute lock command - lock the active vault
21
- */
22
- export async function executeLock(ctx) {
23
- const vault = ctx.getActiveVault();
24
- if (!vault) {
25
- console.log(chalk.red('No active vault.'));
26
- console.log(chalk.yellow('Use "vault <name>" to switch to a vault first.'));
27
- return;
28
- }
29
- ctx.lockVault(vault.id);
30
- console.log(chalk.green('\n+ Vault locked'));
31
- console.log(chalk.gray('Password cache cleared. You will need to enter the password again.'));
32
- }
33
- /**
34
- * Execute unlock command - unlock the active vault
35
- */
36
- export async function executeUnlock(ctx) {
37
- const vault = ctx.getActiveVault();
38
- if (!vault) {
39
- console.log(chalk.red('No active vault.'));
40
- console.log(chalk.yellow('Use "vault <name>" to switch to a vault first.'));
41
- return;
42
- }
43
- if (ctx.isVaultUnlocked(vault.id)) {
44
- const timeRemaining = ctx.getUnlockTimeRemaining(vault.id);
45
- console.log(chalk.yellow('\nVault is already unlocked.'));
46
- console.log(chalk.gray(`Time remaining: ${formatTimeRemaining(timeRemaining)}`));
47
- return;
48
- }
49
- const { password } = await inquirer.prompt([
50
- {
51
- type: 'password',
52
- name: 'password',
53
- message: 'Enter vault password:',
54
- mask: '*',
55
- },
56
- ]);
57
- const spinner = ora('Unlocking vault...').start();
58
- try {
59
- await vault.unlock(password);
60
- ctx.cachePassword(vault.id, password);
61
- const timeRemaining = ctx.getUnlockTimeRemaining(vault.id);
62
- spinner.succeed('Vault unlocked');
63
- console.log(chalk.green(`\n+ Vault unlocked for ${formatTimeRemaining(timeRemaining)}`));
64
- }
65
- catch (err) {
66
- spinner.fail('Failed to unlock vault');
67
- console.error(chalk.red(`\nx ${err.message}`));
68
- }
69
- }
70
- /**
71
- * Execute status command - show vault status
72
- */
73
- export async function executeStatus(ctx) {
74
- const vault = ctx.getActiveVault();
75
- if (!vault) {
76
- console.log(chalk.red('No active vault.'));
77
- console.log(chalk.yellow('Use "vault <name>" to switch to a vault first.'));
78
- return;
79
- }
80
- const isUnlocked = ctx.isVaultUnlocked(vault.id);
81
- let timeRemaining;
82
- let timeRemainingFormatted;
83
- if (isUnlocked) {
84
- timeRemaining = ctx.getUnlockTimeRemaining(vault.id);
85
- timeRemainingFormatted = formatTimeRemaining(timeRemaining);
86
- }
87
- const status = {
88
- name: vault.name,
89
- id: vault.id,
90
- type: vault.type,
91
- isUnlocked,
92
- timeRemaining,
93
- timeRemainingFormatted,
94
- createdAt: vault.createdAt,
95
- lastModified: vault.lastModified,
96
- threshold: vault.threshold,
97
- totalSigners: vault.totalSigners,
98
- libType: vault.libType,
99
- isEncrypted: vault.isEncrypted,
100
- isBackedUp: vault.isBackedUp,
101
- chains: vault.chains.length,
102
- currency: vault.currency,
103
- availableSigningModes: vault.availableSigningModes,
104
- };
105
- displayStatus(status);
106
- }
107
- /**
108
- * Display vault status
109
- */
110
- function displayStatus(status) {
111
- console.log(chalk.cyan('\n+----------------------------------------+'));
112
- console.log(chalk.cyan('| Vault Status |'));
113
- console.log(chalk.cyan('+----------------------------------------+\n'));
114
- // Basic info
115
- console.log(chalk.bold('Vault:'));
116
- console.log(` Name: ${chalk.green(status.name)}`);
117
- console.log(` ID: ${status.id}`);
118
- console.log(` Type: ${chalk.yellow(status.type)}`);
119
- // Lock status
120
- console.log(chalk.bold('\nSecurity:'));
121
- if (status.isUnlocked) {
122
- console.log(` Status: ${chalk.green('Unlocked')} ${chalk.green('🔓')}`);
123
- console.log(` Expires: ${status.timeRemainingFormatted}`);
124
- }
125
- else {
126
- console.log(` Status: ${chalk.yellow('Locked')} ${chalk.yellow('🔒')}`);
127
- }
128
- console.log(` Encrypted: ${status.isEncrypted ? chalk.green('Yes') : chalk.gray('No')}`);
129
- console.log(` Backed Up: ${status.isBackedUp ? chalk.green('Yes') : chalk.yellow('No')}`);
130
- // MPC info
131
- console.log(chalk.bold('\nMPC Configuration:'));
132
- console.log(` Library: ${status.libType}`);
133
- console.log(` Threshold: ${chalk.cyan(status.threshold)} of ${chalk.cyan(status.totalSigners)}`);
134
- // Signing modes
135
- console.log(chalk.bold('\nSigning Modes:'));
136
- status.availableSigningModes.forEach(mode => {
137
- console.log(` - ${mode}`);
138
- });
139
- // Other info
140
- console.log(chalk.bold('\nDetails:'));
141
- console.log(` Chains: ${status.chains}`);
142
- console.log(` Currency: ${status.currency.toUpperCase()}`);
143
- console.log(` Created: ${new Date(status.createdAt).toLocaleString()}`);
144
- console.log(` Modified: ${new Date(status.lastModified).toLocaleString()}\n`);
145
- }
146
- /**
147
- * Show help for shell commands
148
- */
149
- export function showHelp() {
150
- const table = new Table({
151
- head: [chalk.bold('Available Commands')],
152
- colWidths: [50],
153
- chars: {
154
- mid: '',
155
- 'left-mid': '',
156
- 'mid-mid': '',
157
- 'right-mid': '',
158
- },
159
- style: {
160
- head: ['cyan'],
161
- border: ['cyan'],
162
- },
163
- });
164
- table.push([chalk.bold('Vault Management:')], [' vaults - List all vaults'], [' vault <name> - Switch to vault'], [' import <file> - Import vault from file'], [' create - Create new vault'], [' info - Show vault details'], [' export [path] - Export vault to file'], [''], [chalk.bold('Wallet Operations:')], [' balance [chain] - Show balances'], [' send <chain> <to> <amount> - Send transaction'], [' portfolio [-c usd] - Show portfolio value'], [' addresses - Show all addresses'], [' chains [--add/--remove] - Manage chains'], [' tokens <chain> - Manage tokens'], [''], [chalk.bold('Swap Operations:')], [' swap-chains - List swap-enabled chains'], [' swap-quote <from> <to> <amount> - Get quote'], [' swap <from> <to> <amount> - Execute swap'], [''], [chalk.bold('Session Commands (shell only):')], [' lock - Lock vault'], [' unlock - Unlock vault'], [' status - Show vault status'], [''], [chalk.bold('Settings:')], [' currency [code] - View/set currency'], [' server - Check server status'], [' address-book - Manage saved addresses'], [''], [chalk.bold('Help & Navigation:')], [' help, ? - Show this help'], [' .clear - Clear screen'], [' .exit - Exit shell']);
165
- console.log('\n' + table.toString() + '\n');
166
- }
167
- //# sourceMappingURL=shell-commands.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shell-commands.js","sourceRoot":"","sources":["../../src/interactive/shell-commands.ts"],"names":[],"mappings":"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"}
@@ -1,112 +0,0 @@
1
- import inquirer from 'inquirer';
2
- import { BaseCommandContext, DEFAULT_PASSWORD_CACHE_TTL } from '../core/command-context';
3
- import { getPasswordFromEnv } from '../core/password-manager';
4
- /**
5
- * Shell-specific implementation of CommandContext
6
- */
7
- export class ShellContext extends BaseCommandContext {
8
- vaults = new Map();
9
- constructor(sdk, options) {
10
- super(sdk, options);
11
- }
12
- get isInteractive() {
13
- return true;
14
- }
15
- /**
16
- * Get all loaded vaults
17
- */
18
- getVaults() {
19
- return this.vaults;
20
- }
21
- /**
22
- * Add a vault to the context
23
- */
24
- addVault(vault) {
25
- this.vaults.set(vault.id, vault);
26
- }
27
- /**
28
- * Get vault by ID
29
- */
30
- getVaultById(id) {
31
- return this.vaults.get(id);
32
- }
33
- /**
34
- * Find vault by name (case-insensitive)
35
- */
36
- findVaultByName(name) {
37
- const nameLower = name.toLowerCase();
38
- for (const vault of this.vaults.values()) {
39
- if (vault.name.toLowerCase() === nameLower) {
40
- return vault;
41
- }
42
- }
43
- return null;
44
- }
45
- /**
46
- * Get password for a vault
47
- * In Shell mode, we check cache first, then env, then prompt
48
- * Passwords are cached for the session
49
- */
50
- async getPassword(vaultId, vaultName) {
51
- // Check cache first
52
- const cached = this.getCachedPassword(vaultId);
53
- if (cached) {
54
- return cached;
55
- }
56
- // Check env vars
57
- const envPassword = getPasswordFromEnv(vaultId, vaultName);
58
- if (envPassword) {
59
- // Cache the env password too
60
- this.cachePassword(vaultId, envPassword);
61
- return envPassword;
62
- }
63
- // Prompt for password
64
- const displayName = vaultName || vaultId;
65
- const { password } = await inquirer.prompt([
66
- {
67
- type: 'password',
68
- name: 'password',
69
- message: `Enter password for vault "${displayName}":`,
70
- mask: '*',
71
- },
72
- ]);
73
- // Cache for the session
74
- this.cachePassword(vaultId, password);
75
- return password;
76
- }
77
- /**
78
- * Lock a vault (clear its cached password)
79
- */
80
- lockVault(vaultId) {
81
- this.clearPasswordCache(vaultId);
82
- const vault = this.vaults.get(vaultId);
83
- if (vault) {
84
- vault.lock();
85
- }
86
- }
87
- /**
88
- * Get unlock time remaining for a vault
89
- */
90
- getUnlockTimeRemaining(vaultId) {
91
- const entry = this.passwordCache.get(vaultId);
92
- if (!entry)
93
- return undefined;
94
- const remaining = entry.expiresAt - Date.now();
95
- return remaining > 0 ? remaining : undefined;
96
- }
97
- /**
98
- * Check if a vault is unlocked (has cached password)
99
- */
100
- isVaultUnlocked(vaultId) {
101
- return this.isPasswordCached(vaultId);
102
- }
103
- }
104
- /**
105
- * Create a Shell context from an initialized SDK
106
- */
107
- export function createShellContext(sdk, options) {
108
- return new ShellContext(sdk, {
109
- passwordTtlMs: options?.passwordTtlMs ?? DEFAULT_PASSWORD_CACHE_TTL,
110
- });
111
- }
112
- //# sourceMappingURL=shell-context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shell-context.js","sourceRoot":"","sources":["../../src/interactive/shell-context.ts"],"names":[],"mappings":"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"}
@@ -1,375 +0,0 @@
1
- /**
2
- * Shell Completion for Vultisig CLI
3
- *
4
- * Provides tab completion for bash, zsh, and fish shells using tabtab
5
- */
6
- import { homedir } from 'os';
7
- import { join } from 'path';
8
- import { readFileSync, existsSync } from 'fs';
9
- // Import tabtab dynamically to handle ESM/CJS differences
10
- let tabtab = null;
11
- async function getTabtab() {
12
- if (!tabtab) {
13
- try {
14
- tabtab = await import('tabtab');
15
- // Handle default export
16
- if (tabtab.default) {
17
- tabtab = tabtab.default;
18
- }
19
- }
20
- catch {
21
- return null;
22
- }
23
- }
24
- return tabtab;
25
- }
26
- /**
27
- * All available commands for completion
28
- */
29
- const COMMANDS = [
30
- 'create',
31
- 'import',
32
- 'verify',
33
- 'balance',
34
- 'send',
35
- 'portfolio',
36
- 'currency',
37
- 'server',
38
- 'export',
39
- 'addresses',
40
- 'address-book',
41
- 'chains',
42
- 'vaults',
43
- 'switch',
44
- 'rename',
45
- 'info',
46
- 'tokens',
47
- 'swap-chains',
48
- 'swap-quote',
49
- 'swap',
50
- 'completion',
51
- 'version',
52
- 'update',
53
- ];
54
- /**
55
- * Common chains for completion
56
- */
57
- const CHAINS = [
58
- 'Ethereum',
59
- 'Bitcoin',
60
- 'Solana',
61
- 'Polygon',
62
- 'Arbitrum',
63
- 'Optimism',
64
- 'Avalanche',
65
- 'BSC',
66
- 'Base',
67
- 'Cosmos',
68
- 'THORChain',
69
- 'Maya',
70
- 'Dydx',
71
- 'Kujira',
72
- 'Sui',
73
- 'Polkadot',
74
- 'Ripple',
75
- 'Dogecoin',
76
- 'Litecoin',
77
- 'Dash',
78
- 'Zcash',
79
- ];
80
- /**
81
- * Get stored vault names for completion
82
- */
83
- function getVaultNames() {
84
- try {
85
- const vaultDir = join(homedir(), '.vultisig', 'vaults');
86
- if (!existsSync(vaultDir))
87
- return [];
88
- // Read vault files and extract names
89
- const { readdirSync } = require('fs');
90
- const files = readdirSync(vaultDir);
91
- const names = [];
92
- for (const file of files) {
93
- if (file.startsWith('vault:') && file.endsWith('.json')) {
94
- try {
95
- const content = readFileSync(join(vaultDir, file), 'utf-8');
96
- const vault = JSON.parse(content);
97
- if (vault.name)
98
- names.push(vault.name);
99
- if (vault.id)
100
- names.push(vault.id);
101
- }
102
- catch {
103
- // Skip invalid vault files
104
- }
105
- }
106
- }
107
- return names;
108
- }
109
- catch {
110
- return [];
111
- }
112
- }
113
- /**
114
- * Handle completion requests from the shell
115
- */
116
- export async function handleCompletion() {
117
- const tt = await getTabtab();
118
- if (!tt)
119
- return false;
120
- const env = tt.parseEnv(process.env);
121
- if (!env.complete)
122
- return false;
123
- const { line, lastPartial } = env;
124
- // Parse the command line
125
- const parts = line.split(/\s+/).filter(Boolean);
126
- const cmd = parts[1]; // parts[0] is 'vultisig'
127
- let completions = [];
128
- if (!cmd || parts.length === 1 || (parts.length === 2 && lastPartial)) {
129
- // Complete command names
130
- completions = COMMANDS.filter(c => c.startsWith(lastPartial || ''));
131
- }
132
- else {
133
- // Command-specific completions
134
- switch (cmd) {
135
- case 'balance':
136
- case 'tokens':
137
- case 'send':
138
- // Complete chain names
139
- if (parts.length === 2 || (parts.length === 3 && lastPartial)) {
140
- completions = CHAINS.filter(c => c.toLowerCase().startsWith((lastPartial || '').toLowerCase()));
141
- }
142
- break;
143
- case 'switch':
144
- case 'verify':
145
- // Complete vault names/IDs
146
- if (parts.length === 2 || (parts.length === 3 && lastPartial)) {
147
- completions = getVaultNames().filter(n => n.toLowerCase().startsWith((lastPartial || '').toLowerCase()));
148
- }
149
- break;
150
- case 'import':
151
- case 'export':
152
- // File path completion (handled by shell)
153
- break;
154
- case 'chains':
155
- // Complete with --add or --remove
156
- if (lastPartial?.startsWith('-')) {
157
- completions = ['--add', '--remove'].filter(o => o.startsWith(lastPartial));
158
- }
159
- else if (parts.includes('--add') || parts.includes('--remove')) {
160
- completions = CHAINS.filter(c => c.toLowerCase().startsWith((lastPartial || '').toLowerCase()));
161
- }
162
- break;
163
- case 'swap':
164
- case 'swap-quote':
165
- // Complete chain names for from/to
166
- if (parts.length <= 3 || (parts.length === 4 && lastPartial)) {
167
- completions = CHAINS.filter(c => c.toLowerCase().startsWith((lastPartial || '').toLowerCase()));
168
- }
169
- break;
170
- case 'completion':
171
- // Complete shell types
172
- if (parts.length === 2 || (parts.length === 3 && lastPartial)) {
173
- completions = ['install', 'uninstall', 'bash', 'zsh', 'fish'].filter(s => s.startsWith((lastPartial || '').toLowerCase()));
174
- }
175
- break;
176
- }
177
- }
178
- // Add common flags if starting with -
179
- if (lastPartial?.startsWith('-')) {
180
- const flags = ['-h', '--help', '-v', '--version', '-i', '--interactive', '--debug'];
181
- completions = [...completions, ...flags.filter(f => f.startsWith(lastPartial))];
182
- }
183
- if (completions.length > 0) {
184
- tt.log(completions);
185
- }
186
- return true;
187
- }
188
- /**
189
- * Setup completion command on the program
190
- */
191
- export function setupCompletionCommand(program) {
192
- program
193
- .command('completion [shell]')
194
- .description('Generate shell completion scripts')
195
- .option('--install', 'Install completion for current shell')
196
- .option('--uninstall', 'Remove completion scripts')
197
- .action(async (shell, options) => {
198
- const tt = await getTabtab();
199
- if (!tt) {
200
- console.error('Shell completion is not available. Install tabtab: npm install -g tabtab');
201
- process.exit(1);
202
- }
203
- if (options.install) {
204
- try {
205
- await tt.install({
206
- name: 'vultisig',
207
- completer: 'vultisig',
208
- });
209
- await tt.install({
210
- name: 'vsig',
211
- completer: 'vsig',
212
- });
213
- console.log('Shell completion installed successfully for vultisig and vsig!');
214
- console.log('Restart your shell or run: source ~/.bashrc (or ~/.zshrc)');
215
- }
216
- catch (err) {
217
- console.error(`Failed to install completion: ${err.message}`);
218
- process.exit(1);
219
- }
220
- return;
221
- }
222
- if (options.uninstall) {
223
- try {
224
- await tt.uninstall({
225
- name: 'vultisig',
226
- });
227
- await tt.uninstall({
228
- name: 'vsig',
229
- });
230
- console.log('Shell completion uninstalled successfully!');
231
- }
232
- catch (err) {
233
- console.error(`Failed to uninstall completion: ${err.message}`);
234
- process.exit(1);
235
- }
236
- return;
237
- }
238
- // Print completion script for specified shell
239
- if (shell) {
240
- const scripts = {
241
- bash: getBashCompletionScript(),
242
- zsh: getZshCompletionScript(),
243
- fish: getFishCompletionScript(),
244
- };
245
- const script = scripts[shell.toLowerCase()];
246
- if (script) {
247
- console.log(script);
248
- }
249
- else {
250
- console.error(`Unknown shell: ${shell}. Supported: bash, zsh, fish`);
251
- process.exit(1);
252
- }
253
- return;
254
- }
255
- // Show help
256
- console.log('Usage: vultisig completion [shell] [options]');
257
- console.log('');
258
- console.log('Generate shell completion scripts');
259
- console.log('');
260
- console.log('Arguments:');
261
- console.log(' shell Shell type: bash, zsh, fish');
262
- console.log('');
263
- console.log('Options:');
264
- console.log(' --install Install completion for current shell');
265
- console.log(' --uninstall Remove completion scripts');
266
- console.log('');
267
- console.log('Examples:');
268
- console.log(' vultisig completion --install');
269
- console.log(' vultisig completion bash >> ~/.bashrc');
270
- console.log(' vultisig completion zsh >> ~/.zshrc');
271
- });
272
- }
273
- /**
274
- * Bash completion script
275
- */
276
- function getBashCompletionScript() {
277
- return `
278
- # vultisig bash completion
279
- _vultisig_completions() {
280
- local cur="\${COMP_WORDS[COMP_CWORD]}"
281
- local cmd="\${COMP_WORDS[1]}"
282
-
283
- if [ "\${COMP_CWORD}" -eq 1 ]; then
284
- COMPREPLY=($(compgen -W "${COMMANDS.join(' ')}" -- "\${cur}"))
285
- return
286
- fi
287
-
288
- case "\${cmd}" in
289
- balance|tokens|send)
290
- COMPREPLY=($(compgen -W "${CHAINS.join(' ')}" -- "\${cur}"))
291
- ;;
292
- chains)
293
- COMPREPLY=($(compgen -W "--add --remove ${CHAINS.join(' ')}" -- "\${cur}"))
294
- ;;
295
- swap|swap-quote)
296
- COMPREPLY=($(compgen -W "${CHAINS.join(' ')}" -- "\${cur}"))
297
- ;;
298
- completion)
299
- COMPREPLY=($(compgen -W "install uninstall bash zsh fish" -- "\${cur}"))
300
- ;;
301
- import|export)
302
- COMPREPLY=($(compgen -f -- "\${cur}"))
303
- ;;
304
- *)
305
- COMPREPLY=($(compgen -W "-h --help" -- "\${cur}"))
306
- ;;
307
- esac
308
- }
309
-
310
- complete -F _vultisig_completions vultisig
311
- complete -F _vultisig_completions vsig
312
- `.trim();
313
- }
314
- /**
315
- * Zsh completion script
316
- */
317
- function getZshCompletionScript() {
318
- return `
319
- #compdef vultisig vsig
320
-
321
- _vultisig() {
322
- local -a commands chains
323
- commands=(${COMMANDS.map(c => `'${c}:${c} command'`).join(' ')})
324
- chains=(${CHAINS.join(' ')})
325
-
326
- _arguments -C \\
327
- '1: :->command' \\
328
- '*: :->args'
329
-
330
- case "$state" in
331
- command)
332
- _describe 'command' commands
333
- ;;
334
- args)
335
- case "$words[2]" in
336
- balance|tokens|send|swap|swap-quote)
337
- _describe 'chain' chains
338
- ;;
339
- completion)
340
- _describe 'shell' '(install uninstall bash zsh fish)'
341
- ;;
342
- import|export)
343
- _files
344
- ;;
345
- esac
346
- ;;
347
- esac
348
- }
349
-
350
- _vultisig
351
- `.trim();
352
- }
353
- /**
354
- * Fish completion script
355
- */
356
- function getFishCompletionScript() {
357
- // Generate completions for both vultisig and vsig
358
- const commands = ['vultisig', 'vsig'];
359
- const commandCompletions = commands
360
- .flatMap(cmd => COMMANDS.map(c => `complete -c ${cmd} -n "__fish_use_subcommand" -a "${c}"`))
361
- .join('\n');
362
- const chainCompletions = commands
363
- .flatMap(cmd => CHAINS.map(c => `complete -c ${cmd} -n "__fish_seen_subcommand_from balance tokens send swap swap-quote" -a "${c}"`))
364
- .join('\n');
365
- return `
366
- # vultisig/vsig fish completion
367
- ${commandCompletions}
368
- ${chainCompletions}
369
- complete -c vultisig -n "__fish_seen_subcommand_from completion" -a "install uninstall bash zsh fish"
370
- complete -c vsig -n "__fish_seen_subcommand_from completion" -a "install uninstall bash zsh fish"
371
- complete -c vultisig -n "__fish_seen_subcommand_from import export" -a "(__fish_complete_path)"
372
- complete -c vsig -n "__fish_seen_subcommand_from import export" -a "(__fish_complete_path)"
373
- `.trim();
374
- }
375
- //# sourceMappingURL=completion.js.map