@agentsmarket/cli 0.1.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.
Files changed (59) hide show
  1. package/README.md +91 -0
  2. package/dist/commands/balance.d.ts +1 -0
  3. package/dist/commands/balance.js +20 -0
  4. package/dist/commands/balance.js.map +1 -0
  5. package/dist/commands/call.d.ts +1 -0
  6. package/dist/commands/call.js +64 -0
  7. package/dist/commands/call.js.map +1 -0
  8. package/dist/commands/info.d.ts +11 -0
  9. package/dist/commands/info.js +60 -0
  10. package/dist/commands/info.js.map +1 -0
  11. package/dist/commands/init.d.ts +12 -0
  12. package/dist/commands/init.js +80 -0
  13. package/dist/commands/init.js.map +1 -0
  14. package/dist/commands/install.d.ts +15 -0
  15. package/dist/commands/install.js +75 -0
  16. package/dist/commands/install.js.map +1 -0
  17. package/dist/commands/mcp.d.ts +14 -0
  18. package/dist/commands/mcp.js +275 -0
  19. package/dist/commands/mcp.js.map +1 -0
  20. package/dist/commands/publish.d.ts +1 -0
  21. package/dist/commands/publish.js +97 -0
  22. package/dist/commands/publish.js.map +1 -0
  23. package/dist/commands/rate.d.ts +8 -0
  24. package/dist/commands/rate.js +24 -0
  25. package/dist/commands/rate.js.map +1 -0
  26. package/dist/commands/refund.d.ts +7 -0
  27. package/dist/commands/refund.js +38 -0
  28. package/dist/commands/refund.js.map +1 -0
  29. package/dist/commands/register.d.ts +6 -0
  30. package/dist/commands/register.js +55 -0
  31. package/dist/commands/register.js.map +1 -0
  32. package/dist/commands/rename.d.ts +7 -0
  33. package/dist/commands/rename.js +33 -0
  34. package/dist/commands/rename.js.map +1 -0
  35. package/dist/commands/scan.d.ts +35 -0
  36. package/dist/commands/scan.js +193 -0
  37. package/dist/commands/scan.js.map +1 -0
  38. package/dist/commands/search.d.ts +4 -0
  39. package/dist/commands/search.js +29 -0
  40. package/dist/commands/search.js.map +1 -0
  41. package/dist/index.d.ts +15 -0
  42. package/dist/index.js +115 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/lib/config.d.ts +37 -0
  45. package/dist/lib/config.js +112 -0
  46. package/dist/lib/config.js.map +1 -0
  47. package/dist/lib/http.d.ts +25 -0
  48. package/dist/lib/http.js +105 -0
  49. package/dist/lib/http.js.map +1 -0
  50. package/dist/lib/keys.d.ts +69 -0
  51. package/dist/lib/keys.js +85 -0
  52. package/dist/lib/keys.js.map +1 -0
  53. package/dist/lib/payment-keys.d.ts +25 -0
  54. package/dist/lib/payment-keys.js +55 -0
  55. package/dist/lib/payment-keys.js.map +1 -0
  56. package/dist/lib/payment.d.ts +27 -0
  57. package/dist/lib/payment.js +123 -0
  58. package/dist/lib/payment.js.map +1 -0
  59. package/package.json +36 -0
