Problem
Three Linux installer paths currently disagree with the behavior advertised by the CLI and documentation:
--dry-run still executes installation work.
- Kitty is accepted by the CLI and documented for Linux, but is hidden from the Linux TUI and is not installed by the Linux backend.
- Arch shell dependencies include packages that are not available to
pacman, aborting the installation.
Together, these make it difficult to preview or complete a supported Linux installation safely.
Reproduction
1. Dry-run executes real work
$ gentleman-dots --dry-run --non-interactive \
--terminal=none --shell=fish --wm=none
installer/cmd/gentleman-installer/main.go sets GENTLEMAN_DRY_RUN=1, but the execution wrappers do not read it. The non-interactive installer continues through dependency installation, repository cloning, configuration writes, and shell changes.
--test is not a safe substitute: it redirects HOME, but package-manager, sudo, network, and current-working-directory operations still run.
2. Kitty is unavailable in the Linux TUI
- Start the interactive installer on Linux.
- Select Linux.
- Open the terminal selection screen.
The available choices are Alacritty, WezTerm, Ghostty, and None. Kitty is only returned for macOS in installer/internal/tui/model.go.
However:
--terminal=kitty is accepted by the CLI;
- the learning screen lists Kitty on every platform;
- the documentation lists Kitty as a Linux-capable choice;
- the backend has a Kitty configuration branch.
On Linux, that backend does not install a missing Kitty binary and can log Kitty already installed even when it is absent.
3. Arch sends unavailable packages to pacman
Selecting Fish, Zsh, or Nushell on a clean Arch installation can send carapace to pacman; Zsh also sends zsh-theme-powerlevel10k. Those package names are not available from the official Arch repositories used by pacman, so the whole transaction exits with status 1.
This part overlaps the existing reports #174 and #176, the consolidated analysis in #174, and open PR #186. It is included here because it is part of the same Linux installer path and needs regression coverage alongside the mode/TUI fixes. The implementation should avoid duplicating or conflicting with #186.
Expected behavior
--dry-run performs no process, package-manager, network, filesystem, configuration, or shell mutations and prints the planned operations.
- Kitty appears as a Linux TUI option when the installer supports configuring it.
- On supported Linux distributions, a missing Kitty binary is installed through the platform package strategy, or the installer returns an accurate actionable precondition.
- Arch package transactions contain only packages resolvable by the selected package manager; optional external dependencies use an explicit supported fallback.
- Automated tests cover all three contracts.
Actual behavior
--dry-run only sets an environment variable and then executes the normal installation path.
- Linux users cannot select Kitty in the TUI, despite CLI/backend/documentation support.
- Arch shell installation can abort before later selected components run.
Environment and evidence
- OS: Arch Linux x86_64
- Installer: official Linux amd64 v2.12.2
- Verified against current
main installer structure
- Prior workaround required preinstalling the unavailable Arch dependencies before retrying the installer
Relevant source areas:
installer/cmd/gentleman-installer/main.go
installer/internal/system/exec.go
installer/internal/tui/model.go
installer/internal/tui/installer.go
installer/internal/tui/non_interactive.go
Proposed validation
- A marker-file command remains unexecuted under dry-run.
- Filesystem helpers and direct installer writes leave no artifacts under dry-run.
- Linux terminal option tests include Kitty.
- Platform tests verify the correct Kitty installation command per supported Linux distribution.
- Arch shell package tests verify that unresolved AUR-only names are never passed directly to
pacman.
Problem
Three Linux installer paths currently disagree with the behavior advertised by the CLI and documentation:
--dry-runstill executes installation work.pacman, aborting the installation.Together, these make it difficult to preview or complete a supported Linux installation safely.
Reproduction
1. Dry-run executes real work
installer/cmd/gentleman-installer/main.gosetsGENTLEMAN_DRY_RUN=1, but the execution wrappers do not read it. The non-interactive installer continues through dependency installation, repository cloning, configuration writes, and shell changes.--testis not a safe substitute: it redirectsHOME, but package-manager,sudo, network, and current-working-directory operations still run.2. Kitty is unavailable in the Linux TUI
The available choices are Alacritty, WezTerm, Ghostty, and None. Kitty is only returned for macOS in
installer/internal/tui/model.go.However:
--terminal=kittyis accepted by the CLI;On Linux, that backend does not install a missing Kitty binary and can log
Kitty already installedeven when it is absent.3. Arch sends unavailable packages to pacman
Selecting Fish, Zsh, or Nushell on a clean Arch installation can send
carapacetopacman; Zsh also sendszsh-theme-powerlevel10k. Those package names are not available from the official Arch repositories used bypacman, so the whole transaction exits with status 1.This part overlaps the existing reports #174 and #176, the consolidated analysis in #174, and open PR #186. It is included here because it is part of the same Linux installer path and needs regression coverage alongside the mode/TUI fixes. The implementation should avoid duplicating or conflicting with #186.
Expected behavior
--dry-runperforms no process, package-manager, network, filesystem, configuration, or shell mutations and prints the planned operations.Actual behavior
--dry-runonly sets an environment variable and then executes the normal installation path.Environment and evidence
maininstaller structureRelevant source areas:
installer/cmd/gentleman-installer/main.goinstaller/internal/system/exec.goinstaller/internal/tui/model.goinstaller/internal/tui/installer.goinstaller/internal/tui/non_interactive.goProposed validation
pacman.