@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.
Files changed (83) hide show
  1. package/README.md +212 -0
  2. package/bin/truenorth.js +2 -0
  3. package/dist/api/client.d.ts +4 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +34 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/tools.d.ts +4 -0
  8. package/dist/api/tools.d.ts.map +1 -0
  9. package/dist/api/tools.js +25 -0
  10. package/dist/api/tools.js.map +1 -0
  11. package/dist/commands/call.d.ts +3 -0
  12. package/dist/commands/call.d.ts.map +1 -0
  13. package/dist/commands/call.js +27 -0
  14. package/dist/commands/call.js.map +1 -0
  15. package/dist/commands/defi.d.ts +3 -0
  16. package/dist/commands/defi.d.ts.map +1 -0
  17. package/dist/commands/defi.js +47 -0
  18. package/dist/commands/defi.js.map +1 -0
  19. package/dist/commands/derivatives.d.ts +3 -0
  20. package/dist/commands/derivatives.d.ts.map +1 -0
  21. package/dist/commands/derivatives.js +27 -0
  22. package/dist/commands/derivatives.js.map +1 -0
  23. package/dist/commands/events.d.ts +3 -0
  24. package/dist/commands/events.d.ts.map +1 -0
  25. package/dist/commands/events.js +28 -0
  26. package/dist/commands/events.js.map +1 -0
  27. package/dist/commands/kol.d.ts +3 -0
  28. package/dist/commands/kol.d.ts.map +1 -0
  29. package/dist/commands/kol.js +66 -0
  30. package/dist/commands/kol.js.map +1 -0
  31. package/dist/commands/market-info.d.ts +3 -0
  32. package/dist/commands/market-info.d.ts.map +1 -0
  33. package/dist/commands/market-info.js +27 -0
  34. package/dist/commands/market-info.js.map +1 -0
  35. package/dist/commands/meme.d.ts +3 -0
  36. package/dist/commands/meme.d.ts.map +1 -0
  37. package/dist/commands/meme.js +108 -0
  38. package/dist/commands/meme.js.map +1 -0
  39. package/dist/commands/perps.d.ts +3 -0
  40. package/dist/commands/perps.d.ts.map +1 -0
  41. package/dist/commands/perps.js +36 -0
  42. package/dist/commands/perps.js.map +1 -0
  43. package/dist/commands/polymarket.d.ts +3 -0
  44. package/dist/commands/polymarket.d.ts.map +1 -0
  45. package/dist/commands/polymarket.js +32 -0
  46. package/dist/commands/polymarket.js.map +1 -0
  47. package/dist/commands/scan.d.ts +3 -0
  48. package/dist/commands/scan.d.ts.map +1 -0
  49. package/dist/commands/scan.js +27 -0
  50. package/dist/commands/scan.js.map +1 -0
  51. package/dist/commands/search.d.ts +3 -0
  52. package/dist/commands/search.d.ts.map +1 -0
  53. package/dist/commands/search.js +66 -0
  54. package/dist/commands/search.js.map +1 -0
  55. package/dist/commands/technical.d.ts +3 -0
  56. package/dist/commands/technical.d.ts.map +1 -0
  57. package/dist/commands/technical.js +55 -0
  58. package/dist/commands/technical.js.map +1 -0
  59. package/dist/commands/tools.d.ts +3 -0
  60. package/dist/commands/tools.d.ts.map +1 -0
  61. package/dist/commands/tools.js +68 -0
  62. package/dist/commands/tools.js.map +1 -0
  63. package/dist/commands/trending.d.ts +3 -0
  64. package/dist/commands/trending.d.ts.map +1 -0
  65. package/dist/commands/trending.js +31 -0
  66. package/dist/commands/trending.js.map +1 -0
  67. package/dist/config.d.ts +5 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +28 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +71 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/types.d.ts +55 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +6 -0
  78. package/dist/types.js.map +1 -0
  79. package/dist/utils.d.ts +20 -0
  80. package/dist/utils.d.ts.map +1 -0
  81. package/dist/utils.js +221 -0
  82. package/dist/utils.js.map +1 -0
  83. 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":"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"}
@@ -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,6 @@
1
+ export const DEFAULT_CONFIG = {
2
+ baseUrl: "https://api.adventai.io/api/agent-tools",
3
+ defaultTimeframe: "4h",
4
+ defaultLimit: 20,
5
+ };
6
+ //# sourceMappingURL=types.js.map
@@ -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"}
@@ -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":"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"}
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
+ }