vtcode 0.136.3

A Rust-based terminal coding agent with modular architecture supporting multiple LLM providers
#![cfg(unix)]
#![allow(missing_docs, clippy::expect_used)]

use assert_cmd::Command;
use std::fs;
use std::path::PathBuf;
use tempfile::TempDir;

fn create_fake_vtcode(temp_dir: &TempDir) -> PathBuf {
    let fake_vtcode = temp_dir.path().join("vtcode");
    let body = format!(
        "#!/bin/sh\n\
printf '%s\\n' \"$@\" > '{args_log}'\n\
pwd > '{cwd_log}'\n",
        args_log = temp_dir.path().join("vtcode-args.log").display(),
        cwd_log = temp_dir.path().join("vtcode-cwd.log").display(),
    );
    fs::write(&fake_vtcode, body).expect("write fake vtcode");

    use std::os::unix::fs::PermissionsExt;

    let mut permissions = fs::metadata(&fake_vtcode).expect("metadata").permissions();
    permissions.set_mode(0o755);
    fs::set_permissions(&fake_vtcode, permissions).expect("chmod");

    fake_vtcode
}

#[test]
fn check_script_delegates_ast_grep_to_vtcode_command() {
    let fake_bin = TempDir::new().expect("fake bin");
    let _fake_vtcode = create_fake_vtcode(&fake_bin);
    let current_path = std::env::var_os("PATH").unwrap_or_default();
    let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR"));

    let mut command = Command::new("bash");
    command
        .current_dir(&workspace)
        .arg("scripts/check.sh")
        .arg("ast-grep")
        .env("PATH", current_path)
        .env("VTCODE_CHECK_SCRIPT_VTCODE_BIN", fake_bin.path().join("vtcode"));

    command.assert().success();

    let args = fs::read_to_string(fake_bin.path().join("vtcode-args.log")).expect("read args log");
    assert_eq!(args.lines().collect::<Vec<_>>(), ["check", "ast-grep"]);

    let cwd = fs::read_to_string(fake_bin.path().join("vtcode-cwd.log")).expect("read cwd log");
    // `getcwd` may report a different path case than `CARGO_MANIFEST_DIR` on a
    // case-insensitive filesystem (e.g. macOS APFS), so compare case-insensitively.
    assert_eq!(cwd.trim().to_lowercase(), workspace.display().to_string().to_lowercase());
}