@marketmotion/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.
Files changed (90) hide show
  1. package/README.md +151 -0
  2. package/dist/bin/motion.d.ts +3 -0
  3. package/dist/bin/motion.d.ts.map +1 -0
  4. package/dist/bin/motion.js +42 -0
  5. package/dist/bin/motion.js.map +1 -0
  6. package/dist/src/client/api.d.ts +120 -0
  7. package/dist/src/client/api.d.ts.map +1 -0
  8. package/dist/src/client/api.js +212 -0
  9. package/dist/src/client/api.js.map +1 -0
  10. package/dist/src/commands/alerts.d.ts +3 -0
  11. package/dist/src/commands/alerts.d.ts.map +1 -0
  12. package/dist/src/commands/alerts.js +128 -0
  13. package/dist/src/commands/alerts.js.map +1 -0
  14. package/dist/src/commands/arb.d.ts +3 -0
  15. package/dist/src/commands/arb.d.ts.map +1 -0
  16. package/dist/src/commands/arb.js +61 -0
  17. package/dist/src/commands/arb.js.map +1 -0
  18. package/dist/src/commands/auth.d.ts +3 -0
  19. package/dist/src/commands/auth.d.ts.map +1 -0
  20. package/dist/src/commands/auth.js +116 -0
  21. package/dist/src/commands/auth.js.map +1 -0
  22. package/dist/src/commands/entities.d.ts +3 -0
  23. package/dist/src/commands/entities.d.ts.map +1 -0
  24. package/dist/src/commands/entities.js +56 -0
  25. package/dist/src/commands/entities.js.map +1 -0
  26. package/dist/src/commands/entity.d.ts +3 -0
  27. package/dist/src/commands/entity.d.ts.map +1 -0
  28. package/dist/src/commands/entity.js +58 -0
  29. package/dist/src/commands/entity.js.map +1 -0
  30. package/dist/src/commands/graph.d.ts +3 -0
  31. package/dist/src/commands/graph.d.ts.map +1 -0
  32. package/dist/src/commands/graph.js +48 -0
  33. package/dist/src/commands/graph.js.map +1 -0
  34. package/dist/src/commands/markets.d.ts +3 -0
  35. package/dist/src/commands/markets.d.ts.map +1 -0
  36. package/dist/src/commands/markets.js +132 -0
  37. package/dist/src/commands/markets.js.map +1 -0
  38. package/dist/src/commands/news.d.ts +3 -0
  39. package/dist/src/commands/news.d.ts.map +1 -0
  40. package/dist/src/commands/news.js +88 -0
  41. package/dist/src/commands/news.js.map +1 -0
  42. package/dist/src/commands/webhook.d.ts +3 -0
  43. package/dist/src/commands/webhook.d.ts.map +1 -0
  44. package/dist/src/commands/webhook.js +165 -0
  45. package/dist/src/commands/webhook.js.map +1 -0
  46. package/dist/src/config.d.ts +14 -0
  47. package/dist/src/config.d.ts.map +1 -0
  48. package/dist/src/config.js +27 -0
  49. package/dist/src/config.js.map +1 -0
  50. package/dist/src/formatters/json.d.ts +2 -0
  51. package/dist/src/formatters/json.d.ts.map +1 -0
  52. package/dist/src/formatters/json.js +4 -0
  53. package/dist/src/formatters/json.js.map +1 -0
  54. package/dist/src/formatters/table.d.ts +11 -0
  55. package/dist/src/formatters/table.d.ts.map +1 -0
  56. package/dist/src/formatters/table.js +554 -0
  57. package/dist/src/formatters/table.js.map +1 -0
  58. package/dist/src/types.d.ts +243 -0
  59. package/dist/src/types.d.ts.map +1 -0
  60. package/dist/src/types.js +3 -0
  61. package/dist/src/types.js.map +1 -0
  62. package/dist/src/ui/AlertFeed.d.ts +8 -0
  63. package/dist/src/ui/AlertFeed.d.ts.map +1 -0
  64. package/dist/src/ui/AlertFeed.js +68 -0
  65. package/dist/src/ui/AlertFeed.js.map +1 -0
  66. package/dist/src/ui/ArbPanel.d.ts +8 -0
  67. package/dist/src/ui/ArbPanel.d.ts.map +1 -0
  68. package/dist/src/ui/ArbPanel.js +61 -0
  69. package/dist/src/ui/ArbPanel.js.map +1 -0
  70. package/dist/src/ui/Dashboard.d.ts +2 -0
  71. package/dist/src/ui/Dashboard.d.ts.map +1 -0
  72. package/dist/src/ui/Dashboard.js +127 -0
  73. package/dist/src/ui/Dashboard.js.map +1 -0
  74. package/dist/src/ui/EntityDetail.d.ts +8 -0
  75. package/dist/src/ui/EntityDetail.d.ts.map +1 -0
  76. package/dist/src/ui/EntityDetail.js +152 -0
  77. package/dist/src/ui/EntityDetail.js.map +1 -0
  78. package/dist/src/ui/MarketTable.d.ts +9 -0
  79. package/dist/src/ui/MarketTable.d.ts.map +1 -0
  80. package/dist/src/ui/MarketTable.js +90 -0
  81. package/dist/src/ui/MarketTable.js.map +1 -0
  82. package/dist/src/ui/Spinner.d.ts +7 -0
  83. package/dist/src/ui/Spinner.d.ts.map +1 -0
  84. package/dist/src/ui/Spinner.js +7 -0
  85. package/dist/src/ui/Spinner.js.map +1 -0
  86. package/dist/src/utils/auth.d.ts +4 -0
  87. package/dist/src/utils/auth.d.ts.map +1 -0
  88. package/dist/src/utils/auth.js +17 -0
  89. package/dist/src/utils/auth.js.map +1 -0
  90. package/package.json +70 -0
