use std::path::PathBuf;
use trusty_mpm::core::{
catchup::{CatchupOptions, run_catchup},
claude_mpm_registry::{default_registry_path, discover_claude_mpm_projects},
};
use crate::commands::project::resolve_dir;
pub(crate) async fn handle_catchup(all_projects: bool, full: bool) -> anyhow::Result<()> {
let mut project_dirs: Vec<PathBuf> = vec![resolve_dir(None)?];
if all_projects {
let registry = default_registry_path();
match discover_claude_mpm_projects(®istry) {
Ok(extra) => {
for p in extra {
if !project_dirs.contains(&p) {
project_dirs.push(p);
}
}
}
Err(e) => {
eprintln!("warning: could not read claude-mpm registry: {e}");
}
}
}
let config = trusty_mpm::core::config::MpmConfig::load_default();
let memory_url = trusty_common::mcp::memory_rpc::resolve_memory_base_url_or_unreachable();
for dir in &project_dirs {
let opts = CatchupOptions {
project_dir: dir.clone(),
memory_url: memory_url.clone(),
include_git: config.catchup.include_git,
include_palace: config.catchup.include_palace,
git_limit: config.catchup.git_limit,
drawer_limit: config.catchup.drawer_limit,
full,
};
let context = run_catchup(&opts, false).await;
print!("{context}");
}
Ok(())
}
#[cfg(test)]
mod tests {
use tempfile::TempDir;
use trusty_mpm::core::native_session_finder::{find_paused_sessions, render_resume_context};
#[tokio::test]
async fn handle_catchup_no_sessions_produces_notice() {
let tmp = TempDir::new().unwrap();
let sessions = find_paused_sessions(tmp.path()).unwrap();
let rendered = render_resume_context(&sessions);
assert!(
rendered.contains("No paused sessions"),
"empty project should render notice: {rendered:?}"
);
}
#[tokio::test]
async fn handle_catchup_full_flag_is_accepted() {
let tmp = TempDir::new().unwrap();
let sessions = find_paused_sessions(tmp.path()).unwrap();
let rendered = render_resume_context(&sessions);
assert!(!rendered.is_empty());
}
}