lean_ctx/tools/
ctx_handoff.rs1use std::path::Path;
2
3use crate::core::handoff_ledger::HandoffLedgerV1;
4
5pub fn format_created(path: &Path, ledger: &HandoffLedgerV1) -> String {
6 let wf = ledger
7 .workflow
8 .as_ref()
9 .map(|w| format!("{}@{}", w.spec.name, w.current))
10 .unwrap_or_else(|| "none".to_string());
11 format!(
12 "ctx_handoff create\n path: {}\n md5: {}\n manifest_md5: {}\n workflow: {}\n evidence_keys: {}\n curated_refs: {}\n knowledge_facts: {}",
13 path.display(),
14 ledger.content_md5,
15 ledger.manifest_md5,
16 wf,
17 ledger.evidence_keys.len(),
18 ledger.curated_refs.len(),
19 ledger.knowledge.facts.len()
20 )
21}
22
23pub fn format_list(items: &[std::path::PathBuf]) -> String {
24 if items.is_empty() {
25 return "No handoff ledgers found.".to_string();
26 }
27 let mut lines = vec![format!("Handoff Ledgers ({}):", items.len())];
28 for (i, p) in items.iter().take(20).enumerate() {
29 lines.push(format!(" {}. {}", i + 1, p.display()));
30 }
31 lines.join("\n")
32}
33
34pub fn format_show(path: &Path, ledger: &HandoffLedgerV1) -> String {
35 let mut out = serde_json::to_string_pretty(ledger).unwrap_or_else(|_| "{}".to_string());
36 out.push('\n');
37 format!("ctx_handoff show\n path: {}\n{}", path.display(), out)
38}
39
40pub fn format_clear(removed: u32) -> String {
41 format!("ctx_handoff clear\n removed: {removed}")
42}