@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,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 @@
|
|
|
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 @@
|
|
|
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"}
|