@clawdvault/cli 0.3.3 → 0.4.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 +54 -0
- package/dist/index.js +194 -8
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -163,6 +163,44 @@ Examples:
|
|
|
163
163
|
clawdvault trade quote -m TOKEN_MINT -t buy -a 0.1
|
|
164
164
|
```
|
|
165
165
|
|
|
166
|
+
### `clawdvault agent`
|
|
167
|
+
|
|
168
|
+
AI agent registration, verification, and leaderboard.
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
# Register a new AI agent
|
|
172
|
+
clawdvault agent register --wallet <address> [--name <name>]
|
|
173
|
+
--wallet <address> Solana wallet address (required)
|
|
174
|
+
--name <name> Display name (optional)
|
|
175
|
+
|
|
176
|
+
# Output: API key, claim code, tweet template
|
|
177
|
+
# Config saved to ~/.clawdvault/agent.json
|
|
178
|
+
|
|
179
|
+
# Verify agent via Twitter
|
|
180
|
+
clawdvault agent claim --tweet <url> [--api-key <key>]
|
|
181
|
+
--tweet <url> URL of tweet containing claim code (required)
|
|
182
|
+
--api-key <key> API key (defaults to saved config)
|
|
183
|
+
|
|
184
|
+
# Upload agent avatar
|
|
185
|
+
clawdvault agent upload-avatar --image <path> [--api-key <key>] [--wallet <addr>]
|
|
186
|
+
--image <path> Path to image file (required)
|
|
187
|
+
--api-key <key> API key (defaults to saved config)
|
|
188
|
+
--wallet <address> Wallet address (defaults to saved config)
|
|
189
|
+
|
|
190
|
+
# List agents leaderboard
|
|
191
|
+
clawdvault agent list [options]
|
|
192
|
+
--sort <field> Sort by: volume, tokens, fees (default: volume)
|
|
193
|
+
--limit <n> Number of results (default: 25)
|
|
194
|
+
--page <n> Page number (default: 1)
|
|
195
|
+
--json Output as JSON
|
|
196
|
+
|
|
197
|
+
Examples:
|
|
198
|
+
clawdvault agent register --wallet 7xKXtg...AsU --name "My Bot"
|
|
199
|
+
clawdvault agent claim --tweet https://twitter.com/mybot/status/123
|
|
200
|
+
clawdvault agent upload-avatar --image ./avatar.png
|
|
201
|
+
clawdvault agent list --sort volume --limit 10
|
|
202
|
+
```
|
|
203
|
+
|
|
166
204
|
### `clawdvault wallet`
|
|
167
205
|
|
|
168
206
|
Wallet management and info.
|
|
@@ -196,6 +234,22 @@ Examples:
|
|
|
196
234
|
clawdvault wallet address
|
|
197
235
|
```
|
|
198
236
|
|
|
237
|
+
### 4. Agent Registration (For AI Agents)
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
# Register your agent
|
|
241
|
+
clawdvault agent register --wallet YOUR_WALLET_ADDRESS --name "My Bot"
|
|
242
|
+
|
|
243
|
+
# Post the tweet template to Twitter, then verify
|
|
244
|
+
clawdvault agent claim --tweet https://twitter.com/mybot/status/123456
|
|
245
|
+
|
|
246
|
+
# Upload an avatar
|
|
247
|
+
clawdvault agent upload-avatar --image ./avatar.png
|
|
248
|
+
|
|
249
|
+
# View the leaderboard
|
|
250
|
+
clawdvault agent list
|
|
251
|
+
```
|
|
252
|
+
|
|
199
253
|
## Configuration
|
|
200
254
|
|
|
201
255
|
### Environment Variables
|
package/dist/index.js
CHANGED
|
@@ -24,8 +24,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
24
24
|
));
|
|
25
25
|
|
|
26
26
|
// src/index.ts
|
|
27
|
-
var
|
|
28
|
-
var
|
|
27
|
+
var import_commander7 = require("commander");
|
|
28
|
+
var import_chalk8 = __toESM(require("chalk"));
|
|
29
29
|
|
|
30
30
|
// src/commands/tokens.ts
|
|
31
31
|
var import_commander = require("commander");
|
|
@@ -169,6 +169,12 @@ function formatPercent(value) {
|
|
|
169
169
|
const formatted = (value * 100).toFixed(2);
|
|
170
170
|
return value >= 0 ? import_chalk.default.green(`+${formatted}%`) : import_chalk.default.red(`${formatted}%`);
|
|
171
171
|
}
|
|
172
|
+
function formatPriceChange(value) {
|
|
173
|
+
if (value == null) return import_chalk.default.gray("N/A");
|
|
174
|
+
const sign = value >= 0 ? "+" : "";
|
|
175
|
+
const formatted = `${sign}${value.toFixed(2)}%`;
|
|
176
|
+
return value >= 0 ? import_chalk.default.green(formatted) : import_chalk.default.red(formatted);
|
|
177
|
+
}
|
|
172
178
|
function shortenAddress(address, chars = 4) {
|
|
173
179
|
return `${address.slice(0, chars)}...${address.slice(-chars)}`;
|
|
174
180
|
}
|
|
@@ -221,7 +227,7 @@ tokensCommand.command("list").description("List all tokens").option("-s, --sort
|
|
|
221
227
|
const result = await client.listTokens({
|
|
222
228
|
sort: options.sort,
|
|
223
229
|
page: parseInt(options.page),
|
|
224
|
-
|
|
230
|
+
per_page: parseInt(options.limit),
|
|
225
231
|
graduated
|
|
226
232
|
});
|
|
227
233
|
spin.stop();
|
|
@@ -238,7 +244,7 @@ tokensCommand.command("list").description("List all tokens").option("-s, --sort
|
|
|
238
244
|
import_chalk2.default.cyan("Name"),
|
|
239
245
|
import_chalk2.default.cyan("Price"),
|
|
240
246
|
import_chalk2.default.cyan("Market Cap"),
|
|
241
|
-
import_chalk2.default.cyan("24h
|
|
247
|
+
import_chalk2.default.cyan("24h Change"),
|
|
242
248
|
import_chalk2.default.cyan("Status"),
|
|
243
249
|
import_chalk2.default.cyan("Mint")
|
|
244
250
|
],
|
|
@@ -251,7 +257,7 @@ tokensCommand.command("list").description("List all tokens").option("-s, --sort
|
|
|
251
257
|
token.name ?? "Unknown",
|
|
252
258
|
formatSol(token.price_sol ?? 0),
|
|
253
259
|
formatSol(token.market_cap_sol ?? 0),
|
|
254
|
-
|
|
260
|
+
formatPriceChange(token.price_change_24h),
|
|
255
261
|
status,
|
|
256
262
|
shortenAddress(token.mint ?? "")
|
|
257
263
|
]);
|
|
@@ -302,7 +308,10 @@ tokenCommand.command("get <mint>").description("Get token details").option("--js
|
|
|
302
308
|
{ [import_chalk3.default.cyan("Mint")]: token.mint ?? "" },
|
|
303
309
|
{ [import_chalk3.default.cyan("Creator")]: shortenAddress(token.creator ?? "") },
|
|
304
310
|
{ [import_chalk3.default.cyan("Price")]: formatSol(token.price_sol ?? 0) },
|
|
311
|
+
{ [import_chalk3.default.cyan("Price USD")]: token.price_usd ? formatUsd(token.price_usd) : "N/A" },
|
|
312
|
+
{ [import_chalk3.default.cyan("24h Change")]: formatPriceChange(token.price_change_24h) },
|
|
305
313
|
{ [import_chalk3.default.cyan("Market Cap")]: formatSol(token.market_cap_sol ?? 0) },
|
|
314
|
+
{ [import_chalk3.default.cyan("Market Cap USD")]: token.market_cap_usd ? formatUsd(token.market_cap_usd) : "N/A" },
|
|
306
315
|
{ [import_chalk3.default.cyan("Status")]: token.graduated ? "\u{1F393} Graduated" : "\u{1F4C8} Bonding Curve" }
|
|
307
316
|
);
|
|
308
317
|
if (token.description) {
|
|
@@ -683,7 +692,7 @@ tradeCommand.command("history").description("Get trade history for a token").req
|
|
|
683
692
|
typeStr,
|
|
684
693
|
formatSol(trade.sol_amount ?? 0),
|
|
685
694
|
formatTokens(trade.token_amount ?? 0),
|
|
686
|
-
formatSol(trade.
|
|
695
|
+
formatSol(trade.price_sol ?? 0),
|
|
687
696
|
shortenAddress(trade.trader ?? ""),
|
|
688
697
|
new Date(trade.created_at ?? Date.now()).toLocaleString()
|
|
689
698
|
]);
|
|
@@ -1293,19 +1302,196 @@ chatCommand.command("unreact").description("Remove reaction from a message").req
|
|
|
1293
1302
|
}
|
|
1294
1303
|
});
|
|
1295
1304
|
|
|
1305
|
+
// src/commands/agent.ts
|
|
1306
|
+
var import_commander6 = require("commander");
|
|
1307
|
+
var import_chalk7 = __toESM(require("chalk"));
|
|
1308
|
+
var import_cli_table35 = __toESM(require("cli-table3"));
|
|
1309
|
+
var fs4 = __toESM(require("fs"));
|
|
1310
|
+
var path3 = __toESM(require("path"));
|
|
1311
|
+
function getAgentConfigPath() {
|
|
1312
|
+
return path3.join(getConfigDir(), "agent.json");
|
|
1313
|
+
}
|
|
1314
|
+
function loadAgentConfig() {
|
|
1315
|
+
const configPath = getAgentConfigPath();
|
|
1316
|
+
if (!fs4.existsSync(configPath)) {
|
|
1317
|
+
return null;
|
|
1318
|
+
}
|
|
1319
|
+
try {
|
|
1320
|
+
return JSON.parse(fs4.readFileSync(configPath, "utf-8"));
|
|
1321
|
+
} catch {
|
|
1322
|
+
return null;
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
function saveAgentConfig(config) {
|
|
1326
|
+
const configDir = getConfigDir();
|
|
1327
|
+
if (!fs4.existsSync(configDir)) {
|
|
1328
|
+
fs4.mkdirSync(configDir, { recursive: true });
|
|
1329
|
+
}
|
|
1330
|
+
const configPath = getAgentConfigPath();
|
|
1331
|
+
fs4.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
1332
|
+
fs4.chmodSync(configPath, 384);
|
|
1333
|
+
}
|
|
1334
|
+
var agentCommand = new import_commander6.Command("agent").description("Agent registration and management");
|
|
1335
|
+
agentCommand.command("register").description("Register a new AI agent").requiredOption("--wallet <address>", "Solana wallet address").option("--name <name>", "Agent display name").action(async (options) => {
|
|
1336
|
+
const spin = spinner("Registering agent...").start();
|
|
1337
|
+
try {
|
|
1338
|
+
const client = createReadOnlyClient();
|
|
1339
|
+
const result = await client.registerAgent({
|
|
1340
|
+
wallet: options.wallet,
|
|
1341
|
+
name: options.name
|
|
1342
|
+
});
|
|
1343
|
+
spin.stop();
|
|
1344
|
+
success("Agent registered!");
|
|
1345
|
+
console.log();
|
|
1346
|
+
info(`Agent ID: ${result.agentId ?? ""}`);
|
|
1347
|
+
info(`API Key: ${import_chalk7.default.yellow(result.apiKey ?? "")}`);
|
|
1348
|
+
info(`Claim Code: ${import_chalk7.default.bold(result.claimCode ?? "")}`);
|
|
1349
|
+
console.log();
|
|
1350
|
+
warn("Save your API key \u2014 it is only shown once!");
|
|
1351
|
+
console.log();
|
|
1352
|
+
console.log(import_chalk7.default.bold("Tweet this to verify:"));
|
|
1353
|
+
console.log(import_chalk7.default.gray(result.tweetTemplate ?? ""));
|
|
1354
|
+
console.log();
|
|
1355
|
+
saveAgentConfig({
|
|
1356
|
+
apiKey: result.apiKey,
|
|
1357
|
+
wallet: options.wallet,
|
|
1358
|
+
agentId: result.agentId,
|
|
1359
|
+
name: options.name
|
|
1360
|
+
});
|
|
1361
|
+
info(`Config saved to ${getAgentConfigPath()}`);
|
|
1362
|
+
} catch (err) {
|
|
1363
|
+
spin.stop();
|
|
1364
|
+
handleError(err);
|
|
1365
|
+
}
|
|
1366
|
+
});
|
|
1367
|
+
agentCommand.command("claim").description("Verify agent via Twitter tweet").requiredOption("--tweet <url>", "URL of the tweet containing your claim code").option("--api-key <key>", "API key (defaults to saved config)").action(async (options) => {
|
|
1368
|
+
const agentConfig = loadAgentConfig();
|
|
1369
|
+
const apiKey = options.apiKey ?? agentConfig?.apiKey;
|
|
1370
|
+
if (!apiKey) {
|
|
1371
|
+
error("No API key found. Run `clawdvault agent register` first or pass --api-key");
|
|
1372
|
+
process.exit(1);
|
|
1373
|
+
}
|
|
1374
|
+
const spin = spinner("Verifying tweet...").start();
|
|
1375
|
+
try {
|
|
1376
|
+
const client = createReadOnlyClient();
|
|
1377
|
+
const result = await client.claimAgent({
|
|
1378
|
+
apiKey,
|
|
1379
|
+
tweetUrl: options.tweet
|
|
1380
|
+
});
|
|
1381
|
+
spin.stop();
|
|
1382
|
+
success("Agent verified!");
|
|
1383
|
+
console.log();
|
|
1384
|
+
if (result.twitterHandle) {
|
|
1385
|
+
info(`Twitter: @${result.twitterHandle}`);
|
|
1386
|
+
}
|
|
1387
|
+
if (result.verifiedAt) {
|
|
1388
|
+
info(`Verified: ${new Date(result.verifiedAt).toLocaleString()}`);
|
|
1389
|
+
}
|
|
1390
|
+
} catch (err) {
|
|
1391
|
+
spin.stop();
|
|
1392
|
+
handleError(err);
|
|
1393
|
+
}
|
|
1394
|
+
});
|
|
1395
|
+
agentCommand.command("upload-avatar").description("Upload agent avatar image").requiredOption("--image <path>", "Path to image file").option("--api-key <key>", "API key (defaults to saved config)").option("--wallet <address>", "Wallet address (defaults to saved config)").action(async (options) => {
|
|
1396
|
+
const agentConfig = loadAgentConfig();
|
|
1397
|
+
const apiKey = options.apiKey ?? agentConfig?.apiKey;
|
|
1398
|
+
const wallet = options.wallet ?? agentConfig?.wallet;
|
|
1399
|
+
if (!apiKey) {
|
|
1400
|
+
error("No API key found. Run `clawdvault agent register` first or pass --api-key");
|
|
1401
|
+
process.exit(1);
|
|
1402
|
+
}
|
|
1403
|
+
if (!wallet) {
|
|
1404
|
+
error("No wallet found. Pass --wallet or register first");
|
|
1405
|
+
process.exit(1);
|
|
1406
|
+
}
|
|
1407
|
+
if (!fs4.existsSync(options.image)) {
|
|
1408
|
+
error(`Image file not found: ${options.image}`);
|
|
1409
|
+
process.exit(1);
|
|
1410
|
+
}
|
|
1411
|
+
const spin = spinner("Uploading avatar...").start();
|
|
1412
|
+
try {
|
|
1413
|
+
const client = createReadOnlyClient();
|
|
1414
|
+
const buffer = fs4.readFileSync(options.image);
|
|
1415
|
+
const filename = path3.basename(options.image);
|
|
1416
|
+
const result = await client.uploadAvatar(buffer, wallet, apiKey, filename);
|
|
1417
|
+
spin.stop();
|
|
1418
|
+
success("Avatar uploaded!");
|
|
1419
|
+
info(`URL: ${link(result.url ?? "")}`);
|
|
1420
|
+
} catch (err) {
|
|
1421
|
+
spin.stop();
|
|
1422
|
+
handleError(err);
|
|
1423
|
+
}
|
|
1424
|
+
});
|
|
1425
|
+
agentCommand.command("list").description("List agents leaderboard").option("--sort <field>", "Sort by: volume, tokens, fees", "volume").option("--limit <n>", "Number of results", "25").option("--page <n>", "Page number", "1").option("--json", "Output as JSON").action(async (options) => {
|
|
1426
|
+
const spin = spinner("Fetching agents...").start();
|
|
1427
|
+
try {
|
|
1428
|
+
const client = createReadOnlyClient();
|
|
1429
|
+
const result = await client.listAgents({
|
|
1430
|
+
sortBy: options.sort,
|
|
1431
|
+
limit: parseInt(options.limit),
|
|
1432
|
+
page: parseInt(options.page)
|
|
1433
|
+
});
|
|
1434
|
+
spin.stop();
|
|
1435
|
+
if (options.json) {
|
|
1436
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1437
|
+
return;
|
|
1438
|
+
}
|
|
1439
|
+
const agents = result.agents ?? [];
|
|
1440
|
+
if (agents.length === 0) {
|
|
1441
|
+
info("No agents found");
|
|
1442
|
+
return;
|
|
1443
|
+
}
|
|
1444
|
+
console.log(import_chalk7.default.bold(`
|
|
1445
|
+
\u{1F916} Agent Leaderboard (sorted by ${options.sort})
|
|
1446
|
+
`));
|
|
1447
|
+
const table = new import_cli_table35.default({
|
|
1448
|
+
head: [
|
|
1449
|
+
import_chalk7.default.cyan("#"),
|
|
1450
|
+
import_chalk7.default.cyan("Name"),
|
|
1451
|
+
import_chalk7.default.cyan("Handle"),
|
|
1452
|
+
import_chalk7.default.cyan("Volume"),
|
|
1453
|
+
import_chalk7.default.cyan("Tokens"),
|
|
1454
|
+
import_chalk7.default.cyan("Fees"),
|
|
1455
|
+
import_chalk7.default.cyan("Verified")
|
|
1456
|
+
],
|
|
1457
|
+
style: { head: [], border: [] }
|
|
1458
|
+
});
|
|
1459
|
+
const pageOffset = (parseInt(options.page) - 1) * parseInt(options.limit);
|
|
1460
|
+
agents.forEach((agent, i) => {
|
|
1461
|
+
table.push([
|
|
1462
|
+
pageOffset + i + 1,
|
|
1463
|
+
agent.name ?? shortenAddress(agent.wallet ?? ""),
|
|
1464
|
+
agent.twitter_handle ? `@${agent.twitter_handle}` : "-",
|
|
1465
|
+
formatUsd(agent.total_volume ?? 0),
|
|
1466
|
+
agent.tokens_created ?? 0,
|
|
1467
|
+
formatUsd(agent.total_fees ?? 0),
|
|
1468
|
+
agent.twitter_verified ? import_chalk7.default.green("\u2713") : import_chalk7.default.gray("-")
|
|
1469
|
+
]);
|
|
1470
|
+
});
|
|
1471
|
+
console.log(table.toString());
|
|
1472
|
+
console.log(import_chalk7.default.gray(`
|
|
1473
|
+
Page ${result.page ?? 1} | ${result.total ?? 0} total agents
|
|
1474
|
+
`));
|
|
1475
|
+
} catch (err) {
|
|
1476
|
+
spin.stop();
|
|
1477
|
+
handleError(err);
|
|
1478
|
+
}
|
|
1479
|
+
});
|
|
1480
|
+
|
|
1296
1481
|
// src/index.ts
|
|
1297
|
-
var program = new
|
|
1482
|
+
var program = new import_commander7.Command();
|
|
1298
1483
|
program.name("clawdvault").description("CLI for ClawdVault - Solana token launchpad").version("0.1.0");
|
|
1299
1484
|
program.addCommand(tokensCommand);
|
|
1300
1485
|
program.addCommand(tokenCommand);
|
|
1301
1486
|
program.addCommand(tradeCommand);
|
|
1302
1487
|
program.addCommand(walletCommand);
|
|
1303
1488
|
program.addCommand(chatCommand);
|
|
1489
|
+
program.addCommand(agentCommand);
|
|
1304
1490
|
program.hook("preAction", () => {
|
|
1305
1491
|
});
|
|
1306
1492
|
program.configureOutput({
|
|
1307
1493
|
outputError: (str, write) => {
|
|
1308
|
-
write(
|
|
1494
|
+
write(import_chalk8.default.red(str));
|
|
1309
1495
|
}
|
|
1310
1496
|
});
|
|
1311
1497
|
program.parse();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clawdvault/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "CLI for ClawdVault - Solana token launchpad",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"clean": "rm -rf dist"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@clawdvault/sdk": "^0.
|
|
18
|
+
"@clawdvault/sdk": "^0.4.1",
|
|
19
19
|
"@solana/spl-token": "^0.4.0",
|
|
20
20
|
"@solana/web3.js": "^1.91.0",
|
|
21
21
|
"bip39": "^3.1.0",
|