use anyhow::{Context, Result};
use std::path::Path;
use crate::{config, frontmatter, sessions};
pub fn run(file: &Path) -> Result<()> {
if !file.exists() {
anyhow::bail!("file not found: {}", file.display());
}
let content = std::fs::read_to_string(file)
.with_context(|| format!("failed to read {}", file.display()))?;
let (updated_content, session_id) = frontmatter::ensure_session(&content)?;
if updated_content != content {
std::fs::write(file, &updated_content)
.with_context(|| format!("failed to write {}", file.display()))?;
eprintln!("Generated session UUID: {}", session_id);
}
let (fm, _body) = frontmatter::parse(&updated_content)?;
let resolved_claude_args = fm
.claude_args
.or_else(|| config::load().ok().and_then(|c| c.claude_args))
.or_else(|| std::env::var("AGENT_DOC_CLAUDE_ARGS").ok());
if !sessions::in_tmux() {
anyhow::bail!("not running inside tmux — start a tmux session first");
}
let pane_id = sessions::current_pane()?;
let file_str = file.to_string_lossy();
sessions::register(&session_id, &pane_id, &file_str)?;
eprintln!(
"Registered session {} → pane {}",
&session_id[..8],
pane_id
);
let mut first_run = true;
loop {
let mut cmd = std::process::Command::new("claude");
if let Some(ref args) = resolved_claude_args {
for arg in args.split_whitespace() {
cmd.arg(arg);
}
}
if !first_run {
cmd.arg("--continue");
eprintln!("Restarting claude (--continue)...");
} else {
eprintln!("Starting claude...");
}
let status = cmd.status().context("failed to run claude")?;
first_run = false;
let code = status.code().unwrap_or(1);
if code == 0 {
eprintln!("\nClaude exited cleanly.");
eprintln!("Press Enter to restart, or 'q' to exit.");
let mut input = String::new();
if std::io::stdin().read_line(&mut input).is_err() {
break;
}
if input.trim().eq_ignore_ascii_case("q") {
break;
}
first_run = true;
} else {
eprintln!(
"\nClaude exited with code {}. Auto-restarting in 2s...",
code
);
std::thread::sleep(std::time::Duration::from_secs(2));
}
}
eprintln!("Session ended for {}", file.display());
Ok(())
}