@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,192 @@
1
+ import { Option } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { getConfig, createLogger, EventType } from '@trading-boy/core';
4
+ import { formatConnectionError } from '../utils.js';
5
+ import { Neo4jClient, getEventsByType, getEventsByDateRange, } from '@trading-boy/graph-db';
6
+ // ─── Logger ───
7
+ const logger = createLogger('cli-catalysts');
8
+ // ─── Neo4j Client Factory ───
9
+ function createNeo4jClient() {
10
+ const config = getConfig();
11
+ return new Neo4jClient({
12
+ uri: config.NEO4J_URI,
13
+ username: config.NEO4J_USER,
14
+ password: config.NEO4J_PASSWORD,
15
+ });
16
+ }
17
+ // ─── Formatters ───
18
+ /**
19
+ * Color-code severity labels.
20
+ */
21
+ function colorSeverity(severity) {
22
+ switch (severity) {
23
+ case 'CRITICAL':
24
+ return chalk.bgRed.white.bold(` ${severity} `);
25
+ case 'HIGH':
26
+ return chalk.red(severity);
27
+ case 'MEDIUM':
28
+ return chalk.yellow(severity);
29
+ case 'LOW':
30
+ return chalk.green(severity);
31
+ default:
32
+ return chalk.dim(severity);
33
+ }
34
+ }
35
+ /**
36
+ * Format a date string to a short display format (YYYY-MM-DD).
37
+ */
38
+ function formatDate(isoString) {
39
+ if (!isoString) {
40
+ return chalk.dim('no date');
41
+ }
42
+ try {
43
+ return new Date(isoString).toISOString().slice(0, 10);
44
+ }
45
+ catch {
46
+ return isoString;
47
+ }
48
+ }
49
+ /**
50
+ * Compute days until a scheduled date.
51
+ */
52
+ function daysUntil(isoString) {
53
+ if (!isoString) {
54
+ return chalk.dim('-');
55
+ }
56
+ try {
57
+ const date = new Date(isoString);
58
+ const now = new Date();
59
+ const diffMs = date.getTime() - now.getTime();
60
+ const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));
61
+ if (diffDays < 0) {
62
+ return chalk.dim(`${diffDays}d ago`);
63
+ }
64
+ if (diffDays === 0) {
65
+ return chalk.red.bold('TODAY');
66
+ }
67
+ if (diffDays <= 3) {
68
+ return chalk.red(`${diffDays}d`);
69
+ }
70
+ if (diffDays <= 7) {
71
+ return chalk.yellow(`${diffDays}d`);
72
+ }
73
+ return chalk.white(`${diffDays}d`);
74
+ }
75
+ catch {
76
+ return chalk.dim('-');
77
+ }
78
+ }
79
+ /**
80
+ * Format the catalysts list output.
81
+ */
82
+ export function formatCatalystsOutput(events) {
83
+ const lines = [];
84
+ lines.push('');
85
+ lines.push(chalk.bold.cyan(' Upcoming Catalysts'));
86
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(100)));
87
+ lines.push('');
88
+ if (events.length === 0) {
89
+ lines.push(` ${chalk.dim('No upcoming catalysts found.')}`);
90
+ lines.push('');
91
+ return lines.join('\n');
92
+ }
93
+ // Header
94
+ lines.push(' ' +
95
+ padRight('Date', 14) +
96
+ padRight('In', 10) +
97
+ padRight('Type', 22) +
98
+ padRight('Severity', 12) +
99
+ padRight('Tokens', 16) +
100
+ 'Title');
101
+ lines.push(' ' + '\u2500'.repeat(100));
102
+ for (const event of events) {
103
+ const date = formatDate(event.scheduledDate);
104
+ const until = daysUntil(event.scheduledDate);
105
+ const severity = colorSeverity(event.severity);
106
+ const tokens = event.tokensAffected
107
+ ? event.tokensAffected.join(', ')
108
+ : '-';
109
+ const title = truncate(event.title, 30);
110
+ lines.push(' ' +
111
+ padRight(date, 14) +
112
+ padRight(until, 10) +
113
+ padRight(event.type, 22) +
114
+ padRight(severity, 12) +
115
+ padRight(tokens, 16) +
116
+ title);
117
+ }
118
+ lines.push('');
119
+ lines.push(` ${chalk.gray(`Total: ${events.length} catalyst(s)`)}`);
120
+ lines.push('');
121
+ return lines.join('\n');
122
+ }
123
+ // ─── Command Registration ───
124
+ export function registerCatalystsCommand(program) {
125
+ program
126
+ .command('catalysts')
127
+ .description('Show upcoming catalysts and events sorted by date')
128
+ .option('--type <type>', `Filter by event type (${Object.values(EventType).join(', ')})`)
129
+ .option('--days <n>', 'Number of days to look ahead', parseIntOption, 30)
130
+ .option('--limit <n>', 'Maximum number of results', parseIntOption, 50)
131
+ .addOption(new Option('--format <format>', 'Output format').choices(['text', 'json']).default('text'))
132
+ .action(async (options) => {
133
+ // Validate event type if provided
134
+ if (options.type && !Object.values(EventType).includes(options.type)) {
135
+ console.error(chalk.red(`Error: Invalid event type "${options.type}". Valid types: ${Object.values(EventType).join(', ')}`));
136
+ process.exitCode = 1;
137
+ return;
138
+ }
139
+ // Validate --days
140
+ if (!Number.isFinite(options.days) || options.days <= 0) {
141
+ console.error(chalk.red('Error: --days must be a positive number'));
142
+ process.exitCode = 1;
143
+ return;
144
+ }
145
+ const client = createNeo4jClient();
146
+ try {
147
+ await client.connect();
148
+ let events;
149
+ if (options.type) {
150
+ // Filter by specific type
151
+ events = await getEventsByType(client, options.type, {
152
+ limit: options.limit,
153
+ });
154
+ }
155
+ else {
156
+ // Date range query: now to N days from now
157
+ const now = new Date();
158
+ const endDate = new Date(now.getTime() + options.days * 24 * 60 * 60 * 1000);
159
+ events = await getEventsByDateRange(client, now.toISOString(), endDate.toISOString(), { limit: options.limit });
160
+ }
161
+ if (options.format === 'json') {
162
+ console.log(JSON.stringify(events, null, 2));
163
+ }
164
+ else {
165
+ console.log(formatCatalystsOutput(events));
166
+ }
167
+ }
168
+ catch (error) {
169
+ const message = error instanceof Error ? error.message : String(error);
170
+ logger.error({ error: message }, 'Failed to fetch catalysts');
171
+ console.error(chalk.red(`Error: ${message}`));
172
+ const guidance = formatConnectionError(message);
173
+ if (guidance)
174
+ console.error(guidance);
175
+ process.exitCode = 1;
176
+ }
177
+ finally {
178
+ await client.disconnect();
179
+ }
180
+ });
181
+ }
182
+ // ─── Helpers ───
183
+ function padRight(str, len) {
184
+ return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
185
+ }
186
+ function truncate(str, maxLen) {
187
+ return str.length > maxLen ? str.slice(0, maxLen - 3) + '...' : str;
188
+ }
189
+ function parseIntOption(value) {
190
+ return parseInt(value, 10);
191
+ }
192
+ //# 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,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,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAsFzE;;;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,CA4D5D"}
@@ -0,0 +1,265 @@
1
+ import chalk from 'chalk';
2
+ import { getConfig, createLogger } from '@trading-boy/core';
3
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
4
+ import { resolve } from 'node:path';
5
+ // ─── Logger ───
6
+ const logger = createLogger('cli-config');
7
+ // ─── Sensitive Keys ───
8
+ /** Keys whose values should be redacted in `config show` output. */
9
+ const SENSITIVE_KEYS = new Set([
10
+ 'NEO4J_PASSWORD',
11
+ 'TIMESCALE_PASSWORD',
12
+ 'REDIS_PASSWORD',
13
+ 'HELIUS_API_KEY',
14
+ 'COINGECKO_API_KEY',
15
+ 'ALCHEMY_API_KEY',
16
+ 'GLASSNODE_API_KEY',
17
+ 'TWITTER_BEARER_TOKEN',
18
+ 'ANTHROPIC_API_KEY',
19
+ 'LLM_API_KEY',
20
+ 'LLM_FALLBACK_API_KEY',
21
+ 'BELIEF_HMAC_KEY',
22
+ 'STRIPE_SECRET_KEY',
23
+ 'STRIPE_WEBHOOK_SECRET',
24
+ 'TELEGRAM_BOT_TOKEN',
25
+ 'RESEND_API_KEY',
26
+ 'SMTP_PASS',
27
+ 'API_KEY_HASHES',
28
+ ]);
29
+ /** Valid config keys (from the Zod schema). */
30
+ const VALID_KEYS = [
31
+ 'NODE_ENV',
32
+ 'LOG_LEVEL',
33
+ 'NEO4J_URI',
34
+ 'NEO4J_USER',
35
+ 'NEO4J_PASSWORD',
36
+ 'TIMESCALE_HOST',
37
+ 'TIMESCALE_PORT',
38
+ 'TIMESCALE_USER',
39
+ 'TIMESCALE_PASSWORD',
40
+ 'TIMESCALE_DB',
41
+ 'REDIS_URL',
42
+ 'REDIS_PASSWORD',
43
+ 'HELIUS_API_KEY',
44
+ 'COINGECKO_API_KEY',
45
+ 'ALCHEMY_API_KEY',
46
+ 'GLASSNODE_API_KEY',
47
+ 'TWITTER_BEARER_TOKEN',
48
+ 'ANTHROPIC_API_KEY',
49
+ 'LLM_PROVIDER',
50
+ 'LLM_API_KEY',
51
+ 'LLM_BASE_URL',
52
+ 'LLM_MODEL',
53
+ 'LLM_FALLBACK_PROVIDER',
54
+ 'LLM_FALLBACK_MODEL',
55
+ 'LLM_FALLBACK_API_KEY',
56
+ 'LLM_MAX_RETRIES',
57
+ 'LLM_TIMEOUT_MS',
58
+ 'BELIEF_HMAC_KEY',
59
+ 'ENABLE_LLM',
60
+ 'ENABLE_LEARNING',
61
+ 'ENABLE_SOCIAL',
62
+ 'API_PORT',
63
+ 'TELEGRAM_BOT_TOKEN',
64
+ 'TELEGRAM_ALLOWED_CHAT_IDS',
65
+ 'RESEND_API_KEY',
66
+ 'EMAIL_FROM_ADDRESS',
67
+ 'EMAIL_FROM_NAME',
68
+ 'SMTP_HOST',
69
+ 'SMTP_PORT',
70
+ 'SMTP_USER',
71
+ 'SMTP_PASS',
72
+ 'NOTIFICATION_FROM_EMAIL',
73
+ 'STRIPE_SECRET_KEY',
74
+ 'STRIPE_WEBHOOK_SECRET',
75
+ 'STRIPE_PRICE_ID',
76
+ 'APP_URL',
77
+ 'API_KEY_HASHES',
78
+ 'API_KEY_AUTH_ENABLED',
79
+ ];
80
+ // ─── Formatters ───
81
+ /**
82
+ * Redact a config value if it's a sensitive key.
83
+ * Shows first 3 chars + '****' for non-empty sensitive values.
84
+ */
85
+ export function redactValue(key, value) {
86
+ const strValue = String(value);
87
+ if (!SENSITIVE_KEYS.has(key)) {
88
+ return strValue;
89
+ }
90
+ // Empty values shown as placeholder
91
+ if (strValue === '') {
92
+ return chalk.dim('(empty)');
93
+ }
94
+ // Redact: show first 3 chars + ****
95
+ if (strValue.length <= 3) {
96
+ return '****';
97
+ }
98
+ return strValue.slice(0, 3) + '****';
99
+ }
100
+ /**
101
+ * Format the full config for display.
102
+ */
103
+ export function formatConfigOutput(config) {
104
+ const lines = [];
105
+ lines.push('');
106
+ lines.push(chalk.bold.cyan(' Configuration'));
107
+ lines.push(chalk.gray(' ' + '\u2500'.repeat(60)));
108
+ lines.push('');
109
+ // Group config keys by category
110
+ const groups = [
111
+ { name: 'Runtime', keys: ['NODE_ENV', 'LOG_LEVEL'] },
112
+ { name: 'Neo4j', keys: ['NEO4J_URI', 'NEO4J_USER', 'NEO4J_PASSWORD'] },
113
+ { name: 'TimescaleDB', keys: ['TIMESCALE_HOST', 'TIMESCALE_PORT', 'TIMESCALE_USER', 'TIMESCALE_PASSWORD', 'TIMESCALE_DB'] },
114
+ { name: 'Redis', keys: ['REDIS_URL', 'REDIS_PASSWORD'] },
115
+ { name: 'Data Sources', keys: ['HELIUS_API_KEY', 'COINGECKO_API_KEY', 'ALCHEMY_API_KEY', 'GLASSNODE_API_KEY', 'TWITTER_BEARER_TOKEN'] },
116
+ { name: 'AI / LLM', keys: ['ANTHROPIC_API_KEY', 'LLM_PROVIDER', 'LLM_API_KEY', 'LLM_BASE_URL', 'LLM_MODEL', 'LLM_FALLBACK_PROVIDER', 'LLM_FALLBACK_MODEL', 'LLM_FALLBACK_API_KEY', 'LLM_MAX_RETRIES', 'LLM_TIMEOUT_MS', 'ENABLE_LLM'] },
117
+ { name: 'Learning', keys: ['BELIEF_HMAC_KEY', 'ENABLE_LEARNING', 'ENABLE_SOCIAL'] },
118
+ { name: 'API', keys: ['API_PORT', 'API_KEY_HASHES', 'API_KEY_AUTH_ENABLED'] },
119
+ { name: 'Billing', keys: ['STRIPE_SECRET_KEY', 'STRIPE_WEBHOOK_SECRET', 'STRIPE_PRICE_ID', 'APP_URL'] },
120
+ { name: 'Telegram', keys: ['TELEGRAM_BOT_TOKEN', 'TELEGRAM_ALLOWED_CHAT_IDS'] },
121
+ { name: 'Email', keys: ['RESEND_API_KEY', 'EMAIL_FROM_ADDRESS', 'EMAIL_FROM_NAME', 'SMTP_HOST', 'SMTP_PORT', 'SMTP_USER', 'SMTP_PASS', 'NOTIFICATION_FROM_EMAIL'] },
122
+ ];
123
+ const configRecord = config;
124
+ for (const group of groups) {
125
+ lines.push(chalk.bold(` ${group.name}`));
126
+ for (const key of group.keys) {
127
+ const value = configRecord[key];
128
+ const displayValue = value !== undefined ? redactValue(key, value) : chalk.dim('(not set)');
129
+ lines.push(` ${chalk.gray(padRight(key, 26))} ${displayValue}`);
130
+ }
131
+ lines.push('');
132
+ }
133
+ return lines.join('\n');
134
+ }
135
+ // ─── .env File Operations ───
136
+ /**
137
+ * Resolve the .env file path from the project root.
138
+ */
139
+ export function resolveEnvPath() {
140
+ return resolve(process.cwd(), '.env');
141
+ }
142
+ /**
143
+ * Parse a .env file into a Map of key-value pairs.
144
+ * Preserves comments and blank lines by returning the full lines array too.
145
+ */
146
+ export function parseEnvFile(filePath) {
147
+ const entries = new Map();
148
+ const lines = [];
149
+ if (!existsSync(filePath)) {
150
+ return { entries, lines };
151
+ }
152
+ const content = readFileSync(filePath, 'utf-8');
153
+ const rawLines = content.split('\n');
154
+ for (const line of rawLines) {
155
+ lines.push(line);
156
+ const trimmed = line.trim();
157
+ // Skip comments and empty lines
158
+ if (trimmed === '' || trimmed.startsWith('#')) {
159
+ continue;
160
+ }
161
+ const eqIndex = trimmed.indexOf('=');
162
+ if (eqIndex > 0) {
163
+ const key = trimmed.slice(0, eqIndex).trim();
164
+ let value = trimmed.slice(eqIndex + 1).trim();
165
+ // Remove surrounding quotes if present
166
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
167
+ value = value.slice(1, -1);
168
+ }
169
+ entries.set(key, value);
170
+ }
171
+ }
172
+ return { entries, lines };
173
+ }
174
+ /**
175
+ * Write a key-value pair to the .env file.
176
+ * If the key already exists, update the line; otherwise append.
177
+ */
178
+ export function writeEnvValue(filePath, key, value) {
179
+ const { entries, lines } = parseEnvFile(filePath);
180
+ if (entries.has(key)) {
181
+ // Update existing line
182
+ const updatedLines = lines.map((line) => {
183
+ const trimmed = line.trim();
184
+ if (trimmed.startsWith('#') || trimmed === '')
185
+ return line;
186
+ const eqIndex = trimmed.indexOf('=');
187
+ if (eqIndex > 0) {
188
+ const lineKey = trimmed.slice(0, eqIndex).trim();
189
+ if (lineKey === key) {
190
+ return `${key}=${value}`;
191
+ }
192
+ }
193
+ return line;
194
+ });
195
+ writeFileSync(filePath, updatedLines.join('\n'));
196
+ }
197
+ else {
198
+ // Append to end of file
199
+ const existing = existsSync(filePath) ? readFileSync(filePath, 'utf-8') : '';
200
+ const separator = existing.endsWith('\n') || existing === '' ? '' : '\n';
201
+ writeFileSync(filePath, existing + separator + `${key}=${value}\n`);
202
+ }
203
+ }
204
+ // ─── Command Registration ───
205
+ export function registerConfigCommand(program) {
206
+ const configCmd = program
207
+ .command('config')
208
+ .description('Configuration management commands');
209
+ // ─── config show ───
210
+ configCmd
211
+ .command('show')
212
+ .description('Display current configuration (sensitive values redacted)')
213
+ .action(() => {
214
+ try {
215
+ const config = getConfig();
216
+ console.log(formatConfigOutput(config));
217
+ }
218
+ catch (error) {
219
+ const message = error instanceof Error ? error.message : String(error);
220
+ logger.error({ error: message }, 'Failed to load config');
221
+ console.error(chalk.red(`Error: ${message}`));
222
+ process.exitCode = 1;
223
+ }
224
+ });
225
+ // ─── config set ───
226
+ configCmd
227
+ .command('set <key> <value>')
228
+ .description('Set a config value in the .env file')
229
+ .action((key, value) => {
230
+ try {
231
+ // Validate key
232
+ if (!VALID_KEYS.includes(key)) {
233
+ console.error(chalk.red(`Error: Unknown config key "${key}".`));
234
+ console.error(chalk.dim(`Valid keys: ${VALID_KEYS.join(', ')}`));
235
+ process.exitCode = 1;
236
+ return;
237
+ }
238
+ const envPath = resolveEnvPath();
239
+ writeEnvValue(envPath, key, value);
240
+ console.log('');
241
+ console.log(chalk.green(` Config updated: ${key}`));
242
+ if (SENSITIVE_KEYS.has(key)) {
243
+ console.log(` ${chalk.gray('Value:')} ${redactValue(key, value)}`);
244
+ }
245
+ else {
246
+ console.log(` ${chalk.gray('Value:')} ${value}`);
247
+ }
248
+ console.log(` ${chalk.gray('File:')} ${envPath}`);
249
+ console.log('');
250
+ console.log(chalk.dim(' Note: Restart services for changes to take effect.'));
251
+ console.log('');
252
+ }
253
+ catch (error) {
254
+ const message = error instanceof Error ? error.message : String(error);
255
+ logger.error({ error: message }, 'Failed to set config');
256
+ console.error(chalk.red(`Error: ${message}`));
257
+ process.exitCode = 1;
258
+ }
259
+ });
260
+ }
261
+ // ─── Helpers ───
262
+ function padRight(str, len) {
263
+ return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
264
+ }
265
+ //# sourceMappingURL=config-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-cmd.js","sourceRoot":"","sources":["../../src/commands/config-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Command } from 'commander';
2
+ import type { AssembledContextPackage, MarketData, OnchainData, DefiRiskProfile, Catalysts, SocialContext, Synthesis, ContextMeta } from '@trading-boy/core';
3
+ /**
4
+ * Format the market section of a ContextPackage.
5
+ */
6
+ export declare function formatMarketSection(market: MarketData | null): string;
7
+ /**
8
+ * Format the onchain section of a ContextPackage.
9
+ */
10
+ export declare function formatOnchainSection(onchain: OnchainData | null): string;
11
+ /**
12
+ * Format the DeFi risk section of a ContextPackage.
13
+ */
14
+ export declare function formatRiskSection(defiRisk: DefiRiskProfile | null): string;
15
+ /**
16
+ * Format the catalysts section of a ContextPackage.
17
+ */
18
+ export declare function formatCatalystsSection(catalysts: Catalysts | null): string;
19
+ /**
20
+ * Format the social section of a ContextPackage.
21
+ */
22
+ export declare function formatSocialSection(social: SocialContext | null): string;
23
+ /**
24
+ * Format the synthesis section of a ContextPackage.
25
+ */
26
+ export declare function formatSynthesisSection(synthesis: Synthesis | null): string;
27
+ /**
28
+ * Format the _meta section of a ContextPackage.
29
+ */
30
+ export declare function formatMetaSection(meta: ContextMeta): string;
31
+ /**
32
+ * Format a full AssembledContextPackage for colored terminal output.
33
+ */
34
+ export declare function formatContextOutput(pkg: AssembledContextPackage): string;
35
+ /**
36
+ * Execute assembleContext and return the full package.
37
+ */
38
+ export declare function executeContext(symbol: string): Promise<AssembledContextPackage>;
39
+ export declare function registerContextCommand(program: Command): void;
40
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAG5C,OAAO,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAwF7J;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,CAiCrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CA8BxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,CA6B1E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAuC1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAoCxE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAoC1E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAwB3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,uBAAuB,GAAG,MAAM,CAiCxE;AAID;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAwBrF;AAID,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuB7D"}