@tradingboy/cli 0.3.8

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 (142) hide show
  1. package/README.md +8 -0
  2. package/dist/api-client.d.ts +35 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +165 -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 +143 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/audit.d.ts +18 -0
  11. package/dist/commands/audit.d.ts.map +1 -0
  12. package/dist/commands/audit.js +73 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/behavioral.d.ts +73 -0
  15. package/dist/commands/behavioral.d.ts.map +1 -0
  16. package/dist/commands/behavioral.js +349 -0
  17. package/dist/commands/behavioral.js.map +1 -0
  18. package/dist/commands/benchmark-cmd.d.ts +3 -0
  19. package/dist/commands/benchmark-cmd.d.ts.map +1 -0
  20. package/dist/commands/benchmark-cmd.js +196 -0
  21. package/dist/commands/benchmark-cmd.js.map +1 -0
  22. package/dist/commands/billing.d.ts +12 -0
  23. package/dist/commands/billing.d.ts.map +1 -0
  24. package/dist/commands/billing.js +117 -0
  25. package/dist/commands/billing.js.map +1 -0
  26. package/dist/commands/catalysts.d.ts +17 -0
  27. package/dist/commands/catalysts.d.ts.map +1 -0
  28. package/dist/commands/catalysts.js +151 -0
  29. package/dist/commands/catalysts.js.map +1 -0
  30. package/dist/commands/coaching-cmd.d.ts +16 -0
  31. package/dist/commands/coaching-cmd.d.ts.map +1 -0
  32. package/dist/commands/coaching-cmd.js +231 -0
  33. package/dist/commands/coaching-cmd.js.map +1 -0
  34. package/dist/commands/config-cmd.d.ts +30 -0
  35. package/dist/commands/config-cmd.d.ts.map +1 -0
  36. package/dist/commands/config-cmd.js +378 -0
  37. package/dist/commands/config-cmd.js.map +1 -0
  38. package/dist/commands/context.d.ts +41 -0
  39. package/dist/commands/context.d.ts.map +1 -0
  40. package/dist/commands/context.js +391 -0
  41. package/dist/commands/context.js.map +1 -0
  42. package/dist/commands/decisions.d.ts +57 -0
  43. package/dist/commands/decisions.d.ts.map +1 -0
  44. package/dist/commands/decisions.js +352 -0
  45. package/dist/commands/decisions.js.map +1 -0
  46. package/dist/commands/edge-cmd.d.ts +78 -0
  47. package/dist/commands/edge-cmd.d.ts.map +1 -0
  48. package/dist/commands/edge-cmd.js +185 -0
  49. package/dist/commands/edge-cmd.js.map +1 -0
  50. package/dist/commands/edge-guard-cmd.d.ts +36 -0
  51. package/dist/commands/edge-guard-cmd.d.ts.map +1 -0
  52. package/dist/commands/edge-guard-cmd.js +174 -0
  53. package/dist/commands/edge-guard-cmd.js.map +1 -0
  54. package/dist/commands/events.d.ts +3 -0
  55. package/dist/commands/events.d.ts.map +1 -0
  56. package/dist/commands/events.js +117 -0
  57. package/dist/commands/events.js.map +1 -0
  58. package/dist/commands/infra.d.ts +20 -0
  59. package/dist/commands/infra.d.ts.map +1 -0
  60. package/dist/commands/infra.js +130 -0
  61. package/dist/commands/infra.js.map +1 -0
  62. package/dist/commands/journal.d.ts +3 -0
  63. package/dist/commands/journal.d.ts.map +1 -0
  64. package/dist/commands/journal.js +281 -0
  65. package/dist/commands/journal.js.map +1 -0
  66. package/dist/commands/login.d.ts +18 -0
  67. package/dist/commands/login.d.ts.map +1 -0
  68. package/dist/commands/login.js +121 -0
  69. package/dist/commands/login.js.map +1 -0
  70. package/dist/commands/logout.d.ts +7 -0
  71. package/dist/commands/logout.d.ts.map +1 -0
  72. package/dist/commands/logout.js +39 -0
  73. package/dist/commands/logout.js.map +1 -0
  74. package/dist/commands/narratives.d.ts +3 -0
  75. package/dist/commands/narratives.d.ts.map +1 -0
  76. package/dist/commands/narratives.js +259 -0
  77. package/dist/commands/narratives.js.map +1 -0
  78. package/dist/commands/onboarding.d.ts +7 -0
  79. package/dist/commands/onboarding.d.ts.map +1 -0
  80. package/dist/commands/onboarding.js +126 -0
  81. package/dist/commands/onboarding.js.map +1 -0
  82. package/dist/commands/query.d.ts +32 -0
  83. package/dist/commands/query.d.ts.map +1 -0
  84. package/dist/commands/query.js +132 -0
  85. package/dist/commands/query.js.map +1 -0
  86. package/dist/commands/replay-cmd.d.ts +43 -0
  87. package/dist/commands/replay-cmd.d.ts.map +1 -0
  88. package/dist/commands/replay-cmd.js +215 -0
  89. package/dist/commands/replay-cmd.js.map +1 -0
  90. package/dist/commands/review.d.ts +3 -0
  91. package/dist/commands/review.d.ts.map +1 -0
  92. package/dist/commands/review.js +443 -0
  93. package/dist/commands/review.js.map +1 -0
  94. package/dist/commands/risk.d.ts +47 -0
  95. package/dist/commands/risk.d.ts.map +1 -0
  96. package/dist/commands/risk.js +156 -0
  97. package/dist/commands/risk.js.map +1 -0
  98. package/dist/commands/social.d.ts +43 -0
  99. package/dist/commands/social.d.ts.map +1 -0
  100. package/dist/commands/social.js +318 -0
  101. package/dist/commands/social.js.map +1 -0
  102. package/dist/commands/strategy-cmd.d.ts +44 -0
  103. package/dist/commands/strategy-cmd.d.ts.map +1 -0
  104. package/dist/commands/strategy-cmd.js +367 -0
  105. package/dist/commands/strategy-cmd.js.map +1 -0
  106. package/dist/commands/subscribe.d.ts +72 -0
  107. package/dist/commands/subscribe.d.ts.map +1 -0
  108. package/dist/commands/subscribe.js +480 -0
  109. package/dist/commands/subscribe.js.map +1 -0
  110. package/dist/commands/suggestions-cmd.d.ts +24 -0
  111. package/dist/commands/suggestions-cmd.d.ts.map +1 -0
  112. package/dist/commands/suggestions-cmd.js +142 -0
  113. package/dist/commands/suggestions-cmd.js.map +1 -0
  114. package/dist/commands/thesis-cmd.d.ts +3 -0
  115. package/dist/commands/thesis-cmd.d.ts.map +1 -0
  116. package/dist/commands/thesis-cmd.js +132 -0
  117. package/dist/commands/thesis-cmd.js.map +1 -0
  118. package/dist/commands/trader.d.ts +29 -0
  119. package/dist/commands/trader.d.ts.map +1 -0
  120. package/dist/commands/trader.js +292 -0
  121. package/dist/commands/trader.js.map +1 -0
  122. package/dist/commands/watch.d.ts +16 -0
  123. package/dist/commands/watch.d.ts.map +1 -0
  124. package/dist/commands/watch.js +88 -0
  125. package/dist/commands/watch.js.map +1 -0
  126. package/dist/commands/whoami.d.ts +14 -0
  127. package/dist/commands/whoami.d.ts.map +1 -0
  128. package/dist/commands/whoami.js +89 -0
  129. package/dist/commands/whoami.js.map +1 -0
  130. package/dist/credentials.d.ts +18 -0
  131. package/dist/credentials.d.ts.map +1 -0
  132. package/dist/credentials.js +168 -0
  133. package/dist/credentials.js.map +1 -0
  134. package/dist/index.d.ts +33 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +28 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/utils.d.ts +51 -0
  139. package/dist/utils.d.ts.map +1 -0
  140. package/dist/utils.js +118 -0
  141. package/dist/utils.js.map +1 -0
  142. package/package.json +38 -0
