weavatrix-rust 2.2.0

Protocol-independent Rust repository intelligence: typed evidence graphs for impact, architecture, APIs, Git, search, and memory
Documentation
#![cfg(all(
    feature = "clone",
    feature = "git",
    feature = "lang-rust",
    feature = "memory",
    feature = "search",
    feature = "semantic",
    feature = "vector"
))]

mod support;

use blazingly_json::{Value, json};
use support::GitFixture;
use weavatrix_rust::{Weavatrix, tools};

#[test]
fn offline_audit_exposes_no_vulnerability_or_malware_surface() {
    let fixture = GitFixture::new();
    fixture.write(
        "src/main.js",
        "export function main() { return 'offline health only'; }\n",
    );
    fixture.commit("offline");
    let mut engine = Weavatrix::open(&fixture.root).unwrap();

    let definition = tools::catalog()
        .into_iter()
        .find(|tool| tool.name == "run_audit")
        .expect("run_audit stays available for offline repository health");
    assert_no_security_surface(&definition.input_schema);

    let report = tools::call(
        &mut engine,
        "run_audit",
        json!({"max_findings": 20, "include_malware_scan": true}),
    )
    .expect("legacy security arguments must not re-enable an offline scanner");
    assert_no_security_surface(&report);
}

fn assert_no_security_surface(value: &Value) {
    const FORBIDDEN: &[&str] = &["malware", "vulnerab", "advisory", "osv"];
    match value {
        Value::Object(entries) => {
            for (key, nested) in entries {
                let normalized = key.to_ascii_lowercase();
                assert!(
                    !FORBIDDEN.iter().any(|term| normalized.contains(term)),
                    "offline tool surface contains forbidden security key {key}"
                );
                assert_no_security_surface(nested);
            }
        }
        Value::Array(items) => {
            for item in items {
                assert_no_security_surface(item);
            }
        }
        _ => {}
    }
}