|
1 | | -# Dotfiles Development Rules |
| 1 | +# Development Rules |
2 | 2 |
|
3 | | -## Overview |
| 3 | +This file intentionally redirects to `./CLAUDE.md` for unified development guidelines. |
4 | 4 |
|
5 | | -This file provides master guidelines for working with this dotfiles repository. It complements detailed instructions in [CLAUDE.md](./CLAUDE.md). |
| 5 | +All development rules, coding standards, and workflow guidelines are maintained in `CLAUDE.md` to ensure consistency across different AI platforms. |
6 | 6 |
|
7 | | -## Core Principles |
8 | | - |
9 | | -### 1. Source of Truth |
10 | | -- **This dotfiles repo is the source of truth** for all configurations |
11 | | -- All changes must flow FROM here TO your home directory, not the reverse |
12 | | -- Never modify deployed configs directly - edit in the repo, then re-deploy |
13 | | - |
14 | | -### 2. Cross-Platform Consistency |
15 | | -- Scripts must work on: Windows 11, Linux (Ubuntu/Fedora/Arch), and macOS (Intel/Apple Silicon) |
16 | | -- Use platform detection (`detect_os` / `detect_distro`) to handle platform differences |
17 | | -- Test on at least 2 platforms before committing |
18 | | - |
19 | | -### 3. Idempotency |
20 | | -- Scripts must be safe to run multiple times |
21 | | -- Check before acting (don't overwrite if already exists) |
22 | | -- Use `cmd_exists` / `Get-Command` before using tools |
23 | | -- Verify installations before re-installing |
24 | | - |
25 | | -### 4. Graceful Degradation |
26 | | -- If a tool is missing, skip gracefully with warning |
27 | | -- Never fail silently - always inform the user of what was skipped |
28 | | -- Provide clear error messages with actionable steps |
29 | | - |
30 | | -### 5. Non-Destructive by Default |
31 | | -- Require explicit flags (`--force`, `-f`) for destructive operations |
32 | | -- Always create backups before overwriting files |
33 | | -- Default to dry-run mode where safe |
34 | | - |
35 | | -### 6. Security |
36 | | -- Never commit secrets, API keys, or credentials |
37 | | -- Use environment variables for sensitive data |
38 | | -- Validate all user inputs |
39 | | -- Never execute arbitrary code from untrusted sources |
40 | | - |
41 | | -## Development Workflow |
42 | | - |
43 | | -### Adding New Features |
44 | | -1. **Plan in AGENTS.md** before coding |
45 | | -2. Create tests first (TDD when appropriate) |
46 | | -3. Implement feature with error handling |
47 | | -4. Test on all supported platforms |
48 | | -5. Update documentation |
49 | | -6. Commit with conventional commit format |
50 | | - |
51 | | -### Adding New Tools |
52 | | -When adding a new tool to bootstrap/update-all: |
53 | | - |
54 | | -1. Add to appropriate `lib/common.sh` or `lib/config.ps1` helper functions |
55 | | -2. Add install check to bootstrap scripts (both Unix and Windows) |
56 | | -3. Add update check to update-all scripts |
57 | | -4. Add config option to `.dotfiles.config.yaml.example` |
58 | | -5. Add health check for tool in `healthcheck.sh/ps1` |
59 | | -6. Update documentation (README.md, this file) |
60 | | -7. Add tests for new tool |
61 | | - |
62 | | -### Adding New Config Files |
63 | | -1. Add to backup scripts (`backup.sh/ps1`) |
64 | | -2. Add to restore scripts (`restore.sh/ps1`) |
65 | | -3. Add to deploy scripts (`deploy.sh/ps1`) |
66 | | -4. Add to uninstall verification lists |
67 | | -5. Update documentation |
68 | | - |
69 | | -### Modifying Git Hooks |
70 | | -1. Keep hooks simple and focused |
71 | | -2. Don't make them block normal workflows |
72 | | -3. Always provide bypass options (git `--no-verify`) |
73 | | -4. Test hooks with various project types |
74 | | -5. Document bypass instructions in README |
75 | | - |
76 | | -## Code Quality Standards |
77 | | - |
78 | | -### Shell Scripts (Bash/Zsh) |
79 | | - |
80 | | -1. Use `set -e` for strict error handling |
81 | | -2. Use functions over one-liners for readability |
82 | | -3. Use descriptive variable names in UPPER_CASE |
83 | | -4. Use `# === Section Name ===` for section headers |
84 | | -5. Use consistent colors for output (defined in common.sh) |
85 | | -6. Quote all variables properly: `"$VAR"` |
86 | | -7. Check command existence before using: `if cmd_exists tool; then` |
87 | | - |
88 | | -### PowerShell Scripts |
89 | | - |
90 | | -1. Use approved verb-noun for function names |
91 | | -2. Use `param()` blocks for parameters |
92 | | -3. Use `Should -Be*` assertions in Pester tests |
93 | | -4. Use `try { } catch { }` for error handling |
94 | | -5. Use `Write-Host` with colors for output |
95 | | -6. Use `ErrorActionPreference` appropriately |
96 | | -7. Use `Get-Command` with `-ErrorAction SilentlyContinue` |
97 | | - |
98 | | -### Configuration Files |
99 | | - |
100 | | -1. Use YAML for configs (if applicable) |
101 | | -2. Provide `.example` files with all options |
102 | | -3. Document each option clearly |
103 | | -4. Use sensible defaults |
104 | | -5. Support environment variable overrides |
105 | | - |
106 | | -## Testing Standards |
107 | | - |
108 | | -### Unit Tests |
109 | | - |
110 | | -1. Test each function independently |
111 | | -2. Test error paths (missing tools, invalid input) |
112 | | -3. Test edge cases (empty strings, special characters) |
113 | | -4. Mock external dependencies where possible |
114 | | -5. Use descriptive test names: `test_function_name_situation` |
115 | | - |
116 | | -### Integration Tests |
117 | | - |
118 | | -1. Test complete workflows (bootstrap → deploy → healthcheck) |
119 | | -2. Test on clean environment (temporary directory) |
120 | | -3. Test error recovery (what happens if install fails?) |
121 | | -4. Test idempotency (run script twice) |
122 | | -5. Test rollback scenarios |
123 | | - |
124 | | -### Test Coverage Goals |
125 | | - |
126 | | -- Parameter parsing: 100% |
127 | | -- Platform detection: 100% |
128 | | -- Core functions: 80%+ |
129 | | -- Error handling paths: 70%+ |
130 | | -- Integration workflows: 100% |
131 | | - |
132 | | -## Documentation Standards |
133 | | - |
134 | | -### README.md |
135 | | - |
136 | | -1. Keep installation instructions current |
137 | | -2. Update feature lists when adding/removing |
138 | | -3. Document all environment variables |
139 | | -4. Update "What Gets Installed" table |
140 | | -5. Include troubleshooting section |
141 | | -6. Add examples for common use cases |
142 | | - |
143 | | -### Code Comments |
144 | | - |
145 | | -1. Comment complex logic (why, not just what) |
146 | | -2. Document non-obvious parameters |
147 | | -3. Reference relevant documentation URLs |
148 | | -4. Keep comments concise and relevant |
149 | | -5. Remove outdated comments |
150 | | - |
151 | | -## Error Handling |
152 | | - |
153 | | -### Display Format |
154 | | - |
155 | | -``` |
156 | | -[ERROR] Short, actionable description |
157 | | -[WARN] Potential issue that needs attention |
158 | | -[INFO] Informational message |
159 | | -[OK] Success message |
160 | | -``` |
161 | | - |
162 | | -### Error Messages |
163 | | - |
164 | | -1. Start with what failed: "Failed to install: neovim" |
165 | | -2. Include likely cause: "Scoop is not installed" |
166 | | -3. Provide clear solution: "Run: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser" |
167 | | -4. Never expose stack traces to users unless in debug mode |
168 | | -5. Include relevant file paths for troubleshooting |
169 | | - |
170 | | -### Exit Codes |
171 | | - |
172 | | -- `0`: Success |
173 | | -- `1`: General error |
174 | | -- `2`: Invalid arguments |
175 | | -- `124`: Timeout |
176 | | -- `126`: Command not found |
177 | | -- `127`: Command not executable |
178 | | - |
179 | | -## Platform-Specific Guidelines |
180 | | - |
181 | | -### Windows (PowerShell) |
182 | | - |
183 | | -1. Use `$env:VARIABLE` for environment variables |
184 | | -2. Use `Join-Path $path "subpath"` for path construction |
185 | | -3. Use `Split-Path $path -Parent` for directory extraction |
186 | | -4. Handle OneDrive Documents folder correctly |
187 | | -5. Use PowerShell 7+ features when available |
188 | | -6. Test in both Windows PowerShell and PowerShell 7 |
189 | | - |
190 | | -### Linux/macOS (Bash/Zsh) |
191 | | - |
192 | | -1. Use `[[ ]]` for string comparisons (POSIX compliant) |
193 | | -2. Use `command -v` instead of `which` (more portable) |
194 | | -3. Handle macOS Homebrew paths correctly (`/opt/homebrew` vs `/usr/local`) |
195 | | -4. Use `$HOME` instead of `~` in scripts (more reliable) |
196 | | -5. Use `chmod +x` for scripts before first use |
197 | | -6. Test on multiple distros if possible |
198 | | - |
199 | | -## Alias Guidelines |
200 | | - |
201 | | -### Naming Conventions |
202 | | - |
203 | | -- Git: `g` + abbreviation (`gs`, `gl`, `gp`, `gcm`) |
204 | | -- Docker: `d` + abbreviation (`ds`, `dx`, `dp`, `dc`) |
205 | | -- File ops: Single letter (`n`, `b`, `f`, `t`) |
206 | | -- Tools: Single letter if common (`m`, `ff`, `df`) |
207 | | - |
208 | | -### Cross-Platform Consistency |
209 | | - |
210 | | -- Same aliases must work on Bash, Zsh, and PowerShell |
211 | | -- Test alias on all platforms before committing |
212 | | -- Document platform-specific differences in comments |
213 | | -- Handle conflicts with built-in commands appropriately |
214 | | - |
215 | | -## Version Management |
216 | | - |
217 | | -### Pinning Packages |
218 | | - |
219 | | -1. Pin specific versions where stability matters |
220 | | -2. Use minimum version constraints for SDKs |
221 | | -3. Keep version in config file (`.dotfiles.config.yaml`) |
222 | | -4. Document reasons for version pinning |
223 | | - |
224 | | -### Updating Dependencies |
225 | | - |
226 | | -1. Always run tests after updates |
227 | | -2. Test backward compatibility |
228 | | -3. Provide migration guide if breaking changes |
229 | | -4. Update CHANGELOG or use Git commits for history |
230 | | - |
231 | | -## Security Considerations |
232 | | - |
233 | | -### Input Validation |
234 | | - |
235 | | -1. Validate all file paths |
236 | | -2. Sanitize environment variables |
237 | | -3. Validate configuration values |
238 | | -4. Reject obviously malicious inputs |
239 | | - |
240 | | -### Safe Defaults |
241 | | - |
242 | | -1. Don't enable auto-update by default |
243 | | -2. Don't expose debug mode to internet |
244 | | -3. Use secure defaults for SSH/Git config |
245 | | -4. Require explicit consent for destructive operations |
246 | | - |
247 | | -### Secret Management |
248 | | - |
249 | | -1. Never hardcode API keys |
250 | | -2. Use environment variables or secure storage |
251 | | -3. Exclude secrets from git (check `.gitignore`) |
252 | | -4. Provide example configs with placeholders |
253 | | - |
254 | | -## Performance |
255 | | - |
256 | | -### Parallel Execution |
257 | | - |
258 | | -1. Run independent operations in parallel where safe |
259 | | -2. Use appropriate parallelization for each platform: |
260 | | - - Bash: `&` background jobs, `wait` |
261 | | - - PowerShell: `Start-Job`, `Wait-Job` |
262 | | -3. Don't exceed system resources |
263 | | -4. Add timeouts to long-running operations |
264 | | - |
265 | | -### Caching |
266 | | - |
267 | | -1. Cache GitHub API responses in git-update-repos |
268 | | -2. Use local package caches where available |
269 | | -3. Cache tool availability checks |
270 | | -4. Respect cache TTLs and invalidation |
271 | | - |
272 | | -## When in Doubt |
273 | | - |
274 | | -1. Check existing patterns in the codebase |
275 | | -2. Review AGENTS.md for agent behavior guidelines |
276 | | -3. Ask for clarification if requirements are ambiguous |
277 | | -4. Prefer simpler, boring solutions over clever ones |
278 | | -5. Focus on maintainability over clever optimizations |
279 | | - |
280 | | -## Resources |
281 | | - |
282 | | -- [CLAUDE.md](./CLAUDE.md) - AI assistant instructions |
283 | | -- [AGENTS.md](./AGENTS.md) - Agent-specific behavior |
284 | | -- [GEMINI.md](./GEMINI.md) - Gemini-specific instructions |
285 | | -- [README.md](./README.md) - Usage documentation |
286 | | -- [tests/README.md](tests/README.md) - Testing guidelines |
| 7 | +--- |
287 | 8 |
|
| 9 | +**See:** [CLAUDE.md](./CLAUDE.md) |
0 commit comments