repopilot 0.12.0

Local-first CLI for repository audit, architecture risk detection, baseline tracking, and CI-friendly code review.
Documentation
use crate::knowledge::model::{LanguageProfile, SupportLevel};
use serde::Serialize;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum KnowledgeCatalogSection {
    All,
    Languages,
    Frameworks,
    Runtimes,
    Paradigms,
    Rules,
}

#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
pub struct KnowledgeCatalogReport {
    pub summary: KnowledgeCatalogSummary,
    #[serde(skip_serializing_if = "Vec::is_empty")]
    pub languages: Vec<KnowledgeLanguageEntry>,
    #[serde(skip_serializing_if = "Vec::is_empty")]
    pub frameworks: Vec<KnowledgeNamedEntry>,
    #[serde(skip_serializing_if = "Vec::is_empty")]
    pub runtimes: Vec<KnowledgeNamedEntry>,
    #[serde(skip_serializing_if = "Vec::is_empty")]
    pub paradigms: Vec<KnowledgeNamedEntry>,
    #[serde(skip_serializing_if = "Vec::is_empty")]
    pub rules: Vec<KnowledgeRuleEntry>,
}

#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
pub struct KnowledgeCatalogSummary {
    pub languages: usize,
    pub frameworks: usize,
    pub runtimes: usize,
    pub paradigms: usize,
    pub rules: usize,
}

#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
pub struct KnowledgeLanguageEntry {
    pub id: String,
    pub name: String,
    pub support: String,
    pub extensions: Vec<String>,
    pub filenames: Vec<String>,
    pub aliases: Vec<String>,
}

impl KnowledgeLanguageEntry {
    pub(super) fn from_profile(language: &LanguageProfile) -> Self {
        Self {
            id: language.id.clone(),
            name: language.name.clone(),
            support: support_level_label(language.support).to_string(),
            extensions: language.extensions.clone(),
            filenames: language.filenames.clone(),
            aliases: language.aliases.clone(),
        }
    }
}

#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
pub struct KnowledgeNamedEntry {
    pub id: String,
    pub name: String,
}

#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
pub struct KnowledgeRuleEntry {
    pub rule_id: String,
    pub minimum_support: Option<String>,
    pub languages: Vec<String>,
    pub frameworks: Vec<String>,
    pub runtimes: Vec<String>,
    pub paradigms: Vec<String>,
    pub suppress_low_signal: bool,
    pub suppress_generated: bool,
    pub suppress_config: bool,
    pub overrides: usize,
}

pub(super) fn support_level_label(level: SupportLevel) -> &'static str {
    match level {
        SupportLevel::DetectOnly => "detect-only",
        SupportLevel::ImportAware => "import-aware",
        SupportLevel::ContextAware => "context-aware",
        SupportLevel::RuleAware => "rule-aware",
    }
}