//! Command-line interface for the makima CLI. pub mod config; pub mod contract; pub mod daemon; pub mod red_team; pub mod server; pub mod supervisor; pub mod view; use clap::{Args, Parser, Subcommand}; use uuid::Uuid; pub use config::CliConfig; pub use contract::ContractArgs; pub use contract::{PauseArgs, ResumeArgs, AdvanceArgs, RestartSupervisorArgs, ShowArgs, HealthArgs}; pub use daemon::DaemonArgs; pub use red_team::handle_notify; pub use server::ServerArgs; pub use supervisor::SupervisorArgs; pub use view::ViewArgs; /// Makima - unified CLI for server, daemon, and task management. #[derive(Parser, Debug)] #[command(name = "makima")] #[command(version, about = "Makima CLI - server, daemon, and task management", long_about = None)] pub struct Cli { #[command(subcommand)] pub command: Commands, } #[derive(Subcommand, Debug)] pub enum Commands { /// Run the makima server Server(ServerArgs), /// Run the daemon (connect to server, manage tasks) Daemon(DaemonArgs), /// Supervisor commands for contract orchestration #[command(subcommand)] Supervisor(SupervisorCommand), /// Contract commands for task-contract interaction #[command(subcommand)] Contract(ContractCommand), /// Interactive TUI browser for contracts and tasks /// /// Provides a drill-down interface for browsing contracts, viewing their /// tasks, and streaming real-time task output. /// /// Keyboard shortcuts: /// ↑/k: Move up ↓/j: Move down Enter/l: Drill in /// Esc/h: Go back /: Search q: Quit /// e: Edit d: Delete c: cd to worktree /// n: New contract View(ViewArgs), /// Configure CLI settings (API key, server URL) /// /// Saves configuration to ~/.makima/config.toml for use by CLI commands. #[command(subcommand)] Config(ConfigCommand), /// Red team commands for adversarial monitoring #[command(name = "red-team", subcommand)] RedTeam(RedTeamCommand), /// Contract management helper commands /// /// User-facing commands for managing contracts (pause, resume, show, etc.) #[command(subcommand)] Contracts(ContractsCommand), } /// Config subcommands for CLI configuration. #[derive(Subcommand, Debug)] pub enum ConfigCommand { /// Set the API key /// /// Saves the API key to ~/.makima/config.toml SetKey(config::SetKeyArgs), /// Set the API URL /// /// Saves the API URL to ~/.makima/config.toml SetUrl(config::SetUrlArgs), /// Show current configuration Show, /// Show the config file path Path, } /// Supervisor subcommands for contract orchestration. #[derive(Subcommand, Debug)] pub enum SupervisorCommand { /// List all tasks in the contract Tasks(SupervisorArgs), /// Get the task tree structure Tree(SupervisorArgs), /// Create and start a new task Spawn(supervisor::SpawnArgs), /// Wait for a task to complete Wait(supervisor::WaitArgs), /// Read a file from a task's worktree ReadFile(supervisor::ReadFileArgs), /// Create a git branch Branch(supervisor::BranchArgs), /// Merge a task's changes to a branch Merge(supervisor::MergeArgs), /// Create a pull request Pr(supervisor::PrArgs), /// View task diff Diff(supervisor::DiffArgs), /// Create a checkpoint Checkpoint(supervisor::CheckpointArgs), /// List checkpoints Checkpoints(SupervisorArgs), /// Get contract status Status(SupervisorArgs), /// Advance the contract to the next phase AdvancePhase(supervisor::AdvancePhaseArgs), /// Ask a question and wait for user feedback Ask(supervisor::AskArgs), /// Get individual task details Task(supervisor::GetTaskArgs), /// Get task output/claude log Output(supervisor::GetTaskOutputArgs), /// View task conversation history TaskHistory(supervisor::TaskHistoryArgs), /// List task checkpoints (with optional diff) TaskCheckpoints(supervisor::TaskCheckpointsArgs), /// Resume supervisor after interruption Resume(supervisor::ResumeArgs), /// Resume task from checkpoint TaskResumeFrom(supervisor::TaskResumeFromArgs), /// Rewind task code to checkpoint TaskRewind(supervisor::TaskRewindArgs), /// Fork task from historical point TaskFork(supervisor::TaskForkArgs), /// Rewind supervisor conversation RewindConversation(supervisor::ConversationRewindArgs), /// Mark the contract as complete and stop the supervisor Complete(supervisor::CompleteArgs), /// Resume a completed contract (reactivate it) ResumeContract(supervisor::ResumeContractArgs), /// Mark a deliverable as complete MarkDeliverable(supervisor::MarkDeliverableArgs), } /// Contract subcommands for task-contract interaction. #[derive(Subcommand, Debug)] pub enum ContractCommand { /// Get contract status Status(ContractArgs), /// Get the phase checklist Checklist(ContractArgs), /// Get contract goals Goals(ContractArgs), /// List contract files Files(ContractArgs), /// Get a specific file's content File(contract::FileArgs), /// Report progress on the contract Report(contract::ReportArgs), /// Get suggested next action SuggestAction(ContractArgs), /// Get completion recommendation CompletionAction(contract::CompletionActionArgs), /// Update a file (reads content from stdin) UpdateFile(contract::UpdateFileArgs), /// Create a new file (reads content from stdin) CreateFile(contract::CreateFileArgs), } /// Red team subcommands for adversarial monitoring. #[derive(Subcommand, Debug)] pub enum RedTeamCommand { /// Send a notification to the supervisor about a detected issue. /// Only available to red team tasks. Notify(RedTeamNotifyArgs), } /// Contract management helper subcommands. #[derive(Subcommand, Debug)] pub enum ContractsCommand { /// Pause a contract /// /// Sets the contract status to paused, optionally with a reason. /// The supervisor will be stopped and tasks will not be picked up. Pause(contract::PauseArgs), /// Resume a paused contract /// /// Sets the contract status back to active and restarts the supervisor. Resume(contract::ResumeArgs), /// Manually advance a contract to a specific phase /// /// Use --force to skip deliverable validation. Advance(contract::AdvanceArgs), /// Restart the supervisor for a contract /// /// Useful when the supervisor is stuck or needs to be refreshed. RestartSupervisor(contract::RestartSupervisorArgs), /// Show detailed contract information /// /// Use --verbose for all details including tasks and files. Show(contract::ShowArgs), /// Check contract and supervisor health /// /// Returns health status including supervisor state, task counts, and staleness. Health(contract::HealthArgs), } /// Arguments for red-team notify command. #[derive(Args, Debug)] pub struct RedTeamNotifyArgs { /// API URL #[arg(long, env = "MAKIMA_API_URL", default_value = "https://api.makima.jp")] pub api_url: String, /// API key for authentication #[arg(long, env = "MAKIMA_API_KEY")] pub api_key: String, /// Current task ID (must be a red team task) #[arg(long, env = "MAKIMA_TASK_ID")] pub task_id: Uuid, /// Contract ID #[arg(long, env = "MAKIMA_CONTRACT_ID")] pub contract_id: Uuid, /// The notification message #[arg(index = 1)] pub message: String, /// Severity level: low, medium, high, critical #[arg(long, default_value = "medium")] pub severity: String, /// Related task ID (optional) #[arg(long)] pub task: Option, /// Related file path (optional) #[arg(long)] pub file: Option, /// Additional context (optional) #[arg(long)] pub context: Option, } impl Cli { /// Parse command-line arguments pub fn parse_args() -> Self { Self::parse() } }