@moonpay/cli 0.4.3 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
3
3
  import {
4
4
  bitcoinBalanceRetrieve,
5
+ callRemoteTool,
5
6
  callTool,
6
7
  clearCredentials,
7
8
  createTool,
@@ -11,18 +12,22 @@ import {
11
12
  messageSign,
12
13
  resolveBaseUrl,
13
14
  schemas_default,
15
+ tokenBridge,
16
+ tokenSwap,
14
17
  transactionSign,
18
+ virtualAccountWalletRegister,
15
19
  walletCreate,
16
20
  walletDelete,
17
21
  walletImport,
18
22
  walletList,
19
- walletLock,
20
23
  walletRetrieve,
21
- walletUnlock
22
- } from "./chunk-BSUHFW7I.js";
23
- import "./chunk-AGDVU2O5.js";
24
- import "./chunk-Z33PSOPD.js";
25
- import "./chunk-EEBB5MQP.js";
24
+ x402Request
25
+ } from "./chunk-PBRXVTTG.js";
26
+ import {
27
+ KEY_CHAIN_MAP,
28
+ chainSchema,
29
+ findWalletOrThrow
30
+ } from "./chunk-V7MA7WNX.js";
26
31
 
27
32
  // src/index.ts
28
33
  import { createRequire } from "module";
@@ -164,6 +169,48 @@ function startVersionCheck(currentVersion) {
164
169
  return () => notice;
165
170
  }
166
171
 
172
+ // src/tools/wallet/export/schema.ts
173
+ import { z } from "zod";
174
+ var walletExportSchema = defineToolSchema({
175
+ name: "wallet_export",
176
+ description: "Export wallet secret (mnemonic or private key). Interactive only \u2014 cannot be run by agents or piped.",
177
+ input: z.object({
178
+ wallet: z.string().describe("Wallet name")
179
+ }),
180
+ output: z.object({
181
+ exported: z.literal(true)
182
+ })
183
+ });
184
+
185
+ // src/tools/wallet/export/tool.ts
186
+ var walletExport = createTool(walletExportSchema, async (params) => {
187
+ if (!process.stdout.isTTY) {
188
+ throw new Error(
189
+ "Wallet export requires an interactive terminal.\nRun this command directly in your terminal: mp wallet export " + params.wallet
190
+ );
191
+ }
192
+ const wallet = findWalletOrThrow(params.wallet);
193
+ if (wallet.type === "hd") {
194
+ process.stderr.write(`
195
+ Mnemonic for "${wallet.name}":
196
+
197
+ `);
198
+ process.stderr.write(` ${wallet.mnemonic}
199
+
200
+ `);
201
+ process.stderr.write("Write this down and store it securely.\n\n");
202
+ } else {
203
+ process.stderr.write(`
204
+ Private key for "${wallet.name}" (${wallet.chain}):
205
+
206
+ `);
207
+ process.stderr.write(` ${wallet.privateKey}
208
+
209
+ `);
210
+ }
211
+ return { exported: true };
212
+ });
213
+
167
214
  // src/tools/skill/server.ts
168
215
  import { readdirSync, readFileSync as readFileSync2, existsSync, mkdirSync as mkdirSync2, cpSync } from "fs";
169
216
  import { join as join2, dirname } from "path";
@@ -190,15 +237,16 @@ function listBundledSkills() {
190
237
  }).sort((a, b) => a.name.localeCompare(b.name));
191
238
  }
192
239
  function readSkill(name) {
240
+ if (/[/\\]|\.\./.test(name)) throw new Error(`Invalid skill name: "${name}"`);
193
241
  const skillPath = join2(getSkillsDir(), name, "SKILL.md");
194
242
  if (!existsSync(skillPath)) {
195
243
  throw new Error(`Skill "${name}" not found. Run \`mp skill list\` to see available skills.`);
196
244
  }
197
245
  return readFileSync2(skillPath, "utf-8");
198
246
  }
