@trading-boy/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 (106) hide show
  1. package/README.md +8 -0
  2. package/dist/api-client.d.ts +20 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +81 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/cli.d.ts +5 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +71 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/audit.d.ts +33 -0
  11. package/dist/commands/audit.d.ts.map +1 -0
  12. package/dist/commands/audit.js +135 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/behavioral.d.ts +40 -0
  15. package/dist/commands/behavioral.d.ts.map +1 -0
  16. package/dist/commands/behavioral.js +369 -0
  17. package/dist/commands/behavioral.js.map +1 -0
  18. package/dist/commands/billing.d.ts +12 -0
  19. package/dist/commands/billing.d.ts.map +1 -0
  20. package/dist/commands/billing.js +111 -0
  21. package/dist/commands/billing.js.map +1 -0
  22. package/dist/commands/catalysts.d.ts +8 -0
  23. package/dist/commands/catalysts.d.ts.map +1 -0
  24. package/dist/commands/catalysts.js +192 -0
  25. package/dist/commands/catalysts.js.map +1 -0
  26. package/dist/commands/config-cmd.d.ts +30 -0
  27. package/dist/commands/config-cmd.d.ts.map +1 -0
  28. package/dist/commands/config-cmd.js +265 -0
  29. package/dist/commands/config-cmd.js.map +1 -0
  30. package/dist/commands/context.d.ts +40 -0
  31. package/dist/commands/context.d.ts.map +1 -0
  32. package/dist/commands/context.js +385 -0
  33. package/dist/commands/context.js.map +1 -0
  34. package/dist/commands/decisions.d.ts +21 -0
  35. package/dist/commands/decisions.d.ts.map +1 -0
  36. package/dist/commands/decisions.js +327 -0
  37. package/dist/commands/decisions.js.map +1 -0
  38. package/dist/commands/events.d.ts +3 -0
  39. package/dist/commands/events.d.ts.map +1 -0
  40. package/dist/commands/events.js +201 -0
  41. package/dist/commands/events.js.map +1 -0
  42. package/dist/commands/infra.d.ts +22 -0
  43. package/dist/commands/infra.d.ts.map +1 -0
  44. package/dist/commands/infra.js +228 -0
  45. package/dist/commands/infra.js.map +1 -0
  46. package/dist/commands/journal.d.ts +3 -0
  47. package/dist/commands/journal.d.ts.map +1 -0
  48. package/dist/commands/journal.js +616 -0
  49. package/dist/commands/journal.js.map +1 -0
  50. package/dist/commands/login.d.ts +18 -0
  51. package/dist/commands/login.d.ts.map +1 -0
  52. package/dist/commands/login.js +121 -0
  53. package/dist/commands/login.js.map +1 -0
  54. package/dist/commands/logout.d.ts +7 -0
  55. package/dist/commands/logout.d.ts.map +1 -0
  56. package/dist/commands/logout.js +39 -0
  57. package/dist/commands/logout.js.map +1 -0
  58. package/dist/commands/narratives.d.ts +3 -0
  59. package/dist/commands/narratives.d.ts.map +1 -0
  60. package/dist/commands/narratives.js +336 -0
  61. package/dist/commands/narratives.js.map +1 -0
  62. package/dist/commands/query.d.ts +39 -0
  63. package/dist/commands/query.d.ts.map +1 -0
  64. package/dist/commands/query.js +212 -0
  65. package/dist/commands/query.js.map +1 -0
  66. package/dist/commands/review.d.ts +3 -0
  67. package/dist/commands/review.d.ts.map +1 -0
  68. package/dist/commands/review.js +481 -0
  69. package/dist/commands/review.js.map +1 -0
  70. package/dist/commands/risk.d.ts +19 -0
  71. package/dist/commands/risk.d.ts.map +1 -0
  72. package/dist/commands/risk.js +190 -0
  73. package/dist/commands/risk.js.map +1 -0
  74. package/dist/commands/social.d.ts +9 -0
  75. package/dist/commands/social.d.ts.map +1 -0
  76. package/dist/commands/social.js +386 -0
  77. package/dist/commands/social.js.map +1 -0
  78. package/dist/commands/subscribe.d.ts +45 -0
  79. package/dist/commands/subscribe.d.ts.map +1 -0
  80. package/dist/commands/subscribe.js +259 -0
  81. package/dist/commands/subscribe.js.map +1 -0
  82. package/dist/commands/trader.d.ts +12 -0
  83. package/dist/commands/trader.d.ts.map +1 -0
  84. package/dist/commands/trader.js +265 -0
  85. package/dist/commands/trader.js.map +1 -0
  86. package/dist/commands/watch.d.ts +26 -0
  87. package/dist/commands/watch.d.ts.map +1 -0
  88. package/dist/commands/watch.js +121 -0
  89. package/dist/commands/watch.js.map +1 -0
  90. package/dist/commands/whoami.d.ts +14 -0
  91. package/dist/commands/whoami.d.ts.map +1 -0
  92. package/dist/commands/whoami.js +73 -0
  93. package/dist/commands/whoami.js.map +1 -0
  94. package/dist/credentials.d.ts +18 -0
  95. package/dist/credentials.d.ts.map +1 -0
  96. package/dist/credentials.js +164 -0
  97. package/dist/credentials.js.map +1 -0
  98. package/dist/index.d.ts +33 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +28 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/utils.d.ts +6 -0
  103. package/dist/utils.d.ts.map +1 -0
  104. package/dist/utils.js +21 -0
  105. package/dist/utils.js.map +1 -0
  106. package/package.json +40 -0
