Thank you for your interest in contributing! This guide will help you get started.
- Check existing issues first to avoid duplicates
- Use the issue templates when available
- Include relevant information:
- macOS version
- Hardware (Apple Silicon or Intel)
- Error messages or logs
- Steps to reproduce
- Open an issue with the
enhancementlabel - Describe the feature and its benefits
- Include examples of how it would work
- Fork the repository and create your branch from
main - Follow the coding standards (see below)
- Add tests for new functionality
- Update documentation as needed
- Test your changes thoroughly
- Ensure all CI checks pass before requesting review
The main branch is protected with the following rules:
- No force pushes or deletions allowed
- Status checks must pass (tests, documentation validation, security scan)
- Pull request approval required (except for repository admin)
- Branches must be up to date before merging
See Branch Protection Guide for detailed information.
# Clone your fork
git clone https://github.com/YOUR_USERNAME/macbook-dev-setup.git
cd macbook-dev-setup
# Add upstream remote
git remote add upstream https://github.com/ORIGINAL_OWNER/macbook-dev-setup.git
# Create a feature branch
git checkout -b feature/your-feature-name- Keep commits focused and atomic
- Write clear commit messages following Conventional Commits
- Follow the existing code style
- Add comments for complex logic
We use Conventional Commits for consistent, semantic commit messages:
<type>(<scope>): <subject>
<body>
<footer>
Types:
feat: New featurefix: Bug fixdocs: Documentation changesstyle: Code style changes (formatting, etc.)refactor: Code refactoringperf: Performance improvementstest: Test additions or fixesbuild: Build system changesci: CI/CD changeschore: Other maintenance tasks
Scopes:
setup: Main setup scriptdotfiles: Dotfile configurationshomebrew: Package managementscripts: Component scriptsdocs: Documentationtests: Test suitevscode: VS Code configszsh: Shell configuration
Example:
git commit -m "feat(homebrew): add terraform to developer tools"Using Commitizen (optional):
# Install commitizen
pip install commitizen
# Make commits interactively
cz commitGit commit template:
# Set up the commit template
git config --local commit.template .gitmessage# Run the test suite
./tests/run_tests.sh
# Test dry-run mode
./setup.sh --dry-run
# Run health check
./scripts/health-check.sh
# Validate scripts with shellcheck
shellcheck scripts/*.sh
# Run pre-push validation (recommended before pushing)
./scripts/pre-push-check.shNote: GitHub Actions will run these same checks. Running them locally first saves time.
# Push to your fork
git push origin feature/your-feature-name
# Create a pull request via GitHub- Use bash with
#!/usr/bin/env bashshebang - Source common library for shared functions:
source "$(dirname "$0")/../lib/common.sh"
- Use meaningful variable names in UPPER_CASE for globals
- Quote variables to prevent word splitting:
"$variable" - Check command existence before using:
if command_exists brew; then # use brew fi
- Handle errors gracefully with appropriate messages
- Use color output functions from common.sh:
print_stepfor actionsprint_successfor successprint_errorfor errorsprint_warningfor warningsprint_infofor information
- Update README.md for user-facing changes
- Add inline comments for complex logic
- Document functions with usage examples
- Update CHANGELOG.md following Keep a Changelog format
- Write tests for new functions in
tests/ - Use the test framework functions:
describe "Feature Name" it "should do something" assert_equals "expected" "$actual" "Test description"
- Test edge cases and error conditions
- Ensure tests pass before submitting PR
├── lib/ # Shared libraries
│ ├── common.sh # Common functions
│ └── config.sh # Configuration parser
├── scripts/ # Individual setup scripts
├── tests/ # Test suite
├── config/ # Configuration files
├── docs/ # Documentation
└── homebrew/ # Package definitions
- Automated checks run via GitHub Actions
test- Full test suitevalidate-documentation- Markdown validationsecurity-scan- Secret detectionall-checks-pass- Summary check
- Manual review by maintainers
- Feedback addressed through commits
- Approval required before merging (1 reviewer minimum)
- All status checks must pass before merge is allowed
- ✅ Test on both Apple Silicon and Intel Macs if possible
- ✅ Keep backward compatibility in mind
- ✅ Update documentation alongside code
- ✅ Be respectful and constructive in discussions
- ✅ Follow the existing patterns and conventions
- ✅ Use conventional commit messages for clear history
- ✅ Update VERSION file for releases
- ❌ Don't commit sensitive information
- ❌ Don't break existing functionality
- ❌ Don't add unnecessary dependencies
- ❌ Don't ignore CI/CD failures
- ❌ Don't submit incomplete work
- ❌ Don't manually create releases (use Release Please)
Releases are automated using Release Please:
-
Commit with Conventional Commits - Your commits determine the version bump:
fix:bumps patch version (1.0.0 → 1.0.1)feat:bumps minor version (1.0.0 → 1.1.0)feat!:orBREAKING CHANGE:bumps major version (1.0.0 → 2.0.0)
-
Release Please creates a PR - Automatically when commits are pushed to main
-
Review and merge the release PR - This triggers:
- Version bump in VERSION and setup.sh
- CHANGELOG.md update
- Git tag creation
- GitHub release creation
-
No manual intervention needed - The process is fully automated
For manual version management during development:
# Check current version
cat VERSION
# Bump version interactively
cz bump
# Create a release commit
cz bump --changelogCurrent areas where contributions are especially welcome:
- Additional tool integrations
- Performance improvements
- Test coverage expansion
- Documentation improvements
- Accessibility enhancements
- Apple Silicon optimizations
- Open an issue for questions
- Check existing documentation
- Review similar PRs for examples
Contributors will be acknowledged in:
- The project README
- Release notes
- Git history
Thank you for helping make this project better! 🎉