# dm `dm` is a Rust CLI for switching between dotfile themes by symlinking a selected theme tree into the matching locations under `$HOME`. ## Theme Layout Themes are discovered from subdirectories under `~/dotfiles/themes`. ```text ~/dotfiles/themes/ dracula/ .config/ alacritty/ alacritty.toml nvim/ init.lua .zshrc catppuccin/ .config/ alacritty/ alacritty.toml ``` The directory name is the theme name. The relative path inside the theme becomes the target path under `$HOME`. Examples: - `~/dotfiles/themes/dracula/.config/nvim/init.lua` → `~/.config/nvim/init.lua` - `~/dotfiles/themes/dracula/.zshrc` → `~/.zshrc` ## Commands ``` dm list ``` List all themes discovered under `~/dotfiles/themes`. ``` dm status ``` Show the active theme, when it was applied, and the number of tracked symlinks. Also reports any broken links. ``` dm apply [--dry-run] [--force] [--verbose] ``` Apply a theme by creating symlinks under `$HOME`. - `--dry-run` — print what would happen without making changes. - `--force` — overwrite unmanaged files (they are backed up first). - `--verbose` — print each action as it executes. On conflict (an unmanaged file would be overwritten), `apply` aborts with a clear error message. Use `--force` to allow it. On any mid-apply failure, all completed changes are rolled back automatically. ``` dm backup ``` Manually snapshot all currently managed files to `~/.config/theme-manager/backups//`. ``` dm rollback ``` Restore the backup set recorded in the last `apply` run, then clear state. Files that were newly created as symlinks (no prior content) are removed. ## State State is persisted to `~/.config/theme-manager/state.json`. Backups live under `~/.config/theme-manager/backups//`. ## Development ``` cargo build cargo run -- --help cargo test cargo fmt cargo clippy --all-targets --all-features -- -D warnings ``` Implementation order is tracked in [`TODO.md`](TODO.md).