@moonpay/cli 0.4.2 → 0.5.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 CHANGED
@@ -11,18 +11,18 @@ import {
11
11
  messageSign,
12
12
  resolveBaseUrl,
13
13
  schemas_default,
14
+ tokenSwap,
14
15
  transactionSign,
16
+ virtualAccountWalletRegister,
15
17
  walletCreate,
16
18
  walletDelete,
17
19
  walletImport,
18
20
  walletList,
19
- walletLock,
20
- walletRetrieve,
21
- walletUnlock
22
- } from "./chunk-DAQDHLPY.js";
23
- import "./chunk-AGDVU2O5.js";
24
- import "./chunk-Z33PSOPD.js";
25
- import "./chunk-EEBB5MQP.js";
21
+ walletRetrieve
22
+ } from "./chunk-AH5VMN63.js";
23
+ import {
24
+ findWalletOrThrow
25
+ } from "./chunk-V7MA7WNX.js";
26
26
 
27
27
  // src/index.ts
28
28
  import { createRequire } from "module";
@@ -164,6 +164,48 @@ function startVersionCheck(currentVersion) {
164
164
  return () => notice;
165
165
  }
166
166
 
167
+ // src/tools/wallet/export/schema.ts
168
+ import { z } from "zod";
169
+ var walletExportSchema = defineToolSchema({
170
+ name: "wallet_export",
171
+ description: "Export wallet secret (mnemonic or private key). Interactive only \u2014 cannot be run by agents or piped.",
172
+ input: z.object({
173
+ wallet: z.string().describe("Wallet name")
174
+ }),
175
+ output: z.object({
176
+ exported: z.literal(true)
177
+ })
178
+ });
179
+
180
+ // src/tools/wallet/export/tool.ts
181
+ var walletExport = createTool(walletExportSchema, async (params) => {
182
+ if (!process.stdout.isTTY) {
183
+ throw new Error(
184
+ "Wallet export requires an interactive terminal.\nRun this command directly in your terminal: mp wallet export " + params.wallet
185
+ );
186
+ }
187
+ const wallet = findWalletOrThrow(params.wallet);
188
+ if (wallet.type === "hd") {
189
+ process.stderr.write(`
190
+ Mnemonic for "${wallet.name}":
191
+
192
+ `);
193
+ process.stderr.write(` ${wallet.mnemonic}
194
+
195
+ `);
196
+ process.stderr.write("Write this down and store it securely.\n\n");
197
+ } else {
198
+ process.stderr.write(`
199
+ Private key for "${wallet.name}" (${wallet.chain}):
200
+
201
+ `);
202
+ process.stderr.write(` ${wallet.privateKey}
203
+
204
+ `);
205
+ }
206
+ return { exported: true };
207
+ });
208
+
167
209
  // src/tools/skill/server.ts
168
210
  import { readdirSync, readFileSync as readFileSync2, existsSync, mkdirSync as mkdirSync2, cpSync } from "fs";
169
211
  import { join as join2, dirname } from "path";
@@ -190,15 +232,16 @@ function listBundledSkills() {
190
232
  }).sort((a, b) => a.name.localeCompare(b.name));
191
233
  }
192
234
  function readSkill(name) {
235
+ if (/[/\\]|\.\./.test(name)) throw new Error(`Invalid skill name: "${name}"`);
193
236
  const skillPath = join2(getSkillsDir(), name, "SKILL.md");
194
237
  if (!existsSync(skillPath)) {
195
238
  throw new Error(`Skill "${name}" not found. Run \`mp skill list\` to see available skills.`);
196
239
  }
197
240
  return readFileSync2(skillPath, "utf-8");
198
241
  }
