@clawtrail/init 1.1.3 → 1.2.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/dist/index.js +51 -15
- package/package.json +3 -2
package/dist/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import os from "os";
|
|
|
11
11
|
import { fileURLToPath } from "url";
|
|
12
12
|
import fetch from "node-fetch";
|
|
13
13
|
import JSON5 from "json5";
|
|
14
|
+
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
|
|
14
15
|
var __filename = fileURLToPath(import.meta.url);
|
|
15
16
|
var __dirname = path.dirname(__filename);
|
|
16
17
|
var SKILL_FILES = {
|
|
@@ -87,7 +88,8 @@ async function registerAgent(data, staging = false) {
|
|
|
87
88
|
return {
|
|
88
89
|
agentId: result.agentId,
|
|
89
90
|
apiKey: result.apiKey,
|
|
90
|
-
verificationCode: result.verificationCode
|
|
91
|
+
verificationCode: result.verificationCode,
|
|
92
|
+
statusUrl: result.statusUrl
|
|
91
93
|
};
|
|
92
94
|
} catch (error) {
|
|
93
95
|
spinner.fail(chalk.red(`Registration failed: ${error.message}`));
|
|
@@ -131,7 +133,7 @@ async function detectOpenClaw() {
|
|
|
131
133
|
return false;
|
|
132
134
|
}
|
|
133
135
|
}
|
|
134
|
-
async function configureOpenClaw(apiKey, staging) {
|
|
136
|
+
async function configureOpenClaw(apiKey, staging, privateKey) {
|
|
135
137
|
const openClawDir = path.join(os.homedir(), ".openclaw");
|
|
136
138
|
const configPath = path.join(openClawDir, "openclaw.json");
|
|
137
139
|
const apiUrl = staging ? "https://sapi.clawtrail.ai/ct" : "https://api.clawtrail.ai/ct";
|
|
@@ -146,7 +148,11 @@ async function configureOpenClaw(apiKey, staging) {
|
|
|
146
148
|
config.plugins.entries ??= {};
|
|
147
149
|
config.plugins.entries.clawtrail = {
|
|
148
150
|
enabled: true,
|
|
149
|
-
config: {
|
|
151
|
+
config: {
|
|
152
|
+
apiKey,
|
|
153
|
+
apiUrl,
|
|
154
|
+
...privateKey && { walletPrivateKey: privateKey }
|
|
155
|
+
}
|
|
150
156
|
};
|
|
151
157
|
await fs.writeFile(configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
152
158
|
console.log(chalk.green(`\u2713 Configured ClawTrail in ${chalk.cyan("~/.openclaw/openclaw.json")}`));
|
|
@@ -199,6 +205,35 @@ async function main() {
|
|
|
199
205
|
}
|
|
200
206
|
]);
|
|
201
207
|
if (shouldRegister) {
|
|
208
|
+
const { walletChoice } = await inquirer.prompt([{
|
|
209
|
+
type: "list",
|
|
210
|
+
name: "walletChoice",
|
|
211
|
+
message: "Ethereum wallet for DKG identity:",
|
|
212
|
+
choices: [
|
|
213
|
+
{ name: "Enter my existing wallet address", value: "existing" },
|
|
214
|
+
{ name: "Generate a new wallet for me", value: "generate" }
|
|
215
|
+
],
|
|
216
|
+
default: "existing"
|
|
217
|
+
}]);
|
|
218
|
+
let walletAddress;
|
|
219
|
+
let generatedPrivateKey = null;
|
|
220
|
+
if (walletChoice === "generate") {
|
|
221
|
+
const walletSpinner = ora("Generating Ethereum wallet...").start();
|
|
222
|
+
const privateKey = generatePrivateKey();
|
|
223
|
+
const account = privateKeyToAccount(privateKey);
|
|
224
|
+
walletAddress = account.address;
|
|
225
|
+
generatedPrivateKey = privateKey;
|
|
226
|
+
walletSpinner.succeed(chalk.green(`\u2713 Generated wallet: ${chalk.cyan(walletAddress)}`));
|
|
227
|
+
console.log(chalk.yellow(" \u26A0 Private key will be saved to ~/.openclaw/openclaw.json\n"));
|
|
228
|
+
} else {
|
|
229
|
+
const { wallet } = await inquirer.prompt([{
|
|
230
|
+
type: "input",
|
|
231
|
+
name: "wallet",
|
|
232
|
+
message: "Wallet address (0x...):",
|
|
233
|
+
validate: (input) => input.startsWith("0x") && input.length === 42 ? true : "Valid Ethereum address required"
|
|
234
|
+
}]);
|
|
235
|
+
walletAddress = wallet;
|
|
236
|
+
}
|
|
202
237
|
const answers = await inquirer.prompt([
|
|
203
238
|
{
|
|
204
239
|
type: "input",
|
|
@@ -212,12 +247,6 @@ async function main() {
|
|
|
212
247
|
message: "Agent description:",
|
|
213
248
|
validate: (input) => input.length > 0 ? true : "Description is required"
|
|
214
249
|
},
|
|
215
|
-
{
|
|
216
|
-
type: "input",
|
|
217
|
-
name: "wallet",
|
|
218
|
-
message: "Wallet address (0x...):",
|
|
219
|
-
validate: (input) => input.startsWith("0x") && input.length === 42 ? true : "Valid Ethereum address required"
|
|
220
|
-
},
|
|
221
250
|
{
|
|
222
251
|
type: "input",
|
|
223
252
|
name: "bio",
|
|
@@ -228,12 +257,13 @@ async function main() {
|
|
|
228
257
|
name: "agentType",
|
|
229
258
|
message: "Agent type:",
|
|
230
259
|
choices: [
|
|
231
|
-
{ name: "Custom Agent", value: "custom" },
|
|
232
260
|
{ name: "OpenClaw Agent", value: "openclaw" },
|
|
261
|
+
{ name: "Custom Agent", value: "custom" },
|
|
262
|
+
{ name: "MCP Server", value: "mcp-server" },
|
|
233
263
|
{ name: "A2A Agent", value: "a2a-agent" },
|
|
234
|
-
{ name: "
|
|
264
|
+
{ name: "ERC-8004 Agent", value: "erc8004" }
|
|
235
265
|
],
|
|
236
|
-
default: "
|
|
266
|
+
default: "openclaw"
|
|
237
267
|
},
|
|
238
268
|
{
|
|
239
269
|
type: "input",
|
|
@@ -242,11 +272,11 @@ async function main() {
|
|
|
242
272
|
}
|
|
243
273
|
]);
|
|
244
274
|
try {
|
|
245
|
-
const { agentId, apiKey, verificationCode } = await registerAgent(
|
|
275
|
+
const { agentId, apiKey, verificationCode, statusUrl } = await registerAgent(
|
|
246
276
|
{
|
|
247
277
|
name: answers.name,
|
|
248
278
|
description: answers.description,
|
|
249
|
-
wallet:
|
|
279
|
+
wallet: walletAddress,
|
|
250
280
|
bio: answers.bio || void 0,
|
|
251
281
|
agentType: answers.agentType,
|
|
252
282
|
framework: answers.framework || void 0,
|
|
@@ -263,6 +293,12 @@ async function main() {
|
|
|
263
293
|
console.log(
|
|
264
294
|
chalk.white("API Key: ") + chalk.gray(apiKey.substring(0, 20) + "...")
|
|
265
295
|
);
|
|
296
|
+
console.log(
|
|
297
|
+
chalk.white("DKG Status: ") + chalk.yellow("pending \u2014 minting queued (~30s)")
|
|
298
|
+
);
|
|
299
|
+
console.log(
|
|
300
|
+
chalk.white("Status URL: ") + chalk.blue.underline(statusUrl)
|
|
301
|
+
);
|
|
266
302
|
await saveToEnv(apiKey);
|
|
267
303
|
if (hasOpenClaw && answers.agentType === "openclaw") {
|
|
268
304
|
const { configureOC } = await inquirer.prompt([
|
|
@@ -275,7 +311,7 @@ async function main() {
|
|
|
275
311
|
]);
|
|
276
312
|
if (configureOC) {
|
|
277
313
|
try {
|
|
278
|
-
await configureOpenClaw(apiKey, staging);
|
|
314
|
+
await configureOpenClaw(apiKey, staging, generatedPrivateKey ?? void 0);
|
|
279
315
|
await copyToOpenClawSkills(targetDir);
|
|
280
316
|
} catch (ocErr) {
|
|
281
317
|
console.log(chalk.yellow(`\u26A0 OpenClaw config failed: ${ocErr.message}`));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clawtrail/init",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "CLI installer for ClawTrail AI agent skill files",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
"chalk": "^5.3.0",
|
|
28
28
|
"ora": "^8.0.1",
|
|
29
29
|
"node-fetch": "^3.3.2",
|
|
30
|
-
"json5": "^2.2.3"
|
|
30
|
+
"json5": "^2.2.3",
|
|
31
|
+
"viem": "^2.0.0"
|
|
31
32
|
},
|
|
32
33
|
"devDependencies": {
|
|
33
34
|
"@types/inquirer": "^9.0.7",
|