@truenorth-ai/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 +212 -0
- package/bin/truenorth.js +2 -0
- package/dist/api/client.d.ts +4 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +34 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/tools.d.ts +4 -0
- package/dist/api/tools.d.ts.map +1 -0
- package/dist/api/tools.js +25 -0
- package/dist/api/tools.js.map +1 -0
- package/dist/commands/call.d.ts +3 -0
- package/dist/commands/call.d.ts.map +1 -0
- package/dist/commands/call.js +27 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/defi.d.ts +3 -0
- package/dist/commands/defi.d.ts.map +1 -0
- package/dist/commands/defi.js +47 -0
- package/dist/commands/defi.js.map +1 -0
- package/dist/commands/derivatives.d.ts +3 -0
- package/dist/commands/derivatives.d.ts.map +1 -0
- package/dist/commands/derivatives.js +27 -0
- package/dist/commands/derivatives.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 +28 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/kol.d.ts +3 -0
- package/dist/commands/kol.d.ts.map +1 -0
- package/dist/commands/kol.js +66 -0
- package/dist/commands/kol.js.map +1 -0
- package/dist/commands/market-info.d.ts +3 -0
- package/dist/commands/market-info.d.ts.map +1 -0
- package/dist/commands/market-info.js +27 -0
- package/dist/commands/market-info.js.map +1 -0
- package/dist/commands/meme.d.ts +3 -0
- package/dist/commands/meme.d.ts.map +1 -0
- package/dist/commands/meme.js +108 -0
- package/dist/commands/meme.js.map +1 -0
- package/dist/commands/perps.d.ts +3 -0
- package/dist/commands/perps.d.ts.map +1 -0
- package/dist/commands/perps.js +36 -0
- package/dist/commands/perps.js.map +1 -0
- package/dist/commands/polymarket.d.ts +3 -0
- package/dist/commands/polymarket.d.ts.map +1 -0
- package/dist/commands/polymarket.js +32 -0
- package/dist/commands/polymarket.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +27 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +66 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/technical.d.ts +3 -0
- package/dist/commands/technical.d.ts.map +1 -0
- package/dist/commands/technical.js +55 -0
- package/dist/commands/technical.js.map +1 -0
- package/dist/commands/tools.d.ts +3 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +68 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/trending.d.ts +3 -0
- package/dist/commands/trending.d.ts.map +1 -0
- package/dist/commands/trending.js +31 -0
- package/dist/commands/trending.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +20 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +221 -0
- package/dist/utils.js.map +1 -0
- package/package.json +48 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { select, input } from "@inquirer/prompts";
|
|
4
|
+
import { loadConfig, saveConfig } from "./config.js";
|
|
5
|
+
import { registerToolsCommand } from "./commands/tools.js";
|
|
6
|
+
import { registerCallCommand } from "./commands/call.js";
|
|
7
|
+
import { registerTechnicalCommand } from "./commands/technical.js";
|
|
8
|
+
import { registerMarketInfoCommand } from "./commands/market-info.js";
|
|
9
|
+
import { registerDerivativesCommand } from "./commands/derivatives.js";
|
|
10
|
+
import { registerEventsCommand } from "./commands/events.js";
|
|
11
|
+
import { registerPerpsCommand } from "./commands/perps.js";
|
|
12
|
+
import { registerDefiCommand } from "./commands/defi.js";
|
|
13
|
+
import { registerSearchCommand } from "./commands/search.js";
|
|
14
|
+
const program = new Command();
|
|
15
|
+
program
|
|
16
|
+
.name("tn")
|
|
17
|
+
.description("TrueNorth CLI — crypto analysis tools in your terminal")
|
|
18
|
+
.version("0.1.0");
|
|
19
|
+
// Register all commands
|
|
20
|
+
registerToolsCommand(program);
|
|
21
|
+
registerCallCommand(program);
|
|
22
|
+
registerTechnicalCommand(program);
|
|
23
|
+
registerMarketInfoCommand(program);
|
|
24
|
+
registerDerivativesCommand(program);
|
|
25
|
+
registerEventsCommand(program);
|
|
26
|
+
registerPerpsCommand(program);
|
|
27
|
+
registerDefiCommand(program);
|
|
28
|
+
registerSearchCommand(program);
|
|
29
|
+
// ── config command ───────────────────────────────────────────────────
|
|
30
|
+
program
|
|
31
|
+
.command("config")
|
|
32
|
+
.description("Configure CLI settings")
|
|
33
|
+
.action(async () => {
|
|
34
|
+
const config = loadConfig();
|
|
35
|
+
const action = await select({
|
|
36
|
+
message: "What would you like to configure?",
|
|
37
|
+
choices: [
|
|
38
|
+
{ name: `API Base URL (${chalk.dim(config.baseUrl)})`, value: "baseUrl" },
|
|
39
|
+
{ name: `Default Timeframe (${chalk.dim(config.defaultTimeframe)})`, value: "defaultTimeframe" },
|
|
40
|
+
{ name: `Default Limit (${chalk.dim(String(config.defaultLimit))})`, value: "defaultLimit" },
|
|
41
|
+
{ name: "Exit", value: "exit" },
|
|
42
|
+
],
|
|
43
|
+
});
|
|
44
|
+
if (action === "exit")
|
|
45
|
+
return;
|
|
46
|
+
if (action === "baseUrl") {
|
|
47
|
+
const value = await input({ message: "API Base URL:", default: config.baseUrl });
|
|
48
|
+
saveConfig({ baseUrl: value });
|
|
49
|
+
console.log(chalk.green("Updated baseUrl."));
|
|
50
|
+
}
|
|
51
|
+
else if (action === "defaultTimeframe") {
|
|
52
|
+
const value = await select({
|
|
53
|
+
message: "Default timeframe:",
|
|
54
|
+
choices: [
|
|
55
|
+
{ name: "1h", value: "1h" },
|
|
56
|
+
{ name: "4h", value: "4h" },
|
|
57
|
+
{ name: "1d", value: "1d" },
|
|
58
|
+
{ name: "1w", value: "1w" },
|
|
59
|
+
],
|
|
60
|
+
});
|
|
61
|
+
saveConfig({ defaultTimeframe: value });
|
|
62
|
+
console.log(chalk.green("Updated defaultTimeframe."));
|
|
63
|
+
}
|
|
64
|
+
else if (action === "defaultLimit") {
|
|
65
|
+
const value = await input({ message: "Default limit:", default: String(config.defaultLimit) });
|
|
66
|
+
saveConfig({ defaultLimit: parseInt(value, 10) });
|
|
67
|
+
console.log(chalk.green("Updated defaultLimit."));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
program.parse();
|
|
71
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,wBAAwB;AACxB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACpC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,wEAAwE;AACxE,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO,EAAE,mCAAmC;QAC5C,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,iBAAiB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE;YACzE,EAAE,IAAI,EAAE,sBAAsB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE;YAChG,EAAE,IAAI,EAAE,kBAAkB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE;YAC5F,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;SAChC;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO;IAE9B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC;YACzB,OAAO,EAAE,oBAAoB;YAC7B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;gBAC3B,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;gBAC3B,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;gBAC3B,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;aAC5B;SACF,CAAC,CAAC;QACH,UAAU,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC/F,UAAU,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface InputSchema {
|
|
2
|
+
type: string;
|
|
3
|
+
properties: Record<string, {
|
|
4
|
+
type: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
default?: unknown;
|
|
7
|
+
title?: string;
|
|
8
|
+
enum?: string[];
|
|
9
|
+
anyOf?: unknown[];
|
|
10
|
+
}>;
|
|
11
|
+
required?: string[];
|
|
12
|
+
title?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ToolInfo {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
inputSchema: InputSchema;
|
|
19
|
+
}
|
|
20
|
+
export interface ListToolsApiResponse {
|
|
21
|
+
data: {
|
|
22
|
+
tools: ToolInfo[];
|
|
23
|
+
totalCount: number;
|
|
24
|
+
};
|
|
25
|
+
success: boolean;
|
|
26
|
+
message: string | null;
|
|
27
|
+
code: string | null;
|
|
28
|
+
failed: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface CallToolResult {
|
|
31
|
+
toolName: string;
|
|
32
|
+
result: unknown;
|
|
33
|
+
durationMs: number;
|
|
34
|
+
isError: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface CallToolApiResponse {
|
|
37
|
+
data: CallToolResult;
|
|
38
|
+
success: boolean;
|
|
39
|
+
message: string | null;
|
|
40
|
+
code: string | null;
|
|
41
|
+
failed: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface ApiResponse<T> {
|
|
44
|
+
ok: boolean;
|
|
45
|
+
data?: T;
|
|
46
|
+
error?: string;
|
|
47
|
+
status?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface TnConfig {
|
|
50
|
+
baseUrl: string;
|
|
51
|
+
defaultTimeframe: string;
|
|
52
|
+
defaultLimit: number;
|
|
53
|
+
}
|
|
54
|
+
export declare const DEFAULT_CONFIG: TnConfig;
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;KACnB,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAGD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,KAAK,EAAE,QAAQ,EAAE,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAGD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,cAAc,EAAE,QAI5B,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA8DA,MAAM,CAAC,MAAM,cAAc,GAAa;IACtC,OAAO,EAAE,yCAAyC;IAClD,gBAAgB,EAAE,IAAI;IACtB,YAAY,EAAE,EAAE;CACjB,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Ora } from "ora";
|
|
2
|
+
import type { Command } from "commander";
|
|
3
|
+
export declare function startSpinner(text: string): Ora;
|
|
4
|
+
export declare function wrapAction(fn: (...args: unknown[]) => Promise<void>): (...args: unknown[]) => Promise<void>;
|
|
5
|
+
export declare function formatPrice(value: number | string | undefined): string;
|
|
6
|
+
export declare function formatPercent(value: number | string | undefined): string;
|
|
7
|
+
export declare function formatNumber(value: number | string | undefined): string;
|
|
8
|
+
export declare function formatRisk(level: string | undefined): string;
|
|
9
|
+
export declare function formatDuration(ms: number): string;
|
|
10
|
+
export declare function formatAddress(addr: string | undefined): string;
|
|
11
|
+
export declare function truncate(str: string, max: number): string;
|
|
12
|
+
export declare function makeTable(head: string[], rows: string[][]): string;
|
|
13
|
+
export declare function printKeyValue(pairs: [string, string][]): void;
|
|
14
|
+
export declare function printJson(data: unknown): void;
|
|
15
|
+
export declare function isJsonMode(opts: Record<string, unknown>): boolean;
|
|
16
|
+
export declare function kebabToSnake(str: string): string;
|
|
17
|
+
export declare function parseDynamicArgs(argv: string[]): Record<string, string>;
|
|
18
|
+
export declare function formatResult(result: unknown): void;
|
|
19
|
+
export declare function addJsonOption(cmd: Command): Command;
|
|
20
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAE9C;AAID,wBAAgB,UAAU,CACxB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GACxC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAUvC;AAID,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAQtE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAMxE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAQvE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQ5D;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG9D;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzD;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAUlE;AAID,wBAAgB,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,CAK7D;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAEjE;AAID,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBvE;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2DlD;AA6BD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEnD"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import Table from "cli-table3";
|
|
4
|
+
// ── Spinner ──────────────────────────────────────────────────────────
|
|
5
|
+
export function startSpinner(text) {
|
|
6
|
+
return ora({ text, spinner: "dots" }).start();
|
|
7
|
+
}
|
|
8
|
+
// ── wrapAction ───────────────────────────────────────────────────────
|
|
9
|
+
// Wraps a command action with error handling and spinner management.
|
|
10
|
+
export function wrapAction(fn) {
|
|
11
|
+
return async (...args) => {
|
|
12
|
+
try {
|
|
13
|
+
await fn(...args);
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
17
|
+
console.error(chalk.red(`\nError: ${msg}`));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// ── Formatting helpers ───────────────────────────────────────────────
|
|
23
|
+
export function formatPrice(value) {
|
|
24
|
+
if (value === undefined || value === null)
|
|
25
|
+
return chalk.dim("—");
|
|
26
|
+
const n = typeof value === "string" ? parseFloat(value) : value;
|
|
27
|
+
if (isNaN(n))
|
|
28
|
+
return chalk.dim("—");
|
|
29
|
+
if (Math.abs(n) >= 1) {
|
|
30
|
+
return chalk.white(`$${n.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`);
|
|
31
|
+
}
|
|
32
|
+
return chalk.white(`$${n.toPrecision(4)}`);
|
|
33
|
+
}
|
|
34
|
+
export function formatPercent(value) {
|
|
35
|
+
if (value === undefined || value === null)
|
|
36
|
+
return chalk.dim("—");
|
|
37
|
+
const n = typeof value === "string" ? parseFloat(value) : value;
|
|
38
|
+
if (isNaN(n))
|
|
39
|
+
return chalk.dim("—");
|
|
40
|
+
const formatted = `${n >= 0 ? "+" : ""}${n.toFixed(2)}%`;
|
|
41
|
+
return n >= 0 ? chalk.green(formatted) : chalk.red(formatted);
|
|
42
|
+
}
|
|
43
|
+
export function formatNumber(value) {
|
|
44
|
+
if (value === undefined || value === null)
|
|
45
|
+
return chalk.dim("—");
|
|
46
|
+
const n = typeof value === "string" ? parseFloat(value) : value;
|
|
47
|
+
if (isNaN(n))
|
|
48
|
+
return chalk.dim("—");
|
|
49
|
+
if (Math.abs(n) >= 1_000_000_000)
|
|
50
|
+
return chalk.white(`${(n / 1_000_000_000).toFixed(2)}B`);
|
|
51
|
+
if (Math.abs(n) >= 1_000_000)
|
|
52
|
+
return chalk.white(`${(n / 1_000_000).toFixed(2)}M`);
|
|
53
|
+
if (Math.abs(n) >= 1_000)
|
|
54
|
+
return chalk.white(`${(n / 1_000).toFixed(2)}K`);
|
|
55
|
+
return chalk.white(n.toLocaleString("en-US"));
|
|
56
|
+
}
|
|
57
|
+
export function formatRisk(level) {
|
|
58
|
+
if (!level)
|
|
59
|
+
return chalk.dim("—");
|
|
60
|
+
const upper = level.toUpperCase();
|
|
61
|
+
if (upper === "CRITICAL" || upper === "VERY HIGH")
|
|
62
|
+
return chalk.bgRed.white(` ${upper} `);
|
|
63
|
+
if (upper === "HIGH")
|
|
64
|
+
return chalk.red(upper);
|
|
65
|
+
if (upper === "MEDIUM" || upper === "MODERATE")
|
|
66
|
+
return chalk.yellow(upper);
|
|
67
|
+
if (upper === "LOW")
|
|
68
|
+
return chalk.green(upper);
|
|
69
|
+
return chalk.white(level);
|
|
70
|
+
}
|
|
71
|
+
export function formatDuration(ms) {
|
|
72
|
+
return chalk.dim(`(${(ms / 1000).toFixed(1)}s)`);
|
|
73
|
+
}
|
|
74
|
+
export function formatAddress(addr) {
|
|
75
|
+
if (!addr)
|
|
76
|
+
return chalk.dim("—");
|
|
77
|
+
return chalk.yellow(addr);
|
|
78
|
+
}
|
|
79
|
+
export function truncate(str, max) {
|
|
80
|
+
if (str.length <= max)
|
|
81
|
+
return str;
|
|
82
|
+
return str.slice(0, max - 1) + "…";
|
|
83
|
+
}
|
|
84
|
+
// ── Table builder ────────────────────────────────────────────────────
|
|
85
|
+
export function makeTable(head, rows) {
|
|
86
|
+
const table = new Table({
|
|
87
|
+
head: head.map((h) => chalk.cyan.bold(h)),
|
|
88
|
+
style: { head: [], border: ["dim"] },
|
|
89
|
+
wordWrap: true,
|
|
90
|
+
});
|
|
91
|
+
for (const row of rows) {
|
|
92
|
+
table.push(row);
|
|
93
|
+
}
|
|
94
|
+
return table.toString();
|
|
95
|
+
}
|
|
96
|
+
// ── Key-value display ────────────────────────────────────────────────
|
|
97
|
+
export function printKeyValue(pairs) {
|
|
98
|
+
const maxKey = Math.max(...pairs.map(([k]) => k.length));
|
|
99
|
+
for (const [key, value] of pairs) {
|
|
100
|
+
console.log(` ${chalk.cyan(key.padEnd(maxKey))} ${value}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// ── JSON output helper ──────────────────────────────────────────────
|
|
104
|
+
export function printJson(data) {
|
|
105
|
+
console.log(JSON.stringify(data, null, 2));
|
|
106
|
+
}
|
|
107
|
+
// ── Get --json flag from commander opts ──────────────────────────────
|
|
108
|
+
export function isJsonMode(opts) {
|
|
109
|
+
return opts.json === true;
|
|
110
|
+
}
|
|
111
|
+
// ── kebab-case to snake_case ─────────────────────────────────────────
|
|
112
|
+
export function kebabToSnake(str) {
|
|
113
|
+
return str.replace(/-/g, "_");
|
|
114
|
+
}
|
|
115
|
+
// ── Parse dynamic args from remaining argv ───────────────────────────
|
|
116
|
+
// Turns ["--token-address", "bitcoin", "--timeframe", "4h"] into
|
|
117
|
+
// { token_address: "bitcoin", timeframe: "4h" }
|
|
118
|
+
export function parseDynamicArgs(argv) {
|
|
119
|
+
const args = {};
|
|
120
|
+
for (let i = 0; i < argv.length; i++) {
|
|
121
|
+
const curr = argv[i];
|
|
122
|
+
if (curr.startsWith("--")) {
|
|
123
|
+
const key = kebabToSnake(curr.slice(2));
|
|
124
|
+
const next = argv[i + 1];
|
|
125
|
+
if (next && !next.startsWith("--")) {
|
|
126
|
+
args[key] = next;
|
|
127
|
+
i++;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
args[key] = "true";
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return args;
|
|
135
|
+
}
|
|
136
|
+
// ── Smart result formatter ───────────────────────────────────────────
|
|
137
|
+
// Attempts to render unknown API result data in a readable way.
|
|
138
|
+
export function formatResult(result) {
|
|
139
|
+
if (result === null || result === undefined) {
|
|
140
|
+
console.log(chalk.dim(" (no data)"));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (typeof result === "string") {
|
|
144
|
+
// Try to detect markdown-ish content and print as-is
|
|
145
|
+
console.log(result);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (Array.isArray(result)) {
|
|
149
|
+
if (result.length === 0) {
|
|
150
|
+
console.log(chalk.dim(" (empty list)"));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// If array of objects, try table format
|
|
154
|
+
if (typeof result[0] === "object" && result[0] !== null) {
|
|
155
|
+
const keys = Object.keys(result[0]).slice(0, 8); // max 8 cols
|
|
156
|
+
const rows = result.map((item) => keys.map((k) => {
|
|
157
|
+
const v = item[k];
|
|
158
|
+
return v === null || v === undefined ? "—" : String(v);
|
|
159
|
+
}));
|
|
160
|
+
console.log(makeTable(keys, rows));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Simple array
|
|
164
|
+
for (const item of result) {
|
|
165
|
+
console.log(` • ${String(item)}`);
|
|
166
|
+
}
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (typeof result === "object") {
|
|
170
|
+
const obj = result;
|
|
171
|
+
const pairs = [];
|
|
172
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
173
|
+
if (val !== null && val !== undefined && typeof val !== "object") {
|
|
174
|
+
const formatted = formatSmartValue(key, val);
|
|
175
|
+
pairs.push([key, formatted]);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (pairs.length > 0) {
|
|
179
|
+
printKeyValue(pairs);
|
|
180
|
+
}
|
|
181
|
+
// Print nested objects
|
|
182
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
183
|
+
if (val && typeof val === "object") {
|
|
184
|
+
console.log(`\n ${chalk.cyan.bold(key)}:`);
|
|
185
|
+
formatResult(val);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
console.log(String(result));
|
|
191
|
+
}
|
|
192
|
+
function formatSmartValue(key, value) {
|
|
193
|
+
const s = String(value);
|
|
194
|
+
const k = key.toLowerCase();
|
|
195
|
+
// Price-like
|
|
196
|
+
if (k.includes("price") || k.includes("tvl") || k.includes("volume") || k.includes("market_cap")) {
|
|
197
|
+
const n = parseFloat(s);
|
|
198
|
+
if (!isNaN(n))
|
|
199
|
+
return formatPrice(n);
|
|
200
|
+
}
|
|
201
|
+
// Percent-like
|
|
202
|
+
if (k.includes("change") || k.includes("pct") || k.includes("percent") || k.includes("growth") || k.includes("return")) {
|
|
203
|
+
const n = parseFloat(s);
|
|
204
|
+
if (!isNaN(n))
|
|
205
|
+
return formatPercent(n);
|
|
206
|
+
}
|
|
207
|
+
// Risk
|
|
208
|
+
if (k.includes("risk") || k.includes("level") || k.includes("severity")) {
|
|
209
|
+
return formatRisk(s);
|
|
210
|
+
}
|
|
211
|
+
// Address
|
|
212
|
+
if (k.includes("address") || k.includes("addr")) {
|
|
213
|
+
return formatAddress(s);
|
|
214
|
+
}
|
|
215
|
+
return chalk.white(s);
|
|
216
|
+
}
|
|
217
|
+
// ── Add global --json option to command ──────────────────────────────
|
|
218
|
+
export function addJsonOption(cmd) {
|
|
219
|
+
return cmd.option("--json", "Output raw JSON");
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAiB,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,MAAM,YAAY,CAAC;AAG/B,wEAAwE;AACxE,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAChD,CAAC;AAED,wEAAwE;AACxE,qEAAqE;AACrE,MAAM,UAAU,UAAU,CACxB,EAAyC;IAEzC,OAAO,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,WAAW,CAAC,KAAkC;IAC5D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAkC;IAC9D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAkC;IAC7D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,aAAa;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3F,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnF,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;IAC1F,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3E,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAwB;IACpD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,GAAW;IAC/C,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAClC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AACrC,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,SAAS,CAAC,IAAc,EAAE,IAAgB;IACxD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE;QACpC,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,UAAU,CAAC,IAA6B;IACtD,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;AAC5B,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,wEAAwE;AACxE,iEAAiE;AACjE,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACjB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wEAAwE;AACxE,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,MAAe;IAC1C,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,qDAAqD;QACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QACD,wCAAwC;QACxC,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa;YAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAI,IAAgC,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC,CAAC,CACH,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QACD,eAAe;QACf,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAiC,CAAC;QAC9C,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACjE,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,uBAAuB;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5C,YAAY,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,KAAc;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAE5B,aAAa;IACb,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACjG,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,eAAe;IACf,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvH,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO;IACP,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,UAAU;IACV,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AACjD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@truenorth-ai/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TrueNorth crypto analysis CLI — terminal interface for Discovery Agents tools",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"tn": "bin/truenorth.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin",
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsc --watch",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"lint": "tsc --noEmit"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"crypto",
|
|
22
|
+
"trading",
|
|
23
|
+
"cli",
|
|
24
|
+
"truenorth",
|
|
25
|
+
"technical-analysis"
|
|
26
|
+
],
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/AAdventAI/projects",
|
|
31
|
+
"directory": "truenorth-cli"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@inquirer/prompts": "^7.0.0",
|
|
35
|
+
"chalk": "^5.3.0",
|
|
36
|
+
"cli-table3": "^0.6.5",
|
|
37
|
+
"commander": "^12.1.0",
|
|
38
|
+
"ora": "^8.1.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^22.0.0",
|
|
42
|
+
"typescript": "^5.6.0",
|
|
43
|
+
"vitest": "^2.1.0"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=18"
|
|
47
|
+
}
|
|
48
|
+
}
|