traderclaw-cli 1.0.91 → 1.0.93-beta.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/bin/installer-step-engine.mjs +140 -92
- package/package.json +2 -2
|
@@ -756,6 +756,14 @@ function buildOpenClawCronStoreJob(def) {
|
|
|
756
756
|
.split("-")
|
|
757
757
|
.map((w) => (w.length ? w.charAt(0).toUpperCase() + w.slice(1) : w))
|
|
758
758
|
.join(" ");
|
|
759
|
+
const payload = {
|
|
760
|
+
kind: "agentTurn",
|
|
761
|
+
message: def.message,
|
|
762
|
+
lightContext: def.lightContext !== undefined ? def.lightContext : true,
|
|
763
|
+
};
|
|
764
|
+
if (def.model) payload.model = def.model;
|
|
765
|
+
if (def.thinking !== undefined) payload.thinking = def.thinking;
|
|
766
|
+
const delivery = def.delivery || { mode: "announce", channel: "last", bestEffort: true };
|
|
759
767
|
return {
|
|
760
768
|
id: def.id,
|
|
761
769
|
name: nameFromId.length <= 60 ? nameFromId : nameFromId.slice(0, 59) + "…",
|
|
@@ -764,13 +772,8 @@ function buildOpenClawCronStoreJob(def) {
|
|
|
764
772
|
sessionTarget: "isolated",
|
|
765
773
|
wakeMode: "now",
|
|
766
774
|
agentId: def.agentId,
|
|
767
|
-
payload
|
|
768
|
-
|
|
769
|
-
message: def.message,
|
|
770
|
-
lightContext: true,
|
|
771
|
-
},
|
|
772
|
-
// OpenClaw: "none" = no channel post; announce + last = summary to user's last chat (see OpenClaw cron delivery docs)
|
|
773
|
-
delivery: { mode: "announce", channel: "last", bestEffort: true },
|
|
775
|
+
payload,
|
|
776
|
+
delivery,
|
|
774
777
|
state: {},
|
|
775
778
|
};
|
|
776
779
|
}
|
|
@@ -869,74 +872,122 @@ function traderCronPrescriptiveJobs(agentId) {
|
|
|
869
872
|
return [
|
|
870
873
|
{
|
|
871
874
|
id: "alpha-scan",
|
|
872
|
-
schedule: "0
|
|
875
|
+
schedule: "0 */3 * * *",
|
|
873
876
|
agentId,
|
|
874
877
|
message:
|
|
875
|
-
"CRON_JOB: alpha_scan
|
|
878
|
+
"CRON_JOB: alpha_scan\n\nScan new launches, filter, score, log alpha. Tools: solana_scan_launches → filter (vol>30K, mcap>10K, liq>5K) → solana_token_snapshot for survivors → quality filter (top10 <50%, deployer <3 abandoned, has social) → score 0-100 → solana_alpha_log for 65+. Summarize results.",
|
|
879
|
+
model: "anthropic/claude-sonnet-4-20250514",
|
|
880
|
+
thinking: false,
|
|
881
|
+
lightContext: true,
|
|
882
|
+
delivery: { mode: "announce", channel: "last", bestEffort: true },
|
|
876
883
|
enabled: true,
|
|
877
884
|
},
|
|
878
885
|
{
|
|
879
|
-
id: "
|
|
880
|
-
schedule: "0 */
|
|
886
|
+
id: "portfolio-health",
|
|
887
|
+
schedule: "0 */4 * * *",
|
|
881
888
|
agentId,
|
|
882
889
|
message:
|
|
883
|
-
"CRON_JOB:
|
|
890
|
+
"CRON_JOB: portfolio_health\n\nCombined dead-money + whale + risk audit. solana_capital_status + solana_positions → solana_token_snapshot per position → dead money exit (loss>40% or 90min+down+low vol) → whale flags (>5% supply moves) → risk checks (concentration/drawdown/exposure) → sell if CRITICAL → solana_memory_write tag 'portfolio_health'.",
|
|
891
|
+
model: "anthropic/claude-sonnet-4-20250514",
|
|
892
|
+
thinking: false,
|
|
893
|
+
lightContext: true,
|
|
894
|
+
delivery: { mode: "announce", channel: "last", bestEffort: true },
|
|
884
895
|
enabled: true,
|
|
885
896
|
},
|
|
886
897
|
{
|
|
887
|
-
id: "
|
|
888
|
-
schedule: "
|
|
898
|
+
id: "trust-refresh",
|
|
899
|
+
schedule: "0 */8 * * *",
|
|
889
900
|
agentId,
|
|
890
901
|
message:
|
|
891
|
-
"CRON_JOB:
|
|
902
|
+
"CRON_JOB: trust_refresh\n\nCombined source + deployer trust. solana_source_trust_refresh + solana_deployer_trust_refresh → solana_alpha_sources + solana_trades for win rates → solana_source_trust_get + solana_deployer_trust_get, flag <30 → solana_memory_write tag 'trust_refresh'.",
|
|
903
|
+
model: "anthropic/claude-haiku-4-5",
|
|
904
|
+
thinking: false,
|
|
905
|
+
lightContext: true,
|
|
906
|
+
delivery: { mode: "none" },
|
|
892
907
|
enabled: true,
|
|
893
908
|
},
|
|
894
909
|
{
|
|
895
|
-
id: "
|
|
896
|
-
schedule: "
|
|
910
|
+
id: "meta-rotation",
|
|
911
|
+
schedule: "30 */8 * * *",
|
|
897
912
|
agentId,
|
|
898
913
|
message:
|
|
899
|
-
"CRON_JOB:
|
|
914
|
+
"CRON_JOB: meta_rotation_analysis\n\nx_search_tweets trending topics → solana_scan_launches → categorize by narrative cluster → per-cluster metrics → compare vs solana_memory_search tag 'meta_rotation' → declare hot/fading clusters → solana_memory_write tag 'meta_rotation'.",
|
|
915
|
+
model: "anthropic/claude-sonnet-4-20250514",
|
|
916
|
+
thinking: false,
|
|
917
|
+
lightContext: true,
|
|
918
|
+
delivery: { mode: "announce", channel: "last", bestEffort: true },
|
|
900
919
|
enabled: true,
|
|
901
920
|
},
|
|
902
921
|
{
|
|
903
|
-
id: "
|
|
904
|
-
schedule: "
|
|
922
|
+
id: "strategy-evolution",
|
|
923
|
+
schedule: "0 6 * * *",
|
|
905
924
|
agentId,
|
|
906
925
|
message:
|
|
907
|
-
"CRON_JOB:
|
|
926
|
+
"CRON_JOB: strategy_evolution\n\nDaily strategy review. solana_journal_summary — if <10 closed trades since last evolution, log 'insufficient data' and stop. Otherwise: solana_trades to bucket by confidence tier → solana_strategy_state for current weights → analyze tier performance → solana_strategy_update with conservative adjustments (max 10% per weight per cycle) → solana_memory_write tag 'strategy_evolution'.",
|
|
927
|
+
model: "anthropic/claude-sonnet-4-20250514",
|
|
928
|
+
thinking: true,
|
|
929
|
+
lightContext: false,
|
|
930
|
+
delivery: { mode: "announce", channel: "last", bestEffort: true },
|
|
908
931
|
enabled: true,
|
|
909
932
|
},
|
|
910
933
|
{
|
|
911
|
-
id: "
|
|
912
|
-
schedule: "
|
|
934
|
+
id: "subscription-cleanup",
|
|
935
|
+
schedule: "15 */8 * * *",
|
|
913
936
|
agentId,
|
|
914
937
|
message:
|
|
915
|
-
"CRON_JOB:
|
|
938
|
+
"CRON_JOB: subscription_cleanup\n\nsolana_positions for open CAs → solana_bitquery_subscriptions for active subs (if AUTH_SCOPE_MISSING, log and stop) → match subs to positions → solana_bitquery_unsubscribe orphaned subs → solana_memory_write tag 'subscription_cleanup'. Summarize before/after counts.",
|
|
939
|
+
model: "anthropic/claude-haiku-4-5",
|
|
940
|
+
thinking: false,
|
|
941
|
+
lightContext: true,
|
|
942
|
+
delivery: { mode: "announce", channel: "last", bestEffort: true },
|
|
916
943
|
enabled: true,
|
|
917
944
|
},
|
|
918
945
|
{
|
|
919
|
-
id: "
|
|
920
|
-
schedule: "
|
|
946
|
+
id: "daily-performance-report",
|
|
947
|
+
schedule: "0 4 * * *",
|
|
921
948
|
agentId,
|
|
922
949
|
message:
|
|
923
|
-
"CRON_JOB:
|
|
950
|
+
"CRON_JOB: daily_performance_report\n\nCompile 24h report. solana_journal_summary + solana_capital_status + solana_positions + solana_trades + solana_strategy_state → sections: Portfolio Summary, Trading Activity (count/win rate/PnL), Best/Worst Trades, Strategy State, Risk Metrics, Recommendations → solana_memory_write tag 'daily_report'. Deliver full report.",
|
|
951
|
+
model: "anthropic/claude-sonnet-4-20250514",
|
|
952
|
+
thinking: false,
|
|
953
|
+
lightContext: false,
|
|
954
|
+
delivery: { mode: "announce", channel: "telegram" },
|
|
924
955
|
enabled: true,
|
|
925
956
|
},
|
|
926
957
|
{
|
|
927
|
-
id: "
|
|
928
|
-
schedule: "
|
|
958
|
+
id: "intelligence-lab-eval",
|
|
959
|
+
schedule: "0 16 * * *",
|
|
929
960
|
agentId,
|
|
930
961
|
message:
|
|
931
|
-
"CRON_JOB:
|
|
962
|
+
"CRON_JOB: intelligence_lab_eval\n\nsolana_candidate_get — if <20 labeled candidates, log 'insufficient data' and exit. Otherwise: solana_evaluation_report → solana_model_registry for challengers → solana_replay_eval if challenger exists → solana_model_promote if challenger beats champion by >5% F1 → solana_memory_write tag 'intelligence_lab'.",
|
|
963
|
+
model: "anthropic/claude-sonnet-4-20250514",
|
|
964
|
+
thinking: true,
|
|
965
|
+
lightContext: false,
|
|
966
|
+
delivery: { mode: "none" },
|
|
932
967
|
enabled: true,
|
|
933
968
|
},
|
|
934
969
|
{
|
|
935
|
-
id: "
|
|
936
|
-
schedule: "0
|
|
970
|
+
id: "memory-trim",
|
|
971
|
+
schedule: "0 3 * * *",
|
|
972
|
+
agentId,
|
|
973
|
+
message:
|
|
974
|
+
"CRON_JOB: memory_trim\n\nsolana_memory_trim dryRun:true first → review → solana_memory_trim retentionDays:2 → solana_memory_write tag 'memory_trim' with summary.",
|
|
975
|
+
model: "anthropic/claude-haiku-4-5",
|
|
976
|
+
thinking: false,
|
|
977
|
+
lightContext: true,
|
|
978
|
+
delivery: { mode: "none" },
|
|
979
|
+
enabled: true,
|
|
980
|
+
},
|
|
981
|
+
{
|
|
982
|
+
id: "balance-watchdog",
|
|
983
|
+
schedule: "0 */2 * * *",
|
|
937
984
|
agentId,
|
|
938
985
|
message:
|
|
939
|
-
"
|
|
986
|
+
"Balance watchdog. 1) solana_capital_status 2) solana_positions 3) solana_context_snapshot_read 4) Compare real vs believed. If mismatch: solana_context_snapshot_write with corrected state, summarize changes. If match: reply WATCHDOG_OK.",
|
|
987
|
+
model: "anthropic/claude-haiku-4-5",
|
|
988
|
+
thinking: false,
|
|
989
|
+
lightContext: true,
|
|
990
|
+
delivery: { mode: "announce", channel: "telegram" },
|
|
940
991
|
enabled: true,
|
|
941
992
|
},
|
|
942
993
|
];
|
|
@@ -968,9 +1019,9 @@ function configureGatewayScheduling(modeConfig, configPath = CONFIG_FILE) {
|
|
|
968
1019
|
prompt: heartbeatPrompt,
|
|
969
1020
|
};
|
|
970
1021
|
|
|
971
|
-
const v1Agents = [{ id: "main", default: true, heartbeat: { ...defaultHeartbeat } }];
|
|
1022
|
+
const v1Agents = [{ id: "main", default: true, identity: { name: "AgentZERO" }, heartbeat: { ...defaultHeartbeat } }];
|
|
972
1023
|
const v2Agents = [
|
|
973
|
-
{ id: "cto", default: true, heartbeat: { ...defaultHeartbeat } },
|
|
1024
|
+
{ id: "cto", default: true, identity: { name: "AgentZERO" }, heartbeat: { ...defaultHeartbeat } },
|
|
974
1025
|
{ id: "execution-specialist", heartbeat: { ...defaultHeartbeat } },
|
|
975
1026
|
{ id: "alpha-signal-analyst", heartbeat: { ...defaultHeartbeat } },
|
|
976
1027
|
{ id: "onchain-analyst" },
|
|
@@ -997,6 +1048,9 @@ function configureGatewayScheduling(modeConfig, configPath = CONFIG_FILE) {
|
|
|
997
1048
|
if (agent.default) {
|
|
998
1049
|
existing.default = true;
|
|
999
1050
|
}
|
|
1051
|
+
if (agent.identity && (!existing.identity || typeof existing.identity !== "object")) {
|
|
1052
|
+
existing.identity = agent.identity;
|
|
1053
|
+
}
|
|
1000
1054
|
} else {
|
|
1001
1055
|
config.agents.list.push(agent);
|
|
1002
1056
|
}
|
|
@@ -1060,12 +1114,60 @@ function configureGatewayScheduling(modeConfig, configPath = CONFIG_FILE) {
|
|
|
1060
1114
|
if (config.channels.defaults.heartbeat.showOk === undefined) {
|
|
1061
1115
|
config.channels.defaults.heartbeat.showOk = true;
|
|
1062
1116
|
}
|
|
1117
|
+
if (config.channels.defaults.heartbeat.showAlerts === undefined) {
|
|
1118
|
+
config.channels.defaults.heartbeat.showAlerts = true;
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
if (!config.channels.telegram || typeof config.channels.telegram !== "object") {
|
|
1122
|
+
config.channels.telegram = {};
|
|
1123
|
+
}
|
|
1124
|
+
if (config.channels.telegram.streaming === undefined) {
|
|
1125
|
+
config.channels.telegram.streaming = "partial";
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
if (!config.commands || typeof config.commands !== "object") config.commands = {};
|
|
1129
|
+
if (config.commands.native === undefined) config.commands.native = "auto";
|
|
1130
|
+
if (config.commands.restart === undefined) config.commands.restart = true;
|
|
1131
|
+
if (!config.commands.ownerDisplay) config.commands.ownerDisplay = "raw";
|
|
1063
1132
|
|
|
1064
1133
|
if (!config.agents.defaults || typeof config.agents.defaults !== "object") {
|
|
1065
1134
|
config.agents.defaults = {};
|
|
1066
1135
|
}
|
|
1067
1136
|
config.agents.defaults.heartbeat = { ...defaultHeartbeat };
|
|
1068
1137
|
|
|
1138
|
+
if (!config.agents.defaults.memorySearch || typeof config.agents.defaults.memorySearch !== "object") {
|
|
1139
|
+
config.agents.defaults.memorySearch = {
|
|
1140
|
+
provider: "openai",
|
|
1141
|
+
model: "text-embedding-3-small",
|
|
1142
|
+
query: {
|
|
1143
|
+
hybrid: true,
|
|
1144
|
+
mmr: { enabled: true, lambda: 0.5 },
|
|
1145
|
+
temporalDecay: { enabled: true, halfLifeDays: 14 },
|
|
1146
|
+
},
|
|
1147
|
+
};
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
if (!config.agents.defaults.contextPruning || typeof config.agents.defaults.contextPruning !== "object") {
|
|
1151
|
+
config.agents.defaults.contextPruning = { cacheTtl: "1h" };
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
if (!config.env || typeof config.env !== "object") config.env = {};
|
|
1155
|
+
if (process.env.OPENAI_API_KEY && !config.env.OPENAI_API_KEY) {
|
|
1156
|
+
// Literal env reference (not the value). The gateway expands ${OPENAI_API_KEY}
|
|
1157
|
+
// at runtime from its process environment. Keeps the secret out of the
|
|
1158
|
+
// config file on disk.
|
|
1159
|
+
config.env.OPENAI_API_KEY = "${OPENAI_API_KEY}";
|
|
1160
|
+
} else if (!process.env.OPENAI_API_KEY && !config.env.OPENAI_API_KEY && typeof console !== "undefined") {
|
|
1161
|
+
console.warn(
|
|
1162
|
+
"[traderclaw] OPENAI_API_KEY not detected in the installer shell. " +
|
|
1163
|
+
"Memory embeddings require it for vector search (text-embedding-3-small, ~$0.02/M tokens).\n" +
|
|
1164
|
+
"Set it and re-run the installer, or add the env ref manually:\n" +
|
|
1165
|
+
" 1) export OPENAI_API_KEY=sk-...\n" +
|
|
1166
|
+
" 2) edit ~/.openclaw/openclaw.json and set env.OPENAI_API_KEY to \"${OPENAI_API_KEY}\"\n" +
|
|
1167
|
+
" 3) openclaw gateway restart"
|
|
1168
|
+
);
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1069
1171
|
ensureAgentsDefaultsSchemaCompat(config);
|
|
1070
1172
|
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
1071
1173
|
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
@@ -1073,21 +1175,6 @@ function configureGatewayScheduling(modeConfig, configPath = CONFIG_FILE) {
|
|
|
1073
1175
|
const cronStorePath = resolveCronJobsStorePath(config);
|
|
1074
1176
|
const cronMerge = mergeTraderCronJobsIntoStore(cronStorePath, targetJobs);
|
|
1075
1177
|
|
|
1076
|
-
let qmdAvailable = false;
|
|
1077
|
-
let qmdVersion = null;
|
|
1078
|
-
try { qmdAvailable = commandExists("qmd"); } catch {}
|
|
1079
|
-
if (qmdAvailable) {
|
|
1080
|
-
qmdVersion = getCommandOutput("qmd --version");
|
|
1081
|
-
} else {
|
|
1082
|
-
if (typeof console !== "undefined") {
|
|
1083
|
-
console.warn(
|
|
1084
|
-
"[traderclaw] QMD binary not found. Memory engine will fall back to SQLite (no vector search, no temporal decay, no MMR).\n" +
|
|
1085
|
-
"Install QMD: npm install -g @tobilu/qmd\n" +
|
|
1086
|
-
"Then restart the gateway: openclaw gateway restart"
|
|
1087
|
-
);
|
|
1088
|
-
}
|
|
1089
|
-
}
|
|
1090
|
-
|
|
1091
1178
|
return {
|
|
1092
1179
|
configPath,
|
|
1093
1180
|
agentsConfigured: targetAgents.length,
|
|
@@ -1099,8 +1186,6 @@ function configureGatewayScheduling(modeConfig, configPath = CONFIG_FILE) {
|
|
|
1099
1186
|
cronJobsStoreError: cronMerge.error,
|
|
1100
1187
|
removedLegacyCronJobs,
|
|
1101
1188
|
hooksConfigured: config.hooks.mappings.length,
|
|
1102
|
-
qmdAvailable,
|
|
1103
|
-
qmdVersion,
|
|
1104
1189
|
isV2,
|
|
1105
1190
|
};
|
|
1106
1191
|
}
|
|
@@ -1792,9 +1877,9 @@ function verifyInstallation(modeConfig, apiKey) {
|
|
|
1792
1877
|
note: heartbeatInWorkspace ? workspaceRoot : `expected ${join(workspaceRoot, "HEARTBEAT.md")}`,
|
|
1793
1878
|
},
|
|
1794
1879
|
{
|
|
1795
|
-
label: "
|
|
1796
|
-
ok:
|
|
1797
|
-
note: "
|
|
1880
|
+
label: "Memory engine (builtin, vector + FTS)",
|
|
1881
|
+
ok: true,
|
|
1882
|
+
note: "run `openclaw memory status --deep` to verify index",
|
|
1798
1883
|
},
|
|
1799
1884
|
];
|
|
1800
1885
|
}
|
|
@@ -2288,32 +2373,6 @@ export class InstallerStepEngine {
|
|
|
2288
2373
|
await this.runStep("openclaw_global_deps", "Ensuring OpenClaw global package dependencies", async () =>
|
|
2289
2374
|
ensureOpenClawGlobalPackageDependencies(),
|
|
2290
2375
|
);
|
|
2291
|
-
await this.runStep("install_qmd", "Installing QMD memory engine (vector search)", async () => {
|
|
2292
|
-
if (commandExists("qmd")) {
|
|
2293
|
-
const ver = getCommandOutput("qmd --version");
|
|
2294
|
-
this.emitLog("install_qmd", "info", `QMD already installed: ${ver}`);
|
|
2295
|
-
return { alreadyInstalled: true, version: ver };
|
|
2296
|
-
}
|
|
2297
|
-
this.emitLog("install_qmd", "info", "Installing @tobilu/qmd globally for vector search memory...");
|
|
2298
|
-
try {
|
|
2299
|
-
await runCommandWithEvents("npm", ["install", "-g", "--ignore-scripts", "--registry", "https://registry.npmjs.org/", "@tobilu/qmd"], {
|
|
2300
|
-
onEvent: (evt) => this.emitLog("install_qmd", evt.type === "stderr" ? "warn" : "info", evt.text, evt.urls || []),
|
|
2301
|
-
});
|
|
2302
|
-
} catch (err) {
|
|
2303
|
-
this.emitLog(
|
|
2304
|
-
"install_qmd",
|
|
2305
|
-
"warn",
|
|
2306
|
-
`QMD install failed (non-fatal): ${err?.message || err}. Memory will use keyword search only. You can install manually later: npm install -g @tobilu/qmd`,
|
|
2307
|
-
);
|
|
2308
|
-
return { installed: false, error: err?.message || String(err) };
|
|
2309
|
-
}
|
|
2310
|
-
const available = commandExists("qmd");
|
|
2311
|
-
const ver = available ? getCommandOutput("qmd --version") : null;
|
|
2312
|
-
if (!available) {
|
|
2313
|
-
this.emitLog("install_qmd", "warn", "QMD installed but not on PATH. Memory will use keyword search only.");
|
|
2314
|
-
}
|
|
2315
|
-
return { installed: available, version: ver };
|
|
2316
|
-
});
|
|
2317
2376
|
await this.runStep(
|
|
2318
2377
|
"activate_openclaw_plugin",
|
|
2319
2378
|
"Installing and enabling TraderClaw inside OpenClaw",
|
|
@@ -2421,17 +2480,6 @@ export class InstallerStepEngine {
|
|
|
2421
2480
|
this.emitLog("gateway_scheduling", "warn", "Removed legacy 'cron.jobs' from openclaw.json to keep config validation compatible.");
|
|
2422
2481
|
}
|
|
2423
2482
|
this.emitLog("gateway_scheduling", "info", `Webhook hooks: ${result.hooksConfigured}`);
|
|
2424
|
-
if (!result.qmdAvailable) {
|
|
2425
|
-
this.emitLog(
|
|
2426
|
-
"gateway_scheduling",
|
|
2427
|
-
"warn",
|
|
2428
|
-
"QMD binary not found — memory will use SQLite keyword search only (no vector search, no temporal decay, no MMR). " +
|
|
2429
|
-
"Vector search makes the agent's memory significantly more effective. " +
|
|
2430
|
-
"Install: npm install -g @tobilu/qmd — then restart the gateway: openclaw gateway restart",
|
|
2431
|
-
);
|
|
2432
|
-
} else {
|
|
2433
|
-
this.emitLog("gateway_scheduling", "info", `QMD memory engine: ${result.qmdVersion || "installed"}`);
|
|
2434
|
-
}
|
|
2435
2483
|
const restart = await restartGateway();
|
|
2436
2484
|
return { ...result, restart };
|
|
2437
2485
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "traderclaw-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.93-beta.0",
|
|
4
4
|
"description": "Global TraderClaw CLI (install --wizard, setup, precheck). Installs solana-traderclaw as a dependency for OpenClaw plugin files.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"node": ">=22"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"solana-traderclaw": "^1.0.
|
|
20
|
+
"solana-traderclaw": "^1.0.93-beta.0"
|
|
21
21
|
},
|
|
22
22
|
"keywords": [
|
|
23
23
|
"traderclaw",
|