@nookplot/cli 0.6.14 → 0.6.16
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/commands/listen.js +149 -0
- package/dist/commands/listen.js.map +1 -1
- package/dist/commands/online.js +67 -1068
- package/dist/commands/online.js.map +1 -1
- package/dist/commands/register.d.ts +19 -0
- package/dist/commands/register.js +5 -5
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/skills.d.ts +27 -0
- package/dist/commands/skills.js +502 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/up.d.ts +21 -0
- package/dist/commands/up.js +310 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/agentLoop.d.ts +69 -0
- package/dist/utils/agentLoop.js +1037 -0
- package/dist/utils/agentLoop.js.map +1 -0
- package/dist/utils/dashboard.d.ts +32 -0
- package/dist/utils/dashboard.js +66 -0
- package/dist/utils/dashboard.js.map +1 -0
- package/dist/utils/skills.d.ts +71 -0
- package/dist/utils/skills.js +240 -0
- package/dist/utils/skills.js.map +1 -0
- package/dist/utils/xmtp.d.ts +41 -0
- package/dist/utils/xmtp.js +91 -0
- package/dist/utils/xmtp.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nookplot skills` — Declarative skill management via skills.yaml.
|
|
3
|
+
*
|
|
4
|
+
* Manages marketplace service listings and agent profile capabilities
|
|
5
|
+
* from a single YAML file. Distinct from `nookplot skill` (singular)
|
|
6
|
+
* which generates a reference document.
|
|
7
|
+
*
|
|
8
|
+
* Subcommands:
|
|
9
|
+
* list — Show skills from skills.yaml
|
|
10
|
+
* sync — Sync to marketplace + update agent profile capabilities
|
|
11
|
+
* add — Interactive: add a skill to skills.yaml
|
|
12
|
+
* remove — Remove a skill from skills.yaml
|
|
13
|
+
* init — Create a starter skills.yaml
|
|
14
|
+
*
|
|
15
|
+
* @module commands/skills
|
|
16
|
+
*/
|
|
17
|
+
import { writeFileSync, existsSync } from "node:fs";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import chalk from "chalk";
|
|
20
|
+
import ora from "ora";
|
|
21
|
+
import { ethers } from "ethers";
|
|
22
|
+
import inquirer from "inquirer";
|
|
23
|
+
import yaml from "js-yaml";
|
|
24
|
+
import { loadConfig, validateConfig } from "../config.js";
|
|
25
|
+
import { gatewayRequest, isGatewayError } from "../utils/http.js";
|
|
26
|
+
import { TOKENS } from "../constants.js";
|
|
27
|
+
import { loadSkillsFile, validateSkillsConfig, computeSkillHash, loadSkillsHashStore, saveSkillsHashStore, pricingModelToEnum, extractCapabilities, generateStarterSkillsYaml, getSkillsFilePath, } from "../utils/skills.js";
|
|
28
|
+
const TOKEN_MAP = TOKENS;
|
|
29
|
+
const PRICING_LABELS = {
|
|
30
|
+
"per-task": "Per Task",
|
|
31
|
+
"hourly": "Hourly",
|
|
32
|
+
"subscription": "Subscription",
|
|
33
|
+
"custom": "Custom",
|
|
34
|
+
};
|
|
35
|
+
export function registerSkillsCommand(program) {
|
|
36
|
+
const cmd = program
|
|
37
|
+
.command("skills")
|
|
38
|
+
.description("Manage agent skills via skills.yaml — marketplace listings + profile capabilities");
|
|
39
|
+
// nookplot skills list (default)
|
|
40
|
+
cmd
|
|
41
|
+
.command("list", { isDefault: true })
|
|
42
|
+
.description("Show skills from skills.yaml")
|
|
43
|
+
.option("--json", "Output raw JSON")
|
|
44
|
+
.action(async (opts) => {
|
|
45
|
+
try {
|
|
46
|
+
await listSkills(opts);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
50
|
+
console.error(chalk.red(`\nFailed: ${msg}`));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// nookplot skills sync
|
|
55
|
+
cmd
|
|
56
|
+
.command("sync")
|
|
57
|
+
.description("Sync skills.yaml to marketplace and update agent profile")
|
|
58
|
+
.option("--force", "Force sync all skills (ignore hash cache)")
|
|
59
|
+
.option("--dry-run", "Show what would change without syncing")
|
|
60
|
+
.option("--token <symbol>", "Token for pricing: usdc or nook (default: usdc)", "usdc")
|
|
61
|
+
.action(async (opts) => {
|
|
62
|
+
try {
|
|
63
|
+
await syncSkills(program.opts(), opts);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
67
|
+
console.error(chalk.red(`\nFailed: ${msg}`));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
// nookplot skills add
|
|
72
|
+
cmd
|
|
73
|
+
.command("add")
|
|
74
|
+
.description("Add a skill to skills.yaml (interactive)")
|
|
75
|
+
.action(async () => {
|
|
76
|
+
try {
|
|
77
|
+
await addSkill();
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
81
|
+
console.error(chalk.red(`\nFailed: ${msg}`));
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
// nookplot skills remove <name>
|
|
86
|
+
cmd
|
|
87
|
+
.command("remove <name>")
|
|
88
|
+
.description("Remove a skill from skills.yaml")
|
|
89
|
+
.action(async (name) => {
|
|
90
|
+
try {
|
|
91
|
+
await removeSkill(name);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
95
|
+
console.error(chalk.red(`\nFailed: ${msg}`));
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
// nookplot skills init
|
|
100
|
+
cmd
|
|
101
|
+
.command("init")
|
|
102
|
+
.description("Create a starter skills.yaml in the current directory")
|
|
103
|
+
.action(async () => {
|
|
104
|
+
try {
|
|
105
|
+
await initSkillsFile();
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
109
|
+
console.error(chalk.red(`\nFailed: ${msg}`));
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// ── List ─────────────────────────────────────────────────────
|
|
115
|
+
async function listSkills(opts) {
|
|
116
|
+
const config = loadSkillsFile();
|
|
117
|
+
if (!config) {
|
|
118
|
+
console.log(chalk.dim("\n No skills.yaml found in current directory."));
|
|
119
|
+
console.log(chalk.dim(` Run ${chalk.cyan("nookplot skills init")} to create one.\n`));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const errors = validateSkillsConfig(config);
|
|
123
|
+
if (errors.length > 0) {
|
|
124
|
+
console.error(chalk.red("\n skills.yaml has errors:"));
|
|
125
|
+
for (const e of errors)
|
|
126
|
+
console.error(chalk.red(` - ${e}`));
|
|
127
|
+
console.log("");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (opts.json) {
|
|
131
|
+
console.log(JSON.stringify(config, null, 2));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const hashStore = loadSkillsHashStore();
|
|
135
|
+
console.log(chalk.bold(`\n ${config.skills.length} skill(s) in skills.yaml\n`));
|
|
136
|
+
for (const skill of config.skills) {
|
|
137
|
+
const hash = computeSkillHash(skill);
|
|
138
|
+
const stored = hashStore[skill.name];
|
|
139
|
+
const synced = stored?.hash === hash;
|
|
140
|
+
const price = skill.price ? `${skill.price} USDC` : chalk.dim("Free");
|
|
141
|
+
const pricing = PRICING_LABELS[skill.pricingModel ?? "per-task"] ?? "Per Task";
|
|
142
|
+
const syncStatus = synced
|
|
143
|
+
? chalk.green("synced")
|
|
144
|
+
: stored
|
|
145
|
+
? chalk.yellow("changed")
|
|
146
|
+
: chalk.dim("not synced");
|
|
147
|
+
console.log(` ${chalk.bold(skill.name)} ${chalk.cyan(skill.category)} ${chalk.yellow(price)} (${pricing}) [${syncStatus}]`);
|
|
148
|
+
console.log(` ${skill.description}`);
|
|
149
|
+
if (skill.tags?.length) {
|
|
150
|
+
console.log(` Tags: ${skill.tags.map(t => chalk.dim(t)).join(", ")}`);
|
|
151
|
+
}
|
|
152
|
+
console.log("");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// ── Sync ─────────────────────────────────────────────────────
|
|
156
|
+
async function syncSkills(globalOpts, cmdOpts) {
|
|
157
|
+
const cliConfig = loadConfig({
|
|
158
|
+
configPath: globalOpts.config,
|
|
159
|
+
gatewayOverride: globalOpts.gateway,
|
|
160
|
+
apiKeyOverride: globalOpts.apiKey,
|
|
161
|
+
});
|
|
162
|
+
const errors = validateConfig(cliConfig);
|
|
163
|
+
if (errors.length > 0) {
|
|
164
|
+
for (const e of errors)
|
|
165
|
+
console.error(chalk.red(` - ${e}`));
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
if (!cliConfig.privateKey) {
|
|
169
|
+
console.error(chalk.red(" Private key required for skills sync. Set NOOKPLOT_AGENT_PRIVATE_KEY in .env."));
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
const wallet = new ethers.Wallet(cliConfig.privateKey);
|
|
173
|
+
const skillsConfig = loadSkillsFile();
|
|
174
|
+
if (!skillsConfig) {
|
|
175
|
+
console.log(chalk.dim("\n No skills.yaml found. Run `nookplot skills init` to create one.\n"));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const validationErrors = validateSkillsConfig(skillsConfig);
|
|
179
|
+
if (validationErrors.length > 0) {
|
|
180
|
+
console.error(chalk.red("\n skills.yaml has errors:"));
|
|
181
|
+
for (const e of validationErrors)
|
|
182
|
+
console.error(chalk.red(` - ${e}`));
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
// Resolve token
|
|
186
|
+
const tokenKey = (cmdOpts.token ?? "usdc").toLowerCase();
|
|
187
|
+
const tokenInfo = TOKEN_MAP[tokenKey];
|
|
188
|
+
if (!tokenInfo) {
|
|
189
|
+
console.error(chalk.red(` Unknown token "${cmdOpts.token}". Accepted: usdc, nook`));
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
const hashStore = cmdOpts.force ? {} : loadSkillsHashStore();
|
|
193
|
+
const currentNames = new Set(skillsConfig.skills.map(s => s.name));
|
|
194
|
+
// Determine what changed
|
|
195
|
+
const newSkills = [];
|
|
196
|
+
const changedSkills = [];
|
|
197
|
+
const removedNames = [];
|
|
198
|
+
for (const skill of skillsConfig.skills) {
|
|
199
|
+
const hash = computeSkillHash(skill);
|
|
200
|
+
const stored = hashStore[skill.name];
|
|
201
|
+
if (!stored) {
|
|
202
|
+
newSkills.push(skill);
|
|
203
|
+
}
|
|
204
|
+
else if (stored.hash !== hash) {
|
|
205
|
+
changedSkills.push(skill);
|
|
206
|
+
}
|
|
207
|
+
// else: unchanged
|
|
208
|
+
}
|
|
209
|
+
// Skills that were in the hash store but not in the current file
|
|
210
|
+
for (const name of Object.keys(hashStore)) {
|
|
211
|
+
if (!currentNames.has(name)) {
|
|
212
|
+
removedNames.push(name);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const totalChanges = newSkills.length + changedSkills.length + removedNames.length;
|
|
216
|
+
if (totalChanges === 0) {
|
|
217
|
+
console.log(chalk.green("\n All skills are up to date.\n"));
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
console.log(chalk.bold("\n Skills sync plan:"));
|
|
221
|
+
if (newSkills.length > 0) {
|
|
222
|
+
console.log(chalk.green(` + ${newSkills.length} new: ${newSkills.map(s => s.name).join(", ")}`));
|
|
223
|
+
}
|
|
224
|
+
if (changedSkills.length > 0) {
|
|
225
|
+
console.log(chalk.yellow(` ~ ${changedSkills.length} changed: ${changedSkills.map(s => s.name).join(", ")}`));
|
|
226
|
+
}
|
|
227
|
+
if (removedNames.length > 0) {
|
|
228
|
+
console.log(chalk.red(` - ${removedNames.length} removed: ${removedNames.join(", ")}`));
|
|
229
|
+
}
|
|
230
|
+
console.log("");
|
|
231
|
+
if (cmdOpts.dryRun) {
|
|
232
|
+
console.log(chalk.dim(" Dry run — no changes made.\n"));
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const updatedStore = { ...hashStore };
|
|
236
|
+
// 1. Create new listings
|
|
237
|
+
for (const skill of newSkills) {
|
|
238
|
+
const spinner = ora(`Creating listing: ${skill.name}`).start();
|
|
239
|
+
const listingId = await createOrUpdateListing(cliConfig, wallet, skill, tokenInfo, spinner);
|
|
240
|
+
if (listingId !== null) {
|
|
241
|
+
updatedStore[skill.name] = { hash: computeSkillHash(skill), listingId };
|
|
242
|
+
spinner.succeed(`Created: ${skill.name}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// 2. Update changed listings
|
|
246
|
+
for (const skill of changedSkills) {
|
|
247
|
+
const spinner = ora(`Updating listing: ${skill.name}`).start();
|
|
248
|
+
const stored = hashStore[skill.name];
|
|
249
|
+
if (stored?.listingId) {
|
|
250
|
+
await updateExistingListing(cliConfig, wallet, skill, stored.listingId, spinner);
|
|
251
|
+
updatedStore[skill.name] = { hash: computeSkillHash(skill), listingId: stored.listingId };
|
|
252
|
+
spinner.succeed(`Updated: ${skill.name}`);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// No listing ID — create fresh
|
|
256
|
+
const listingId = await createOrUpdateListing(cliConfig, wallet, skill, tokenInfo, spinner);
|
|
257
|
+
if (listingId !== null) {
|
|
258
|
+
updatedStore[skill.name] = { hash: computeSkillHash(skill), listingId };
|
|
259
|
+
spinner.succeed(`Created: ${skill.name}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// 3. Deactivate removed listings
|
|
264
|
+
for (const name of removedNames) {
|
|
265
|
+
const stored = hashStore[name];
|
|
266
|
+
if (stored?.listingId) {
|
|
267
|
+
const spinner = ora(`Deactivating: ${name}`).start();
|
|
268
|
+
await deactivateListing(cliConfig, wallet, stored.listingId, spinner);
|
|
269
|
+
spinner.succeed(`Deactivated: ${name}`);
|
|
270
|
+
}
|
|
271
|
+
delete updatedStore[name];
|
|
272
|
+
}
|
|
273
|
+
// 4. Update agent profile capabilities
|
|
274
|
+
const capSpinner = ora("Updating agent profile capabilities...").start();
|
|
275
|
+
const capabilities = extractCapabilities(skillsConfig.skills);
|
|
276
|
+
const patchResult = await gatewayRequest(cliConfig.gateway, "PATCH", "/v1/agents/me", { apiKey: cliConfig.apiKey, body: { capabilities } });
|
|
277
|
+
if (isGatewayError(patchResult)) {
|
|
278
|
+
capSpinner.warn(`Could not update capabilities: ${patchResult.error}`);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
capSpinner.succeed(`Profile updated with ${capabilities.length} capabilities`);
|
|
282
|
+
}
|
|
283
|
+
// 5. Save hash store
|
|
284
|
+
saveSkillsHashStore(updatedStore);
|
|
285
|
+
console.log(chalk.green(`\n Sync complete.\n`));
|
|
286
|
+
}
|
|
287
|
+
async function createOrUpdateListing(config, wallet, skill, tokenInfo, spinner) {
|
|
288
|
+
const priceFloat = parseFloat(skill.price ?? "0");
|
|
289
|
+
const priceAmount = priceFloat > 0
|
|
290
|
+
? String(BigInt(Math.round(priceFloat * 10 ** tokenInfo.decimals)))
|
|
291
|
+
: "0";
|
|
292
|
+
// Prepare
|
|
293
|
+
const prepareResult = await gatewayRequest(config.gateway, "POST", "/v1/prepare/service/list", {
|
|
294
|
+
apiKey: config.apiKey,
|
|
295
|
+
body: {
|
|
296
|
+
title: skill.name,
|
|
297
|
+
description: skill.description,
|
|
298
|
+
category: skill.category,
|
|
299
|
+
pricingModel: pricingModelToEnum(skill.pricingModel ?? "per-task"),
|
|
300
|
+
priceAmount,
|
|
301
|
+
tags: skill.tags ?? [],
|
|
302
|
+
tokenAddress: tokenInfo.address,
|
|
303
|
+
},
|
|
304
|
+
});
|
|
305
|
+
if (isGatewayError(prepareResult)) {
|
|
306
|
+
spinner.fail(`Failed to prepare listing for ${skill.name}: ${prepareResult.error}`);
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
// Sign
|
|
310
|
+
const { forwardRequest, domain, types } = prepareResult.data;
|
|
311
|
+
const sig = await wallet.signTypedData(domain, types, forwardRequest);
|
|
312
|
+
// Relay
|
|
313
|
+
const relayResult = await gatewayRequest(config.gateway, "POST", "/v1/relay", { apiKey: config.apiKey, body: { ...forwardRequest, signature: sig } });
|
|
314
|
+
if (isGatewayError(relayResult)) {
|
|
315
|
+
spinner.fail(`Failed to relay listing for ${skill.name}: ${relayResult.error}`);
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
// We don't get a listing ID back from relay — use the tx hash as reference
|
|
319
|
+
return relayResult.data.txHash;
|
|
320
|
+
}
|
|
321
|
+
async function updateExistingListing(config, wallet, skill, listingId, spinner) {
|
|
322
|
+
const parsedId = parseInt(listingId, 10);
|
|
323
|
+
if (isNaN(parsedId)) {
|
|
324
|
+
// listingId is a txHash (from initial create) — can't update, create new
|
|
325
|
+
spinner.info(`No numeric listing ID for ${skill.name} — will create fresh`);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
const prepareResult = await gatewayRequest(config.gateway, "POST", "/v1/prepare/service/update", {
|
|
329
|
+
apiKey: config.apiKey,
|
|
330
|
+
body: {
|
|
331
|
+
listingId: parsedId,
|
|
332
|
+
title: skill.name,
|
|
333
|
+
description: skill.description,
|
|
334
|
+
},
|
|
335
|
+
});
|
|
336
|
+
if (isGatewayError(prepareResult)) {
|
|
337
|
+
spinner.warn(`Failed to prepare update for ${skill.name}: ${prepareResult.error}`);
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const { forwardRequest, domain, types } = prepareResult.data;
|
|
341
|
+
const sig = await wallet.signTypedData(domain, types, forwardRequest);
|
|
342
|
+
const relayResult = await gatewayRequest(config.gateway, "POST", "/v1/relay", { apiKey: config.apiKey, body: { ...forwardRequest, signature: sig } });
|
|
343
|
+
if (isGatewayError(relayResult)) {
|
|
344
|
+
spinner.warn(`Failed to relay update for ${skill.name}: ${relayResult.error}`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
async function deactivateListing(config, wallet, listingId, spinner) {
|
|
348
|
+
const parsedId = parseInt(listingId, 10);
|
|
349
|
+
if (isNaN(parsedId)) {
|
|
350
|
+
// Can't deactivate by txHash — just remove from hash store
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
const prepareResult = await gatewayRequest(config.gateway, "POST", "/v1/prepare/service/update", {
|
|
354
|
+
apiKey: config.apiKey,
|
|
355
|
+
body: { listingId: parsedId, active: false },
|
|
356
|
+
});
|
|
357
|
+
if (isGatewayError(prepareResult)) {
|
|
358
|
+
spinner.warn(`Failed to prepare deactivation for listing #${parsedId}: ${prepareResult.error}`);
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
const { forwardRequest, domain, types } = prepareResult.data;
|
|
362
|
+
const sig = await wallet.signTypedData(domain, types, forwardRequest);
|
|
363
|
+
const relayResult = await gatewayRequest(config.gateway, "POST", "/v1/relay", { apiKey: config.apiKey, body: { ...forwardRequest, signature: sig } });
|
|
364
|
+
if (isGatewayError(relayResult)) {
|
|
365
|
+
spinner.warn(`Failed to relay deactivation for listing #${parsedId}: ${relayResult.error}`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// ── Add ──────────────────────────────────────────────────────
|
|
369
|
+
async function addSkill() {
|
|
370
|
+
const filePath = getSkillsFilePath() ?? join(process.cwd(), "skills.yaml");
|
|
371
|
+
const answers = await inquirer.prompt([
|
|
372
|
+
{ type: "input", name: "name", message: "Skill name:", validate: (v) => v.length > 0 || "Required" },
|
|
373
|
+
{ type: "input", name: "description", message: "Description:", validate: (v) => v.length > 0 || "Required" },
|
|
374
|
+
{ type: "input", name: "category", message: "Category (e.g. ai, dev, data):", default: "ai" },
|
|
375
|
+
{ type: "input", name: "price", message: "Price in USDC (0 for free):", default: "0" },
|
|
376
|
+
{ type: "list", name: "pricingModel", message: "Pricing model:", choices: ["per-task", "hourly", "subscription", "custom"], default: "per-task" },
|
|
377
|
+
{ type: "input", name: "tags", message: "Tags (comma-separated):", default: "" },
|
|
378
|
+
]);
|
|
379
|
+
const newSkill = {
|
|
380
|
+
name: answers.name,
|
|
381
|
+
description: answers.description,
|
|
382
|
+
category: answers.category,
|
|
383
|
+
...(parseFloat(answers.price) > 0 ? { price: answers.price } : {}),
|
|
384
|
+
pricingModel: answers.pricingModel,
|
|
385
|
+
tags: answers.tags ? answers.tags.split(",").map((t) => t.trim()).filter(Boolean) : [],
|
|
386
|
+
};
|
|
387
|
+
// Load existing or create new
|
|
388
|
+
let config;
|
|
389
|
+
if (existsSync(filePath)) {
|
|
390
|
+
const existing = loadSkillsFile();
|
|
391
|
+
config = existing ?? { skills: [] };
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
config = { skills: [] };
|
|
395
|
+
}
|
|
396
|
+
// Check for duplicate
|
|
397
|
+
if (config.skills.some(s => s.name === newSkill.name)) {
|
|
398
|
+
console.error(chalk.red(`\n A skill named "${newSkill.name}" already exists.\n`));
|
|
399
|
+
process.exit(1);
|
|
400
|
+
}
|
|
401
|
+
config.skills.push(newSkill);
|
|
402
|
+
// Write back
|
|
403
|
+
const yamlStr = yaml.dump(config, { indent: 2, lineWidth: 120, noRefs: true });
|
|
404
|
+
writeFileSync(filePath, yamlStr, "utf-8");
|
|
405
|
+
console.log(chalk.green(`\n Added "${newSkill.name}" to ${filePath}`));
|
|
406
|
+
console.log(chalk.dim(` Run ${chalk.cyan("nookplot skills sync")} to publish.\n`));
|
|
407
|
+
}
|
|
408
|
+
// ── Remove ───────────────────────────────────────────────────
|
|
409
|
+
async function removeSkill(name) {
|
|
410
|
+
const filePath = getSkillsFilePath();
|
|
411
|
+
if (!filePath) {
|
|
412
|
+
console.error(chalk.red("\n No skills.yaml found.\n"));
|
|
413
|
+
process.exit(1);
|
|
414
|
+
}
|
|
415
|
+
const config = loadSkillsFile();
|
|
416
|
+
if (!config) {
|
|
417
|
+
console.error(chalk.red("\n Could not parse skills.yaml.\n"));
|
|
418
|
+
process.exit(1);
|
|
419
|
+
}
|
|
420
|
+
const idx = config.skills.findIndex(s => s.name === name);
|
|
421
|
+
if (idx === -1) {
|
|
422
|
+
console.error(chalk.red(`\n Skill "${name}" not found in skills.yaml.\n`));
|
|
423
|
+
process.exit(1);
|
|
424
|
+
}
|
|
425
|
+
config.skills.splice(idx, 1);
|
|
426
|
+
const yamlStr = yaml.dump(config, { indent: 2, lineWidth: 120, noRefs: true });
|
|
427
|
+
writeFileSync(filePath, yamlStr, "utf-8");
|
|
428
|
+
console.log(chalk.green(`\n Removed "${name}" from skills.yaml`));
|
|
429
|
+
console.log(chalk.dim(` Run ${chalk.cyan("nookplot skills sync")} to deactivate the listing.\n`));
|
|
430
|
+
}
|
|
431
|
+
// ── Init ─────────────────────────────────────────────────────
|
|
432
|
+
async function initSkillsFile() {
|
|
433
|
+
const filePath = join(process.cwd(), "skills.yaml");
|
|
434
|
+
if (existsSync(filePath)) {
|
|
435
|
+
console.log(chalk.yellow("\n skills.yaml already exists.\n"));
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
writeFileSync(filePath, generateStarterSkillsYaml(), "utf-8");
|
|
439
|
+
console.log(chalk.green("\n Created skills.yaml"));
|
|
440
|
+
console.log(chalk.dim(` Edit the file, then run ${chalk.cyan("nookplot skills sync")} to publish.\n`));
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Programmatic sync — used by `nookplot up` to sync skills non-interactively.
|
|
444
|
+
* Returns the number of skills synced, or -1 on error.
|
|
445
|
+
*/
|
|
446
|
+
export async function syncSkillsNonInteractive(config, log) {
|
|
447
|
+
const skillsConfig = loadSkillsFile();
|
|
448
|
+
if (!skillsConfig || skillsConfig.skills.length === 0)
|
|
449
|
+
return 0;
|
|
450
|
+
const validationErrors = validateSkillsConfig(skillsConfig);
|
|
451
|
+
if (validationErrors.length > 0) {
|
|
452
|
+
log(`skills.yaml validation errors: ${validationErrors.join("; ")}`);
|
|
453
|
+
return -1;
|
|
454
|
+
}
|
|
455
|
+
const wallet = new ethers.Wallet(config.privateKey);
|
|
456
|
+
const tokenInfo = TOKEN_MAP.usdc;
|
|
457
|
+
const hashStore = loadSkillsHashStore();
|
|
458
|
+
const updatedStore = { ...hashStore };
|
|
459
|
+
let synced = 0;
|
|
460
|
+
for (const skill of skillsConfig.skills) {
|
|
461
|
+
const hash = computeSkillHash(skill);
|
|
462
|
+
const stored = hashStore[skill.name];
|
|
463
|
+
if (stored?.hash === hash)
|
|
464
|
+
continue; // unchanged
|
|
465
|
+
const priceFloat = parseFloat(skill.price ?? "0");
|
|
466
|
+
const priceAmount = priceFloat > 0
|
|
467
|
+
? String(BigInt(Math.round(priceFloat * 10 ** tokenInfo.decimals)))
|
|
468
|
+
: "0";
|
|
469
|
+
const prepareResult = await gatewayRequest(config.gateway, "POST", "/v1/prepare/service/list", {
|
|
470
|
+
apiKey: config.apiKey,
|
|
471
|
+
body: {
|
|
472
|
+
title: skill.name,
|
|
473
|
+
description: skill.description,
|
|
474
|
+
category: skill.category,
|
|
475
|
+
pricingModel: pricingModelToEnum(skill.pricingModel ?? "per-task"),
|
|
476
|
+
priceAmount,
|
|
477
|
+
tags: skill.tags ?? [],
|
|
478
|
+
tokenAddress: tokenInfo.address,
|
|
479
|
+
},
|
|
480
|
+
});
|
|
481
|
+
if (isGatewayError(prepareResult)) {
|
|
482
|
+
log(`Failed to prepare listing for ${skill.name}: ${prepareResult.error}`);
|
|
483
|
+
continue;
|
|
484
|
+
}
|
|
485
|
+
const { forwardRequest, domain, types } = prepareResult.data;
|
|
486
|
+
const sig = await wallet.signTypedData(domain, types, forwardRequest);
|
|
487
|
+
const relayResult = await gatewayRequest(config.gateway, "POST", "/v1/relay", { apiKey: config.apiKey, body: { ...forwardRequest, signature: sig } });
|
|
488
|
+
if (isGatewayError(relayResult)) {
|
|
489
|
+
log(`Failed to relay listing for ${skill.name}: ${relayResult.error}`);
|
|
490
|
+
continue;
|
|
491
|
+
}
|
|
492
|
+
updatedStore[skill.name] = { hash, listingId: relayResult.data.txHash };
|
|
493
|
+
synced++;
|
|
494
|
+
log(`Synced skill: ${skill.name}`);
|
|
495
|
+
}
|
|
496
|
+
// Update agent capabilities
|
|
497
|
+
const capabilities = extractCapabilities(skillsConfig.skills);
|
|
498
|
+
await gatewayRequest(config.gateway, "PATCH", "/v1/agents/me", { apiKey: config.apiKey, body: { capabilities } });
|
|
499
|
+
saveSkillsHashStore(updatedStore);
|
|
500
|
+
return synced;
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nookplot up` — One-command agent activation.
|
|
3
|
+
*
|
|
4
|
+
* Registers agent (if needed), syncs skills.yaml (if present),
|
|
5
|
+
* and runs a foreground agent loop with a compact dashboard.
|
|
6
|
+
*
|
|
7
|
+
* This is the primary "zero to live" developer experience.
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* --background/-b Fork to background (like `online start`)
|
|
11
|
+
* --no-register Skip auto-registration
|
|
12
|
+
* --no-skills Skip skills.yaml sync
|
|
13
|
+
* --endpoint <url> Set agent endpoint (for marketplace)
|
|
14
|
+
* --exec <cmd> Pipe triggers to a handler command
|
|
15
|
+
* --agent-api <url> OpenAI-compatible API URL
|
|
16
|
+
* --xmtp Enable XMTP bridge
|
|
17
|
+
*
|
|
18
|
+
* @module commands/up
|
|
19
|
+
*/
|
|
20
|
+
import type { Command } from "commander";
|
|
21
|
+
export declare function registerUpCommand(program: Command): void;
|