weavatrix-rust 2.16.1

Protocol-independent Rust repository intelligence: typed evidence graphs for impact, architecture, APIs, Git, search, and memory
Documentation
mod agent_support;

use agent_support::{dump, engine};
use blazingly_json::json;
use weavatrix_rust::tools;

#[test]
fn ordinary_package_manifests_do_not_become_plugins() {
    let (_fixture, engine) = engine();
    assert!(
        engine
            .state()
            .graph()
            .nodes()
            .iter()
            .filter(|node| node.label == "agent-fixtures")
            .all(|node| node.kind.as_str() != "agent.plugin")
    );
}

#[test]
fn same_server_name_in_two_packages_stays_distinct() {
    let (_fixture, mut engine) = engine();
    let inventory = tools::call(&mut engine, "agent_inventory", json!({})).unwrap();
    let servers = inventory["mcp_servers"].as_array().unwrap();
    let search = servers
        .iter()
        .filter(|item| item["label"] == "search")
        .collect::<Vec<_>>();
    assert_eq!(search.len(), 2, "{}", dump(&inventory));
    assert_ne!(search[0]["id"], search[1]["id"]);
    let error = tools::call(&mut engine, "agent_trace", json!({"label": "search"})).unwrap_err();
    assert!(error.contains("ambiguous"), "{error}");
}

#[test]
fn portable_plugin_keeps_unknown_extensions_visible() {
    let (_fixture, mut engine) = engine();
    let inventory = tools::call(&mut engine, "agent_inventory", json!({})).unwrap();
    let plugins = dump(&inventory);
    assert!(plugins.contains("search-a"), "{plugins}");
    assert!(plugins.contains("com.example.client"), "{plugins}");
    let trace = tools::call(&mut engine, "agent_trace", json!({"label": "search-a"})).unwrap();
    let text = dump(&trace);
    assert!(text.contains("portable"), "{text}");
    assert!(text.contains("com.example.client"), "{text}");
}

#[test]
fn native_overlay_is_not_pretended_to_be_portable() {
    let (_fixture, mut engine) = engine();
    let inventory = tools::call(&mut engine, "agent_inventory", json!({})).unwrap();
    let plugins = inventory["plugins"]
        .as_array()
        .unwrap()
        .iter()
        .filter(|item| item["label"] == "lookup")
        .collect::<Vec<_>>();
    assert_eq!(plugins.len(), 1, "{}", dump(&inventory));
    assert_eq!(plugins[0]["profile"], "cursor");
    assert_ne!(plugins[0]["profile"], "portable");
}

#[test]
fn escaped_command_is_invalid_and_not_executed() {
    let (_fixture, mut engine) = engine();
    let inventory = tools::call(&mut engine, "agent_inventory", json!({})).unwrap();
    let escaped = inventory["mcp_servers"]
        .as_array()
        .unwrap()
        .iter()
        .find(|item| item["label"] == "escaped")
        .expect("escaped server");
    assert_eq!(escaped["completeness"], "invalid");
    assert_eq!(inventory["bounds"]["executed"], false);
}

#[test]
fn secret_headers_do_not_reach_inventory_labels() {
    let (_fixture, mut engine) = engine();
    let inventory = tools::call(&mut engine, "agent_inventory", json!({})).unwrap();
    let text = dump(&inventory);
    assert!(!text.contains("secret-token"), "{text}");
    assert!(
        !text.to_ascii_lowercase().contains("bearer secret"),
        "{text}"
    );
}

#[test]
fn agent_profile_exposes_the_three_domain_tools() {
    let catalog = tools::catalog_for_profile(tools::ToolProfile::Agent);
    let names = catalog.iter().map(|tool| tool.name).collect::<Vec<_>>();
    assert!(names.contains(&"agent_inventory"));
    assert!(names.contains(&"agent_trace"));
    assert!(names.contains(&"agent_context"));
    assert!(!names.contains(&"verified_change"));
}