repopilot 0.10.0

Local-first CLI for repository audit, architecture risk detection, baseline tracking, and CI-friendly code review.
Documentation
use super::registration::{
    CODE_MARKER_RULES, FileAuditRegistration, LANGUAGE_RISK_RULES, file_metadata,
};
use crate::audits::architecture::large_file::LargeFileAudit;
use crate::audits::code_quality::code_markers::CodeMarkerAudit;
use crate::audits::code_quality::complexity::ComplexityAudit;
use crate::audits::code_quality::language_risk::LanguageRiskAudit;
use crate::audits::code_quality::long_function::LongFunctionAudit;
use crate::audits::code_quality::rust_panic_risk::RustPanicRiskAudit;
use crate::audits::security::private_key_candidate::PrivateKeyCandidateAudit;
use crate::audits::security::secret_candidate::SecretCandidateAudit;
use crate::audits::traits::FileAudit;
use crate::findings::types::FindingCategory;
use crate::scan::config::ScanConfig;

pub fn registered_file_audits(config: &ScanConfig) -> Vec<FileAuditRegistration> {
    let mut audits = vec![
        FileAuditRegistration::new(
            file_metadata(
                "audit.file.architecture.large-file",
                FindingCategory::Architecture,
                &["architecture.large-file"],
            ),
            Box::new(LargeFileAudit),
        ),
        FileAuditRegistration::new(
            file_metadata(
                "audit.file.code-quality.code-markers",
                FindingCategory::CodeQuality,
                CODE_MARKER_RULES,
            ),
            Box::new(CodeMarkerAudit),
        ),
        FileAuditRegistration::new(
            file_metadata(
                "audit.file.security.private-key-candidate",
                FindingCategory::Security,
                &["security.private-key-candidate"],
            ),
            Box::new(PrivateKeyCandidateAudit),
        ),
        FileAuditRegistration::new(
            file_metadata(
                "audit.file.code-quality.complexity",
                FindingCategory::CodeQuality,
                &["code-quality.complex-file"],
            ),
            Box::new(ComplexityAudit),
        ),
        FileAuditRegistration::new(
            file_metadata(
                "audit.file.code-quality.long-function",
                FindingCategory::CodeQuality,
                &["code-quality.long-function"],
            ),
            Box::new(LongFunctionAudit),
        ),
        FileAuditRegistration::new(
            file_metadata(
                "audit.file.language.rust-panic-risk",
                FindingCategory::CodeQuality,
                &["language.rust.panic-risk"],
            ),
            Box::new(RustPanicRiskAudit),
        ),
        FileAuditRegistration::new(
            file_metadata(
                "audit.file.language.runtime-risk",
                FindingCategory::CodeQuality,
                LANGUAGE_RISK_RULES,
            ),
            Box::new(LanguageRiskAudit),
        ),
    ];

    if config.detect_secret_like_names {
        audits.insert(
            2,
            FileAuditRegistration::new(
                file_metadata(
                    "audit.file.security.secret-candidate",
                    FindingCategory::Security,
                    &["security.secret-candidate"],
                ),
                Box::new(SecretCandidateAudit),
            ),
        );
    }

    audits
}

pub fn build_file_audits(config: &ScanConfig) -> Vec<Box<dyn FileAudit>> {
    registered_file_audits(config)
        .into_iter()
        .map(FileAuditRegistration::into_audit)
        .collect()
}