magi-code 0.77.1

Repository-aware CLI coding agent for terminal work
Documentation
use super::*;
use crate::tools::ToolCapability;

fn all_tool_capabilities() -> [ToolCapability; 11] {
    [
        ToolCapability::Read,
        ToolCapability::ViewImage,
        ToolCapability::Bash,
        ToolCapability::HashEdit,
        ToolCapability::Write,
        ToolCapability::Grep,
        ToolCapability::Find,
        ToolCapability::ListFiles,
        ToolCapability::Subagents,
        ToolCapability::Web,
        ToolCapability::AstGrep,
    ]
}

fn expected_card_role(capability: ToolCapability) -> TranscriptCardRole {
    match capability {
        ToolCapability::Read => TranscriptCardRole::Read,
        ToolCapability::ViewImage => TranscriptCardRole::ViewImage,
        ToolCapability::Bash => TranscriptCardRole::Bash,
        ToolCapability::HashEdit => TranscriptCardRole::HashEdit,
        ToolCapability::Write => TranscriptCardRole::Write,
        ToolCapability::Grep => TranscriptCardRole::Grep,
        ToolCapability::Find => TranscriptCardRole::Find,
        ToolCapability::ListFiles => TranscriptCardRole::ListFiles,
        ToolCapability::Subagents => TranscriptCardRole::SubagentBatch,
        ToolCapability::Web => TranscriptCardRole::Tool,
        ToolCapability::AstGrep => TranscriptCardRole::AstGrep,
    }
}

#[test]
fn canonical_capabilities_and_dispatch_aliases_use_expected_card_routes() {
    for capability in all_tool_capabilities() {
        let names = std::iter::once(capability.canonical_name())
            .chain(capability.aliases().iter().copied());
        for (index, name) in names.enumerate() {
            assert_eq!(
                ToolCapability::from_dispatch_name(name),
                Some(capability),
                "dispatch name {name:?}"
            );
            let state = linked_tool_state(
                &format!("route-{capability:?}-{index}"),
                name,
                name,
                ActivityStatus::Running,
                Vec::new(),
                "pending",
            );
            assert_eq!(
                project_cards(&state)[0].role,
                expected_card_role(capability),
                "dispatch name {name:?} capability {capability:?}"
            );
        }
    }
}

#[test]
fn dynamic_mcp_and_unknown_tool_names_remain_generic() {
    for name in [
        "mcp__server__custom_tool",
        "mcp__server__subagents",
        "ast-grep",
        "web-search",
    ] {
        let state = linked_tool_state(
            &format!("unknown-{name}"),
            name,
            name,
            ActivityStatus::Running,
            Vec::new(),
            "pending",
        );
        assert_eq!(
            project_cards(&state)[0].role,
            TranscriptCardRole::Tool,
            "{name}"
        );
    }
}