@@ -0,0 +1,281 @@
1
+ import { Option } from 'commander';
2
+ import { padRight } from '../utils.js';
3
+ import { apiRequest, ApiError } from '../api-client.js';
4
+ import { registerReviewCommand } from './review.js';
5
+ // ─── Default Trader ───
6
+ const DEFAULT_TRADER_ID = 'default';
7
+ // ─── Command Registration ───
8
+ export function registerJournalCommand(program) {
9
+ const journal = program
10
+ .command('journal')
11
+ .description('Trade journaling commands');
12
+ // Register review subcommands
13
+ registerReviewCommand(journal);
14
+ const log = journal
15
+ .command('log')
16
+ .description('Log trade decisions')
17
+ .action(() => {
18
+ log.help();
19
+ });
20
+ // ─── journal log entry <symbol> ───
21
+ log
22
+ .command('entry <symbol>')
23
+ .description('Log a trade entry')
24
+ .option('--thesis <thesis>', 'The reasoning behind the trade')
25
+ .option('--setup <setup>', 'Setup type (BREAKOUT, MOMENTUM, etc.)')
26
+ .option('--direction <direction>', 'Trade direction (LONG, SHORT)')
27
+ .option('--price <price>', 'Entry price in USD', parseFloat)
28
+ .option('--size <size>', 'Position size in token units', parseFloat)
29
+ .option('--size-usd <sizeUsd>', 'Position size in USD', parseFloat)
30
+ .option('--emotion <emotion>', 'Emotional tag (CONVICTION, FOMO, REVENGE, IMPULSE, FEAR, GREED, NEUTRAL)')
31
+ .option('--confidence <confidence>', 'Confidence level (0-1)', parseFloat)
32
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
33
+ .option('--mint <mint>', 'Token mint address')
34
+ .option('--tx-hash <txHash>', 'Solana transaction signature')
35
+ .option('--triggers <triggers...>', 'What initiated the trade')
36
+ .option('--plan <planId>', 'Link to a pre-trade plan (auto-fills fields)')
37
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
38
+ .action(async (symbol, options) => {
39
+ // ─── Input validation ───
40
+ if (options.direction !== undefined && !['LONG', 'SHORT'].includes(options.direction.toUpperCase())) {
41
+ console.error('Error: --direction must be LONG or SHORT');
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ if (options.price !== undefined && (!Number.isFinite(options.price) || options.price <= 0)) {
46
+ console.error('Error: --price must be a positive number');
47
+ process.exitCode = 1;
48
+ return;
49
+ }
50
+ if (options.confidence !== undefined && (!Number.isFinite(options.confidence) || options.confidence < 0 || options.confidence > 1)) {
51
+ console.error('Error: --confidence must be a number between 0 and 1');
52
+ process.exitCode = 1;
53
+ return;
54
+ }
55
+ try {
56
+ const result = await apiRequest('/api/v1/decisions', {
57
+ method: 'POST',
58
+ body: {
59
+ traderId: options.trader,
60
+ decisionType: 'TRADE_ENTRY',
61
+ tokenSymbol: symbol.toUpperCase(),
62
+ ...(options.mint ? { tokenMint: options.mint } : {}),
63
+ direction: options.direction?.toUpperCase(),
64
+ entryPrice: options.price,
65
+ size: options.size,
66
+ sizeUsd: options.sizeUsd ?? (options.size && options.price ? options.size * options.price : undefined),
67
+ thesis: options.thesis,
68
+ setupType: options.setup,
69
+ emotionalTag: options.emotion,
70
+ confidence: options.confidence,
71
+ triggers: options.triggers,
72
+ txHash: options.txHash,
73
+ },
74
+ });
75
+ if (options.format === 'json') {
76
+ console.log(JSON.stringify(result, null, 2));
77
+ return;
78
+ }
79
+ console.log(`Entry logged: id=${result.id} hash=${result.hash}`);
80
+ }
81
+ catch (error) {
82
+ const message = error instanceof ApiError ? error.message : (error instanceof Error ? error.message : String(error));
83
+ console.error(`Error: ${message}`);
84
+ if (error instanceof ApiError && error.body && typeof error.body === 'object') {
85
+ const detail = error.body.error ?? error.body.code;
86
+ if (detail)
87
+ console.error(`Detail: ${detail}`);
88
+ }
89
+ process.exitCode = error instanceof ApiError ? 2 : 1;
90
+ }
91
+ });
92
+ // ─── journal log exit <symbol> ───
93
+ log
94
+ .command('exit <symbol>')
95
+ .description('Log a trade exit')
96
+ .option('--price <price>', 'Exit price in USD', parseFloat)
97
+ .option('--link-entry <entryId>', 'ID of the entry DecisionEvent to link')
98
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
99
+ .option('--mint <mint>', 'Token mint address')
100
+ .option('--tx-hash <txHash>', 'Solana transaction signature')
101
+ .option('--thesis <thesis>', 'Exit reasoning')
102
+ .option('--size <size>', 'Position size in token units', parseFloat)
103
+ .option('--size-usd <sizeUsd>', 'Position size in USD', parseFloat)
104
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
105
+ .action(async (symbol, options) => {
106
+ try {
107
+ const result = await apiRequest('/api/v1/decisions', {
108
+ method: 'POST',
109
+ body: {
110
+ traderId: options.trader,
111
+ decisionType: 'TRADE_EXIT',
112
+ tokenSymbol: symbol.toUpperCase(),
113
+ ...(options.mint ? { tokenMint: options.mint } : {}),
114
+ exitPrice: options.price,
115
+ thesis: options.thesis,
116
+ size: options.size,
117
+ sizeUsd: options.sizeUsd ?? (options.size && options.price ? options.size * options.price : undefined),
118
+ txHash: options.txHash,
119
+ linkedEntryId: options.linkEntry,
120
+ },
121
+ });
122
+ if (options.format === 'json') {
123
+ console.log(JSON.stringify(result, null, 2));
124
+ return;
125
+ }
126
+ console.log(`Exit logged: id=${result.id} hash=${result.hash}`);
127
+ }
128
+ catch (error) {
129
+ const message = error instanceof ApiError ? error.message : (error instanceof Error ? error.message : String(error));
130
+ console.error(`Error: ${message}`);
131
+ if (error instanceof ApiError && error.body && typeof error.body === 'object') {
132
+ const detail = error.body.error ?? error.body.code;
133
+ if (detail)
134
+ console.error(`Detail: ${detail}`);
135
+ }
136
+ process.exitCode = error instanceof ApiError ? 2 : 1;
137
+ }
138
+ });
139
+ // ─── journal list ───
140
+ journal
141
+ .command('list')
142
+ .description('List recent trade decisions')
143
+ .option('--token <symbol>', 'Filter by token symbol')
144
+ .option('--limit <n>', 'Maximum number of results', parseInt, 10)
145
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
146
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
147
+ .action(async (options) => {
148
+ try {
149
+ const params = new URLSearchParams();
150
+ if (options.trader)
151
+ params.set('traderId', options.trader);
152
+ if (options.token)
153
+ params.set('tokenSymbol', options.token.toUpperCase());
154
+ if (options.limit)
155
+ params.set('limit', String(options.limit));
156
+ const qs = params.toString() ? `?${params.toString()}` : '';
157
+ const result = await apiRequest(`/api/v1/decisions${qs}`);
158
+ const decisions = result.decisions ?? [];
159
+ if (decisions.length === 0) {
160
+ if (options.format === 'json') {
161
+ console.log(JSON.stringify({ decisions: [] }, null, 2));
162
+ }
163
+ else {
164
+ console.log('No decisions found.');
165
+ }
166
+ return;
167
+ }
168
+ if (options.format === 'json') {
169
+ console.log(JSON.stringify(result, null, 2));
170
+ return;
171
+ }
172
+ // Print formatted table
173
+ console.log('');
174
+ console.log(padRight('ID', 38) +
175
+ padRight('Type', 20) +
176
+ padRight('Token', 8) +
177
+ padRight('Direction', 10) +
178
+ padRight('Price', 12) +
179
+ padRight('Confidence', 12) +
180
+ padRight('Hash', 10));
181
+ console.log('-'.repeat(110));
182
+ for (const d of decisions) {
183
+ const price = (d.entryPrice ?? d.exitPrice);
184
+ console.log(padRight(String(d.id ?? ''), 38) +
185
+ padRight(String(d.decisionType ?? ''), 20) +
186
+ padRight(String(d.tokenSymbol ?? ''), 8) +
187
+ padRight(String(d.direction ?? '-'), 10) +
188
+ padRight(price !== null && price !== undefined ? Number(price).toFixed(2) : '-', 12) +
189
+ padRight(d.confidence !== null && d.confidence !== undefined ? Number(d.confidence).toFixed(2) : '-', 12) +
190
+ (d.hash ? String(d.hash).slice(0, 8) + '...' : '-'));
191
+ }
192
+ console.log('');
193
+ console.log(`Total: ${decisions.length} decision(s)`);
194
+ }
195
+ catch (error) {
196
+ const message = error instanceof ApiError ? error.message : (error instanceof Error ? error.message : String(error));
197
+ console.error(`Error: ${message}`);
198
+ if (error instanceof ApiError && error.body && typeof error.body === 'object') {
199
+ const detail = error.body.error ?? error.body.code;
200
+ if (detail)
201
+ console.error(`Detail: ${detail}`);
202
+ }
203
+ process.exitCode = error instanceof ApiError ? 2 : 1;
204
+ }
205
+ });
206
+ // ─── journal plan ───
207
+ journal
208
+ .command('plan')
209
+ .description('List pre-trade plans')
210
+ .option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
211
+ .option('--token <symbol>', 'Filter by token symbol')
212
+ .option('--status <status>', 'Filter by status: PENDING, EXECUTED, CANCELLED, EXPIRED')
213
+ .option('--limit <n>', 'Maximum results', parseInt, 50)
214
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
215
+ .action(async (options) => {
216
+ try {
217
+ const params = new URLSearchParams();
218
+ params.set('traderId', options.trader);
219
+ if (options.token)
220
+ params.set('tokenSymbol', options.token);
221
+ if (options.status)
222
+ params.set('status', options.status);
223
+ params.set('limit', String(options.limit));
224
+ const data = await apiRequest(`/api/v1/journal/plan?${params.toString()}`);
225
+ if (options.format === 'json') {
226
+ console.log(JSON.stringify(data, null, 2));
227
+ }
228
+ else {
229
+ if (data.plans.length === 0) {
230
+ console.log(' No pre-trade plans found.');
231
+ }
232
+ else {
233
+ console.log(`\n Pre-Trade Plans (${data.count}):\n`);
234
+ for (const plan of data.plans) {
235
+ console.log(` ${padRight(String(plan.id ?? ''), 14)} ${padRight(String(plan.tokenSymbol ?? ''), 8)} ${padRight(String(plan.status ?? ''), 12)} ${plan.direction ?? ''}`);
236
+ }
237
+ console.log('');
238
+ }
239
+ }
240
+ }
241
+ catch (error) {
242
+ const message = error instanceof ApiError ? error.message : (error instanceof Error ? error.message : String(error));
243
+ console.error(`Error: ${message}`);
244
+ process.exitCode = error instanceof ApiError ? 2 : 1;
245
+ }
246
+ });
247
+ // ─── journal size ───
248
+ journal
249
+ .command('size')
250
+ .description('Kelly criterion position sizing recommendation')
251
+ .requiredOption('--trader <traderId>', 'Trader ID')
252
+ .option('--capital <usd>', 'Portfolio capital in USD', parseFloat, 10000)
253
+ .option('--fraction <f>', 'Kelly fraction (0-1, default 0.5 = Half Kelly)', parseFloat, 0.5)
254
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
255
+ .action(async (options) => {
256
+ try {
257
+ const params = new URLSearchParams();
258
+ params.set('traderId', options.trader);
259
+ params.set('capitalUsd', String(options.capital));
260
+ params.set('fraction', String(options.fraction));
261
+ const data = await apiRequest(`/api/v1/journal/size?${params.toString()}`);
262
+ if (options.format === 'json') {
263
+ console.log(JSON.stringify(data, null, 2));
264
+ }
265
+ else {
266
+ console.log('\n Kelly Position Sizing:\n');
267
+ for (const [key, value] of Object.entries(data)) {
268
+ console.log(` ${padRight(key, 24)} ${value}`);
269
+ }
270
+ console.log('');
271
+ }
272
+ }
273
+ catch (error) {
274
+ const message = error instanceof ApiError ? error.message : (error instanceof Error ? error.message : String(error));
275
+ console.error(`Error: ${message}`);
276
+ process.exitCode = error instanceof ApiError ? 2 : 1;
277
+ }
278
+ });
279
+ }
280
+ // PlanOptions and SizeOptions removed — commands hidden until API endpoints exist
281
+ //# 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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"}
@@ -0,0 +1,18 @@
1
+ import { Command } from 'commander';
2
+ interface VerifyResponse {
3
+ valid: boolean;
4
+ email?: string;
5
+ plan?: string;
6
+ keyId?: string;
7
+ }
8
+ export declare function validateApiKeyFormat(key: string): boolean;
9
+ export declare function verifyApiKey(apiKey: string): Promise<VerifyResponse>;
10
+ export declare function executeLogin(apiKey: string): Promise<{
11
+ success: boolean;
12
+ email?: string;
13
+ plan?: string;
14
+ keyId?: string;
15
+ }>;
16
+ export declare function registerLoginCommand(program: Command): void;
17
+ export {};
18
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,UAAU,cAAc;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEzD;AAID,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB1E;AAID,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB/H;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwE3D"}
@@ -0,0 +1,121 @@
1
+ import chalk from 'chalk';
2
+ import { createLogger } from '@trading-boy/core';
3
+ import { storeCredentials, redactApiKey } from '../credentials.js';
4
+ import { getApiBase } from '../api-client.js';
5
+ const logger = createLogger('cli-login');
6
+ // ─── API Key Validation ───
7
+ const API_KEY_PATTERN = /^tb_(live|test)_[a-f0-9]{32}$/;
8
+ export function validateApiKeyFormat(key) {
9
+ return API_KEY_PATTERN.test(key);
10
+ }
11
+ // ─── Key Verification ───
12
+ export async function verifyApiKey(apiKey) {
13
+ const apiBase = getApiBase();
14
+ const response = await fetch(`${apiBase}/api/v1/auth/verify`, {
15
+ method: 'POST',
16
+ headers: { 'Content-Type': 'application/json' },
17
+ body: JSON.stringify({ apiKey }),
18
+ });
19
+ if (!response.ok) {
20
+ if (response.status === 401) {
21
+ return { valid: false };
22
+ }
23
+ throw new Error(`Verification failed: ${response.status}`);
24
+ }
25
+ return (await response.json());
26
+ }
27
+ // ─── Login Logic ───
28
+ export async function executeLogin(apiKey) {
29
+ // Validate format
30
+ if (!validateApiKeyFormat(apiKey)) {
31
+ return { success: false };
32
+ }
33
+ // Verify with API
34
+ const result = await verifyApiKey(apiKey);
35
+ if (!result.valid) {
36
+ return { success: false };
37
+ }
38
+ // Store credentials
39
+ await storeCredentials(apiKey, {
40
+ keyId: result.keyId,
41
+ email: result.email,
42
+ plan: result.plan,
43
+ });
44
+ return {
45
+ success: true,
46
+ email: result.email,
47
+ plan: result.plan,
48
+ keyId: result.keyId,
49
+ };
50
+ }
51
+ // ─── Command Registration ───
52
+ export function registerLoginCommand(program) {
53
+ program
54
+ .command('login')
55
+ .description('Authenticate with your Trading Boy API key')
56
+ .option('--api-key <key>', 'API key for CI/CD (prefer TRADING_BOY_API_KEY env var to avoid shell history exposure)')
57
+ .action(async (opts) => {
58
+ try {
59
+ let apiKey;
60
+ if (opts.apiKey) {
61
+ // Non-interactive mode
62
+ apiKey = opts.apiKey;
63
+ }
64
+ else {
65
+ // Interactive mode — dynamic import to avoid loading inquirer for non-interactive use
66
+ const { password } = await import('@inquirer/prompts');
67
+ console.log('');
68
+ console.log(chalk.bold(' Trading Boy — Login'));
69
+ console.log(chalk.gray(' ' + '─'.repeat(40)));
70
+ console.log('');
71
+ apiKey = await password({
72
+ message: 'Enter your API key',
73
+ mask: '*',
74
+ validate: (input) => {
75
+ if (!input)
76
+ return 'API key is required';
77
+ if (!validateApiKeyFormat(input)) {
78
+ return 'Invalid key format. Expected: tb_live_<32hex> or tb_test_<32hex>';
79
+ }
80
+ return true;
81
+ },
82
+ });
83
+ }
84
+ // Validate format before making network request
85
+ if (!validateApiKeyFormat(apiKey)) {
86
+ console.error(chalk.red(' Invalid key format. Expected: tb_live_<32hex> or tb_test_<32hex>'));
87
+ process.exitCode = 1;
88
+ return;
89
+ }
90
+ // Verify with spinner (silent when piped)
91
+ const { createSpinner } = await import('../utils.js');
92
+ const spinner = (await createSpinner(' Verifying key...')).start();
93
+ const result = await executeLogin(apiKey);
94
+ if (!result.success) {
95
+ spinner.fail(' Invalid API key');
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ spinner.succeed(' Authenticated successfully');
100
+ console.log('');
101
+ if (result.email) {
102
+ console.log(` ${chalk.gray('Account:')} ${result.email}`);
103
+ }
104
+ if (result.plan) {
105
+ console.log(` ${chalk.gray('Plan:')} ${result.plan}`);
106
+ }
107
+ if (result.keyId) {
108
+ console.log(` ${chalk.gray('Key ID:')} ${result.keyId}`);
109
+ }
110
+ console.log(` ${chalk.gray('Key:')} ${redactApiKey(apiKey)}`);
111
+ console.log('');
112
+ }
113
+ catch (error) {
114
+ const message = error instanceof Error ? error.message : String(error);
115
+ logger.error({ error: message }, 'Login failed');
116
+ console.error(chalk.red(` Error: ${message}`));
117
+ process.exitCode = 1;
118
+ }
119
+ });
120
+ }
121
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from 'commander';
2
+ export declare function executeLogout(): Promise<{
3
+ wasAuthenticated: boolean;
4
+ redactedKey?: string;
5
+ }>;
6
+ export declare function registerLogoutCommand(program: Command): void;
7
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAAE,gBAAgB,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAQlG;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuB5D"}
@@ -0,0 +1,39 @@
1
+ import chalk from 'chalk';
2
+ import { createLogger } from '@trading-boy/core';
3
+ import { clearCredentials, loadCredentials, redactApiKey } from '../credentials.js';
4
+ const logger = createLogger('cli-logout');
5
+ // ─── Logout Logic ───
6
+ export async function executeLogout() {
7
+ const existing = await loadCredentials();
8
+ const wasAuthenticated = existing !== null;
9
+ const redactedKey = existing ? redactApiKey(existing.apiKey) : undefined;
10
+ await clearCredentials();
11
+ return { wasAuthenticated, redactedKey };
12
+ }
13
+ // ─── Command Registration ───
14
+ export function registerLogoutCommand(program) {
15
+ program
16
+ .command('logout')
17
+ .description('Clear stored API key and credentials')
18
+ .action(async () => {
19
+ try {
20
+ const result = await executeLogout();
21
+ console.log('');
22
+ if (result.wasAuthenticated) {
23
+ console.log(chalk.green(` Logged out successfully.`));
24
+ console.log(` ${chalk.gray('Cleared key:')} ${result.redactedKey}`);
25
+ }
26
+ else {
27
+ console.log(chalk.dim(' No credentials found — already logged out.'));
28
+ }
29
+ console.log('');
30
+ }
31
+ catch (error) {
32
+ const message = error instanceof Error ? error.message : String(error);
33
+ logger.error({ error: message }, 'Logout failed');
34
+ console.error(chalk.red(` Error: ${message}`));
35
+ process.exitCode = 1;
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEpF,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAE1C,uBAAuB;AAEvB,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC;IACzC,MAAM,gBAAgB,GAAG,QAAQ,KAAK,IAAI,CAAC;IAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEzE,MAAM,gBAAgB,EAAE,CAAC;IAEzB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;AAC3C,CAAC;AAED,+BAA+B;AAE/B,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;YAErC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerNarrativeCommand(program: Command): void;
3
+ //# sourceMappingURL=narratives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narratives.d.ts","sourceRoot":"","sources":["../../src/commands/narratives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAc5C,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmR/D"}