@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.
- package/README.md +8 -0
- package/dist/api-client.d.ts +20 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +81 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +71 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/audit.d.ts +33 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +135 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/behavioral.d.ts +40 -0
- package/dist/commands/behavioral.d.ts.map +1 -0
- package/dist/commands/behavioral.js +369 -0
- package/dist/commands/behavioral.js.map +1 -0
- package/dist/commands/billing.d.ts +12 -0
- package/dist/commands/billing.d.ts.map +1 -0
- package/dist/commands/billing.js +111 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/catalysts.d.ts +8 -0
- package/dist/commands/catalysts.d.ts.map +1 -0
- package/dist/commands/catalysts.js +192 -0
- package/dist/commands/catalysts.js.map +1 -0
- package/dist/commands/config-cmd.d.ts +30 -0
- package/dist/commands/config-cmd.d.ts.map +1 -0
- package/dist/commands/config-cmd.js +265 -0
- package/dist/commands/config-cmd.js.map +1 -0
- package/dist/commands/context.d.ts +40 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +385 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/decisions.d.ts +21 -0
- package/dist/commands/decisions.d.ts.map +1 -0
- package/dist/commands/decisions.js +327 -0
- package/dist/commands/decisions.js.map +1 -0
- package/dist/commands/events.d.ts +3 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +201 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/infra.d.ts +22 -0
- package/dist/commands/infra.d.ts.map +1 -0
- package/dist/commands/infra.js +228 -0
- package/dist/commands/infra.js.map +1 -0
- package/dist/commands/journal.d.ts +3 -0
- package/dist/commands/journal.d.ts.map +1 -0
- package/dist/commands/journal.js +616 -0
- package/dist/commands/journal.js.map +1 -0
- package/dist/commands/login.d.ts +18 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +121 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +7 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +39 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/narratives.d.ts +3 -0
- package/dist/commands/narratives.d.ts.map +1 -0
- package/dist/commands/narratives.js +336 -0
- package/dist/commands/narratives.js.map +1 -0
- package/dist/commands/query.d.ts +39 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +212 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +481 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/risk.d.ts +19 -0
- package/dist/commands/risk.d.ts.map +1 -0
- package/dist/commands/risk.js +190 -0
- package/dist/commands/risk.js.map +1 -0
- package/dist/commands/social.d.ts +9 -0
- package/dist/commands/social.d.ts.map +1 -0
- package/dist/commands/social.js +386 -0
- package/dist/commands/social.js.map +1 -0
- package/dist/commands/subscribe.d.ts +45 -0
- package/dist/commands/subscribe.d.ts.map +1 -0
- package/dist/commands/subscribe.js +259 -0
- package/dist/commands/subscribe.js.map +1 -0
- package/dist/commands/trader.d.ts +12 -0
- package/dist/commands/trader.d.ts.map +1 -0
- package/dist/commands/trader.js +265 -0
- package/dist/commands/trader.js.map +1 -0
- package/dist/commands/watch.d.ts +26 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +121 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/whoami.d.ts +14 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +73 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/credentials.d.ts +18 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +164 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +6 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +21 -0
- package/dist/utils.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { Option } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { getConfig, createLogger } from '@trading-boy/core';
|
|
4
|
+
import { Neo4jClient, getDecisionChain } from '@trading-boy/graph-db';
|
|
5
|
+
import { computeBehavioralProfile, detectAllPatterns, computePatternCosts, BehavioralPattern, } from '@trading-boy/context-engine';
|
|
6
|
+
import { formatConnectionError } from '../utils.js';
|
|
7
|
+
// ─── Logger ───
|
|
8
|
+
const logger = createLogger('cli-behavioral');
|
|
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
|
+
// ─── Period Parsing ───
|
|
21
|
+
/**
|
|
22
|
+
* Parse a period string like "30d", "7d", "90d" into days.
|
|
23
|
+
* Returns default 30 if the string cannot be parsed.
|
|
24
|
+
*/
|
|
25
|
+
export function parsePeriodDays(period) {
|
|
26
|
+
const match = period.match(/^(\d+)d$/);
|
|
27
|
+
if (!match) {
|
|
28
|
+
return 30;
|
|
29
|
+
}
|
|
30
|
+
return parseInt(match[1], 10);
|
|
31
|
+
}
|
|
32
|
+
// ─── Formatters ───
|
|
33
|
+
/**
|
|
34
|
+
* Color-code a behavioral health score.
|
|
35
|
+
* 0-30: green (healthy), 31-60: yellow (watch), 61+: red (concerning)
|
|
36
|
+
*/
|
|
37
|
+
export function colorScore(score) {
|
|
38
|
+
const str = String(score);
|
|
39
|
+
if (score <= 30)
|
|
40
|
+
return chalk.green(str);
|
|
41
|
+
if (score <= 60)
|
|
42
|
+
return chalk.yellow(str);
|
|
43
|
+
return chalk.red(str);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Format a commitment honor rate as a colored percentage.
|
|
47
|
+
*/
|
|
48
|
+
export function colorHonorRate(rate) {
|
|
49
|
+
const pct = `${(rate * 100).toFixed(1)}%`;
|
|
50
|
+
if (rate >= 0.8)
|
|
51
|
+
return chalk.green(pct);
|
|
52
|
+
if (rate >= 0.5)
|
|
53
|
+
return chalk.yellow(pct);
|
|
54
|
+
return chalk.red(pct);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Return the label for a behavioral health score.
|
|
58
|
+
*/
|
|
59
|
+
export function scoreLabel(score) {
|
|
60
|
+
if (score <= 30)
|
|
61
|
+
return 'Healthy';
|
|
62
|
+
if (score <= 60)
|
|
63
|
+
return 'Watch';
|
|
64
|
+
return 'Concerning';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Format a full behavioral profile as a human-readable string.
|
|
68
|
+
*/
|
|
69
|
+
export function formatBehavioralProfile(profile) {
|
|
70
|
+
const lines = [];
|
|
71
|
+
lines.push('');
|
|
72
|
+
lines.push(chalk.bold.cyan(` Behavioral Profile: ${profile.traderId}`));
|
|
73
|
+
lines.push(chalk.gray(` Period: ${profile.period}`));
|
|
74
|
+
lines.push(chalk.gray(' ' + '\u2500'.repeat(50)));
|
|
75
|
+
lines.push('');
|
|
76
|
+
// Overall score with color coding
|
|
77
|
+
lines.push(` ${chalk.gray('Overall Score:')} ${colorScore(profile.overallScore)} / 100 ${chalk.dim(`(${scoreLabel(profile.overallScore)})`)}`);
|
|
78
|
+
lines.push(` ${chalk.gray('Commitment Honor:')} ${colorHonorRate(profile.commitmentHonorRate)}`);
|
|
79
|
+
lines.push('');
|
|
80
|
+
// Pattern breakdown table
|
|
81
|
+
lines.push(chalk.bold(' Pattern Breakdown:'));
|
|
82
|
+
lines.push('');
|
|
83
|
+
lines.push(' ' +
|
|
84
|
+
padRight('Pattern', 22) +
|
|
85
|
+
padRight('Count', 8) +
|
|
86
|
+
'Status');
|
|
87
|
+
lines.push(' ' + '\u2500'.repeat(50));
|
|
88
|
+
const patterns = [
|
|
89
|
+
{ name: 'Revenge Trades', count: profile.revengeTradeCount, threshold: 2 },
|
|
90
|
+
{ name: 'FOMO Entries', count: profile.fomoEntryCount, threshold: 3 },
|
|
91
|
+
{ name: 'Overtrading Days', count: profile.overtradingDays, threshold: 3 },
|
|
92
|
+
{ name: 'Stop Violations', count: profile.stopViolationCount, threshold: 1 },
|
|
93
|
+
{ name: 'Tilt Cascades', count: profile.tiltCascadeCount, threshold: 1 },
|
|
94
|
+
];
|
|
95
|
+
for (const p of patterns) {
|
|
96
|
+
const countStr = String(p.count);
|
|
97
|
+
const status = p.count === 0
|
|
98
|
+
? chalk.green('OK')
|
|
99
|
+
: p.count <= p.threshold
|
|
100
|
+
? chalk.yellow('Watch')
|
|
101
|
+
: chalk.red('Action needed');
|
|
102
|
+
lines.push(' ' +
|
|
103
|
+
padRight(p.name, 22) +
|
|
104
|
+
padRight(countStr, 8) +
|
|
105
|
+
status);
|
|
106
|
+
}
|
|
107
|
+
lines.push('');
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Format a list of decisions with behavioral flags.
|
|
112
|
+
*/
|
|
113
|
+
export function formatBehavioralFlags(decisions) {
|
|
114
|
+
const lines = [];
|
|
115
|
+
lines.push('');
|
|
116
|
+
lines.push(chalk.bold.cyan(' Decisions with Behavioral Flags'));
|
|
117
|
+
lines.push(chalk.gray(' ' + '\u2500'.repeat(80)));
|
|
118
|
+
lines.push('');
|
|
119
|
+
if (decisions.length === 0) {
|
|
120
|
+
lines.push(` ${chalk.dim('No decisions with behavioral flags found.')}`);
|
|
121
|
+
lines.push('');
|
|
122
|
+
return lines.join('\n');
|
|
123
|
+
}
|
|
124
|
+
// Header
|
|
125
|
+
lines.push(' ' +
|
|
126
|
+
padRight('Date', 14) +
|
|
127
|
+
padRight('Token', 8) +
|
|
128
|
+
padRight('Type', 14) +
|
|
129
|
+
'Flags');
|
|
130
|
+
lines.push(' ' + '\u2500'.repeat(80));
|
|
131
|
+
for (const d of decisions) {
|
|
132
|
+
const date = formatShortDate(d.eventTime);
|
|
133
|
+
const flags = d.behavioralFlags.map(colorFlag).join(', ');
|
|
134
|
+
lines.push(' ' +
|
|
135
|
+
padRight(date, 14) +
|
|
136
|
+
padRight(d.tokenSymbol, 8) +
|
|
137
|
+
padRight(d.decisionType, 14) +
|
|
138
|
+
flags);
|
|
139
|
+
}
|
|
140
|
+
lines.push('');
|
|
141
|
+
lines.push(` ${chalk.gray(`Total: ${decisions.length} flagged decision(s)`)}`);
|
|
142
|
+
lines.push('');
|
|
143
|
+
return lines.join('\n');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Format a pattern cost analysis as a human-readable table.
|
|
147
|
+
*/
|
|
148
|
+
export function formatCostAnalysis(analysis, period) {
|
|
149
|
+
const lines = [];
|
|
150
|
+
lines.push('');
|
|
151
|
+
lines.push(chalk.bold.cyan(' Behavioral Cost Analysis'));
|
|
152
|
+
lines.push(chalk.gray(` Period: ${period}`));
|
|
153
|
+
lines.push(chalk.gray(' ' + '\u2500'.repeat(70)));
|
|
154
|
+
lines.push('');
|
|
155
|
+
if (analysis.entries.length === 0) {
|
|
156
|
+
lines.push(` ${chalk.green('No behavioral patterns detected in this period.')}`);
|
|
157
|
+
lines.push('');
|
|
158
|
+
return lines.join('\n');
|
|
159
|
+
}
|
|
160
|
+
// Header
|
|
161
|
+
lines.push(' ' +
|
|
162
|
+
padRight('Pattern', 20) +
|
|
163
|
+
padRight('Count', 8) +
|
|
164
|
+
padRight('Cost', 12) +
|
|
165
|
+
padRight('Win Rate', 10) +
|
|
166
|
+
'vs Baseline');
|
|
167
|
+
lines.push(' ' + '\u2500'.repeat(70));
|
|
168
|
+
const baselinePct = `${(analysis.baselineWinRate * 100).toFixed(0)}%`;
|
|
169
|
+
for (const entry of analysis.entries) {
|
|
170
|
+
const name = patternDisplayName(entry.pattern);
|
|
171
|
+
const costStr = formatUsd(entry.totalCost);
|
|
172
|
+
const winRateStr = `${(entry.winRate * 100).toFixed(0)}%`;
|
|
173
|
+
const costColor = entry.totalCost < 0 ? chalk.red(costStr) : chalk.green(costStr);
|
|
174
|
+
lines.push(' ' +
|
|
175
|
+
padRight(name, 20) +
|
|
176
|
+
padRight(String(entry.occurrences), 8) +
|
|
177
|
+
padRight(costColor, 12 + 10) + // chalk adds escape chars
|
|
178
|
+
padRight(winRateStr, 10) +
|
|
179
|
+
chalk.dim(`${baselinePct} baseline`));
|
|
180
|
+
}
|
|
181
|
+
lines.push(' ' + '\u2500'.repeat(70));
|
|
182
|
+
lines.push('');
|
|
183
|
+
// Summary
|
|
184
|
+
const totalCostStr = formatUsd(analysis.totalBehavioralCost);
|
|
185
|
+
const totalCostColor = analysis.totalBehavioralCost < 0
|
|
186
|
+
? chalk.red(totalCostStr)
|
|
187
|
+
: chalk.green(totalCostStr);
|
|
188
|
+
lines.push(` ${chalk.gray('Total behavioral cost:')} ${totalCostColor}`);
|
|
189
|
+
const diff = analysis.pnlWithoutBehavioralTrades - analysis.totalPnl;
|
|
190
|
+
if (diff > 0) {
|
|
191
|
+
lines.push(` ${chalk.gray('Without these patterns, your PnL would be')} ${chalk.green(formatUsd(analysis.pnlWithoutBehavioralTrades))} ${chalk.gray('instead of')} ${formatUsd(analysis.totalPnl)}`);
|
|
192
|
+
}
|
|
193
|
+
lines.push('');
|
|
194
|
+
return lines.join('\n');
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Display name for a behavioral pattern.
|
|
198
|
+
*/
|
|
199
|
+
function patternDisplayName(pattern) {
|
|
200
|
+
switch (pattern) {
|
|
201
|
+
case BehavioralPattern.REVENGE_TRADING: return 'Revenge Trading';
|
|
202
|
+
case BehavioralPattern.FOMO_ENTRY: return 'FOMO Entry';
|
|
203
|
+
case BehavioralPattern.OVERTRADING: return 'Overtrading';
|
|
204
|
+
case BehavioralPattern.STOP_VIOLATION: return 'Stop Violation';
|
|
205
|
+
case BehavioralPattern.TILT_CASCADE: return 'Tilt Cascade';
|
|
206
|
+
default: return pattern;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Format a USD amount.
|
|
211
|
+
*/
|
|
212
|
+
function formatUsd(amount) {
|
|
213
|
+
const sign = amount >= 0 ? '+' : '-';
|
|
214
|
+
return `${sign}$${Math.abs(amount).toFixed(2)}`;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Color-code a behavioral flag name.
|
|
218
|
+
*/
|
|
219
|
+
function colorFlag(flag) {
|
|
220
|
+
switch (flag) {
|
|
221
|
+
case BehavioralPattern.REVENGE_TRADING:
|
|
222
|
+
return chalk.red('REVENGE_TRADING');
|
|
223
|
+
case BehavioralPattern.TILT_CASCADE:
|
|
224
|
+
return chalk.red('TILT_CASCADE');
|
|
225
|
+
case BehavioralPattern.STOP_VIOLATION:
|
|
226
|
+
return chalk.red('STOP_VIOLATION');
|
|
227
|
+
case BehavioralPattern.FOMO_ENTRY:
|
|
228
|
+
return chalk.yellow('FOMO_ENTRY');
|
|
229
|
+
case BehavioralPattern.OVERTRADING:
|
|
230
|
+
return chalk.yellow('OVERTRADING');
|
|
231
|
+
default:
|
|
232
|
+
return chalk.dim(flag);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// ─── Command Registration ───
|
|
236
|
+
export function registerBehavioralCommand(program) {
|
|
237
|
+
const behavioral = program
|
|
238
|
+
.command('behavioral')
|
|
239
|
+
.description('Behavioral pattern analysis commands');
|
|
240
|
+
// ─── behavioral profile ───
|
|
241
|
+
behavioral
|
|
242
|
+
.command('profile')
|
|
243
|
+
.description('Show behavioral profile (revenge trades, FOMO rate, commitment honor rate)')
|
|
244
|
+
.option('--period <period>', 'Analysis period (e.g., 7d, 30d, 90d)', '30d')
|
|
245
|
+
.option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
|
|
246
|
+
.addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
|
|
247
|
+
.action(async (options) => {
|
|
248
|
+
const periodDays = parsePeriodDays(options.period);
|
|
249
|
+
const client = createNeo4jClient();
|
|
250
|
+
try {
|
|
251
|
+
await client.connect();
|
|
252
|
+
const profile = await computeBehavioralProfile(client, options.trader, periodDays);
|
|
253
|
+
if (options.format === 'json') {
|
|
254
|
+
console.log(JSON.stringify(profile, null, 2));
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
console.log(formatBehavioralProfile(profile));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
262
|
+
logger.error({ error: message }, 'Failed to compute behavioral profile');
|
|
263
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
264
|
+
const guidance = formatConnectionError(message);
|
|
265
|
+
if (guidance)
|
|
266
|
+
console.error(guidance);
|
|
267
|
+
process.exitCode = 1;
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
await client.disconnect();
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
// ─── behavioral flags ───
|
|
274
|
+
behavioral
|
|
275
|
+
.command('flags')
|
|
276
|
+
.description('Show recent decisions with behavioral flags')
|
|
277
|
+
.option('--limit <n>', 'Maximum number of results', parseIntOption, 20)
|
|
278
|
+
.option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
|
|
279
|
+
.addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
|
|
280
|
+
.action(async (options) => {
|
|
281
|
+
const client = createNeo4jClient();
|
|
282
|
+
try {
|
|
283
|
+
await client.connect();
|
|
284
|
+
const allDecisions = await getDecisionChain(client, options.trader);
|
|
285
|
+
// Filter to decisions that have behavioral flags
|
|
286
|
+
const flagged = allDecisions
|
|
287
|
+
.filter((d) => d.behavioralFlags && d.behavioralFlags.length > 0)
|
|
288
|
+
.slice(0, options.limit);
|
|
289
|
+
if (options.format === 'json') {
|
|
290
|
+
console.log(JSON.stringify(flagged, null, 2));
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
console.log(formatBehavioralFlags(flagged));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
298
|
+
logger.error({ error: message }, 'Failed to fetch behavioral flags');
|
|
299
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
300
|
+
const guidance = formatConnectionError(message);
|
|
301
|
+
if (guidance)
|
|
302
|
+
console.error(guidance);
|
|
303
|
+
process.exitCode = 1;
|
|
304
|
+
}
|
|
305
|
+
finally {
|
|
306
|
+
await client.disconnect();
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
// ─── behavioral costs ───
|
|
310
|
+
behavioral
|
|
311
|
+
.command('costs')
|
|
312
|
+
.description('Show behavioral cost analysis — how much each pattern costs you')
|
|
313
|
+
.option('--period <period>', 'Analysis period (e.g., 7d, 30d, 90d)', '30d')
|
|
314
|
+
.option('--trader <traderId>', 'Trader ID', DEFAULT_TRADER_ID)
|
|
315
|
+
.addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
|
|
316
|
+
.action(async (options) => {
|
|
317
|
+
const periodDays = parsePeriodDays(options.period);
|
|
318
|
+
const client = createNeo4jClient();
|
|
319
|
+
try {
|
|
320
|
+
await client.connect();
|
|
321
|
+
const allDecisions = await getDecisionChain(client, options.trader);
|
|
322
|
+
// Filter to the rolling window
|
|
323
|
+
const cutoff = new Date();
|
|
324
|
+
cutoff.setDate(cutoff.getDate() - periodDays);
|
|
325
|
+
const cutoffMs = cutoff.getTime();
|
|
326
|
+
const windowDecisions = allDecisions.filter((d) => {
|
|
327
|
+
return new Date(d.eventTime).getTime() >= cutoffMs;
|
|
328
|
+
});
|
|
329
|
+
// Run pattern detection
|
|
330
|
+
const detections = detectAllPatterns(windowDecisions);
|
|
331
|
+
// Compute costs
|
|
332
|
+
const costAnalysis = computePatternCosts(windowDecisions, detections);
|
|
333
|
+
if (options.format === 'json') {
|
|
334
|
+
console.log(JSON.stringify(costAnalysis, null, 2));
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
console.log(formatCostAnalysis(costAnalysis, `${periodDays}d`));
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
342
|
+
logger.error({ error: message }, 'Failed to compute behavioral costs');
|
|
343
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
344
|
+
const guidance = formatConnectionError(message);
|
|
345
|
+
if (guidance)
|
|
346
|
+
console.error(guidance);
|
|
347
|
+
process.exitCode = 1;
|
|
348
|
+
}
|
|
349
|
+
finally {
|
|
350
|
+
await client.disconnect();
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
// ─── Helpers ───
|
|
355
|
+
function padRight(str, len) {
|
|
356
|
+
return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
|
|
357
|
+
}
|
|
358
|
+
function parseIntOption(value) {
|
|
359
|
+
return parseInt(value, 10);
|
|
360
|
+
}
|
|
361
|
+
function formatShortDate(isoString) {
|
|
362
|
+
try {
|
|
363
|
+
return new Date(isoString).toISOString().slice(0, 10);
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
return isoString;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=behavioral.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"behavioral.js","sourceRoot":"","sources":["../../src/commands/behavioral.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export interface BillingStatusResponse {
|
|
3
|
+
email: string;
|
|
4
|
+
plan: string;
|
|
5
|
+
status: string;
|
|
6
|
+
keyPrefix?: string;
|
|
7
|
+
nextBillingDate?: string;
|
|
8
|
+
currentPeriodEnd?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function formatBillingStatus(status: BillingStatusResponse): string;
|
|
11
|
+
export declare function registerBillingCommand(program: Command): void;
|
|
12
|
+
//# sourceMappingURL=billing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAgCD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAmCzE;AAID,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmD7D"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { createLogger } from '@trading-boy/core';
|
|
3
|
+
import { apiRequest } from '../api-client.js';
|
|
4
|
+
const logger = createLogger('cli-billing');
|
|
5
|
+
// ─── Formatters ───
|
|
6
|
+
function formatStatusLabel(status) {
|
|
7
|
+
switch (status) {
|
|
8
|
+
case 'active':
|
|
9
|
+
case 'trialing':
|
|
10
|
+
return chalk.green(status);
|
|
11
|
+
case 'past_due':
|
|
12
|
+
return chalk.yellow(status);
|
|
13
|
+
case 'canceled':
|
|
14
|
+
case 'unpaid':
|
|
15
|
+
case 'incomplete_expired':
|
|
16
|
+
return chalk.red(status);
|
|
17
|
+
default:
|
|
18
|
+
return chalk.gray(status);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function formatDate(isoDate) {
|
|
22
|
+
return new Date(isoDate).toLocaleDateString('en-US', {
|
|
23
|
+
year: 'numeric',
|
|
24
|
+
month: 'short',
|
|
25
|
+
day: 'numeric',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function padRight(str, len) {
|
|
29
|
+
return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
|
|
30
|
+
}
|
|
31
|
+
export function formatBillingStatus(status) {
|
|
32
|
+
const lines = [];
|
|
33
|
+
lines.push('');
|
|
34
|
+
lines.push(chalk.bold.cyan(' Billing Status'));
|
|
35
|
+
lines.push(chalk.gray(' ' + '\u2500'.repeat(50)));
|
|
36
|
+
lines.push('');
|
|
37
|
+
lines.push(` ${chalk.bold(padRight('Account:', 18))} ${status.email}`);
|
|
38
|
+
lines.push(` ${chalk.bold(padRight('Plan:', 18))} ${status.plan}`);
|
|
39
|
+
lines.push(` ${chalk.bold(padRight('Status:', 18))} ${formatStatusLabel(status.status)}`);
|
|
40
|
+
if (status.keyPrefix) {
|
|
41
|
+
lines.push(` ${chalk.bold(padRight('API Key:', 18))} ${status.keyPrefix}...`);
|
|
42
|
+
}
|
|
43
|
+
if (status.nextBillingDate) {
|
|
44
|
+
lines.push(` ${chalk.bold(padRight('Next billing:', 18))} ${formatDate(status.nextBillingDate)}`);
|
|
45
|
+
}
|
|
46
|
+
else if (status.currentPeriodEnd) {
|
|
47
|
+
lines.push(` ${chalk.bold(padRight('Period ends:', 18))} ${formatDate(status.currentPeriodEnd)}`);
|
|
48
|
+
}
|
|
49
|
+
lines.push('');
|
|
50
|
+
if (status.status === 'past_due') {
|
|
51
|
+
lines.push(chalk.yellow(' Warning: Payment is past due. Update your payment method:'));
|
|
52
|
+
lines.push(chalk.yellow(' Run: trading-boy billing manage'));
|
|
53
|
+
lines.push('');
|
|
54
|
+
}
|
|
55
|
+
else if (status.status === 'canceled' || status.status === 'unpaid') {
|
|
56
|
+
lines.push(chalk.red(' Your subscription is inactive.'));
|
|
57
|
+
lines.push(chalk.red(' Run: trading-boy subscribe -e <email> to resubscribe'));
|
|
58
|
+
lines.push('');
|
|
59
|
+
}
|
|
60
|
+
return lines.join('\n');
|
|
61
|
+
}
|
|
62
|
+
// ─── Command Registration ───
|
|
63
|
+
export function registerBillingCommand(program) {
|
|
64
|
+
const billingCmd = program
|
|
65
|
+
.command('billing')
|
|
66
|
+
.description('Subscription billing management');
|
|
67
|
+
// billing manage — open customer portal
|
|
68
|
+
billingCmd
|
|
69
|
+
.command('manage')
|
|
70
|
+
.description('Open Stripe Customer Portal to manage your subscription')
|
|
71
|
+
.action(async () => {
|
|
72
|
+
try {
|
|
73
|
+
const { default: ora } = await import('ora');
|
|
74
|
+
const spinner = ora(' Creating billing portal session...').start();
|
|
75
|
+
const result = await apiRequest('/api/v1/billing/portal', {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
});
|
|
78
|
+
spinner.succeed(' Opening billing portal...');
|
|
79
|
+
const { default: open } = await import('open');
|
|
80
|
+
await open(result.url);
|
|
81
|
+
console.log('');
|
|
82
|
+
console.log(chalk.dim(' Billing portal opened in your browser.'));
|
|
83
|
+
console.log(chalk.dim(' If it didn\'t open, visit:'));
|
|
84
|
+
console.log(` ${chalk.cyan(result.url)}`);
|
|
85
|
+
console.log('');
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
89
|
+
logger.error({ error: message }, 'Billing portal failed');
|
|
90
|
+
console.error(chalk.red(` Error: ${message}`));
|
|
91
|
+
process.exitCode = 1;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// billing status — show current subscription
|
|
95
|
+
billingCmd
|
|
96
|
+
.command('status')
|
|
97
|
+
.description('Show your current subscription status')
|
|
98
|
+
.action(async () => {
|
|
99
|
+
try {
|
|
100
|
+
const result = await apiRequest('/api/v1/billing/status');
|
|
101
|
+
console.log(formatBillingStatus(result));
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
105
|
+
logger.error({ error: message }, 'Billing status failed');
|
|
106
|
+
console.error(chalk.red(` Error: ${message}`));
|
|
107
|
+
process.exitCode = 1;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=billing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { type EventRecord } from '@trading-boy/graph-db';
|
|
3
|
+
/**
|
|
4
|
+
* Format the catalysts list output.
|
|
5
|
+
*/
|
|
6
|
+
export declare function formatCatalystsOutput(events: EventRecord[]): string;
|
|
7
|
+
export declare function registerCatalystsCommand(program: Command): void;
|
|
8
|
+
//# sourceMappingURL=catalysts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalysts.d.ts","sourceRoot":"","sources":["../../src/commands/catalysts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAkF/B;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAmDnE;AAID,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE/D"}
|