@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,117 @@
1
+ import { Option } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { createLogger } from '@trading-boy/core';
4
+ import { apiRequest, ApiError } from '../api-client.js';
5
+ import { padRight } from '../utils.js';
6
+ const logger = createLogger('cli-billing');
7
+ // ─── Formatters ───
8
+ function formatStatusLabel(status) {
9
+ switch (status) {
10
+ case 'active':
11
+ case 'trialing':
12
+ return chalk.green(status);
13
+ case 'past_due':
14
+ return chalk.yellow(status);
15
+ case 'canceled':
16
+ case 'unpaid':
17
+ case 'incomplete_expired':
18
+ return chalk.red(status);
19
+ default:
20
+ return chalk.gray(status);
21
+ }
22
+ }
23
+ function formatDate(isoDate) {
24
+ return new Date(isoDate).toLocaleDateString('en-US', {
25
+ year: 'numeric',
26
+ month: 'short',
27
+ day: 'numeric',
28
+ });
29
+ }
30
+ export function formatBillingStatus(status) {
31
+ const lines = [];
32
+ lines.push('');
33
+ lines.push(chalk.bold.cyan(' Billing Status'));
34
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(50)));
35
+ lines.push('');
36
+ lines.push(` ${chalk.bold(padRight('Account:', 18))} ${status.email}`);
37
+ lines.push(` ${chalk.bold(padRight('Plan:', 18))} ${status.plan}`);
38
+ lines.push(` ${chalk.bold(padRight('Status:', 18))} ${formatStatusLabel(status.status)}`);
39
+ if (status.keyPrefix) {
40
+ lines.push(` ${chalk.bold(padRight('API Key:', 18))} ${status.keyPrefix}...`);
41
+ }
42
+ if (status.nextBillingDate) {
43
+ lines.push(` ${chalk.bold(padRight('Next billing:', 18))} ${formatDate(status.nextBillingDate)}`);
44
+ }
45
+ else if (status.currentPeriodEnd) {
46
+ lines.push(` ${chalk.bold(padRight('Period ends:', 18))} ${formatDate(status.currentPeriodEnd)}`);
47
+ }
48
+ lines.push('');
49
+ if (status.status === 'past_due') {
50
+ lines.push(chalk.yellow(' Warning: Payment is past due. Update your payment method:'));
51
+ lines.push(chalk.yellow(' Run: trading-boy billing manage'));
52
+ lines.push('');
53
+ }
54
+ else if (status.status === 'canceled' || status.status === 'unpaid') {
55
+ lines.push(chalk.red(' Your subscription is inactive.'));
56
+ lines.push(chalk.red(' Run: trading-boy subscribe -e <email> to resubscribe'));
57
+ lines.push('');
58
+ }
59
+ return lines.join('\n');
60
+ }
61
+ // ─── Command Registration ───
62
+ export function registerBillingCommand(program) {
63
+ const billingCmd = program
64
+ .command('billing')
65
+ .description('Subscription billing management');
66
+ // billing manage — open customer portal
67
+ billingCmd
68
+ .command('manage')
69
+ .description('Open Stripe Customer Portal to manage your subscription')
70
+ .action(async () => {
71
+ try {
72
+ const { createSpinner } = await import('../utils.js');
73
+ const spinner = (await createSpinner(' Creating billing portal session...')).start();
74
+ const result = await apiRequest('/api/v1/billing/portal', {
75
+ method: 'POST',
76
+ });
77
+ spinner.succeed(' Opening billing portal...');
78
+ const { default: open } = await import('open');
79
+ await open(result.url);
80
+ console.log('');
81
+ console.log(chalk.dim(' Billing portal opened in your browser.'));
82
+ console.log(chalk.dim(' If it didn\'t open, visit:'));
83
+ console.log(` ${chalk.cyan(result.url)}`);
84
+ console.log('');
85
+ }
86
+ catch (error) {
87
+ const message = error instanceof Error ? error.message : String(error);
88
+ logger.error({ error: message }, 'Billing portal failed');
89
+ console.error(chalk.red(` Error: ${message}`));
90
+ process.exitCode = error instanceof ApiError ? 2 : 1;
91
+ }
92
+ });
93
+ // billing status — show current subscription
94
+ billingCmd
95
+ .command('status')
96
+ .alias('subscription')
97
+ .description('Show your current subscription status')
98
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
99
+ .action(async (options) => {
100
+ try {
101
+ const result = await apiRequest('/api/v1/billing/status');
102
+ if (options.format === 'json') {
103
+ console.log(JSON.stringify(result, null, 2));
104
+ }
105
+ else {
106
+ console.log(formatBillingStatus(result));
107
+ }
108
+ }
109
+ catch (error) {
110
+ const message = error instanceof Error ? error.message : String(error);
111
+ logger.error({ error: message }, 'Billing status failed');
112
+ console.error(chalk.red(` Error: ${message}`));
113
+ process.exitCode = error instanceof ApiError ? 2 : 1;
114
+ }
115
+ });
116
+ }
117
+ //# 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,17 @@
1
+ import { Command } from 'commander';
2
+ interface EventRecord {
3
+ id: string;
4
+ type: string;
5
+ title: string;
6
+ scheduledDate: string | null;
7
+ severity: string;
8
+ tokensAffected?: string[];
9
+ [key: string]: unknown;
10
+ }
11
+ /**
12
+ * Format the catalysts list output.
13
+ */
14
+ export declare function formatCatalystsOutput(events: EventRecord[]): string;
15
+ export declare function registerCatalystsCommand(program: Command): void;
16
+ export {};
17
+ //# 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;AAK5C,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA2DD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAmDnE;AAID,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+C/D"}
@@ -0,0 +1,151 @@
1
+ import { Option } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { createLogger, EventType } from '@trading-boy/core';
4
+ import { formatConnectionError, padRight, truncate, formatDate, parseIntOption } from '../utils.js';
5
+ import { apiRequest, ApiError } from '../api-client.js';
6
+ // ─── Logger ───
7
+ const logger = createLogger('cli-catalysts');
8
+ // ─── Formatters ───
9
+ /**
10
+ * Color-code severity labels.
11
+ */
12
+ function colorSeverity(severity) {
13
+ switch (severity) {
14
+ case 'CRITICAL':
15
+ return chalk.bgRed.white.bold(` ${severity} `);
16
+ case 'HIGH':
17
+ return chalk.red(severity);
18
+ case 'MEDIUM':
19
+ return chalk.yellow(severity);
20
+ case 'LOW':
21
+ return chalk.green(severity);
22
+ default:
23
+ return chalk.dim(severity);
24
+ }
25
+ }
26
+ /**
27
+ * Compute days until a scheduled date.
28
+ */
29
+ function daysUntil(isoString) {
30
+ if (!isoString) {
31
+ return chalk.dim('-');
32
+ }
33
+ try {
34
+ const date = new Date(isoString);
35
+ const now = new Date();
36
+ const diffMs = date.getTime() - now.getTime();
37
+ const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));
38
+ if (diffDays < 0) {
39
+ return chalk.dim(`${diffDays}d ago`);
40
+ }
41
+ if (diffDays === 0) {
42
+ return chalk.red.bold('TODAY');
43
+ }
44
+ if (diffDays <= 3) {
45
+ return chalk.red(`${diffDays}d`);
46
+ }
47
+ if (diffDays <= 7) {
48
+ return chalk.yellow(`${diffDays}d`);
49
+ }
50
+ return chalk.white(`${diffDays}d`);
51
+ }
52
+ catch {
53
+ return chalk.dim('-');
54
+ }
55
+ }
56
+ /**
57
+ * Format the catalysts list output.
58
+ */
59
+ export function formatCatalystsOutput(events) {
60
+ const lines = [];
61
+ lines.push('');
62
+ lines.push(chalk.bold.cyan(' Upcoming Catalysts'));
63
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(100)));
64
+ lines.push('');
65
+ if (events.length === 0) {
66
+ lines.push(` ${chalk.dim('No upcoming catalysts found.')}`);
67
+ lines.push('');
68
+ return lines.join('\n');
69
+ }
70
+ // Header
71
+ lines.push(' ' +
72
+ padRight('Date', 14) +
73
+ padRight('In', 10) +
74
+ padRight('Type', 22) +
75
+ padRight('Severity', 12) +
76
+ padRight('Tokens', 16) +
77
+ 'Title');
78
+ lines.push(' ' + '\u2500'.repeat(100));
79
+ for (const event of events) {
80
+ const date = formatDate(event.scheduledDate);
81
+ const until = daysUntil(event.scheduledDate);
82
+ const severity = colorSeverity(event.severity);
83
+ const tokens = event.tokensAffected
84
+ ? event.tokensAffected.join(', ')
85
+ : '-';
86
+ const title = truncate(event.title, 30);
87
+ lines.push(' ' +
88
+ padRight(date, 14) +
89
+ padRight(until, 10) +
90
+ padRight(event.type, 22) +
91
+ padRight(severity, 12) +
92
+ padRight(tokens, 16) +
93
+ title);
94
+ }
95
+ lines.push('');
96
+ lines.push(` ${chalk.gray(`Total: ${events.length} catalyst(s)`)}`);
97
+ lines.push('');
98
+ return lines.join('\n');
99
+ }
100
+ // ─── Command Registration ───
101
+ export function registerCatalystsCommand(program) {
102
+ program
103
+ .command('catalysts')
104
+ .description('Show upcoming catalysts and events sorted by date')
105
+ .option('--type <type>', `Filter by event type (${Object.values(EventType).join(', ')})`)
106
+ .option('--days <n>', 'Number of days to look ahead', parseIntOption, 30)
107
+ .option('--limit <n>', 'Maximum number of results', parseIntOption, 50)
108
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
109
+ .action(async (options) => {
110
+ // Validate event type if provided
111
+ if (options.type && !Object.values(EventType).includes(options.type)) {
112
+ console.error(chalk.red(`Error: Invalid event type "${options.type}". Valid types: ${Object.values(EventType).join(', ')}`));
113
+ process.exitCode = 1;
114
+ return;
115
+ }
116
+ // Validate --days
117
+ if (!Number.isFinite(options.days) || options.days <= 0) {
118
+ console.error(chalk.red('Error: --days must be a positive number'));
119
+ process.exitCode = 1;
120
+ return;
121
+ }
122
+ try {
123
+ const params = new URLSearchParams();
124
+ if (options.days)
125
+ params.set('days', String(options.days));
126
+ if (options.type)
127
+ params.set('type', options.type);
128
+ if (options.limit)
129
+ params.set('limit', String(options.limit));
130
+ const qs = params.toString() ? `?${params.toString()}` : '';
131
+ const result = await apiRequest(`/api/v1/catalysts${qs}`);
132
+ const events = result.events ?? [];
133
+ if (options.format === 'json') {
134
+ console.log(JSON.stringify(events, null, 2));
135
+ }
136
+ else {
137
+ console.log(formatCatalystsOutput(events));
138
+ }
139
+ }
140
+ catch (error) {
141
+ const message = error instanceof ApiError ? error.message : (error instanceof Error ? error.message : String(error));
142
+ logger.error({ error: message }, 'Failed to fetch catalysts');
143
+ console.error(chalk.red(`Error: ${message}`));
144
+ const guidance = formatConnectionError(message);
145
+ if (guidance)
146
+ console.error(guidance);
147
+ process.exitCode = error instanceof ApiError ? 2 : 1;
148
+ }
149
+ });
150
+ }
151
+ //# sourceMappingURL=catalysts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalysts.js","sourceRoot":"","sources":["../../src/commands/catalysts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Command } from 'commander';
2
+ interface CoachingIntervention {
3
+ level: string;
4
+ reason: string;
5
+ message: string;
6
+ suggestions?: string[];
7
+ requiredAcknowledgment?: boolean;
8
+ }
9
+ interface CoachingResponse {
10
+ traderId: string;
11
+ intervention: CoachingIntervention | null;
12
+ }
13
+ export declare function formatIntervention(response: CoachingResponse): string;
14
+ export declare function registerCoachingCommand(program: Command): void;
15
+ export {};
16
+ //# sourceMappingURL=coaching-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coaching-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/coaching-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAW5C,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC3C;AA2DD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAwCrE;AAID,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsL9D"}
@@ -0,0 +1,231 @@
1
+ import { Option } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { createLogger } from '@trading-boy/core';
4
+ import { isRemoteMode, apiRequest, ApiError } from '../api-client.js';
5
+ // ─── Logger ───
6
+ const logger = createLogger('cli-coaching');
7
+ // ─── BYOK Error Hint ───
8
+ const BYOK_HINT = `LLM API key required. Run: ${chalk.white('trading-boy config set-llm-key <key>')}`;
9
+ function isByokError(error) {
10
+ if (error instanceof ApiError && error.status === 422)
11
+ return true;
12
+ // Also catch LLM provider errors that bubble up as 500/502
13
+ if (error instanceof ApiError && (error.status === 500 || error.status === 502)) {
14
+ const msg = typeof error.body === 'object' && error.body !== null && 'error' in error.body
15
+ ? String(error.body.error)
16
+ : error.message;
17
+ if (msg.toLowerCase().includes('llm') || msg.toLowerCase().includes('anthropic') || msg.toLowerCase().includes('openai')) {
18
+ return true;
19
+ }
20
+ }
21
+ return false;
22
+ }
23
+ // ─── Remote Mode Guard ───
24
+ async function requireRemote() {
25
+ if (!(await isRemoteMode())) {
26
+ console.error(chalk.yellow('Coaching requires a remote API connection.'));
27
+ console.error(chalk.dim(' Run: trading-boy login'));
28
+ process.exitCode = 1;
29
+ return false;
30
+ }
31
+ return true;
32
+ }
33
+ // ─── Formatters ───
34
+ export function formatIntervention(response) {
35
+ const lines = [];
36
+ lines.push('');
37
+ lines.push(chalk.bold.cyan(` Coaching — ${response.traderId}`));
38
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(50)));
39
+ lines.push('');
40
+ if (!response.intervention) {
41
+ lines.push(chalk.green(' No intervention needed. You are clear to trade.'));
42
+ lines.push('');
43
+ return lines.join('\n');
44
+ }
45
+ const i = response.intervention;
46
+ const levelColor = i.level === 'BLOCK' ? chalk.red
47
+ : i.level === 'WARN' ? chalk.yellow
48
+ : chalk.blue;
49
+ lines.push(` ${chalk.gray('Level:')} ${levelColor(i.level)}`);
50
+ lines.push(` ${chalk.gray('Reason:')} ${chalk.white(i.reason)}`);
51
+ lines.push('');
52
+ lines.push(` ${chalk.white(i.message)}`);
53
+ if (i.suggestions && i.suggestions.length > 0) {
54
+ lines.push('');
55
+ lines.push(chalk.gray(' Suggestions:'));
56
+ for (const s of i.suggestions) {
57
+ lines.push(` ${chalk.dim('\u2022')} ${s}`);
58
+ }
59
+ }
60
+ if (i.requiredAcknowledgment) {
61
+ lines.push('');
62
+ lines.push(chalk.yellow(' This intervention requires acknowledgment before proceeding.'));
63
+ lines.push(chalk.dim(` Run: trading-boy coaching acknowledge ${response.traderId} --reason "your reason"`));
64
+ }
65
+ lines.push('');
66
+ return lines.join('\n');
67
+ }
68
+ // ─── Command Registration ───
69
+ export function registerCoachingCommand(program) {
70
+ const coaching = program
71
+ .command('coaching')
72
+ .description('Trading coach — pre/post-trade interventions (requires BYOK LLM key)');
73
+ // ─── coaching pre-trade <traderId> ───
74
+ coaching
75
+ .command('pre-trade <traderId>')
76
+ .description('Get pre-trade coaching intervention check')
77
+ .option('--tilt-score <n>', 'Tilt score (0-100)', parseFloat)
78
+ .option('--flags <flags>', 'Active behavioral flags (comma-separated)')
79
+ .option('--token <symbol>', 'Token being traded')
80
+ .option('--direction <dir>', 'Trade direction (LONG or SHORT)')
81
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
82
+ .action(async (traderId, options) => {
83
+ if (!(await requireRemote()))
84
+ return;
85
+ // Build extraction object from flags
86
+ const extraction = {
87
+ decisionType: 'TRADE_ENTRY',
88
+ tokenSymbol: options.token?.toUpperCase() ?? 'UNKNOWN',
89
+ direction: options.direction?.toUpperCase() ?? null,
90
+ confidence: 0.5,
91
+ cleanedThesis: '',
92
+ triggers: [],
93
+ emotionalTag: 'NEUTRAL',
94
+ behavioralFlags: options.flags ? options.flags.split(',').map((f) => f.trim()) : [],
95
+ commitments: [],
96
+ };
97
+ const body = {
98
+ extraction,
99
+ tiltScore: options.tiltScore ?? 0,
100
+ activeFlags: options.flags ? options.flags.split(',').map((f) => f.trim()) : [],
101
+ recentOutcomes: [],
102
+ baseline: {
103
+ winRate: 0.5,
104
+ avgPnlPercent: 0,
105
+ avgConfidence: 0.5,
106
+ avgTradesPerDay: 1,
107
+ commitmentHonorRate: 1,
108
+ overallBehavioralScore: 0.8,
109
+ setupWinRates: {},
110
+ },
111
+ };
112
+ try {
113
+ const result = await apiRequest(`/api/v1/traders/${encodeURIComponent(traderId)}/coaching/pre-trade`, { method: 'POST', body });
114
+ if (options.format === 'json') {
115
+ console.log(JSON.stringify(result, null, 2));
116
+ }
117
+ else {
118
+ console.log(formatIntervention(result));
119
+ }
120
+ }
121
+ catch (error) {
122
+ if (isByokError(error)) {
123
+ console.error(chalk.yellow(BYOK_HINT));
124
+ process.exitCode = 2;
125
+ return;
126
+ }
127
+ if (error instanceof ApiError && (error.status === 403 || error.status === 401)) {
128
+ console.error(chalk.yellow(error.message));
129
+ process.exitCode = 2;
130
+ return;
131
+ }
132
+ const message = error instanceof ApiError ? error.message : (error instanceof Error ? error.message : String(error));
133
+ logger.error({ error: message }, 'Pre-trade coaching failed');
134
+ console.error(chalk.red(`Error: ${message}`));
135
+ process.exitCode = error instanceof ApiError ? 2 : 1;
136
+ }
137
+ });
138
+ // ─── coaching post-trade <traderId> ───
139
+ coaching
140
+ .command('post-trade <traderId>')
141
+ .description('Get post-trade coaching session reflection')
142
+ .option('--tilt-score <n>', 'Tilt score (0-100)', parseFloat)
143
+ .option('--flags <flags>', 'Active behavioral flags (comma-separated)')
144
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
145
+ .action(async (traderId, options) => {
146
+ if (!(await requireRemote()))
147
+ return;
148
+ const body = {
149
+ tiltScore: options.tiltScore ?? 0,
150
+ activeFlags: options.flags ? options.flags.split(',').map((f) => f.trim()) : [],
151
+ recentOutcomes: [],
152
+ baseline: {
153
+ winRate: 0.5,
154
+ avgPnlPercent: 0,
155
+ avgConfidence: 0.5,
156
+ avgTradesPerDay: 1,
157
+ commitmentHonorRate: 1,
158
+ overallBehavioralScore: 0.8,
159
+ setupWinRates: {},
160
+ },
161
+ };
162
+ try {
163
+ const result = await apiRequest(`/api/v1/traders/${encodeURIComponent(traderId)}/coaching/post-trade`, { method: 'POST', body });
164
+ if (options.format === 'json') {
165
+ console.log(JSON.stringify(result, null, 2));
166
+ }
167
+ else {
168
+ console.log(formatIntervention(result));
169
+ }
170
+ }
171
+ catch (error) {
172
+ if (isByokError(error)) {
173
+ console.error(chalk.yellow(BYOK_HINT));
174
+ process.exitCode = 2;
175
+ return;
176
+ }
177
+ if (error instanceof ApiError && (error.status === 403 || error.status === 401)) {
178
+ console.error(chalk.yellow(error.message));
179
+ process.exitCode = 2;
180
+ return;
181
+ }
182
+ const message = error instanceof ApiError ? error.message : (error instanceof Error ? error.message : String(error));
183
+ logger.error({ error: message }, 'Post-trade coaching failed');
184
+ console.error(chalk.red(`Error: ${message}`));
185
+ process.exitCode = error instanceof ApiError ? 2 : 1;
186
+ }
187
+ });
188
+ // ─── coaching acknowledge <traderId> ───
189
+ coaching
190
+ .command('acknowledge <traderId>')
191
+ .description('Acknowledge a coaching intervention')
192
+ .requiredOption('--reason <reason>', 'Reason for acknowledgment')
193
+ .action(async (traderId, options) => {
194
+ if (!(await requireRemote()))
195
+ return;
196
+ try {
197
+ const result = await apiRequest(`/api/v1/traders/${encodeURIComponent(traderId)}/coaching/acknowledge`, { method: 'POST', body: { reason: options.reason } });
198
+ console.log('');
199
+ console.log(chalk.green(` Intervention acknowledged for ${result.traderId}`));
200
+ console.log(` ${chalk.gray('Reason:')} ${result.reason}`);
201
+ console.log('');
202
+ }
203
+ catch (error) {
204
+ const message = error instanceof ApiError ? error.message : (error instanceof Error ? error.message : String(error));
205
+ logger.error({ error: message }, 'Acknowledge failed');
206
+ console.error(chalk.red(`Error: ${message}`));
207
+ process.exitCode = error instanceof ApiError ? 2 : 1;
208
+ }
209
+ });
210
+ // ─── coaching reset <traderId> ───
211
+ coaching
212
+ .command('reset <traderId>')
213
+ .description('Reset coaching session state')
214
+ .action(async (traderId) => {
215
+ if (!(await requireRemote()))
216
+ return;
217
+ try {
218
+ const result = await apiRequest(`/api/v1/traders/${encodeURIComponent(traderId)}/coaching/reset-session`, { method: 'POST', body: {} });
219
+ console.log('');
220
+ console.log(chalk.green(` Coaching session reset for ${result.traderId}`));
221
+ console.log('');
222
+ }
223
+ catch (error) {
224
+ const message = error instanceof ApiError ? error.message : (error instanceof Error ? error.message : String(error));
225
+ logger.error({ error: message }, 'Reset failed');
226
+ console.error(chalk.red(`Error: ${message}`));
227
+ process.exitCode = error instanceof ApiError ? 2 : 1;
228
+ }
229
+ });
230
+ }
231
+ //# sourceMappingURL=coaching-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coaching-cmd.js","sourceRoot":"","sources":["../../src/commands/coaching-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Command } from 'commander';
2
+ import { type Config } from '@trading-boy/core';
3
+ /**
4
+ * Redact a config value if it's a sensitive key.
5
+ * Shows first 3 chars + '****' for non-empty sensitive values.
6
+ */
7
+ export declare function redactValue(key: string, value: string | number | boolean): string;
8
+ /**
9
+ * Format the full config for display.
10
+ */
11
+ export declare function formatConfigOutput(config: Config): string;
12
+ /**
13
+ * Resolve the .env file path from the project root.
14
+ */
15
+ export declare function resolveEnvPath(): string;
16
+ /**
17
+ * Parse a .env file into a Map of key-value pairs.
18
+ * Preserves comments and blank lines by returning the full lines array too.
19
+ */
20
+ export declare function parseEnvFile(filePath: string): {
21
+ entries: Map<string, string>;
22
+ lines: string[];
23
+ };
24
+ /**
25
+ * Write a key-value pair to the .env file.
26
+ * If the key already exists, update the line; otherwise append.
27
+ */
28
+ export declare function writeEnvValue(filePath: string, key: string, value: string): void;
29
+ export declare function registerConfigCommand(program: Command): void;
30
+ //# sourceMappingURL=config-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/config-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAE5C,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AA4FzE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAcjF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoCzD;AAID;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CA+BhG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAwBhF;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoL5D"}