verifyos-cli 0.13.1

AI agent-friendly Rust CLI for scanning iOS app bundles for App Store rejection risks before submission.
Documentation
use std::fs;
use std::path::PathBuf;

fn vscode_file(path: &str) -> String {
    fs::read_to_string(
        PathBuf::from(env!("CARGO_MANIFEST_DIR"))
            .join("editors")
            .join("vscode")
            .join(path),
    )
    .expect("vscode file should be readable")
}

#[test]
fn vscode_extension_launches_voc_lsp() {
    let package_json = vscode_file("package.json");
    let extension_ts = vscode_file("src/extension.ts");

    assert!(package_json.contains("\"version\": \"0.1.18\""));
    assert!(package_json.contains("\"icon\": \"assets/verifyOS_128x.png\""));
    assert!(package_json.contains("\"$(check)\""));
    assert!(package_json.contains("\"galleryBanner\""));
    assert!(package_json.contains("\"ai-agent\""));
    assert!(package_json.contains("\"viewsContainers\""));
    assert!(package_json.contains("\"verifyOS.explorer\""));
    assert!(package_json.contains("\"verifyOS.scanCurrentBundle\""));
    assert!(package_json.contains("\"verifyOS.generateHandoff\""));
    assert!(package_json.contains("\"verifyOS.restartLanguageServer\""));
    assert!(package_json.contains("\"verifyOS.showOutput\""));
    assert!(package_json.contains("\"verifyOS.path\""));
    assert!(package_json.contains("\"verifyOS.useBundledBinary\""));
    assert!(package_json.contains("\"verifyOS.profile\""));
    assert!(package_json.contains("\"verifyOS.outputDir\""));
    assert!(extension_ts.contains("[\"lsp\", \"--profile\", profile]"));
    assert!(extension_ts.contains("resolveBundledBinary(context)"));
    assert!(extension_ts.contains("Starting verifyOS language server via"));
    assert!(extension_ts.contains("registerTreeDataProvider(\"verifyOS.explorer\""));
    assert!(extension_ts.contains("verifyOS: generating handoff bundle"));
    assert!(extension_ts.contains("workbench.actions.view.problems"));
    assert!(extension_ts.contains("verifyOS could not start `voc lsp`"));
}

#[test]
fn vscode_extension_workflow_packages_and_publishes_vsix() {
    let package_json = vscode_file("package.json");
    let changelog = vscode_file("CHANGELOG.md");
    let workflow = fs::read_to_string(
        PathBuf::from(env!("CARGO_MANIFEST_DIR"))
            .join(".github")
            .join("workflows")
            .join("vscode-extension.yml"),
    )
    .expect("vscode workflow should be readable");

    assert!(package_json.contains("\"package\": \"vsce package --allow-missing-repository\""));
    assert!(changelog.contains("## 0.1.18"));
    assert!(changelog.contains("UX Refinement: Revert 'Start' button icons"));
    assert!(package_json.contains("\"publish:vsce\": \"vsce publish\""));
    assert!(package_json.contains("\"publish:ovsx\": \"ovsx publish\""));
    assert!(package_json.contains("\"assets/verifyOS_128x.png\""));
    assert!(workflow.contains("name: VS Code Extension"));
    assert!(workflow.contains("build-bundled-binaries"));
    assert!(workflow.contains("Build bundled binary (${{ matrix.label }})"));
    assert!(workflow.contains("cargo build --release --bin voc"));
    assert!(workflow.contains("vscode-binary-linux-x64"));
    assert!(workflow.contains("vscode-binary-win32-x64"));
    assert!(workflow.contains("vscode-binary-darwin-x64"));
    assert!(workflow.contains("vscode-binary-darwin-arm64"));
    assert!(workflow.contains("npm ci"));
    assert!(workflow.contains("Prepare bundled binary directory"));
    assert!(workflow.contains("npm run compile"));
    assert!(workflow.contains("npm run package -- --out \"$VSIX_NAME\""));
    assert!(workflow.contains("actions/upload-artifact@v4"));
    assert!(workflow.contains("vsce publish --packagePath"));
    assert!(workflow.contains("ovsx publish"));
}