UNPKG

@pod-protocol/cli

Version:

Command-line interface for PoD Protocol (Prompt or Die) AI Agent Communication Protocol

123 lines (122 loc) 3.57 kB
import chalk from "chalk"; import ora from "ora"; import { createClient, getWallet, getKeypair } from "./client.js"; import { safeExecute } from "./error-handler.js"; /** * Common error handler for CLI commands */ export function handleCommandError(error, action) { console.error(chalk.red(`Failed to ${action}:`), error.message); process.exit(1); } /** * Create wrapped command handler with common error handling */ export function createCommandHandler(action, handler) { return async (globalOpts, ...args) => { try { const wallet = getWallet(globalOpts.keypair); const keypair = getKeypair(globalOpts.keypair); const client = await createClient(globalOpts.network, wallet); await handler(client, keypair, globalOpts, ...args); } catch (error) { handleCommandError(error, action); } }; } /** * Handle dry run logic with spinner */ export function handleDryRun(globalOpts, spinner, action, details) { if (globalOpts.dryRun) { spinner.succeed(`Dry run: ${action} prepared`); if (details) { Object.entries(details).forEach(([key, value]) => { console.log(chalk.cyan(`${key}:`), value); }); } return true; } return false; } /** * Create spinner with consistent messaging */ export function createSpinner(message) { return ora(message).start(); } /** * Success message with spinner */ export function showSuccess(spinner, message, details) { spinner.succeed(message); if (details) { Object.entries(details).forEach(([key, value]) => { console.log(chalk.green(`${key}:`), value); }); } } /** * Common table configuration */ export const getTableConfig = (title) => ({ header: { alignment: "center", content: chalk.blue.bold(title), }, }); /** * Format value for display with appropriate styling */ export function formatValue(value, type = "text") { if (value === null || value === undefined) { return chalk.gray("N/A"); } switch (type) { case "address": return chalk.yellow(value.toString()); case "number": return chalk.cyan(value.toString()); case "boolean": return value ? chalk.green("✓") : chalk.red("✗"); default: return value.toString(); } } /** * Common validation for public key addresses */ export function validatePublicKey(address, fieldName) { try { new (require("@solana/web3.js").PublicKey)(address); } catch { throw new Error(`Invalid ${fieldName}: ${address}`); } } /** * Get command options in a compatible way across Commander.js versions */ export function getCommandOpts(cmd) { // Try optsWithGlobals first (v8+) if (typeof cmd.optsWithGlobals === "function") { return cmd.optsWithGlobals(); } // Fallback to parent opts (older versions) return cmd.parent?.opts() || {}; } /** * Enhanced command handler with centralized error handling */ export function createSafeCommandHandler(description, handler) { return async (...args) => { const cmd = args[args.length - 1]; const globalOpts = getCommandOpts(cmd); await safeExecute(async () => { const client = await createClient(globalOpts.network); const wallet = getWallet(globalOpts.keypair); await handler(client, wallet, globalOpts, ...args.slice(0, -1)); }, description); }; }