199
- function installSkills(force) {
242
+ function installSkills(force, dir) {
200
243
  const srcDir = getSkillsDir();
201
- const destDir = getClaudeSkillsDir();
244
+ const destDir = dir ?? getClaudeSkillsDir();
202
245
  const skills = listBundledSkills();
203
246
  mkdirSync2(destDir, { recursive: true });
204
247
  return skills.map((s) => {
@@ -212,15 +255,15 @@ function installSkills(force) {
212
255
  }
213
256
 
214
257
  // src/tools/skill/list/schema.ts
215
- import { z } from "zod";
258
+ import { z as z2 } from "zod";
216
259
  var skillListSchema = defineToolSchema({
217
260
  name: "skill_list",
218
261
  description: "List available AI skills for Claude Code and other agents",
219
- input: z.object({}),
220
- output: z.array(
221
- z.object({
222
- name: z.string(),
223
- description: z.string()
262
+ input: z2.object({}),
263
+ output: z2.array(
264
+ z2.object({
265
+ name: z2.string(),
266
+ description: z2.string()
224
267
  })
225
268
  )
226
269
  });
@@ -231,16 +274,16 @@ var skillList = createTool(skillListSchema, async () => {
231
274
  });
232
275
 
233
276
  // src/tools/skill/retrieve/schema.ts
234
- import { z as z2 } from "zod";
277
+ import { z as z3 } from "zod";
235
278
  var skillRetrieveSchema = defineToolSchema({
236
279
  name: "skill_retrieve",
237
280
  description: "Get the full instructions for a specific skill",
238
- input: z2.object({
239
- name: z2.string().describe("Skill name (e.g. moonpay-swap-tokens)")
281
+ input: z3.object({
282
+ name: z3.string().describe("Skill name (e.g. moonpay-swap-tokens)")
240
283
  }),
241
- output: z2.object({
242
- name: z2.string(),
243
- content: z2.string()
284
+ output: z3.object({
285
+ name: z3.string(),
286
+ content: z3.string()
244
287
  })
245
288
  });
246
289
 
@@ -253,24 +296,27 @@ var skillRetrieve = createTool(skillRetrieveSchema, async (params) => {
253
296
  });
254
297
 
255
298
  // src/tools/skill/install/schema.ts
256
- import { z as z3 } from "zod";
299
+ import { z as z4 } from "zod";
257
300
  var skillInstallSchema = defineToolSchema({
258
301
  name: "skill_install",
259
- description: "Install AI skills to ~/.claude/skills/ for Claude Code",
260
- input: z3.object({
261
- force: z3.boolean().describe("Overwrite existing skills")
302
+ description: "Install AI skills for Claude Code. Defaults to ~/.claude/skills/, or specify --dir for a custom location (e.g. project-local, ~/.agents/skills).",
303
+ input: z4.object({
304
+ force: z4.boolean().describe("Overwrite existing skills"),
305
+ dir: z4.string().nullable().describe(
306
+ "Target directory to install skills into (default: ~/.claude/skills/)"
307
+ )
262
308
  }),
263
- output: z3.array(
264
- z3.object({
265
- name: z3.string(),
266
- installed: z3.boolean()
309
+ output: z4.array(
310
+ z4.object({
311
+ name: z4.string(),
312
+ installed: z4.boolean()
267
313
  })
268
314
  )
269
315
  });
270
316
 
271
317
  // src/tools/skill/install/tool.ts
272
318
  var skillInstall = createTool(skillInstallSchema, async (params) => {
273
- return installSkills(params.force);
319
+ return installSkills(params.force, params.dir ?? void 0);
274
320
  });
275
321
 
276
322
  // src/index.ts
@@ -280,20 +326,23 @@ var LOCAL_TOOLS = [
280
326
  walletList,
281
327
  walletRetrieve,
282
328
  walletDelete,
283
- walletLock,
284
- walletUnlock,
329
+ walletExport,
285
330
  transactionSign,
286
331
  messageSign,
287
332
  bitcoinBalanceRetrieve,
288
333
  skillList,
289
334
  skillRetrieve,
290
- skillInstall
335
+ skillInstall,
336
+ tokenSwap,
337
+ virtualAccountWalletRegister
291
338
  ];
292
339
  var require2 = createRequire(import.meta.url);
293
340
  var { version } = require2("../package.json");
294
341
  var getUpdateNotice = startVersionCheck(version);
295
342
  var program = new Command();
296
- program.name("moonpay").description("MoonPay CLI \u2014 non-custodial crypto tools\n\n Run `mp skill install` to install AI skills for Claude Code.").version(version).option("-f, --format <type>", "Output format: json, compact, or table", "json");
343
+ program.name("moonpay").description(
344
+ "MoonPay CLI \u2014 non-custodial crypto tools\n\n Run `mp skill install` to install AI skills for Claude Code.\n\n Terms of Service: https://agents.moonpay.com/terms-of-service\n Privacy Policy: https://agents.moonpay.com/privacy-policy\n Swaps by: https://swaps.xyz/terms"
345
+ ).version(version).option("-f, --format <type>", "Output format: json, compact, or table", "json");
297
346
  function getFormat() {
298
347
  const fmt = program.opts().format;
299
348
  if (fmt === "json" || fmt === "compact" || fmt === "table") return fmt;
@@ -306,7 +355,9 @@ function printUpdateNotice() {
306
355
  const notice = getUpdateNotice();
307
356
  if (notice) process.stderr.write(notice);
308
357
  }
309
- program.command("login").description("Log in to MoonPay via OAuth (required for authenticated tools)").option("--no-browser", "Print the auth URL instead of opening a browser (for headless/agent use)").option("--code <code>", "Complete login with an authorization code (from a previous --no-browser login)").action(async (opts) => {
358
+ program.command("login").description(
359
+ "Log in to MoonPay via OAuth.\n\n Interactive: mp login Opens browser, paste code when prompted\n Headless: mp login --no-browser Prints auth URL, then exit\n mp login --code <code> Complete login with the code from the callback page\n Agent/LLM: Run --no-browser, open the URL for the user, then run --code with their response"
360
+ ).option("--no-browser", "Print the auth URL and exit (for VPS, SSH, or agent use)").option("--code <code>", "Complete login with a code from the callback page").action(async (opts) => {
310
361
  const config = getConfigOrDefault();
311
362
  try {
312
363
  await login(config, { noBrowser: !opts.browser, code: opts.code });
@@ -321,7 +372,7 @@ program.command("logout").description("Log out and clear stored credentials").ac
321
372
  console.log("Logged out.");
322
373
  });
323
374
  program.command("mcp").description("Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)").action(async () => {
324
- const { startMcpServer } = await import("./mcp-QLBMU7OH.js");
375
+ const { startMcpServer } = await import("./mcp-VOEHXIOY.js");
325
376
  await startMcpServer();
326
377
  });
327
378
  function getOrCreateGroup(parent, segments) {
@@ -335,6 +386,42 @@ function getOrCreateGroup(parent, segments) {
335
386
  }
336
387
  return current;
337
388
  }
389
+ function flattenShape(shape, prefix = "") {
390
+ const fields = [];
391
+ for (const [key, field] of Object.entries(shape)) {
392
+ const flatKey = prefix ? `${prefix}-${key}` : key;
393
+ let inner = field;
394
+ while (inner._def.typeName === "ZodEffects") inner = inner._def.schema;
395
+ let unwrapped = inner;
396
+ if (unwrapped._def.typeName === "ZodNullable") unwrapped = unwrapped._def.innerType;
397
+ if (unwrapped._def.typeName === "ZodObject" && unwrapped.shape) {
398
+ fields.push(...flattenShape(unwrapped.shape, flatKey));
399
+ } else {
400
+ fields.push({ flatKey, field, path: flatKey.split("-") });
401
+ }
402
+ }
403
+ return fields;
404
+ }
405
+ function unflattenParams(flat, fields) {
406
+ const result = {};
407
+ for (const { flatKey, path } of fields) {
408
+ const camelKey = flatKey.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
409
+ const value = camelKey in flat ? flat[camelKey] : flat[flatKey];
410
+ if (path.length === 1) {
411
+ result[path[0]] = value;
412
+ } else {
413
+ let obj = result;
414
+ for (let i = 0; i < path.length - 1; i++) {
415
+ if (!obj[path[i]] || typeof obj[path[i]] !== "object") {
416
+ obj[path[i]] = {};
417
+ }
418
+ obj = obj[path[i]];
419
+ }
420
+ obj[path[path.length - 1]] = value;
421
+ }
422
+ }
423
+ return result;
424
+ }
338
425
  function registerLocalTools(parent, tools) {
339
426
  for (const tool of tools) {
340
427
  const segments = tool.schema.name.split("_");
@@ -342,38 +429,40 @@ function registerLocalTools(parent, tools) {
342
429
  const group = getOrCreateGroup(parent, segments);
343
430
  const cmd = group.command(leafName).description(tool.schema.description);
344
431
  const shape = tool.schema.input.shape ?? {};
432
+ const flatFields = flattenShape(shape);
345
433
  const nullableKeys = [];
346
434
  const numberKeys = [];
347
- for (const [key, field] of Object.entries(shape)) {
348
- const desc = field.description ?? key;
435
+ for (const { flatKey, field } of flatFields) {
436
+ const desc = field.description ?? flatKey;
349
437
  let inner = field;
350
- while (inner._def.typeName === "ZodEffects") {
351
- inner = inner._def.schema;
352
- }
438
+ while (inner._def.typeName === "ZodEffects") inner = inner._def.schema;
353
439
  const typeName = inner._def.typeName;
354
440
  let checkNum = inner;
355
441
  if (checkNum._def.typeName === "ZodNullable") checkNum = checkNum._def.innerType;
356
- if (checkNum._def.typeName === "ZodNumber") numberKeys.push(key);
442
+ if (checkNum._def.typeName === "ZodNumber") numberKeys.push(flatKey);
357
443
  if (typeName === "ZodBoolean") {
358
- cmd.option(`--${key}`, desc, false);
444
+ cmd.option(`--${flatKey}`, desc, false);
359
445
  } else if (typeName === "ZodNullable") {
360
- cmd.option(`--${key} <${key}>`, desc);
361
- nullableKeys.push(key);
446
+ cmd.option(`--${flatKey} <${flatKey}>`, desc);
447
+ nullableKeys.push(flatKey);
362
448
  } else {
363
- cmd.requiredOption(`--${key} <${key}>`, desc);
449
+ cmd.requiredOption(`--${flatKey} <${flatKey}>`, desc);
364
450
  }
365
451
  }
366
452
  cmd.action(async (options) => {
367
453
  for (const key of nullableKeys) {
368
- if (options[key] === void 0) options[key] = null;
454
+ const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
455
+ if (options[camelKey] === void 0) options[camelKey] = null;
369
456
  }
370
457
  for (const key of numberKeys) {
371
- if (options[key] != null && typeof options[key] === "string") {
372
- options[key] = Number(options[key]);
458
+ const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
459
+ if (options[camelKey] != null && typeof options[camelKey] === "string") {
460
+ options[camelKey] = Number(options[camelKey]);
373
461
  }
374
462
  }
463
+ const params = unflattenParams(options, flatFields);
375
464
  try {
376
- const result = await tool.handler(options);
465
+ const result = await tool.handler(params);
377
466
  printResult(result);
378
467
  } catch (error) {
379
468
  console.error(error.message);
@@ -403,8 +492,13 @@ function isNumberProperty(prop) {
403
492
  if (prop.anyOf) return prop.anyOf.some((t) => t.type === "number" || t.type === "integer");
404
493
  return prop.type === "number" || prop.type === "integer";
405
494
  }
495
+ var HIDDEN_TOOLS = /* @__PURE__ */ new Set([
496
+ "swaps_transaction_build",
497
+ "transaction_register"
498
+ ]);
406
499
  function registerRemoteTools(parent, remoteSchemas) {
407
500
  for (const schema of remoteSchemas) {
501
+ if (HIDDEN_TOOLS.has(schema.name)) continue;
408
502
  const segments = schema.name.split("_");
409
503
  const leafName = segments.pop();
410
504
  const group = getOrCreateGroup(parent, segments);
@@ -476,7 +570,7 @@ program.command("tools").description("List available tools").action(() => {
476
570
  name: t.schema.name,
477
571
  description: t.schema.description
478
572
  })),
479
- ...schemas_default.filter((s) => !LOCAL_TOOLS.some((l) => l.schema.name === s.name)).map((s) => ({ name: s.name, description: s.description }))
573
+ ...schemas_default.filter((s) => !LOCAL_TOOLS.some((l) => l.schema.name === s.name) && !HIDDEN_TOOLS.has(s.name)).map((s) => ({ name: s.name, description: s.description }))
480
574
  ].sort((a, b) => a.name.localeCompare(b.name));
481
575
  const lines = [];
482
576
  for (const tool of allTools) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/format.ts","../src/version-check.ts","../src/tools/skill/server.ts","../src/tools/skill/list/schema.ts","../src/tools/skill/list/tool.ts","../src/tools/skill/retrieve/schema.ts","../src/tools/skill/retrieve/tool.ts","../src/tools/skill/install/schema.ts","../src/tools/skill/install/tool.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"module\";\nimport { Command } from \"commander\";\nimport {\n clearCredentials,\n getConfigOrDefault,\n login,\n resolveBaseUrl,\n} from \"./auth\";\nimport { callTool } from \"./client\";\nimport { color, formatOutput, type OutputFormat } from \"./format\";\nimport { startVersionCheck } from \"./version-check\";\nimport type { Tool } from \"./tools/shared\";\nimport schemas from \"./generated/schemas.json\";\nimport { walletCreate } from \"./tools/wallet/create/tool\";\nimport { walletImport } from \"./tools/wallet/import/tool\";\nimport { walletList } from \"./tools/wallet/list/tool\";\nimport { walletRetrieve } from \"./tools/wallet/retrieve/tool\";\nimport { walletDelete } from \"./tools/wallet/delete/tool\";\nimport { transactionSign } from \"./tools/transaction/sign/tool\";\nimport { messageSign } from \"./tools/message/sign/tool\";\nimport { walletLock } from \"./tools/wallet/lock/tool\";\nimport { walletUnlock } from \"./tools/wallet/unlock/tool\";\nimport { bitcoinBalanceRetrieve } from \"./tools/bitcoin/balance/tool\";\nimport { skillList } from \"./tools/skill/list/tool\";\nimport { skillRetrieve } from \"./tools/skill/retrieve/tool\";\nimport { skillInstall } from \"./tools/skill/install/tool\";\n\n/** All local tools — CLI commands are derived from their schemas */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst LOCAL_TOOLS: Tool<any>[] = [\n walletCreate,\n walletImport,\n walletList,\n walletRetrieve,\n walletDelete,\n walletLock,\n walletUnlock,\n transactionSign,\n messageSign,\n bitcoinBalanceRetrieve,\n skillList,\n skillRetrieve,\n skillInstall,\n];\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\") as { version: string };\n\nconst getUpdateNotice = startVersionCheck(version);\n\nconst program = new Command();\n\nprogram\n .name(\"moonpay\")\n .description(\"MoonPay CLI — non-custodial crypto tools\\n\\n Run `mp skill install` to install AI skills for Claude Code.\")\n .version(version)\n .option(\"-f, --format <type>\", \"Output format: json, compact, or table\", \"json\");\n\nfunction getFormat(): OutputFormat {\n const fmt = program.opts().format as string;\n if (fmt === \"json\" || fmt === \"compact\" || fmt === \"table\") return fmt;\n return \"json\";\n}\n\nfunction printResult(result: unknown): void {\n console.log(formatOutput(result, getFormat()));\n}\n\nfunction printUpdateNotice(): void {\n const notice = getUpdateNotice();\n if (notice) process.stderr.write(notice);\n}\n\n// ── Auth commands ──────────────────────────────────────────────\n\nprogram\n .command(\"login\")\n .description(\"Log in to MoonPay via OAuth (required for authenticated tools)\")\n .option(\"--no-browser\", \"Print the auth URL instead of opening a browser (for headless/agent use)\")\n .option(\"--code <code>\", \"Complete login with an authorization code (from a previous --no-browser login)\")\n .action(async (opts: { browser: boolean; code?: string }) => {\n const config = getConfigOrDefault();\n try {\n await login(config, { noBrowser: !opts.browser, code: opts.code });\n console.log(\"Logged in successfully.\");\n } catch (error) {\n console.error(\"Login failed:\", (error as Error).message);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Log out and clear stored credentials\")\n .action(() => {\n clearCredentials();\n console.log(\"Logged out.\");\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)\")\n .action(async () => {\n const { startMcpServer } = await import(\"./mcp\");\n await startMcpServer();\n });\n\n// ── Nested command helpers ─────────────────────────────────────\n\n/**\n * Get or create nested command groups from name segments.\n * e.g. [\"token\", \"swap\"] → program > token > swap\n */\nfunction getOrCreateGroup(parent: Command, segments: string[]): Command {\n let current = parent;\n for (const segment of segments) {\n let existing = current.commands.find((c) => c.name() === segment);\n if (!existing) {\n existing = current.command(segment);\n }\n current = existing;\n }\n return current;\n}\n\n// ── Local tool registration ────────────────────────────────────\n\nfunction registerLocalTools(parent: Command, tools: Tool<any>[]): void {\n for (const tool of tools) {\n const segments = tool.schema.name.split(\"_\");\n const leafName = segments.pop()!;\n const group = getOrCreateGroup(parent, segments);\n\n const cmd = group.command(leafName).description(tool.schema.description);\n\n // Derive CLI options from the Zod input schema shape\n const shape = (tool.schema.input as any).shape ?? {};\n const nullableKeys: string[] = [];\n\n const numberKeys: string[] = [];\n\n for (const [key, field] of Object.entries<any>(shape)) {\n const desc = field.description ?? key;\n // Unwrap ZodEffects (preprocess) to find the inner type\n let inner = field;\n while (inner._def.typeName === \"ZodEffects\") {\n inner = inner._def.schema;\n }\n const typeName = inner._def.typeName;\n\n // Check if the inner type (or its nullable inner) is a number\n let checkNum = inner;\n if (checkNum._def.typeName === \"ZodNullable\") checkNum = checkNum._def.innerType;\n if (checkNum._def.typeName === \"ZodNumber\") numberKeys.push(key);\n\n if (typeName === \"ZodBoolean\") {\n cmd.option(`--${key}`, desc, false);\n } else if (typeName === \"ZodNullable\") {\n cmd.option(`--${key} <${key}>`, desc);\n nullableKeys.push(key);\n } else {\n cmd.requiredOption(`--${key} <${key}>`, desc);\n }\n }\n\n cmd.action(async (options: Record<string, unknown>) => {\n for (const key of nullableKeys) {\n if (options[key] === undefined) options[key] = null;\n }\n for (const key of numberKeys) {\n if (options[key] != null && typeof options[key] === \"string\") {\n options[key] = Number(options[key]);\n }\n }\n try {\n const result = await tool.handler(options);\n printResult(result);\n } catch (error) {\n console.error((error as Error).message);\n process.exit(1);\n }\n });\n }\n}\n\n// ── Remote tool registration ───────────────────────────────────\n\ninterface JsonSchemaProperty {\n type?: string | string[];\n description?: string;\n enum?: string[];\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n anyOf?: { type: string }[];\n}\n\ninterface JsonSchema {\n $ref?: string;\n definitions?: Record<string, JsonSchemaProperty>;\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n}\n\nfunction resolveJsonSchema(inputSchema: JsonSchema): JsonSchemaProperty {\n if (inputSchema.$ref && inputSchema.definitions) {\n const defName = inputSchema.$ref.replace(\"#/definitions/\", \"\");\n return inputSchema.definitions[defName];\n }\n return inputSchema;\n}\n\nfunction isNullableProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(\"null\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"null\");\n return false;\n}\n\nfunction isObjectProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(\"object\");\n return prop.type === \"object\";\n}\n\nfunction isNumberProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.some((t) => t === \"number\" || t === \"integer\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"number\" || t.type === \"integer\");\n return prop.type === \"number\" || prop.type === \"integer\";\n}\n\nfunction registerRemoteTools(\n parent: Command,\n remoteSchemas: { name: string; description: string; inputSchema: JsonSchema }[],\n): void {\n for (const schema of remoteSchemas) {\n const segments = schema.name.split(\"_\");\n const leafName = segments.pop()!;\n const group = getOrCreateGroup(parent, segments);\n\n // Skip if a local tool already registered this command\n if (group.commands.find((c) => c.name() === leafName)) continue;\n\n const cmd = group.command(leafName).description(schema.description);\n\n const resolved = resolveJsonSchema(schema.inputSchema);\n const props = resolved.properties ?? {};\n const requiredSet = new Set(resolved.required ?? []);\n const nullableKeys: string[] = [];\n const numberKeys: string[] = [];\n const objectKeys: string[] = [];\n\n for (const [key, prop] of Object.entries(props)) {\n const desc = prop.description ?? key;\n const nullable = isNullableProperty(prop);\n const isObj = isObjectProperty(prop);\n const isNum = isNumberProperty(prop);\n\n if (isNum) numberKeys.push(key);\n\n if (isObj) {\n objectKeys.push(key);\n if (requiredSet.has(key) && !nullable) {\n cmd.requiredOption(`--${key} <json>`, `${desc} (as JSON)`);\n } else {\n cmd.option(`--${key} <json>`, `${desc} (as JSON)`);\n nullableKeys.push(key);\n }\n } else if (nullable || !requiredSet.has(key)) {\n cmd.option(`--${key} <${key}>`, desc);\n nullableKeys.push(key);\n } else {\n cmd.requiredOption(`--${key} <${key}>`, desc);\n }\n }\n\n cmd.action(async (options: Record<string, unknown>) => {\n // Coerce types\n for (const key of nullableKeys) {\n if (options[key] === undefined) options[key] = null;\n }\n for (const key of numberKeys) {\n if (options[key] != null && typeof options[key] === \"string\") {\n options[key] = Number(options[key]);\n }\n }\n for (const key of objectKeys) {\n if (typeof options[key] === \"string\") {\n try {\n options[key] = JSON.parse(options[key] as string);\n } catch {\n console.error(`Invalid JSON for --${key}`);\n process.exit(1);\n }\n }\n }\n\n try {\n const baseUrl = resolveBaseUrl();\n const result = await callTool(baseUrl, schema.name, options as Record<string, unknown>);\n printResult(result);\n printUpdateNotice();\n } catch (error) {\n console.error((error as Error).message);\n process.exit(1);\n }\n });\n }\n}\n\n// ── Register all tools ─────────────────────────────────────────\n\nregisterLocalTools(program, LOCAL_TOOLS);\nregisterRemoteTools(program, schemas as any);\n\n// ── Tools listing ──────────────────────────────────────────────\n\nprogram\n .command(\"tools\")\n .description(\"List available tools\")\n .action(() => {\n const allTools = [\n ...LOCAL_TOOLS.map((t) => ({\n name: t.schema.name,\n description: t.schema.description,\n })),\n ...schemas\n .filter((s) => !LOCAL_TOOLS.some((l) => l.schema.name === s.name))\n .map((s) => ({ name: s.name, description: s.description })),\n ].sort((a, b) => a.name.localeCompare(b.name));\n\n const lines: string[] = [];\n for (const tool of allTools) {\n const cmdName = tool.name.replace(/_/g, \" \");\n lines.push(` ${color.green(cmdName.padEnd(28))} ${color.dim(tool.description)}`);\n }\n lines.push(\"\");\n lines.push(color.dim(`${allTools.length} tools`));\n console.log(lines.join(\"\\n\"));\n printUpdateNotice();\n });\n\nprogram.parse();\n","const useColor =\n !process.env.NO_COLOR && process.stdout.isTTY === true;\n\nfunction ansi(code: string) {\n return (text: string) => (useColor ? `${code}${text}\\x1b[0m` : text);\n}\n\nexport const color = {\n bold: ansi(\"\\x1b[1m\"),\n dim: ansi(\"\\x1b[2m\"),\n green: ansi(\"\\x1b[32m\"),\n yellow: ansi(\"\\x1b[33m\"),\n cyan: ansi(\"\\x1b[36m\"),\n red: ansi(\"\\x1b[31m\"),\n};\n\nconst MAX_COL_WIDTH = 40;\n\nfunction truncate(str: string, max: number): string {\n return str.length > max ? str.slice(0, max - 1) + \"…\" : str;\n}\n\nfunction renderArrayTable(rows: Record<string, unknown>[]): string {\n if (rows.length === 0) return \"\";\n\n const keys = Object.keys(rows[0]);\n const widths = keys.map((k) => k.length);\n\n const stringRows = rows.map((row) =>\n keys.map((k, i) => {\n const val = truncate(String(row[k] ?? \"\"), MAX_COL_WIDTH);\n widths[i] = Math.max(widths[i], val.length);\n return val;\n }),\n );\n\n // Cap widths\n for (let i = 0; i < widths.length; i++) {\n widths[i] = Math.min(widths[i], MAX_COL_WIDTH);\n }\n\n const header = keys.map((k, i) => color.bold(k.padEnd(widths[i]))).join(\" \");\n const separator = color.dim(widths.map((w) => \"─\".repeat(w)).join(\"──\"));\n const body = stringRows\n .map((row) => row.map((val, i) => val.padEnd(widths[i])).join(\" \"))\n .join(\"\\n\");\n\n return `${header}\\n${separator}\\n${body}`;\n}\n\nfunction renderObjectTable(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n const maxKey = Math.min(\n MAX_COL_WIDTH,\n Math.max(...entries.map(([k]) => k.length)),\n );\n\n return entries\n .map(([k, v]) => `${color.bold(k.padEnd(maxKey))} ${String(v ?? \"\")}`)\n .join(\"\\n\");\n}\n\nexport function renderTable(data: unknown): string {\n if (Array.isArray(data)) {\n if (data.length === 0) return color.dim(\"(empty)\");\n if (typeof data[0] === \"object\" && data[0] !== null) {\n return renderArrayTable(data as Record<string, unknown>[]);\n }\n return data.map(String).join(\"\\n\");\n }\n\n if (typeof data === \"object\" && data !== null) {\n return renderObjectTable(data as Record<string, unknown>);\n }\n\n return String(data);\n}\n\nexport type OutputFormat = \"json\" | \"compact\" | \"table\";\n\nexport function formatOutput(result: unknown, format: OutputFormat): string {\n if (format === \"compact\") {\n return JSON.stringify(result);\n }\n\n if (format === \"table\") {\n const value =\n typeof result === \"object\" &&\n result !== null &&\n \"data\" in result\n ? (result as Record<string, unknown>).data\n : result;\n return renderTable(value);\n }\n\n return JSON.stringify(result, null, 2);\n}\n","import { readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { color } from \"./format\";\n\nconst CACHE_DIR = join(homedir(), \".config\", \"moonpay\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 3000;\n\ntype CacheData = {\n latest: string;\n checkedAt: number;\n};\n\nfunction readCache(): CacheData | null {\n try {\n const raw = readFileSync(CACHE_FILE, \"utf-8\");\n return JSON.parse(raw) as CacheData;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(data: CacheData): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(data));\n } catch {\n // Ignore write errors\n }\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n const a = latest.split(\".\").map(Number);\n const b = current.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((a[i] ?? 0) > (b[i] ?? 0)) return true;\n if ((a[i] ?? 0) < (b[i] ?? 0)) return false;\n }\n return false;\n}\n\nfunction formatNotice(current: string, latest: string): string {\n return [\n \"\",\n color.yellow(`Update available: ${current} → ${latest}`),\n color.dim(\"Run `npm i -g @moonpay/cli` to update.\"),\n \"\",\n ].join(\"\\n\");\n}\n\nexport function startVersionCheck(\n currentVersion: string,\n): () => string | null {\n let notice: string | null = null;\n\n const cache = readCache();\n\n if (cache && Date.now() - cache.checkedAt < ONE_DAY_MS) {\n if (isNewer(cache.latest, currentVersion)) {\n notice = formatNotice(currentVersion, cache.latest);\n }\n return () => notice;\n }\n\n // Fire async fetch — non-blocking\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n fetch(\"https://registry.npmjs.org/@moonpay%2fcli/latest\", {\n signal: controller.signal,\n })\n .then((res) => res.json())\n .then((data: unknown) => {\n const latest = (data as { version?: string }).version;\n if (latest) {\n writeCache({ latest, checkedAt: Date.now() });\n if (isNewer(latest, currentVersion)) {\n notice = formatNotice(currentVersion, latest);\n }\n }\n })\n .catch(() => {\n // Silently ignore fetch errors\n })\n .finally(() => clearTimeout(timeout));\n\n return () => notice;\n}\n","import { readdirSync, readFileSync, existsSync, mkdirSync, cpSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\nimport { createRequire } from \"node:module\";\n\n/** Package root → skills/ directory bundled with the CLI */\nfunction getSkillsDir(): string {\n // import.meta.url resolves to dist/index.js when bundled\n const __filename = fileURLToPath(import.meta.url);\n const distDir = dirname(__filename);\n // dist/ → package root → skills/\n return join(distDir, \"..\", \"skills\");\n}\n\n/** Where Claude Code discovers skills */\nfunction getClaudeSkillsDir(): string {\n return join(homedir(), \".claude\", \"skills\");\n}\n\nexport type SkillInfo = {\n name: string;\n description: string;\n};\n\nexport function listBundledSkills(): SkillInfo[] {\n const dir = getSkillsDir();\n if (!existsSync(dir)) return [];\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name.startsWith(\"moonpay-\"))\n .map((e) => {\n const md = readFileSync(join(dir, e.name, \"SKILL.md\"), \"utf-8\");\n const descMatch = md.match(/^description:\\s*(.+)$/m);\n return {\n name: e.name,\n description: descMatch?.[1]?.replace(/^[\"']|[\"']$/g, \"\") ?? \"\",\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function readSkill(name: string): string {\n const skillPath = join(getSkillsDir(), name, \"SKILL.md\");\n if (!existsSync(skillPath)) {\n throw new Error(`Skill \"${name}\" not found. Run \\`mp skill list\\` to see available skills.`);\n }\n return readFileSync(skillPath, \"utf-8\");\n}\n\nexport function installSkills(force: boolean): { name: string; installed: boolean }[] {\n const srcDir = getSkillsDir();\n const destDir = getClaudeSkillsDir();\n const skills = listBundledSkills();\n\n mkdirSync(destDir, { recursive: true });\n\n return skills.map((s) => {\n const dest = join(destDir, s.name);\n if (existsSync(dest) && !force) {\n return { name: s.name, installed: false };\n }\n cpSync(join(srcDir, s.name), dest, { recursive: true, force: true });\n return { name: s.name, installed: true };\n });\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillListSchema = defineToolSchema({\n name: \"skill_list\",\n description: \"List available AI skills for Claude Code and other agents\",\n input: z.object({}),\n output: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n }),\n ),\n});\n","import { createTool } from \"../../shared\";\nimport { listBundledSkills } from \"../server\";\nimport { skillListSchema } from \"./schema\";\n\nexport const skillList = createTool(skillListSchema, async () => {\n return listBundledSkills();\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillRetrieveSchema = defineToolSchema({\n name: \"skill_retrieve\",\n description: \"Get the full instructions for a specific skill\",\n input: z.object({\n name: z.string().describe(\"Skill name (e.g. moonpay-swap-tokens)\"),\n }),\n output: z.object({\n name: z.string(),\n content: z.string(),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { readSkill } from \"../server\";\nimport { skillRetrieveSchema } from \"./schema\";\n\nexport const skillRetrieve = createTool(skillRetrieveSchema, async (params) => {\n return {\n name: params.name,\n content: readSkill(params.name),\n };\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillInstallSchema = defineToolSchema({\n name: \"skill_install\",\n description: \"Install AI skills to ~/.claude/skills/ for Claude Code\",\n input: z.object({\n force: z.boolean().describe(\"Overwrite existing skills\"),\n }),\n output: z.array(\n z.object({\n name: z.string(),\n installed: z.boolean(),\n }),\n ),\n});\n","import { createTool } from \"../../shared\";\nimport { installSkills } from \"../server\";\nimport { skillInstallSchema } from \"./schema\";\n\nexport const skillInstall = createTool(skillInstallSchema, async (params) => {\n return installSkills(params.force);\n});\n"],"mappings":"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","names":["readFileSync","mkdirSync","join","homedir","z","z","z","z","require"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/format.ts","../src/version-check.ts","../src/tools/wallet/export/schema.ts","../src/tools/wallet/export/tool.ts","../src/tools/skill/server.ts","../src/tools/skill/list/schema.ts","../src/tools/skill/list/tool.ts","../src/tools/skill/retrieve/schema.ts","../src/tools/skill/retrieve/tool.ts","../src/tools/skill/install/schema.ts","../src/tools/skill/install/tool.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"module\";\nimport { Command } from \"commander\";\nimport {\n clearCredentials,\n getConfigOrDefault,\n login,\n resolveBaseUrl,\n} from \"./auth\";\nimport { callTool } from \"./client\";\nimport { color, formatOutput, type OutputFormat } from \"./format\";\nimport { startVersionCheck } from \"./version-check\";\nimport type { Tool } from \"./tools/shared\";\nimport schemas from \"./generated/schemas.json\";\nimport { walletCreate } from \"./tools/wallet/create/tool\";\nimport { walletImport } from \"./tools/wallet/import/tool\";\nimport { walletList } from \"./tools/wallet/list/tool\";\nimport { walletRetrieve } from \"./tools/wallet/retrieve/tool\";\nimport { walletDelete } from \"./tools/wallet/delete/tool\";\nimport { walletExport } from \"./tools/wallet/export/tool\";\nimport { transactionSign } from \"./tools/transaction/sign/tool\";\nimport { messageSign } from \"./tools/message/sign/tool\";\nimport { bitcoinBalanceRetrieve } from \"./tools/bitcoin/balance/tool\";\nimport { skillList } from \"./tools/skill/list/tool\";\nimport { skillRetrieve } from \"./tools/skill/retrieve/tool\";\nimport { skillInstall } from \"./tools/skill/install/tool\";\nimport { tokenSwap } from \"./tools/token/swap/tool\";\nimport { virtualAccountWalletRegister } from \"./tools/virtual-account/wallet/register/tool\";\n/** All local tools — CLI commands are derived from their schemas */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst LOCAL_TOOLS: Tool<any>[] = [\n walletCreate,\n walletImport,\n walletList,\n walletRetrieve,\n walletDelete,\n walletExport,\n transactionSign,\n messageSign,\n bitcoinBalanceRetrieve,\n skillList,\n skillRetrieve,\n skillInstall,\n tokenSwap,\n virtualAccountWalletRegister,\n];\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\") as { version: string };\n\nconst getUpdateNotice = startVersionCheck(version);\n\nconst program = new Command();\n\nprogram\n .name(\"moonpay\")\n .description(\n \"MoonPay CLI — non-custodial crypto tools\\n\\n\" +\n \" Run `mp skill install` to install AI skills for Claude Code.\\n\\n\" +\n \" Terms of Service: https://agents.moonpay.com/terms-of-service\\n\" +\n \" Privacy Policy: https://agents.moonpay.com/privacy-policy\\n\" +\n \" Swaps by: https://swaps.xyz/terms\",\n )\n .version(version)\n .option(\"-f, --format <type>\", \"Output format: json, compact, or table\", \"json\");\n\nfunction getFormat(): OutputFormat {\n const fmt = program.opts().format as string;\n if (fmt === \"json\" || fmt === \"compact\" || fmt === \"table\") return fmt;\n return \"json\";\n}\n\nfunction printResult(result: unknown): void {\n console.log(formatOutput(result, getFormat()));\n}\n\nfunction printUpdateNotice(): void {\n const notice = getUpdateNotice();\n if (notice) process.stderr.write(notice);\n}\n\n// ── Auth commands ──────────────────────────────────────────────\n\nprogram\n .command(\"login\")\n .description(\n \"Log in to MoonPay via OAuth.\\n\\n\" +\n \" Interactive: mp login Opens browser, paste code when prompted\\n\" +\n \" Headless: mp login --no-browser Prints auth URL, then exit\\n\" +\n \" mp login --code <code> Complete login with the code from the callback page\\n\" +\n \" Agent/LLM: Run --no-browser, open the URL for the user, then run --code with their response\"\n )\n .option(\"--no-browser\", \"Print the auth URL and exit (for VPS, SSH, or agent use)\")\n .option(\"--code <code>\", \"Complete login with a code from the callback page\")\n .action(async (opts: { browser: boolean; code?: string }) => {\n const config = getConfigOrDefault();\n try {\n await login(config, { noBrowser: !opts.browser, code: opts.code });\n console.log(\"Logged in successfully.\");\n } catch (error) {\n console.error(\"Login failed:\", (error as Error).message);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Log out and clear stored credentials\")\n .action(() => {\n clearCredentials();\n console.log(\"Logged out.\");\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)\")\n .action(async () => {\n const { startMcpServer } = await import(\"./mcp\");\n await startMcpServer();\n });\n\n// ── Nested command helpers ─────────────────────────────────────\n\n/**\n * Get or create nested command groups from name segments.\n * e.g. [\"token\", \"swap\"] → program > token > swap\n */\nfunction getOrCreateGroup(parent: Command, segments: string[]): Command {\n let current = parent;\n for (const segment of segments) {\n let existing = current.commands.find((c) => c.name() === segment);\n if (!existing) {\n existing = current.command(segment);\n }\n current = existing;\n }\n return current;\n}\n\n// ── Schema flattening ────────────────────────────────────────────\n\ntype FlatField = {\n flatKey: string;\n field: any;\n path: string[];\n};\n\n/**\n * Walk a Zod object shape and flatten nested ZodObjects into\n * hyphenated keys: { from: { wallet, chain } } → from-wallet, from-chain\n */\nfunction flattenShape(shape: Record<string, any>, prefix = \"\"): FlatField[] {\n const fields: FlatField[] = [];\n for (const [key, field] of Object.entries(shape)) {\n const flatKey = prefix ? `${prefix}-${key}` : key;\n let inner = field;\n while (inner._def.typeName === \"ZodEffects\") inner = inner._def.schema;\n\n // Unwrap nullable to check if inner is an object\n let unwrapped = inner;\n if (unwrapped._def.typeName === \"ZodNullable\") unwrapped = unwrapped._def.innerType;\n\n if (unwrapped._def.typeName === \"ZodObject\" && unwrapped.shape) {\n fields.push(...flattenShape(unwrapped.shape, flatKey));\n } else {\n fields.push({ flatKey, field, path: flatKey.split(\"-\") });\n }\n }\n return fields;\n}\n\n/**\n * Reconstruct nested object from flat hyphenated params.\n * { \"from-wallet\": \"test\", \"from-chain\": \"solana\" } → { from: { wallet: \"test\", chain: \"solana\" } }\n */\nfunction unflattenParams(\n flat: Record<string, unknown>,\n fields: FlatField[],\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const { flatKey, path } of fields) {\n // Commander camelCases --from-wallet → fromWallet, so check both\n const camelKey = flatKey.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n const value = camelKey in flat ? flat[camelKey] : flat[flatKey];\n\n if (path.length === 1) {\n result[path[0]] = value;\n } else {\n let obj = result;\n for (let i = 0; i < path.length - 1; i++) {\n if (!obj[path[i]] || typeof obj[path[i]] !== \"object\") {\n obj[path[i]] = {};\n }\n obj = obj[path[i]] as Record<string, unknown>;\n }\n obj[path[path.length - 1]] = value;\n }\n }\n\n return result;\n}\n\n// ── Local tool registration ────────────────────────────────────\n\nfunction registerLocalTools(parent: Command, tools: Tool<any>[]): void {\n for (const tool of tools) {\n const segments = tool.schema.name.split(\"_\");\n const leafName = segments.pop()!;\n const group = getOrCreateGroup(parent, segments);\n\n const cmd = group.command(leafName).description(tool.schema.description);\n\n const shape = (tool.schema.input as any).shape ?? {};\n const flatFields = flattenShape(shape);\n const nullableKeys: string[] = [];\n const numberKeys: string[] = [];\n\n for (const { flatKey, field } of flatFields) {\n const desc = field.description ?? flatKey;\n let inner = field;\n while (inner._def.typeName === \"ZodEffects\") inner = inner._def.schema;\n const typeName = inner._def.typeName;\n\n let checkNum = inner;\n if (checkNum._def.typeName === \"ZodNullable\") checkNum = checkNum._def.innerType;\n if (checkNum._def.typeName === \"ZodNumber\") numberKeys.push(flatKey);\n\n if (typeName === \"ZodBoolean\") {\n cmd.option(`--${flatKey}`, desc, false);\n } else if (typeName === \"ZodNullable\") {\n cmd.option(`--${flatKey} <${flatKey}>`, desc);\n nullableKeys.push(flatKey);\n } else {\n cmd.requiredOption(`--${flatKey} <${flatKey}>`, desc);\n }\n }\n\n cmd.action(async (options: Record<string, unknown>) => {\n // Coerce types on the flat keys (commander camelCases them)\n for (const key of nullableKeys) {\n const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n if (options[camelKey] === undefined) options[camelKey] = null;\n }\n for (const key of numberKeys) {\n const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n if (options[camelKey] != null && typeof options[camelKey] === \"string\") {\n options[camelKey] = Number(options[camelKey]);\n }\n }\n\n const params = unflattenParams(options, flatFields);\n\n try {\n const result = await tool.handler(params);\n printResult(result);\n } catch (error) {\n console.error((error as Error).message);\n process.exit(1);\n }\n });\n }\n}\n\n// ── Remote tool registration ───────────────────────────────────\n\ninterface JsonSchemaProperty {\n type?: string | string[];\n description?: string;\n enum?: string[];\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n anyOf?: { type: string }[];\n}\n\ninterface JsonSchema {\n $ref?: string;\n definitions?: Record<string, JsonSchemaProperty>;\n properties?: Record<string, JsonSchemaProperty>;\n required?: string[];\n}\n\nfunction resolveJsonSchema(inputSchema: JsonSchema): JsonSchemaProperty {\n if (inputSchema.$ref && inputSchema.definitions) {\n const defName = inputSchema.$ref.replace(\"#/definitions/\", \"\");\n return inputSchema.definitions[defName];\n }\n return inputSchema;\n}\n\nfunction isNullableProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(\"null\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"null\");\n return false;\n}\n\nfunction isObjectProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(\"object\");\n return prop.type === \"object\";\n}\n\nfunction isNumberProperty(prop: JsonSchemaProperty): boolean {\n if (Array.isArray(prop.type)) return prop.type.some((t) => t === \"number\" || t === \"integer\");\n if (prop.anyOf) return prop.anyOf.some((t) => t.type === \"number\" || t.type === \"integer\");\n return prop.type === \"number\" || prop.type === \"integer\";\n}\n\nconst HIDDEN_TOOLS = new Set([\n \"swaps_transaction_build\",\n \"transaction_register\",\n]);\n\nfunction registerRemoteTools(\n parent: Command,\n remoteSchemas: { name: string; description: string; inputSchema: JsonSchema }[],\n): void {\n for (const schema of remoteSchemas) {\n if (HIDDEN_TOOLS.has(schema.name)) continue;\n const segments = schema.name.split(\"_\");\n const leafName = segments.pop()!;\n const group = getOrCreateGroup(parent, segments);\n\n // Skip if a local tool already registered this command\n if (group.commands.find((c) => c.name() === leafName)) continue;\n\n const cmd = group.command(leafName).description(schema.description);\n\n const resolved = resolveJsonSchema(schema.inputSchema);\n const props = resolved.properties ?? {};\n const requiredSet = new Set(resolved.required ?? []);\n const nullableKeys: string[] = [];\n const numberKeys: string[] = [];\n const objectKeys: string[] = [];\n\n for (const [key, prop] of Object.entries(props)) {\n const desc = prop.description ?? key;\n const nullable = isNullableProperty(prop);\n const isObj = isObjectProperty(prop);\n const isNum = isNumberProperty(prop);\n\n if (isNum) numberKeys.push(key);\n\n if (isObj) {\n objectKeys.push(key);\n if (requiredSet.has(key) && !nullable) {\n cmd.requiredOption(`--${key} <json>`, `${desc} (as JSON)`);\n } else {\n cmd.option(`--${key} <json>`, `${desc} (as JSON)`);\n nullableKeys.push(key);\n }\n } else if (nullable || !requiredSet.has(key)) {\n cmd.option(`--${key} <${key}>`, desc);\n nullableKeys.push(key);\n } else {\n cmd.requiredOption(`--${key} <${key}>`, desc);\n }\n }\n\n cmd.action(async (options: Record<string, unknown>) => {\n // Coerce types\n for (const key of nullableKeys) {\n if (options[key] === undefined) options[key] = null;\n }\n for (const key of numberKeys) {\n if (options[key] != null && typeof options[key] === \"string\") {\n options[key] = Number(options[key]);\n }\n }\n for (const key of objectKeys) {\n if (typeof options[key] === \"string\") {\n try {\n options[key] = JSON.parse(options[key] as string);\n } catch {\n console.error(`Invalid JSON for --${key}`);\n process.exit(1);\n }\n }\n }\n\n try {\n const baseUrl = resolveBaseUrl();\n const result = await callTool(baseUrl, schema.name, options as Record<string, unknown>);\n printResult(result);\n printUpdateNotice();\n } catch (error) {\n console.error((error as Error).message);\n process.exit(1);\n }\n });\n }\n}\n\n// ── Register all tools ─────────────────────────────────────────\n\nregisterLocalTools(program, LOCAL_TOOLS);\nregisterRemoteTools(program, schemas as any);\n\n\n// ── Tools listing ──────────────────────────────────────────────\n\nprogram\n .command(\"tools\")\n .description(\"List available tools\")\n .action(() => {\n const allTools = [\n ...LOCAL_TOOLS.map((t) => ({\n name: t.schema.name,\n description: t.schema.description,\n })),\n ...schemas\n .filter((s) => !LOCAL_TOOLS.some((l) => l.schema.name === s.name) && !HIDDEN_TOOLS.has(s.name))\n .map((s) => ({ name: s.name, description: s.description })),\n ].sort((a, b) => a.name.localeCompare(b.name));\n\n const lines: string[] = [];\n for (const tool of allTools) {\n const cmdName = tool.name.replace(/_/g, \" \");\n lines.push(` ${color.green(cmdName.padEnd(28))} ${color.dim(tool.description)}`);\n }\n lines.push(\"\");\n lines.push(color.dim(`${allTools.length} tools`));\n console.log(lines.join(\"\\n\"));\n printUpdateNotice();\n });\n\nprogram.parse();\n","const useColor =\n !process.env.NO_COLOR && process.stdout.isTTY === true;\n\nfunction ansi(code: string) {\n return (text: string) => (useColor ? `${code}${text}\\x1b[0m` : text);\n}\n\nexport const color = {\n bold: ansi(\"\\x1b[1m\"),\n dim: ansi(\"\\x1b[2m\"),\n green: ansi(\"\\x1b[32m\"),\n yellow: ansi(\"\\x1b[33m\"),\n cyan: ansi(\"\\x1b[36m\"),\n red: ansi(\"\\x1b[31m\"),\n};\n\nconst MAX_COL_WIDTH = 40;\n\nfunction truncate(str: string, max: number): string {\n return str.length > max ? str.slice(0, max - 1) + \"…\" : str;\n}\n\nfunction renderArrayTable(rows: Record<string, unknown>[]): string {\n if (rows.length === 0) return \"\";\n\n const keys = Object.keys(rows[0]);\n const widths = keys.map((k) => k.length);\n\n const stringRows = rows.map((row) =>\n keys.map((k, i) => {\n const val = truncate(String(row[k] ?? \"\"), MAX_COL_WIDTH);\n widths[i] = Math.max(widths[i], val.length);\n return val;\n }),\n );\n\n // Cap widths\n for (let i = 0; i < widths.length; i++) {\n widths[i] = Math.min(widths[i], MAX_COL_WIDTH);\n }\n\n const header = keys.map((k, i) => color.bold(k.padEnd(widths[i]))).join(\" \");\n const separator = color.dim(widths.map((w) => \"─\".repeat(w)).join(\"──\"));\n const body = stringRows\n .map((row) => row.map((val, i) => val.padEnd(widths[i])).join(\" \"))\n .join(\"\\n\");\n\n return `${header}\\n${separator}\\n${body}`;\n}\n\nfunction renderObjectTable(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n const maxKey = Math.min(\n MAX_COL_WIDTH,\n Math.max(...entries.map(([k]) => k.length)),\n );\n\n return entries\n .map(([k, v]) => `${color.bold(k.padEnd(maxKey))} ${String(v ?? \"\")}`)\n .join(\"\\n\");\n}\n\nexport function renderTable(data: unknown): string {\n if (Array.isArray(data)) {\n if (data.length === 0) return color.dim(\"(empty)\");\n if (typeof data[0] === \"object\" && data[0] !== null) {\n return renderArrayTable(data as Record<string, unknown>[]);\n }\n return data.map(String).join(\"\\n\");\n }\n\n if (typeof data === \"object\" && data !== null) {\n return renderObjectTable(data as Record<string, unknown>);\n }\n\n return String(data);\n}\n\nexport type OutputFormat = \"json\" | \"compact\" | \"table\";\n\nexport function formatOutput(result: unknown, format: OutputFormat): string {\n if (format === \"compact\") {\n return JSON.stringify(result);\n }\n\n if (format === \"table\") {\n const value =\n typeof result === \"object\" &&\n result !== null &&\n \"data\" in result\n ? (result as Record<string, unknown>).data\n : result;\n return renderTable(value);\n }\n\n return JSON.stringify(result, null, 2);\n}\n","import { readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { color } from \"./format\";\n\nconst CACHE_DIR = join(homedir(), \".config\", \"moonpay\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst FETCH_TIMEOUT_MS = 3000;\n\ntype CacheData = {\n latest: string;\n checkedAt: number;\n};\n\nfunction readCache(): CacheData | null {\n try {\n const raw = readFileSync(CACHE_FILE, \"utf-8\");\n return JSON.parse(raw) as CacheData;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(data: CacheData): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(data));\n } catch {\n // Ignore write errors\n }\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n const a = latest.split(\".\").map(Number);\n const b = current.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((a[i] ?? 0) > (b[i] ?? 0)) return true;\n if ((a[i] ?? 0) < (b[i] ?? 0)) return false;\n }\n return false;\n}\n\nfunction formatNotice(current: string, latest: string): string {\n return [\n \"\",\n color.yellow(`Update available: ${current} → ${latest}`),\n color.dim(\"Run `npm i -g @moonpay/cli` to update.\"),\n \"\",\n ].join(\"\\n\");\n}\n\nexport function startVersionCheck(\n currentVersion: string,\n): () => string | null {\n let notice: string | null = null;\n\n const cache = readCache();\n\n if (cache && Date.now() - cache.checkedAt < ONE_DAY_MS) {\n if (isNewer(cache.latest, currentVersion)) {\n notice = formatNotice(currentVersion, cache.latest);\n }\n return () => notice;\n }\n\n // Fire async fetch — non-blocking\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n fetch(\"https://registry.npmjs.org/@moonpay%2fcli/latest\", {\n signal: controller.signal,\n })\n .then((res) => res.json())\n .then((data: unknown) => {\n const latest = (data as { version?: string }).version;\n if (latest) {\n writeCache({ latest, checkedAt: Date.now() });\n if (isNewer(latest, currentVersion)) {\n notice = formatNotice(currentVersion, latest);\n }\n }\n })\n .catch(() => {\n // Silently ignore fetch errors\n })\n .finally(() => clearTimeout(timeout));\n\n return () => notice;\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const walletExportSchema = defineToolSchema({\n name: \"wallet_export\",\n description:\n \"Export wallet secret (mnemonic or private key). Interactive only — cannot be run by agents or piped.\",\n input: z.object({\n wallet: z.string().describe(\"Wallet name\"),\n }),\n output: z.object({\n exported: z.literal(true),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { findWalletOrThrow } from \"../store\";\nimport { walletExportSchema } from \"./schema\";\n\nexport const walletExport = createTool(walletExportSchema, async (params) => {\n if (!process.stdout.isTTY) {\n throw new Error(\n \"Wallet export requires an interactive terminal.\\n\" +\n \"Run this command directly in your terminal: mp wallet export \" + params.wallet,\n );\n }\n\n const wallet = findWalletOrThrow(params.wallet);\n\n if (wallet.type === \"hd\") {\n process.stderr.write(`\\nMnemonic for \"${wallet.name}\":\\n\\n`);\n process.stderr.write(` ${wallet.mnemonic}\\n\\n`);\n process.stderr.write(\"Write this down and store it securely.\\n\\n\");\n } else {\n process.stderr.write(`\\nPrivate key for \"${wallet.name}\" (${wallet.chain}):\\n\\n`);\n process.stderr.write(` ${wallet.privateKey}\\n\\n`);\n }\n\n return { exported: true as const };\n});\n","import { readdirSync, readFileSync, existsSync, mkdirSync, cpSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\nimport { createRequire } from \"node:module\";\n\n/** Package root → skills/ directory bundled with the CLI */\nfunction getSkillsDir(): string {\n // import.meta.url resolves to dist/index.js when bundled\n const __filename = fileURLToPath(import.meta.url);\n const distDir = dirname(__filename);\n // dist/ → package root → skills/\n return join(distDir, \"..\", \"skills\");\n}\n\n/** Where Claude Code discovers skills */\nfunction getClaudeSkillsDir(): string {\n return join(homedir(), \".claude\", \"skills\");\n}\n\nexport type SkillInfo = {\n name: string;\n description: string;\n};\n\nexport function listBundledSkills(): SkillInfo[] {\n const dir = getSkillsDir();\n if (!existsSync(dir)) return [];\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name.startsWith(\"moonpay-\"))\n .map((e) => {\n const md = readFileSync(join(dir, e.name, \"SKILL.md\"), \"utf-8\");\n const descMatch = md.match(/^description:\\s*(.+)$/m);\n return {\n name: e.name,\n description: descMatch?.[1]?.replace(/^[\"']|[\"']$/g, \"\") ?? \"\",\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function readSkill(name: string): string {\n if (/[/\\\\]|\\.\\./.test(name)) throw new Error(`Invalid skill name: \"${name}\"`);\n const skillPath = join(getSkillsDir(), name, \"SKILL.md\");\n if (!existsSync(skillPath)) {\n throw new Error(`Skill \"${name}\" not found. Run \\`mp skill list\\` to see available skills.`);\n }\n return readFileSync(skillPath, \"utf-8\");\n}\n\nexport function installSkills(force: boolean, dir?: string): { name: string; installed: boolean }[] {\n const srcDir = getSkillsDir();\n const destDir = dir ?? getClaudeSkillsDir();\n const skills = listBundledSkills();\n\n mkdirSync(destDir, { recursive: true });\n\n return skills.map((s) => {\n const dest = join(destDir, s.name);\n if (existsSync(dest) && !force) {\n return { name: s.name, installed: false };\n }\n cpSync(join(srcDir, s.name), dest, { recursive: true, force: true });\n return { name: s.name, installed: true };\n });\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillListSchema = defineToolSchema({\n name: \"skill_list\",\n description: \"List available AI skills for Claude Code and other agents\",\n input: z.object({}),\n output: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n }),\n ),\n});\n","import { createTool } from \"../../shared\";\nimport { listBundledSkills } from \"../server\";\nimport { skillListSchema } from \"./schema\";\n\nexport const skillList = createTool(skillListSchema, async () => {\n return listBundledSkills();\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillRetrieveSchema = defineToolSchema({\n name: \"skill_retrieve\",\n description: \"Get the full instructions for a specific skill\",\n input: z.object({\n name: z.string().describe(\"Skill name (e.g. moonpay-swap-tokens)\"),\n }),\n output: z.object({\n name: z.string(),\n content: z.string(),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { readSkill } from \"../server\";\nimport { skillRetrieveSchema } from \"./schema\";\n\nexport const skillRetrieve = createTool(skillRetrieveSchema, async (params) => {\n return {\n name: params.name,\n content: readSkill(params.name),\n };\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const skillInstallSchema = defineToolSchema({\n name: \"skill_install\",\n description:\n \"Install AI skills for Claude Code. Defaults to ~/.claude/skills/, or specify --dir for a custom location (e.g. project-local, ~/.agents/skills).\",\n input: z.object({\n force: z.boolean().describe(\"Overwrite existing skills\"),\n dir: z\n .string()\n .nullable()\n .describe(\n \"Target directory to install skills into (default: ~/.claude/skills/)\",\n ),\n }),\n output: z.array(\n z.object({\n name: z.string(),\n installed: z.boolean(),\n }),\n ),\n});\n","import { createTool } from \"../../shared\";\nimport { installSkills } from \"../server\";\nimport { skillInstallSchema } from \"./schema\";\n\nexport const skillInstall = createTool(skillInstallSchema, async (params) => {\n return installSkills(params.force, params.dir ?? undefined);\n});\n"],"mappings":"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","names":["readFileSync","mkdirSync","join","homedir","z","z","z","z","z","z","require"]}