@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.
- package/README.md +6 -0
- package/dist/index.js +3185 -361
- package/package.json +4 -3
- package/dist/adapters/cli-context.js +0 -25
- package/dist/adapters/cli-context.js.map +0 -1
- package/dist/adapters/cli-runner.js +0 -47
- package/dist/adapters/cli-runner.js.map +0 -1
- package/dist/adapters/index.js +0 -6
- package/dist/adapters/index.js.map +0 -1
- package/dist/commands/balance.js +0 -65
- package/dist/commands/balance.js.map +0 -1
- package/dist/commands/chains.js +0 -46
- package/dist/commands/chains.js.map +0 -1
- package/dist/commands/index.js +0 -12
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/settings.js +0 -151
- package/dist/commands/settings.js.map +0 -1
- package/dist/commands/swap.js +0 -180
- package/dist/commands/swap.js.map +0 -1
- package/dist/commands/tokens.js +0 -116
- package/dist/commands/tokens.js.map +0 -1
- package/dist/commands/transaction.js +0 -99
- package/dist/commands/transaction.js.map +0 -1
- package/dist/commands/vault-management.js +0 -360
- package/dist/commands/vault-management.js.map +0 -1
- package/dist/core/command-context.js +0 -81
- package/dist/core/command-context.js.map +0 -1
- package/dist/core/index.js +0 -7
- package/dist/core/index.js.map +0 -1
- package/dist/core/password-manager.js +0 -92
- package/dist/core/password-manager.js.map +0 -1
- package/dist/core/types.js +0 -2
- package/dist/core/types.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/interactive/completer.js +0 -170
- package/dist/interactive/completer.js.map +0 -1
- package/dist/interactive/event-buffer.js +0 -186
- package/dist/interactive/event-buffer.js.map +0 -1
- package/dist/interactive/index.js +0 -9
- package/dist/interactive/index.js.map +0 -1
- package/dist/interactive/session.js +0 -525
- package/dist/interactive/session.js.map +0 -1
- package/dist/interactive/shell-commands.js +0 -167
- package/dist/interactive/shell-commands.js.map +0 -1
- package/dist/interactive/shell-context.js +0 -112
- package/dist/interactive/shell-context.js.map +0 -1
- package/dist/lib/completion.js +0 -375
- package/dist/lib/completion.js.map +0 -1
- package/dist/lib/config.js +0 -172
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/errors.js +0 -163
- package/dist/lib/errors.js.map +0 -1
- package/dist/lib/index.js +0 -9
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/output.js +0 -155
- package/dist/lib/output.js.map +0 -1
- package/dist/lib/version.js +0 -210
- package/dist/lib/version.js.map +0 -1
- package/dist/ui.js +0 -286
- 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":"AAQA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,GAAG,MAAM,KAAK,CAAA;AAKrB;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAsB;IACxD,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;IACxC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAA;IACrC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,GAAG,OAAO,KAAK,gBAAgB,GAAG,CAAA;IAC3C,CAAC;IACD,OAAO,GAAG,gBAAgB,GAAG,CAAA;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAiB;IACjD,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,EAAE,CAAA;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAA;QAC3E,OAAM;IACR,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC,CAAA;AAC/F,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAiB;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,EAAE,CAAA;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAA;QAC3E,OAAM;IACR,CAAC;IAED,IAAI,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAA;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;QAChF,OAAM;IACR,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACzC;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,uBAAuB;YAChC,IAAI,EAAE,GAAG;SACV;KACF,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAA;IAEjD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC5B,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;QAErC,MAAM,aAAa,GAAG,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC1D,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1F,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAChD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAiB;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,EAAE,CAAA;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAA;QAC3E,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAChD,IAAI,aAAiC,CAAA;IACrC,IAAI,sBAA0C,CAAA;IAE9C,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,GAAG,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACpD,sBAAsB,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,MAAM,GAAgB;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,UAAU;QACV,aAAa;QACb,sBAAsB;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QAC3B,QAAQ,EAAE,KAAK,CAAC,QAAwB;QACxC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;KACnD,CAAA;IAED,aAAa,CAAC,MAAM,CAAC,CAAA;AACvB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,MAAmB;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAA;IACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAA;IACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAA;IAEvE,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;IACjC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACtD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEvD,cAAc;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;IACtC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC1E,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAA;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACzF,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAE1F,WAAW;IACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAA;IAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;IAEjG,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC3C,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;IACrC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAC3D,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;IACzE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AAChF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACxC,SAAS,EAAE,CAAC,EAAE,CAAC;QACf,KAAK,EAAE;YACL,GAAG,EAAE,EAAE;YACP,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;SAChB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,CAAC,MAAM,CAAC;YACd,MAAM,EAAE,CAAC,MAAM,CAAC;SACjB;KACF,CAAC,CAAA;IAEF,KAAK,CAAC,IAAI,CACR,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EACjC,CAAC,yCAAyC,CAAC,EAC3C,CAAC,yCAAyC,CAAC,EAC3C,CAAC,gDAAgD,CAAC,EAClD,CAAC,0CAA0C,CAAC,EAC5C,CAAC,4CAA4C,CAAC,EAC9C,CAAC,8CAA8C,CAAC,EAChD,CAAC,EAAE,CAAC,EACJ,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAClC,CAAC,uCAAuC,CAAC,EACzC,CAAC,iDAAiD,CAAC,EACnD,CAAC,8CAA8C,CAAC,EAChD,CAAC,4CAA4C,CAAC,EAC9C,CAAC,2CAA2C,CAAC,EAC7C,CAAC,uCAAuC,CAAC,EACzC,CAAC,EAAE,CAAC,EACJ,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAChC,CAAC,kDAAkD,CAAC,EACpD,CAAC,+CAA+C,CAAC,EACjD,CAAC,4CAA4C,CAAC,EAC9C,CAAC,EAAE,CAAC,EACJ,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,EAC9C,CAAC,oCAAoC,CAAC,EACtC,CAAC,sCAAsC,CAAC,EACxC,CAAC,2CAA2C,CAAC,EAC7C,CAAC,EAAE,CAAC,EACJ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EACzB,CAAC,2CAA2C,CAAC,EAC7C,CAAC,6CAA6C,CAAC,EAC/C,CAAC,gDAAgD,CAAC,EAClD,CAAC,EAAE,CAAC,EACJ,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,EAClC,CAAC,wCAAwC,CAAC,EAC1C,CAAC,sCAAsC,CAAC,EACxC,CAAC,oCAAoC,CAAC,CACvC,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAA;AAC7C,CAAC"}
|
|
@@ -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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"}
|
package/dist/lib/completion.js
DELETED
|
@@ -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
|