# CLI Standardization Ansible project to deploy a modern CLI environment (Fish + Starship + modern coreutils) to Arch and Ubuntu/Debian hosts. Includes optional Chezmoi dotfile orchestration. ## What it installs **Phase 1 — packages and config templates:** - **Fish shell** 4.x (PPA on Ubuntu, pacman on Arch) - **Starship** prompt (official binary installer) - **fzf** — fuzzy finder - **zoxide** — smarter cd - **bat** — cat with syntax highlighting - **eza** — modern ls - **fd** — modern find - **ripgrep** — fast grep - **fastfetch** — system info on login - **Fisher** plugin manager + plugins **Phase 2 — Chezmoi dotfile sync (opt-in):** - **Chezmoi** — dotfile manager synced from Gitea - Manages: Fish config, Starship, Ghostty, Zellij - Machine-type aware: servers skip Ghostty/Zellij configs ## Dev workflow ```bash # Lint ansible-lint playbook.yml # Syntax check ansible-playbook playbook.yml --syntax-check # Dry run ansible-playbook playbook.yml -i inventory.yml --check --diff # Deploy (Phase 1 only — default) ansible-playbook playbook.yml -i inventory.yml # Deploy with Chezmoi (Phase 2) ansible-playbook playbook.yml -i inventory.yml -e cli_modern_install_chezmoi=true -e cli_modern_chezmoi_repo=git@gitea:herbygitea/dotfiles.git ``` ## Role structure ``` roles/cli_modern/ ├── defaults/main.yml # All configurable variables ├── tasks/ │ ├── main.yml # Task dispatcher │ ├── packages-archlinux.yml # Arch/Manjaro packages │ ├── packages-debian.yml # Ubuntu/Debian packages + Fish PPA │ ├── starship.yml # Starship binary install │ ├── fisher.yml # Fisher + plugin sync │ ├── config.yml # Deploy config templates (Phase 1) │ ├── default-shell.yml # Set Fish as login shell │ └── chezmoi.yml # Chezmoi install + apply (Phase 2) └── templates/ ├── config.fish.j2 # Fish shell config ├── starship.toml.j2 # Starship prompt config └── fish_plugins.j2 # Fisher plugin list ``` ## Dotfiles repo (Phase 2) Separate repo at `/opt/projects/pbs-workshop/dotfiles/`, to be pushed to Gitea. Contains placeholder configs — replace with real dotfiles before enabling Chezmoi. ``` dotfiles/ ├── .chezmoi.toml.tmpl # Prompted config (name, email, machine type) ├── .chezmoiignore # Skips Ghostty/Zellij on servers ├── dot_config/ │ ├── fish/config.fish # PLACEHOLDER │ ├── fish/fish_plugins # Fisher plugin list │ ├── ghostty/config # PLACEHOLDER (workstations only) │ ├── starship.toml # PLACEHOLDER │ └── zellij/config.kdl # PLACEHOLDER (workstations only) ``` ## Configuration All options are in `roles/cli_modern/defaults/main.yml`. Override per-host in `host_vars/` or per-group in `group_vars/`. ### Phase 1 vs Phase 2 config management Phase 1 deploys Fish/Starship configs via Ansible templates. Phase 2 uses Chezmoi from a Git repo. When enabling Chezmoi, set the Phase 1 template flags to false to avoid conflicts: ```yaml cli_modern_deploy_fish_config: false cli_modern_deploy_starship_config: false cli_modern_install_chezmoi: true cli_modern_chezmoi_repo: "git@gitea:lovebug/dotfiles.git" cli_modern_chezmoi_machine_type: "workstation" # or "server" ```