#![warn(clippy::all, clippy::pedantic)] #![allow( clippy::assigning_clones, clippy::bool_to_int_with_if, clippy::case_sensitive_file_extension_comparisons, clippy::cast_possible_wrap, clippy::doc_markdown, clippy::field_reassign_with_default, clippy::float_cmp, clippy::implicit_clone, clippy::items_after_statements, clippy::map_unwrap_or, clippy::manual_let_else, clippy::missing_errors_doc, clippy::missing_panics_doc, clippy::module_name_repetitions, clippy::must_use_candidate, clippy::new_without_default, clippy::needless_pass_by_value, clippy::needless_raw_string_hashes, clippy::redundant_closure_for_method_calls, clippy::return_self_not_must_use, clippy::similar_names, clippy::single_match_else, clippy::struct_field_names, clippy::too_many_lines, clippy::uninlined_format_args, clippy::unnecessary_cast, clippy::unnecessary_lazy_evaluations, clippy::unnecessary_literal_bound, clippy::unnecessary_map_or, clippy::unused_self, clippy::cast_precision_loss, clippy::unnecessary_wraps, dead_code )] use clap::Subcommand; use serde::{Deserialize, Serialize}; pub mod agent; pub mod approval; pub mod channels; pub mod config; pub mod cost; pub mod cron; pub mod daemon; pub mod doctor; pub mod gateway; pub mod hardware; pub mod health; pub mod heartbeat; pub mod identity; pub mod integrations; pub mod memory; pub mod migration; pub mod observability; pub mod onboard; pub mod peripherals; pub mod providers; pub mod rag; pub mod runtime; pub mod security; pub mod service; pub mod skills; pub mod tools; pub mod tunnel; pub mod util; pub use config::Config; /// Service management subcommands #[derive(Subcommand, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum ServiceCommands { /// Install daemon service unit for auto-start and restart Install, /// Start daemon service Start, /// Stop daemon service Stop, /// Check daemon service status Status, /// Uninstall daemon service unit Uninstall, } /// Channel management subcommands #[derive(Subcommand, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum ChannelCommands { /// List all configured channels List, /// Start all configured channels (handled in main.rs for async) Start, /// Run health checks for configured channels (handled in main.rs for async) Doctor, /// Add a new channel configuration Add { /// Channel type (telegram, discord, slack, whatsapp, matrix, imessage, email) channel_type: String, /// Optional configuration as JSON config: String, }, /// Remove a channel configuration Remove { /// Channel name to remove name: String, }, /// Bind a Telegram identity (username or numeric user ID) into allowlist BindTelegram { /// Telegram identity to allow (username without '@' or numeric user ID) identity: String, }, } /// Skills management subcommands #[derive(Subcommand, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum SkillCommands { /// List all installed skills List, /// Install a new skill from a URL or local path Install { /// Source URL or local path source: String, }, /// Remove an installed skill Remove { /// Skill name to remove name: String, }, } /// Migration subcommands #[derive(Subcommand, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum MigrateCommands { /// Import memory from an `OpenClaw` workspace into this `ZeroClaw` workspace Openclaw { /// Optional path to `OpenClaw` workspace (defaults to ~/.openclaw/workspace) #[arg(long)] source: Option, /// Validate and preview migration without writing any data #[arg(long)] dry_run: bool, }, } /// Cron subcommands #[derive(Subcommand, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum CronCommands { /// List all scheduled tasks List, /// Add a new scheduled task Add { /// Cron expression expression: String, /// Optional IANA timezone (e.g. America/Los_Angeles) #[arg(long)] tz: Option, /// Command to run command: String, }, /// Add a one-shot scheduled task at an RFC3339 timestamp AddAt { /// One-shot timestamp in RFC3339 format at: String, /// Command to run command: String, }, /// Add a fixed-interval scheduled task AddEvery { /// Interval in milliseconds every_ms: u64, /// Command to run command: String, }, /// Add a one-shot delayed task (e.g. "30m", "2h", "1d") Once { /// Delay duration delay: String, /// Command to run command: String, }, /// Remove a scheduled task Remove { /// Task ID id: String, }, /// Pause a scheduled task Pause { /// Task ID id: String, }, /// Resume a paused task Resume { /// Task ID id: String, }, } /// Integration subcommands #[derive(Subcommand, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum IntegrationCommands { /// Show details about a specific integration Info { /// Integration name name: String, }, } /// Hardware discovery subcommands #[derive(Subcommand, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum HardwareCommands { /// Enumerate USB devices (VID/PID) and show known boards Discover, /// Introspect a device by path (e.g. /dev/ttyACM0) Introspect { /// Serial or device path path: String, }, /// Get chip info via USB (probe-rs over ST-Link). No firmware needed on target. Info { /// Chip name (e.g. STM32F401RETx). Default: STM32F401RETx for Nucleo-F401RE #[arg(long, default_value = "STM32F401RETx")] chip: String, }, } /// Peripheral (hardware) management subcommands #[derive(Subcommand, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum PeripheralCommands { /// List configured peripherals List, /// Add a peripheral (board path, e.g. nucleo-f401re /dev/ttyACM0) Add { /// Board type (nucleo-f401re, rpi-gpio, esp32) board: String, /// Path for serial transport (/dev/ttyACM0) or "native" for local GPIO path: String, }, /// Flash ZeroClaw firmware to Arduino (creates .ino, installs arduino-cli if needed, uploads) Flash { /// Serial port (e.g. /dev/cu.usbmodem12345). If omitted, uses first arduino-uno from config. #[arg(short, long)] port: Option, }, /// Setup Arduino Uno Q Bridge app (deploy GPIO bridge for agent control) SetupUnoQ { /// Uno Q IP (e.g. 192.168.0.48). If omitted, assumes running ON the Uno Q. #[arg(long)] host: Option, }, /// Flash ZeroClaw firmware to Nucleo-F401RE (builds + probe-rs run) FlashNucleo, }