Thanks for your interest in contributing to alohays/dotfiles.
- macOS 10.15+ or Linux (Debian/Ubuntu)
- Python 3.11+
- git
All tests use isolated temp-HOME sandboxes — they never touch your live ~/.dotfiles.
# Run the full test suite
python3 -m pytest tests/ -v
# Run a specific test file
python3 -m pytest tests/test_dotfiles_apply.py -v
# Run the integration QA suite (slower, tests bootstrap flows)
python3 -m pytest tests/test_install_qa.py -vbootstrap/install.sh -> Clone/update repo, dispatch to bin/dotfiles
bin/dotfiles -> CLI wrapper, routes to Python engine + shell tools
scripts/dotfiles.py -> Apply engine: profiles, symlinks, inventory, migration
scripts/sh/cli-lib.sh -> Shell utilities for the CLI (install-time only)
scripts/sh/tools.sh -> Agent tool installer with bulk --all support
scripts/sh/packages.sh -> Package tier installer (default, agents, visual)
scripts/sh/banner.sh -> Colored ASCII banner and status output
manifests/ -> Module registry (manifest.json)
profiles/ -> Profile definitions with inheritance (*.json)
modules/ -> Config payloads organized by concern
core/ -> Shell, git, base config (always included)
tmux/ -> Tmux configuration
nvim/ -> Neovim UI layer
visual/ -> Tmux theme, status bar
prompt/ -> Powerlevel10k, rich plugins
terminal/ -> WezTerm, Alacritty configs
ssh-server/ -> SSH-specific tweaks
manifest.jsondefines available modules- Profiles in
profiles/*.jsondeclare which modules to include, with inheritance viaextends - Auto-detection selects a profile based on OS and SSH status
- The apply engine creates symlinks from module files to
$HOME
The CLI uses DOTFILES_* environment variables for cross-layer coordination.
The --yolo flag is sugar that sets all four at once:
| Variable | Effect |
|---|---|
DOTFILES_PREFER_RICH |
Upgrade auto-detected profile to rich variant |
DOTFILES_ALL_PACKAGES |
Install all package tiers during install |
DOTFILES_ALL_TOOLS |
Install all agent tools during install |
DOTFILES_YES |
Auto-approve interactive prompts |
Other flags: DOTFILES_DRY_RUN, DOTFILES_SKIP_APPLY, DOTFILES_SKIP_TOOLS,
DOTFILES_NONINTERACTIVE. All default to 0 and follow the pattern
DOTFILES_VAR=${DOTFILES_VAR:-0}.
- Create
modules/<name>/home/with dotfiles to manage - Add an entry in
manifests/manifest.json - Add the module to relevant profiles in
profiles/*.json - Run tests to verify
- Use
#!/bin/shwith POSIX-compatible syntax (no bash-isms) - Quote all variable expansions
- Use
set -eufor scripts that run as entry points - Prefix internal functions with
_dotfiles_ordotfiles_
- Target Python 3.11+
- Use
from __future__ import annotationsfor modern type syntax - Raise
DotfilesErrorfor recoverable errors - Output JSON to stdout for machine-readable results
- Keep defaults close to upstream behavior
- No command-shadowing aliases in base profiles
- Agent-friendly first, human-friendly second
- All GitHub content (PRs, commits, issues) must be in English
- Create a feature branch from
main - Make your changes
- Run
python3 -m pytest tests/ -v— all tests must pass - Open a PR with a clear description of what and why