@zhive/cli 0.6.7 → 0.6.8

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 (66) hide show
  1. package/dist/CLAUDE.md +7 -0
  2. package/dist/backtest/CLAUDE.md +7 -0
  3. package/dist/cli.js +20 -0
  4. package/dist/commands/agent/commands/profile.js +3 -9
  5. package/dist/commands/create/presets.js +613 -0
  6. package/dist/commands/indicator/commands/bollinger.js +37 -0
  7. package/dist/commands/indicator/commands/ema.js +37 -0
  8. package/dist/commands/indicator/commands/index.js +14 -0
  9. package/dist/commands/indicator/commands/macd.js +51 -0
  10. package/dist/commands/indicator/commands/rsi.js +37 -0
  11. package/dist/commands/indicator/commands/sma.js +37 -0
  12. package/dist/commands/market/commands/index.js +5 -0
  13. package/dist/commands/market/commands/price.js +25 -0
  14. package/dist/commands/shared/utils.js +12 -0
  15. package/dist/commands/start/ui/AsciiTicker.js +81 -0
  16. package/dist/index.js +4 -0
  17. package/dist/services/agent/analysis.js +160 -0
  18. package/dist/services/agent/config.js +75 -0
  19. package/dist/services/agent/env.js +30 -0
  20. package/dist/services/agent/helpers/model.js +92 -0
  21. package/dist/services/agent/helpers.js +22 -0
  22. package/dist/services/agent/prompts/chat-prompt.js +65 -0
  23. package/dist/services/agent/prompts/memory-prompt.js +45 -0
  24. package/dist/services/agent/prompts/prompt.js +379 -0
  25. package/dist/services/agent/skills/index.js +2 -0
  26. package/dist/services/agent/skills/skill-parser.js +149 -0
  27. package/dist/services/agent/skills/types.js +1 -0
  28. package/dist/services/agent/tools/edit-section.js +59 -0
  29. package/dist/services/agent/tools/fetch-rules.js +21 -0
  30. package/dist/services/agent/tools/index.js +76 -0
  31. package/dist/services/agent/tools/market/client.js +41 -0
  32. package/dist/services/agent/tools/market/index.js +3 -0
  33. package/dist/services/agent/tools/market/tools.js +518 -0
  34. package/dist/services/agent/tools/mindshare/client.js +124 -0
  35. package/dist/services/agent/tools/mindshare/index.js +3 -0
  36. package/dist/services/agent/tools/mindshare/tools.js +563 -0
  37. package/dist/services/agent/tools/read-skill-tool.js +30 -0
  38. package/dist/services/agent/tools/ta/index.js +1 -0
  39. package/dist/services/agent/tools/ta/indicators.js +201 -0
  40. package/dist/services/agent/types.js +1 -0
  41. package/dist/services/ai-providers.js +66 -0
  42. package/dist/services/config/agent.js +110 -0
  43. package/dist/services/config/config.js +22 -0
  44. package/dist/services/config/constant.js +8 -0
  45. package/dist/shared/agent/agent-runtime.js +144 -0
  46. package/dist/shared/agent/analysis.js +2 -12
  47. package/dist/shared/agent/cache.js +10 -0
  48. package/dist/shared/agent/config.js +75 -0
  49. package/dist/shared/agent/env.js +30 -0
  50. package/dist/shared/agent/handler.js +3 -9
  51. package/dist/shared/agent/helpers/model.js +92 -0
  52. package/dist/shared/agent/prompts/megathread.js +0 -8
  53. package/dist/shared/agent/tools/execute-skill-tool.js +2 -1
  54. package/dist/shared/agent/tools/formatting.js +0 -19
  55. package/dist/shared/agent/tools/market/client.js +3 -3
  56. package/dist/shared/agent/tools/market/tools.js +88 -312
  57. package/dist/shared/agent/tools/market/utils.js +71 -0
  58. package/dist/shared/agent/tools/mindshare/tools.js +1 -1
  59. package/dist/shared/agent/tools/ta/index.js +3 -1
  60. package/dist/shared/agent/types.js +1 -0
  61. package/dist/shared/agent/utils.js +44 -0
  62. package/dist/shared/ai-providers.js +66 -0
  63. package/dist/shared/ta/error.js +12 -0
  64. package/dist/shared/ta/service.js +93 -0
  65. package/dist/shared/ta/utils.js +16 -0
  66. package/package.json +2 -1
