@3rd-eye-labs/openmm 0.1.3 → 0.1.4
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 +34 -1
- package/dist/cli/cli.js +55 -40
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/setup.d.ts +3 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +253 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,40 @@ Traditional market-making services are expensive and fragmented, making it diffi
|
|
|
17
17
|
|
|
18
18
|
This toolkit aims to improve liquidity for Cardano projects, reduce trading spreads, and potentially become the standard liquidity infrastructure for the Cardano ecosystem.
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## ⚡ Quick Start
|
|
21
|
+
|
|
22
|
+
### CLI Tool
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 1. Install & Setup OpenMM
|
|
26
|
+
npm install -g openmm
|
|
27
|
+
npx openmm setup
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The setup wizard will:
|
|
31
|
+
- Let you select exchanges (MEXC, Gate.io, Kraken, Bitget)
|
|
32
|
+
- Prompt for API credentials
|
|
33
|
+
- Create a `.env` file with your credentials
|
|
34
|
+
|
|
35
|
+
### MCP Server — For AI Agents
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# 2. Install & Setup OpenMM MCP (13 tools)
|
|
39
|
+
npm install -g @qbtlabs/openmm-mcp
|
|
40
|
+
npx @qbtlabs/openmm-mcp setup
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Configures Claude Desktop, Claude Code, Cursor, or Windsurf to use OpenMM tools.
|
|
44
|
+
|
|
45
|
+
### Verify Installation
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
openmm balance --exchange mexc
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Or ask your AI agent: *"What is my balance on MEXC?"*
|
|
52
|
+
|
|
53
|
+
## Getting Started (Development)
|
|
21
54
|
|
|
22
55
|
### Prerequisites
|
|
23
56
|
|
package/dist/cli/cli.js
CHANGED
|
@@ -1,46 +1,61 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
4
|
+
// Handle setup command before importing modules that require credentials
|
|
5
|
+
if (process.argv[2] === 'setup') {
|
|
6
|
+
import('./commands/setup.js').then(({ setupCommand }) => {
|
|
7
|
+
const { Command } = require('commander');
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program.name('openmm').description('OpenMM - Universal Market Making Toolkit').version('1.0.0');
|
|
10
|
+
program.addCommand(setupCommand);
|
|
11
|
+
program.parse(process.argv);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
// Normal CLI with all commands
|
|
16
|
+
runCli();
|
|
17
|
+
}
|
|
18
|
+
async function runCli() {
|
|
19
|
+
const { Command } = await import('commander');
|
|
20
|
+
const chalk = (await import('chalk')).default;
|
|
21
|
+
const { balanceCommand } = await import('./commands/balance.js');
|
|
22
|
+
const { ordersCommand } = await import('./commands/orders.js');
|
|
23
|
+
const { tickerCommand } = await import('./commands/ticker.js');
|
|
24
|
+
const { orderbookCommand } = await import('./commands/orderbook.js');
|
|
25
|
+
const { tradesCommand } = await import('./commands/trades.js');
|
|
26
|
+
const { ohlcvCommand } = await import('./commands/ohlcv.js');
|
|
27
|
+
const { poolDiscoveryCommand } = await import('./commands/pool-discovery.js');
|
|
28
|
+
const { tradeCommand } = await import('./commands/trade.js');
|
|
29
|
+
const { priceComparisonCommand } = await import('./commands/price-comparison.js');
|
|
30
|
+
const { walletCommand } = await import('./commands/wallet.js');
|
|
31
|
+
const { setupCommand } = await import('./commands/setup.js');
|
|
32
|
+
const program = new Command();
|
|
33
|
+
program.name('openmm').description('OpenMM - Universal Market Making Toolkit').version('1.0.0');
|
|
34
|
+
program.addCommand(setupCommand);
|
|
35
|
+
program.addCommand(balanceCommand);
|
|
36
|
+
program.addCommand(ordersCommand);
|
|
37
|
+
program.addCommand(tickerCommand);
|
|
38
|
+
program.addCommand(orderbookCommand);
|
|
39
|
+
program.addCommand(tradesCommand);
|
|
40
|
+
program.addCommand(ohlcvCommand);
|
|
41
|
+
program.addCommand(poolDiscoveryCommand);
|
|
42
|
+
program.addCommand(tradeCommand);
|
|
43
|
+
program.addCommand(priceComparisonCommand);
|
|
44
|
+
program.addCommand(walletCommand);
|
|
45
|
+
program.exitOverride(err => {
|
|
46
|
+
if (err.code === 'commander.unknownCommand') {
|
|
47
|
+
console.error(chalk.red(`Unknown command: ${err.message}`));
|
|
48
|
+
console.log(chalk.yellow('Run "openmm --help" to see available commands'));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
if (err.code === 'commander.helpDisplayed') {
|
|
52
|
+
process.exit(0);
|
|
53
|
+
}
|
|
54
|
+
throw err;
|
|
55
|
+
});
|
|
56
|
+
program.parse(process.argv);
|
|
57
|
+
if (process.argv.length === 2) {
|
|
58
|
+
program.help();
|
|
39
59
|
}
|
|
40
|
-
throw err;
|
|
41
|
-
});
|
|
42
|
-
program.parse(process.argv);
|
|
43
|
-
if (process.argv.length === 2) {
|
|
44
|
-
program.help();
|
|
45
60
|
}
|
|
46
61
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmPpC,eAAO,MAAM,YAAY,SAIrB,CAAC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.setupCommand = void 0;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const readline = __importStar(require("readline"));
|
|
44
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
45
|
+
const EXCHANGES = [
|
|
46
|
+
{
|
|
47
|
+
id: 'mexc',
|
|
48
|
+
name: 'MEXC',
|
|
49
|
+
fields: [
|
|
50
|
+
{ key: 'MEXC_API_KEY', label: 'API Key' },
|
|
51
|
+
{ key: 'MEXC_SECRET', label: 'Secret Key' },
|
|
52
|
+
],
|
|
53
|
+
docsUrl: 'https://www.mexc.com/api',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: 'gateio',
|
|
57
|
+
name: 'Gate.io',
|
|
58
|
+
fields: [
|
|
59
|
+
{ key: 'GATEIO_API_KEY', label: 'API Key' },
|
|
60
|
+
{ key: 'GATEIO_SECRET', label: 'Secret Key' },
|
|
61
|
+
],
|
|
62
|
+
docsUrl: 'https://www.gate.io/myaccount/api_key_manage',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: 'kraken',
|
|
66
|
+
name: 'Kraken',
|
|
67
|
+
fields: [
|
|
68
|
+
{ key: 'KRAKEN_API_KEY', label: 'API Key' },
|
|
69
|
+
{ key: 'KRAKEN_SECRET', label: 'Private Key' },
|
|
70
|
+
],
|
|
71
|
+
docsUrl: 'https://www.kraken.com/u/security/api',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'bitget',
|
|
75
|
+
name: 'Bitget',
|
|
76
|
+
fields: [
|
|
77
|
+
{ key: 'BITGET_API_KEY', label: 'API Key' },
|
|
78
|
+
{ key: 'BITGET_SECRET', label: 'Secret Key' },
|
|
79
|
+
{ key: 'BITGET_PASSPHRASE', label: 'Passphrase' },
|
|
80
|
+
],
|
|
81
|
+
docsUrl: 'https://www.bitget.com/account/newapi',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
const BANNER = `
|
|
85
|
+
${chalk_1.default.cyan('╔═══════════════════════════════════════════════════════════════╗')}
|
|
86
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.cyan('║')}
|
|
87
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.bold.white('██████╗ ██████╗ ███████╗███╗ ██╗███╗ ███╗███╗ ███╗')} ${chalk_1.default.cyan('║')}
|
|
88
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.bold.white('██╔═══██╗██╔══██╗██╔════╝████╗ ██║████╗ ████║████╗ ████║')} ${chalk_1.default.cyan('║')}
|
|
89
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.bold.white('██║ ██║██████╔╝█████╗ ██╔██╗ ██║██╔████╔██║██╔████╔██║')} ${chalk_1.default.cyan('║')}
|
|
90
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.bold.white('██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║██║╚██╔╝██║██║╚██╔╝██║')} ${chalk_1.default.cyan('║')}
|
|
91
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.bold.white('╚██████╔╝██║ ███████╗██║ ╚████║██║ ╚═╝ ██║██║ ╚═╝ ██║')} ${chalk_1.default.cyan('║')}
|
|
92
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.bold.white('╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝')} ${chalk_1.default.cyan('║')}
|
|
93
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.cyan('║')}
|
|
94
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.gray('AI-Native Market Making Infrastructure')} ${chalk_1.default.cyan('║')}
|
|
95
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.gray('Configure your exchange API credentials')} ${chalk_1.default.cyan('║')}
|
|
96
|
+
${chalk_1.default.cyan('║')} ${chalk_1.default.cyan('║')}
|
|
97
|
+
${chalk_1.default.cyan('╚═══════════════════════════════════════════════════════════════╝')}
|
|
98
|
+
`;
|
|
99
|
+
function createReadlineInterface() {
|
|
100
|
+
return readline.createInterface({
|
|
101
|
+
input: process.stdin,
|
|
102
|
+
output: process.stdout,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function question(rl, prompt) {
|
|
106
|
+
return new Promise(resolve => {
|
|
107
|
+
rl.question(prompt, answer => {
|
|
108
|
+
resolve(answer.trim());
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function selectMultiple(rl, prompt, options) {
|
|
113
|
+
return new Promise(resolve => {
|
|
114
|
+
console.log(`\n${chalk_1.default.bold(prompt)}`);
|
|
115
|
+
options.forEach((opt, i) => console.log(` ${chalk_1.default.cyan(i + 1)}. ${opt.name}`));
|
|
116
|
+
console.log(`\n ${chalk_1.default.gray('Enter numbers separated by commas (e.g., 1,2,3)')}`);
|
|
117
|
+
console.log(` ${chalk_1.default.gray('Or press Enter for all exchanges')}`);
|
|
118
|
+
rl.question(`\n${chalk_1.default.yellow('Your selection:')} `, answer => {
|
|
119
|
+
if (!answer.trim()) {
|
|
120
|
+
resolve(options.map(o => o.id));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const indices = answer
|
|
124
|
+
.split(',')
|
|
125
|
+
.map(s => parseInt(s.trim()) - 1)
|
|
126
|
+
.filter(i => i >= 0 && i < options.length);
|
|
127
|
+
if (indices.length === 0) {
|
|
128
|
+
resolve(options.map(o => o.id));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
resolve(indices.map(i => options[i].id));
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
function readEnvFile(envPath) {
|
|
137
|
+
const env = {};
|
|
138
|
+
try {
|
|
139
|
+
if (fs.existsSync(envPath)) {
|
|
140
|
+
const content = fs.readFileSync(envPath, 'utf-8');
|
|
141
|
+
content.split('\n').forEach(line => {
|
|
142
|
+
const trimmed = line.trim();
|
|
143
|
+
if (trimmed && !trimmed.startsWith('#')) {
|
|
144
|
+
const [key, ...valueParts] = trimmed.split('=');
|
|
145
|
+
if (key) {
|
|
146
|
+
env[key.trim()] = valueParts.join('=').trim();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// File doesn't exist or is unreadable
|
|
154
|
+
}
|
|
155
|
+
return env;
|
|
156
|
+
}
|
|
157
|
+
function writeEnvFile(envPath, env) {
|
|
158
|
+
const lines = [
|
|
159
|
+
'# OpenMM Exchange Credentials',
|
|
160
|
+
'# Generated by OpenMM Setup Wizard',
|
|
161
|
+
'',
|
|
162
|
+
];
|
|
163
|
+
// Group by exchange
|
|
164
|
+
const exchangeKeys = {
|
|
165
|
+
MEXC: ['MEXC_API_KEY', 'MEXC_SECRET', 'MEXC_UID'],
|
|
166
|
+
GATEIO: ['GATEIO_API_KEY', 'GATEIO_SECRET'],
|
|
167
|
+
KRAKEN: ['KRAKEN_API_KEY', 'KRAKEN_SECRET'],
|
|
168
|
+
BITGET: ['BITGET_API_KEY', 'BITGET_SECRET', 'BITGET_PASSPHRASE'],
|
|
169
|
+
};
|
|
170
|
+
const usedKeys = new Set();
|
|
171
|
+
for (const [exchange, keys] of Object.entries(exchangeKeys)) {
|
|
172
|
+
const hasAny = keys.some(k => env[k]);
|
|
173
|
+
if (hasAny) {
|
|
174
|
+
lines.push(`# ${exchange}`);
|
|
175
|
+
for (const key of keys) {
|
|
176
|
+
if (env[key]) {
|
|
177
|
+
lines.push(`${key}=${env[key]}`);
|
|
178
|
+
usedKeys.add(key);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
lines.push('');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Add any remaining keys
|
|
185
|
+
for (const [key, value] of Object.entries(env)) {
|
|
186
|
+
if (!usedKeys.has(key) && value) {
|
|
187
|
+
lines.push(`${key}=${value}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
fs.writeFileSync(envPath, lines.join('\n'));
|
|
191
|
+
}
|
|
192
|
+
async function runSetup() {
|
|
193
|
+
console.log(BANNER);
|
|
194
|
+
const rl = createReadlineInterface();
|
|
195
|
+
const envPath = path.join(process.cwd(), '.env');
|
|
196
|
+
try {
|
|
197
|
+
// Read existing .env
|
|
198
|
+
const existingEnv = readEnvFile(envPath);
|
|
199
|
+
// Select exchanges
|
|
200
|
+
const exchangeOptions = EXCHANGES.map(e => ({ id: e.id, name: e.name }));
|
|
201
|
+
const selectedExchangeIds = await selectMultiple(rl, 'Which exchanges do you want to configure?', exchangeOptions);
|
|
202
|
+
const selectedExchanges = EXCHANGES.filter(e => selectedExchangeIds.includes(e.id));
|
|
203
|
+
if (selectedExchanges.length === 0) {
|
|
204
|
+
console.log(chalk_1.default.yellow('\n⚠️ No exchanges selected. Exiting.'));
|
|
205
|
+
process.exit(0);
|
|
206
|
+
}
|
|
207
|
+
// Collect credentials
|
|
208
|
+
const newEnv = {};
|
|
209
|
+
for (const exchange of selectedExchanges) {
|
|
210
|
+
console.log(`\n${chalk_1.default.cyan('🔐')} ${chalk_1.default.bold(exchange.name)} credentials`);
|
|
211
|
+
console.log(` ${chalk_1.default.gray(`Get your API key at: ${exchange.docsUrl}`)}`);
|
|
212
|
+
for (const field of exchange.fields) {
|
|
213
|
+
const existingValue = existingEnv[field.key];
|
|
214
|
+
const hint = existingValue ? chalk_1.default.gray(` (current: ${existingValue.slice(0, 8)}...)`) : '';
|
|
215
|
+
const value = await question(rl, ` ${field.label}${hint}: `);
|
|
216
|
+
if (value) {
|
|
217
|
+
newEnv[field.key] = value;
|
|
218
|
+
}
|
|
219
|
+
else if (existingValue) {
|
|
220
|
+
newEnv[field.key] = existingValue;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Merge with existing env
|
|
225
|
+
const mergedEnv = { ...existingEnv, ...newEnv };
|
|
226
|
+
// Write .env file
|
|
227
|
+
writeEnvFile(envPath, mergedEnv);
|
|
228
|
+
console.log(`\n${chalk_1.default.green('✅')} Credentials saved to ${chalk_1.default.cyan('.env')}`);
|
|
229
|
+
// Show configured exchanges
|
|
230
|
+
const configuredExchanges = [];
|
|
231
|
+
if (mergedEnv.MEXC_API_KEY)
|
|
232
|
+
configuredExchanges.push('MEXC');
|
|
233
|
+
if (mergedEnv.GATEIO_API_KEY)
|
|
234
|
+
configuredExchanges.push('Gate.io');
|
|
235
|
+
if (mergedEnv.KRAKEN_API_KEY)
|
|
236
|
+
configuredExchanges.push('Kraken');
|
|
237
|
+
if (mergedEnv.BITGET_API_KEY)
|
|
238
|
+
configuredExchanges.push('Bitget');
|
|
239
|
+
if (configuredExchanges.length > 0) {
|
|
240
|
+
console.log(`\n${chalk_1.default.cyan('📊')} Configured exchanges: ${chalk_1.default.bold(configuredExchanges.join(', '))}`);
|
|
241
|
+
}
|
|
242
|
+
console.log(`\n${chalk_1.default.yellow('💡')} Try running: ${chalk_1.default.cyan('openmm balance --exchange mexc')}\n`);
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
rl.close();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
exports.setupCommand = new commander_1.Command('setup')
|
|
249
|
+
.description('Interactive setup wizard for exchange API credentials')
|
|
250
|
+
.action(async () => {
|
|
251
|
+
await runSetup();
|
|
252
|
+
});
|
|
253
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
|