@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,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 (non-interactive mode for CI/CD)')
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
91
+ const { default: ora } = await import('ora');
92
+ const spinner = ora(' 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,EAAE,MAAM,WAAW,CAAC;AAgDpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkV/D"}
@@ -0,0 +1,336 @@
1
+ import { getConfig, createLogger, NarrativeStatus, } from '@trading-boy/core';
2
+ import { Neo4jClient, createNarrative, updateNarrative, listNarratives, linkTokenToNarrative, unlinkTokenFromNarrative, getNarrativeByName, getNarrativeTokens, getBatchNarrativeTokens, } from '@trading-boy/graph-db';
3
+ import { formatConnectionError } from '../utils.js';
4
+ // ─── Logger ───
5
+ const logger = createLogger('cli-narratives');
6
+ // ─── Neo4j Client Factory ───
7
+ function createNeo4jClient() {
8
+ const config = getConfig();
9
+ return new Neo4jClient({
10
+ uri: config.NEO4J_URI,
11
+ username: config.NEO4J_USER,
12
+ password: config.NEO4J_PASSWORD,
13
+ });
14
+ }
15
+ // ─── Helpers ───
16
+ function padRight(str, len) {
17
+ return str.length >= len ? str.slice(0, len) : str + ' '.repeat(len - str.length);
18
+ }
19
+ function truncate(str, maxLen) {
20
+ return str.length > maxLen ? str.slice(0, maxLen - 3) + '...' : str;
21
+ }
22
+ const VALID_STATUSES = Object.values(NarrativeStatus);
23
+ // ─── Command Registration ───
24
+ export function registerNarrativeCommand(program) {
25
+ const narrative = program
26
+ .command('narrative')
27
+ .description('Manage market narratives');
28
+ // ─── narrative create ───
29
+ narrative
30
+ .command('create <name>')
31
+ .description('Create a new narrative')
32
+ .option('--status <status>', `Initial status (${VALID_STATUSES.join(', ')})`, 'EMERGING')
33
+ .option('--momentum <score>', 'Momentum score (0-100)', parseFloat, 0)
34
+ .option('--description <desc>', 'Narrative description')
35
+ .action(async (name, options) => {
36
+ // Validate non-empty name
37
+ if (!name.trim()) {
38
+ console.error('Error: Narrative name cannot be empty');
39
+ process.exitCode = 1;
40
+ return;
41
+ }
42
+ // Validate status
43
+ if (!VALID_STATUSES.includes(options.status)) {
44
+ console.error(`Error: Invalid status "${options.status}". Valid values: ${VALID_STATUSES.join(', ')}`);
45
+ process.exitCode = 1;
46
+ return;
47
+ }
48
+ // Validate momentum
49
+ if (isNaN(options.momentum) || options.momentum < 0 || options.momentum > 100) {
50
+ console.error('Error: Momentum score must be a number between 0 and 100');
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ const client = createNeo4jClient();
55
+ try {
56
+ await client.connect();
57
+ // Check for duplicate name
58
+ const existing = await getNarrativeByName(client, name.trim());
59
+ if (existing) {
60
+ console.error(`Error: Narrative "${name.trim()}" already exists (id=${existing.id}). Use "narrative update" to modify it.`);
61
+ process.exitCode = 1;
62
+ return;
63
+ }
64
+ const { id } = await createNarrative(client, {
65
+ name,
66
+ status: options.status,
67
+ momentumScore: options.momentum,
68
+ description: options.description,
69
+ });
70
+ logger.info({ id, name }, 'Narrative created');
71
+ console.log(`Narrative created: id=${id}`);
72
+ console.log(` Name: ${name}`);
73
+ console.log(` Status: ${options.status}`);
74
+ console.log(` Momentum: ${options.momentum}`);
75
+ if (options.description) {
76
+ console.log(` Description: ${options.description}`);
77
+ }
78
+ }
79
+ catch (error) {
80
+ const message = error instanceof Error ? error.message : String(error);
81
+ logger.error({ error: message }, 'Failed to create narrative');
82
+ console.error(`Error: ${message}`);
83
+ const guidance = formatConnectionError(message);
84
+ if (guidance)
85
+ console.error(guidance);
86
+ process.exitCode = 1;
87
+ }
88
+ finally {
89
+ await client.disconnect();
90
+ }
91
+ });
92
+ // ─── narrative update ───
93
+ narrative
94
+ .command('update <name>')
95
+ .description('Update an existing narrative')
96
+ .option('--status <status>', `New status (${VALID_STATUSES.join(', ')})`)
97
+ .option('--momentum <score>', 'New momentum score (0-100)', parseFloat)
98
+ .option('--description <desc>', 'New description')
99
+ .action(async (name, options) => {
100
+ // Validate status if provided
101
+ if (options.status && !VALID_STATUSES.includes(options.status)) {
102
+ console.error(`Error: Invalid status "${options.status}". Valid values: ${VALID_STATUSES.join(', ')}`);
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ // Validate momentum if provided
107
+ if (options.momentum !== undefined && (isNaN(options.momentum) || options.momentum < 0 || options.momentum > 100)) {
108
+ console.error('Error: Momentum score must be a number between 0 and 100');
109
+ process.exitCode = 1;
110
+ return;
111
+ }
112
+ // Must provide at least one update
113
+ if (!options.status && options.momentum === undefined && !options.description) {
114
+ console.error('Error: At least one of --status, --momentum, or --description must be provided');
115
+ process.exitCode = 1;
116
+ return;
117
+ }
118
+ const client = createNeo4jClient();
119
+ try {
120
+ await client.connect();
121
+ const result = await updateNarrative(client, name, {
122
+ status: options.status,
123
+ momentumScore: options.momentum,
124
+ description: options.description,
125
+ });
126
+ logger.info({ name }, 'Narrative updated');
127
+ console.log(`Narrative updated: ${name}`);
128
+ console.log(` Status: ${result.status}`);
129
+ console.log(` Momentum: ${result.momentumScore}`);
130
+ if (result.description) {
131
+ console.log(` Description: ${result.description}`);
132
+ }
133
+ }
134
+ catch (error) {
135
+ const message = error instanceof Error ? error.message : String(error);
136
+ logger.error({ error: message }, 'Failed to update narrative');
137
+ console.error(`Error: ${message}`);
138
+ const guidance = formatConnectionError(message);
139
+ if (guidance)
140
+ console.error(guidance);
141
+ process.exitCode = 1;
142
+ }
143
+ finally {
144
+ await client.disconnect();
145
+ }
146
+ });
147
+ // ─── narrative list ───
148
+ narrative
149
+ .command('list')
150
+ .description('List narratives')
151
+ .option('--status <status>', 'Filter by status')
152
+ .option('--limit <n>', 'Maximum number of results', parseInt, 20)
153
+ .action(async (options) => {
154
+ // Validate status if provided
155
+ if (options.status && !VALID_STATUSES.includes(options.status)) {
156
+ console.error(`Error: Invalid status "${options.status}". Valid values: ${VALID_STATUSES.join(', ')}`);
157
+ process.exitCode = 1;
158
+ return;
159
+ }
160
+ const client = createNeo4jClient();
161
+ try {
162
+ await client.connect();
163
+ const records = await listNarratives(client, {
164
+ status: options.status,
165
+ limit: options.limit,
166
+ });
167
+ if (records.length === 0) {
168
+ console.log('No narratives found.');
169
+ return;
170
+ }
171
+ // Fetch tokens for all narratives in a single batch query
172
+ const tokenMap = await getBatchNarrativeTokens(client, records.map((n) => n.name));
173
+ const narrativesWithTokens = records.map((n) => ({
174
+ ...n,
175
+ tokens: tokenMap.get(n.name) ?? [],
176
+ }));
177
+ // Print formatted table
178
+ console.log('');
179
+ console.log(padRight('Name', 25) +
180
+ padRight('Status', 12) +
181
+ padRight('Momentum', 10) +
182
+ padRight('Tokens', 8) +
183
+ padRight('Token List', 40));
184
+ console.log('-'.repeat(95));
185
+ for (const n of narrativesWithTokens) {
186
+ const tokenList = n.tokens.length > 0
187
+ ? n.tokens.map((t) => `${t.tokenSymbol}(${(t.confidence * 100).toFixed(0)}%)`).join(', ')
188
+ : '-';
189
+ console.log(padRight(truncate(n.name, 23), 25) +
190
+ padRight(n.status, 12) +
191
+ padRight(String(n.momentumScore), 10) +
192
+ padRight(String(n.tokens.length), 8) +
193
+ truncate(tokenList, 40));
194
+ }
195
+ console.log('');
196
+ console.log(`Total: ${records.length} narrative(s)`);
197
+ }
198
+ catch (error) {
199
+ const message = error instanceof Error ? error.message : String(error);
200
+ logger.error({ error: message }, 'Failed to list narratives');
201
+ console.error(`Error: ${message}`);
202
+ const guidance = formatConnectionError(message);
203
+ if (guidance)
204
+ console.error(guidance);
205
+ process.exitCode = 1;
206
+ }
207
+ finally {
208
+ await client.disconnect();
209
+ }
210
+ });
211
+ // ─── narrative link ───
212
+ narrative
213
+ .command('link <token> <narrative>')
214
+ .description('Link a token to a narrative')
215
+ .option('--confidence <score>', 'Confidence score (0-1)', parseFloat, 0.5)
216
+ .action(async (token, narrativeName, options) => {
217
+ // Validate confidence
218
+ if (isNaN(options.confidence) || options.confidence < 0 || options.confidence > 1) {
219
+ console.error('Error: Confidence must be a number between 0 and 1');
220
+ process.exitCode = 1;
221
+ return;
222
+ }
223
+ const client = createNeo4jClient();
224
+ try {
225
+ await client.connect();
226
+ await linkTokenToNarrative(client, token, narrativeName, options.confidence);
227
+ logger.info({ token, narrativeName, confidence: options.confidence }, 'Token linked to narrative');
228
+ console.log(`Linked ${token.toUpperCase()} to "${narrativeName}" with confidence ${options.confidence}`);
229
+ }
230
+ catch (error) {
231
+ const message = error instanceof Error ? error.message : String(error);
232
+ logger.error({ error: message }, 'Failed to link token to narrative');
233
+ console.error(`Error: ${message}`);
234
+ const guidance = formatConnectionError(message);
235
+ if (guidance)
236
+ console.error(guidance);
237
+ process.exitCode = 1;
238
+ }
239
+ finally {
240
+ await client.disconnect();
241
+ }
242
+ });
243
+ // ─── narrative unlink ───
244
+ narrative
245
+ .command('unlink <token> <narrative>')
246
+ .description('Unlink a token from a narrative')
247
+ .action(async (token, narrativeName) => {
248
+ const client = createNeo4jClient();
249
+ try {
250
+ await client.connect();
251
+ // Verify narrative exists
252
+ const existing = await getNarrativeByName(client, narrativeName);
253
+ if (!existing) {
254
+ console.error(`Error: Narrative "${narrativeName}" not found`);
255
+ process.exitCode = 1;
256
+ return;
257
+ }
258
+ // Verify token is linked to this narrative
259
+ const tokens = await getNarrativeTokens(client, narrativeName);
260
+ const isLinked = tokens.some((t) => t.tokenSymbol.toUpperCase() === token.toUpperCase());
261
+ if (!isLinked) {
262
+ console.error(`Error: ${token.toUpperCase()} is not linked to "${narrativeName}"`);
263
+ process.exitCode = 1;
264
+ return;
265
+ }
266
+ await unlinkTokenFromNarrative(client, token, narrativeName);
267
+ logger.info({ token, narrativeName }, 'Token unlinked from narrative');
268
+ console.log(`Unlinked ${token.toUpperCase()} from "${narrativeName}"`);
269
+ }
270
+ catch (error) {
271
+ const message = error instanceof Error ? error.message : String(error);
272
+ logger.error({ error: message }, 'Failed to unlink token from narrative');
273
+ console.error(`Error: ${message}`);
274
+ const guidance = formatConnectionError(message);
275
+ if (guidance)
276
+ console.error(guidance);
277
+ process.exitCode = 1;
278
+ }
279
+ finally {
280
+ await client.disconnect();
281
+ }
282
+ });
283
+ // ─── narrative show ───
284
+ narrative
285
+ .command('show <name>')
286
+ .description('Show narrative details with linked tokens')
287
+ .action(async (name) => {
288
+ const client = createNeo4jClient();
289
+ try {
290
+ await client.connect();
291
+ const record = await getNarrativeByName(client, name);
292
+ if (!record) {
293
+ console.error(`Error: Narrative "${name}" not found`);
294
+ process.exitCode = 1;
295
+ return;
296
+ }
297
+ const tokens = await getNarrativeTokens(client, name);
298
+ console.log('');
299
+ console.log(`Narrative: ${record.name}`);
300
+ console.log(` ID: ${record.id}`);
301
+ console.log(` Status: ${record.status}`);
302
+ console.log(` Momentum: ${record.momentumScore}`);
303
+ if (record.description) {
304
+ console.log(` Description: ${record.description}`);
305
+ }
306
+ console.log(` First Detected: ${record.firstDetected}`);
307
+ if (record.peakDate) {
308
+ console.log(` Peak Date: ${record.peakDate}`);
309
+ }
310
+ if (tokens.length > 0) {
311
+ console.log('');
312
+ console.log(' Linked Tokens:');
313
+ for (const t of tokens) {
314
+ console.log(` ${t.tokenSymbol} (${t.tokenName}) — confidence: ${(t.confidence * 100).toFixed(0)}%`);
315
+ }
316
+ }
317
+ else {
318
+ console.log('');
319
+ console.log(' No linked tokens.');
320
+ }
321
+ }
322
+ catch (error) {
323
+ const message = error instanceof Error ? error.message : String(error);
324
+ logger.error({ error: message }, 'Failed to show narrative');
325
+ console.error(`Error: ${message}`);
326
+ const guidance = formatConnectionError(message);
327
+ if (guidance)
328
+ console.error(guidance);
329
+ process.exitCode = 1;
330
+ }
331
+ finally {
332
+ await client.disconnect();
333
+ }
334
+ });
335
+ }
336
+ //# sourceMappingURL=narratives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narratives.js","sourceRoot":"","sources":["../../src/commands/narratives.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { Command } from 'commander';
2
+ import { Neo4jClient } from '@trading-boy/graph-db';
3
+ import { TimescaleClient } from '@trading-boy/timeseries-db';
4
+ interface TokenInfo {
5
+ name: string | null;
6
+ symbol: string;
7
+ chains: string[];
8
+ narratives: Array<{
9
+ name: string;
10
+ status: string;
11
+ }>;
12
+ }
13
+ interface PriceInfo {
14
+ price: number | null;
15
+ change24h: number | null;
16
+ lastUpdated: Date | null;
17
+ }
18
+ interface FundingInfo {
19
+ fundingRate: number | null;
20
+ lastUpdated: Date | null;
21
+ }
22
+ interface WhaleInfo {
23
+ count: number;
24
+ }
25
+ export interface QueryResult {
26
+ token: TokenInfo;
27
+ price: PriceInfo;
28
+ funding: FundingInfo;
29
+ whaleActivity: WhaleInfo;
30
+ }
31
+ export declare function fetchTokenInfo(neo4j: Neo4jClient, symbol: string): Promise<TokenInfo>;
32
+ export declare function fetchPriceInfo(timescale: TimescaleClient, symbol: string): Promise<PriceInfo>;
33
+ export declare function fetchFundingInfo(timescale: TimescaleClient, symbol: string): Promise<FundingInfo>;
34
+ export declare function fetchWhaleActivity(neo4j: Neo4jClient, symbol: string): Promise<WhaleInfo>;
35
+ export declare function formatQueryOutput(result: QueryResult): string;
36
+ export declare function executeQuery(symbol: string): Promise<QueryResult>;
37
+ export declare function registerQueryCommand(program: Command): void;
38
+ export {};
39
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AA+B7D,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAED,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,SAAS,CAAC;CAC1B;AAID,wBAAsB,cAAc,CAClC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,CAAC,CAmCpB;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,CAAC,CAkCpB;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAiBtB;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,CAAC,CAgBpB;AAID,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAoE7D;AAID,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2BvE;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB3D"}