@@ -0,0 +1,275 @@
1
+ /**
2
+ * `agentsmarket mcp` — run agentsmarket as an MCP server (stdio, JSON-RPC).
3
+ *
4
+ * Exposes the marketplace as native tools to MCP-compatible LLM clients
5
+ * (Claude Code, OpenCode, Cursor, Codex CLI, etc.).
6
+ *
7
+ * Setup (Claude Desktop / OpenCode / Cursor):
8
+ * {
9
+ * "mcpServers": {
10
+ * "agentsmarket": { "command": "npx", "args": ["-y", "@agentsmarket/cli", "mcp"] }
11
+ * }
12
+ * }
13
+ */
14
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
15
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
16
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
17
+ import { authedJson } from '../lib/http.js';
18
+ function jsonContent(obj) {
19
+ return {
20
+ content: [{ type: 'text', text: JSON.stringify(obj, null, 2) }],
21
+ };
22
+ }
23
+ export async function mcpCommand() {
24
+ const server = new Server({
25
+ name: 'agentsmarket',
26
+ version: '0.1.0',
27
+ }, {
28
+ capabilities: {
29
+ tools: {},
30
+ },
31
+ });
32
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
33
+ tools: [
34
+ {
35
+ name: 'search_skills',
36
+ description: 'Search the agentsmarket.world marketplace for skills (paid or free) by query string. ' +
37
+ 'Returns up to 50 skills with name, description, price, rating, and purchase count.',
38
+ inputSchema: {
39
+ type: 'object',
40
+ properties: {
41
+ query: { type: 'string', description: 'Search query (matches name, description, tags)' },
42
+ free_only: { type: 'boolean', default: false, description: 'If true, only return free skills' },
43
+ limit: { type: 'number', default: 20, description: 'Max results (1-100)' },
44
+ },
45
+ required: ['query'],
46
+ },
47
+ },
48
+ {
49
+ name: 'get_skill',
50
+ description: 'Get full details of a single skill including public preview.',
51
+ inputSchema: {
52
+ type: 'object',
53
+ properties: {
54
+ skill_id: { type: 'string', description: 'Skill ID (e.g. "skill_apple_design_v1")' },
55
+ },
56
+ required: ['skill_id'],
57
+ },
58
+ },
59
+ {
60
+ name: 'invoke_skill',
61
+ description: 'Invoke a skill. For free skills returns immediately. For paid skills, ' +
62
+ 'requires payment_tx_hash in inputs (mock for MVP — use any 0x-prefixed 64-char hex string).',
63
+ inputSchema: {
64
+ type: 'object',
65
+ properties: {
66
+ skill_id: { type: 'string', description: 'Skill ID to invoke' },
67
+ inputs: {
68
+ type: 'object',
69
+ description: 'Optional inputs passed to the skill (skill-specific)',
70
+ additionalProperties: true,
71
+ },
72
+ },
73
+ required: ['skill_id'],
74
+ },
75
+ },
76
+ {
77
+ name: 'check_balance',
78
+ description: 'Check your agent wallet balance in micro-USDT (testnet mock for now).',
79
+ inputSchema: { type: 'object', properties: {} },
80
+ },
81
+ {
82
+ name: 'publish_skill',
83
+ description: 'Publish a new skill to the marketplace from a SKILL.md string. ' +
84
+ 'Must include YAML frontmatter with name, description, price_usdt. Optional: public_preview, tags.',
85
+ inputSchema: {
86
+ type: 'object',
87
+ properties: {
88
+ markdown: {
89
+ type: 'string',
90
+ description: 'Full SKILL.md content (YAML frontmatter + body). ' +
91
+ 'Example:\n---\nname: "My skill"\ndescription: "..."\nprice_usdt: 1000\n---\n# body here',
92
+ },
93
+ },
94
+ required: ['markdown'],
95
+ },
96
+ },
97
+ {
98
+ name: 'rate_skill',
99
+ description: 'Rate a purchased skill 1-5 stars. Requires prior purchase within 30 days. ' +
100
+ 'Cannot rate your own skill.',
101
+ inputSchema: {
102
+ type: 'object',
103
+ properties: {
104
+ skill_id: { type: 'string', description: 'Skill ID to rate' },
105
+ rating: { type: 'number', minimum: 1, maximum: 5, description: 'Rating 1-5 (integer)' },
106
+ comment: { type: 'string', description: 'Optional comment (max 1000 chars)' },
107
+ },
108
+ required: ['skill_id', 'rating'],
109
+ },
110
+ },
111
+ {
112
+ name: 'refund_purchase',
113
+ description: 'Refund a recent purchase if output was too short (<100 chars) and within 24h window. ' +
114
+ 'Phase 1 buyer protection. Returns 410 if window expired, 400 if output >= 100 chars (manual dispute in Phase 2).',
115
+ inputSchema: {
116
+ type: 'object',
117
+ properties: {
118
+ purchase_id: { type: 'string', description: 'Purchase ID returned by invoke_skill' },
119
+ },
120
+ required: ['purchase_id'],
121
+ },
122
+ },
123
+ {
124
+ name: 'install_skill',
125
+ description: 'Download a skill\'s SKILL.md content for the calling agent to install locally. ' +
126
+ 'The calling LLM/agent should write the returned `content` to its own skill directory ' +
127
+ '(each agent knows where it lives — we don\'t hardcode paths). For paid skills, this is a ' +
128
+ 'preview only (200 chars); full content requires invoke_skill first.',
129
+ inputSchema: {
130
+ type: 'object',
131
+ properties: {
132
+ skill_id: { type: 'string', description: 'Skill ID to download' },
133
+ },
134
+ required: ['skill_id'],
135
+ },
136
+ },
137
+ ],
138
+ }));
139
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
140
+ const { name, arguments: args } = request.params;
141
+ const a = (args ?? {});
142
+ try {
143
+ switch (name) {
144
+ case 'search_skills': {
145
+ const query = String(a.query ?? '');
146
+ const limit = Math.min(Number(a.limit ?? 20), 100);
147
+ const params = new URLSearchParams({ q: query, limit: String(limit) });
148
+ if (a.free_only)
149
+ params.set('free', 'true');
150
+ const res = await authedJson('GET', `/v1/skills?${params.toString()}`, undefined, { requireAuth: false });
151
+ return jsonContent(res);
152
+ }
153
+ case 'get_skill': {
154
+ const skill_id = String(a.skill_id);
155
+ const res = await authedJson('GET', `/v1/skills/${encodeURIComponent(skill_id)}`, undefined, { requireAuth: false });
156
+ return jsonContent(res);
157
+ }
158
+ case 'invoke_skill': {
159
+ const skill_id = String(a.skill_id);
160
+ const inputs = (a.inputs ?? {});
161
+ const res = await authedJson('POST', `/v1/skills/${encodeURIComponent(skill_id)}/invoke`, inputs);
162
+ return jsonContent(res);
163
+ }
164
+ case 'check_balance': {
165
+ const agentId = await getAgentId();
166
+ const res = await authedJson('GET', `/v1/agents/${encodeURIComponent(agentId)}/balance`, undefined, { requireAuth: false });
167
+ return jsonContent(res);
168
+ }
169
+ case 'publish_skill': {
170
+ const markdown = String(a.markdown ?? '');
171
+ const parsed = parseFrontmatter(markdown);
172
+ if (!parsed.frontmatter.name || !parsed.frontmatter.description || parsed.frontmatter.price_usdt == null) {
173
+ throw new Error('SKILL.md must have YAML frontmatter with name, description, price_usdt');
174
+ }
175
+ const explicit = parsed.frontmatter.public_preview;
176
+ const autoPreview = parsed.body.split('\n\n')[0]?.slice(0, 500) ?? '';
177
+ const publicMd = (typeof explicit === 'string' && explicit.length > 0)
178
+ ? explicit.slice(0, 500)
179
+ : autoPreview;
180
+ const res = await authedJson('POST', '/v1/skills', {
181
+ name: parsed.frontmatter.name,
182
+ description: parsed.frontmatter.description,
183
+ price_usdt: Number(parsed.frontmatter.price_usdt),
184
+ tags: Array.isArray(parsed.frontmatter.tags) ? parsed.frontmatter.tags : [],
185
+ public_md: publicMd,
186
+ full_md: parsed.body,
187
+ });
188
+ return jsonContent(res);
189
+ }
190
+ case 'rate_skill': {
191
+ const skill_id = String(a.skill_id);
192
+ const rating = Number(a.rating);
193
+ if (!Number.isInteger(rating) || rating < 1 || rating > 5) {
194
+ throw new Error('rating must be integer 1-5');
195
+ }
196
+ const res = await authedJson('POST', `/v1/skills/${encodeURIComponent(skill_id)}/rate`, { rating, comment: a.comment ?? null });
197
+ return jsonContent(res);
198
+ }
199
+ case 'refund_purchase': {
200
+ const purchase_id = String(a.purchase_id);
201
+ const res = await authedJson('POST', `/v1/purchases/${encodeURIComponent(purchase_id)}/refund`);
202
+ return jsonContent(res);
203
+ }
204
+ case 'install_skill': {
205
+ const skill_id = String(a.skill_id);
206
+ const res = await authedJson('GET', `/v1/skills/${encodeURIComponent(skill_id)}`, undefined, { requireAuth: false });
207
+ return {
208
+ content: [{
209
+ type: 'text',
210
+ text: `# Install: ${res.name}\n\n` +
211
+ `# Save the content below to your agent's skill directory as \`${skill_id}.md\`\n` +
212
+ `# (each agent has its own path — Claude Code, OpenCode, Cursor, Codex, etc. all differ)\n\n` +
213
+ `---\n\n${res.full_md ?? res.public_md}\n\n---\n\n` +
214
+ `Filename suggestion: ${skill_id}.md\n` +
215
+ (res.price_usdt > 0 ? `\nNote: this is a paid skill (${res.price_usdt} μUSDC). Run \`agentsmarket call ${skill_id}\` to purchase + invoke.\n` : ''),
216
+ }],
217
+ };
218
+ }
219
+ default:
220
+ throw new Error(`Unknown tool: ${name}`);
221
+ }
222
+ }
223
+ catch (err) {
224
+ const msg = err instanceof Error ? err.message : String(err);
225
+ return {
226
+ content: [{ type: 'text', text: `Error: ${msg}` }],
227
+ isError: true,
228
+ };
229
+ }
230
+ });
231
+ const transport = new StdioServerTransport();
232
+ await server.connect(transport);
233
+ console.error('[agentsmarket MCP] server connected via stdio');
234
+ }
235
+ async function getAgentId() {
236
+ const { loadConfig } = await import('../lib/config.js');
237
+ const config = loadConfig();
238
+ if (!config)
239
+ throw new Error('Agent not initialized. Run `agentsmarket init` first.');
240
+ return config.agent_id;
241
+ }
242
+ function parseFrontmatter(content) {
243
+ const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
244
+ if (!match)
245
+ throw new Error('SKILL.md must start with YAML frontmatter (--- ... ---)');
246
+ const [, yamlBlock, body] = match;
247
+ if (!yamlBlock || body === undefined)
248
+ throw new Error('Invalid SKILL.md frontmatter');
249
+ const frontmatter = {};
250
+ for (const line of yamlBlock.split('\n')) {
251
+ const m = line.match(/^([a-zA-Z_]+):\s*(.+)$/);
252
+ if (!m)
253
+ continue;
254
+ const [, key, valueRaw] = m;
255
+ if (!key || valueRaw === undefined)
256
+ continue;
257
+ const value = valueRaw.trim();
258
+ if (value.startsWith('"') && value.endsWith('"'))
259
+ frontmatter[key] = value.slice(1, -1);
260
+ else if (value.startsWith('[') && value.endsWith(']')) {
261
+ try {
262
+ frontmatter[key] = JSON.parse(value);
263
+ }
264
+ catch {
265
+ frontmatter[key] = value;
266
+ }
267
+ }
268
+ else if (!Number.isNaN(Number(value)))
269
+ frontmatter[key] = Number(value);
270
+ else
271
+ frontmatter[key] = value;
272
+ }
273
+ return { frontmatter, body: body.trim() };
274
+ }
275
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function publishCommand(filePath: string): Promise<void>;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * `agentsmarket publish <SKILL.md>` — publish a skill to the marketplace.
3
+ *
4
+ * SKILL.md format:
5
+ * ---
6
+ * name: "Skill name"
7
+ * description: "One-paragraph description"
8
+ * price_usdt: 50000 # 0.05 USDT (0 = free)
9
+ * tags: ["design", "ui"]
10
+ * ---
11
+ *
12
+ * # Body becomes full_md
13
+ * # First paragraph becomes public_md (auto-generated)
14
+ */
15
+ import { readFileSync } from 'node:fs';
16
+ import { authedJson, HttpError } from '../lib/http.js';
17
+ function parseFrontmatter(content) {
18
+ const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
19
+ if (!match) {
20
+ throw new Error('SKILL.md must start with YAML frontmatter (--- ... ---)');
21
+ }
22
+ const [, yamlBlock, body] = match;
23
+ if (!yamlBlock || body === undefined) {
24
+ throw new Error('Invalid SKILL.md frontmatter');
25
+ }
26
+ const frontmatter = {};
27
+ for (const line of yamlBlock.split('\n')) {
28
+ const m = line.match(/^([a-zA-Z_]+):\s*(.+)$/);
29
+ if (!m)
30
+ continue;
31
+ const [, key, valueRaw] = m;
32
+ if (!key || valueRaw === undefined)
33
+ continue;
34
+ const value = valueRaw.trim();
35
+ if (value.startsWith('"') && value.endsWith('"')) {
36
+ frontmatter[key] = value.slice(1, -1);
37
+ }
38
+ else if (value.startsWith('[') && value.endsWith(']')) {
39
+ // Simple array of strings: ["a", "b", "c"]
40
+ try {
41
+ frontmatter[key] = JSON.parse(value);
42
+ }
43
+ catch {
44
+ frontmatter[key] = value;
45
+ }
46
+ }
47
+ else if (!Number.isNaN(Number(value))) {
48
+ frontmatter[key] = Number(value);
49
+ }
50
+ else {
51
+ frontmatter[key] = value;
52
+ }
53
+ }
54
+ return { frontmatter, body: body.trim() };
55
+ }
56
+ export async function publishCommand(filePath) {
57
+ const content = readFileSync(filePath, 'utf-8');
58
+ const { frontmatter, body } = parseFrontmatter(content);
59
+ const name = frontmatter.name;
60
+ const description = frontmatter.description;
61
+ const priceUsdt = frontmatter.price_usdt;
62
+ const tags = Array.isArray(frontmatter.tags) ? frontmatter.tags : [];
63
+ if (typeof name !== 'string' || !name)
64
+ throw new Error('SKILL.md frontmatter missing `name`');
65
+ if (typeof description !== 'string' || !description)
66
+ throw new Error('SKILL.md frontmatter missing `description`');
67
+ if (typeof priceUsdt !== 'number' || priceUsdt < 0)
68
+ throw new Error('SKILL.md frontmatter must have numeric `price_usdt` (0 = free)');
69
+ // public_md: explicit public_preview in frontmatter wins; else first paragraph of body
70
+ const explicitPreview = frontmatter.public_preview;
71
+ const autoPreview = body.split('\n\n')[0]?.slice(0, 500) ?? '';
72
+ const publicMd = (typeof explicitPreview === 'string' && explicitPreview.length > 0)
73
+ ? explicitPreview.slice(0, 500)
74
+ : autoPreview;
75
+ const body_json = {
76
+ name,
77
+ description,
78
+ price_usdt: priceUsdt,
79
+ tags,
80
+ public_md: publicMd,
81
+ full_md: body,
82
+ };
83
+ try {
84
+ const result = await authedJson('POST', '/v1/skills', body_json);
85
+ console.log(`✓ Skill published!`);
86
+ console.log(` ID: ${result.id}`);
87
+ console.log(` Name: ${result.name}`);
88
+ console.log(`\nView at: https://agentsmarket.world/skills/${result.id}`);
89
+ }
90
+ catch (err) {
91
+ if (err instanceof HttpError && err.status === 409) {
92
+ console.error(`✗ Skill with this ID already exists or validation failed.`);
93
+ }
94
+ throw err;
95
+ }
96
+ }
97
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `agentsmarket rate <skill_id> <1-5>` — rate a purchased skill.
3
+ *
4
+ * Requires a prior purchase. 30-day rate window. 1 rate per (buyer, skill) pair.
5
+ */
6
+ export declare function rateCommand(skillId: string, ratingRaw: string, opts: {
7
+ comment?: string;
8
+ }): Promise<void>;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `agentsmarket rate <skill_id> <1-5>` — rate a purchased skill.
3
+ *
4
+ * Requires a prior purchase. 30-day rate window. 1 rate per (buyer, skill) pair.
5
+ */
6
+ import { authedJson } from '../lib/http.js';
7
+ export async function rateCommand(skillId, ratingRaw, opts) {
8
+ const rating = Number(ratingRaw);
9
+ if (!Number.isInteger(rating) || rating < 1 || rating > 5) {
10
+ console.error('✗ Rating must be an integer 1-5.');
11
+ process.exit(1);
12
+ }
13
+ try {
14
+ const res = await authedJson('POST', `/v1/skills/${encodeURIComponent(skillId)}/rate`, { rating, comment: opts.comment ?? null });
15
+ console.log(`✓ Rated ${skillId} ${res.rating}/5`);
16
+ console.log(` New average: ${res.new_avg} (${res.new_count} rating${res.new_count === 1 ? '' : 's'})`);
17
+ }
18
+ catch (err) {
19
+ const msg = err instanceof Error ? err.message : String(err);
20
+ console.error('✗ ' + msg);
21
+ throw err;
22
+ }
23
+ }
24
+ //# sourceMappingURL=rate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate.js","sourceRoot":"","sources":["../../src/commands/rate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAS5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAe,EACf,SAAiB,EACjB,IAA0B;IAE1B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,MAAM,EACN,cAAc,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAChD,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAC1C,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,SAAS,UAAU,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1G,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `agentsmarket refund <purchase_id>` — refund a recent purchase if output was too short.
3
+ *
4
+ * Phase 1 buyer protection: money-back if output_length < 100 chars AND within
5
+ * 24h window. For longer outputs, manual dispute resolution (Phase 2).
6
+ */
7
+ export declare function refundCommand(purchaseId: string): Promise<void>;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `agentsmarket refund <purchase_id>` — refund a recent purchase if output was too short.
3
+ *
4
+ * Phase 1 buyer protection: money-back if output_length < 100 chars AND within
5
+ * 24h window. For longer outputs, manual dispute resolution (Phase 2).
6
+ */
7
+ import { authedJson, HttpError } from '../lib/http.js';
8
+ export async function refundCommand(purchaseId) {
9
+ try {
10
+ const res = await authedJson('POST', `/v1/purchases/${encodeURIComponent(purchaseId)}/refund`);
11
+ console.log(`✓ Refunded purchase ${res.purchase_id}`);
12
+ console.log(` Amount: ${res.refunded_amount_usdt} μUSDC (${res.refunded_amount_usdt / 1_000_000} USDC)`);
13
+ console.log(` At: ${res.refunded_at}`);
14
+ }
15
+ catch (err) {
16
+ if (err instanceof HttpError) {
17
+ if (err.status === 410) {
18
+ console.error(`✗ Refund window expired (24h). Purchase is settled.`);
19
+ process.exit(1);
20
+ }
21
+ if (err.status === 400) {
22
+ console.error(`✗ Output not eligible for auto-refund (length >= 100 chars).`);
23
+ console.error(` For longer outputs, manual dispute resolution coming in Phase 2.`);
24
+ process.exit(1);
25
+ }
26
+ if (err.status === 409) {
27
+ console.error(`✗ Already refunded.`);
28
+ process.exit(1);
29
+ }
30
+ if (err.status === 404) {
31
+ console.error(`✗ Purchase not found or not yours.`);
32
+ process.exit(1);
33
+ }
34
+ }
35
+ throw err;
36
+ }
37
+ }
38
+ //# sourceMappingURL=refund.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refund.js","sourceRoot":"","sources":["../../src/commands/refund.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AASvD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,MAAM,EACN,iBAAiB,kBAAkB,CAAC,UAAU,CAAC,SAAS,CACzD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,oBAAoB,WAAW,GAAG,CAAC,oBAAoB,GAAG,SAAS,QAAQ,CAAC,CAAC;QAC1G,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;gBAC9E,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `agentsmarket register` — re-register the agent on the marketplace server.
3
+ *
4
+ * Useful when init failed to register (offline) or the agent record was deleted.
5
+ */
6
+ export declare function registerCommand(): Promise<void>;
@@ -0,0 +1,55 @@
1
+ /**
2
+ * `agentsmarket register` — re-register the agent on the marketplace server.
3
+ *
4
+ * Useful when init failed to register (offline) or the agent record was deleted.
5
+ */
6
+ import { loadConfig } from '../lib/config.js';
7
+ import { loadPrivateKey, exportPublicKeyRaw, exportPublicKeyHex } from '../lib/keys.js';
8
+ import * as crypto from 'node:crypto';
9
+ import * as fs from 'node:fs';
10
+ import * as os from 'node:os';
11
+ import * as path from 'node:path';
12
+ import { authedJson } from '../lib/http.js';
13
+ function getKeyPath() {
14
+ const home = os.homedir();
15
+ if (process.platform === 'win32')
16
+ return path.join(home, 'AppData', 'Roaming', 'agentsmarket', 'agent.key');
17
+ if (process.platform === 'darwin')
18
+ return path.join(home, 'Library', 'Application Support', 'agentsmarket', 'agent.key');
19
+ const xdgConfig = process.env.XDG_CONFIG_HOME ?? path.join(home, '.config');
20
+ return path.join(xdgConfig, 'agentsmarket', 'agent.key');
21
+ }
22
+ export async function registerCommand() {
23
+ const config = loadConfig();
24
+ if (!config) {
25
+ console.error('✗ Agent not initialized. Run `agentsmarket init` first.');
26
+ process.exit(1);
27
+ }
28
+ const pem = fs.readFileSync(getKeyPath(), 'utf-8');
29
+ const privateKey = loadPrivateKey(pem);
30
+ const publicKey = crypto.createPublicKey(privateKey);
31
+ const publicKeyHex = exportPublicKeyHex(publicKey);
32
+ const raw = exportPublicKeyRaw(publicKey);
33
+ const derivedId = 'ed25519:' + raw.toString('base64url');
34
+ if (derivedId !== config.agent_id) {
35
+ console.error('✗ Key file does not match stored agent_id.');
36
+ console.error(' Stored: ' + config.agent_id);
37
+ console.error(' Derived: ' + derivedId);
38
+ process.exit(1);
39
+ }
40
+ console.log('→ Registering ' + config.agent_id + ' on server...');
41
+ try {
42
+ const res = await authedJson('POST', '/v1/agents/register', {
43
+ agent_id: config.agent_id,
44
+ public_key_hex: publicKeyHex,
45
+ display_name: null,
46
+ });
47
+ console.log('✓ Registered: ' + res.agent_id);
48
+ }
49
+ catch (err) {
50
+ const msg = err instanceof Error ? err.message : String(err);
51
+ console.error('✗ Registration failed: ' + msg);
52
+ process.exit(1);
53
+ }
54
+ }
55
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `agentsmarket rename <display_name>` — set human-readable name for current agent.
3
+ *
4
+ * Stored in agents.display_name. Shown in skill listings + author profile.
5
+ * Falls back to agent_id prefix if null. Max 80 chars.
6
+ */
7
+ export declare function renameCommand(newName: string): Promise<void>;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `agentsmarket rename <display_name>` — set human-readable name for current agent.
3
+ *
4
+ * Stored in agents.display_name. Shown in skill listings + author profile.
5
+ * Falls back to agent_id prefix if null. Max 80 chars.
6
+ */
7
+ import { authedJson, HttpError } from '../lib/http.js';
8
+ import { loadConfig } from '../lib/config.js';
9
+ export async function renameCommand(newName) {
10
+ const config = loadConfig();
11
+ if (!config)
12
+ throw new Error('Agent not initialized. Run `agentsmarket init` first.');
13
+ const agentId = config.agent_id;
14
+ try {
15
+ const res = await authedJson('PATCH', '/v1/agents/' + encodeURIComponent(agentId), { display_name: newName });
16
+ console.log(`✓ Renamed to: ${res.display_name}`);
17
+ console.log(` Agent ID: ${res.agent_id}`);
18
+ }
19
+ catch (err) {
20
+ if (err instanceof HttpError) {
21
+ if (err.status === 400) {
22
+ console.error(`✗ Invalid name. Must be 1-80 characters.`);
23
+ process.exit(1);
24
+ }
25
+ if (err.status === 403) {
26
+ console.error(`✗ Cannot rename other agents.`);
27
+ process.exit(1);
28
+ }
29
+ }
30
+ throw err;
31
+ }
32
+ }
33
+ //# sourceMappingURL=rename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQ9C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,OAAO,EACP,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAC3C,EAAE,YAAY,EAAE,OAAO,EAAE,CAC1B,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `agentsmarket scan <SKILL.md>` — security scan before publishing.
3
+ *
4
+ * Checks for common attack patterns in AI agent skills:
5
+ * - Prompt injection (override system instructions, ignore safety)
6
+ * - Data exfiltration (hidden URLs, webhook posts, env var access)
7
+ * - Hidden/obfuscated content (base64 blobs, eval/Function, encoded strings)
8
+ * - Dangerous commands (rm -rf, curl|bash, fs access)
9
+ * - Credential harvesting (API_KEY, SECRET, TOKEN patterns)
10
+ *
11
+ * Returns a 0-100 safety score. Exit code 0 if score >= 70 (publish).
12
+ * Exit code 1 if score < 70 (warnings — review before publishing).
13
+ *
14
+ * Differentiation vs competitors:
15
+ * - skills.sh / Agensi: third-party audits POST-publish (passive)
16
+ * - Gen Digital Agent Trust Hub / Snyk ToxicSkills / Socket: external scanners
17
+ * for ONE marketplace (Composio/Smithery only)
18
+ * - agentsmarket scan: marketplace-integrated PRE-publish gate, real-time,
19
+ * free, open source. Runs in CLI before skill hits the server.
20
+ */
21
+ interface Finding {
22
+ severity: 'low' | 'medium' | 'high' | 'critical';
23
+ category: string;
24
+ message: string;
25
+ line?: number;
26
+ }
27
+ interface ScanResult {
28
+ path: string;
29
+ score: number;
30
+ findings: Finding[];
31
+ recommendation: 'publish' | 'review' | 'block';
32
+ }
33
+ export declare function scanContent(content: string, path: string): ScanResult;
34
+ export declare function scanCommand(filePath: string): Promise<void>;
35
+ export {};