unified-agent-api-claude-code 0.3.5

Async wrapper around the Claude Code CLI for non-interactive prompting
Documentation
use claude_code::{
    PluginDisableRequest, PluginEnableRequest, PluginInstallRequest, PluginListRequest,
    PluginManifestMarketplaceRequest, PluginManifestRequest, PluginMarketplaceAddRequest,
    PluginMarketplaceListRequest, PluginMarketplaceRemoveRequest, PluginMarketplaceRepoRequest,
    PluginMarketplaceRequest, PluginMarketplaceUpdateRequest, PluginRequest,
    PluginUninstallRequest, PluginUpdateRequest, PluginValidateRequest,
};

#[test]
fn plugin_root_argv() {
    let argv = PluginRequest::new().into_command().argv();
    assert_eq!(argv, ["plugin"]);

    let argv = PluginMarketplaceRequest::new().into_command().argv();
    assert_eq!(argv, ["plugin", "marketplace"]);
}

#[test]
fn plugin_manifest_argv() {
    let argv = PluginManifestRequest::new().into_command().argv();
    assert_eq!(argv, ["plugin", "manifest"]);

    let argv = PluginManifestMarketplaceRequest::new()
        .into_command()
        .argv();
    assert_eq!(argv, ["plugin", "manifest", "marketplace"]);
}

#[test]
fn plugin_marketplace_repo_argv() {
    let argv = PluginMarketplaceRepoRequest::new().into_command().argv();
    assert_eq!(argv, ["plugin", "marketplace", "repo"]);
}

#[test]
fn plugin_marketplace_add_argv() {
    let argv = PluginMarketplaceAddRequest::new("https://example.com")
        .into_command()
        .argv();
    assert_eq!(
        argv,
        ["plugin", "marketplace", "add", "https://example.com"]
    );
}

#[test]
fn plugin_enable_orders_scope_before_plugin_name() {
    let argv = PluginEnableRequest::new("my-plugin")
        .scope("project")
        .into_command()
        .argv();
    assert_eq!(
        argv,
        ["plugin", "enable", "--scope", "project", "my-plugin"]
    );
}

#[test]
fn plugin_disable_orders_flags_before_positionals() {
    let argv = PluginDisableRequest::new()
        .all(true)
        .scope("user")
        .into_command()
        .argv();
    assert_eq!(argv, ["plugin", "disable", "--all", "--scope", "user"]);
}

#[test]
fn plugin_list_orders_flags_deterministically() {
    let argv = PluginListRequest::new()
        .available(true)
        .json(true)
        .into_command()
        .argv();
    assert_eq!(argv, ["plugin", "list", "--available", "--json"]);
}

#[test]
fn plugin_install_uninstall_order_scope_flag() {
    let argv = PluginInstallRequest::new()
        .scope("project")
        .into_command()
        .argv();
    assert_eq!(argv, ["plugin", "install", "--scope", "project"]);

    let argv = PluginUninstallRequest::new()
        .scope("project")
        .into_command()
        .argv();
    assert_eq!(argv, ["plugin", "uninstall", "--scope", "project"]);
}

#[test]
fn plugin_update_includes_scope_before_plugin_name() {
    let argv = PluginUpdateRequest::new("my-plugin")
        .scope("project")
        .into_command()
        .argv();
    assert_eq!(
        argv,
        ["plugin", "update", "--scope", "project", "my-plugin"]
    );
}

#[test]
fn plugin_validate_includes_path_positional() {
    let argv = PluginValidateRequest::new("path/to/plugin")
        .into_command()
        .argv();
    assert_eq!(argv, ["plugin", "validate", "path/to/plugin"]);
}

#[test]
fn plugin_marketplace_list_includes_json_flag() {
    let argv = PluginMarketplaceListRequest::new()
        .json(true)
        .into_command()
        .argv();
    assert_eq!(argv, ["plugin", "marketplace", "list", "--json"]);
}

#[test]
fn plugin_marketplace_remove_update_argv() {
    let argv = PluginMarketplaceRemoveRequest::new().into_command().argv();
    assert_eq!(argv, ["plugin", "marketplace", "remove"]);

    let argv = PluginMarketplaceUpdateRequest::new().into_command().argv();
    assert_eq!(argv, ["plugin", "marketplace", "update"]);
}