#![cfg(not(target_os = "emscripten"))]
use anyhow::Result;
use clap::Subcommand;
use toolpath::v1::Document;
#[derive(Subcommand, Debug)]
pub enum ShowSource {
Claude {
#[arg(short, long)]
project: String,
#[arg(short, long)]
session: String,
},
Gemini {
#[arg(short, long)]
project: String,
#[arg(short, long)]
session: String,
},
Codex {
#[arg(short, long)]
session: String,
},
Opencode {
#[arg(short, long)]
session: String,
},
Pi {
#[arg(short, long)]
project: String,
#[arg(short, long)]
session: String,
#[arg(long)]
base: Option<std::path::PathBuf>,
},
}
pub fn run(source: ShowSource) -> Result<()> {
let path = derive_one(source)?;
let doc = Document::Path(path);
let opts = toolpath_md::RenderOptions {
detail: toolpath_md::Detail::Summary,
front_matter: false,
};
print!("{}", toolpath_md::render(&doc, &opts));
Ok(())
}
fn derive_one(source: ShowSource) -> Result<toolpath::v1::Path> {
match source {
ShowSource::Claude { project, session } => {
let manager = toolpath_claude::ClaudeConvo::new();
let convo = manager
.read_conversation(&project, &session)
.map_err(|e| anyhow::anyhow!("{}", e))?;
let cfg = toolpath_claude::derive::DeriveConfig {
project_path: Some(project),
include_thinking: false,
};
Ok(toolpath_claude::derive::derive_path(&convo, &cfg))
}
ShowSource::Gemini { project, session } => {
let manager = toolpath_gemini::GeminiConvo::new();
let convo = manager
.read_conversation(&project, &session)
.map_err(|e| anyhow::anyhow!("{}", e))?;
let cfg = toolpath_gemini::derive::DeriveConfig {
project_path: Some(project),
include_thinking: false,
};
Ok(toolpath_gemini::derive::derive_path(&convo, &cfg))
}
ShowSource::Codex { session } => {
let manager = toolpath_codex::CodexConvo::new();
let s = manager
.read_session(&session)
.map_err(|e| anyhow::anyhow!("{}", e))?;
let cfg = toolpath_codex::derive::DeriveConfig { project_path: None };
Ok(toolpath_codex::derive::derive_path(&s, &cfg))
}
ShowSource::Opencode { session } => {
let manager = toolpath_opencode::OpencodeConvo::new();
let s = manager
.read_session(&session)
.map_err(|e| anyhow::anyhow!("{}", e))?;
let cfg = toolpath_opencode::derive::DeriveConfig::default();
Ok(toolpath_opencode::derive::derive_path_with_resolver(
&s,
&cfg,
manager.resolver(),
))
}
ShowSource::Pi {
project,
session,
base,
} => {
let manager = if let Some(p) = base {
let resolver = toolpath_pi::PathResolver::new().with_sessions_dir(&p);
toolpath_pi::PiConvo::with_resolver(resolver)
} else {
toolpath_pi::PiConvo::new()
};
let s = manager
.read_session(&project, &session)
.map_err(|e| anyhow::anyhow!("{}", e))?;
let cfg = toolpath_pi::DeriveConfig::default();
Ok(toolpath_pi::derive::derive_path(&s, &cfg))
}
}
}