| import type { Command } from "commander"; |
| import { formatDocsLink } from "../../terminal/links.js"; |
| import { isRich, theme } from "../../terminal/theme.js"; |
| import { formatCliBannerLine, hasEmittedCliBanner } from "../banner.js"; |
| import { replaceCliName, resolveCliName } from "../cli-name.js"; |
| import type { ProgramContext } from "./context.js"; |
|
|
| const CLI_NAME = resolveCliName(); |
|
|
| const EXAMPLES = [ |
| [ |
| "openclaw channels login --verbose", |
| "Link personal WhatsApp Web and show QR + connection logs.", |
| ], |
| [ |
| 'openclaw message send --target +15555550123 --message "Hi" --json', |
| "Send via your web session and print JSON result.", |
| ], |
| ["openclaw gateway --port 7860", "Run the WebSocket Gateway locally."], |
| ["openclaw --dev gateway", "Run a dev Gateway (isolated state/config) on ws://127.0.0.1:19001."], |
| ["openclaw gateway --force", "Kill anything bound to the default gateway port, then start it."], |
| ["openclaw gateway ...", "Gateway control via WebSocket."], |
| [ |
| 'openclaw agent --to +15555550123 --message "Run summary" --deliver', |
| "Talk directly to the agent using the Gateway; optionally send the WhatsApp reply.", |
| ], |
| [ |
| 'openclaw message send --channel telegram --target @mychat --message "Hi"', |
| "Send via your Telegram bot.", |
| ], |
| ] as const; |
|
|
| export function configureProgramHelp(program: Command, ctx: ProgramContext) { |
| program |
| .name(CLI_NAME) |
| .description("") |
| .version(ctx.programVersion) |
| .option( |
| "--dev", |
| "Dev profile: isolate state under ~/.openclaw-dev, default gateway port 19001, and shift derived ports (browser/canvas)", |
| ) |
| .option( |
| "--profile <name>", |
| "Use a named profile (isolates OPENCLAW_STATE_DIR/OPENCLAW_CONFIG_PATH under ~/.openclaw-<name>)", |
| ); |
|
|
| program.option("--no-color", "Disable ANSI colors", false); |
|
|
| program.configureHelp({ |
| optionTerm: (option) => theme.option(option.flags), |
| subcommandTerm: (cmd) => theme.command(cmd.name()), |
| }); |
|
|
| program.configureOutput({ |
| writeOut: (str) => { |
| const colored = str |
| .replace(/^Usage:/gm, theme.heading("Usage:")) |
| .replace(/^Options:/gm, theme.heading("Options:")) |
| .replace(/^Commands:/gm, theme.heading("Commands:")); |
| process.stdout.write(colored); |
| }, |
| writeErr: (str) => process.stderr.write(str), |
| outputError: (str, write) => write(theme.error(str)), |
| }); |
|
|
| if ( |
| process.argv.includes("-V") || |
| process.argv.includes("--version") || |
| process.argv.includes("-v") |
| ) { |
| console.log(ctx.programVersion); |
| process.exit(0); |
| } |
|
|
| program.addHelpText("beforeAll", () => { |
| if (hasEmittedCliBanner()) { |
| return ""; |
| } |
| const rich = isRich(); |
| const line = formatCliBannerLine(ctx.programVersion, { richTty: rich }); |
| return `\n${line}\n`; |
| }); |
|
|
| const fmtExamples = EXAMPLES.map( |
| ([cmd, desc]) => ` ${theme.command(replaceCliName(cmd, CLI_NAME))}\n ${theme.muted(desc)}`, |
| ).join("\n"); |
|
|
| program.addHelpText("afterAll", ({ command }) => { |
| if (command !== program) { |
| return ""; |
| } |
| const docs = formatDocsLink("/cli", "docs.openclaw.ai/cli"); |
| return `\n${theme.heading("Examples:")}\n${fmtExamples}\n\n${theme.muted("Docs:")} ${docs}\n`; |
| }); |
| } |
|
|