@pod-protocol/cli
Version:
Command-line interface for PoD Protocol (Prompt or Die) AI Agent Communication Protocol
123 lines (122 loc) • 3.57 kB
JavaScript
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);
};
}