agent-source-repository 0.1.0

Agent Source Repository local context registry for coding agents
Documentation
use super::{
    index_registered_repo, open_store, validate_repo_name, AsrError, AsrResult, RepoIndexAllOutput,
    RepoIndexFailure, RepoIndexOutput,
};

pub(crate) fn repo_index(name: &str) -> AsrResult<RepoIndexOutput> {
    validate_repo_name(name)?;
    let (paths, store) = open_store()?;
    let repo = super::require_repo(&store, name)?;
    index_registered_repo(&paths, &store, &repo)
}

pub(crate) fn repo_index_all() -> AsrResult<RepoIndexAllOutput> {
    let (paths, store) = open_store()?;
    let repos = store.list_repos()?;
    if repos.is_empty() {
        return Err(AsrError::new(
            "no_repos_registered",
            "No repositories are registered",
        ));
    }

    let mut indexed = Vec::new();
    let mut failures = Vec::new();
    for repo in repos {
        match index_registered_repo(&paths, &store, &repo) {
            Ok(output) => indexed.push(output),
            Err(err) => failures.push(RepoIndexFailure {
                repo: repo.name,
                code: err.code.to_string(),
                message: err.message,
                path: err.path,
            }),
        }
    }

    indexed.sort_by(|a, b| a.repo.cmp(&b.repo));
    failures.sort_by(|a, b| a.repo.cmp(&b.repo));

    Ok(RepoIndexAllOutput {
        ok: failures.is_empty(),
        indexed,
        failures,
    })
}