use std::time::Duration;
use crate::golden_doc;
use crate::output::{Doc, Role};
golden_doc!(regression, rollback_action, |p, cap| {
let s = p.section("Actions");
s.bullet("revert /etc/hosts");
});
golden_doc!(regression, sync_change, |p, cap| {
let s = p.section_or_collapse("Changed");
s.bullet("config drift detected in /etc/foo");
});
golden_doc!(regression, registry_change, |p, cap| {
let s = p.section("Registry changes");
s.bullet("module foo @ 1.2.3 → 1.2.4");
});
golden_doc!(regression, registry_added_pkg, |p, cap| {
let s = p.section_or_collapse("Added packages");
s.bullet("nodejs@20");
});
golden_doc!(regression, registry_file_map, |p, cap| {
let s = p.section("Files");
s.bullet("./foo.txt → /etc/foo.txt");
});
golden_doc!(regression, registry_script, |p, cap| {
let s = p.section_or_collapse("Scripts (will run)");
s.bullet("./post-install.sh");
});
golden_doc!(regression, compliance_added, |p, cap| {
let s = p.section_or_collapse("Added (1 check(s))");
s.bullet("hardening.firewall.enabled");
});
golden_doc!(regression, compliance_removed, |p, cap| {
let s = p.section_or_collapse("Removed (1 check(s))");
s.bullet("legacy.telnet.disabled");
});
golden_doc!(regression, compliance_changed_with_detail, |p, cap| {
let s = p.section_or_collapse("Changed (1)");
s.status(Role::Fail, "ssh.password-auth (Pass → Violation)")
.detail("sshd_config sets PasswordAuthentication=yes");
});
golden_doc!(regression, init_next_steps, |p, cap| {
let s = p.section("Next steps");
s.bullet("cfgd module create <name>");
s.bullet("cfgd profile create <name>");
s.bullet("cfgd apply");
});
golden_doc!(regression, config_origin_branch, |p, cap| {
let doc = Doc::new().heading("Configuration").section("Origins", |s| {
s.subsection("Primary", |o| {
o.kv("Url", "git@github.com:tj/dotfiles.git")
.kv("Type", "Git")
.kv("Branch", "main")
})
});
p.emit(doc);
});
golden_doc!(regression, config_reconcile_settings, |p, cap| {
let doc = Doc::new().heading("Configuration").section("Daemon", |s| {
s.subsection("Reconcile", |r| {
r.kv("Interval", "5m")
.kv("On change", "yes")
.kv("Auto apply", "yes")
})
.subsection("Sync", |y| y.kv("Interval", "10m"))
});
p.emit(doc);
});
golden_doc!(regression, profile_update_file, |p, cap| {
let s = p.section_or_collapse("Updated files");
s.bullet("/home/tj/.zshrc");
});
golden_doc!(regression, profile_restored_file, |p, cap| {
let s = p.section_or_collapse("Restored");
s.status(Role::Ok, "/home/tj/.gitconfig");
});
golden_doc!(regression, profile_removed_file, |p, cap| {
let s = p.section_or_collapse("Removed");
s.status(Role::Skipped, "/home/tj/.old-rc");
});
golden_doc!(regression, doctor_platform_skipped, |p, cap| {
let s = p.section("Doctor");
s.status(Role::Skipped, "macos-defaults")
.detail("not applicable on Linux");
});
golden_doc!(regression, doctor_check_failed, |p, cap| {
let s = p.section("Doctor");
s.status(Role::Fail, "shell-init").detail("file missing");
});
golden_doc!(regression, source_update_change, |p, cap| {
let s = p.section_or_collapse("Source updates");
s.bullet("dotfiles repo updated");
});
golden_doc!(regression, module_show_script, |p, cap| {
let s = p.section_or_collapse("Scripts");
s.bullet("./install.sh");
});
golden_doc!(regression, export_install_path, |p, cap| {
let s = p.section("Exported");
s.bullet("./build/feature/install.sh");
});
golden_doc!(regression, init_picker_options, |p, cap| {
let s = p.section("Available Profiles");
s.bullet("1. dev");
s.bullet("2. prod");
});
golden_doc!(regression, plan_then_apply_no_double_heading, |p, cap| {
p.heading("Apply");
p.kv_block([("Profile", "dev")]);
let s = p.section("Files");
s.status(Role::Ok, "Wrote /etc/hosts")
.duration(Duration::from_millis(50));
});
golden_doc!(regression, apply_results_stay_indented, |p, cap| {
p.heading("Apply");
let s = p.section("Files");
s.status(Role::Ok, "Wrote /etc/hosts");
s.status(Role::Warn, "Skipped /tmp/foo")
.detail("permission denied");
});
golden_doc!(regression, compliance_changed_with_role_status, |p, cap| {
let s = p.section_or_collapse("Changed (1)");
s.status(Role::Warn, "tmux (Pass → Warning)");
});
golden_doc!(regression, apply_aborted_uses_status, |p, cap| {
p.heading("Apply");
p.status_simple(Role::Skipped, "Aborted by user");
});
golden_doc!(regression, worked_example_config_show, |p, cap| {
let doc = Doc::new()
.heading("Configuration")
.kv_block([("File", "/etc/cfgd.yaml"), ("Profile", "dev")])
.section("Origins", |s| {
s.subsection("Primary", |o| {
o.kv("Url", "git@github.com:tj/dotfiles.git")
.kv("Type", "Git")
.kv("Branch", "main")
})
.subsection("Secondary", |o| {
o.kv("Url", "git@github.com:tj/work.git")
.kv("Type", "Git")
.kv("Branch", "main")
})
});
p.emit(doc);
});
golden_doc!(regression, worked_example_status, |p, cap| {
let doc = Doc::new()
.heading("Status")
.section("Last Apply", |s| {
s.kv_block([
("Time", "3m ago"),
("Profile", "dev"),
("Result", "12 succeeded, 0 failed"),
])
})
.section("Drift", |s| {
s.status_with(Role::Warn, "shell-config", |sf| {
sf.detail("file changed since apply").target("~/.zshrc")
})
.status_with(Role::Warn, "git-config", |sf| {
sf.detail("file changed since apply").target("~/.gitconfig")
})
})
.section("Modules", |s| {
s.status(Role::Ok, "base (3 files, 5 pkgs)")
.status(Role::Ok, "dev-tools (12 files, 18 pkgs)")
.status(Role::Warn, "shell-config (4 files, 0 pkgs)")
});
p.emit(doc);
});
golden_doc!(regression, worked_example_apply, |p, cap| {
p.heading("Apply");
p.kv_block([("Config", "/etc/cfgd.yaml"), ("Profile", "dev")]);
{
let sec = p.section_or_collapse("Files");
sec.status(Role::Ok, "Wrote /etc/hosts")
.duration(Duration::from_millis(0));
sec.status(Role::Warn, "Skipped /tmp/foo")
.detail("permission denied");
sec.status(Role::Ok, "Symlinked ~/.zshrc")
.duration(Duration::from_millis(0));
}
{
let sec = p.section_or_collapse("Packages");
sec.status(Role::Ok, "Installed nodejs@20")
.duration(Duration::from_millis(4100));
sec.status(Role::Ok, "Installed pnpm@8")
.duration(Duration::from_millis(1200));
}
p.status(Role::Ok, "5 actions applied")
.duration(Duration::from_millis(5400));
});
golden_doc!(regression, worked_example_compliance_diff, |p, cap| {
let doc = Doc::new()
.heading("Compliance Diff #4 → #5")
.kv_block([
("Snapshot 1", "2026-05-13 10:14:02 UTC"),
("Snapshot 2", "2026-05-14 09:02:11 UTC"),
])
.section_or_collapse("Added (2 check(s))", |s| {
s.bullet("hardening.firewall.enabled")
.bullet("hardening.audit.enabled")
})
.section_or_collapse("Removed (1 check(s))", |s| {
s.bullet("legacy.telnet.disabled")
})
.section_or_collapse("Changed (1 check(s))", |s| {
s.status_with(Role::Fail, "ssh.password-auth (Pass → Violation)", |sf| {
sf.detail("sshd_config sets PasswordAuthentication=yes")
})
});
p.emit(doc);
});
golden_doc!(regression, worked_example_init_next_steps, |p, cap| {
let next = p.section("Next steps");
next.bullet("cfgd module create <name> — create a module");
next.bullet("cfgd profile create <name> — create a profile");
next.bullet("cfgd apply — apply configuration");
});
golden_doc!(regression, module_list_table_styled_cells, |p, cap| {
use crate::output::renderer::Table;
let t = Table::new(["Module", "Source", "Status"])
.row_styled([
("git".to_string(), None),
("local".to_string(), None),
("installed".to_string(), None),
])
.row_styled([
("neovim".to_string(), None),
("remote".to_string(), Some(Role::Secondary)),
("pending".to_string(), Some(Role::Accent)),
]);
p.emit(Doc::new().heading("Modules").table(t));
});
golden_doc!(regression, sync_per_source_secondary_marker, |p, cap| {
let s = p.section("Sources");
s.status_simple(Role::Secondary, "Source: dotfiles");
s.status(Role::Ok, "'dotfiles' synced")
.detail("commit: abc1234");
s.status_simple(Role::Secondary, "Source: k8s-manifests");
s.status(Role::Fail, "Failed to sync 'k8s-manifests'")
.detail("network unreachable");
});
golden_doc!(regression, status_drift_secondary_suffix, |p, cap| {
let s = p.section("Drift");
s.status(
Role::Warn,
"file /etc/hosts — want: managed, have: external",
)
.label(Role::Secondary, "[team-config]");
});