@@ -0,0 +1,66 @@
1
+ export const AI_PROVIDERS = [
2
+ {
3
+ id: 'openai',
4
+ label: 'OpenAI',
5
+ package: '@ai-sdk/openai',
6
+ envVar: 'OPENAI_API_KEY',
7
+ models: { validation: 'gpt-4o-mini', generation: 'gpt-5-mini', runtime: 'gpt-5-mini' },
8
+ },
9
+ {
10
+ id: 'anthropic',
11
+ label: 'Anthropic',
12
+ package: '@ai-sdk/anthropic',
13
+ envVar: 'ANTHROPIC_API_KEY',
14
+ models: {
15
+ validation: 'claude-haiku-4-5-20251001',
16
+ generation: 'claude-haiku-4-5',
17
+ runtime: 'claude-haiku-4-5',
18
+ },
19
+ },
20
+ {
21
+ id: 'google',
22
+ label: 'Google',
23
+ package: '@ai-sdk/google',
24
+ envVar: 'GOOGLE_GENERATIVE_AI_API_KEY',
25
+ models: {
26
+ validation: 'gemini-2.0-flash',
27
+ generation: 'gemini-3-flash-preview',
28
+ runtime: 'gemini-3-flash-preview',
29
+ },
30
+ },
31
+ {
32
+ id: 'xai',
33
+ label: 'xAI',
34
+ package: '@ai-sdk/xai',
35
+ envVar: 'XAI_API_KEY',
36
+ models: {
37
+ validation: 'grok-2',
38
+ generation: 'grok-4-1-fast-reasoning',
39
+ runtime: 'grok-4-1-fast-reasoning',
40
+ },
41
+ },
42
+ {
43
+ id: 'openrouter',
44
+ label: 'OpenRouter',
45
+ package: '@openrouter/ai-sdk-provider',
46
+ envVar: 'OPENROUTER_API_KEY',
47
+ models: {
48
+ validation: 'openai/gpt-4o-mini',
49
+ generation: 'openai/gpt-5.1-mini',
50
+ runtime: 'openai/gpt-5.1-mini',
51
+ },
52
+ },
53
+ ];
54
+ /**
55
+ * All env-var names used by AI providers.
56
+ * Used to clear shell-inherited keys before loading an agent's .env,
57
+ * so only the agent's chosen provider is active.
58
+ */
59
+ export const AI_PROVIDER_ENV_VARS = AI_PROVIDERS.map((p) => p.envVar);
60
+ export function getProvider(id) {
61
+ const provider = AI_PROVIDERS.find((p) => p.id === id);
62
+ if (!provider) {
63
+ throw new Error(`Unknown AI provider: ${id}`);
64
+ }
65
+ return provider;
66
+ }
@@ -0,0 +1,12 @@
1
+ export class InsufficientDataError extends Error {
2
+ constructor(required, got) {
3
+ super('INSUFFICIENT_DATA');
4
+ this.required = required;
5
+ this.got = got;
6
+ }
7
+ }
8
+ export class PriceUnavailableError extends Error {
9
+ constructor(project) {
10
+ super(`Price of "${project}" is not available`);
11
+ }
12
+ }
@@ -0,0 +1,93 @@
1
+ import { rsi, sma, ema, macd, bb } from 'indicatorts';
2
+ import { getMarketClient } from '../agent/tools/market/client.js';
3
+ import { InsufficientDataError } from './error.js';
4
+ import { adjustFromDate } from './utils.js';
5
+ export const getPrice = async ({ project, at }) => {
6
+ const client = getMarketClient();
7
+ const priceData = await client.getPrice(project, at ?? new Date());
8
+ return priceData.price ?? undefined;
9
+ };
10
+ export const getOHLC = async ({ project, from, to, interval = 'hourly', }) => {
11
+ const client = getMarketClient();
12
+ const ohlcData = await client.getOHLC(project, from, to, interval);
13
+ return ohlcData;
14
+ };
15
+ export const getRSI = async ({ project, interval = 'hourly', period = 14, from, to, }) => {
16
+ const market = getMarketClient();
17
+ const adjustedFrom = adjustFromDate(from, period, interval);
18
+ const ohlcData = await market.getOHLC(project, adjustedFrom, to, interval);
19
+ if (ohlcData.length < period) {
20
+ throw new InsufficientDataError(period, ohlcData.length);
21
+ }
22
+ const rsiData = rsi(ohlcData.map((data) => data[4]), { period });
23
+ const results = rsiData.map((value, i) => ({
24
+ value,
25
+ timestamp: new Date(ohlcData[i]?.[0] ?? 0).toISOString(),
26
+ }));
27
+ return results;
28
+ };
29
+ export const getSMA = async ({ project, interval = 'hourly', period = 20, from, to, }) => {
30
+ const market = getMarketClient();
31
+ const adjustedFrom = adjustFromDate(from, period, interval);
32
+ const ohlcData = await market.getOHLC(project, adjustedFrom, to, interval);
33
+ if (ohlcData.length < period) {
34
+ throw new InsufficientDataError(period, ohlcData.length);
35
+ }
36
+ const closePrices = ohlcData.map((data) => data[4]);
37
+ const smaData = sma(closePrices, { period });
38
+ const results = smaData.map((value, i) => ({
39
+ value,
40
+ timestamp: new Date(ohlcData[i]?.[0] ?? 0).toISOString(),
41
+ }));
42
+ return results;
43
+ };
44
+ export const getEMA = async ({ project, interval = 'hourly', period = 12, from, to, }) => {
45
+ const market = getMarketClient();
46
+ const adjustedFrom = adjustFromDate(from, period, interval);
47
+ const ohlcData = await market.getOHLC(project, adjustedFrom, to, interval);
48
+ if (ohlcData.length < period) {
49
+ throw new InsufficientDataError(period, ohlcData.length);
50
+ }
51
+ const closePrices = ohlcData.map((data) => data[4]);
52
+ const emaData = ema(closePrices, { period });
53
+ const results = emaData.map((value, i) => ({
54
+ value,
55
+ timestamp: new Date(ohlcData[i]?.[0] ?? 0).toISOString(),
56
+ }));
57
+ return results;
58
+ };
59
+ export const getMACD = async ({ project, interval = 'hourly', fast = 12, slow = 26, signal = 9, from, to, }) => {
60
+ const market = getMarketClient();
61
+ const minRequired = slow + signal;
62
+ const adjustedFrom = adjustFromDate(from, minRequired, interval);
63
+ const ohlcData = await market.getOHLC(project, adjustedFrom, to, interval);
64
+ if (ohlcData.length < minRequired) {
65
+ throw new InsufficientDataError(minRequired, ohlcData.length);
66
+ }
67
+ const closePrices = ohlcData.map((data) => data[4]);
68
+ const macdResult = macd(closePrices, { fast, slow, signal });
69
+ const results = macdResult.macdLine.map((macdVal, i) => ({
70
+ timestamp: new Date(ohlcData[i]?.[0] ?? 0).toISOString(),
71
+ macd: macdVal,
72
+ signal: macdResult.signalLine[i],
73
+ histogram: macdVal - macdResult.signalLine[i],
74
+ }));
75
+ return results;
76
+ };
77
+ export const getBollingerBands = async ({ project, interval = 'hourly', period = 20, from, to, }) => {
78
+ const market = getMarketClient();
79
+ const adjustedFrom = adjustFromDate(from, period, interval);
80
+ const ohlcData = await market.getOHLC(project, adjustedFrom, to, interval);
81
+ if (ohlcData.length < period) {
82
+ throw new InsufficientDataError(period, ohlcData.length);
83
+ }
84
+ const closePrices = ohlcData.map((data) => data[4]);
85
+ const bbResult = bb(closePrices, { period });
86
+ const results = bbResult.upper.map((upper, i) => ({
87
+ timestamp: new Date(ohlcData[i]?.[0] ?? 0).toISOString(),
88
+ upper,
89
+ middle: bbResult.middle[i],
90
+ lower: bbResult.lower[i],
91
+ }));
92
+ return results;
93
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Adjusts the 'from' date backwards to ensure sufficient data points are fetched
3
+ * for indicator calculation. Adds a 30% buffer for weekends/gaps in data.
4
+ */
5
+ export function adjustFromDate(from, minPoints, interval) {
6
+ const fromDate = new Date(from);
7
+ const buffer = Math.ceil(minPoints * 0.3);
8
+ const totalPoints = minPoints + buffer;
9
+ if (interval === 'hourly') {
10
+ fromDate.setTime(fromDate.getTime() - totalPoints * 60 * 60 * 1000);
11
+ }
12
+ else {
13
+ fromDate.setTime(fromDate.getTime() - totalPoints * 24 * 60 * 60 * 1000);
14
+ }
15
+ return fromDate.toISOString();
16
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhive/cli",
3
- "version": "0.6.7",
3
+ "version": "0.6.8",
4
4
  "description": "CLI for bootstrapping zHive AI Agents",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,6 +38,7 @@
38
38
  "commander": "^14.0.3",
39
39
  "dotenv": "^16.0.0",
40
40
  "fs-extra": "^11.2.0",
41
+ "indicatorts": "^2.2.2",
41
42
  "ink": "^5.1.0",
42
43
  "ink-select-input": "^6.0.0",
43
44
  "ink-text-input": "^6.0.0",