import { Command } from "commander"; import { getPluginCliCommandDescriptors } from "../../plugins/cli.js"; import type { OpenClawPluginCliCommandDescriptor } from "../../plugins/types.js"; import { VERSION } from "../../version.js"; import { getCoreCliCommandDescriptors } from "./core-command-descriptors.js"; import { configureProgramHelp } from "./help.js"; import { getSubCliEntries } from "./subcli-descriptors.js"; type RootHelpRenderOptions = { pluginDescriptors?: OpenClawPluginCliCommandDescriptor[] | null; }; async function buildRootHelpProgram(options?: RootHelpRenderOptions): Promise { const program = new Command(); configureProgramHelp(program, { programVersion: VERSION, channelOptions: [], messageChannelOptions: "", agentChannelOptions: "", }); const existingCommands = new Set(); for (const command of getCoreCliCommandDescriptors()) { program.command(command.name).description(command.description); existingCommands.add(command.name); } for (const command of getSubCliEntries()) { if (existingCommands.has(command.name)) { continue; } program.command(command.name).description(command.description); existingCommands.add(command.name); } const pluginDescriptors = options && "pluginDescriptors" in options ? (options.pluginDescriptors ?? []) : await getPluginCliCommandDescriptors(); for (const command of pluginDescriptors) { if (existingCommands.has(command.name)) { continue; } program.command(command.name).description(command.description); existingCommands.add(command.name); } return program; } export async function renderRootHelpText(options?: RootHelpRenderOptions): Promise { const program = await buildRootHelpProgram(options); let output = ""; const originalWrite = process.stdout.write.bind(process.stdout); const captureWrite: typeof process.stdout.write = ((chunk: string | Uint8Array) => { output += String(chunk); return true; }) as typeof process.stdout.write; process.stdout.write = captureWrite; try { program.outputHelp(); } finally { process.stdout.write = originalWrite; } return output; } export async function outputRootHelp(options?: RootHelpRenderOptions): Promise { process.stdout.write(await renderRootHelpText(options)); }