nodus 0.10.0

Local-first CLI for managing project-scoped agent packages.
Documentation
use std::path::Path;

use super::args::{Command, MembersCommand};
use super::handlers::{CommandContext, dependency, mcp, project, query, system};
use crate::members::MembersOperation;
use crate::report::Reporter;

pub(super) fn run_command_in_dir(
    command: Command,
    cwd: &Path,
    cache_root: &Path,
    reporter: &Reporter,
) -> anyhow::Result<()> {
    let context = CommandContext {
        cwd,
        cache_root,
        reporter,
    };

    match command {
        Command::Add {
            url,
            global,
            dev,
            tag,
            branch,
            version,
            revision,
            adapter,
            component,
            sync_on_launch,
            no_sync_on_launch,
            accept_all_dependencies,
            dry_run,
        } => dependency::handle_add(
            &context,
            dependency::AddCommand {
                url,
                global,
                dev,
                tag,
                branch,
                version,
                revision,
                adapter,
                component,
                sync_on_launch,
                no_sync_on_launch,
                accept_all_dependencies,
                dry_run,
            },
        ),
        Command::Remove {
            package,
            global,
            dry_run,
        } => dependency::handle_remove(&context, package, global, dry_run),
        Command::Members { command } => match command {
            MembersCommand::List { package } => dependency::handle_members_list(&context, package),
            MembersCommand::Enable {
                package,
                members,
                allow_high_sensitivity,
                dry_run,
            } => dependency::handle_members_update(
                &context,
                dependency::MembersUpdateCommand {
                    package,
                    members,
                    operation: MembersOperation::Enable,
                    allow_high_sensitivity,
                    dry_run,
                },
            ),
            MembersCommand::Disable {
                package,
                members,
                allow_high_sensitivity,
                dry_run,
            } => dependency::handle_members_update(
                &context,
                dependency::MembersUpdateCommand {
                    package,
                    members,
                    operation: MembersOperation::Disable,
                    allow_high_sensitivity,
                    dry_run,
                },
            ),
            MembersCommand::Set {
                package,
                members,
                allow_high_sensitivity,
                dry_run,
            } => dependency::handle_members_update(
                &context,
                dependency::MembersUpdateCommand {
                    package,
                    members,
                    operation: MembersOperation::Set,
                    allow_high_sensitivity,
                    dry_run,
                },
            ),
        },
        Command::List { json } => query::handle_list(&context, json),
        Command::Info {
            package,
            tag,
            branch,
            json,
        } => query::handle_info(&context, package, tag, branch, json),
        Command::Review {
            package,
            tag,
            branch,
            provider,
            model,
        } => query::handle_review(
            &context,
            query::ReviewCommand {
                package,
                tag,
                branch,
                provider,
                model,
            },
        ),
        Command::Outdated { json } => query::handle_outdated(&context, json),
        Command::Update {
            allow_high_sensitivity,
            dry_run,
        } => dependency::handle_update(&context, allow_high_sensitivity, dry_run),
        Command::Upgrade { check } => system::handle_upgrade(&context, check),
        Command::Relay {
            packages,
            repo_path,
            via,
            watch,
            dry_run,
            create_missing,
        } => project::handle_relay(
            &context,
            project::RelayCommand {
                packages,
                repo_path,
                via,
                watch,
                dry_run,
                create_missing,
            },
        ),
        Command::Init { dry_run } => project::handle_init(&context, dry_run),
        Command::Sync {
            locked,
            frozen,
            allow_high_sensitivity,
            force,
            adapter,
            sync_on_launch,
            no_sync_on_launch,
            dry_run,
        } => project::handle_sync(
            &context,
            project::SyncCommand {
                locked,
                frozen,
                allow_high_sensitivity,
                force,
                adapter,
                sync_on_launch,
                no_sync_on_launch,
                dry_run,
            },
        ),
        Command::Clean { all, dry_run } => system::handle_clean(&context, all, dry_run),
        Command::Completion { shell } => system::handle_completion(shell),
        Command::Doctor {
            apply,
            yes,
            check,
            force,
            json,
        } => query::handle_doctor(
            &context,
            query::DoctorCommand {
                apply,
                yes,
                check,
                force,
                json,
            },
        ),
        Command::Mcp { command } => match command {
            crate::cli::args::McpCommand::Serve => mcp::handle_mcp_serve(&context),
            crate::cli::args::McpCommand::Status { json } => mcp::handle_mcp_status(&context, json),
        },
    }
}