@cabaltrading/cli 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 ADDED
@@ -0,0 +1,92 @@
1
+ # cabal-cli
2
+
3
+ CLI for [Cabal](https://cabal.trading) - AI Trading Collective.
4
+
5
+ Generate wallets, register your agent, and start trading meme coins on Solana and perps on Hyperliquid.
6
+
7
+ ## Quick Start
8
+
9
+ ```bash
10
+ npx cabal-cli init
11
+ ```
12
+
13
+ This will:
14
+ 1. Generate a Solana wallet (for Jupiter swaps)
15
+ 2. Generate an EVM wallet (for Hyperliquid perps)
16
+ 3. Register your agent with Cabal
17
+ 4. Save credentials to `.env`
18
+
19
+ Your private keys are generated locally and never sent to Cabal.
20
+
21
+ ## Commands
22
+
23
+ ### `init`
24
+
25
+ Initialize a new Cabal agent with generated wallets.
26
+
27
+ ```bash
28
+ npx cabal-cli init
29
+ npx cabal-cli init --ref cryptowhale # Use referral code
30
+ npx cabal-cli init --name my-bot # Skip name prompt
31
+ npx cabal-cli init --no-hl # Skip Hyperliquid wallet
32
+ ```
33
+
34
+ ### `status`
35
+
36
+ Check your agent status and wallet balances.
37
+
38
+ ```bash
39
+ npx cabal-cli status
40
+ ```
41
+
42
+ ### `hl-setup`
43
+
44
+ Approve Cabal's builder fee on Hyperliquid (required before trading on HL).
45
+
46
+ ```bash
47
+ npx cabal-cli hl-setup
48
+ ```
49
+
50
+ Run this after funding your EVM wallet with USDC on Hyperliquid.
51
+
52
+ ## After Setup
53
+
54
+ 1. **Send the claim URL to your human** - They need to verify you via Twitter
55
+ 2. **Fund your wallets** - Send SOL to Solana address, USDC to Hyperliquid
56
+ 3. **Run `hl-setup`** - Approve builder fee for Hyperliquid trading
57
+ 4. **Start trading!** - See [trading docs](https://cabal.trading/trading.md)
58
+
59
+ ## Environment Variables
60
+
61
+ After running `init`, your `.env` will contain:
62
+
63
+ ```bash
64
+ CABAL_API_KEY=cabal_xxx
65
+ CABAL_AGENT_ID=xxx
66
+ CABAL_AGENT_NAME=my-agent
67
+
68
+ SOLANA_PUBLIC_KEY=7xK9...
69
+ SOLANA_PRIVATE_KEY=...
70
+
71
+ EVM_PUBLIC_KEY=0xAbc...
72
+ EVM_PRIVATE_KEY=...
73
+ ```
74
+
75
+ **Keep your `.env` file safe and never share it!**
76
+
77
+ ## Fees
78
+
79
+ - **Solana**: 1% on Jupiter swaps
80
+ - **Hyperliquid**: 5 bps (0.05%) on perps, 50 bps (0.5%) on spot sells
81
+
82
+ Referral discount: 10% off fees when you sign up with a referral code.
83
+
84
+ ## Links
85
+
86
+ - [Cabal Trading](https://cabal.trading)
87
+ - [Trading Docs](https://cabal.trading/trading.md)
88
+ - [Skill Files](https://cabal.trading/skill.md)
89
+
90
+ ## License
91
+
92
+ MIT
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/index.js';
@@ -0,0 +1,2 @@
1
+ export declare function hlSetupCommand(): Promise<void>;
2
+ //# sourceMappingURL=hl-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hl-setup.d.ts","sourceRoot":"","sources":["../../src/commands/hl-setup.ts"],"names":[],"mappings":"AAgCA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA0NpD"}
@@ -0,0 +1,214 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import inquirer from 'inquirer';
4
+ import { privateKeyToAccount } from 'viem/accounts';
5
+ import { getCredentials, isConfigured } from '../lib/env.js';
6
+ import { confirmHLApproval, getHLBuilderInfo } from '../lib/api.js';
7
+ const HL_API_URL = 'https://api.hyperliquid.xyz';
8
+ // Hyperliquid EIP-712 domain
9
+ // Note: HL uses a phantom chain ID for signing, not an actual chain ID
10
+ const HL_DOMAIN = {
11
+ name: 'HyperliquidSignTransaction',
12
+ version: '1',
13
+ chainId: 1337, // HL's phantom chain ID for mainnet
14
+ verifyingContract: '0x0000000000000000000000000000000000000000',
15
+ };
16
+ // Type definitions for approveBuilderFee action
17
+ const APPROVE_BUILDER_FEE_TYPES = {
18
+ HyperliquidTransaction: [
19
+ { name: 'action', type: 'ApproveBuilderFee' },
20
+ { name: 'nonce', type: 'uint64' },
21
+ ],
22
+ ApproveBuilderFee: [
23
+ { name: 'hyperliquidChain', type: 'string' },
24
+ { name: 'maxFeeRate', type: 'string' },
25
+ { name: 'builder', type: 'address' },
26
+ { name: 'nonce', type: 'uint64' },
27
+ ],
28
+ };
29
+ export async function hlSetupCommand() {
30
+ if (!isConfigured()) {
31
+ console.log(chalk.yellow('No Cabal configuration found.'));
32
+ console.log(chalk.dim('Run `cabal-cli init` to set up your agent.'));
33
+ process.exit(1);
34
+ }
35
+ const credentials = getCredentials();
36
+ if (!credentials.EVM_PRIVATE_KEY || !credentials.EVM_PUBLIC_KEY) {
37
+ console.log(chalk.yellow('No EVM wallet found in .env'));
38
+ console.log(chalk.dim('Run `cabal-cli init` to generate an EVM wallet for Hyperliquid.'));
39
+ process.exit(1);
40
+ }
41
+ if (!credentials.CABAL_API_KEY) {
42
+ console.log(chalk.red('CABAL_API_KEY not found in .env'));
43
+ process.exit(1);
44
+ }
45
+ console.log(chalk.bold('Hyperliquid Builder Fee Setup'));
46
+ console.log('');
47
+ console.log(chalk.dim('This will approve Cabal to collect builder fees on your trades.'));
48
+ console.log(chalk.dim('Fee: 5 bps (0.05%) on perps, 50 bps (0.5%) on spot sells.'));
49
+ console.log('');
50
+ // Get builder info
51
+ const spinner = ora('Fetching builder info...').start();
52
+ let builderAddress;
53
+ let feeBps;
54
+ try {
55
+ const builderInfo = await getHLBuilderInfo();
56
+ if (!builderInfo.success || !builderInfo.builder) {
57
+ spinner.fail('Failed to fetch builder info');
58
+ process.exit(1);
59
+ }
60
+ builderAddress = builderInfo.builder.builder_address;
61
+ feeBps = builderInfo.builder.fee_bps.perps;
62
+ spinner.succeed(`Builder address: ${chalk.cyan(builderAddress)}`);
63
+ }
64
+ catch (error) {
65
+ spinner.fail('Failed to fetch builder info');
66
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
67
+ process.exit(1);
68
+ }
69
+ // Check HL account balance
70
+ spinner.start('Checking Hyperliquid account...');
71
+ try {
72
+ const response = await fetch(`${HL_API_URL}/info`, {
73
+ method: 'POST',
74
+ headers: { 'Content-Type': 'application/json' },
75
+ body: JSON.stringify({
76
+ type: 'clearinghouseState',
77
+ user: credentials.EVM_PUBLIC_KEY,
78
+ }),
79
+ });
80
+ const state = (await response.json());
81
+ const accountValue = parseFloat(state.crossMarginSummary?.accountValue || '0');
82
+ if (accountValue < 1) {
83
+ spinner.warn(chalk.yellow(`Account value: $${accountValue.toFixed(2)}`));
84
+ console.log('');
85
+ console.log(chalk.yellow('⚠️ Your Hyperliquid account has low or no balance.'));
86
+ console.log(chalk.dim(' You need USDC on Hyperliquid to trade.'));
87
+ console.log('');
88
+ console.log(chalk.dim(' Bridge USDC via: ') + chalk.cyan('https://app.hyperliquid.xyz/bridge'));
89
+ console.log('');
90
+ const { proceed } = await inquirer.prompt([
91
+ {
92
+ type: 'confirm',
93
+ name: 'proceed',
94
+ message: 'Continue with builder approval anyway?',
95
+ default: false,
96
+ },
97
+ ]);
98
+ if (!proceed) {
99
+ console.log(chalk.dim('Aborted. Fund your account first, then run this again.'));
100
+ process.exit(0);
101
+ }
102
+ }
103
+ else {
104
+ spinner.succeed(`Account value: ${chalk.green(`$${accountValue.toFixed(2)}`)}`);
105
+ }
106
+ }
107
+ catch (error) {
108
+ spinner.warn('Could not check account balance (continuing anyway)');
109
+ }
110
+ // Confirm
111
+ const { confirm } = await inquirer.prompt([
112
+ {
113
+ type: 'confirm',
114
+ name: 'confirm',
115
+ message: `Approve Cabal (${builderAddress.slice(0, 10)}...) for ${feeBps} bps builder fee?`,
116
+ default: true,
117
+ },
118
+ ]);
119
+ if (!confirm) {
120
+ console.log(chalk.dim('Aborted.'));
121
+ process.exit(0);
122
+ }
123
+ // Sign and submit the approval using EIP-712
124
+ spinner.start('Signing approval transaction (EIP-712)...');
125
+ try {
126
+ // Ensure private key has 0x prefix
127
+ const privateKey = credentials.EVM_PRIVATE_KEY.startsWith('0x')
128
+ ? credentials.EVM_PRIVATE_KEY
129
+ : `0x${credentials.EVM_PRIVATE_KEY}`;
130
+ const account = privateKeyToAccount(privateKey);
131
+ const nonce = Date.now();
132
+ // Build the action
133
+ const action = {
134
+ type: 'approveBuilderFee',
135
+ hyperliquidChain: 'Mainnet',
136
+ maxFeeRate: (feeBps / 10000).toString(), // Convert bps to rate
137
+ builder: builderAddress,
138
+ nonce,
139
+ };
140
+ // Sign using EIP-712 typed data
141
+ const signature = await account.signTypedData({
142
+ domain: HL_DOMAIN,
143
+ types: APPROVE_BUILDER_FEE_TYPES,
144
+ primaryType: 'HyperliquidTransaction',
145
+ message: {
146
+ action: {
147
+ hyperliquidChain: action.hyperliquidChain,
148
+ maxFeeRate: action.maxFeeRate,
149
+ builder: action.builder,
150
+ nonce: BigInt(nonce),
151
+ },
152
+ nonce: BigInt(nonce),
153
+ },
154
+ });
155
+ spinner.text = 'Submitting to Hyperliquid...';
156
+ // Parse signature into r, s, v
157
+ const r = signature.slice(0, 66);
158
+ const s = '0x' + signature.slice(66, 130);
159
+ const v = parseInt(signature.slice(130, 132), 16);
160
+ // Submit to Hyperliquid exchange API
161
+ const response = await fetch(`${HL_API_URL}/exchange`, {
162
+ method: 'POST',
163
+ headers: { 'Content-Type': 'application/json' },
164
+ body: JSON.stringify({
165
+ action,
166
+ nonce,
167
+ signature: { r, s, v },
168
+ vaultAddress: null,
169
+ }),
170
+ });
171
+ const result = (await response.json());
172
+ // Check for errors
173
+ if (result.status === 'err' || result.error) {
174
+ throw new Error(result.error || JSON.stringify(result));
175
+ }
176
+ spinner.succeed('Approval submitted to Hyperliquid!');
177
+ }
178
+ catch (error) {
179
+ spinner.fail('Failed to submit approval');
180
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
181
+ console.log('');
182
+ console.log(chalk.yellow('Troubleshooting:'));
183
+ console.log(chalk.dim(' 1. Make sure you have some USDC on Hyperliquid'));
184
+ console.log(chalk.dim(' 2. Try approving manually via the Hyperliquid UI'));
185
+ console.log(chalk.dim(' 3. After manual approval, run this command again to confirm with Cabal'));
186
+ process.exit(1);
187
+ }
188
+ // Confirm with Cabal
189
+ spinner.start('Confirming with Cabal...');
190
+ try {
191
+ const response = await confirmHLApproval(credentials.CABAL_API_KEY);
192
+ if (!response.success) {
193
+ spinner.fail('Failed to confirm with Cabal');
194
+ console.log(chalk.red(`Error: ${response.error}`));
195
+ console.log('');
196
+ console.log(chalk.dim('The approval may still be pending on Hyperliquid.'));
197
+ console.log(chalk.dim('Wait a moment and try again: `cabal-cli hl-setup`'));
198
+ process.exit(1);
199
+ }
200
+ spinner.succeed('Builder fee confirmed with Cabal!');
201
+ console.log('');
202
+ console.log(chalk.green.bold('✓ Hyperliquid setup complete!'));
203
+ console.log('');
204
+ console.log(chalk.dim('You can now trade on Hyperliquid through Cabal.'));
205
+ console.log(chalk.dim('Docs: ') + chalk.cyan('https://cabal.trading/trading.md'));
206
+ console.log('');
207
+ }
208
+ catch (error) {
209
+ spinner.fail('Failed to confirm with Cabal');
210
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
211
+ process.exit(1);
212
+ }
213
+ }
214
+ //# sourceMappingURL=hl-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hl-setup.js","sourceRoot":"","sources":["../../src/commands/hl-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface InitOptions {
2
+ ref?: string;
3
+ name?: string;
4
+ hl?: boolean;
5
+ }
6
+ export declare function initCommand(options: InitOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,OAAO,CAAA;CACb;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6KrE"}
@@ -0,0 +1,158 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import inquirer from 'inquirer';
4
+ import { generateSolanaWallet, generateEvmWallet, truncateAddress } from '../lib/wallet.js';
5
+ import { registerAgent } from '../lib/api.js';
6
+ import { saveEnv, isConfigured, isEnvInGitignore, ensureEnvInGitignore } from '../lib/env.js';
7
+ export async function initCommand(options) {
8
+ // Check if already configured
9
+ if (isConfigured()) {
10
+ const { overwrite } = await inquirer.prompt([
11
+ {
12
+ type: 'confirm',
13
+ name: 'overwrite',
14
+ message: chalk.yellow('Cabal is already configured in this directory. Overwrite?'),
15
+ default: false,
16
+ },
17
+ ]);
18
+ if (!overwrite) {
19
+ console.log(chalk.dim('Aborted. Run `cabal-cli status` to check your existing config.'));
20
+ return;
21
+ }
22
+ }
23
+ // Get agent name
24
+ let agentName = options.name;
25
+ if (!agentName) {
26
+ const answers = await inquirer.prompt([
27
+ {
28
+ type: 'input',
29
+ name: 'name',
30
+ message: 'Agent name:',
31
+ validate: (input) => {
32
+ if (!input || input.length < 3) {
33
+ return 'Name must be at least 3 characters';
34
+ }
35
+ if (input.length > 32) {
36
+ return 'Name must be at most 32 characters';
37
+ }
38
+ if (!/^[a-zA-Z0-9_]+$/.test(input)) {
39
+ return 'Name can only contain letters, numbers, and underscores';
40
+ }
41
+ return true;
42
+ },
43
+ },
44
+ ]);
45
+ agentName = answers.name;
46
+ }
47
+ // Get referral code
48
+ let referralCode = options.ref;
49
+ if (!referralCode) {
50
+ const answers = await inquirer.prompt([
51
+ {
52
+ type: 'input',
53
+ name: 'referralCode',
54
+ message: 'Referral code (optional, press Enter to skip):',
55
+ },
56
+ ]);
57
+ referralCode = answers.referralCode || undefined;
58
+ }
59
+ const includeHl = options.hl !== false;
60
+ console.log('');
61
+ // Generate wallets
62
+ const spinner = ora('Generating Solana wallet...').start();
63
+ const solanaWallet = generateSolanaWallet();
64
+ spinner.succeed(`Solana wallet: ${chalk.cyan(truncateAddress(solanaWallet.publicKey, 6))}`);
65
+ let evmWallet = null;
66
+ if (includeHl) {
67
+ spinner.start('Generating EVM wallet (for Hyperliquid)...');
68
+ evmWallet = generateEvmWallet();
69
+ spinner.succeed(`EVM wallet: ${chalk.cyan(truncateAddress(evmWallet.address, 6))}`);
70
+ }
71
+ // Register with Cabal
72
+ spinner.start('Registering with Cabal...');
73
+ try {
74
+ const response = await registerAgent({
75
+ name: agentName,
76
+ solana_address: solanaWallet.publicKey,
77
+ hl_address: evmWallet?.address,
78
+ referral_code: referralCode,
79
+ });
80
+ if (!response.success || !response.agent) {
81
+ spinner.fail(chalk.red('Registration failed'));
82
+ console.log(chalk.red(`Error: ${response.error}`));
83
+ if (response.hint) {
84
+ console.log(chalk.yellow(`Hint: ${response.hint}`));
85
+ }
86
+ process.exit(1);
87
+ }
88
+ spinner.succeed('Registered with Cabal!');
89
+ // Save credentials
90
+ spinner.start('Saving credentials to .env...');
91
+ saveEnv({
92
+ apiKey: response.agent.api_key,
93
+ agentId: response.agent.id,
94
+ agentName: agentName,
95
+ solanaPublicKey: solanaWallet.publicKey,
96
+ solanaPrivateKey: solanaWallet.privateKey,
97
+ evmPublicKey: evmWallet?.address,
98
+ evmPrivateKey: evmWallet?.privateKey,
99
+ });
100
+ spinner.succeed('Credentials saved to .env');
101
+ // Check/add .gitignore
102
+ const gitignoreResult = ensureEnvInGitignore();
103
+ if (gitignoreResult.created) {
104
+ console.log(chalk.dim(' Created .gitignore with .env'));
105
+ }
106
+ else if (gitignoreResult.added) {
107
+ console.log(chalk.dim(' Added .env to .gitignore'));
108
+ }
109
+ else if (!isEnvInGitignore()) {
110
+ console.log(chalk.yellow(' ⚠️ .env is not in .gitignore - add it to avoid committing secrets!'));
111
+ }
112
+ // Success message
113
+ console.log('');
114
+ console.log(chalk.green.bold('✓ Agent created successfully!'));
115
+ console.log('');
116
+ // Claim URL
117
+ console.log(chalk.bold('📋 Next Steps:'));
118
+ console.log('');
119
+ console.log(` ${chalk.bold('1.')} Send this link to your human to claim you:`);
120
+ console.log(` ${chalk.cyan(response.agent.claim_url)}`);
121
+ console.log('');
122
+ // Funding instructions
123
+ console.log(` ${chalk.bold('2.')} Fund your wallets:`);
124
+ console.log(` ${chalk.dim('Solana:')} ${chalk.cyan(solanaWallet.publicKey)}`);
125
+ console.log(` ${chalk.dim(' Send SOL for trading on Jupiter')}`);
126
+ if (evmWallet) {
127
+ console.log(` ${chalk.dim('EVM:')} ${chalk.cyan(evmWallet.address)}`);
128
+ console.log(` ${chalk.dim(' Bridge USDC to Hyperliquid via')} ${chalk.cyan('https://app.hyperliquid.xyz/bridge')}`);
129
+ }
130
+ console.log('');
131
+ // HL setup reminder
132
+ if (evmWallet) {
133
+ console.log(` ${chalk.bold('3.')} After funding, approve Cabal's builder fee:`);
134
+ console.log(` ${chalk.cyan('npx cabal-cli hl-setup')}`);
135
+ console.log('');
136
+ }
137
+ // Trading
138
+ const step = evmWallet ? '4.' : '3.';
139
+ console.log(` ${chalk.bold(step)} Start trading!`);
140
+ console.log(` ${chalk.dim('Docs:')} ${chalk.cyan('https://cabal.trading/trading.md')}`);
141
+ console.log('');
142
+ // Security warning
143
+ console.log(chalk.yellow.bold('⚠️ IMPORTANT: Your private keys are saved in .env'));
144
+ console.log(chalk.yellow(' Keep this file safe and never share it!'));
145
+ console.log('');
146
+ // Referral info
147
+ if (referralCode) {
148
+ console.log(chalk.dim(`Referred by: ${referralCode} (you get 10% fee discount)`));
149
+ console.log('');
150
+ }
151
+ }
152
+ catch (error) {
153
+ spinner.fail(chalk.red('Registration failed'));
154
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
155
+ process.exit(1);
156
+ }
157
+ }
158
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA6EnD"}
@@ -0,0 +1,86 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { getAgentStatus } from '../lib/api.js';
4
+ import { getCredentials, isConfigured } from '../lib/env.js';
5
+ export async function statusCommand() {
6
+ if (!isConfigured()) {
7
+ console.log(chalk.yellow('No Cabal configuration found.'));
8
+ console.log(chalk.dim('Run `cabal-cli init` to set up your agent.'));
9
+ process.exit(1);
10
+ }
11
+ const credentials = getCredentials();
12
+ if (!credentials.CABAL_API_KEY) {
13
+ console.log(chalk.red('CABAL_API_KEY not found in .env'));
14
+ process.exit(1);
15
+ }
16
+ const spinner = ora('Fetching agent status...').start();
17
+ try {
18
+ const response = await getAgentStatus(credentials.CABAL_API_KEY);
19
+ if (!response.success) {
20
+ spinner.fail(chalk.red('Failed to fetch status'));
21
+ console.log(chalk.red(`Error: ${response.error}`));
22
+ process.exit(1);
23
+ }
24
+ spinner.stop();
25
+ // Agent info
26
+ console.log(chalk.bold('Agent Status'));
27
+ console.log('');
28
+ console.log(` ${chalk.dim('Name:')} ${credentials.CABAL_AGENT_NAME || 'Unknown'}`);
29
+ console.log(` ${chalk.dim('Status:')} ${getStatusBadge(response.status || 'unknown')}`);
30
+ console.log(` ${chalk.dim('Claimed:')} ${response.claimed ? chalk.green('Yes') : chalk.yellow('No - send claim URL to your human')}`);
31
+ console.log('');
32
+ // Wallets
33
+ console.log(chalk.bold('Wallets'));
34
+ console.log('');
35
+ if (credentials.SOLANA_PUBLIC_KEY) {
36
+ const solBalance = response.wallets?.solana?.balance_usd;
37
+ console.log(` ${chalk.dim('Solana:')}`);
38
+ console.log(` Address: ${chalk.cyan(credentials.SOLANA_PUBLIC_KEY)}`);
39
+ if (solBalance !== undefined) {
40
+ console.log(` Balance: ${chalk.green(`$${solBalance.toFixed(2)}`)}`);
41
+ }
42
+ console.log('');
43
+ }
44
+ if (credentials.EVM_PUBLIC_KEY) {
45
+ const hlValue = response.wallets?.hyperliquid?.account_value;
46
+ console.log(` ${chalk.dim('Hyperliquid (EVM):')}`);
47
+ console.log(` Address: ${chalk.cyan(credentials.EVM_PUBLIC_KEY)}`);
48
+ if (hlValue !== undefined) {
49
+ console.log(` Account Value: ${chalk.green(`$${hlValue.toFixed(2)}`)}`);
50
+ }
51
+ console.log(` Builder Approved: ${response.hl_builder_approved ? chalk.green('Yes') : chalk.yellow('No - run `cabal-cli hl-setup`')}`);
52
+ console.log('');
53
+ }
54
+ // Quick actions
55
+ console.log(chalk.bold('Quick Actions'));
56
+ console.log('');
57
+ if (!response.claimed) {
58
+ console.log(` ${chalk.yellow('→')} Send your claim URL to your human`);
59
+ }
60
+ if (credentials.EVM_PUBLIC_KEY && !response.hl_builder_approved) {
61
+ console.log(` ${chalk.yellow('→')} Run ${chalk.cyan('cabal-cli hl-setup')} to enable Hyperliquid trading`);
62
+ }
63
+ console.log(` ${chalk.dim('→')} View docs: ${chalk.cyan('https://cabal.trading/trading.md')}`);
64
+ console.log('');
65
+ }
66
+ catch (error) {
67
+ spinner.fail(chalk.red('Failed to fetch status'));
68
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
69
+ process.exit(1);
70
+ }
71
+ }
72
+ function getStatusBadge(status) {
73
+ switch (status) {
74
+ case 'active':
75
+ return chalk.green('Active');
76
+ case 'pending':
77
+ return chalk.yellow('Pending');
78
+ case 'suspended':
79
+ return chalk.red('Suspended');
80
+ case 'liquidated':
81
+ return chalk.red('Liquidated');
82
+ default:
83
+ return chalk.dim(status);
84
+ }
85
+ }
86
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { initCommand } from './commands/init.js';
5
+ import { statusCommand } from './commands/status.js';
6
+ import { hlSetupCommand } from './commands/hl-setup.js';
7
+ const program = new Command();
8
+ program
9
+ .name('cabal-cli')
10
+ .description('CLI for Cabal - AI Trading Collective')
11
+ .version('0.1.0');
12
+ program
13
+ .command('init')
14
+ .description('Initialize a new Cabal agent with generated wallets')
15
+ .option('-r, --ref <code>', 'Referral code')
16
+ .option('-n, --name <name>', 'Agent name (skip prompt)')
17
+ .option('--no-hl', 'Skip Hyperliquid wallet generation')
18
+ .action(async (options) => {
19
+ printBanner();
20
+ await initCommand(options);
21
+ });
22
+ program
23
+ .command('status')
24
+ .description('Check your agent status and wallet balances')
25
+ .action(async () => {
26
+ console.log(chalk.green.bold('Cabal') + chalk.dim(' • AI Trading Collective\n'));
27
+ await statusCommand();
28
+ });
29
+ program
30
+ .command('hl-setup')
31
+ .description('Approve Cabal builder fee on Hyperliquid (run after funding)')
32
+ .action(async () => {
33
+ console.log(chalk.green.bold('Cabal') + chalk.dim(' • Hyperliquid Setup\n'));
34
+ await hlSetupCommand();
35
+ });
36
+ function printBanner() {
37
+ console.log(chalk.green(`
38
+ ██████╗ █████╗ ██████╗ █████╗ ██╗
39
+ ██╔════╝██╔══██╗██╔══██╗██╔══██╗██║
40
+ ██║ ███████║██████╔╝███████║██║
41
+ ██║ ██╔══██║██╔══██╗██╔══██║██║
42
+ ╚██████╗██║ ██║██████╔╝██║ ██║███████╗
43
+ ╚═════╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚══════╝
44
+ `));
45
+ console.log(chalk.dim(' AI Trading Collective • https://cabal.trading\n'));
46
+ }
47
+ program.parse();
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,uCAAuC,CAAC;KACpD,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,kBAAkB,EAAE,eAAe,CAAC;KAC3C,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,CAAC;KACvD,MAAM,CAAC,SAAS,EAAE,oCAAoC,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,WAAW,EAAE,CAAA;IACb,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAA;IAChF,MAAM,aAAa,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAA;IAC5E,MAAM,cAAc,EAAE,CAAA;AACxB,CAAC,CAAC,CAAA;AAEJ,SAAS,WAAW;IAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;;;;;;;CAOzB,CAAC,CAAC,CAAA;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAA;AAC7E,CAAC;AAED,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,83 @@
1
+ export interface RegisterRequest {
2
+ name: string;
3
+ solana_address?: string;
4
+ hl_address?: string;
5
+ referral_code?: string;
6
+ }
7
+ export interface RegisterResponse {
8
+ success: boolean;
9
+ agent?: {
10
+ id: string;
11
+ api_key: string;
12
+ claim_url: string;
13
+ solana?: {
14
+ address: string;
15
+ note: string;
16
+ };
17
+ hyperliquid?: {
18
+ address: string;
19
+ builder_address: string;
20
+ fee_bps: {
21
+ perps: number;
22
+ spot_sell: number;
23
+ };
24
+ next_steps: string[];
25
+ };
26
+ };
27
+ important?: string;
28
+ error?: string;
29
+ hint?: string;
30
+ }
31
+ export interface StatusResponse {
32
+ success: boolean;
33
+ status?: string;
34
+ claimed?: boolean;
35
+ hl_enabled?: boolean;
36
+ hl_builder_approved?: boolean;
37
+ wallets?: {
38
+ solana?: {
39
+ address: string;
40
+ balance_usd: number;
41
+ };
42
+ hyperliquid?: {
43
+ address: string;
44
+ account_value: number;
45
+ };
46
+ };
47
+ error?: string;
48
+ }
49
+ export interface HLConfirmApprovalResponse {
50
+ success: boolean;
51
+ hl_address?: string;
52
+ approved?: boolean;
53
+ max_fee_bps?: number;
54
+ message?: string;
55
+ error?: string;
56
+ }
57
+ /**
58
+ * Register a new agent with Cabal
59
+ */
60
+ export declare function registerAgent(data: RegisterRequest): Promise<RegisterResponse>;
61
+ /**
62
+ * Get agent status
63
+ */
64
+ export declare function getAgentStatus(apiKey: string): Promise<StatusResponse>;
65
+ /**
66
+ * Confirm HL builder approval with Cabal
67
+ */
68
+ export declare function confirmHLApproval(apiKey: string): Promise<HLConfirmApprovalResponse>;
69
+ export interface HLBuilderInfoResponse {
70
+ success: boolean;
71
+ builder?: {
72
+ builder_address: string;
73
+ fee_bps: {
74
+ perps: number;
75
+ spot_sell: number;
76
+ };
77
+ };
78
+ }
79
+ /**
80
+ * Get HL builder info
81
+ */
82
+ export declare function getHLBuilderInfo(): Promise<HLBuilderInfoResponse>;
83
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE;QACN,EAAE,EAAE,MAAM,CAAA;QACV,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,CAAC,EAAE;YACP,OAAO,EAAE,MAAM,CAAA;YACf,IAAI,EAAE,MAAM,CAAA;SACb,CAAA;QACD,WAAW,CAAC,EAAE;YACZ,OAAO,EAAE,MAAM,CAAA;YACf,eAAe,EAAE,MAAM,CAAA;YACvB,OAAO,EAAE;gBACP,KAAK,EAAE,MAAM,CAAA;gBACb,SAAS,EAAE,MAAM,CAAA;aAClB,CAAA;YACD,UAAU,EAAE,MAAM,EAAE,CAAA;SACrB,CAAA;KACF,CAAA;IACD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE;YACP,OAAO,EAAE,MAAM,CAAA;YACf,WAAW,EAAE,MAAM,CAAA;SACpB,CAAA;QACD,WAAW,CAAC,EAAE;YACZ,OAAO,EAAE,MAAM,CAAA;YACf,aAAa,EAAE,MAAM,CAAA;SACtB,CAAA;KACF,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CASpF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAS5E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAU1F;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE;QACR,eAAe,EAAE,MAAM,CAAA;QACvB,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAA;KAC9C,CAAA;CACF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAGvE"}
@@ -0,0 +1,60 @@
1
+ const API_BASE = process.env.CABAL_API_URL || 'https://cabal.trading/api/v1';
2
+ async function handleResponse(response) {
3
+ if (!response.ok) {
4
+ let errorMessage = `HTTP ${response.status}`;
5
+ try {
6
+ const data = await response.json();
7
+ errorMessage = data.error || data.message || errorMessage;
8
+ }
9
+ catch {
10
+ // Response wasn't JSON
11
+ }
12
+ throw new Error(errorMessage);
13
+ }
14
+ return response.json();
15
+ }
16
+ /**
17
+ * Register a new agent with Cabal
18
+ */
19
+ export async function registerAgent(data) {
20
+ const response = await fetch(`${API_BASE}/agents/register`, {
21
+ method: 'POST',
22
+ headers: { 'Content-Type': 'application/json' },
23
+ body: JSON.stringify(data),
24
+ });
25
+ // Registration returns success: false for validation errors, so don't throw
26
+ return response.json();
27
+ }
28
+ /**
29
+ * Get agent status
30
+ */
31
+ export async function getAgentStatus(apiKey) {
32
+ const response = await fetch(`${API_BASE}/agents/me`, {
33
+ headers: {
34
+ 'Authorization': `Bearer ${apiKey}`,
35
+ 'Content-Type': 'application/json',
36
+ },
37
+ });
38
+ return handleResponse(response);
39
+ }
40
+ /**
41
+ * Confirm HL builder approval with Cabal
42
+ */
43
+ export async function confirmHLApproval(apiKey) {
44
+ const response = await fetch(`${API_BASE}/hyperliquid/confirm-approval`, {
45
+ method: 'POST',
46
+ headers: {
47
+ 'Authorization': `Bearer ${apiKey}`,
48
+ 'Content-Type': 'application/json',
49
+ },
50
+ });
51
+ return handleResponse(response);
52
+ }
53
+ /**
54
+ * Get HL builder info
55
+ */
56
+ export async function getHLBuilderInfo() {
57
+ const response = await fetch(`${API_BASE}/hyperliquid/builder-info`);
58
+ return handleResponse(response);
59
+ }
60
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,8BAA8B,CAAA;AAE5E,KAAK,UAAU,cAAc,CAAI,QAAkB;IACjD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,YAAY,GAAG,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAA;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA0C,CAAA;YAC1E,YAAY,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,YAAY,CAAA;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAA;AACtC,CAAC;AA8DD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAqB;IACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,kBAAkB,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;IAEF,4EAA4E;IAC5E,OAAO,QAAQ,CAAC,IAAI,EAA+B,CAAA;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc;IACjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,YAAY,EAAE;QACpD,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAA;IAEF,OAAO,cAAc,CAAiB,QAAQ,CAAC,CAAA;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,+BAA+B,EAAE;QACvE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAA;IAEF,OAAO,cAAc,CAA4B,QAAQ,CAAC,CAAA;AAC5D,CAAC;AAUD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,2BAA2B,CAAC,CAAA;IACpE,OAAO,cAAc,CAAwB,QAAQ,CAAC,CAAA;AACxD,CAAC"}
@@ -0,0 +1,45 @@
1
+ export interface CabalEnv {
2
+ CABAL_API_KEY?: string;
3
+ CABAL_AGENT_ID?: string;
4
+ CABAL_AGENT_NAME?: string;
5
+ SOLANA_PUBLIC_KEY?: string;
6
+ SOLANA_PRIVATE_KEY?: string;
7
+ EVM_PUBLIC_KEY?: string;
8
+ EVM_PRIVATE_KEY?: string;
9
+ }
10
+ /**
11
+ * Load existing .env file
12
+ */
13
+ export declare function loadEnv(): CabalEnv;
14
+ /**
15
+ * Check if Cabal is already configured
16
+ */
17
+ export declare function isConfigured(): boolean;
18
+ /**
19
+ * Save credentials to .env file
20
+ */
21
+ export declare function saveEnv(credentials: {
22
+ apiKey: string;
23
+ agentId: string;
24
+ agentName: string;
25
+ solanaPublicKey?: string;
26
+ solanaPrivateKey?: string;
27
+ evmPublicKey?: string;
28
+ evmPrivateKey?: string;
29
+ }): void;
30
+ /**
31
+ * Get credentials from env
32
+ */
33
+ export declare function getCredentials(): CabalEnv;
34
+ /**
35
+ * Check if .env is in .gitignore
36
+ */
37
+ export declare function isEnvInGitignore(): boolean;
38
+ /**
39
+ * Add .env to .gitignore if it exists
40
+ */
41
+ export declare function ensureEnvInGitignore(): {
42
+ added: boolean;
43
+ created: boolean;
44
+ };
45
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,QAAQ,CASlC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAGtC;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,WAAW,EAAE;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,IAAI,CAqDP;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CAgBzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAkB1C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAmB3E"}
@@ -0,0 +1,128 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import dotenv from 'dotenv';
4
+ const ENV_FILE = '.env';
5
+ const GITIGNORE_FILE = '.gitignore';
6
+ /**
7
+ * Load existing .env file
8
+ */
9
+ export function loadEnv() {
10
+ const envPath = path.resolve(process.cwd(), ENV_FILE);
11
+ if (fs.existsSync(envPath)) {
12
+ const result = dotenv.config({ path: envPath });
13
+ return (result.parsed || {});
14
+ }
15
+ return {};
16
+ }
17
+ /**
18
+ * Check if Cabal is already configured
19
+ */
20
+ export function isConfigured() {
21
+ const env = loadEnv();
22
+ return !!env.CABAL_API_KEY;
23
+ }
24
+ /**
25
+ * Save credentials to .env file
26
+ */
27
+ export function saveEnv(credentials) {
28
+ const envPath = path.resolve(process.cwd(), ENV_FILE);
29
+ // Load existing env to preserve other variables
30
+ let existingContent = '';
31
+ if (fs.existsSync(envPath)) {
32
+ existingContent = fs.readFileSync(envPath, 'utf-8');
33
+ // Remove old Cabal-related lines
34
+ const cabalKeys = [
35
+ 'CABAL_API_KEY',
36
+ 'CABAL_AGENT_ID',
37
+ 'CABAL_AGENT_NAME',
38
+ 'SOLANA_PUBLIC_KEY',
39
+ 'SOLANA_PRIVATE_KEY',
40
+ 'EVM_PUBLIC_KEY',
41
+ 'EVM_PRIVATE_KEY',
42
+ ];
43
+ const lines = existingContent.split('\n').filter(line => {
44
+ const key = line.split('=')[0]?.trim();
45
+ return !cabalKeys.includes(key);
46
+ });
47
+ existingContent = lines.join('\n').trim();
48
+ if (existingContent)
49
+ existingContent += '\n\n';
50
+ }
51
+ // Build new Cabal section
52
+ let cabalSection = `# Cabal Agent Credentials
53
+ # Generated by cabal-cli - DO NOT SHARE THESE!
54
+ CABAL_API_KEY=${credentials.apiKey}
55
+ CABAL_AGENT_ID=${credentials.agentId}
56
+ CABAL_AGENT_NAME=${credentials.agentName}
57
+ `;
58
+ if (credentials.solanaPublicKey && credentials.solanaPrivateKey) {
59
+ cabalSection += `
60
+ # Solana Wallet (for Jupiter swaps on Solana)
61
+ SOLANA_PUBLIC_KEY=${credentials.solanaPublicKey}
62
+ SOLANA_PRIVATE_KEY=${credentials.solanaPrivateKey}
63
+ `;
64
+ }
65
+ if (credentials.evmPublicKey && credentials.evmPrivateKey) {
66
+ cabalSection += `
67
+ # EVM Wallet (for Hyperliquid perps/spot)
68
+ EVM_PUBLIC_KEY=${credentials.evmPublicKey}
69
+ EVM_PRIVATE_KEY=${credentials.evmPrivateKey}
70
+ `;
71
+ }
72
+ fs.writeFileSync(envPath, existingContent + cabalSection);
73
+ }
74
+ /**
75
+ * Get credentials from env
76
+ */
77
+ export function getCredentials() {
78
+ // First try process.env (for already loaded vars)
79
+ const fromProcess = {
80
+ CABAL_API_KEY: process.env.CABAL_API_KEY,
81
+ CABAL_AGENT_ID: process.env.CABAL_AGENT_ID,
82
+ CABAL_AGENT_NAME: process.env.CABAL_AGENT_NAME,
83
+ SOLANA_PUBLIC_KEY: process.env.SOLANA_PUBLIC_KEY,
84
+ SOLANA_PRIVATE_KEY: process.env.SOLANA_PRIVATE_KEY,
85
+ EVM_PUBLIC_KEY: process.env.EVM_PUBLIC_KEY,
86
+ EVM_PRIVATE_KEY: process.env.EVM_PRIVATE_KEY,
87
+ };
88
+ // Then try loading from .env file
89
+ const fromFile = loadEnv();
90
+ return { ...fromFile, ...fromProcess };
91
+ }
92
+ /**
93
+ * Check if .env is in .gitignore
94
+ */
95
+ export function isEnvInGitignore() {
96
+ const gitignorePath = path.resolve(process.cwd(), GITIGNORE_FILE);
97
+ if (!fs.existsSync(gitignorePath)) {
98
+ return false;
99
+ }
100
+ const content = fs.readFileSync(gitignorePath, 'utf-8');
101
+ const lines = content.split('\n').map(line => line.trim());
102
+ // Check for common .env patterns
103
+ return lines.some(line => line === '.env' ||
104
+ line === '.env*' ||
105
+ line === '.env.local' ||
106
+ line === '*.env' ||
107
+ line.startsWith('.env'));
108
+ }
109
+ /**
110
+ * Add .env to .gitignore if it exists
111
+ */
112
+ export function ensureEnvInGitignore() {
113
+ const gitignorePath = path.resolve(process.cwd(), GITIGNORE_FILE);
114
+ if (!fs.existsSync(gitignorePath)) {
115
+ // Create .gitignore with .env
116
+ fs.writeFileSync(gitignorePath, '.env\n');
117
+ return { added: true, created: true };
118
+ }
119
+ if (isEnvInGitignore()) {
120
+ return { added: false, created: false };
121
+ }
122
+ // Append .env to existing .gitignore
123
+ const content = fs.readFileSync(gitignorePath, 'utf-8');
124
+ const newContent = content.endsWith('\n') ? `${content}.env\n` : `${content}\n.env\n`;
125
+ fs.writeFileSync(gitignorePath, newContent);
126
+ return { added: true, created: false };
127
+ }
128
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface SolanaWallet {
2
+ publicKey: string;
3
+ privateKey: string;
4
+ }
5
+ export interface EvmWallet {
6
+ address: string;
7
+ privateKey: string;
8
+ }
9
+ /**
10
+ * Generate a new Solana keypair
11
+ */
12
+ export declare function generateSolanaWallet(): SolanaWallet;
13
+ /**
14
+ * Generate a new EVM wallet (for Hyperliquid)
15
+ */
16
+ export declare function generateEvmWallet(): EvmWallet;
17
+ /**
18
+ * Validate a Solana public key
19
+ */
20
+ export declare function isValidSolanaAddress(address: string): boolean;
21
+ /**
22
+ * Validate an EVM address
23
+ */
24
+ export declare function isValidEvmAddress(address: string): boolean;
25
+ /**
26
+ * Truncate address for display
27
+ */
28
+ export declare function truncateAddress(address: string, chars?: number): string;
29
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/lib/wallet.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,YAAY,CAMnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,CAM7C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,CAGlE"}
@@ -0,0 +1,50 @@
1
+ import { Keypair } from '@solana/web3.js';
2
+ import { Wallet } from 'ethers';
3
+ import bs58 from 'bs58';
4
+ /**
5
+ * Generate a new Solana keypair
6
+ */
7
+ export function generateSolanaWallet() {
8
+ const keypair = Keypair.generate();
9
+ return {
10
+ publicKey: keypair.publicKey.toBase58(),
11
+ privateKey: bs58.encode(keypair.secretKey),
12
+ };
13
+ }
14
+ /**
15
+ * Generate a new EVM wallet (for Hyperliquid)
16
+ */
17
+ export function generateEvmWallet() {
18
+ const wallet = Wallet.createRandom();
19
+ return {
20
+ address: wallet.address,
21
+ privateKey: wallet.privateKey,
22
+ };
23
+ }
24
+ /**
25
+ * Validate a Solana public key
26
+ */
27
+ export function isValidSolanaAddress(address) {
28
+ try {
29
+ const decoded = bs58.decode(address);
30
+ return decoded.length === 32;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ /**
37
+ * Validate an EVM address
38
+ */
39
+ export function isValidEvmAddress(address) {
40
+ return /^0x[a-fA-F0-9]{40}$/.test(address);
41
+ }
42
+ /**
43
+ * Truncate address for display
44
+ */
45
+ export function truncateAddress(address, chars = 4) {
46
+ if (address.length <= chars * 2 + 3)
47
+ return address;
48
+ return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;
49
+ }
50
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/lib/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,IAAI,MAAM,MAAM,CAAA;AAYvB;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;IAClC,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE;QACvC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;KAC3C,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,CAAA;IACpC,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACpC,OAAO,OAAO,CAAC,MAAM,KAAK,EAAE,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAK,GAAG,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAA;IACnD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAA;AACpE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@cabaltrading/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for Cabal - AI Trading Collective. Generate wallets, register agents, start trading.",
5
+ "keywords": ["cabal", "trading", "ai", "solana", "hyperliquid", "cli"],
6
+ "homepage": "https://cabal.trading",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/cabal-trading/cabal-trading.git",
10
+ "directory": "packages/cabal-cli"
11
+ },
12
+ "license": "MIT",
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "author": "Cabal Trading",
17
+ "type": "module",
18
+ "main": "dist/index.js",
19
+ "bin": {
20
+ "cabal-cli": "./bin/cabal-cli.js"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "bin"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "dev": "tsc --watch",
29
+ "prepublishOnly": "npm run build"
30
+ },
31
+ "dependencies": {
32
+ "@solana/web3.js": "^1.95.0",
33
+ "bs58": "^5.0.0",
34
+ "chalk": "^5.3.0",
35
+ "commander": "^12.1.0",
36
+ "dotenv": "^16.4.5",
37
+ "ethers": "^6.13.0",
38
+ "inquirer": "^9.2.0",
39
+ "ora": "^8.0.1",
40
+ "viem": "^2.21.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/inquirer": "^9.0.7",
44
+ "@types/node": "^20.14.0",
45
+ "typescript": "^5.4.0"
46
+ },
47
+ "engines": {
48
+ "node": ">=18.0.0"
49
+ }
50
+ }