--- name: git-best-practices description: Git best practices for ensuring proper .gitignore setup and git workflow management. Use this skill when initializing new projects, working with package managers (npm, pip, etc.), or making git commits. --- # Git Best Practices Skill This skill provides comprehensive guidelines for proper git workflow management, with a focus on `.gitignore` setup and preventing accidental commits of unwanted files. ## .gitignore Management ### Critical: Always Check Before Initializing Package Managers **BEFORE** initializing npm, pip, poetry, cargo, or any other package manager: 1. **Check if `.gitignore` exists**: Use `ls -la .gitignore` or check via file system 2. **If `.gitignore` doesn't exist**: Create it with appropriate patterns for your project type 3. **If `.gitignore` exists**: Verify it includes the necessary patterns for your package manager 4. **After creating/updating `.gitignore`**: Verify it's working with `git status` to ensure ignored files don't appear ### Required Patterns by Project Type #### Node.js / npm / yarn / pnpm ``` node_modules/ npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* .pnpm-store/ ``` #### Python / pip / poetry ``` __pycache__/ *.py[cod] *$py.class *.so .Python env/ venv/ ENV/ env.bak/ venv.bak/ .venv pip-log.txt pip-delete-this-directory.txt .pytest_cache/ .coverage htmlcov/ *.egg-info/ dist/ build/ ``` #### Rust / cargo ``` target/ Cargo.lock ``` #### Go ``` *.exe *.exe~ *.dll *.so *.dylib *.test *.out go.work ``` #### Java / Maven / Gradle ``` *.class *.log *.jar *.war *.ear target/ build/ .gradle/ .idea/ *.iml ``` ### Universal Patterns (All Projects) These should be included in every `.gitignore`: ``` # Environment files .env .env.local .env.*.local .env.development .env.production .env.test *.env # Build outputs dist/ build/ .next/ out/ *.tsbuildinfo # OS files .DS_Store .DS_Store? ._* .Spotlight-V100 .Trashes ehthumbs.db Thumbs.db Desktop.ini # Logs *.log logs/ npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* # Editor files (optional - include if not using shared IDE config) .idea/ .vscode/ *.swp *.swo *~ .project .classpath .settings/ # Temporary files *.tmp *.temp .cache/ ``` ## Git Workflow Best Practices ### Before Committing 1. **Always check `git status`** before committing to see what will be committed: ```bash git status ``` 2. **Review the output carefully**: - Ensure no sensitive files are staged (`.env`, secrets, API keys) - Verify `node_modules/` or other build artifacts aren't included - Check that only intended files are staged 3. **If unwanted files appear**: - Check if `.gitignore` exists and has the correct patterns - Update `.gitignore` if needed - Remove files from staging: `git reset HEAD ` - Verify with `git status` again ### Commit Message Format Use the existing project format: ``` feat: TASK-{id} - {description} ``` Examples: - `feat: TASK-123 - Add user authentication` - `feat: TASK-456 - Fix memory leak in data processor` ### Never Commit - **Sensitive files**: `.env`, `.env.local`, any file containing secrets, API keys, passwords - **Build artifacts**: `node_modules/`, `dist/`, `build/`, compiled binaries - **OS files**: `.DS_Store`, `Thumbs.db` - **Large binary files**: Unless using Git LFS (Large File Storage) - **IDE-specific files**: Unless the project explicitly includes them in version control ### Verifying .gitignore Effectiveness After creating or updating `.gitignore`: 1. Run `git status` to see what files git is tracking 2. If ignored files still appear, they may have been previously tracked: ```bash # Remove from git cache (but keep local files) git rm --cached # Or for directories: git rm -r --cached ``` 3. Commit the removal: `git commit -m "chore: Remove tracked files that should be ignored"` 4. Verify again with `git status` ## Project-Specific Considerations ### When Initializing a New Project 1. Create `.gitignore` **before** running `npm init`, `pip install`, etc. 2. Include patterns for your package manager 3. Initialize git: `git init` (if not already initialized) 4. Verify `.gitignore` is working before proceeding ### When Adding New Dependencies 1. Check `git status` after installing packages 2. Ensure new build artifacts are ignored 3. If new file types appear, update `.gitignore` accordingly ### When Working with Multiple Languages If a project uses multiple languages/frameworks, include patterns for all of them: - Node.js + Python: Include both `node_modules/` and `__pycache__/` - React + Python backend: Include `.next/` or `dist/` plus Python patterns ## Quick Reference Checklist Before committing: - [ ] `.gitignore` exists and is appropriate for the project type - [ ] Ran `git status` and reviewed output - [ ] No sensitive files (`.env`, secrets) are staged - [ ] No build artifacts (`node_modules/`, `dist/`, etc.) are staged - [ ] Commit message follows format: `feat: TASK-{id} - {description}` - [ ] `.gitignore` is working correctly (ignored files don't appear in `git status`) ## Common Mistakes to Avoid 1. **Initializing package managers before creating `.gitignore`** - This can lead to `node_modules/` or similar directories being tracked 2. **Assuming `.gitignore` works retroactively** - Files already tracked by git will continue to be tracked even if added to `.gitignore` - Use `git rm --cached` to untrack them 3. **Committing without checking `git status`** - Always verify what you're committing 4. **Including sensitive data in commits** - Double-check for `.env` files, API keys, passwords - If accidentally committed, use `git reset` or `git commit --amend` (if not pushed) 5. **Forgetting project-specific patterns** - Different projects need different `.gitignore` patterns - Tailor the `.gitignore` to the project's technology stack ## Pre-Commit Checklist Before committing, verify: - [ ] TypeScript compilation passes (`npx tsc --noEmit`) - [ ] No console errors in browser testing - [ ] All success criteria verified - [ ] Progress.txt updated ## Pre-Commit Hooks Consider adding pre-commit hooks for: - TypeScript compilation check - Linter checks - Test execution Document hook setup in project README if implemented. ## Pre-Commit Validation **Run TypeScript compilation check before commit:** ```bash # Before committing, verify compilation npx tsc --noEmit # If errors exist, fix them before committing ``` **Verify no console errors:** ```bash # Check for console errors in browser agent-browser console | grep -i "error" # Or check build output npm run build 2>&1 | grep -i "error" ``` **Check git status before staging:** ```bash # Always check what will be committed git status # Review changes git diff # Stage only relevant files git add src/scenes/GameScene.ts ``` **Review changes with git diff:** ```bash # Review all changes git diff # Review staged changes git diff --staged # Review specific file git diff src/scenes/GameScene.ts ``` ## Commit Message Patterns **Format: "feat: TASK-ID - Description"** ```bash # Examples git commit -m "feat: US-033 - Add wizard character sprite" git commit -m "feat: US-034 - Implement timer countdown" git commit -m "feat: US-035 - Add scene transition animations" ``` **Include task ID for traceability:** ```bash # Always include task ID git commit -m "feat: TASK-{id} - {description}" # Examples git commit -m "feat: US-036 - Fix maze generation error handling" ``` **Use conventional commit types:** ```bash # Types: feat, fix, chore, docs, refactor, test git commit -m "feat: US-037 - Add new feature" git commit -m "fix: US-038 - Fix bug" git commit -m "chore: US-039 - Update dependencies" ``` **Keep messages descriptive but concise:** ```bash # ✅ GOOD: Descriptive but concise git commit -m "feat: US-040 - Add coin collection sound effect" # ❌ BAD: Too vague git commit -m "feat: US-040 - Update code" # ❌ BAD: Too verbose git commit -m "feat: US-040 - Add coin collection sound effect that plays when player collects coin and updates score and triggers animation" ``` ## Workflow Patterns **Check git status before operations:** ```bash # Before any git operation, check status git status # See what files changed git status --short # See untracked files git status --untracked-files=all ``` **Stage only relevant files:** ```bash # Stage specific files git add src/scenes/GameScene.ts git add src/scenes/GameOverScene.ts # Don't stage everything # ❌ git add . # Only if you're sure ``` **Commit after verification passes:** ```bash # 1. Make changes # 2. Verify TypeScript compilation npx tsc --noEmit # 3. Verify browser testing agent-browser open http://localhost:3000 # 4. Stage files git add src/ # 5. Commit git commit -m "feat: TASK-ID - Description" ``` **Update progress.txt before commit:** ```bash # Update progress.txt with task completion echo "## Task Complete" >> tasks/progress.txt echo "- [x] All criteria met" >> tasks/progress.txt # Then commit git add tasks/progress.txt git commit -m "feat: TASK-ID - Description" ```