lean_ctx/core/benchmark_compare/
competitors.rs1use std::fmt;
2
3#[derive(Debug, Clone)]
4pub struct CompetitorProfile {
5 pub name: &'static str,
6 pub version: &'static str,
7 pub compression_pct: Option<f64>,
8 pub source: &'static str,
9 pub url: &'static str,
10 pub supports_search: bool,
11 pub supports_caching: bool,
12 pub supports_multi_mode: bool,
13 pub supports_session_memory: bool,
14 pub feature_count: usize,
15}
16
17impl fmt::Display for CompetitorProfile {
18 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19 write!(f, "{} ({})", self.name, self.version)
20 }
21}
22
23pub fn all_competitors() -> Vec<CompetitorProfile> {
24 vec![
25 CompetitorProfile {
26 name: "Raw file read",
27 version: "baseline",
28 compression_pct: Some(0.0),
29 source: "Baseline — no compression applied",
30 url: "",
31 supports_search: false,
32 supports_caching: false,
33 supports_multi_mode: false,
34 supports_session_memory: false,
35 feature_count: 1,
36 },
37 CompetitorProfile {
38 name: "Repomix",
39 version: "--compress",
40 compression_pct: Some(70.0),
41 source: "Repomix docs (Tree-sitter compress mode)",
42 url: "https://github.com/yamadashy/repomix",
43 supports_search: false,
44 supports_caching: false,
45 supports_multi_mode: false,
46 supports_session_memory: false,
47 feature_count: 3,
48 },
49 CompetitorProfile {
50 name: "aider /map",
51 version: "repo-map",
52 compression_pct: Some(85.0),
53 source: "aider docs (repo-map with ctags/tree-sitter)",
54 url: "https://aider.chat/docs/repomap.html",
55 supports_search: false,
56 supports_caching: true,
57 supports_multi_mode: false,
58 supports_session_memory: false,
59 feature_count: 4,
60 },
61 CompetitorProfile {
62 name: "codebase-memory-mcp",
63 version: "graph-queries",
64 compression_pct: Some(99.2),
65 source: "arXiv paper (graph-query extraction only)",
66 url: "https://github.com/nicobailey/codebase-memory-mcp",
67 supports_search: true,
68 supports_caching: true,
69 supports_multi_mode: false,
70 supports_session_memory: true,
71 feature_count: 5,
72 },
73 ]
74}
75
76pub fn competitor_count() -> usize {
77 all_competitors().len()
78}
79
80#[cfg(test)]
81mod tests {
82 use super::*;
83
84 #[test]
85 fn all_competitors_non_empty() {
86 let c = all_competitors();
87 assert!(c.len() >= 3);
88 }
89
90 #[test]
91 fn baseline_is_zero_compression() {
92 let c = all_competitors();
93 let baseline = c.iter().find(|p| p.name == "Raw file read").unwrap();
94 assert_eq!(baseline.compression_pct, Some(0.0));
95 }
96
97 #[test]
98 fn display_includes_version() {
99 let c = &all_competitors()[1];
100 let s = format!("{c}");
101 assert!(s.contains(c.version));
102 }
103}