cpmp 0.1.0

Computer Project Mapping Protocol — scanner, capability classification, projection, receipts.
Documentation
use crate::models::{DetectedCapability, Symbol};
use std::path::Path;

pub fn detect_capabilities(
    path: &Path, content: &str, _symbols: &[Symbol],
) -> Vec<DetectedCapability> {
    let mut detected = Vec::new();
    let capabilities = vec![
        "Genesis",
        "ggen",
        "Truex",
        "Receipt",
        "Replay",
        "Refusal",
        "Construct8",
        "Pair2",
        "RelationPage",
        "Need9",
        "Need257",
        "Shard",
        "Segment",
        "Corpus",
        "O*",
        "mu",
        "AtomVM",
        "Erlang",
        "WASM",
        "POWL",
        "OCEL",
        "PROV",
        "SHACL",
        "DCAT",
        "Field8",
        "Instinct8",
        "Doctor",
        "Wizard",
        "Telco",
    ];

    let path_str = path.to_string_lossy().to_string();
    for (line_idx, line) in content.lines().enumerate() {
        for cap in &capabilities {
            if line.contains(cap) {
                detected.push(DetectedCapability {
                    file_path: path_str.clone(),
                    capability: cap.to_string(),
                    matched_term: cap.to_string(),
                    name: cap.to_string(),
                    confidence: 0.9,
                    evidence_type: if path_str.contains("test") {
                        "TEST".to_string()
                    } else if path_str.ends_with(".md") {
                        "DOC".to_string()
                    } else {
                        "CODE".to_string()
                    },
                    classification: "LIVE".to_string(),
                    line_number: (line_idx + 1) as i64,
                });
            }
        }
    }
    detected
}