fuego-cli 1.1.0 → 1.1.1
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 +15 -15
- package/dist/commands/contacts.d.ts +9 -0
- package/dist/commands/contacts.d.ts.map +1 -0
- package/dist/commands/contacts.js +111 -0
- package/dist/commands/contacts.js.map +1 -0
- package/dist/commands/rpc.d.ts +7 -0
- package/dist/commands/rpc.d.ts.map +1 -0
- package/dist/commands/rpc.js +41 -0
- package/dist/commands/rpc.js.map +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +4 -2
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +21 -20
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/{addbook.ts → contacts.ts} +11 -11
- package/src/commands/{addrpc.ts → rpc.ts} +4 -4
- package/src/commands/update.ts +4 -2
- package/src/index.ts +21 -20
package/README.md
CHANGED
|
@@ -70,8 +70,8 @@ fuego dashboard
|
|
|
70
70
|
| `fuego create` | Create a new Solana wallet |
|
|
71
71
|
| `fuego address` | Show your wallet address |
|
|
72
72
|
| `fuego balance` | Check SOL, USDC, USDT balances |
|
|
73
|
-
| `fuego
|
|
74
|
-
| `fuego
|
|
73
|
+
| `fuego rpc` | Show or configure your Solana RPC endpoint |
|
|
74
|
+
| `fuego contacts` | Manage your contacts |
|
|
75
75
|
| `fuego send` | Send SOL, USDC, or USDT to an address or contact |
|
|
76
76
|
|
|
77
77
|
### Project Management
|
|
@@ -191,19 +191,19 @@ fuego update --fuego
|
|
|
191
191
|
|
|
192
192
|
---
|
|
193
193
|
|
|
194
|
-
### `fuego
|
|
194
|
+
### `fuego rpc [options]`
|
|
195
195
|
|
|
196
|
-
|
|
196
|
+
Show or configure your Solana RPC endpoint for faster or more reliable connections.
|
|
197
197
|
|
|
198
198
|
```bash
|
|
199
199
|
# Show current RPC configuration
|
|
200
|
-
fuego
|
|
200
|
+
fuego rpc
|
|
201
201
|
|
|
202
202
|
# Set a custom RPC endpoint
|
|
203
|
-
fuego
|
|
203
|
+
fuego rpc --url https://helius.xyz/... --network mainnet
|
|
204
204
|
|
|
205
205
|
# Use public mainnet
|
|
206
|
-
fuego
|
|
206
|
+
fuego rpc --url https://api.mainnet-beta.solana.com
|
|
207
207
|
```
|
|
208
208
|
|
|
209
209
|
**Options:**
|
|
@@ -212,22 +212,22 @@ fuego addrpc --url https://api.mainnet-beta.solana.com
|
|
|
212
212
|
|
|
213
213
|
---
|
|
214
214
|
|
|
215
|
-
### `fuego
|
|
215
|
+
### `fuego contacts <subcommand>`
|
|
216
216
|
|
|
217
|
-
Manage your
|
|
217
|
+
Manage your contacts for quick access to frequently used addresses.
|
|
218
218
|
|
|
219
219
|
```bash
|
|
220
220
|
# Add a contact
|
|
221
|
-
fuego
|
|
221
|
+
fuego contacts add melanie GvCoHGGBR97Yphzc6SrRycZyS31oUYBM8m9hLRtJT7r5 --label "Melanie's wallet"
|
|
222
222
|
|
|
223
223
|
# List all contacts
|
|
224
|
-
fuego
|
|
224
|
+
fuego contacts list
|
|
225
225
|
|
|
226
226
|
# Show specific contact
|
|
227
|
-
fuego
|
|
227
|
+
fuego contacts show melanie
|
|
228
228
|
|
|
229
229
|
# Remove contact (with confirmation)
|
|
230
|
-
fuego
|
|
230
|
+
fuego contacts remove melanie --yes
|
|
231
231
|
```
|
|
232
232
|
|
|
233
233
|
**Storage:** `~/.fuego/contacts/address-book.json`
|
|
@@ -248,7 +248,7 @@ Send SOL, USDC, or USDT to a Solana address or address book contact.
|
|
|
248
248
|
# Send SOL to an address
|
|
249
249
|
fuego send GvCoHGGBR97Yphzc6SrRycZyS31oUYBM8m9hLRtJT7r5 0.5 --token SOL
|
|
250
250
|
|
|
251
|
-
# Send USDC to
|
|
251
|
+
# Send USDC to a contact
|
|
252
252
|
fuego send melanie 10 --token USDC
|
|
253
253
|
|
|
254
254
|
# Send and confirm immediately
|
|
@@ -261,7 +261,7 @@ fuego send melanie 5 --token USDT --yes
|
|
|
261
261
|
|
|
262
262
|
**Recipient can be:**
|
|
263
263
|
- A full Solana address (e.g., `GvCoHGGBR97Yphzc6SrRycZyS31oUYBM8m9hLRtJT7r5`)
|
|
264
|
-
-
|
|
264
|
+
- A contact name (e.g., `melanie`)
|
|
265
265
|
|
|
266
266
|
**Safety:** By default, `fuego send` shows a transaction preview and requires `--yes` to confirm. This prevents accidental sends.
|
|
267
267
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function contactsAddCommand(name: string, address: string, options: {
|
|
2
|
+
label?: string;
|
|
3
|
+
}): Promise<void>;
|
|
4
|
+
export declare function contactsListCommand(): Promise<void>;
|
|
5
|
+
export declare function contactsShowCommand(name: string): Promise<void>;
|
|
6
|
+
export declare function contactsRemoveCommand(name: string, options: {
|
|
7
|
+
yes?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=contacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"AAqCA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqClH;AAGD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBzD;AAGD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBrE;AAGD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BnG"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import { showSuccess, showInfo, showWarning, flameDivider } from '../lib/ascii.js';
|
|
6
|
+
const CONTACTS_DIR = path.join(os.homedir(), '.fuego', 'contacts');
|
|
7
|
+
const ADDRESS_BOOK_FILE = path.join(CONTACTS_DIR, 'address-book.json');
|
|
8
|
+
function loadAddressBook() {
|
|
9
|
+
if (!fs.existsSync(ADDRESS_BOOK_FILE)) {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
return fs.readJsonSync(ADDRESS_BOOK_FILE);
|
|
13
|
+
}
|
|
14
|
+
function saveAddressBook(book) {
|
|
15
|
+
fs.ensureDirSync(CONTACTS_DIR);
|
|
16
|
+
fs.writeJsonSync(ADDRESS_BOOK_FILE, book, { spaces: 2 });
|
|
17
|
+
}
|
|
18
|
+
function isValidSolanaAddress(address) {
|
|
19
|
+
// Basic Solana address validation (32-44 chars, base58)
|
|
20
|
+
return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);
|
|
21
|
+
}
|
|
22
|
+
// Add a contact
|
|
23
|
+
export async function contactsAddCommand(name, address, options) {
|
|
24
|
+
console.log();
|
|
25
|
+
if (!name || !address) {
|
|
26
|
+
console.log(chalk.red('❌ Usage: fuego contacts add <name> <address> [--label "description"]'));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
// Validate address
|
|
30
|
+
if (!isValidSolanaAddress(address)) {
|
|
31
|
+
console.log(chalk.red('❌ Invalid Solana address format.'));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const book = loadAddressBook();
|
|
35
|
+
// Check if name already exists
|
|
36
|
+
if (book[name]) {
|
|
37
|
+
showWarning(`Contact "${name}" already exists.\n\nUse a different name or remove the existing contact first.`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Add contact
|
|
41
|
+
book[name] = {
|
|
42
|
+
address,
|
|
43
|
+
label: options.label,
|
|
44
|
+
addedAt: new Date().toISOString()
|
|
45
|
+
};
|
|
46
|
+
saveAddressBook(book);
|
|
47
|
+
showSuccess('✅ Contact Added', `Name: ${chalk.cyan(name)}\nAddress: ${chalk.cyan(address.slice(0, 8))}...${chalk.cyan(address.slice(-8))}${options.label ? '\nLabel: ' + chalk.cyan(options.label) : ''}`);
|
|
48
|
+
flameDivider();
|
|
49
|
+
}
|
|
50
|
+
// List all contacts
|
|
51
|
+
export async function contactsListCommand() {
|
|
52
|
+
console.log();
|
|
53
|
+
const book = loadAddressBook();
|
|
54
|
+
const contacts = Object.entries(book);
|
|
55
|
+
if (contacts.length === 0) {
|
|
56
|
+
showInfo('📒 Contacts', ['No contacts yet.', '', chalk.yellow('Add one: fuego contacts add <name> <address>')]);
|
|
57
|
+
flameDivider();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const lines = [`${contacts.length} contact${contacts.length === 1 ? '' : 's'}\n`];
|
|
61
|
+
for (const [name, entry] of contacts) {
|
|
62
|
+
const shortAddr = `${entry.address.slice(0, 6)}...${entry.address.slice(-6)}`;
|
|
63
|
+
lines.push(`${chalk.cyan(name)}: ${chalk.white(shortAddr)}${entry.label ? chalk.gray(` (${entry.label})`) : ''}`);
|
|
64
|
+
}
|
|
65
|
+
showInfo('📒 Contacts', lines);
|
|
66
|
+
flameDivider();
|
|
67
|
+
}
|
|
68
|
+
// Show a specific contact
|
|
69
|
+
export async function contactsShowCommand(name) {
|
|
70
|
+
console.log();
|
|
71
|
+
if (!name) {
|
|
72
|
+
console.log(chalk.red('❌ Usage: fuego contacts show <name>'));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
const book = loadAddressBook();
|
|
76
|
+
const entry = book[name];
|
|
77
|
+
if (!entry) {
|
|
78
|
+
console.log(chalk.red(`❌ Contact "${name}" not found.`));
|
|
79
|
+
console.log(chalk.gray('\nUse "fuego contacts list" to see all contacts.'));
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
showInfo(`📇 ${name}`, [
|
|
83
|
+
`Address: ${chalk.white(entry.address)}`,
|
|
84
|
+
entry.label ? `Label: ${chalk.cyan(entry.label)}` : '',
|
|
85
|
+
`Added: ${chalk.gray(new Date(entry.addedAt).toLocaleDateString())}`
|
|
86
|
+
].filter(Boolean));
|
|
87
|
+
flameDivider();
|
|
88
|
+
}
|
|
89
|
+
// Remove a contact
|
|
90
|
+
export async function contactsRemoveCommand(name, options) {
|
|
91
|
+
console.log();
|
|
92
|
+
if (!name) {
|
|
93
|
+
console.log(chalk.red('❌ Usage: fuego contacts remove <name> [--yes]'));
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
const book = loadAddressBook();
|
|
97
|
+
if (!book[name]) {
|
|
98
|
+
console.log(chalk.red(`❌ Contact "${name}" not found.`));
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
// Confirm unless --yes flag
|
|
102
|
+
if (!options.yes) {
|
|
103
|
+
showWarning(`About to remove "${name}" (${book[name].address.slice(0, 8)}...${book[name].address.slice(-8)})\n\nUse --yes to confirm, or omit to review.`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
delete book[name];
|
|
107
|
+
saveAddressBook(book);
|
|
108
|
+
showSuccess('✅ Contact Removed', `Removed "${chalk.cyan(name)}" from contacts.`);
|
|
109
|
+
flameDivider();
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=contacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/commands/rpc.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CnE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { setConfig, getConfig } from '../lib/config.js';
|
|
3
|
+
import { showSuccess, showInfo, flameDivider } from '../lib/ascii.js';
|
|
4
|
+
export async function rpcCommand(options) {
|
|
5
|
+
console.log(); // spacer
|
|
6
|
+
// If no URL provided, show current config and help
|
|
7
|
+
if (!options.url) {
|
|
8
|
+
const currentRpc = getConfig('rpcUrl');
|
|
9
|
+
const currentNetwork = getConfig('network');
|
|
10
|
+
showInfo('⚙️ Current RPC Configuration', [
|
|
11
|
+
`RPC URL: ${currentRpc ? chalk.cyan(currentRpc) : chalk.gray('Not set')}`,
|
|
12
|
+
`Network: ${currentNetwork ? chalk.cyan(currentNetwork) : chalk.gray('mainnet')}`,
|
|
13
|
+
'',
|
|
14
|
+
`${chalk.yellow('Usage:')} fuego rpc --url https://api.mainnet-beta.solana.com`,
|
|
15
|
+
`${chalk.yellow('Or:')} fuego rpc --url https://helius.xyz/... --network mainnet`
|
|
16
|
+
]);
|
|
17
|
+
flameDivider();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// Validate URL
|
|
21
|
+
try {
|
|
22
|
+
new URL(options.url);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
console.log(chalk.red('❌ Invalid URL. Please provide a valid RPC endpoint.'));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
// Set the RPC URL
|
|
29
|
+
setConfig('rpcUrl', options.url);
|
|
30
|
+
// Set network if provided, default to mainnet
|
|
31
|
+
const network = options.network || 'mainnet';
|
|
32
|
+
setConfig('network', network);
|
|
33
|
+
showSuccess('✅ RPC Configuration Updated', `URL: ${chalk.cyan(options.url)}\nNetwork: ${chalk.cyan(network)}`);
|
|
34
|
+
showInfo('💡 Tips', [
|
|
35
|
+
'Premium RPCs (Helius, QuickNode) offer better performance',
|
|
36
|
+
'Free public RPCs may have rate limits',
|
|
37
|
+
'Your wallet address remains the same across networks'
|
|
38
|
+
]);
|
|
39
|
+
flameDivider();
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/commands/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAc,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOtE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAmB;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS;IAExB,mDAAmD;IACnD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QAE5C,QAAQ,CAAC,+BAA+B,EAAE;YACxC,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACzE,YAAY,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACjF,EAAE;YACF,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,sDAAsD;YAC/E,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,+DAA+D;SACtF,CAAC,CAAC;QAEH,YAAY,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,eAAe;IACf,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,kBAAkB;IAClB,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjC,8CAA8C;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;IAC7C,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE9B,WAAW,CACT,6BAA6B,EAC7B,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CACnE,CAAC;IAEF,QAAQ,CAAC,SAAS,EAAE;QAClB,2DAA2D;QAC3D,uCAAuC;QACvC,sDAAsD;KACvD,CAAC,CAAC;IAEH,YAAY,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAeA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAeA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGzE"}
|
package/dist/commands/update.js
CHANGED
|
@@ -28,8 +28,10 @@ export async function updateCommand(options) {
|
|
|
28
28
|
spinner.text = 'Updating fuego-cli...';
|
|
29
29
|
execSync('npm install -g fuego-cli@latest', { stdio: 'pipe' });
|
|
30
30
|
spinner.stop();
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
// Get the NEW version after update
|
|
32
|
+
const newCliVersion = getFuegoCliVersion();
|
|
33
|
+
setFuegoCliVersion(newCliVersion);
|
|
34
|
+
showSuccess('✅ fuego-cli updated!', `Version: ${chalk.cyan(newCliVersion)}`);
|
|
33
35
|
cliUpdated = true;
|
|
34
36
|
}
|
|
35
37
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOnF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS;IAExB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEtE,MAAM,iBAAiB,GAAG,kBAAkB,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,wBAAwB;IACxB,QAAQ,CAAC,qBAAqB,EAAE;QAC9B,cAAc,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,iBAAiB,CAAC,IAAI,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/K,UAAU,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,eAAe,CAAC,IAAI,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;KAChL,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS;IAExB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,mBAAmB;IACnB,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,CAAC,mCAAmC,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjE,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,GAAG,uBAAuB,CAAC;YACvC,QAAQ,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOnF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS;IAExB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEtE,MAAM,iBAAiB,GAAG,kBAAkB,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,wBAAwB;IACxB,QAAQ,CAAC,qBAAqB,EAAE;QAC9B,cAAc,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,iBAAiB,CAAC,IAAI,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/K,UAAU,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,eAAe,CAAC,IAAI,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;KAChL,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS;IAExB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,mBAAmB;IACnB,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,CAAC,mCAAmC,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjE,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,GAAG,uBAAuB,CAAC;YACvC,QAAQ,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,mCAAmC;YACnC,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAC;YAC3C,kBAAkB,CAAC,aAAa,CAAC,CAAC;YAClC,WAAW,CAAC,sBAAsB,EAAE,YAAY,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC7E,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS;IAC1B,CAAC;IAED,uBAAuB;IACvB,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,WAAW,CAAC,wDAAwD,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;QAE7D,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,WAAW,CAAC,+FAA+F,CAAC,CAAC;gBAC7G,OAAO;YACT,CAAC;YAED,OAAO,CAAC,IAAI,GAAG,2BAA2B,CAAC;YAC3C,QAAQ,CAAC,sBAAsB,EAAE;gBAC/B,GAAG,EAAE,SAAS;gBACd,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,wCAAwC;YACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,4BAA4B,EAAE;gBACxD,GAAG,EAAE,SAAS;aACf,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YAErB,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACvC,WAAW,CAAC,kBAAkB,EAAE,YAAY,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACtE,QAAQ,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAErC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,SAAS,wBAAwB,CAAC,CAAC,CAAC;YAEnE,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAErE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC,CAAC;gBAC9G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;IACH,CAAC;IAED,YAAY,EAAE,CAAC;IAEf,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAClF,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,10 +8,11 @@ import { balanceCommand } from './commands/balance.js';
|
|
|
8
8
|
import { serveCommand } from './commands/serve.js';
|
|
9
9
|
import { dashboardCommand } from './commands/dashboard.js';
|
|
10
10
|
import { updateCommand } from './commands/update.js';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
11
|
+
import { rpcCommand } from './commands/rpc.js';
|
|
12
|
+
import { contactsAddCommand, contactsListCommand, contactsShowCommand, contactsRemoveCommand } from './commands/contacts.js';
|
|
13
13
|
import { sendCommand } from './commands/send.js';
|
|
14
14
|
import { showBanner } from './lib/ascii.js';
|
|
15
|
+
import { getFuegoCliVersion } from './lib/config.js';
|
|
15
16
|
async function main() {
|
|
16
17
|
// Show banner for help and when no args provided
|
|
17
18
|
const args = process.argv.slice(2);
|
|
@@ -22,7 +23,7 @@ async function main() {
|
|
|
22
23
|
program
|
|
23
24
|
.name('fuego')
|
|
24
25
|
.description('🔥 Fuego CLI - Sovereign Solana wallet for AI agents')
|
|
25
|
-
.version(
|
|
26
|
+
.version(getFuegoCliVersion())
|
|
26
27
|
.configureOutput({
|
|
27
28
|
outputError: (str, write) => write(chalk.red(str))
|
|
28
29
|
});
|
|
@@ -64,32 +65,32 @@ async function main() {
|
|
|
64
65
|
.option('--fuego', 'Update only the fuego project')
|
|
65
66
|
.action(updateCommand);
|
|
66
67
|
program
|
|
67
|
-
.command('
|
|
68
|
-
.description('
|
|
68
|
+
.command('rpc')
|
|
69
|
+
.description('Show or configure your Solana RPC endpoint')
|
|
69
70
|
.option('-u, --url <url>', 'RPC endpoint URL (e.g., https://api.mainnet-beta.solana.com)')
|
|
70
71
|
.option('-n, --network <network>', 'Network type (mainnet, devnet, testnet)', 'mainnet')
|
|
71
|
-
.action(
|
|
72
|
-
const
|
|
73
|
-
.command('
|
|
74
|
-
.description('Manage your
|
|
75
|
-
|
|
72
|
+
.action(rpcCommand);
|
|
73
|
+
const contacts = program
|
|
74
|
+
.command('contacts')
|
|
75
|
+
.description('Manage your contacts (stored in ~/.fuego/contacts/address-book.json)');
|
|
76
|
+
contacts
|
|
76
77
|
.command('add <name> <address>')
|
|
77
|
-
.description('Add a contact
|
|
78
|
+
.description('Add a contact')
|
|
78
79
|
.option('-l, --label <label>', 'Optional description/label for this contact')
|
|
79
|
-
.action(
|
|
80
|
-
|
|
80
|
+
.action(contactsAddCommand);
|
|
81
|
+
contacts
|
|
81
82
|
.command('list')
|
|
82
|
-
.description('List all contacts
|
|
83
|
-
.action(
|
|
84
|
-
|
|
83
|
+
.description('List all contacts')
|
|
84
|
+
.action(contactsListCommand);
|
|
85
|
+
contacts
|
|
85
86
|
.command('show <name>')
|
|
86
87
|
.description('Show details for a specific contact')
|
|
87
|
-
.action(
|
|
88
|
-
|
|
88
|
+
.action(contactsShowCommand);
|
|
89
|
+
contacts
|
|
89
90
|
.command('remove <name>')
|
|
90
|
-
.description('Remove a contact
|
|
91
|
+
.description('Remove a contact')
|
|
91
92
|
.option('-y, --yes', 'Skip confirmation prompt')
|
|
92
|
-
.action(
|
|
93
|
+
.action(contactsRemoveCommand);
|
|
93
94
|
program
|
|
94
95
|
.command('send <recipient> <amount>')
|
|
95
96
|
.description('Send SOL, USDC, or USDT to an address or contact')
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -35,11 +35,11 @@ function isValidSolanaAddress(address: string): boolean {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
// Add a contact
|
|
38
|
-
export async function
|
|
38
|
+
export async function contactsAddCommand(name: string, address: string, options: { label?: string }): Promise<void> {
|
|
39
39
|
console.log();
|
|
40
40
|
|
|
41
41
|
if (!name || !address) {
|
|
42
|
-
console.log(chalk.red('❌ Usage: fuego
|
|
42
|
+
console.log(chalk.red('❌ Usage: fuego contacts add <name> <address> [--label "description"]'));
|
|
43
43
|
process.exit(1);
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -75,14 +75,14 @@ export async function addBookAddCommand(name: string, address: string, options:
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
// List all contacts
|
|
78
|
-
export async function
|
|
78
|
+
export async function contactsListCommand(): Promise<void> {
|
|
79
79
|
console.log();
|
|
80
80
|
|
|
81
81
|
const book = loadAddressBook();
|
|
82
82
|
const contacts = Object.entries(book);
|
|
83
83
|
|
|
84
84
|
if (contacts.length === 0) {
|
|
85
|
-
showInfo('📒
|
|
85
|
+
showInfo('📒 Contacts', ['No contacts yet.', '', chalk.yellow('Add one: fuego contacts add <name> <address>')]);
|
|
86
86
|
flameDivider();
|
|
87
87
|
return;
|
|
88
88
|
}
|
|
@@ -94,16 +94,16 @@ export async function addBookListCommand(): Promise<void> {
|
|
|
94
94
|
lines.push(`${chalk.cyan(name)}: ${chalk.white(shortAddr)}${entry.label ? chalk.gray(` (${entry.label})`) : ''}`);
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
showInfo('📒
|
|
97
|
+
showInfo('📒 Contacts', lines);
|
|
98
98
|
flameDivider();
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
// Show a specific contact
|
|
102
|
-
export async function
|
|
102
|
+
export async function contactsShowCommand(name: string): Promise<void> {
|
|
103
103
|
console.log();
|
|
104
104
|
|
|
105
105
|
if (!name) {
|
|
106
|
-
console.log(chalk.red('❌ Usage: fuego
|
|
106
|
+
console.log(chalk.red('❌ Usage: fuego contacts show <name>'));
|
|
107
107
|
process.exit(1);
|
|
108
108
|
}
|
|
109
109
|
|
|
@@ -112,7 +112,7 @@ export async function addBookShowCommand(name: string): Promise<void> {
|
|
|
112
112
|
|
|
113
113
|
if (!entry) {
|
|
114
114
|
console.log(chalk.red(`❌ Contact "${name}" not found.`));
|
|
115
|
-
console.log(chalk.gray('\nUse "fuego
|
|
115
|
+
console.log(chalk.gray('\nUse "fuego contacts list" to see all contacts.'));
|
|
116
116
|
process.exit(1);
|
|
117
117
|
}
|
|
118
118
|
|
|
@@ -126,11 +126,11 @@ export async function addBookShowCommand(name: string): Promise<void> {
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
// Remove a contact
|
|
129
|
-
export async function
|
|
129
|
+
export async function contactsRemoveCommand(name: string, options: { yes?: boolean }): Promise<void> {
|
|
130
130
|
console.log();
|
|
131
131
|
|
|
132
132
|
if (!name) {
|
|
133
|
-
console.log(chalk.red('❌ Usage: fuego
|
|
133
|
+
console.log(chalk.red('❌ Usage: fuego contacts remove <name> [--yes]'));
|
|
134
134
|
process.exit(1);
|
|
135
135
|
}
|
|
136
136
|
|
|
@@ -150,6 +150,6 @@ export async function addBookRemoveCommand(name: string, options: { yes?: boolea
|
|
|
150
150
|
delete book[name];
|
|
151
151
|
saveAddressBook(book);
|
|
152
152
|
|
|
153
|
-
showSuccess('✅ Contact Removed', `Removed "${chalk.cyan(name)}" from
|
|
153
|
+
showSuccess('✅ Contact Removed', `Removed "${chalk.cyan(name)}" from contacts.`);
|
|
154
154
|
flameDivider();
|
|
155
155
|
}
|
|
@@ -2,12 +2,12 @@ import chalk from 'chalk';
|
|
|
2
2
|
import { setConfig, getConfig, listConfig } from '../lib/config.js';
|
|
3
3
|
import { showSuccess, showInfo, flameDivider } from '../lib/ascii.js';
|
|
4
4
|
|
|
5
|
-
interface
|
|
5
|
+
interface RpcOptions {
|
|
6
6
|
url?: string;
|
|
7
7
|
network?: string;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
export async function
|
|
10
|
+
export async function rpcCommand(options: RpcOptions): Promise<void> {
|
|
11
11
|
console.log(); // spacer
|
|
12
12
|
|
|
13
13
|
// If no URL provided, show current config and help
|
|
@@ -19,8 +19,8 @@ export async function addRpcCommand(options: AddRpcOptions): Promise<void> {
|
|
|
19
19
|
`RPC URL: ${currentRpc ? chalk.cyan(currentRpc) : chalk.gray('Not set')}`,
|
|
20
20
|
`Network: ${currentNetwork ? chalk.cyan(currentNetwork) : chalk.gray('mainnet')}`,
|
|
21
21
|
'',
|
|
22
|
-
`${chalk.yellow('Usage:')} fuego
|
|
23
|
-
`${chalk.yellow('Or:')} fuego
|
|
22
|
+
`${chalk.yellow('Usage:')} fuego rpc --url https://api.mainnet-beta.solana.com`,
|
|
23
|
+
`${chalk.yellow('Or:')} fuego rpc --url https://helius.xyz/... --network mainnet`
|
|
24
24
|
]);
|
|
25
25
|
|
|
26
26
|
flameDivider();
|
package/src/commands/update.ts
CHANGED
|
@@ -48,8 +48,10 @@ export async function updateCommand(options: UpdateOptions): Promise<void> {
|
|
|
48
48
|
execSync('npm install -g fuego-cli@latest', { stdio: 'pipe' });
|
|
49
49
|
spinner.stop();
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
// Get the NEW version after update
|
|
52
|
+
const newCliVersion = getFuegoCliVersion();
|
|
53
|
+
setFuegoCliVersion(newCliVersion);
|
|
54
|
+
showSuccess('✅ fuego-cli updated!', `Version: ${chalk.cyan(newCliVersion)}`);
|
|
53
55
|
cliUpdated = true;
|
|
54
56
|
} catch (error: any) {
|
|
55
57
|
spinner.stop();
|
package/src/index.ts
CHANGED
|
@@ -9,10 +9,11 @@ import { balanceCommand } from './commands/balance.js';
|
|
|
9
9
|
import { serveCommand } from './commands/serve.js';
|
|
10
10
|
import { dashboardCommand } from './commands/dashboard.js';
|
|
11
11
|
import { updateCommand } from './commands/update.js';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { rpcCommand } from './commands/rpc.js';
|
|
13
|
+
import { contactsAddCommand, contactsListCommand, contactsShowCommand, contactsRemoveCommand } from './commands/contacts.js';
|
|
14
14
|
import { sendCommand } from './commands/send.js';
|
|
15
15
|
import { showBanner } from './lib/ascii.js';
|
|
16
|
+
import { getFuegoCliVersion } from './lib/config.js';
|
|
16
17
|
|
|
17
18
|
async function main() {
|
|
18
19
|
// Show banner for help and when no args provided
|
|
@@ -26,7 +27,7 @@ async function main() {
|
|
|
26
27
|
program
|
|
27
28
|
.name('fuego')
|
|
28
29
|
.description('🔥 Fuego CLI - Sovereign Solana wallet for AI agents')
|
|
29
|
-
.version(
|
|
30
|
+
.version(getFuegoCliVersion())
|
|
30
31
|
.configureOutput({
|
|
31
32
|
outputError: (str, write) => write(chalk.red(str))
|
|
32
33
|
});
|
|
@@ -76,37 +77,37 @@ async function main() {
|
|
|
76
77
|
.action(updateCommand);
|
|
77
78
|
|
|
78
79
|
program
|
|
79
|
-
.command('
|
|
80
|
-
.description('
|
|
80
|
+
.command('rpc')
|
|
81
|
+
.description('Show or configure your Solana RPC endpoint')
|
|
81
82
|
.option('-u, --url <url>', 'RPC endpoint URL (e.g., https://api.mainnet-beta.solana.com)')
|
|
82
83
|
.option('-n, --network <network>', 'Network type (mainnet, devnet, testnet)', 'mainnet')
|
|
83
|
-
.action(
|
|
84
|
+
.action(rpcCommand);
|
|
84
85
|
|
|
85
|
-
const
|
|
86
|
-
.command('
|
|
87
|
-
.description('Manage your
|
|
86
|
+
const contacts = program
|
|
87
|
+
.command('contacts')
|
|
88
|
+
.description('Manage your contacts (stored in ~/.fuego/contacts/address-book.json)');
|
|
88
89
|
|
|
89
|
-
|
|
90
|
+
contacts
|
|
90
91
|
.command('add <name> <address>')
|
|
91
|
-
.description('Add a contact
|
|
92
|
+
.description('Add a contact')
|
|
92
93
|
.option('-l, --label <label>', 'Optional description/label for this contact')
|
|
93
|
-
.action(
|
|
94
|
+
.action(contactsAddCommand);
|
|
94
95
|
|
|
95
|
-
|
|
96
|
+
contacts
|
|
96
97
|
.command('list')
|
|
97
|
-
.description('List all contacts
|
|
98
|
-
.action(
|
|
98
|
+
.description('List all contacts')
|
|
99
|
+
.action(contactsListCommand);
|
|
99
100
|
|
|
100
|
-
|
|
101
|
+
contacts
|
|
101
102
|
.command('show <name>')
|
|
102
103
|
.description('Show details for a specific contact')
|
|
103
|
-
.action(
|
|
104
|
+
.action(contactsShowCommand);
|
|
104
105
|
|
|
105
|
-
|
|
106
|
+
contacts
|
|
106
107
|
.command('remove <name>')
|
|
107
|
-
.description('Remove a contact
|
|
108
|
+
.description('Remove a contact')
|
|
108
109
|
.option('-y, --yes', 'Skip confirmation prompt')
|
|
109
|
-
.action(
|
|
110
|
+
.action(contactsRemoveCommand);
|
|
110
111
|
|
|
111
112
|
program
|
|
112
113
|
.command('send <recipient> <amount>')
|