@@ -0,0 +1,327 @@
1
+ import { Option } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { getConfig, createLogger } from '@trading-boy/core';
4
+ import { Neo4jClient } from '@trading-boy/graph-db';
5
+ import { getTradingHistory, getPerformanceSummary, } from '@trading-boy/context-engine';
6
+ import { formatConnectionError } from '../utils.js';
7
+ // ─── Logger ───
8
+ const logger = createLogger('cli-decisions');
9
+ // ─── Default Trader ───
10
+ const DEFAULT_TRADER_ID = 'default';
11
+ // ─── Neo4j Client Factory ───
12
+ function createNeo4jClient() {
13
+ const config = getConfig();
14
+ return new Neo4jClient({
15
+ uri: config.NEO4J_URI,
16
+ username: config.NEO4J_USER,
17
+ password: config.NEO4J_PASSWORD,
18
+ });
19
+ }
20
+ // ─── Formatters ───
21
+ /**
22
+ * Format a PnL value with color coding.
23
+ */
24
+ function formatPnl(pnl) {
25
+ if (pnl === null) {
26
+ return chalk.dim('-');
27
+ }
28
+ const sign = pnl >= 0 ? '+' : '';
29
+ const str = `${sign}$${pnl.toFixed(2)}`;
30
+ return pnl > 0 ? chalk.green(str) : pnl < 0 ? chalk.red(str) : chalk.dim(str);
31
+ }
32
+ /**
33
+ * Format a percentage with color coding.
34
+ */
35
+ function formatPercent(pct) {
36
+ if (pct === null) {
37
+ return chalk.dim('-');
38
+ }
39
+ const sign = pct >= 0 ? '+' : '';
40
+ const str = `${sign}${pct.toFixed(2)}%`;
41
+ return pct > 0 ? chalk.green(str) : pct < 0 ? chalk.red(str) : chalk.dim(str);
42
+ }
43
+ /**
44
+ * Format a win rate as a colored percentage.
45
+ */
46
+ function formatWinRate(rate) {
47
+ const str = `${(rate * 100).toFixed(1)}%`;
48
+ if (rate >= 0.6) {
49
+ return chalk.green(str);
50
+ }
51
+ if (rate >= 0.4) {
52
+ return chalk.yellow(str);
53
+ }
54
+ return chalk.red(str);
55
+ }
56
+ /**
57
+ * Format milliseconds into a human-readable duration.
58
+ */
59
+ function formatDuration(ms) {
60
+ if (ms === 0) {
61
+ return chalk.dim('-');
62
+ }
63
+ const hours = Math.floor(ms / (1000 * 60 * 60));
64
+ const days = Math.floor(hours / 24);
65
+ const remainingHours = hours % 24;
66
+ if (days > 0) {
67
+ return `${days}d ${remainingHours}h`;
68
+ }
69
+ if (hours > 0) {
70
+ return `${hours}h`;
71
+ }
72
+ const minutes = Math.floor(ms / (1000 * 60));
73
+ return `${minutes}m`;
74
+ }
75
+ /**
76
+ * Format a decision record row for the decisions table.
77
+ */
78
+ function formatDecisionRow(d) {
79
+ const date = d.eventTime ? formatShortDate(d.eventTime) : '-';
80
+ const token = d.tokenSymbol ?? '-';
81
+ const setup = d.setupType ?? '-';
82
+ const dir = d.direction ?? '-';
83
+ const price = d.entryPrice !== null
84
+ ? `$${d.entryPrice.toFixed(2)}`
85
+ : d.exitPrice !== null
86
+ ? `$${d.exitPrice.toFixed(2)}`
87
+ : '-';
88
+ const pnl = formatPnl(d.pnlAbsolute);
89
+ const pnlPct = formatPercent(d.pnlPercent);
90
+ return (' ' +
91
+ padRight(date, 14) +
92
+ padRight(token, 8) +
93
+ padRight(d.decisionType, 14) +
94
+ padRight(dir, 8) +
95
+ padRight(setup, 18) +
96
+ padRight(price, 12) +
97
+ padRight(pnl, 14) +
98
+ pnlPct);
99
+ }
100
+ /**
101
+ * Format the decisions list output.
102
+ */
103
+ export function formatDecisionsOutput(decisions) {
104
+ const lines = [];
105
+ lines.push('');
106
+ lines.push(chalk.bold.cyan(' Trade Decisions'));
107
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(100)));
108
+ lines.push('');
109
+ if (decisions.length === 0) {
110
+ lines.push(` ${chalk.dim('No trade decisions found.')}`);
111
+ lines.push('');
112
+ return lines.join('\n');
113
+ }
114
+ // Header
115
+ lines.push(' ' +
116
+ padRight('Date', 14) +
117
+ padRight('Token', 8) +
118
+ padRight('Type', 14) +
119
+ padRight('Dir', 8) +
120
+ padRight('Setup', 18) +
121
+ padRight('Price', 12) +
122
+ padRight('PnL', 14) +
123
+ 'PnL %');
124
+ lines.push(' ' + '\u2500'.repeat(100));
125
+ for (const d of decisions) {
126
+ lines.push(formatDecisionRow(d));
127
+ }
128
+ lines.push('');
129
+ lines.push(` ${chalk.gray(`Total: ${decisions.length} decision(s)`)}`);
130
+ lines.push('');
131
+ return lines.join('\n');
132
+ }
133
+ /**
134
+ * Format the stats output.
135
+ */
136
+ export function formatStatsOutput(stats, label = 'Overall') {
137
+ const lines = [];
138
+ lines.push('');
139
+ lines.push(chalk.bold.cyan(` Trading Statistics: ${label}`));
140
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(50)));
141
+ lines.push('');
142
+ if (stats.totalTrades === 0) {
143
+ lines.push(` ${chalk.dim('No completed trades with outcome data.')}`);
144
+ lines.push('');
145
+ return lines.join('\n');
146
+ }
147
+ lines.push(` ${chalk.gray('Total Trades:')} ${chalk.white(String(stats.totalTrades))}`);
148
+ lines.push(` ${chalk.gray('Win Rate:')} ${formatWinRate(stats.winRate)}`);
149
+ lines.push(` ${chalk.gray('Wins / Losses:')} ${chalk.green(String(stats.wins))} / ${chalk.red(String(stats.losses))}${stats.breakeven > 0 ? ` / ${chalk.dim(String(stats.breakeven) + ' BE')}` : ''}`);
150
+ lines.push('');
151
+ lines.push(` ${chalk.gray('Total PnL:')} ${formatPnl(stats.totalPnl)}`);
152
+ lines.push(` ${chalk.gray('Avg PnL:')} ${formatPnl(stats.avgPnl)}`);
153
+ lines.push(` ${chalk.gray('Avg PnL %:')} ${formatPercent(stats.avgPnlPercent)}`);
154
+ lines.push(` ${chalk.gray('Avg Hold Time:')} ${formatDuration(stats.avgHoldDurationMs)}`);
155
+ if (stats.bestTrade) {
156
+ const best = stats.bestTrade;
157
+ lines.push('');
158
+ lines.push(` ${chalk.gray('Best Trade:')} ${chalk.green(`+$${best.pnlAbsolute.toFixed(2)}`)} ${chalk.dim(`(${best.tokenSymbol} ${best.setupType ?? ''})`).trim()}`);
159
+ }
160
+ if (stats.worstTrade) {
161
+ const worst = stats.worstTrade;
162
+ lines.push(` ${chalk.gray('Worst Trade:')} ${chalk.red(`$${worst.pnlAbsolute.toFixed(2)}`)} ${chalk.dim(`(${worst.tokenSymbol} ${worst.setupType ?? ''})`).trim()}`);
163
+ }
164
+ lines.push('');
165
+ return lines.join('\n');
166
+ }
167
+ /**
168
+ * Format stats grouped by setup type as a summary table.
169
+ */
170
+ export function formatSetupTypeStats(statsBySetup) {
171
+ const lines = [];
172
+ lines.push('');
173
+ lines.push(chalk.bold(' Performance by Setup Type:'));
174
+ lines.push('');
175
+ if (statsBySetup.size === 0) {
176
+ lines.push(` ${chalk.dim('No setup type data available.')}`);
177
+ lines.push('');
178
+ return lines.join('\n');
179
+ }
180
+ lines.push(' ' +
181
+ padRight('Setup', 20) +
182
+ padRight('Trades', 8) +
183
+ padRight('Win Rate', 10) +
184
+ padRight('Avg PnL', 12) +
185
+ padRight('Total PnL', 14));
186
+ lines.push(' ' + '\u2500'.repeat(64));
187
+ // Sort by total PnL descending
188
+ const sorted = [...statsBySetup.entries()].sort((a, b) => b[1].totalPnl - a[1].totalPnl);
189
+ for (const [setup, s] of sorted) {
190
+ lines.push(' ' +
191
+ padRight(setup, 20) +
192
+ padRight(String(s.totalTrades), 8) +
193
+ padRight(formatWinRate(s.winRate), 10) +
194
+ padRight(formatPnl(s.avgPnl), 12) +
195
+ formatPnl(s.totalPnl));
196
+ }
197
+ lines.push('');
198
+ return lines.join('\n');
199
+ }
200
+ // ─── Command Registration ───
201
+ export function registerDecisionsCommand(program) {
202
+ // ─── decisions command ───
203
+ program
204
+ .command('decisions')
205
+ .description('Show trade decision history with outcomes')
206
+ .option('--token <symbol>', 'Filter by token symbol')
207
+ .option('--setup <type>', 'Filter by setup type (BREAKOUT, MOMENTUM, etc.)')
208
+ .option('--limit <n>', 'Maximum number of results', parseIntOption, 20)
209
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
210
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
211
+ .action(async (options) => {
212
+ const client = createNeo4jClient();
213
+ try {
214
+ await client.connect();
215
+ const filters = {
216
+ tokenSymbol: options.token?.toUpperCase(),
217
+ setupType: options.setup,
218
+ limit: options.limit,
219
+ };
220
+ const decisions = await getTradingHistory(client, options.trader, filters);
221
+ if (options.format === 'json') {
222
+ console.log(JSON.stringify(decisions, null, 2));
223
+ }
224
+ else {
225
+ console.log(formatDecisionsOutput(decisions));
226
+ }
227
+ }
228
+ catch (error) {
229
+ const message = error instanceof Error ? error.message : String(error);
230
+ logger.error({ error: message }, 'Failed to fetch decisions');
231
+ console.error(chalk.red(`Error: ${message}`));
232
+ const guidance = formatConnectionError(message);
233
+ if (guidance)
234
+ console.error(guidance);
235
+ process.exitCode = 1;
236
+ }
237
+ finally {
238
+ await client.disconnect();
239
+ }
240
+ });
241
+ // ─── stats command ───
242
+ program
243
+ .command('stats')
244
+ .description('Show aggregate trading statistics (win rate, avg PnL, best/worst setups)')
245
+ .option('--period <period>', 'Time period (e.g., 7d, 30d, 90d)', '30d')
246
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
247
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
248
+ .action(async (options) => {
249
+ const client = createNeo4jClient();
250
+ try {
251
+ await client.connect();
252
+ // Parse period into start time
253
+ const periodMs = parsePeriod(options.period);
254
+ const startTime = periodMs > 0
255
+ ? new Date(Date.now() - periodMs)
256
+ : undefined;
257
+ const summary = await getPerformanceSummary(client, options.trader, {
258
+ startTime,
259
+ });
260
+ if (options.format === 'json') {
261
+ // Convert Map to plain object for JSON serialization
262
+ const bySetupType = {};
263
+ for (const [key, value] of summary.bySetupType) {
264
+ bySetupType[key] = value;
265
+ }
266
+ console.log(JSON.stringify({ overall: summary.overall, bySetupType }, null, 2));
267
+ }
268
+ else {
269
+ // Overall stats
270
+ console.log(formatStatsOutput(summary.overall, `Last ${options.period}`));
271
+ // Setup type breakdown
272
+ if (summary.bySetupType.size > 0) {
273
+ console.log(formatSetupTypeStats(summary.bySetupType));
274
+ }
275
+ }
276
+ }
277
+ catch (error) {
278
+ const message = error instanceof Error ? error.message : String(error);
279
+ logger.error({ error: message }, 'Failed to fetch stats');
280
+ console.error(chalk.red(`Error: ${message}`));
281
+ const guidance = formatConnectionError(message);
282
+ if (guidance)
283
+ console.error(guidance);
284
+ process.exitCode = 1;
285
+ }
286
+ finally {
287
+ await client.disconnect();
288
+ }
289
+ });
290
+ }
291
+ // ─── Helpers ───
292
+ function padRight(str, len) {
293
+ return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
294
+ }
295
+ function parseIntOption(value) {
296
+ return parseInt(value, 10);
297
+ }
298
+ function formatShortDate(isoString) {
299
+ try {
300
+ return new Date(isoString).toISOString().slice(0, 10);
301
+ }
302
+ catch {
303
+ return isoString;
304
+ }
305
+ }
306
+ /**
307
+ * Parse a period string like "7d", "30d", "90d" into milliseconds.
308
+ */
309
+ export function parsePeriod(period) {
310
+ const match = period.match(/^(\d+)([dhm])$/);
311
+ if (!match) {
312
+ return 30 * 24 * 60 * 60 * 1000; // Default 30 days
313
+ }
314
+ const value = parseInt(match[1], 10);
315
+ const unit = match[2];
316
+ switch (unit) {
317
+ case 'd':
318
+ return value * 24 * 60 * 60 * 1000;
319
+ case 'h':
320
+ return value * 60 * 60 * 1000;
321
+ case 'm':
322
+ return value * 60 * 1000;
323
+ default:
324
+ return 30 * 24 * 60 * 60 * 1000;
325
+ }
326
+ }
327
+ //# sourceMappingURL=decisions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../src/commands/decisions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerEventsCommand(program: Command): void;
3
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/commands/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqM5D"}
@@ -0,0 +1,201 @@
1
+ import { getConfig, createLogger, EventType, Severity, } from '@trading-boy/core';
2
+ import { Neo4jClient, createEvent, createAffectsEdge, getEventsByType, getEventsByDateRange, } from '@trading-boy/graph-db';
3
+ import { formatConnectionError } from '../utils.js';
4
+ // ─── Logger ───
5
+ const logger = createLogger('cli-events');
6
+ // ─── Neo4j Client Factory ───
7
+ function createNeo4jClient() {
8
+ const config = getConfig();
9
+ return new Neo4jClient({
10
+ uri: config.NEO4J_URI,
11
+ username: config.NEO4J_USER,
12
+ password: config.NEO4J_PASSWORD,
13
+ });
14
+ }
15
+ // ─── Command Registration ───
16
+ export function registerEventsCommand(program) {
17
+ const events = program
18
+ .command('events')
19
+ .description('Event management commands');
20
+ // ─── events add ───
21
+ events
22
+ .command('add')
23
+ .description('Add a manual event')
24
+ .requiredOption('--type <type>', `Event type (${Object.values(EventType).join(', ')})`)
25
+ .requiredOption('--token <symbols...>', 'Token symbol(s) affected')
26
+ .requiredOption('--title <title>', 'Event title')
27
+ .option('--date <date>', 'Scheduled date (ISO 8601 format)')
28
+ .option('--description <desc>', 'Event description', '')
29
+ .option('--severity <severity>', `Severity (${Object.values(Severity).join(', ')})`, 'MEDIUM')
30
+ .option('--pct <pct>', 'Unlock percentage (for TOKEN_UNLOCK events)', parseFloat)
31
+ .option('--recipient <recipient>', 'Recipient type (for TOKEN_UNLOCK events)')
32
+ .option('--protocol <protocols...>', 'Protocol name(s) affected')
33
+ .option('--source-url <url>', 'Source URL')
34
+ .action(async (options) => {
35
+ // Validate event type
36
+ if (!Object.values(EventType).includes(options.type)) {
37
+ console.error(`Error: Invalid event type "${options.type}". Valid types: ${Object.values(EventType).join(', ')}`);
38
+ process.exitCode = 1;
39
+ return;
40
+ }
41
+ // Validate severity
42
+ if (!Object.values(Severity).includes(options.severity)) {
43
+ console.error(`Error: Invalid severity "${options.severity}". Valid values: ${Object.values(Severity).join(', ')}`);
44
+ process.exitCode = 1;
45
+ return;
46
+ }
47
+ const client = createNeo4jClient();
48
+ try {
49
+ await client.connect();
50
+ const tokens = options.token.map((t) => t.toUpperCase());
51
+ // Build metadata from optional fields
52
+ const metadata = {};
53
+ if (options.pct !== undefined) {
54
+ metadata.unlockPct = options.pct;
55
+ }
56
+ if (options.recipient) {
57
+ metadata.recipient = options.recipient;
58
+ }
59
+ const input = {
60
+ type: options.type,
61
+ title: options.title,
62
+ description: options.description,
63
+ scheduledDate: options.date ?? null,
64
+ occurredDate: null,
65
+ severity: options.severity,
66
+ tokensAffected: tokens,
67
+ sourceUrl: options.sourceUrl ?? null,
68
+ metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
69
+ };
70
+ const { id } = await createEvent(client, input);
71
+ // Create AFFECTS edges to tokens
72
+ for (const tokenSymbol of tokens) {
73
+ try {
74
+ await createAffectsEdge(client, {
75
+ eventId: id,
76
+ targetLabel: 'Token',
77
+ targetKey: tokenSymbol,
78
+ });
79
+ }
80
+ catch {
81
+ logger.warn({ tokenSymbol }, 'Token not found in graph, skipping AFFECTS edge');
82
+ }
83
+ }
84
+ // Create AFFECTS edges to protocols
85
+ if (options.protocol) {
86
+ for (const protocolName of options.protocol) {
87
+ try {
88
+ await createAffectsEdge(client, {
89
+ eventId: id,
90
+ targetLabel: 'Protocol',
91
+ targetKey: protocolName,
92
+ });
93
+ }
94
+ catch {
95
+ logger.warn({ protocolName }, 'Protocol not found in graph, skipping AFFECTS edge');
96
+ }
97
+ }
98
+ }
99
+ logger.info({ id }, 'Event created');
100
+ console.log(`Event created: id=${id}`);
101
+ console.log(` Type: ${options.type}`);
102
+ console.log(` Title: ${options.title}`);
103
+ console.log(` Tokens: ${tokens.join(', ')}`);
104
+ if (options.date) {
105
+ console.log(` Scheduled: ${options.date}`);
106
+ }
107
+ }
108
+ catch (error) {
109
+ const message = error instanceof Error ? error.message : String(error);
110
+ logger.error({ error: message }, 'Failed to add event');
111
+ console.error(`Error: ${message}`);
112
+ const guidance = formatConnectionError(message);
113
+ if (guidance)
114
+ console.error(guidance);
115
+ process.exitCode = 1;
116
+ }
117
+ finally {
118
+ await client.disconnect();
119
+ }
120
+ });
121
+ // ─── events list ───
122
+ events
123
+ .command('list')
124
+ .description('List events')
125
+ .option('--type <type>', 'Filter by event type')
126
+ .option('--from <date>', 'Start date (ISO 8601)')
127
+ .option('--to <date>', 'End date (ISO 8601)')
128
+ .option('--limit <n>', 'Maximum number of results', parseInt, 20)
129
+ .action(async (options) => {
130
+ const client = createNeo4jClient();
131
+ try {
132
+ await client.connect();
133
+ let records;
134
+ if (options.from && options.to) {
135
+ // Date range query
136
+ records = await getEventsByDateRange(client, options.from, options.to, { type: options.type, limit: options.limit });
137
+ }
138
+ else if (options.type) {
139
+ // Type query
140
+ records = await getEventsByType(client, options.type, { limit: options.limit });
141
+ }
142
+ else {
143
+ // Default: show all event types
144
+ // Use a far-range date query to get all events
145
+ records = await getEventsByDateRange(client, '2020-01-01T00:00:00Z', '2030-12-31T23:59:59Z', { limit: options.limit });
146
+ }
147
+ if (records.length === 0) {
148
+ console.log('No events found.');
149
+ return;
150
+ }
151
+ // Print formatted table
152
+ console.log('');
153
+ console.log(padRight('Type', 22) +
154
+ padRight('Title', 40) +
155
+ padRight('Severity', 10) +
156
+ padRight('Scheduled', 22) +
157
+ padRight('Tokens', 20));
158
+ console.log('-'.repeat(114));
159
+ for (const e of records) {
160
+ const date = e.scheduledDate
161
+ ? formatDate(e.scheduledDate)
162
+ : (e.occurredDate ? formatDate(e.occurredDate) + ' (occ)' : '-');
163
+ console.log(padRight(e.type, 22) +
164
+ padRight(truncate(e.title, 38), 40) +
165
+ padRight(e.severity, 10) +
166
+ padRight(date, 22) +
167
+ (e.tokensAffected ? e.tokensAffected.join(', ') : '-'));
168
+ }
169
+ console.log('');
170
+ console.log(`Total: ${records.length} event(s)`);
171
+ }
172
+ catch (error) {
173
+ const message = error instanceof Error ? error.message : String(error);
174
+ logger.error({ error: message }, 'Failed to list events');
175
+ console.error(`Error: ${message}`);
176
+ const guidance = formatConnectionError(message);
177
+ if (guidance)
178
+ console.error(guidance);
179
+ process.exitCode = 1;
180
+ }
181
+ finally {
182
+ await client.disconnect();
183
+ }
184
+ });
185
+ }
186
+ // ─── Helpers ───
187
+ function padRight(str, len) {
188
+ return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
189
+ }
190
+ function truncate(str, maxLen) {
191
+ return str.length > maxLen ? str.slice(0, maxLen - 3) + '...' : str;
192
+ }
193
+ function formatDate(isoString) {
194
+ try {
195
+ return new Date(isoString).toISOString().slice(0, 10);
196
+ }
197
+ catch {
198
+ return isoString;
199
+ }
200
+ }
201
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/commands/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Command } from 'commander';
2
+ interface ServiceHealthResult {
3
+ name: string;
4
+ healthy: boolean;
5
+ message: string;
6
+ details?: string;
7
+ }
8
+ export interface InfraStatusResult {
9
+ services: ServiceHealthResult[];
10
+ overallHealthy: boolean;
11
+ }
12
+ /**
13
+ * Check all infrastructure services and return a status report.
14
+ */
15
+ export declare function checkInfraStatus(): Promise<InfraStatusResult>;
16
+ /**
17
+ * Format the full infra status output.
18
+ */
19
+ export declare function formatInfraStatus(result: InfraStatusResult): string;
20
+ export declare function registerInfraCommand(program: Command): void;
21
+ export {};
22
+ //# sourceMappingURL=infra.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.d.ts","sourceRoot":"","sources":["../../src/commands/infra.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6FpC,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,cAAc,EAAE,OAAO,CAAC;CACzB;AA2ED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAWnE;AAWD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA6BnE;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB3D"}