import type { Command } from "commander"; import { formatDocsLink } from "../../terminal/links.js"; import { theme } from "../../terminal/theme.js"; import { formatHelpExamples } from "../help-format.js"; import { registerNodesCameraCommands } from "./register.camera.js"; import { registerNodesCanvasCommands } from "./register.canvas.js"; import { registerNodesInvokeCommands } from "./register.invoke.js"; import { registerNodesLocationCommands } from "./register.location.js"; import { registerNodesNotifyCommand } from "./register.notify.js"; import { registerNodesPairingCommands } from "./register.pairing.js"; import { registerNodesPushCommand } from "./register.push.js"; import { registerNodesScreenCommands } from "./register.screen.js"; import { registerNodesStatusCommands } from "./register.status.js"; export function registerNodesCli(program: Command) { const nodes = program .command("nodes") .description("Manage gateway-owned nodes (pairing, status, invoke, and media)") .addHelpText( "after", () => `\n${theme.heading("Examples:")}\n${formatHelpExamples([ ["openclaw nodes status", "List known nodes with live status."], ["openclaw nodes pairing pending", "Show pending node pairing requests."], ['openclaw nodes run --node --raw "uname -a"', "Run a shell command on a node."], ["openclaw nodes camera snap --node ", "Capture a photo from a node camera."], ])}\n\n${theme.muted("Docs:")} ${formatDocsLink("/cli/nodes", "docs.openclaw.ai/cli/nodes")}\n`, ); registerNodesStatusCommands(nodes); registerNodesPairingCommands(nodes); registerNodesInvokeCommands(nodes); registerNodesNotifyCommand(nodes); registerNodesPushCommand(nodes); registerNodesCanvasCommands(nodes); registerNodesCameraCommands(nodes); registerNodesScreenCommands(nodes); registerNodesLocationCommands(nodes); }