@@ -0,0 +1,128 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { createClient, ApiError } from '../client/api.js';
4
+ import { formatAlertList } from '../formatters/table.js';
5
+ import { formatJson } from '../formatters/json.js';
6
+ import { requireAuth } from '../utils/auth.js';
7
+ export function registerAlertsCommand(program) {
8
+ const alerts = program
9
+ .command('alerts')
10
+ .description('View and monitor alerts');
11
+ alerts
12
+ .command('list')
13
+ .description('List recent alerts')
14
+ .option('--type <type>', 'Filter by type (injury, arbitrage, political, finance, conflict, crowding)')
15
+ .option('--limit <n>', 'Max results', '20')
16
+ .option('--json', 'Output raw JSON')
17
+ .action(async (opts) => {
18
+ requireAuth();
19
+ const spinner = ora({ text: 'Loading alerts...', stream: process.stderr }).start();
20
+ try {
21
+ const client = createClient();
22
+ const result = await client.getAlerts({
23
+ type: opts.type,
24
+ limit: parseInt(opts.limit),
25
+ });
26
+ spinner.stop();
27
+ if (opts.json) {
28
+ console.log(formatJson(result));
29
+ return;
30
+ }
31
+ const data = result.data;
32
+ console.log('');
33
+ console.log(` ${chalk.bold('Alerts')}${opts.type ? chalk.dim(` [${opts.type}]`) : ''} ${chalk.dim(`(${data.unreadCount} unread)`)}`);
34
+ console.log('');
35
+ console.log(formatAlertList(data.alerts || []));
36
+ if (data.pagination.total > data.alerts.length) {
37
+ console.log(chalk.dim(`\n Showing ${data.alerts.length} of ${data.pagination.total} total`));
38
+ }
39
+ console.log('');
40
+ }
41
+ catch (err) {
42
+ spinner.stop();
43
+ if (err instanceof ApiError) {
44
+ console.error(chalk.red(err.message));
45
+ }
46
+ else {
47
+ console.error(chalk.red('Error:'), err.message);
48
+ }
49
+ process.exit(1);
50
+ }
51
+ });
52
+ alerts
53
+ .command('watch')
54
+ .description('Live alert feed (polls every 30s)')
55
+ .option('--type <types>', 'Comma-separated types to watch (e.g. injury,arbitrage)')
56
+ .option('--interval <seconds>', 'Poll interval in seconds', '30')
57
+ .option('--json', 'Output raw JSON')
58
+ .action(async (opts) => {
59
+ requireAuth();
60
+ const client = createClient();
61
+ const interval = parseInt(opts.interval) * 1000;
62
+ let lastAlertId = null;
63
+ console.log('');
64
+ console.log(chalk.bold(' Watching alerts') +
65
+ (opts.type ? chalk.dim(` [${opts.type}]`) : '') +
66
+ chalk.dim(` (every ${opts.interval}s, Ctrl+C to stop)`));
67
+ console.log(chalk.dim(' ' + '\u2500'.repeat(60)));
68
+ console.log('');
69
+ const poll = async () => {
70
+ try {
71
+ const result = await client.getAlerts({
72
+ type: opts.type?.replace(/,/g, ','),
73
+ limit: 10,
74
+ });
75
+ const alerts = result.data.alerts || [];
76
+ if (alerts.length === 0)
77
+ return;
78
+ // On first poll, show latest alerts
79
+ if (lastAlertId === null) {
80
+ if (opts.json) {
81
+ for (const a of alerts.slice(0, 5)) {
82
+ console.log(JSON.stringify(a));
83
+ }
84
+ }
85
+ else {
86
+ console.log(formatAlertList(alerts.slice(0, 5)));
87
+ }
88
+ lastAlertId = alerts[0].id;
89
+ return;
90
+ }
91
+ // Show only new alerts
92
+ const newAlerts = [];
93
+ for (const a of alerts) {
94
+ if (a.id === lastAlertId)
95
+ break;
96
+ newAlerts.push(a);
97
+ }
98
+ if (newAlerts.length > 0) {
99
+ lastAlertId = newAlerts[0].id;
100
+ if (opts.json) {
101
+ for (const a of newAlerts) {
102
+ console.log(JSON.stringify(a));
103
+ }
104
+ }
105
+ else {
106
+ console.log(formatAlertList(newAlerts));
107
+ }
108
+ }
109
+ }
110
+ catch (err) {
111
+ if (err instanceof ApiError) {
112
+ console.error(chalk.red(` Poll error: ${err.message}`));
113
+ }
114
+ }
115
+ };
116
+ // Initial poll
117
+ await poll();
118
+ // Set up interval
119
+ const timer = setInterval(poll, interval);
120
+ // Handle Ctrl+C gracefully
121
+ process.on('SIGINT', () => {
122
+ clearInterval(timer);
123
+ console.log(chalk.dim('\n Stopped watching.'));
124
+ process.exit(0);
125
+ });
126
+ });
127
+ }
128
+ //# sourceMappingURL=alerts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../../src/commands/alerts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerArbCommand(program: Command): void;
3
+ //# sourceMappingURL=arb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arb.d.ts","sourceRoot":"","sources":["../../../src/commands/arb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwDzD"}
@@ -0,0 +1,61 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { createClient, ApiError } from '../client/api.js';
4
+ import { formatMispricingList } from '../formatters/table.js';
5
+ import { formatJson } from '../formatters/json.js';
6
+ import { requireAuth } from '../utils/auth.js';
7
+ export function registerArbCommand(program) {
8
+ const arb = program
9
+ .command('arb')
10
+ .description('Cross-venue arbitrage scanner');
11
+ arb
12
+ .command('scan')
13
+ .description('Scan for cross-venue mispricings')
14
+ .option('--min-spread <pct>', 'Minimum spread percentage (e.g. 3 for 3%)', '0')
15
+ .option('--category <category>', 'Filter by category')
16
+ .option('--limit <n>', 'Max results', '30')
17
+ .option('--actionable', 'Only show actionable mispricings')
18
+ .option('--json', 'Output raw JSON')
19
+ .action(async (opts) => {
20
+ requireAuth();
21
+ const spinner = ora({ text: 'Scanning for mispricings across venues...', stream: process.stderr }).start();
22
+ try {
23
+ const client = createClient();
24
+ const minSpread = parseFloat(opts.minSpread) / 100; // Convert percentage to decimal
25
+ const result = await client.getMispricings({
26
+ minSpread: minSpread > 0 ? minSpread : undefined,
27
+ category: opts.category,
28
+ limit: parseInt(opts.limit),
29
+ actionableOnly: opts.actionable,
30
+ });
31
+ spinner.stop();
32
+ if (opts.json) {
33
+ console.log(formatJson(result));
34
+ return;
35
+ }
36
+ const mispricings = result.mispricings || [];
37
+ console.log('');
38
+ console.log(` ${chalk.bold('Arbitrage Scanner')} ${chalk.dim(`(${mispricings.length} results${opts.minSpread !== '0' ? `, >=${opts.minSpread}% spread` : ''})`)}`);
39
+ console.log(` ${chalk.dim(`Scanned at ${result.scannedAt || new Date().toISOString()}`)}`);
40
+ console.log('');
41
+ if (mispricings.length === 0) {
42
+ console.log(chalk.dim(' No mispricings found matching your criteria.'));
43
+ }
44
+ else {
45
+ console.log(formatMispricingList(mispricings));
46
+ }
47
+ console.log('');
48
+ }
49
+ catch (err) {
50
+ spinner.stop();
51
+ if (err instanceof ApiError) {
52
+ console.error(chalk.red(err.message));
53
+ }
54
+ else {
55
+ console.error(chalk.red('Error:'), err.message);
56
+ }
57
+ process.exit(1);
58
+ }
59
+ });
60
+ }
61
+ //# sourceMappingURL=arb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arb.js","sourceRoot":"","sources":["../../../src/commands/arb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAuthCommand(program: Command): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqH1D"}
@@ -0,0 +1,116 @@
1
+ import chalk from 'chalk';
2
+ import { createClient } from '../client/api.js';
3
+ import { getApiKey, setApiKey, clearApiKey, getConfigPath, getBaseUrl } from '../config.js';
4
+ import { DEVELOPER_URL } from '../utils/auth.js';
5
+ export function registerAuthCommand(program) {
6
+ const auth = program.command('auth').description('Manage API authentication');
7
+ auth
8
+ .command('login')
9
+ .description('Set your API key')
10
+ .argument('[key]', 'API key (or pass via MOTION_API_KEY env var)')
11
+ .action(async (key) => {
12
+ if (!key) {
13
+ // Read from stdin if piped, otherwise prompt
14
+ if (!process.stdin.isTTY) {
15
+ const chunks = [];
16
+ for await (const chunk of process.stdin) {
17
+ chunks.push(chunk);
18
+ }
19
+ key = Buffer.concat(chunks).toString().trim();
20
+ }
21
+ else {
22
+ console.error(chalk.red('Usage: motion auth login <api-key>'));
23
+ console.error('');
24
+ console.error(` Get your API key at: ${chalk.cyan(DEVELOPER_URL)}`);
25
+ console.error('');
26
+ console.error(chalk.dim(' Or pipe it in: echo "your-key" | motion auth login'));
27
+ console.error(chalk.dim(' Or use env var: MOTION_API_KEY=your-key motion ...'));
28
+ process.exit(1);
29
+ }
30
+ }
31
+ if (!key) {
32
+ console.error(chalk.red('No API key provided.'));
33
+ process.exit(1);
34
+ }
35
+ // Validate the key
36
+ const client = createClient(key);
37
+ try {
38
+ const result = await client.validateKey();
39
+ if (!result.success) {
40
+ console.error(chalk.red('Invalid API key.'));
41
+ console.error(chalk.dim(` Get a new key at: ${DEVELOPER_URL}`));
42
+ process.exit(1);
43
+ }
44
+ setApiKey(key);
45
+ console.log(chalk.green('Authenticated successfully.'));
46
+ if (result.key) {
47
+ console.log(` Name: ${result.key.name}`);
48
+ console.log(` Tier: ${chalk.cyan(result.key.tier)}`);
49
+ if (result.key.usage) {
50
+ console.log(` Usage: ${result.key.usage.today}/${result.key.usage.limit} requests today`);
51
+ }
52
+ }
53
+ console.log(chalk.dim(` Config: ${getConfigPath()}`));
54
+ }
55
+ catch (err) {
56
+ console.error(chalk.red('Failed to validate API key:'), err.message);
57
+ process.exit(1);
58
+ }
59
+ });
60
+ auth
61
+ .command('logout')
62
+ .description('Remove stored API key')
63
+ .action(() => {
64
+ clearApiKey();
65
+ console.log(chalk.green('API key removed.'));
66
+ });
67
+ auth
68
+ .command('status')
69
+ .description('Show current authentication status')
70
+ .action(async () => {
71
+ const key = getApiKey();
72
+ const baseUrl = getBaseUrl();
73
+ if (!key) {
74
+ console.log(chalk.yellow('Not authenticated.'));
75
+ console.log(` Get your API key at: ${chalk.cyan(DEVELOPER_URL)}`);
76
+ console.log(chalk.dim(' Then run: motion auth login <api-key>'));
77
+ return;
78
+ }
79
+ console.log(` API URL: ${chalk.dim(baseUrl)}`);
80
+ console.log(` Key: ${chalk.dim(key.slice(0, 8) + '...' + key.slice(-4))}`);
81
+ console.log(` Config: ${chalk.dim(getConfigPath())}`);
82
+ const client = createClient(key);
83
+ try {
84
+ const result = await client.validateKey();
85
+ if (result.success && result.key) {
86
+ console.log(` Status: ${chalk.green('Valid')}`);
87
+ console.log(` Name: ${result.key.name}`);
88
+ console.log(` Tier: ${chalk.cyan(result.key.tier)}`);
89
+ if (result.key.usage) {
90
+ console.log(` Usage: ${result.key.usage.today}/${result.key.usage.limit} requests today`);
91
+ }
92
+ }
93
+ else {
94
+ console.log(` Status: ${chalk.red('Invalid')}`);
95
+ }
96
+ }
97
+ catch (err) {
98
+ console.log(` Status: ${chalk.red('Error')} - ${err.message}`);
99
+ }
100
+ });
101
+ auth
102
+ .command('signup')
103
+ .description('Open the developer portal to get an API key')
104
+ .action(async () => {
105
+ console.log(` Opening ${chalk.cyan(DEVELOPER_URL)} ...`);
106
+ try {
107
+ const open = (await import('open')).default;
108
+ await open(DEVELOPER_URL);
109
+ }
110
+ catch {
111
+ console.log('');
112
+ console.log(` Could not open browser. Visit: ${chalk.cyan(DEVELOPER_URL)}`);
113
+ }
114
+ });
115
+ }
116
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerEntitiesCommand(program: Command): void;
3
+ //# sourceMappingURL=entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../../src/commands/entities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqD9D"}
@@ -0,0 +1,56 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { createClient, ApiError } from '../client/api.js';
4
+ import { formatEntityList } from '../formatters/table.js';
5
+ import { formatJson } from '../formatters/json.js';
6
+ import { requireAuth } from '../utils/auth.js';
7
+ export function registerEntitiesCommand(program) {
8
+ const entities = program
9
+ .command('entities')
10
+ .description('Search and browse entities');
11
+ entities
12
+ .command('search')
13
+ .description('Search 17K+ entities')
14
+ .argument('<query>', 'Search query')
15
+ .option('--category <category>', 'Filter by category (e.g. sports, politics, crypto)')
16
+ .option('--type <type>', 'Filter by entity type (person, team, org, place, asset, league, event)')
17
+ .option('--limit <n>', 'Max results', '20')
18
+ .option('--json', 'Output raw JSON')
19
+ .action(async (query, opts) => {
20
+ requireAuth();
21
+ const spinner = ora({ text: 'Searching entities...', stream: process.stderr }).start();
22
+ try {
23
+ const client = createClient();
24
+ const result = await client.searchEntities(query, {
25
+ category: opts.category,
26
+ type: opts.type,
27
+ limit: parseInt(opts.limit),
28
+ });
29
+ spinner.stop();
30
+ if (opts.json) {
31
+ console.log(formatJson(result));
32
+ return;
33
+ }
34
+ console.log('');
35
+ console.log(` ${chalk.bold('Entity Search:')} ${chalk.cyan(query)}${opts.category ? chalk.dim(` [${opts.category}]`) : ''}${opts.type ? chalk.dim(` [${opts.type}]`) : ''}`);
36
+ console.log('');
37
+ console.log(formatEntityList(result.items || []));
38
+ const count = result.items?.length || 0;
39
+ if (count > 0 && result.nextCursor) {
40
+ console.log(chalk.dim(` Showing ${count} results. More available.`));
41
+ }
42
+ console.log('');
43
+ }
44
+ catch (err) {
45
+ spinner.stop();
46
+ if (err instanceof ApiError) {
47
+ console.error(chalk.red(err.message));
48
+ }
49
+ else {
50
+ console.error(chalk.red('Error:'), err.message);
51
+ }
52
+ process.exit(1);
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/commands/entities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerEntityCommand(program: Command): void;
3
+ //# sourceMappingURL=entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../../src/commands/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsD5D"}
@@ -0,0 +1,58 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { createClient, ApiError } from '../client/api.js';
4
+ import { formatEntityDetail } from '../formatters/table.js';
5
+ import { formatJson } from '../formatters/json.js';
6
+ import { requireAuth } from '../utils/auth.js';
7
+ export function registerEntityCommand(program) {
8
+ program
9
+ .command('entity')
10
+ .description('Get detailed entity profile')
11
+ .argument('<slug>', 'Entity slug (e.g. nba-player-1966, nba-bos)')
12
+ .option('--markets', 'Show linked markets')
13
+ .option('--graph', 'Show entity relationship graph')
14
+ .option('--json', 'Output raw JSON')
15
+ .action(async (slug, opts) => {
16
+ requireAuth();
17
+ const spinner = ora({ text: `Loading entity ${slug}...`, stream: process.stderr }).start();
18
+ try {
19
+ const client = createClient();
20
+ if (opts.graph) {
21
+ const graph = await client.getEntityGraph(slug, { depth: 2 });
22
+ spinner.stop();
23
+ if (opts.json) {
24
+ console.log(formatJson(graph));
25
+ return;
26
+ }
27
+ const { formatGraph } = await import('../formatters/table.js');
28
+ console.log(formatGraph(graph.nodes || [], graph.edges || []));
29
+ return;
30
+ }
31
+ const result = await client.getEntity(slug);
32
+ spinner.stop();
33
+ if (opts.json) {
34
+ console.log(formatJson(result));
35
+ return;
36
+ }
37
+ if (!result.entity) {
38
+ console.error(chalk.red(`Entity not found: ${slug}`));
39
+ process.exit(1);
40
+ }
41
+ console.log(formatEntityDetail(result));
42
+ }
43
+ catch (err) {
44
+ spinner.stop();
45
+ if (err instanceof ApiError && err.status === 404) {
46
+ console.error(chalk.red(`Entity not found: ${slug}`));
47
+ }
48
+ else if (err instanceof ApiError) {
49
+ console.error(chalk.red(err.message));
50
+ }
51
+ else {
52
+ console.error(chalk.red('Error:'), err.message);
53
+ }
54
+ process.exit(1);
55
+ }
56
+ });
57
+ }
58
+ //# sourceMappingURL=entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.js","sourceRoot":"","sources":["../../../src/commands/entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerGraphCommand(program: Command): void;
3
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/commands/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuC3D"}
@@ -0,0 +1,48 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { createClient, ApiError } from '../client/api.js';
4
+ import { formatGraph } from '../formatters/table.js';
5
+ import { formatJson } from '../formatters/json.js';
6
+ import { requireAuth } from '../utils/auth.js';
7
+ export function registerGraphCommand(program) {
8
+ program
9
+ .command('graph')
10
+ .description('Explore entity relationship graph')
11
+ .argument('<slug>', 'Entity slug')
12
+ .option('--depth <n>', 'Traversal depth (1-3)', '1')
13
+ .option('--max-nodes <n>', 'Max nodes to return', '50')
14
+ .option('--json', 'Output raw JSON')
15
+ .action(async (slug, opts) => {
16
+ requireAuth();
17
+ const spinner = ora({ text: `Loading graph for ${slug}...`, stream: process.stderr }).start();
18
+ try {
19
+ const client = createClient();
20
+ const result = await client.getEntityGraph(slug, {
21
+ depth: parseInt(opts.depth),
22
+ maxNodes: parseInt(opts.maxNodes),
23
+ });
24
+ spinner.stop();
25
+ if (opts.json) {
26
+ console.log(formatJson(result));
27
+ return;
28
+ }
29
+ console.log('');
30
+ console.log(` ${chalk.bold('Entity Graph:')} ${chalk.cyan(slug)} ${chalk.dim(`(depth=${opts.depth})`)}`);
31
+ console.log(formatGraph(result.nodes || [], result.edges || []));
32
+ }
33
+ catch (err) {
34
+ spinner.stop();
35
+ if (err instanceof ApiError && err.status === 404) {
36
+ console.error(chalk.red(`Entity not found: ${slug}`));
37
+ }
38
+ else if (err instanceof ApiError) {
39
+ console.error(chalk.red(err.message));
40
+ }
41
+ else {
42
+ console.error(chalk.red('Error:'), err.message);
43
+ }
44
+ process.exit(1);
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/commands/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mCAAmC,CAAC;SAChD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;SACjC,MAAM,CAAC,aAAa,EAAE,uBAAuB,EAAE,GAAG,CAAC;SACnD,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,IAAI,CAAC;SACtD,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAI,EAAE,EAAE;QACnC,WAAW,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,qBAAqB,IAAI,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC9F,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE;gBAC/C,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC3B,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1G,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerMarketsCommand(program: Command): void;
3
+ //# sourceMappingURL=markets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markets.d.ts","sourceRoot":"","sources":["../../../src/commands/markets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmI7D"}