use crate::checkpoint::{checkpoint_exists_with_workspace, load_checkpoint_with_workspace};
use crate::config::Config;
use crate::files::validate_prompt_md_with_workspace;
use crate::language_detector::detect_stack_summary;
use crate::logger::Logger;
use crate::workspace::Workspace;
use std::path::Path;
pub fn handle_dry_run(
logger: &Logger,
_colors: crate::logger::Colors,
config: &Config,
developer_agent: &str,
reviewer_agent: &str,
repo_root: &Path,
workspace: &dyn Workspace,
) -> anyhow::Result<()> {
logger.header("DRY RUN: Validation", crate::logger::Colors::cyan);
let validation =
validate_prompt_md_with_workspace(workspace, config.behavior.strict_validation, false);
validation.errors.iter().for_each(|err| logger.error(err));
validation
.warnings
.iter()
.for_each(|warn| logger.warn(&format!("{warn} (recommended)")));
if !validation.is_valid() {
anyhow::bail!("Dry run failed: PROMPT.md validation errors");
}
if validation.has_goal {
logger.success("PROMPT.md has Goal section");
}
if validation.has_acceptance {
logger.success("PROMPT.md has acceptance checks section");
}
if validation.is_perfect() {
logger.success("PROMPT.md validation passed with no warnings");
}
logger.success(&format!("Developer agent: {developer_agent}"));
logger.success(&format!("Reviewer agent: {reviewer_agent}"));
logger.success(&format!("Developer iterations: {}", config.developer_iters));
logger.success(&format!("Reviewer passes: {}", config.reviewer_reviews));
if checkpoint_exists_with_workspace(workspace) {
logger.info("Checkpoint found - can resume with --resume");
if let Ok(Some(cp)) = load_checkpoint_with_workspace(workspace) {
logger.info(&format!(" Phase: {}", cp.phase));
logger.info(&format!(" Progress: {}", cp.description()));
logger.info(&format!(" Saved at: {}", cp.timestamp));
}
}
logger.success(&format!(
"Detected stack: {}",
detect_stack_summary(repo_root)
));
logger.success("Dry run validation complete");
Ok(())
}