gitsem 0.5.1

Semantic search and spatial navigation for Git repositories — map, get, and grep for AI coding agents
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct SemanticMap {
    pub version: u8,
    pub clusters: Vec<Cluster>,
    #[serde(default)]
    pub edges: Vec<Edge>,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Edge {
    pub from: String,
    pub to: String,
    pub via: Vec<String>,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Cluster {
    pub name: String,
    pub description: String,
    pub description_embedding: Vec<f32>,
    pub chunks: Vec<ChunkRef>,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ChunkRef {
    pub file: String,
    pub start_line: usize,
    pub end_line: usize,
}

impl ChunkRef {
    pub fn display(&self) -> String {
        format!("{}:{}-{}", self.file, self.start_line, self.end_line)
    }

    pub fn parse(s: &str) -> Option<Self> {
        let (file, range) = s.rsplit_once(':')?;
        let (start, end) = range.split_once('-')?;
        Some(ChunkRef {
            file: file.to_string(),
            start_line: start.parse().ok()?,
            end_line: end.parse().ok()?,
        })
    }
}

impl SemanticMap {
    pub fn empty() -> Self {
        SemanticMap {
            version: 1,
            clusters: vec![],
            edges: vec![],
        }
    }
}