agent-memgc 1.0.2

High-performance linter, cache-layout optimizer, and generational mark-and-sweep garbage collector for AI agent instruction files (AGENTS.md, CLAUDE.md, .cursorrules) in Rust.
Documentation
use crate::domain::finding::LinterFinding;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InstructionBlock {
    pub line_start: usize,
    pub line_end: usize,
    pub heading: Option<String>,
    pub text: String,
    pub backticked_paths: Vec<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LinterReport {
    pub target_file: String,
    pub total_lines: usize,
    pub findings: Vec<LinterFinding>,
    pub errors_count: usize,
    pub warnings_count: usize,
    pub info_count: usize,
    pub estimated_wasted_tokens: usize,
    pub cache_clean: bool,
}

impl LinterReport {
    pub fn new(target_file: String, total_lines: usize, findings: Vec<LinterFinding>) -> Self {
        let mut errors = 0;
        let mut warnings = 0;
        let mut infos = 0;
        let mut wasted_tokens = 0;
        let mut cache_clean = true;

        for f in &findings {
            match f.severity {
                crate::domain::finding::Severity::Error => errors += 1,
                crate::domain::finding::Severity::Warning => warnings += 1,
                crate::domain::finding::Severity::Info => infos += 1,
            }

            match f.rule {
                crate::domain::finding::RuleCode::MGC001 => wasted_tokens += 25,
                crate::domain::finding::RuleCode::MGC002 => wasted_tokens += 60,
                crate::domain::finding::RuleCode::MGC003 => cache_clean = false,
                crate::domain::finding::RuleCode::MGC004 => wasted_tokens += 35,
            }
        }

        Self {
            target_file,
            total_lines,
            findings,
            errors_count: errors,
            warnings_count: warnings,
            info_count: infos,
            estimated_wasted_tokens: wasted_tokens,
            cache_clean,
        }
    }

    pub fn has_errors(&self) -> bool {
        self.errors_count > 0
    }
}