Skip to main content

lean_ctx/tools/
ctx_handoff.rs

1use std::path::Path;
2
3use crate::core::handoff_ledger::HandoffLedgerV1;
4
5pub fn format_created(path: &Path, ledger: &HandoffLedgerV1) -> String {
6    let wf = ledger.workflow.as_ref().map_or_else(
7        || "none".to_string(),
8        |w| format!("{}@{}", w.spec.name, w.current),
9    );
10    format!(
11        "ctx_handoff create\n path: {}\n md5: {}\n manifest_md5: {}\n workflow: {}\n evidence_keys: {}\n curated_refs: {}\n knowledge_facts: {}",
12        path.display(),
13        ledger.content_md5,
14        ledger.manifest_md5,
15        wf,
16        ledger.evidence_keys.len(),
17        ledger.curated_refs.len(),
18        ledger.knowledge.facts.len()
19    )
20}
21
22pub fn format_list(items: &[std::path::PathBuf]) -> String {
23    if items.is_empty() {
24        return "No handoff ledgers found.".to_string();
25    }
26    let mut lines = vec![format!("Handoff Ledgers ({}):", items.len())];
27    for (i, p) in items.iter().take(20).enumerate() {
28        lines.push(format!("  {}. {}", i + 1, p.display()));
29    }
30    lines.join("\n")
31}
32
33pub fn format_show(path: &Path, ledger: &HandoffLedgerV1) -> String {
34    let mut out = serde_json::to_string_pretty(ledger).unwrap_or_else(|_| "{}".to_string());
35    out.push('\n');
36    format!("ctx_handoff show\n path: {}\n{}", path.display(), out)
37}
38
39pub fn format_clear(removed: u32) -> String {
40    format!("ctx_handoff clear\n removed: {removed}")
41}
42
43pub fn format_exported(
44    path: Option<&Path>,
45    schema_version: u32,
46    bytes: usize,
47    privacy: &str,
48) -> String {
49    let mut out = format!(
50        "ctx_handoff export\n schema_version: {schema_version}\n privacy: {privacy}\n bytes: {bytes}",
51    );
52    if let Some(p) = path {
53        out.push_str(&format!("\n path: {}", p.display()));
54    }
55    out
56}
57
58pub fn format_imported(
59    path: &Path,
60    schema_version: u32,
61    imported_knowledge: u32,
62    contradictions: u32,
63    warning: Option<&str>,
64) -> String {
65    let mut out = format!(
66        "ctx_handoff import\n path: {path}\n schema_version: {schema_version}\n imported_knowledge: {imported_knowledge}\n contradictions: {contradictions}",
67        path = path.display(),
68    );
69    if let Some(w) = warning {
70        out.push_str(&format!("\n {w}"));
71    }
72    out
73}