199
- function installSkills(force) {
247
+ function installSkills(force, dir) {
200
248
  const srcDir = getSkillsDir();
201
- const destDir = getClaudeSkillsDir();
249
+ const destDir = dir ?? getClaudeSkillsDir();
202
250
  const skills = listBundledSkills();
203
251
  mkdirSync2(destDir, { recursive: true });
204
252
  return skills.map((s) => {
@@ -212,15 +260,15 @@ function installSkills(force) {
212
260
  }
213
261
 
214
262
  // src/tools/skill/list/schema.ts
215
- import { z } from "zod";
263
+ import { z as z2 } from "zod";
216
264
  var skillListSchema = defineToolSchema({
217
265
  name: "skill_list",
218
266
  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()
267
+ input: z2.object({}),
268
+ output: z2.array(
269
+ z2.object({
270
+ name: z2.string(),
271
+ description: z2.string()
224
272
  })
225
273
  )
226
274
  });
@@ -231,16 +279,16 @@ var skillList = createTool(skillListSchema, async () => {
231
279
  });
232
280
 
233
281
  // src/tools/skill/retrieve/schema.ts
234
- import { z as z2 } from "zod";
282
+ import { z as z3 } from "zod";
235
283
  var skillRetrieveSchema = defineToolSchema({
236
284
  name: "skill_retrieve",
237
285
  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)")
286
+ input: z3.object({
287
+ name: z3.string().describe("Skill name (e.g. moonpay-swap-tokens)")
240
288
  }),
241
- output: z2.object({
242
- name: z2.string(),
243
- content: z2.string()
289
+ output: z3.object({
290
+ name: z3.string(),
291
+ content: z3.string()
244
292
  })
245
293
  });
246
294
 
@@ -253,24 +301,83 @@ var skillRetrieve = createTool(skillRetrieveSchema, async (params) => {
253
301
  });
254
302
 
255
303
  // src/tools/skill/install/schema.ts
256
- import { z as z3 } from "zod";
304
+ import { z as z4 } from "zod";
257
305
  var skillInstallSchema = defineToolSchema({
258
306
  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")
307
+ description: "Install AI skills for Claude Code. Defaults to ~/.claude/skills/, or specify --dir for a custom location (e.g. project-local, ~/.agents/skills).",
308
+ input: z4.object({
309
+ force: z4.boolean().describe("Overwrite existing skills"),
310
+ dir: z4.string().nullable().describe(
311
+ "Target directory to install skills into (default: ~/.claude/skills/)"
312
+ )
262
313
  }),
263
- output: z3.array(
264
- z3.object({
265
- name: z3.string(),
266
- installed: z3.boolean()
314
+ output: z4.array(
315
+ z4.object({
316
+ name: z4.string(),
317
+ installed: z4.boolean()
267
318
  })
268
319
  )
269
320
  });
270
321
 
271
322
  // src/tools/skill/install/tool.ts
272
323
  var skillInstall = createTool(skillInstallSchema, async (params) => {
273
- return installSkills(params.force);
324
+ return installSkills(params.force, params.dir ?? void 0);
325
+ });
326
+
327
+ // src/tools/token/transfer/schema.ts
328
+ import { z as z5 } from "zod";
329
+ var tokenTransferSchema = defineToolSchema({
330
+ name: "token_transfer",
331
+ description: "Transfer tokens to another wallet on the same chain. Builds, signs locally, and broadcasts.",
332
+ input: z5.object({
333
+ wallet: z5.string().describe("Local wallet name to sign with"),
334
+ chain: chainSchema.describe("Chain to transfer on"),
335
+ token: z5.string().describe("Token address to transfer"),
336
+ amount: z5.coerce.number().describe("Amount to transfer"),
337
+ to: z5.string().describe("Recipient wallet name or address")
338
+ }),
339
+ output: z5.object({
340
+ signature: z5.string().describe("Transaction hash/signature"),
341
+ message: z5.string().describe("Human-readable transfer description")
342
+ })
343
+ });
344
+
345
+ // src/tools/token/transfer/tool.ts
346
+ var tokenTransfer = createTool(tokenTransferSchema, async (params) => {
347
+ const baseUrl = resolveBaseUrl();
348
+ const wallet = await walletRetrieve.handler({ wallet: params.wallet });
349
+ const fromAddress = wallet.addresses[KEY_CHAIN_MAP[params.chain]];
350
+ if (!fromAddress) {
351
+ throw new Error(`Wallet "${wallet.name}" has no address on ${params.chain}.`);
352
+ }
353
+ let toAddress = params.to;
354
+ try {
355
+ const toWallet = await walletRetrieve.handler({ wallet: params.to });
356
+ toAddress = toWallet.addresses[KEY_CHAIN_MAP[params.chain]] ?? params.to;
357
+ } catch {
358
+ }
359
+ const buildResult = await callRemoteTool(baseUrl, "token_transfer", {
360
+ wallet: fromAddress,
361
+ token: params.token,
362
+ to: toAddress,
363
+ amount: params.amount,
364
+ chain: params.chain
365
+ });
366
+ const txPayload = buildResult.transaction.type === "solana" ? buildResult.transaction.base64 : JSON.stringify(buildResult.transaction);
367
+ const { transaction: signedTransaction } = await transactionSign.handler({
368
+ wallet: wallet.name,
369
+ chain: params.chain,
370
+ transaction: txPayload
371
+ });
372
+ const sendResult = await callRemoteTool(baseUrl, "transaction_send", {
373
+ transaction: signedTransaction,
374
+ message: buildResult.message,
375
+ chain: params.chain
376
+ });
377
+ if (!sendResult.signature) {
378
+ throw new Error(`Transaction send failed: ${sendResult.message}`);
379
+ }
380
+ return { signature: sendResult.signature, message: buildResult.message };
274
381
  });
275
382
 
276
383
  // src/index.ts
@@ -280,20 +387,26 @@ var LOCAL_TOOLS = [
280
387
  walletList,
281
388
  walletRetrieve,
282
389
  walletDelete,
283
- walletLock,
284
- walletUnlock,
390
+ walletExport,
285
391
  transactionSign,
286
392
  messageSign,
287
393
  bitcoinBalanceRetrieve,
288
394
  skillList,
289
395
  skillRetrieve,
290
- skillInstall
396
+ skillInstall,
397
+ tokenSwap,
398
+ tokenBridge,
399
+ tokenTransfer,
400
+ x402Request,
401
+ virtualAccountWalletRegister
291
402
  ];
292
403
  var require2 = createRequire(import.meta.url);
293
404
  var { version } = require2("../package.json");
294
405
  var getUpdateNotice = startVersionCheck(version);
295
406
  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");
407
+ program.name("moonpay").description(
408
+ "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"
409
+ ).version(version).option("-f, --format <type>", "Output format: json, compact, or table", "json");
297
410
  function getFormat() {
298
411
  const fmt = program.opts().format;
299
412
  if (fmt === "json" || fmt === "compact" || fmt === "table") return fmt;
@@ -306,7 +419,9 @@ function printUpdateNotice() {
306
419
  const notice = getUpdateNotice();
307
420
  if (notice) process.stderr.write(notice);
308
421
  }
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) => {
422
+ program.command("login").description(
423
+ "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"
424
+ ).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
425
  const config = getConfigOrDefault();
311
426
  try {
312
427
  await login(config, { noBrowser: !opts.browser, code: opts.code });
@@ -321,7 +436,7 @@ program.command("logout").description("Log out and clear stored credentials").ac
321
436
  console.log("Logged out.");
322
437
  });
323
438
  program.command("mcp").description("Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)").action(async () => {
324
- const { startMcpServer } = await import("./mcp-7A6UP5CV.js");
439
+ const { startMcpServer } = await import("./mcp-TDQN25MO.js");
325
440
  await startMcpServer();
326
441
  });
327
442
  function getOrCreateGroup(parent, segments) {
@@ -335,6 +450,42 @@ function getOrCreateGroup(parent, segments) {
335
450
  }
336
451
  return current;
337
452
  }
453
+ function flattenShape(shape, prefix = "") {
454
+ const fields = [];
455
+ for (const [key, field] of Object.entries(shape)) {
456
+ const flatKey = prefix ? `${prefix}-${key}` : key;
457
+ let inner = field;
458
+ while (inner._def.typeName === "ZodEffects") inner = inner._def.schema;
459
+ let unwrapped = inner;
460
+ if (unwrapped._def.typeName === "ZodNullable") unwrapped = unwrapped._def.innerType;
461
+ if (unwrapped._def.typeName === "ZodObject" && unwrapped.shape) {
462
+ fields.push(...flattenShape(unwrapped.shape, flatKey));
463
+ } else {
464
+ fields.push({ flatKey, field, path: flatKey.split("-") });
465
+ }
466
+ }
467
+ return fields;
468
+ }
469
+ function unflattenParams(flat, fields) {
470
+ const result = {};
471
+ for (const { flatKey, path } of fields) {
472
+ const camelKey = flatKey.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
473
+ const value = camelKey in flat ? flat[camelKey] : flat[flatKey];
474
+ if (path.length === 1) {
475
+ result[path[0]] = value;
476
+ } else {
477
+ let obj = result;
478
+ for (let i = 0; i < path.length - 1; i++) {
479
+ if (!obj[path[i]] || typeof obj[path[i]] !== "object") {
480
+ obj[path[i]] = {};
481
+ }
482
+ obj = obj[path[i]];
483
+ }
484
+ obj[path[path.length - 1]] = value;
485
+ }
486
+ }
487
+ return result;
488
+ }
338
489
  function registerLocalTools(parent, tools) {
339
490
  for (const tool of tools) {
340
491
  const segments = tool.schema.name.split("_");
@@ -342,38 +493,40 @@ function registerLocalTools(parent, tools) {
342
493
  const group = getOrCreateGroup(parent, segments);
343
494
  const cmd = group.command(leafName).description(tool.schema.description);
344
495
  const shape = tool.schema.input.shape ?? {};
496
+ const flatFields = flattenShape(shape);
345
497
  const nullableKeys = [];
346
498
  const numberKeys = [];
347
- for (const [key, field] of Object.entries(shape)) {
348
- const desc = field.description ?? key;
499
+ for (const { flatKey, field } of flatFields) {
500
+ const desc = field.description ?? flatKey;
349
501
  let inner = field;
350
- while (inner._def.typeName === "ZodEffects") {
351
- inner = inner._def.schema;
352
- }
502
+ while (inner._def.typeName === "ZodEffects") inner = inner._def.schema;
353
503
  const typeName = inner._def.typeName;
354
504
  let checkNum = inner;
355
505
  if (checkNum._def.typeName === "ZodNullable") checkNum = checkNum._def.innerType;
356
- if (checkNum._def.typeName === "ZodNumber") numberKeys.push(key);
506
+ if (checkNum._def.typeName === "ZodNumber") numberKeys.push(flatKey);
357
507
  if (typeName === "ZodBoolean") {
358
- cmd.option(`--${key}`, desc, false);
508
+ cmd.option(`--${flatKey}`, desc, false);
359
509
  } else if (typeName === "ZodNullable") {
360
- cmd.option(`--${key} <${key}>`, desc);
361
- nullableKeys.push(key);
510
+ cmd.option(`--${flatKey} <${flatKey}>`, desc);
511
+ nullableKeys.push(flatKey);
362
512
  } else {
363
- cmd.requiredOption(`--${key} <${key}>`, desc);
513
+ cmd.requiredOption(`--${flatKey} <${flatKey}>`, desc);
364
514
  }
365
515
  }
366
516
  cmd.action(async (options) => {
367
517
  for (const key of nullableKeys) {
368
- if (options[key] === void 0) options[key] = null;
518
+ const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
519
+ if (options[camelKey] === void 0) options[camelKey] = null;
369
520
  }
370
521
  for (const key of numberKeys) {
371
- if (options[key] != null && typeof options[key] === "string") {
372
- options[key] = Number(options[key]);
522
+ const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
523
+ if (options[camelKey] != null && typeof options[camelKey] === "string") {
524
+ options[camelKey] = Number(options[camelKey]);
373
525
  }
374
526
  }
527
+ const params = unflattenParams(options, flatFields);
375
528
  try {
376
- const result = await tool.handler(options);
529
+ const result = await tool.handler(params);
377
530
  printResult(result);
378
531
  } catch (error) {
379
532
  console.error(error.message);
@@ -403,8 +556,14 @@ function isNumberProperty(prop) {
403
556
  if (prop.anyOf) return prop.anyOf.some((t) => t.type === "number" || t.type === "integer");
404
557
  return prop.type === "number" || prop.type === "integer";
405
558
  }
559
+ var HIDDEN_TOOLS = /* @__PURE__ */ new Set([
560
+ "swaps_transaction_build",
561
+ "token_transfer",
562
+ "transaction_register"
563
+ ]);
406
564
  function registerRemoteTools(parent, remoteSchemas) {
407
565
  for (const schema of remoteSchemas) {
566
+ if (HIDDEN_TOOLS.has(schema.name)) continue;
408
567
  const segments = schema.name.split("_");
409
568
  const leafName = segments.pop();
410
569
  const group = getOrCreateGroup(parent, segments);
@@ -476,7 +635,7 @@ program.command("tools").description("List available tools").action(() => {
476
635
  name: t.schema.name,
477
636
  description: t.schema.description
478
637
  })),
479
- ...schemas_default.filter((s) => !LOCAL_TOOLS.some((l) => l.schema.name === s.name)).map((s) => ({ name: s.name, description: s.description }))
638
+ ...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
639
  ].sort((a, b) => a.name.localeCompare(b.name));
481
640
  const lines = [];
482
641
  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","../src/tools/token/transfer/schema.ts","../src/tools/token/transfer/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, tokenBridge } from \"./tools/token/swap/tool\";\nimport { tokenTransfer } from \"./tools/token/transfer/tool\";\nimport { x402Request } from \"./tools/x402/request/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 tokenBridge,\n tokenTransfer,\n x402Request,\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 \"token_transfer\",\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","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { chainSchema } from \"../../wallet/models\";\n\nexport const tokenTransferSchema = defineToolSchema({\n name: \"token_transfer\",\n description:\n \"Transfer tokens to another wallet on the same chain. Builds, signs locally, and broadcasts.\",\n input: z.object({\n wallet: z.string().describe(\"Local wallet name to sign with\"),\n chain: chainSchema.describe(\"Chain to transfer on\"),\n token: z.string().describe(\"Token address to transfer\"),\n amount: z.coerce.number().describe(\"Amount to transfer\"),\n to: z.string().describe(\"Recipient wallet name or address\"),\n }),\n output: z.object({\n signature: z.string().describe(\"Transaction hash/signature\"),\n message: z.string().describe(\"Human-readable transfer description\"),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { callRemoteTool } from \"../../../client\";\nimport { resolveBaseUrl } from \"../../../auth\";\nimport { walletRetrieve } from \"../../wallet/retrieve/tool\";\nimport { KEY_CHAIN_MAP } from \"../../wallet/models\";\nimport { transactionSign } from \"../../transaction/sign/tool\";\nimport { tokenTransferSchema } from \"./schema\";\n\nexport const tokenTransfer = createTool(tokenTransferSchema, async (params) => {\n const baseUrl = resolveBaseUrl();\n\n const wallet = await walletRetrieve.handler({ wallet: params.wallet });\n const fromAddress = wallet.addresses[KEY_CHAIN_MAP[params.chain]];\n if (!fromAddress) {\n throw new Error(`Wallet \"${wallet.name}\" has no address on ${params.chain}.`);\n }\n\n // Resolve recipient: try as wallet name, fall back to raw address\n let toAddress = params.to;\n try {\n const toWallet = await walletRetrieve.handler({ wallet: params.to });\n toAddress = toWallet.addresses[KEY_CHAIN_MAP[params.chain]] ?? params.to;\n } catch {\n // Not a wallet name — use as-is (raw address)\n }\n\n // Build unsigned transaction\n const buildResult = await callRemoteTool(baseUrl, \"token_transfer\", {\n wallet: fromAddress,\n token: params.token,\n to: toAddress,\n amount: params.amount,\n chain: params.chain,\n });\n\n // Sign\n const txPayload = buildResult.transaction.type === \"solana\"\n ? buildResult.transaction.base64\n : JSON.stringify(buildResult.transaction);\n\n const { transaction: signedTransaction } = await transactionSign.handler({\n wallet: wallet.name,\n chain: params.chain,\n transaction: txPayload,\n });\n\n // Send\n const sendResult = await callRemoteTool(baseUrl, \"transaction_send\", {\n transaction: signedTransaction,\n message: buildResult.message,\n chain: params.chain,\n });\n\n if (!sendResult.signature) {\n throw new Error(`Transaction send failed: ${sendResult.message}`);\n }\n\n return { signature: sendResult.signature, message: buildResult.message };\n});\n"],"mappings":"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","names":["readFileSync","mkdirSync","join","homedir","z","z","z","z","z","z","z","z","require"]}