Guide for contributors and developers working on Gentleman.Dots.
| Tool | Version | Purpose |
|---|---|---|
| Go | 1.21+ | Build the installer |
| Docker | Latest | Run E2E tests |
| Git | Latest | Version control |
git clone https://github.com/Gentleman-Programming/Gentleman.Dots.git
cd Gentleman.Dots/installer
go build -o gentleman-dots ./cmd/gentleman-installer
./gentleman-dotscd installer
go test ./... -vGentleman.Dots/
├── installer/ # Go TUI installer
│ ├── cmd/gentleman-installer/ # Entry point
│ ├── internal/
│ │ ├── system/ # OS detection, command execution
│ │ └── tui/ # Bubbletea screens, views, installer
│ └── e2e/ # Docker-based E2E tests
├── skills/ # Repository-specific AI skills
│ ├── setup.sh # Sync script for AI assistants
│ └── */SKILL.md # Individual skills
├── GentlemanNvim/ # Neovim configuration
├── GentlemanFish/ # Fish shell config
├── GentlemanZsh/ # Zsh config
├── GentlemanNushell/ # Nushell config
├── GentlemanTmux/ # Tmux config
├── GentlemanZellij/ # Zellij config
├── docs/ # Documentation
└── AGENTS.md # Single source of truth for AI skills
The repository uses a skills system to provide context to AI assistants (Claude, Gemini, Copilot, etc.).
AGENTS.md is the master file. All other AI instruction files are generated from it.
# Interactive menu
./skills/setup.sh
# Generate all formats (CLAUDE.md, GEMINI.md, etc.)
./skills/setup.sh --all
# Individual targets
./skills/setup.sh --claude # CLAUDE.md
./skills/setup.sh --gemini # GEMINI.md
./skills/setup.sh --copilot # .github/copilot-instructions.md
./skills/setup.sh --codex # CODEX.mdNote: User-facing AI tool configs (skills, persona, themes) are now managed by gentle-ai.
| Type | Location | Purpose |
|---|---|---|
| Repository skills | skills/ |
For this codebase (bubbletea, trainer, etc.) |
- Load the skill-creator skill:
mcp_skill("skill-creator") - Create directory under
skills/ - Add
SKILL.mdfollowing the template - Register in
AGENTS.md - Run
./skills/setup.sh --all
Docker-based tests verify the installer works across different environments.
cd installer/e2e
# Interactive TUI menu
./docker-test.sh
# Run all E2E tests
./docker-test.sh e2e
# Run specific environment
./docker-test.sh e2e ubuntu
./docker-test.sh e2e debian
./docker-test.sh e2e fedora
./docker-test.sh e2e alpine
./docker-test.sh e2e termux
# Interactive shell for debugging
./docker-test.sh shell ubuntu| Environment | Shell | Package Manager | Tests |
|---|---|---|---|
| Ubuntu | bash | apt + Homebrew | Full E2E + backup |
| Debian | dash | apt + Homebrew | Basic + shell detection |
| Fedora | bash | dnf | Full E2E |
| Alpine | ash | apk | POSIX compatibility |
| Termux | sh | pkg (simulated) | Android/Termux specific |
Edit e2e_test.sh or e2e_test_termux.sh:
test_my_feature() {
log_test "My feature works"
if [ -f "$HOME/.config/myfile" ]; then
log_pass "Config file exists"
else
log_fail "Config file not found"
fi
}Tests must be POSIX-compliant (no bashisms).
cd installer
GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o gentleman-installer-darwin-amd64 ./cmd/gentleman-installer
GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o gentleman-installer-darwin-arm64 ./cmd/gentleman-installer
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o gentleman-installer-linux-amd64 ./cmd/gentleman-installer
GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o gentleman-installer-linux-arm64 ./cmd/gentleman-installergit tag v{VERSION}
git push origin v{VERSION}
gh release create v{VERSION} \
installer/gentleman-installer-darwin-amd64 \
installer/gentleman-installer-darwin-arm64 \
installer/gentleman-installer-linux-amd64 \
installer/gentleman-installer-linux-arm64 \
--title "v{VERSION}" \
--notes "## Changes
- Feature/fix description"# Get SHA256 for each binary
shasum -a 256 installer/gentleman-installer-*
# Update homebrew-tap/Formula/gentleman-dots.rb with new version and hashes
# Commit to both repos| Change Type | Version Bump | Example |
|---|---|---|
| New platform/major feature | Minor (x.Y.0) | v2.7.0 |
| Bug fixes, improvements | Patch (x.y.Z) | v2.6.2 |
| Breaking changes | Major (X.0.0) | v3.0.0 |
- Follow standard Go conventions
- Use
gofmtfor formatting - Table-driven tests preferred
- Error wrapping with context
- POSIX-compliant (no bashisms in tests)
- Use
shellcheckfor linting - Quote all variables
- Use tables for structured data
- Include Table of Contents for long docs
- Code examples for every feature