@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,616 @@
1
+ import { Option } from 'commander';
2
+ import ioredis from 'ioredis';
3
+ const { Redis } = ioredis;
4
+ import { getConfig, createLogger, DecisionType, ActorType, PlanStatus, } from '@trading-boy/core';
5
+ import { Neo4jClient, createDecisionEvent, linkDecisionToToken, linkDecisionToTrader, linkEntryToExit, getDecisionChain, publishDecision, } from '@trading-boy/graph-db';
6
+ import { formatConnectionError } from '../utils.js';
7
+ import { buildPreState, buildDefaultPreState, createPlan, getPlan, executePlan, computeKellySizing, extractSetupStats, getStatsBySetupType, } from '@trading-boy/context-engine';
8
+ import { TimescaleClient } from '@trading-boy/timeseries-db';
9
+ import { registerReviewCommand } from './review.js';
10
+ // ─── Logger ───
11
+ const logger = createLogger('cli-journal');
12
+ // ─── Default Trader ───
13
+ const DEFAULT_TRADER_ID = 'default';
14
+ // ─── Neo4j Client Factory ───
15
+ function createNeo4jClient() {
16
+ const config = getConfig();
17
+ return new Neo4jClient({
18
+ uri: config.NEO4J_URI,
19
+ username: config.NEO4J_USER,
20
+ password: config.NEO4J_PASSWORD,
21
+ });
22
+ }
23
+ function createRedisClient() {
24
+ const config = getConfig();
25
+ return new Redis(config.REDIS_URL, {
26
+ password: config.REDIS_PASSWORD || undefined,
27
+ lazyConnect: true,
28
+ });
29
+ }
30
+ function createTimescaleClient() {
31
+ const config = getConfig();
32
+ return new TimescaleClient({
33
+ host: config.TIMESCALE_HOST,
34
+ port: config.TIMESCALE_PORT,
35
+ user: config.TIMESCALE_USER,
36
+ password: config.TIMESCALE_PASSWORD,
37
+ database: config.TIMESCALE_DB,
38
+ });
39
+ }
40
+ // ─── Command Registration ───
41
+ export function registerJournalCommand(program) {
42
+ const journal = program
43
+ .command('journal')
44
+ .description('Trade journaling commands');
45
+ // Register review subcommands
46
+ registerReviewCommand(journal);
47
+ const log = journal
48
+ .command('log')
49
+ .description('Log trade decisions')
50
+ .action(() => {
51
+ log.help();
52
+ });
53
+ // ─── journal log entry <symbol> ───
54
+ log
55
+ .command('entry <symbol>')
56
+ .description('Log a trade entry')
57
+ .option('--thesis <thesis>', 'The reasoning behind the trade')
58
+ .option('--setup <setup>', 'Setup type (BREAKOUT, MOMENTUM, etc.)')
59
+ .option('--direction <direction>', 'Trade direction (LONG, SHORT)')
60
+ .option('--price <price>', 'Entry price in USD', parseFloat)
61
+ .option('--size <size>', 'Position size in token units', parseFloat)
62
+ .option('--size-usd <sizeUsd>', 'Position size in USD', parseFloat)
63
+ .option('--emotion <emotion>', 'Emotional tag (CONVICTION, FOMO, etc.)')
64
+ .option('--confidence <confidence>', 'Confidence level (0-1)', parseFloat)
65
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
66
+ .option('--mint <mint>', 'Token mint address')
67
+ .option('--tx-hash <txHash>', 'Solana transaction signature')
68
+ .option('--triggers <triggers...>', 'What initiated the trade')
69
+ .option('--plan <planId>', 'Link to a pre-trade plan (auto-fills fields)')
70
+ .action(async (symbol, options) => {
71
+ // ─── Input validation ───
72
+ if (options.direction !== undefined && !['LONG', 'SHORT'].includes(options.direction.toUpperCase())) {
73
+ console.error('Error: --direction must be LONG or SHORT');
74
+ process.exitCode = 1;
75
+ return;
76
+ }
77
+ if (options.price !== undefined && (!Number.isFinite(options.price) || options.price <= 0)) {
78
+ console.error('Error: --price must be a positive number');
79
+ process.exitCode = 1;
80
+ return;
81
+ }
82
+ if (options.confidence !== undefined && (!Number.isFinite(options.confidence) || options.confidence < 0 || options.confidence > 1)) {
83
+ console.error('Error: --confidence must be a number between 0 and 1');
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+ const client = createNeo4jClient();
88
+ const redis = createRedisClient();
89
+ const tsClient = createTimescaleClient();
90
+ try {
91
+ await client.connect();
92
+ await redis.connect();
93
+ await tsClient.connect();
94
+ const tokenSymbol = symbol.toUpperCase();
95
+ // If --plan provided, look up the plan and auto-fill fields
96
+ let linkedPlan = null;
97
+ if (options.plan) {
98
+ linkedPlan = await getPlan(tsClient, options.plan);
99
+ if (!linkedPlan) {
100
+ console.error(`Error: Plan ${options.plan} not found`);
101
+ process.exitCode = 1;
102
+ return;
103
+ }
104
+ if (linkedPlan.status !== PlanStatus.DRAFT) {
105
+ console.error(`Error: Plan ${options.plan} is already ${linkedPlan.status}`);
106
+ process.exitCode = 1;
107
+ return;
108
+ }
109
+ logger.info({ planId: options.plan }, 'Auto-filling entry from plan');
110
+ }
111
+ // Build real pre-state (fallback to defaults on failure)
112
+ let preState;
113
+ try {
114
+ preState = await buildPreState({ tsClient, redis }, tokenSymbol);
115
+ }
116
+ catch {
117
+ preState = buildDefaultPreState();
118
+ }
119
+ const eventTime = new Date();
120
+ const input = {
121
+ traderId: options.trader,
122
+ decisionType: DecisionType.TRADE_ENTRY,
123
+ actor: ActorType.HUMAN,
124
+ tokenSymbol,
125
+ tokenMint: options.mint ?? '',
126
+ eventTime,
127
+ preState,
128
+ thesis: options.thesis ?? linkedPlan?.thesis,
129
+ setupType: (options.setup ?? linkedPlan?.setupType),
130
+ direction: (options.direction ?? linkedPlan?.direction),
131
+ entryPrice: options.price ?? linkedPlan?.entryTarget,
132
+ size: options.size,
133
+ sizeUsd: options.sizeUsd,
134
+ emotionalTag: (options.emotion ?? linkedPlan?.emotionalTag),
135
+ confidence: options.confidence ?? linkedPlan?.confidence,
136
+ triggers: options.triggers,
137
+ txHash: options.txHash,
138
+ };
139
+ const { id, hash } = await createDecisionEvent(client, input);
140
+ await linkDecisionToToken(client, id, tokenSymbol);
141
+ await linkDecisionToTrader(client, id, options.trader);
142
+ // Mark plan as executed
143
+ if (linkedPlan) {
144
+ await executePlan(tsClient, linkedPlan.id, id);
145
+ logger.info({ planId: linkedPlan.id, decisionId: id }, 'Plan executed');
146
+ }
147
+ // Publish to stream (fire-and-forget)
148
+ publishDecision(redis, {
149
+ decisionId: id,
150
+ traderId: options.trader,
151
+ decisionType: DecisionType.TRADE_ENTRY,
152
+ actor: ActorType.HUMAN,
153
+ tokenSymbol,
154
+ tokenMint: options.mint ?? '',
155
+ eventTime: eventTime.toISOString(),
156
+ preState,
157
+ thesis: options.thesis,
158
+ setupType: options.setup,
159
+ emotionalTag: options.emotion,
160
+ confidence: options.confidence,
161
+ direction: options.direction,
162
+ entryPrice: options.price,
163
+ size: options.size,
164
+ sizeUsd: options.sizeUsd,
165
+ txHash: options.txHash,
166
+ triggers: options.triggers,
167
+ }).catch((error) => {
168
+ logger.warn({ decisionId: id, error: error instanceof Error ? error.message : String(error) }, 'Failed to publish entry to stream (non-fatal)');
169
+ });
170
+ logger.info({ id, hash }, 'Entry logged');
171
+ console.log(`Entry logged: id=${id} hash=${hash}`);
172
+ }
173
+ catch (error) {
174
+ const message = error instanceof Error ? error.message : String(error);
175
+ logger.error({ error: message }, 'Failed to log entry');
176
+ console.error(`Error: ${message}`);
177
+ const guidance = formatConnectionError(message);
178
+ if (guidance)
179
+ console.error(guidance);
180
+ process.exitCode = 1;
181
+ }
182
+ finally {
183
+ await redis.quit().catch(() => { });
184
+ await tsClient.disconnect().catch(() => { });
185
+ await client.disconnect();
186
+ }
187
+ });
188
+ // ─── journal log exit <symbol> ───
189
+ log
190
+ .command('exit <symbol>')
191
+ .description('Log a trade exit')
192
+ .option('--price <price>', 'Exit price in USD', parseFloat)
193
+ .option('--link-entry <entryId>', 'ID of the entry DecisionEvent to link')
194
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
195
+ .option('--mint <mint>', 'Token mint address')
196
+ .option('--tx-hash <txHash>', 'Solana transaction signature')
197
+ .option('--thesis <thesis>', 'Exit reasoning')
198
+ .option('--size <size>', 'Position size in token units', parseFloat)
199
+ .option('--size-usd <sizeUsd>', 'Position size in USD', parseFloat)
200
+ .action(async (symbol, options) => {
201
+ const client = createNeo4jClient();
202
+ const redis = createRedisClient();
203
+ const tsClient = createTimescaleClient();
204
+ try {
205
+ await client.connect();
206
+ await redis.connect();
207
+ await tsClient.connect();
208
+ const tokenSymbol = symbol.toUpperCase();
209
+ // Build real pre-state (fallback to defaults on failure)
210
+ let preState;
211
+ try {
212
+ preState = await buildPreState({ tsClient, redis }, tokenSymbol);
213
+ }
214
+ catch {
215
+ preState = buildDefaultPreState();
216
+ }
217
+ const eventTime = new Date();
218
+ // Fetch entry for linking if provided
219
+ let entryRecord;
220
+ if (options.linkEntry) {
221
+ const chain = await getDecisionChain(client, options.trader, { tokenSymbol });
222
+ entryRecord = chain.find((d) => d.id === options.linkEntry);
223
+ }
224
+ const input = {
225
+ traderId: options.trader,
226
+ decisionType: DecisionType.TRADE_EXIT,
227
+ actor: ActorType.HUMAN,
228
+ tokenSymbol,
229
+ tokenMint: options.mint ?? '',
230
+ eventTime,
231
+ preState,
232
+ exitPrice: options.price,
233
+ thesis: options.thesis,
234
+ size: options.size,
235
+ sizeUsd: options.sizeUsd,
236
+ txHash: options.txHash,
237
+ linkedEntryId: options.linkEntry,
238
+ };
239
+ const { id, hash } = await createDecisionEvent(client, input);
240
+ await linkDecisionToToken(client, id, tokenSymbol);
241
+ await linkDecisionToTrader(client, id, options.trader);
242
+ // Link entry to exit via FOLLOWED_BY edge
243
+ if (options.linkEntry) {
244
+ await linkEntryToExit(client, options.linkEntry, id);
245
+ logger.debug({ entryId: options.linkEntry, exitId: id }, 'Linked entry to exit');
246
+ }
247
+ // Publish to stream (fire-and-forget)
248
+ const publishInput = {
249
+ decisionId: id,
250
+ traderId: options.trader,
251
+ decisionType: DecisionType.TRADE_EXIT,
252
+ actor: ActorType.HUMAN,
253
+ tokenSymbol,
254
+ tokenMint: options.mint ?? '',
255
+ eventTime: eventTime.toISOString(),
256
+ preState,
257
+ exitPrice: options.price,
258
+ thesis: options.thesis,
259
+ size: options.size,
260
+ sizeUsd: options.sizeUsd,
261
+ txHash: options.txHash,
262
+ linkedEntryId: options.linkEntry,
263
+ };
264
+ // Embed entry fields for PnL computation
265
+ if (entryRecord) {
266
+ publishInput.entryId = entryRecord.id;
267
+ publishInput.entryTokenMint = entryRecord.tokenMint;
268
+ publishInput.entryDirection = entryRecord.direction ?? undefined;
269
+ publishInput.entryEntryPrice = entryRecord.entryPrice ?? undefined;
270
+ publishInput.entrySizeUsd = entryRecord.sizeUsd ?? undefined;
271
+ publishInput.entryEventTime = entryRecord.eventTime;
272
+ publishInput.entryTraderId = options.trader;
273
+ publishInput.entrySetupType = entryRecord.setupType ?? undefined;
274
+ publishInput.entryEmotionalTag = entryRecord.emotionalTag ?? undefined;
275
+ }
276
+ publishDecision(redis, publishInput).catch((error) => {
277
+ logger.warn({ decisionId: id, error: error instanceof Error ? error.message : String(error) }, 'Failed to publish exit to stream (non-fatal)');
278
+ });
279
+ logger.info({ id, hash }, 'Exit logged');
280
+ console.log(`Exit logged: id=${id} hash=${hash}`);
281
+ }
282
+ catch (error) {
283
+ const message = error instanceof Error ? error.message : String(error);
284
+ logger.error({ error: message }, 'Failed to log exit');
285
+ console.error(`Error: ${message}`);
286
+ const guidance = formatConnectionError(message);
287
+ if (guidance)
288
+ console.error(guidance);
289
+ process.exitCode = 1;
290
+ }
291
+ finally {
292
+ await redis.quit().catch(() => { });
293
+ await tsClient.disconnect().catch(() => { });
294
+ await client.disconnect();
295
+ }
296
+ });
297
+ // ─── journal list ───
298
+ journal
299
+ .command('list')
300
+ .description('List recent trade decisions')
301
+ .option('--token <symbol>', 'Filter by token symbol')
302
+ .option('--limit <n>', 'Maximum number of results', parseInt, 10)
303
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
304
+ .action(async (options) => {
305
+ const client = createNeo4jClient();
306
+ try {
307
+ await client.connect();
308
+ const decisions = await getDecisionChain(client, options.trader, {
309
+ tokenSymbol: options.token,
310
+ limit: options.limit,
311
+ });
312
+ if (decisions.length === 0) {
313
+ console.log('No decisions found.');
314
+ return;
315
+ }
316
+ // Print formatted table
317
+ console.log('');
318
+ console.log(padRight('ID', 38) +
319
+ padRight('Type', 20) +
320
+ padRight('Token', 8) +
321
+ padRight('Direction', 10) +
322
+ padRight('Price', 12) +
323
+ padRight('Confidence', 12) +
324
+ padRight('Hash', 10));
325
+ console.log('-'.repeat(110));
326
+ for (const d of decisions) {
327
+ const price = d.entryPrice ?? d.exitPrice;
328
+ console.log(padRight(d.id, 38) +
329
+ padRight(d.decisionType, 20) +
330
+ padRight(d.tokenSymbol, 8) +
331
+ padRight(d.direction ?? '-', 10) +
332
+ padRight(price !== null ? price.toFixed(2) : '-', 12) +
333
+ padRight(d.confidence.toFixed(2), 12) +
334
+ (d.hash ? d.hash.slice(0, 8) + '...' : '-'));
335
+ }
336
+ console.log('');
337
+ console.log(`Total: ${decisions.length} decision(s)`);
338
+ }
339
+ catch (error) {
340
+ const message = error instanceof Error ? error.message : String(error);
341
+ logger.error({ error: message }, 'Failed to list decisions');
342
+ console.error(`Error: ${message}`);
343
+ const guidance = formatConnectionError(message);
344
+ if (guidance)
345
+ console.error(guidance);
346
+ process.exitCode = 1;
347
+ }
348
+ finally {
349
+ await client.disconnect();
350
+ }
351
+ });
352
+ // ─── journal plan <symbol> ───
353
+ journal
354
+ .command('plan <symbol>')
355
+ .description('Create a pre-trade plan before entry')
356
+ .requiredOption('--thesis <thesis>', 'The reasoning behind the trade')
357
+ .requiredOption('--setup <setup>', 'Setup type (BREAKOUT, MOMENTUM, etc.)')
358
+ .requiredOption('--direction <direction>', 'Trade direction (LONG, SHORT)')
359
+ .requiredOption('--entry-target <price>', 'Planned entry price', parseFloat)
360
+ .requiredOption('--invalidation <price>', 'Invalidation / stop-loss price', parseFloat)
361
+ .requiredOption('--take-profit <price>', 'Take-profit target price', parseFloat)
362
+ .option('--risk-percent <pct>', 'Percentage of portfolio to risk', parseFloat, 2)
363
+ .option('--confidence <confidence>', 'Confidence level (0-1)', parseFloat, 0.5)
364
+ .option('--emotion <emotion>', 'Emotional tag (CONVICTION, NEUTRAL, etc.)', 'NEUTRAL')
365
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
366
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
367
+ .action(async (symbol, options) => {
368
+ // Input validation
369
+ if (!['LONG', 'SHORT'].includes(options.direction.toUpperCase())) {
370
+ console.error('Error: --direction must be LONG or SHORT');
371
+ process.exitCode = 1;
372
+ return;
373
+ }
374
+ if (options.confidence < 0 || options.confidence > 1) {
375
+ console.error('Error: --confidence must be between 0 and 1');
376
+ process.exitCode = 1;
377
+ return;
378
+ }
379
+ if (options.riskPercent <= 0 || options.riskPercent > 100) {
380
+ console.error('Error: --risk-percent must be between 0 and 100');
381
+ process.exitCode = 1;
382
+ return;
383
+ }
384
+ // Price validation: all prices must be positive
385
+ if (options.entryTarget <= 0 || options.invalidation <= 0 || options.takeProfit <= 0) {
386
+ console.error('Error: --entry-target, --invalidation, and --take-profit must be positive numbers');
387
+ process.exitCode = 1;
388
+ return;
389
+ }
390
+ // Price ordering validation
391
+ const dir = options.direction.toUpperCase();
392
+ if (dir === 'LONG' && !(options.invalidation < options.entryTarget && options.entryTarget < options.takeProfit)) {
393
+ console.error('Error: LONG requires invalidation < entry-target < take-profit');
394
+ process.exitCode = 1;
395
+ return;
396
+ }
397
+ if (dir === 'SHORT' && !(options.takeProfit < options.entryTarget && options.entryTarget < options.invalidation)) {
398
+ console.error('Error: SHORT requires take-profit < entry-target < invalidation');
399
+ process.exitCode = 1;
400
+ return;
401
+ }
402
+ const client = createNeo4jClient();
403
+ const redis = createRedisClient();
404
+ const tsClient = createTimescaleClient();
405
+ try {
406
+ await client.connect();
407
+ await redis.connect();
408
+ await tsClient.connect();
409
+ const tokenSymbol = symbol.toUpperCase();
410
+ const direction = options.direction.toUpperCase();
411
+ // Build pre-state
412
+ let preState;
413
+ try {
414
+ preState = await buildPreState({ tsClient, redis }, tokenSymbol);
415
+ }
416
+ catch {
417
+ preState = buildDefaultPreState();
418
+ }
419
+ // Compute Kelly suggestion from historical setup stats
420
+ let kellySuggestion = null;
421
+ try {
422
+ const setupStats = await getStatsBySetupType(client, options.trader);
423
+ const setupKey = options.setup.toUpperCase();
424
+ const stats = setupStats.get(setupKey);
425
+ if (stats && stats.totalTrades > 0) {
426
+ // Need to get raw decisions for avg win/loss calculation
427
+ // Use extractSetupStats from Kelly module with the stats we have
428
+ const decisions = await getDecisionChain(client, options.trader, {
429
+ tokenSymbol: undefined,
430
+ limit: 500,
431
+ });
432
+ const setupDecisions = decisions.filter((d) => d.setupType === setupKey && d.pnlAbsolute !== null);
433
+ const kellyStats = extractSetupStats(setupDecisions);
434
+ const kellyResult = computeKellySizing(kellyStats, preState.portfolioValueUsd);
435
+ kellySuggestion = kellyResult.fractionalKelly;
436
+ }
437
+ }
438
+ catch {
439
+ // Non-fatal — proceed without Kelly
440
+ logger.debug('Could not compute Kelly suggestion');
441
+ }
442
+ const plan = await createPlan(tsClient, {
443
+ traderId: options.trader,
444
+ tokenSymbol,
445
+ direction,
446
+ thesis: options.thesis,
447
+ setupType: options.setup.toUpperCase(),
448
+ entryTarget: options.entryTarget,
449
+ invalidationPrice: options.invalidation,
450
+ takeProfitPrice: options.takeProfit,
451
+ riskPercent: options.riskPercent,
452
+ confidence: options.confidence,
453
+ emotionalTag: options.emotion.toUpperCase(),
454
+ preState,
455
+ kellySuggestion,
456
+ });
457
+ if (options.format === 'json') {
458
+ console.log(JSON.stringify({
459
+ id: plan.id,
460
+ tokenSymbol: plan.tokenSymbol,
461
+ direction: plan.direction,
462
+ setupType: plan.setupType,
463
+ thesis: plan.thesis,
464
+ entryTarget: plan.entryTarget,
465
+ invalidationPrice: plan.invalidationPrice,
466
+ takeProfitPrice: plan.takeProfitPrice,
467
+ riskRewardRatio: plan.riskRewardRatio,
468
+ riskPercent: plan.riskPercent,
469
+ confidence: plan.confidence,
470
+ kellySuggestion,
471
+ status: plan.status,
472
+ createdAt: plan.createdAt,
473
+ }, null, 2));
474
+ }
475
+ else {
476
+ console.log('');
477
+ console.log(`═══ Pre-Trade Plan Created ═══`);
478
+ console.log(`Plan ID: ${plan.id}`);
479
+ console.log(`Token: ${plan.tokenSymbol}`);
480
+ console.log(`Direction: ${plan.direction}`);
481
+ console.log(`Setup: ${plan.setupType}`);
482
+ console.log(`Thesis: ${plan.thesis}`);
483
+ console.log('');
484
+ console.log(`Entry Target: $${plan.entryTarget.toFixed(2)}`);
485
+ console.log(`Invalidation: $${plan.invalidationPrice.toFixed(2)}`);
486
+ console.log(`Take Profit: $${plan.takeProfitPrice.toFixed(2)}`);
487
+ console.log(`R:R Ratio: ${plan.riskRewardRatio.toFixed(2)}`);
488
+ console.log(`Risk: ${plan.riskPercent}% of portfolio`);
489
+ console.log(`Confidence: ${plan.confidence}`);
490
+ if (kellySuggestion !== null && kellySuggestion > 0) {
491
+ const posSize = preState.portfolioValueUsd * kellySuggestion;
492
+ console.log(`Kelly (Half): ${(kellySuggestion * 100).toFixed(1)}% → $${posSize.toFixed(0)}`);
493
+ }
494
+ console.log('');
495
+ console.log(`To execute: trading-boy journal log entry ${tokenSymbol} --plan ${plan.id}`);
496
+ }
497
+ }
498
+ catch (error) {
499
+ const message = error instanceof Error ? error.message : String(error);
500
+ logger.error({ error: message }, 'Failed to create plan');
501
+ console.error(`Error: ${message}`);
502
+ if (message.includes('pre_trade_plans') && message.includes('does not exist')) {
503
+ console.error('Hint: Run migrations to create the pre_trade_plans table:');
504
+ console.error(' pnpm --filter @trading-boy/timeseries-db migrate');
505
+ }
506
+ const guidance = formatConnectionError(message);
507
+ if (guidance)
508
+ console.error(guidance);
509
+ process.exitCode = 1;
510
+ }
511
+ finally {
512
+ await redis.quit().catch(() => { });
513
+ await tsClient.disconnect().catch(() => { });
514
+ await client.disconnect();
515
+ }
516
+ });
517
+ // ─── journal size ───
518
+ journal
519
+ .command('size')
520
+ .description('Kelly criterion position sizing recommendation')
521
+ .requiredOption('--setup <setup>', 'Setup type (BREAKOUT, MOMENTUM, etc.)')
522
+ .option('--capital <capital>', 'Portfolio capital in USD', parseFloat)
523
+ .option('--fraction <fraction>', 'Kelly fraction (default 0.5 = Half Kelly)', parseFloat, 0.5)
524
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
525
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
526
+ .action(async (options) => {
527
+ const client = createNeo4jClient();
528
+ const redis = createRedisClient();
529
+ const tsClient = createTimescaleClient();
530
+ try {
531
+ await client.connect();
532
+ await redis.connect();
533
+ await tsClient.connect();
534
+ const setupKey = options.setup.toUpperCase();
535
+ // Get capital from option or pre-state
536
+ let capitalUsd = options.capital;
537
+ if (!capitalUsd) {
538
+ try {
539
+ const preState = await buildPreState({ tsClient, redis }, 'SOL');
540
+ capitalUsd = preState.portfolioValueUsd;
541
+ }
542
+ catch {
543
+ capitalUsd = 10000; // fallback
544
+ }
545
+ }
546
+ // Get all decisions for this setup
547
+ const decisions = await getDecisionChain(client, options.trader, {
548
+ tokenSymbol: undefined,
549
+ limit: 500,
550
+ });
551
+ const setupDecisions = decisions.filter((d) => d.setupType === setupKey && d.pnlAbsolute !== null);
552
+ const stats = extractSetupStats(setupDecisions);
553
+ if (stats.totalTrades === 0) {
554
+ console.log(`No completed trades found for setup type: ${setupKey}`);
555
+ console.log('Kelly sizing requires historical trade data with outcomes.');
556
+ return;
557
+ }
558
+ const fullResult = computeKellySizing(stats, capitalUsd, 1.0);
559
+ const halfResult = computeKellySizing(stats, capitalUsd, 0.5);
560
+ const quarterResult = computeKellySizing(stats, capitalUsd, 0.25);
561
+ if (options.format === 'json') {
562
+ const payoffRatio = stats.avgLoss !== 0 ? stats.avgWin / Math.abs(stats.avgLoss) : 0;
563
+ console.log(JSON.stringify({
564
+ setupType: setupKey,
565
+ sampleSize: stats.totalTrades,
566
+ winRate: stats.winRate,
567
+ avgWin: stats.avgWin,
568
+ avgLoss: stats.avgLoss,
569
+ payoffRatio,
570
+ capitalUsd: capitalUsd,
571
+ fullKelly: { fraction: fullResult.fullKelly, positionSizeUsd: fullResult.positionSizeUsd },
572
+ halfKelly: { fraction: halfResult.fractionalKelly, positionSizeUsd: halfResult.positionSizeUsd },
573
+ quarterKelly: { fraction: quarterResult.fractionalKelly, positionSizeUsd: quarterResult.positionSizeUsd },
574
+ confidenceNote: halfResult.confidenceNote,
575
+ }, null, 2));
576
+ }
577
+ else {
578
+ console.log('');
579
+ console.log(`═══ Kelly Position Sizing — ${setupKey} ═══`);
580
+ console.log('');
581
+ console.log(`Based on last ${stats.totalTrades} ${setupKey} trades:`);
582
+ console.log(` Win Rate (p): ${(stats.winRate * 100).toFixed(1)}%`);
583
+ console.log(` Avg Win: $${stats.avgWin.toFixed(2)}`);
584
+ console.log(` Avg Loss: $${stats.avgLoss.toFixed(2)}`);
585
+ const payoffRatio = stats.avgLoss !== 0 ? stats.avgWin / Math.abs(stats.avgLoss) : 0;
586
+ console.log(` Payoff Ratio: ${payoffRatio.toFixed(2)}`);
587
+ console.log('');
588
+ console.log(` Full Kelly: ${(fullResult.fullKelly * 100).toFixed(1)}% of capital ($${fullResult.positionSizeUsd.toFixed(0)})`);
589
+ console.log(` Half Kelly: ${(halfResult.fractionalKelly * 100).toFixed(1)}% of capital ($${halfResult.positionSizeUsd.toFixed(0)}) ← RECOMMENDED`);
590
+ console.log(` Quarter Kelly: ${(quarterResult.fractionalKelly * 100).toFixed(1)}% of capital ($${quarterResult.positionSizeUsd.toFixed(0)})`);
591
+ console.log('');
592
+ console.log(` ${halfResult.confidenceNote}`);
593
+ console.log('');
594
+ }
595
+ }
596
+ catch (error) {
597
+ const message = error instanceof Error ? error.message : String(error);
598
+ logger.error({ error: message }, 'Failed to compute Kelly sizing');
599
+ console.error(`Error: ${message}`);
600
+ const guidance = formatConnectionError(message);
601
+ if (guidance)
602
+ console.error(guidance);
603
+ process.exitCode = 1;
604
+ }
605
+ finally {
606
+ await redis.quit().catch(() => { });
607
+ await tsClient.disconnect().catch(() => { });
608
+ await client.disconnect();
609
+ }
610
+ });
611
+ }
612
+ // ─── Helpers ───
613
+ function padRight(str, len) {
614
+ return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
615
+ }
616
+ //# sourceMappingURL=journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.js","sourceRoot":"","sources":["../../src/commands/journal.ts"],"names":[],"mappings":"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"}