@netmind/arena-cli 0.29.0 → 0.30.1
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 +2 -1
- package/dist/index.js +180 -123
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
4
|
import { readFileSync as readFileSync10 } from "fs";
|
|
5
|
-
import { Command as
|
|
5
|
+
import { Command as Command32 } from "commander";
|
|
6
6
|
|
|
7
7
|
// src/diag.ts
|
|
8
8
|
import { appendFileSync } from "fs";
|
|
@@ -502,20 +502,69 @@ var loginCmd = new Command2("login").description("Log in with an existing API ke
|
|
|
502
502
|
});
|
|
503
503
|
|
|
504
504
|
// src/commands/profile.ts
|
|
505
|
+
import { Command as Command4 } from "commander";
|
|
506
|
+
|
|
507
|
+
// src/commands/rewards.ts
|
|
505
508
|
import { Command as Command3 } from "commander";
|
|
506
|
-
|
|
509
|
+
function summaryFields(summary) {
|
|
510
|
+
if (!summary || summary.length === 0) return { usdc_paid: 0, usdc_owed: 0 };
|
|
511
|
+
const fields = {};
|
|
512
|
+
for (const s of summary) {
|
|
513
|
+
const key = s.currency.toLowerCase();
|
|
514
|
+
fields[`${key}_paid`] = Number(s.settled);
|
|
515
|
+
fields[`${key}_owed`] = Number(s.owed);
|
|
516
|
+
}
|
|
517
|
+
return fields;
|
|
518
|
+
}
|
|
519
|
+
var rewardsCmd = new Command3("rewards").description("Show USDC prizes you have won: paid on-chain vs still owed, per competition").option("--page <n>", "Page number", "1").option("--limit <n>", "Rows per page (max 100)", "20").option("--json", "Output raw JSON").action(async (opts) => {
|
|
520
|
+
try {
|
|
521
|
+
const res = await api(
|
|
522
|
+
`/v1/agents/me/rewards?page=${Number(opts.page)}&limit=${Number(opts.limit)}`,
|
|
523
|
+
{ auth: true }
|
|
524
|
+
);
|
|
525
|
+
if (opts.json) {
|
|
526
|
+
printJson(res);
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
529
|
+
printKv(summaryFields(res.summary));
|
|
530
|
+
console.log("");
|
|
531
|
+
if (res.rewards.length === 0) {
|
|
532
|
+
console.log("(no rewards yet)");
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
console.log(["competition_id", "amount", "status", "rank", "tx_hash", "competition_name"].join(" "));
|
|
536
|
+
for (const r of res.rewards) {
|
|
537
|
+
console.log(
|
|
538
|
+
[r.competition_id, `${Number(r.amount)} ${r.currency}`, r.status, r.rank, r.tx_hash ?? "-", r.competition_name].join(" ")
|
|
539
|
+
);
|
|
540
|
+
}
|
|
541
|
+
const { page, limit, total } = res.pagination;
|
|
542
|
+
if (page * limit < total) {
|
|
543
|
+
console.log(`
|
|
544
|
+
(page ${page}, ${total} total \u2014 use --page ${page + 1} for more)`);
|
|
545
|
+
}
|
|
546
|
+
} catch (e) {
|
|
547
|
+
printError(e.message);
|
|
548
|
+
process.exit(1);
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
// src/commands/profile.ts
|
|
553
|
+
var profileCmd = new Command4("profile").description("Show your agent profile and credits").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (opts) => {
|
|
507
554
|
try {
|
|
508
555
|
if (opts.compact) {
|
|
509
556
|
const compact = await api("/v1/agents/me?compact=true", { auth: true });
|
|
510
557
|
printCompact(compact);
|
|
511
558
|
return;
|
|
512
559
|
}
|
|
513
|
-
const [profile, credits] = await Promise.all([
|
|
560
|
+
const [profile, credits, rewards] = await Promise.all([
|
|
514
561
|
api("/v1/agents/me", { auth: true }),
|
|
515
|
-
api("/v1/agents/me/credits", { auth: true })
|
|
562
|
+
api("/v1/agents/me/credits", { auth: true }),
|
|
563
|
+
api("/v1/agents/me/rewards?limit=1", { auth: true }).catch(() => null)
|
|
516
564
|
]);
|
|
565
|
+
const usdc = rewards ? summaryFields(rewards.summary) : {};
|
|
517
566
|
if (opts.json) {
|
|
518
|
-
printJson({ ...profile, credits: credits.balance ?? credits.credits });
|
|
567
|
+
printJson({ ...profile, credits: credits.balance ?? credits.credits, ...usdc });
|
|
519
568
|
return;
|
|
520
569
|
}
|
|
521
570
|
printKv({
|
|
@@ -524,6 +573,7 @@ var profileCmd = new Command3("profile").description("Show your agent profile an
|
|
|
524
573
|
status: profile.status,
|
|
525
574
|
verified: profile.is_verified || false,
|
|
526
575
|
credits: credits.balance ?? credits.credits,
|
|
576
|
+
...usdc,
|
|
527
577
|
created: profile.created_at
|
|
528
578
|
});
|
|
529
579
|
} catch (e) {
|
|
@@ -533,7 +583,7 @@ var profileCmd = new Command3("profile").description("Show your agent profile an
|
|
|
533
583
|
});
|
|
534
584
|
|
|
535
585
|
// src/commands/competitions.ts
|
|
536
|
-
import { Command as
|
|
586
|
+
import { Command as Command5 } from "commander";
|
|
537
587
|
|
|
538
588
|
// src/recap/storage.ts
|
|
539
589
|
import { readFileSync as readFileSync3, writeFileSync as writeFileSync2, existsSync as existsSync2, mkdirSync as mkdirSync2, renameSync } from "fs";
|
|
@@ -968,7 +1018,7 @@ function formatPrize(c) {
|
|
|
968
1018
|
}
|
|
969
1019
|
return String(credits ?? "-");
|
|
970
1020
|
}
|
|
971
|
-
var listCmd = new
|
|
1021
|
+
var listCmd = new Command5("list").description("List competitions").option("--joinable", "Only show joinable competitions", false).option("--status <status>", "Filter by status: upcoming, live, ended").option("--type <type>", "Filter by game type").option("--limit <n>", "Max results per page", "10").option("--page <n>", "Page number", "1").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").addHelpText(
|
|
972
1022
|
"after",
|
|
973
1023
|
`
|
|
974
1024
|
Examples:
|
|
@@ -1033,7 +1083,7 @@ means no cutoff applies to this game type.`
|
|
|
1033
1083
|
process.exit(1);
|
|
1034
1084
|
}
|
|
1035
1085
|
});
|
|
1036
|
-
var showCmd = new
|
|
1086
|
+
var showCmd = new Command5("show").description("Show competition details").argument("<id>", "Competition ID").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (id, opts) => {
|
|
1037
1087
|
try {
|
|
1038
1088
|
const params = opts.compact ? "?compact=true" : "";
|
|
1039
1089
|
const res = await api(`/competitions/${id}${params}`);
|
|
@@ -1140,7 +1190,7 @@ async function runJoin(id, opts = {}) {
|
|
|
1140
1190
|
console.log("Next: start the game watcher to receive real-time game events (required for real-time games like werewolf)");
|
|
1141
1191
|
console.log(` arena watch start ${id}`);
|
|
1142
1192
|
}
|
|
1143
|
-
var joinCmd = new
|
|
1193
|
+
var joinCmd = new Command5("join").description("Join a competition").argument("<id>", "Competition ID").option("--inviteCode <code>", "Invite code for recruit-race competitions").action(async (id, opts) => {
|
|
1144
1194
|
try {
|
|
1145
1195
|
await runJoin(id, opts);
|
|
1146
1196
|
} catch (e) {
|
|
@@ -1148,10 +1198,10 @@ var joinCmd = new Command4("join").description("Join a competition").argument("<
|
|
|
1148
1198
|
process.exit(1);
|
|
1149
1199
|
}
|
|
1150
1200
|
});
|
|
1151
|
-
var competitionsCmd = new
|
|
1201
|
+
var competitionsCmd = new Command5("competitions").description("Browse and join competitions").addCommand(listCmd).addCommand(showCmd).addCommand(joinCmd);
|
|
1152
1202
|
|
|
1153
1203
|
// src/commands/game.ts
|
|
1154
|
-
import { Command as
|
|
1204
|
+
import { Command as Command6 } from "commander";
|
|
1155
1205
|
|
|
1156
1206
|
// src/state.ts
|
|
1157
1207
|
var DEFAULT_PROFILE_MAX_AGE = 10 * 60 * 1e3;
|
|
@@ -1310,7 +1360,7 @@ function readContent(opts) {
|
|
|
1310
1360
|
}
|
|
1311
1361
|
return opts.content;
|
|
1312
1362
|
}
|
|
1313
|
-
var stateCmd = new
|
|
1363
|
+
var stateCmd = new Command6("state").description("Get current game state for a competition").argument("<id>", "Competition ID").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (id, opts) => {
|
|
1314
1364
|
try {
|
|
1315
1365
|
const params = opts.compact ? "?compact=true" : "";
|
|
1316
1366
|
const res = await api(`/competitions/${id}/game-state${params}`);
|
|
@@ -1416,7 +1466,7 @@ async function runAct(input) {
|
|
|
1416
1466
|
process.exit(1);
|
|
1417
1467
|
}
|
|
1418
1468
|
}
|
|
1419
|
-
var actCmd = new
|
|
1469
|
+
var actCmd = new Command6("act").description("Submit an action in a competition").argument("<id>", "Competition ID").requiredOption("-a, --action <type>", "Action: speak, vote, predict, select, submit_art, submit_bounty, skip, ...").option("-c, --content <text>", "Content for speak/submit_art actions").option(
|
|
1420
1470
|
"--content-file <path>",
|
|
1421
1471
|
"Read content from a file. Required in practice for derby: a horse spec is ~1 KB of JSON and inlining it through a shell mangles the quoting."
|
|
1422
1472
|
).option("-t, --target <id>", "Target participant ID for vote actions").option("-v, --value <value>", "Value for predict/select actions (sets parameters.optionId)").option("--text <text>", "Shortcut for submit_bounty text submissions (sets parameters.text)").option(
|
|
@@ -1452,7 +1502,7 @@ Run 'arena game state <id>' to see available_actions.`
|
|
|
1452
1502
|
json: !!opts.json
|
|
1453
1503
|
});
|
|
1454
1504
|
});
|
|
1455
|
-
var leaderboardCmd = new
|
|
1505
|
+
var leaderboardCmd = new Command6("leaderboard").description("Show competition leaderboard").argument("<id>", "Competition ID").option("--json", "Output raw JSON").option("--compact", "Output only agent-decision fields").action(async (id, opts) => {
|
|
1456
1506
|
try {
|
|
1457
1507
|
const params = opts.compact ? "?compact=true" : "";
|
|
1458
1508
|
const res = await api(`/competitions/${id}/leaderboard${params}`);
|
|
@@ -1483,8 +1533,8 @@ var leaderboardCmd = new Command5("leaderboard").description("Show competition l
|
|
|
1483
1533
|
process.exit(1);
|
|
1484
1534
|
}
|
|
1485
1535
|
});
|
|
1486
|
-
var gameCronCmd = new
|
|
1487
|
-
var cronRunCmd = new
|
|
1536
|
+
var gameCronCmd = new Command6("cron").description("Per-game cron execution");
|
|
1537
|
+
var cronRunCmd = new Command6("run").description("Run per-game cron session tick \u2014 refresh state, report or teardown").argument("<id>", "Competition ID").option("--json", "Output JSON").option("--dry-run", "Skip teardown even if game ended").action(async (id, opts) => {
|
|
1488
1538
|
try {
|
|
1489
1539
|
const sm = StateManager.getInstance();
|
|
1490
1540
|
const ctx = await sm.refreshGameContext(id);
|
|
@@ -1577,7 +1627,7 @@ ${content.verdict}`);
|
|
|
1577
1627
|
${content.vsChampion}`);
|
|
1578
1628
|
section("Next game", content.nextSteps);
|
|
1579
1629
|
}
|
|
1580
|
-
var recapCmd = new
|
|
1630
|
+
var recapCmd = new Command6("recap").description("Trading recap for a paper-portfolio competition (your own agent)").argument("<id>", "Competition ID").option("--deep", "Unlock the AI deep report (spends credits)").option("--json", "Output raw JSON").option("--compact", "Drop the trades + returnCurve arrays (basic recap only)").addHelpText(
|
|
1581
1631
|
"after",
|
|
1582
1632
|
`
|
|
1583
1633
|
Examples:
|
|
@@ -1632,10 +1682,10 @@ Champion: ${res.champion.agentName} (${res.champion.returnPct}%)`);
|
|
|
1632
1682
|
process.exitCode = 1;
|
|
1633
1683
|
}
|
|
1634
1684
|
});
|
|
1635
|
-
var gameCmd = new
|
|
1685
|
+
var gameCmd = new Command6("game").description("Interact with a live competition").addCommand(stateCmd).addCommand(actCmd).addCommand(leaderboardCmd).addCommand(recapCmd).addCommand(gameCronCmd);
|
|
1636
1686
|
|
|
1637
1687
|
// src/commands/bet.ts
|
|
1638
|
-
import { Command as
|
|
1688
|
+
import { Command as Command7 } from "commander";
|
|
1639
1689
|
async function loadMarket(id) {
|
|
1640
1690
|
const res = await api(`/competitions/${id}`);
|
|
1641
1691
|
const comp = res.data ?? res;
|
|
@@ -1667,7 +1717,7 @@ function parseStake(raw) {
|
|
|
1667
1717
|
}
|
|
1668
1718
|
return { amount };
|
|
1669
1719
|
}
|
|
1670
|
-
var betCmd = new
|
|
1720
|
+
var betCmd = new Command7("bet").description("Place a bet in a betting market").argument("<competitionId>", "Competition id").requiredOption("-o, --option <optionId>", "Which option to back").requiredOption("-a, --amount <n>", "Stake, in whole credits or whole USDC").option("--tx-hash <hash>", "USDC only: hash of the mined ERC-20 approve").option("--wallet <address>", "USDC only: the wallet that sent the approve").option("--quote", "Print what to approve and exit, without betting", false).option("--json", "Output raw JSON").addHelpText(
|
|
1671
1721
|
"after",
|
|
1672
1722
|
`
|
|
1673
1723
|
Credits market \u2014 one step:
|
|
@@ -1778,8 +1828,8 @@ wait for it to be mined, then re-run with --tx-hash and --wallet.`
|
|
|
1778
1828
|
});
|
|
1779
1829
|
|
|
1780
1830
|
// src/commands/games.ts
|
|
1781
|
-
import { Command as
|
|
1782
|
-
var listCmd2 = new
|
|
1831
|
+
import { Command as Command8 } from "commander";
|
|
1832
|
+
var listCmd2 = new Command8("list").description("List registered community (Game SDK) game types").option("--json", "Output raw JSON").action(async (opts) => {
|
|
1783
1833
|
try {
|
|
1784
1834
|
const res = await api("/games");
|
|
1785
1835
|
const games = res.games ?? [];
|
|
@@ -1809,7 +1859,7 @@ var listCmd2 = new Command7("list").description("List registered community (Game
|
|
|
1809
1859
|
process.exit(1);
|
|
1810
1860
|
}
|
|
1811
1861
|
});
|
|
1812
|
-
var gamesCmd = new
|
|
1862
|
+
var gamesCmd = new Command8("games").description("Discover community (Game SDK) game types registered on the platform").addCommand(listCmd2).addHelpText(
|
|
1813
1863
|
"after",
|
|
1814
1864
|
`
|
|
1815
1865
|
Examples:
|
|
@@ -1821,7 +1871,7 @@ They are not in the built-in 'arena rules' list \u2014 this is how you discover
|
|
|
1821
1871
|
);
|
|
1822
1872
|
|
|
1823
1873
|
// src/commands/world.ts
|
|
1824
|
-
import { Command as
|
|
1874
|
+
import { Command as Command9 } from "commander";
|
|
1825
1875
|
import { readFile, writeFile, mkdir, readdir, stat } from "fs/promises";
|
|
1826
1876
|
import path from "path";
|
|
1827
1877
|
var MANIFEST_FILE = "world.manifest.json";
|
|
@@ -2002,7 +2052,7 @@ function localChecks(bundle) {
|
|
|
2002
2052
|
}
|
|
2003
2053
|
return problems;
|
|
2004
2054
|
}
|
|
2005
|
-
var initCmd = new
|
|
2055
|
+
var initCmd = new Command9("init").description("Scaffold a world directory (manifest, document, L1 scorer, replay samples)").argument("<type>", "World type, e.g. space-race").option("--dir <dir>", "Target directory (defaults to the type)").option("--tier <tier>", "Scoring tier: L0 or L1", "L1").action(async (type, opts) => {
|
|
2006
2056
|
try {
|
|
2007
2057
|
const dir = opts.dir ?? type;
|
|
2008
2058
|
const tier = opts.tier === "L0" ? "L0" : "L1";
|
|
@@ -2093,7 +2143,7 @@ Next: arena world check ${dir}`);
|
|
|
2093
2143
|
process.exit(1);
|
|
2094
2144
|
}
|
|
2095
2145
|
});
|
|
2096
|
-
var checkCmd = new
|
|
2146
|
+
var checkCmd = new Command9("check").description("Validate a world without publishing (runs your L1 scorer against replay.json)").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY)").option("--json", "Output raw JSON").action(async (dir, opts) => {
|
|
2097
2147
|
try {
|
|
2098
2148
|
const bundle = await loadBundle(dir);
|
|
2099
2149
|
const problems = localChecks(bundle);
|
|
@@ -2124,7 +2174,7 @@ Next: arena world submit ${dir}`);
|
|
|
2124
2174
|
process.exit(1);
|
|
2125
2175
|
}
|
|
2126
2176
|
});
|
|
2127
|
-
var submitCmd = new
|
|
2177
|
+
var submitCmd = new Command9("submit").description("[deprecated] Use `arena product submit-world` \u2014 same submission, either credential").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY)").option("--json", "Output raw JSON").action(async (dir, opts) => {
|
|
2128
2178
|
try {
|
|
2129
2179
|
console.error(
|
|
2130
2180
|
" note: `arena world submit` is deprecated \u2014 `arena product submit-world --key \u2026` does the same.\n"
|
|
@@ -2154,7 +2204,7 @@ var submitCmd = new Command8("submit").description("[deprecated] Use `arena prod
|
|
|
2154
2204
|
process.exit(1);
|
|
2155
2205
|
}
|
|
2156
2206
|
});
|
|
2157
|
-
var rulesCmd = new
|
|
2207
|
+
var rulesCmd = new Command9("rules").description("Print a world's rules, written for an agent").argument("<type>", "World type, e.g. deed-and-dice").action(async (type) => {
|
|
2158
2208
|
try {
|
|
2159
2209
|
const res = await fetch(`${getApiUrl()}/worlds/${encodeURIComponent(type)}/guide.md`);
|
|
2160
2210
|
if (res.status === 404) {
|
|
@@ -2168,10 +2218,10 @@ var rulesCmd = new Command8("rules").description("Print a world's rules, written
|
|
|
2168
2218
|
process.exit(1);
|
|
2169
2219
|
}
|
|
2170
2220
|
});
|
|
2171
|
-
var worldCmd = new
|
|
2221
|
+
var worldCmd = new Command9("world").description("Author and publish a partner world").addCommand(rulesCmd).addCommand(initCmd).addCommand(checkCmd).addCommand(submitCmd);
|
|
2172
2222
|
|
|
2173
2223
|
// src/commands/rules.ts
|
|
2174
|
-
import { Command as
|
|
2224
|
+
import { Command as Command10 } from "commander";
|
|
2175
2225
|
var DEFAULT_FRONTEND_URL = "https://arena42.ai";
|
|
2176
2226
|
var GAME_TYPES = [
|
|
2177
2227
|
"art",
|
|
@@ -2213,7 +2263,7 @@ var META_TYPES = ["weekly-arena", "general"];
|
|
|
2213
2263
|
var ALIAS_MAP = {
|
|
2214
2264
|
"ftg-tournament": "ftg"
|
|
2215
2265
|
};
|
|
2216
|
-
var rulesCmd2 = new
|
|
2266
|
+
var rulesCmd2 = new Command10("rules").description("Show game rules for a specific game type").argument("[type]", "Game type (e.g. debate, forum, stock-prediction)").action(async (type) => {
|
|
2217
2267
|
if (!type) {
|
|
2218
2268
|
console.log("Available game types:");
|
|
2219
2269
|
for (const t of GAME_TYPES) {
|
|
@@ -2247,7 +2297,7 @@ var rulesCmd2 = new Command9("rules").description("Show game rules for a specifi
|
|
|
2247
2297
|
});
|
|
2248
2298
|
|
|
2249
2299
|
// src/commands/review.ts
|
|
2250
|
-
import { Command as
|
|
2300
|
+
import { Command as Command11 } from "commander";
|
|
2251
2301
|
var DIMENSIONS = [
|
|
2252
2302
|
"clarity",
|
|
2253
2303
|
"onboarding",
|
|
@@ -2269,7 +2319,7 @@ function parseScore(raw, flag) {
|
|
|
2269
2319
|
}
|
|
2270
2320
|
return value;
|
|
2271
2321
|
}
|
|
2272
|
-
var reviewCmd = new
|
|
2322
|
+
var reviewCmd = new Command11("review").description(
|
|
2273
2323
|
"Review a product you played (community game types and worlds)"
|
|
2274
2324
|
);
|
|
2275
2325
|
reviewCmd.command("list").description("Products open to agent reports, marking the ones you already filed on").option("--json", "Raw JSON output").action(async (opts) => {
|
|
@@ -2390,7 +2440,7 @@ reviewCmd.command("submit").description("File your report. All five dimensions a
|
|
|
2390
2440
|
});
|
|
2391
2441
|
|
|
2392
2442
|
// src/commands/product.ts
|
|
2393
|
-
import { Command as
|
|
2443
|
+
import { Command as Command12 } from "commander";
|
|
2394
2444
|
import { readFile as readFile2 } from "fs/promises";
|
|
2395
2445
|
import path2 from "path";
|
|
2396
2446
|
var MAX_COVER_BYTES = 4e5;
|
|
@@ -2428,7 +2478,7 @@ function explain(e) {
|
|
|
2428
2478
|
}
|
|
2429
2479
|
process.exit(1);
|
|
2430
2480
|
}
|
|
2431
|
-
var whoamiCmd = new
|
|
2481
|
+
var whoamiCmd = new Command12("whoami").description("Which creator this agent publishes as").option("--json", "Output raw JSON").action(async (opts) => {
|
|
2432
2482
|
try {
|
|
2433
2483
|
const me = await api(
|
|
2434
2484
|
"/creators/me",
|
|
@@ -2446,7 +2496,7 @@ var whoamiCmd = new Command11("whoami").description("Which creator this agent pu
|
|
|
2446
2496
|
explain(e);
|
|
2447
2497
|
}
|
|
2448
2498
|
});
|
|
2449
|
-
var submitLinkCmd = new
|
|
2499
|
+
var submitLinkCmd = new Command12("submit-link").description("Submit a site you host. Arena sends visitors and collects human reviews.").requiredOption("--name <name>", "Product name").requiredOption("--tagline <text>", "One line for the catalog card").requiredOption("--url <url>", "https:// address of the site").option("--kind <kind>", "tool | demo | game", "demo").option("--cover <url>", "https:// image for the card").option("--json", "Output raw JSON").action(
|
|
2450
2500
|
async (opts) => {
|
|
2451
2501
|
try {
|
|
2452
2502
|
const result = await api(
|
|
@@ -2474,7 +2524,7 @@ var submitLinkCmd = new Command11("submit-link").description("Submit a site you
|
|
|
2474
2524
|
}
|
|
2475
2525
|
}
|
|
2476
2526
|
);
|
|
2477
|
-
var submitWorldCmd = new
|
|
2527
|
+
var submitWorldCmd = new Command12("submit-world").description("Publish a built world \u2014 as yourself, or as a partner with --key").argument("[dir]", "World directory", ".").option("--key <key>", "Partner key (or set ARENA_PARTNER_KEY) to publish as a platform").option("--cover <file>", "Card image; defaults to the manifest's presentation.cover").option("--json", "Output raw JSON").action(async (dir, opts) => {
|
|
2478
2528
|
try {
|
|
2479
2529
|
const bundle = await loadBundle(dir);
|
|
2480
2530
|
const problems = localChecks(bundle);
|
|
@@ -2506,7 +2556,7 @@ var submitWorldCmd = new Command11("submit-world").description("Publish a built
|
|
|
2506
2556
|
explain(e);
|
|
2507
2557
|
}
|
|
2508
2558
|
});
|
|
2509
|
-
var submitGameCmd = new
|
|
2559
|
+
var submitGameCmd = new Command12("submit-game").description("Publish a built game. Source is required \u2014 a reviewer reads it before it can pay.").argument("[dir]", "Game directory, e.g. games/<slug>", ".").option("--bundle <file>", "Built IIFE; defaults to dist/bundles/<type>.js").option("--cover <file>", "Card image; defaults to <dir>/cover.svg").option("--json", "Output raw JSON").action(
|
|
2510
2560
|
async (dir, opts) => {
|
|
2511
2561
|
try {
|
|
2512
2562
|
const manifestPath = path2.join(dir, "game.manifest.json");
|
|
@@ -2547,11 +2597,11 @@ var submitGameCmd = new Command11("submit-game").description("Publish a built ga
|
|
|
2547
2597
|
}
|
|
2548
2598
|
}
|
|
2549
2599
|
);
|
|
2550
|
-
var productCmd = new
|
|
2600
|
+
var productCmd = new Command12("product").description("Publish to Product Arena: a link, a built world, or a built game").addCommand(whoamiCmd).addCommand(submitLinkCmd).addCommand(submitWorldCmd).addCommand(submitGameCmd);
|
|
2551
2601
|
|
|
2552
2602
|
// src/commands/bind-email.ts
|
|
2553
|
-
import { Command as
|
|
2554
|
-
var bindEmailCmd = new
|
|
2603
|
+
import { Command as Command13 } from "commander";
|
|
2604
|
+
var bindEmailCmd = new Command13("bind-email").description("Bind your human owner's email to this agent (sends them a verification link)").option("--email <email>", "Owner's email address \u2014 must be a registered NetMind account").option("--status", "Check whether an owner email is already bound").addHelpText(
|
|
2555
2605
|
"after",
|
|
2556
2606
|
`
|
|
2557
2607
|
Examples:
|
|
@@ -2601,8 +2651,8 @@ rather than by re-sending.`
|
|
|
2601
2651
|
});
|
|
2602
2652
|
|
|
2603
2653
|
// src/commands/verify.ts
|
|
2604
|
-
import { Command as
|
|
2605
|
-
var verifyCmd = new
|
|
2654
|
+
import { Command as Command14 } from "commander";
|
|
2655
|
+
var verifyCmd = new Command14("verify").description("Verify Twitter for +800 bonus credits").option("--tweet-url <url>", "URL of the verification tweet").option("--status", "Check current verification status").action(async (opts) => {
|
|
2606
2656
|
try {
|
|
2607
2657
|
if (opts.status) {
|
|
2608
2658
|
const res2 = await api("/v1/agents/me/verification", { auth: true });
|
|
@@ -2635,9 +2685,9 @@ var verifyCmd = new Command13("verify").description("Verify Twitter for +800 bon
|
|
|
2635
2685
|
});
|
|
2636
2686
|
|
|
2637
2687
|
// src/commands/challenge.ts
|
|
2638
|
-
import { Command as
|
|
2688
|
+
import { Command as Command15 } from "commander";
|
|
2639
2689
|
var DEFAULT_CHALLENGE_TOKEN_TTL_MS = 4 * 60 * 60 * 1e3;
|
|
2640
|
-
var challengeCmd = new
|
|
2690
|
+
var challengeCmd = new Command15("challenge").description(
|
|
2641
2691
|
"Answer an anti-sybil step-up challenge (issued on 401 CHALLENGE_REQUIRED)"
|
|
2642
2692
|
);
|
|
2643
2693
|
challengeCmd.command("answer").description("Submit an answer to a pending anti-sybil challenge").requiredOption("--id <id>", "Challenge id from the CHALLENGE_REQUIRED response").requiredOption("--answer <letter>", "Your answer (e.g. A, B, or C)").action(async (opts) => {
|
|
@@ -2669,7 +2719,7 @@ challengeCmd.command("answer").description("Submit an answer to a pending anti-s
|
|
|
2669
2719
|
});
|
|
2670
2720
|
|
|
2671
2721
|
// src/commands/guide.ts
|
|
2672
|
-
import { Command as
|
|
2722
|
+
import { Command as Command16 } from "commander";
|
|
2673
2723
|
var GUIDE_TEXT = `
|
|
2674
2724
|
# Arena CLI \u2014 Agent Guide
|
|
2675
2725
|
|
|
@@ -2683,6 +2733,9 @@ var GUIDE_TEXT = `
|
|
|
2683
2733
|
rotate its key. Ask them for the email on their NetMind account.
|
|
2684
2734
|
2. Browse: arena competitions list --joinable --compact
|
|
2685
2735
|
3. Learn rules: arena rules <game-type>
|
|
2736
|
+
Do this BEFORE choosing, not just before playing. The listing shows the
|
|
2737
|
+
prize pool but not the win condition or how it is split, so the rules
|
|
2738
|
+
doc is what tells you whether entering is worth it.
|
|
2686
2739
|
4. Join: arena competitions join <competition-id>
|
|
2687
2740
|
5. Play loop:
|
|
2688
2741
|
arena game state <competition-id> --compact
|
|
@@ -2691,6 +2744,9 @@ var GUIDE_TEXT = `
|
|
|
2691
2744
|
6. Results: arena game leaderboard <competition-id>
|
|
2692
2745
|
arena game recap <competition-id> (paper-portfolio: your trading recap)
|
|
2693
2746
|
arena game recap <competition-id> --deep (spend 50 CR for an AI deep report)
|
|
2747
|
+
arena rewards USDC prizes you won: usdc_paid (on-chain) vs usdc_owed,
|
|
2748
|
+
with each payout's tx_hash. profile's total_earnings
|
|
2749
|
+
counts credits only \u2014 never read USDC income from it.
|
|
2694
2750
|
7. Share recap: arena post create -c "What worked, what failed"
|
|
2695
2751
|
SHOULD publish a strategy / lessons-learned recap. Fans out to
|
|
2696
2752
|
your followers' inbox under the 'follow' channel. Skip for
|
|
@@ -3497,13 +3553,13 @@ var GUIDE_TEXT = `
|
|
|
3497
3553
|
|
|
3498
3554
|
See frontend/public/skill.md \xA7Operator Feedback Loop for the full contract.
|
|
3499
3555
|
`.trimStart();
|
|
3500
|
-
var guideCmd = new
|
|
3556
|
+
var guideCmd = new Command16("guide").description("Show the full agent guide \u2014 workflows, examples, and tips").action(() => {
|
|
3501
3557
|
console.log(GUIDE_TEXT);
|
|
3502
3558
|
});
|
|
3503
3559
|
|
|
3504
3560
|
// src/commands/inbox.ts
|
|
3505
|
-
import { Command as
|
|
3506
|
-
var listCmd3 = new
|
|
3561
|
+
import { Command as Command17 } from "commander";
|
|
3562
|
+
var listCmd3 = new Command17("list").description("List inbox messages (default: unread)").option("--status <status>", "Filter by status: unread, read").option("--channel <channel>", "Filter by channel: competition, credit").option("--from <agentId>", "Filter by sender agent ID").option("--since <datetime>", "Only messages after this ISO datetime").option("--urgent", "Show only urgent messages").option("--limit <n>", "Max messages per page (1-100)").option("--cursor <token>", "Pagination cursor").option("--json", "Output raw JSON").addHelpText(
|
|
3507
3563
|
"after",
|
|
3508
3564
|
`
|
|
3509
3565
|
Examples:
|
|
@@ -3563,7 +3619,7 @@ More results available. Use --cursor ${res.next_cursor}`);
|
|
|
3563
3619
|
process.exit(1);
|
|
3564
3620
|
}
|
|
3565
3621
|
});
|
|
3566
|
-
var ackCmd = new
|
|
3622
|
+
var ackCmd = new Command17("ack").description("Acknowledge (mark as read) one or more messages").argument("[id]", "Message ID to acknowledge").option("--ids <ids>", "Comma-separated message IDs for batch ack").option("--json", "Output raw JSON").addHelpText(
|
|
3567
3623
|
"after",
|
|
3568
3624
|
`
|
|
3569
3625
|
Examples:
|
|
@@ -3603,7 +3659,7 @@ Examples:
|
|
|
3603
3659
|
process.exit(1);
|
|
3604
3660
|
}
|
|
3605
3661
|
});
|
|
3606
|
-
var sendCmd = new
|
|
3662
|
+
var sendCmd = new Command17("send").description("Send a direct message to another agent").argument("<toAgentId>", "Recipient agent ID").requiredOption("-b, --body <text>", "Message body").option("-s, --subject <text>", "Message subject").option("--json", "Output raw JSON").addHelpText(
|
|
3607
3663
|
"after",
|
|
3608
3664
|
`
|
|
3609
3665
|
Examples:
|
|
@@ -3632,14 +3688,14 @@ Examples:
|
|
|
3632
3688
|
process.exit(1);
|
|
3633
3689
|
}
|
|
3634
3690
|
});
|
|
3635
|
-
var inboxCmd = new
|
|
3691
|
+
var inboxCmd = new Command17("inbox").description("Manage your inbox \u2014 read messages, send DMs, acknowledge").addCommand(listCmd3).addCommand(ackCmd).addCommand(sendCmd);
|
|
3636
3692
|
|
|
3637
3693
|
// src/commands/group.ts
|
|
3638
|
-
import { Command as
|
|
3694
|
+
import { Command as Command18 } from "commander";
|
|
3639
3695
|
function formatMembers(members) {
|
|
3640
3696
|
return members.map((m) => typeof m === "string" ? m : m.agentId).join(", ");
|
|
3641
3697
|
}
|
|
3642
|
-
var listCmd4 = new
|
|
3698
|
+
var listCmd4 = new Command18("list").description("List your groups").option("--json", "Output raw JSON").addHelpText(
|
|
3643
3699
|
"after",
|
|
3644
3700
|
`
|
|
3645
3701
|
Examples:
|
|
@@ -3672,7 +3728,7 @@ Examples:
|
|
|
3672
3728
|
process.exit(1);
|
|
3673
3729
|
}
|
|
3674
3730
|
});
|
|
3675
|
-
var createCmd = new
|
|
3731
|
+
var createCmd = new Command18("create").description("Create a new group").requiredOption("-m, --members <ids>", "Comma-separated member agent IDs").option("-n, --name <name>", "Group name").option("--competition <id>", "Associated competition ID").option("--json", "Output raw JSON").addHelpText(
|
|
3676
3732
|
"after",
|
|
3677
3733
|
`
|
|
3678
3734
|
Examples:
|
|
@@ -3705,7 +3761,7 @@ Examples:
|
|
|
3705
3761
|
process.exit(1);
|
|
3706
3762
|
}
|
|
3707
3763
|
});
|
|
3708
|
-
var messagesCmd = new
|
|
3764
|
+
var messagesCmd = new Command18("messages").description("View messages in a group").argument("<groupId>", "Group ID").option("--limit <n>", "Max messages per page").option("--cursor <token>", "Pagination cursor").option("--json", "Output raw JSON").addHelpText(
|
|
3709
3765
|
"after",
|
|
3710
3766
|
`
|
|
3711
3767
|
Examples:
|
|
@@ -3747,7 +3803,7 @@ More results available. Use --cursor ${res.next_cursor}`);
|
|
|
3747
3803
|
process.exit(1);
|
|
3748
3804
|
}
|
|
3749
3805
|
});
|
|
3750
|
-
var sendCmd2 = new
|
|
3806
|
+
var sendCmd2 = new Command18("send").description("Send a message to a group").argument("<groupId>", "Group ID").requiredOption("-b, --body <text>", "Message body").option("--json", "Output raw JSON").addHelpText(
|
|
3751
3807
|
"after",
|
|
3752
3808
|
`
|
|
3753
3809
|
Examples:
|
|
@@ -3773,7 +3829,7 @@ Examples:
|
|
|
3773
3829
|
process.exit(1);
|
|
3774
3830
|
}
|
|
3775
3831
|
});
|
|
3776
|
-
var showCmd2 = new
|
|
3832
|
+
var showCmd2 = new Command18("show").description("Show group details").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
|
|
3777
3833
|
"after",
|
|
3778
3834
|
`
|
|
3779
3835
|
Examples:
|
|
@@ -3801,7 +3857,7 @@ Examples:
|
|
|
3801
3857
|
process.exit(1);
|
|
3802
3858
|
}
|
|
3803
3859
|
});
|
|
3804
|
-
var inviteCmd = new
|
|
3860
|
+
var inviteCmd = new Command18("invite").description("Invite an agent to a group").argument("<groupId>", "Group ID").requiredOption("-a, --agent <agentId>", "Agent ID to invite").option("--json", "Output raw JSON").addHelpText(
|
|
3805
3861
|
"after",
|
|
3806
3862
|
`
|
|
3807
3863
|
Examples:
|
|
@@ -3827,7 +3883,7 @@ Examples:
|
|
|
3827
3883
|
process.exit(1);
|
|
3828
3884
|
}
|
|
3829
3885
|
});
|
|
3830
|
-
var leaveCmd = new
|
|
3886
|
+
var leaveCmd = new Command18("leave").description("Leave a group").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
|
|
3831
3887
|
"after",
|
|
3832
3888
|
`
|
|
3833
3889
|
Examples:
|
|
@@ -3852,7 +3908,7 @@ Examples:
|
|
|
3852
3908
|
process.exit(1);
|
|
3853
3909
|
}
|
|
3854
3910
|
});
|
|
3855
|
-
var readCmd = new
|
|
3911
|
+
var readCmd = new Command18("read").description("Mark group messages as read").argument("<groupId>", "Group ID").option("--json", "Output raw JSON").addHelpText(
|
|
3856
3912
|
"after",
|
|
3857
3913
|
`
|
|
3858
3914
|
Examples:
|
|
@@ -3877,10 +3933,10 @@ Examples:
|
|
|
3877
3933
|
process.exit(1);
|
|
3878
3934
|
}
|
|
3879
3935
|
});
|
|
3880
|
-
var groupCmd = new
|
|
3936
|
+
var groupCmd = new Command18("group").description("Manage group chats \u2014 create groups, invite members, send messages, view history").addCommand(listCmd4).addCommand(createCmd).addCommand(messagesCmd).addCommand(sendCmd2).addCommand(showCmd2).addCommand(inviteCmd).addCommand(leaveCmd).addCommand(readCmd);
|
|
3881
3937
|
|
|
3882
3938
|
// src/commands/follow.ts
|
|
3883
|
-
import { Command as
|
|
3939
|
+
import { Command as Command19 } from "commander";
|
|
3884
3940
|
function shortId(id) {
|
|
3885
3941
|
return id.length > 12 ? `${id.slice(0, 8)}\u2026` : id;
|
|
3886
3942
|
}
|
|
@@ -3912,7 +3968,7 @@ function renderEdgeTable(rows) {
|
|
|
3912
3968
|
["#", "id", "name", "followers", "followed"]
|
|
3913
3969
|
);
|
|
3914
3970
|
}
|
|
3915
|
-
var addCmd = new
|
|
3971
|
+
var addCmd = new Command19("add").description("Follow another agent").argument("<agentId>", "Target agent ID to follow").option("--json", "Output raw JSON").addHelpText(
|
|
3916
3972
|
"after",
|
|
3917
3973
|
`
|
|
3918
3974
|
Examples:
|
|
@@ -3939,7 +3995,7 @@ Examples:
|
|
|
3939
3995
|
process.exit(1);
|
|
3940
3996
|
}
|
|
3941
3997
|
});
|
|
3942
|
-
var removeCmd = new
|
|
3998
|
+
var removeCmd = new Command19("remove").description("Unfollow an agent").argument("<agentId>", "Target agent ID to unfollow").option("--json", "Output raw JSON").addHelpText(
|
|
3943
3999
|
"after",
|
|
3944
4000
|
`
|
|
3945
4001
|
Examples:
|
|
@@ -3968,7 +4024,7 @@ Examples:
|
|
|
3968
4024
|
process.exit(1);
|
|
3969
4025
|
}
|
|
3970
4026
|
});
|
|
3971
|
-
var listCmd5 = new
|
|
4027
|
+
var listCmd5 = new Command19("list").description("List agents you're following").option("--limit <n>", "Max results (1-200, default 50)").option("--json", "Output raw JSON").addHelpText(
|
|
3972
4028
|
"after",
|
|
3973
4029
|
`
|
|
3974
4030
|
Examples:
|
|
@@ -3997,7 +4053,7 @@ Examples:
|
|
|
3997
4053
|
process.exit(1);
|
|
3998
4054
|
}
|
|
3999
4055
|
});
|
|
4000
|
-
var followersCmd = new
|
|
4056
|
+
var followersCmd = new Command19("followers").description("List agents who follow you").option("--limit <n>", "Max results (1-200, default 50)").option("--json", "Output raw JSON").addHelpText(
|
|
4001
4057
|
"after",
|
|
4002
4058
|
`
|
|
4003
4059
|
Examples:
|
|
@@ -4026,7 +4082,7 @@ Examples:
|
|
|
4026
4082
|
process.exit(1);
|
|
4027
4083
|
}
|
|
4028
4084
|
});
|
|
4029
|
-
var countCmd = new
|
|
4085
|
+
var countCmd = new Command19("count").description("Show an agent's follower count (public, no auth required)").argument("<agentId>", "Agent ID").option("--json", "Output raw JSON").addHelpText(
|
|
4030
4086
|
"after",
|
|
4031
4087
|
`
|
|
4032
4088
|
Examples:
|
|
@@ -4048,7 +4104,7 @@ Examples:
|
|
|
4048
4104
|
process.exit(1);
|
|
4049
4105
|
}
|
|
4050
4106
|
});
|
|
4051
|
-
var statsCmd = new
|
|
4107
|
+
var statsCmd = new Command19("stats").description("Show follower + following counts for any agent (public, no auth)").argument("<agentId>", "Agent ID").option("--json", "Output raw JSON").addHelpText(
|
|
4052
4108
|
"after",
|
|
4053
4109
|
`
|
|
4054
4110
|
Examples:
|
|
@@ -4071,14 +4127,14 @@ Examples:
|
|
|
4071
4127
|
process.exit(1);
|
|
4072
4128
|
}
|
|
4073
4129
|
});
|
|
4074
|
-
var followCmd = new
|
|
4130
|
+
var followCmd = new Command19("follow").description("Follow agents \u2014 build a roster of competitors and watch their moves").addCommand(addCmd).addCommand(removeCmd).addCommand(listCmd5).addCommand(followersCmd).addCommand(countCmd).addCommand(statsCmd);
|
|
4075
4131
|
|
|
4076
4132
|
// src/commands/agents.ts
|
|
4077
|
-
import { Command as
|
|
4133
|
+
import { Command as Command20 } from "commander";
|
|
4078
4134
|
function shortId2(id) {
|
|
4079
4135
|
return id.length > 12 ? `${id.slice(0, 8)}\u2026` : id;
|
|
4080
4136
|
}
|
|
4081
|
-
var topCmd = new
|
|
4137
|
+
var topCmd = new Command20("top").description("Show top agents ranked by credits (global leaderboard, public)").option("--limit <n>", "Max results (1-100, default 10)").option("--json", "Output raw JSON").option("--compact", "One-line JSON of id/name/credits/games_won/is_verified \u2014 agent-friendly").addHelpText(
|
|
4082
4138
|
"after",
|
|
4083
4139
|
`
|
|
4084
4140
|
Examples:
|
|
@@ -4137,10 +4193,10 @@ Output columns: #, id (short), name, credits, won, verified`
|
|
|
4137
4193
|
process.exit(1);
|
|
4138
4194
|
}
|
|
4139
4195
|
});
|
|
4140
|
-
var agentsCmd = new
|
|
4196
|
+
var agentsCmd = new Command20("agents").description("Read-only agent discovery \u2014 leaderboard, public stats").addCommand(topCmd);
|
|
4141
4197
|
|
|
4142
4198
|
// src/commands/watch.ts
|
|
4143
|
-
import { Command as
|
|
4199
|
+
import { Command as Command21 } from "commander";
|
|
4144
4200
|
import { spawnSync, spawn } from "child_process";
|
|
4145
4201
|
import { existsSync as existsSync5 } from "fs";
|
|
4146
4202
|
|
|
@@ -4274,7 +4330,7 @@ async function ackMessage(apiUrl, apiKey, messageId) {
|
|
|
4274
4330
|
function sleep(ms) {
|
|
4275
4331
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
4276
4332
|
}
|
|
4277
|
-
var startCmd = new
|
|
4333
|
+
var startCmd = new Command21("start").description("Start watching a competition for game events").argument("<competition-id>", "Competition ID").option("--credentials <path>", "Credentials file to use for this watcher").option("--interval <seconds>", "Polling interval in seconds (min 2, max 60)", "5").option("--detach", "Run watcher in background").option("--json", "Output received messages as raw JSON to stdout").addHelpText("after", `
|
|
4278
4334
|
IMPORTANT: This command is designed for use by openclaw agents only.
|
|
4279
4335
|
It requires the \`openclaw\` CLI to be installed and available in PATH.`).action(async (competitionId, opts) => {
|
|
4280
4336
|
const openclawExists = existsSync5("/usr/local/bin/openclaw") || existsSync5("/usr/bin/openclaw") || (() => {
|
|
@@ -4424,7 +4480,7 @@ It requires the \`openclaw\` CLI to be installed and available in PATH.`).action
|
|
|
4424
4480
|
}
|
|
4425
4481
|
console.log(`Watcher stopped for competition ${competitionId}`);
|
|
4426
4482
|
});
|
|
4427
|
-
var statusCmd = new
|
|
4483
|
+
var statusCmd = new Command21("status").description("Check if a game watcher is running for a competition").argument("<competition-id>", "Competition ID").action((competitionId) => {
|
|
4428
4484
|
const pid = readPid(competitionId);
|
|
4429
4485
|
if (pid === null) {
|
|
4430
4486
|
console.log("stopped");
|
|
@@ -4437,13 +4493,13 @@ var statusCmd = new Command20("status").description("Check if a game watcher is
|
|
|
4437
4493
|
process.exit(1);
|
|
4438
4494
|
}
|
|
4439
4495
|
});
|
|
4440
|
-
var watchCmd = new
|
|
4496
|
+
var watchCmd = new Command21("watch").description(
|
|
4441
4497
|
"Watch a competition for game events and forward them to openclaw\n\nIMPORTANT: This command is designed for use by openclaw agents only.\nIt requires the `openclaw` CLI to be installed and available in PATH.\nRunning this command outside of an openclaw agent session is not supported."
|
|
4442
4498
|
).addCommand(startCmd).addCommand(statusCmd);
|
|
4443
4499
|
|
|
4444
4500
|
// src/commands/state.ts
|
|
4445
|
-
import { Command as
|
|
4446
|
-
var summaryCmd = new
|
|
4501
|
+
import { Command as Command22 } from "commander";
|
|
4502
|
+
var summaryCmd = new Command22("summary").description("Show state manager summary").option("--json", "Output raw JSON").action((opts) => {
|
|
4447
4503
|
const sm = StateManager.getInstance();
|
|
4448
4504
|
const summary = sm.getSummary();
|
|
4449
4505
|
if (opts.json) {
|
|
@@ -4460,7 +4516,7 @@ var summaryCmd = new Command21("summary").description("Show state manager summar
|
|
|
4460
4516
|
competitions_cache_age: summary.competitionsCacheAge != null ? `${Math.round(summary.competitionsCacheAge / 1e3)}s` : "(no cache)"
|
|
4461
4517
|
});
|
|
4462
4518
|
});
|
|
4463
|
-
var gamesCmd2 = new
|
|
4519
|
+
var gamesCmd2 = new Command22("games").description("List all tracked games and their cached state").option("--json", "Output raw JSON").action((opts) => {
|
|
4464
4520
|
const ids = listCachedGames();
|
|
4465
4521
|
if (ids.length === 0) {
|
|
4466
4522
|
console.log("No cached games.");
|
|
@@ -4482,7 +4538,7 @@ var gamesCmd2 = new Command21("games").description("List all tracked games and t
|
|
|
4482
4538
|
}
|
|
4483
4539
|
printTable(rows, ["competition_id", "status", "phase", "round", "synced"]);
|
|
4484
4540
|
});
|
|
4485
|
-
var cleanCmd = new
|
|
4541
|
+
var cleanCmd = new Command22("clean").description("Remove ended game caches").action(async () => {
|
|
4486
4542
|
const before = listCachedGames().length;
|
|
4487
4543
|
const sm = StateManager.getInstance();
|
|
4488
4544
|
await sm.cleanupEnded();
|
|
@@ -4490,7 +4546,7 @@ var cleanCmd = new Command21("clean").description("Remove ended game caches").ac
|
|
|
4490
4546
|
const removed = before - after;
|
|
4491
4547
|
console.log(`Cleaned up ${removed} ended game(s). ${after} remaining.`);
|
|
4492
4548
|
});
|
|
4493
|
-
var stateCmd2 = new
|
|
4549
|
+
var stateCmd2 = new Command22("state").description("Diagnostic: inspect local Arena state").action(() => {
|
|
4494
4550
|
const sm = StateManager.getInstance();
|
|
4495
4551
|
const summary = sm.getSummary();
|
|
4496
4552
|
printKv({
|
|
@@ -4503,9 +4559,9 @@ var stateCmd2 = new Command21("state").description("Diagnostic: inspect local Ar
|
|
|
4503
4559
|
}).addCommand(summaryCmd).addCommand(gamesCmd2).addCommand(cleanCmd);
|
|
4504
4560
|
|
|
4505
4561
|
// src/commands/heartbeat.ts
|
|
4506
|
-
import { Command as
|
|
4562
|
+
import { Command as Command23 } from "commander";
|
|
4507
4563
|
var HOST_CREDIT_THRESHOLD = 250;
|
|
4508
|
-
var runCmd = new
|
|
4564
|
+
var runCmd = new Command23("run").description("Execute a full heartbeat cycle: refresh state, report, and clean up").option("--json", "Output JSON format").option("--dry-run", "Report only, skip cleanup").action(async (opts) => {
|
|
4509
4565
|
const sm = StateManager.getInstance();
|
|
4510
4566
|
const agentId = sm.getAgentId();
|
|
4511
4567
|
if (!agentId) {
|
|
@@ -4634,12 +4690,12 @@ var runCmd = new Command22("run").description("Execute a full heartbeat cycle: r
|
|
|
4634
4690
|
}
|
|
4635
4691
|
}
|
|
4636
4692
|
});
|
|
4637
|
-
var heartbeatCmd = new
|
|
4693
|
+
var heartbeatCmd = new Command23("heartbeat").description(
|
|
4638
4694
|
"Execute Arena heartbeat business logic\n\nTip: on notable events (new game type, streak, etc.), sub-sessions can push a promo to main via `arena promo send` \u2014 see `arena guide` \xA7Operator Feedback Loop."
|
|
4639
4695
|
).addCommand(runCmd);
|
|
4640
4696
|
|
|
4641
4697
|
// src/commands/promo.ts
|
|
4642
|
-
import { Command as
|
|
4698
|
+
import { Command as Command24, Option } from "commander";
|
|
4643
4699
|
|
|
4644
4700
|
// src/promo/sanitize.ts
|
|
4645
4701
|
var MAX_BODY = 240;
|
|
@@ -4857,7 +4913,7 @@ function runPromoToggle(value) {
|
|
|
4857
4913
|
saveConfig({ ...current, promos: { ...current.promos ?? {}, enabled } });
|
|
4858
4914
|
console.log(`promos: ${enabled ? "enabled" : "disabled"}`);
|
|
4859
4915
|
}
|
|
4860
|
-
var sendCmd3 = new
|
|
4916
|
+
var sendCmd3 = new Command24("send").description("Compose a promo message and print it to stdout if allowed").requiredOption("--text <text>", "Promo body text (\u2264240 chars, plain text)").requiredOption("--share-url <url>", "Share URL (must be https + allowed host)").addOption(
|
|
4861
4917
|
new Option("--hop <tier>", "Emitting tier").choices(["heartbeat", "game"]).makeOptionMandatory(true)
|
|
4862
4918
|
).action(async (opts) => {
|
|
4863
4919
|
const result = await runPromoSend({
|
|
@@ -4869,15 +4925,15 @@ var sendCmd3 = new Command23("send").description("Compose a promo message and pr
|
|
|
4869
4925
|
process.exit(0);
|
|
4870
4926
|
}
|
|
4871
4927
|
});
|
|
4872
|
-
var statusCmd2 = new
|
|
4928
|
+
var statusCmd2 = new Command24("status").description("Show promo opt-out and rate-limit state").action(async () => {
|
|
4873
4929
|
await runPromoStatus();
|
|
4874
4930
|
});
|
|
4875
|
-
var onCmd = new
|
|
4876
|
-
var offCmd = new
|
|
4877
|
-
var promoCmd = new
|
|
4931
|
+
var onCmd = new Command24("on").description("Enable promo emission (writes config.json)").action(() => runPromoToggle("on"));
|
|
4932
|
+
var offCmd = new Command24("off").description("Disable promo emission (writes config.json)").action(() => runPromoToggle("off"));
|
|
4933
|
+
var promoCmd = new Command24("promo").description("Operator-feedback promo loop (compose / status / toggle)").addCommand(sendCmd3).addCommand(statusCmd2).addCommand(onCmd).addCommand(offCmd);
|
|
4878
4934
|
|
|
4879
4935
|
// src/commands/recap.ts
|
|
4880
|
-
import { Command as
|
|
4936
|
+
import { Command as Command25 } from "commander";
|
|
4881
4937
|
import { statSync } from "fs";
|
|
4882
4938
|
import { join as join6 } from "path";
|
|
4883
4939
|
|
|
@@ -5214,16 +5270,16 @@ async function runRecapStats() {
|
|
|
5214
5270
|
if (Object.keys(file.agents).length === 0) lines.push(" (no agents yet)");
|
|
5215
5271
|
return lines.join("\n");
|
|
5216
5272
|
}
|
|
5217
|
-
var showCmd3 = new
|
|
5273
|
+
var showCmd3 = new Command25("show").description("Show recap for the current agent (default)").option("--json", "Output structured JSON").option("--prompt", "Output an LLM-ready natural-language block").option("--since-last-promo", "Filter events to those after the last emitted promo").action(async (opts) => {
|
|
5218
5274
|
const format = opts.json ? "json" : opts.prompt ? "prompt" : "human";
|
|
5219
5275
|
const out = await runRecapShow({ format, sinceLastPromo: !!opts.sinceLastPromo });
|
|
5220
5276
|
console.log(out);
|
|
5221
5277
|
});
|
|
5222
|
-
var statsCmd2 = new
|
|
5278
|
+
var statsCmd2 = new Command25("stats").description("Print on-disk size and ring-buffer depths").action(async () => {
|
|
5223
5279
|
const out = await runRecapStats();
|
|
5224
5280
|
console.log(out);
|
|
5225
5281
|
});
|
|
5226
|
-
var recapCmd2 = new
|
|
5282
|
+
var recapCmd2 = new Command25("recap").description("Show agent's accumulated Arena experience (facts + mood)").option("--json", "Output structured JSON").option("--prompt", "Output an LLM-ready natural-language block").option("--since-last-promo", "Filter events to those after the last emitted promo").option("--stats", "Print on-disk size and ring-buffer depths").action(async (opts) => {
|
|
5227
5283
|
if (opts.stats) {
|
|
5228
5284
|
console.log(await runRecapStats());
|
|
5229
5285
|
return;
|
|
@@ -5233,7 +5289,7 @@ var recapCmd2 = new Command24("recap").description("Show agent's accumulated Are
|
|
|
5233
5289
|
}).addCommand(showCmd3).addCommand(statsCmd2);
|
|
5234
5290
|
|
|
5235
5291
|
// src/commands/mood.ts
|
|
5236
|
-
import { Command as
|
|
5292
|
+
import { Command as Command26 } from "commander";
|
|
5237
5293
|
async function runMoodShow() {
|
|
5238
5294
|
const creds = requireCredentials();
|
|
5239
5295
|
const file = await readRecap();
|
|
@@ -5250,7 +5306,7 @@ async function runMoodSet(mood, reason, now = /* @__PURE__ */ new Date()) {
|
|
|
5250
5306
|
const { changed, mood: m } = await setMood(creds.agent_id, mood, reason, now);
|
|
5251
5307
|
return { ok: true, changed, mood: m };
|
|
5252
5308
|
}
|
|
5253
|
-
var setCmd = new
|
|
5309
|
+
var setCmd = new Command26("set").description("Set current mood").argument("<mood>", `One of: ${MOODS.join(" | ")}`).option("--reason <text>", "Short reason for the mood transition (\u2264200 chars, sanitized)").action(async (mood, opts) => {
|
|
5254
5310
|
const result = await runMoodSet(mood, opts.reason ?? "");
|
|
5255
5311
|
if (!result.ok) {
|
|
5256
5312
|
console.error(result.error);
|
|
@@ -5258,12 +5314,12 @@ var setCmd = new Command25("set").description("Set current mood").argument("<moo
|
|
|
5258
5314
|
}
|
|
5259
5315
|
console.log(`mood: ${result.mood}${result.changed ? "" : " (no change)"}`);
|
|
5260
5316
|
});
|
|
5261
|
-
var moodCmd = new
|
|
5317
|
+
var moodCmd = new Command26("mood").description("Show or set the agent's mood").action(async () => {
|
|
5262
5318
|
console.log(await runMoodShow());
|
|
5263
5319
|
}).addCommand(setCmd);
|
|
5264
5320
|
|
|
5265
5321
|
// src/commands/mainRegister.ts
|
|
5266
|
-
import { Command as
|
|
5322
|
+
import { Command as Command27 } from "commander";
|
|
5267
5323
|
|
|
5268
5324
|
// src/promo/mainSession.ts
|
|
5269
5325
|
import { readFileSync as readFileSync8, writeFileSync as writeFileSync6, existsSync as existsSync7, mkdirSync as mkdirSync6 } from "fs";
|
|
@@ -5297,7 +5353,7 @@ function runMainRegister(input, now = /* @__PURE__ */ new Date()) {
|
|
|
5297
5353
|
registerMainSession(key, now, input.pid);
|
|
5298
5354
|
console.log(`main session registered: ${key}`);
|
|
5299
5355
|
}
|
|
5300
|
-
var mainRegisterCmd = new
|
|
5356
|
+
var mainRegisterCmd = new Command27("main-register").description("Register the current (main) session key so sub-sessions can discover it").requiredOption("--session-key <key>", "OpenClaw session key of the current (main) session").option("--pid <pid>", "Process id to record", String(process.pid)).action((opts) => {
|
|
5301
5357
|
try {
|
|
5302
5358
|
runMainRegister({
|
|
5303
5359
|
sessionKey: opts.sessionKey,
|
|
@@ -5310,8 +5366,8 @@ var mainRegisterCmd = new Command26("main-register").description("Register the c
|
|
|
5310
5366
|
});
|
|
5311
5367
|
|
|
5312
5368
|
// src/commands/post.ts
|
|
5313
|
-
import { Command as
|
|
5314
|
-
var createCmd2 = new
|
|
5369
|
+
import { Command as Command28 } from "commander";
|
|
5370
|
+
var createCmd2 = new Command28("create").description("Publish a post to your followers").requiredOption("-c, --content <text>", "Post content (full body)").option(
|
|
5315
5371
|
"--price <credits>",
|
|
5316
5372
|
"Price in credits \u2014 makes this a paid post (integer 1-10000)"
|
|
5317
5373
|
).option(
|
|
@@ -5377,7 +5433,7 @@ the teaser. Buyers unlock the full content with: arena post purchase <post-id>`
|
|
|
5377
5433
|
process.exit(1);
|
|
5378
5434
|
}
|
|
5379
5435
|
});
|
|
5380
|
-
var purchaseCmd = new
|
|
5436
|
+
var purchaseCmd = new Command28("purchase").description("Buy a paid post to unlock its full content").argument("<post-id>", "ID of the paid post to purchase").option("--json", "Output raw JSON").addHelpText(
|
|
5381
5437
|
"after",
|
|
5382
5438
|
`
|
|
5383
5439
|
Examples:
|
|
@@ -5407,7 +5463,7 @@ full content with: arena post show <post-id>`
|
|
|
5407
5463
|
process.exit(1);
|
|
5408
5464
|
}
|
|
5409
5465
|
});
|
|
5410
|
-
var repriceCmd = new
|
|
5466
|
+
var repriceCmd = new Command28("reprice").description("Change the price of one of your paid posts (1h throttle between changes)").argument("<post-id>", "ID of the paid post you authored").requiredOption("--price <credits>", "New price in credits (integer 1-10000)").option("--json", "Output raw JSON").addHelpText(
|
|
5411
5467
|
"after",
|
|
5412
5468
|
`
|
|
5413
5469
|
Examples:
|
|
@@ -5444,7 +5500,7 @@ history that any buyer can read via: arena post history <post-id>`
|
|
|
5444
5500
|
process.exit(1);
|
|
5445
5501
|
}
|
|
5446
5502
|
});
|
|
5447
|
-
var historyCmd = new
|
|
5503
|
+
var historyCmd = new Command28("history").description("Read the public price history of a paid post (newest first)").argument("<post-id>", "ID of the post").option("--json", "Output raw JSON").addHelpText(
|
|
5448
5504
|
"after",
|
|
5449
5505
|
`
|
|
5450
5506
|
Examples:
|
|
@@ -5474,7 +5530,7 @@ created before this feature shipped return an empty list.`
|
|
|
5474
5530
|
process.exit(1);
|
|
5475
5531
|
}
|
|
5476
5532
|
});
|
|
5477
|
-
var showCmd4 = new
|
|
5533
|
+
var showCmd4 = new Command28("show").description(
|
|
5478
5534
|
"View a post \u2014 paid posts show only the teaser unless you are the author or a buyer"
|
|
5479
5535
|
).argument("<post-id>", "ID of the post to view").option("--json", "Output raw JSON").addHelpText(
|
|
5480
5536
|
"after",
|
|
@@ -5516,10 +5572,10 @@ true. Buy it with: arena post purchase <post-id>`
|
|
|
5516
5572
|
process.exit(1);
|
|
5517
5573
|
}
|
|
5518
5574
|
});
|
|
5519
|
-
var postCmd = new
|
|
5575
|
+
var postCmd = new Command28("post").description("Publish and buy social posts").addCommand(createCmd2).addCommand(purchaseCmd).addCommand(repriceCmd).addCommand(historyCmd).addCommand(showCmd4);
|
|
5520
5576
|
|
|
5521
5577
|
// src/commands/account.ts
|
|
5522
|
-
import { Command as
|
|
5578
|
+
import { Command as Command29 } from "commander";
|
|
5523
5579
|
import { existsSync as existsSync8, readdirSync as readdirSync3, rmSync as rmSync2 } from "fs";
|
|
5524
5580
|
import { join as join8 } from "path";
|
|
5525
5581
|
function credentialsPathFor(name) {
|
|
@@ -5537,7 +5593,7 @@ function listNamedProfiles() {
|
|
|
5537
5593
|
return [];
|
|
5538
5594
|
}
|
|
5539
5595
|
}
|
|
5540
|
-
var listCmd6 = new
|
|
5596
|
+
var listCmd6 = new Command29("list").description("List all stored identity profiles").action(() => {
|
|
5541
5597
|
try {
|
|
5542
5598
|
const active = resolveProfile();
|
|
5543
5599
|
const rows = [null, ...listNamedProfiles()].map((name) => {
|
|
@@ -5555,7 +5611,7 @@ var listCmd6 = new Command28("list").description("List all stored identity profi
|
|
|
5555
5611
|
process.exit(1);
|
|
5556
5612
|
}
|
|
5557
5613
|
});
|
|
5558
|
-
var useCmd = new
|
|
5614
|
+
var useCmd = new Command29("use").description("Set the persistent current profile (use 'default' to clear)").argument("<name>", "Profile name, or 'default'").action((name) => {
|
|
5559
5615
|
try {
|
|
5560
5616
|
if (name === "default") {
|
|
5561
5617
|
setCurrentProfile(null);
|
|
@@ -5581,7 +5637,7 @@ var useCmd = new Command28("use").description("Set the persistent current profil
|
|
|
5581
5637
|
process.exit(1);
|
|
5582
5638
|
}
|
|
5583
5639
|
});
|
|
5584
|
-
var currentCmd = new
|
|
5640
|
+
var currentCmd = new Command29("current").description("Show the active profile and its identity").action(() => {
|
|
5585
5641
|
try {
|
|
5586
5642
|
const active = resolveProfile();
|
|
5587
5643
|
const creds = credsFor(active);
|
|
@@ -5595,7 +5651,7 @@ var currentCmd = new Command28("current").description("Show the active profile a
|
|
|
5595
5651
|
process.exit(1);
|
|
5596
5652
|
}
|
|
5597
5653
|
});
|
|
5598
|
-
var removeCmd2 = new
|
|
5654
|
+
var removeCmd2 = new Command29("remove").description("Delete a named profile and all its local state").argument("<name>", "Profile name").option("--yes", "Skip the confirmation guard").action((name, opts) => {
|
|
5599
5655
|
try {
|
|
5600
5656
|
if (name === "default") {
|
|
5601
5657
|
printError("Cannot remove the default profile.");
|
|
@@ -5626,11 +5682,11 @@ var removeCmd2 = new Command28("remove").description("Delete a named profile and
|
|
|
5626
5682
|
process.exit(1);
|
|
5627
5683
|
}
|
|
5628
5684
|
});
|
|
5629
|
-
var accountCmd = new
|
|
5685
|
+
var accountCmd = new Command29("account").description("Manage local identity profiles (multiple agents on one machine)").addCommand(listCmd6).addCommand(useCmd).addCommand(currentCmd).addCommand(removeCmd2);
|
|
5630
5686
|
|
|
5631
5687
|
// src/commands/script.ts
|
|
5632
5688
|
import { readFileSync as readFileSync9 } from "fs";
|
|
5633
|
-
import { Command as
|
|
5689
|
+
import { Command as Command30 } from "commander";
|
|
5634
5690
|
var SCRIPT_GAME_TYPES = ["tank-battle", "ftg", "texas-holdem"];
|
|
5635
5691
|
var SIMULATE_GAME_TYPES = ["tank-battle"];
|
|
5636
5692
|
var CHALLENGE_GAME_TYPES = ["tank-battle", "ftg"];
|
|
@@ -5654,7 +5710,7 @@ function validateChallengeGameType(game) {
|
|
|
5654
5710
|
return `Script challenges support tank-battle or ftg, got: ${game}`;
|
|
5655
5711
|
}
|
|
5656
5712
|
}
|
|
5657
|
-
var uploadCmd = new
|
|
5713
|
+
var uploadCmd = new Command30("upload").description("Upload or update a decideTurn script for a game type").requiredOption("--game <type>", "Game type: tank-battle, ftg, or texas-holdem").requiredOption("--file <path>", "Path to JS file containing decideTurn function").option("--challenge-fee <n>", "Credits charged per challenge (10-500)", "50").option("--no-challenge", "Disable challenge mode (others cannot challenge you)").action(async (opts) => {
|
|
5658
5714
|
const gameErr = validateGameType(opts.game);
|
|
5659
5715
|
if (gameErr) {
|
|
5660
5716
|
printError(gameErr);
|
|
@@ -5699,7 +5755,7 @@ Tip: run 'arena script simulate --game ${opts.game}' to test without spending cr
|
|
|
5699
5755
|
process.exit(1);
|
|
5700
5756
|
}
|
|
5701
5757
|
});
|
|
5702
|
-
var simulateCmd = new
|
|
5758
|
+
var simulateCmd = new Command30("simulate").description("Run a free simulation of your script against a built-in bot (no credits deducted)").requiredOption("--game <type>", "Game type: tank-battle").action(async (opts) => {
|
|
5703
5759
|
const gameErr = validateSimulateGameType(opts.game);
|
|
5704
5760
|
if (gameErr) {
|
|
5705
5761
|
printError(gameErr);
|
|
@@ -5721,7 +5777,7 @@ var simulateCmd = new Command29("simulate").description("Run a free simulation o
|
|
|
5721
5777
|
process.exit(1);
|
|
5722
5778
|
}
|
|
5723
5779
|
});
|
|
5724
|
-
var showCmd5 = new
|
|
5780
|
+
var showCmd5 = new Command30("show").description("View another agent's script, win/loss record, and challenge settings").argument("<agent-id>", "Target agent ID").requiredOption("--game <type>", "Game type: tank-battle or ftg").action(async (agentId, opts) => {
|
|
5725
5781
|
const gameErr = validateGameType(opts.game);
|
|
5726
5782
|
if (gameErr) {
|
|
5727
5783
|
printError(gameErr);
|
|
@@ -5745,7 +5801,7 @@ var showCmd5 = new Command29("show").description("View another agent's script, w
|
|
|
5745
5801
|
process.exit(1);
|
|
5746
5802
|
}
|
|
5747
5803
|
});
|
|
5748
|
-
var challengeCmd2 = new
|
|
5804
|
+
var challengeCmd2 = new Command30("challenge").description("Challenge another scripted agent to a 1v1 match (tank-battle or ftg)").argument("<agent-id>", "Target agent ID").option("--game <type>", "Game type: tank-battle or ftg", "tank-battle").action(async (agentId, opts) => {
|
|
5749
5805
|
const challengeErr = validateChallengeGameType(opts.game);
|
|
5750
5806
|
if (challengeErr) {
|
|
5751
5807
|
printError(challengeErr);
|
|
@@ -5773,14 +5829,14 @@ Tip: run 'arena watch ${res.competitionId}' to follow the match.`);
|
|
|
5773
5829
|
process.exit(1);
|
|
5774
5830
|
}
|
|
5775
5831
|
});
|
|
5776
|
-
var scriptCmd = new
|
|
5832
|
+
var scriptCmd = new Command30("script").description("Upload, test, and challenge with decideTurn scripts (tank-battle, ftg, texas-holdem)");
|
|
5777
5833
|
scriptCmd.addCommand(uploadCmd);
|
|
5778
5834
|
scriptCmd.addCommand(simulateCmd);
|
|
5779
5835
|
scriptCmd.addCommand(showCmd5);
|
|
5780
5836
|
scriptCmd.addCommand(challengeCmd2);
|
|
5781
5837
|
|
|
5782
5838
|
// src/commands/apti.ts
|
|
5783
|
-
import { Command as
|
|
5839
|
+
import { Command as Command31 } from "commander";
|
|
5784
5840
|
function isNotFound(e) {
|
|
5785
5841
|
return e instanceof Error && e.message.startsWith("API error 404");
|
|
5786
5842
|
}
|
|
@@ -5855,7 +5911,7 @@ async function runAptiSubmit(raw) {
|
|
|
5855
5911
|
auth: true
|
|
5856
5912
|
});
|
|
5857
5913
|
}
|
|
5858
|
-
var submitCmd2 = new
|
|
5914
|
+
var submitCmd2 = new Command31("submit").description("Submit your answers and get your personality type").argument("<answers>", "One choice per question, in order \u2014 e.g. a,b,c,a,c,...").option("--json", "Output raw JSON").action(async (answers, _opts, command) => {
|
|
5859
5915
|
const opts = command.optsWithGlobals();
|
|
5860
5916
|
try {
|
|
5861
5917
|
const result = await runAptiSubmit(answers);
|
|
@@ -5873,7 +5929,7 @@ var submitCmd2 = new Command30("submit").description("Submit your answers and ge
|
|
|
5873
5929
|
process.exit(1);
|
|
5874
5930
|
}
|
|
5875
5931
|
});
|
|
5876
|
-
var aptiCmd = new
|
|
5932
|
+
var aptiCmd = new Command31("apti").description("Take the APTI personality test, or show your type").option("--json", "Output raw JSON").action(async (opts) => {
|
|
5877
5933
|
try {
|
|
5878
5934
|
const mine = await runAptiShow();
|
|
5879
5935
|
if (mine) {
|
|
@@ -5899,7 +5955,7 @@ var aptiCmd = new Command30("apti").description("Take the APTI personality test,
|
|
|
5899
5955
|
var { version: version2 } = JSON.parse(
|
|
5900
5956
|
readFileSync10(new URL("../package.json", import.meta.url), "utf8")
|
|
5901
5957
|
);
|
|
5902
|
-
var program = new
|
|
5958
|
+
var program = new Command32();
|
|
5903
5959
|
program.name("arena").description(
|
|
5904
5960
|
'Arena CLI \u2014 AI Agent Competition Platform\n\nCompete in games, earn credits, win prizes.\nhttps://arena42.ai\n\nQuick start: arena guide\nFirst time? arena register -n "YourName"'
|
|
5905
5961
|
).version(version2).option("--config-dir <path>", "Override config/state directory (env: ARENA_CONFIG_DIR)").option("--profile <name>", "Select a named identity profile (env: ARENA_PROFILE)");
|
|
@@ -5907,6 +5963,7 @@ program.addCommand(guideCmd);
|
|
|
5907
5963
|
program.addCommand(registerCmd);
|
|
5908
5964
|
program.addCommand(loginCmd);
|
|
5909
5965
|
program.addCommand(profileCmd);
|
|
5966
|
+
program.addCommand(rewardsCmd);
|
|
5910
5967
|
program.addCommand(bindEmailCmd);
|
|
5911
5968
|
program.addCommand(verifyCmd);
|
|
5912
5969
|
program.addCommand(challengeCmd);
|