515 lines
16 KiB
Markdown
515 lines
16 KiB
Markdown
# Claude.md - Alexander's Working Preferences
|
|
|
|
## Communication Style
|
|
|
|
**Explanation Level**: Provide detailed explanations with teaching moments. When helping with code or technical tasks, explain the context, reasoning, and trade-offs. Highlight learning opportunities and underlying concepts, not just the implementation.
|
|
|
|
**Decision Making**: Always ask first when there are multiple valid approaches or important decisions to make. Don't assume - get explicit input on architectural choices, library selections, or implementation strategies.
|
|
|
|
**Tone**: Professional and technical. Focus on facts and problem-solving. Avoid unnecessary superlatives or over-the-top validation.
|
|
|
|
## Code Style Standards
|
|
|
|
### General Formatting
|
|
- **Indentation**: 2 spaces (never tabs)
|
|
- **Line Length**: 80 characters maximum
|
|
- **Naming Conventions**: Follow language-standard conventions
|
|
- JavaScript/TypeScript: camelCase for variables/functions, PascalCase for classes
|
|
- Python: snake_case for functions/variables, PascalCase for classes
|
|
- C/Rust/Go: Follow respective language conventions
|
|
- Shell: snake_case for functions/variables, SCREAMING_SNAKE_CASE for constants
|
|
|
|
### Language-Specific Styles
|
|
|
|
#### Python
|
|
- Follow **PEP 8 strictly**
|
|
- Use type hints for function signatures
|
|
- Prefer list comprehensions over map/filter when readable
|
|
- Use f-strings for string formatting
|
|
- Follow strict 80-character line limit
|
|
|
|
#### JavaScript/TypeScript
|
|
- Follow **Standard/Airbnb** style guide
|
|
- Use const/let, never var
|
|
- Prefer arrow functions for callbacks
|
|
- Use async/await over raw promises
|
|
- Semicolons: follow Airbnb convention (use them)
|
|
|
|
#### Shell Scripts
|
|
- **POSIX sh compatible** - avoid bashisms
|
|
- Use `[ ]` not `[[ ]]`
|
|
- Avoid arrays and other bash-specific features
|
|
- Quote all variables: `"${var}"` not `$var`
|
|
- Use `command -v` instead of `which`
|
|
- Set `-eu` at minimum (errexit, nounset)
|
|
|
|
#### Systems Languages (C/Rust/Go)
|
|
- Follow language-standard conventions and idiomatic patterns
|
|
- C: Follow K&R or project-specific style
|
|
- Rust: Use rustfmt defaults, follow Rust API guidelines
|
|
- Go: Use gofmt, follow Effective Go
|
|
|
|
### Comments and Documentation
|
|
- **Minimal comments** - code should be self-documenting
|
|
- Only comment:
|
|
- Complex algorithms or non-obvious logic
|
|
- Important business decisions or constraints
|
|
- Workarounds for bugs in dependencies
|
|
- Performance-critical sections
|
|
- Avoid comments that just restate what code does
|
|
- When creating/updating documentation files (README, etc.): provide comprehensive documentation including architecture, examples, troubleshooting, and contributing guidelines
|
|
|
|
## Testing Philosophy
|
|
|
|
**Always write tests** for new functionality and when modifying existing code.
|
|
|
|
**Default workflow**: Follow the TDD Ping-Pong pattern (see TDD Workflow section below) where Claude writes tests first, then developer implements.
|
|
|
|
- Unit tests for individual functions/modules
|
|
- Integration tests for component interactions
|
|
- Follow testing conventions for each language:
|
|
- Python: pytest
|
|
- JavaScript/TypeScript: Jest or framework-specific tools
|
|
- Rust: built-in test framework
|
|
- Shell: shellcheck + manual testing
|
|
- Test edge cases but don't over-engineer for unlikely scenarios (pragmatic approach)
|
|
- Ensure tests pass before marking work complete
|
|
|
|
## Error Handling
|
|
|
|
**Pragmatic approach**: Handle likely errors and edge cases, but don't over-engineer for unlikely scenarios.
|
|
|
|
- Validate user inputs and external data
|
|
- Handle expected failure modes (network errors, missing files, etc.)
|
|
- Use appropriate error types for each language
|
|
- Provide helpful error messages
|
|
- Don't try to handle truly exceptional conditions that indicate bugs
|
|
|
|
## Git Workflow
|
|
|
|
### Commit Messages
|
|
Use **imperative semantic commit style** (Conventional Commits format):
|
|
|
|
```
|
|
type: PHASE - imperative description
|
|
|
|
Optional body with more details if needed.
|
|
```
|
|
|
|
Types:
|
|
- `feat:` - New feature
|
|
- `fix:` - Bug fix
|
|
- `docs:` - Documentation changes
|
|
- `refactor:` - Code refactoring
|
|
- `test:` - Adding or updating tests
|
|
- `chore:` - Maintenance tasks
|
|
- `perf:` - Performance improvements
|
|
|
|
TDD Phase Markers (used in title after type):
|
|
- `RED` - Failing test added
|
|
- `GREEN` - Implementation makes test pass
|
|
- `REFACTOR` - Code improvement, no behavior change
|
|
- `COMPLETE` - Feature complete with documentation updated
|
|
|
|
Examples (TDD Workflow):
|
|
- `test: RED - validate correct email format`
|
|
- `feat: GREEN - add email validation`
|
|
- `refactor: REFACTOR - clean up email validation tests`
|
|
- `refactor: REFACTOR - improve email validation implementation`
|
|
- `docs: COMPLETE - email validation feature`
|
|
|
|
Examples (Non-TDD):
|
|
- `feat: add user authentication system`
|
|
- `fix: resolve memory leak in parser`
|
|
- `docs: update installation instructions`
|
|
- `refactor: simplify error handling logic`
|
|
|
|
### Commit Workflow
|
|
- Review changes before committing
|
|
- Keep commits focused and atomic
|
|
- Run tests before committing
|
|
- Follow the conventional commit format strictly
|
|
|
|
## Security and Privacy
|
|
|
|
**Critical requirements** - always follow these:
|
|
|
|
1. **No secrets in code**: Never include API keys, passwords, tokens, or sensitive data
|
|
- Use environment variables
|
|
- Use secret management tools
|
|
- Add sensitive patterns to .gitignore
|
|
|
|
2. **Privacy-focused**:
|
|
- Minimize data collection
|
|
- Avoid unnecessary logging of user data
|
|
- Follow privacy-by-design principles
|
|
- Consider data retention and deletion
|
|
|
|
3. **Secure defaults**:
|
|
- Follow OWASP guidelines
|
|
- Prevent common vulnerabilities (SQL injection, XSS, CSRF, etc.)
|
|
- Use parameterized queries
|
|
- Validate and sanitize inputs
|
|
- Use secure random number generation
|
|
- Keep dependencies updated
|
|
|
|
## Technology Stack and Tools
|
|
|
|
### Primary Languages
|
|
- Shell/Bash (POSIX sh)
|
|
- Python
|
|
- JavaScript/TypeScript
|
|
- Systems languages (C/Rust/Go)
|
|
|
|
### Tools and Workflows
|
|
- **Editor**: neovim
|
|
- **Build tool**: make
|
|
- **Version control**: git (via gitea)
|
|
- **Containers**: Docker/Podman
|
|
- **CI/CD**: GitLab CI, GitHub Actions, or similar
|
|
- **OS**: Gentoo Linux
|
|
|
|
### Gentoo-Specific Priorities
|
|
|
|
When working on Gentoo-related tasks, prioritize:
|
|
|
|
1. **Efficiency**: Optimize for compile time, USE flags, and system performance
|
|
2. **Stability**: Prefer stable packages and well-tested configurations
|
|
3. **Minimalism**: Keep system minimal, avoid unnecessary dependencies
|
|
|
|
Guidelines:
|
|
- Carefully consider USE flag implications
|
|
- Document USE flag choices and reasoning
|
|
- Prefer stable (~amd64) unless testing is needed
|
|
- Minimize package.use/package.mask complexity
|
|
- Consider compile-time vs runtime dependencies
|
|
- Optimize for system coherence
|
|
|
|
## File Organization
|
|
|
|
- Keep directory structures clean and logical
|
|
- Follow project-specific conventions when they exist
|
|
- Use meaningful file and directory names
|
|
- Prefer existing files over creating new ones
|
|
- Group related functionality together
|
|
|
|
## Workflow Preferences
|
|
|
|
- **Plan first**: Plan at project initialization and before each test cycle. Outline the approach, gather requirements, and clarify acceptance criteria before writing tests or code.
|
|
- **Incremental changes**: Make small, testable changes
|
|
- **Verify as you go**: Test each component before moving to the next
|
|
- **Clean up**: Remove debugging code, unused imports, etc.
|
|
- **Documentation**: Keep docs in sync with code changes
|
|
|
|
## When Unsure
|
|
|
|
- Ask questions rather than making assumptions
|
|
- Present options with trade-offs when multiple approaches exist
|
|
- Highlight risks or potential issues
|
|
- Seek clarification on requirements
|
|
- Don't proceed with partial information on critical decisions
|
|
|
|
## Anti-patterns to Avoid
|
|
|
|
- Over-engineering solutions
|
|
- Premature optimization
|
|
- Excessive abstraction
|
|
- Code comments that just restate the code
|
|
- Inconsistent naming
|
|
- Magic numbers without explanation
|
|
- Ignoring error conditions
|
|
- Committing secrets or sensitive data
|
|
- Breaking POSIX compatibility in shell scripts
|
|
- Exceeding 80-character line length
|
|
|
|
# TDD Ping-Pong Workflow
|
|
|
|
## Overview
|
|
Claude and the developer work together in a strict TDD ping-pong pattern. Claude writes tests, developer implements code to make them pass.
|
|
|
|
**This workflow applies to ALL projects unless explicitly overridden and takes precedence over general guidelines when there are conflicts.**
|
|
|
|
## Project Initialization (Claude Code - Plan Mode)
|
|
1. Create initial project structure and boilerplate
|
|
2. Set up build tools (Makefile, Dockerfile, etc.)
|
|
3. Create/update project-specific CLAUDE.md
|
|
4. Generate initial folder structure and workflows
|
|
5. First commit: "chore: initial project setup"
|
|
|
|
## TDD Cycle (Single Test at a Time)
|
|
|
|
### Step 1: Test Specification
|
|
**Developer says:** "Next feature: [description]"
|
|
|
|
**Claude asks:**
|
|
- What's the exact behavior to test?
|
|
- What are the acceptance criteria?
|
|
- Any edge cases to skip for now?
|
|
|
|
**Developer provides:** Clear requirements and boundaries
|
|
|
|
**Claude proposes:** The next single test (not full suite)
|
|
|
|
**Developer:** Approves, adjusts, or rejects proposed test
|
|
|
|
### Step 2: Red - Write Failing Test
|
|
**Claude writes:** ONE failing test for the smallest next increment
|
|
|
|
**Format:**
|
|
```
|
|
git commit -m "test: RED - [what behavior is being tested]"
|
|
```
|
|
|
|
Example: `test: RED - validate correct email format`
|
|
|
|
### Step 3: Green - Implement Feature
|
|
**Developer implements:** Minimum code to make the test pass
|
|
|
|
**Developer reports:** Brief explanation of implementation approach
|
|
|
|
**Format:**
|
|
```
|
|
git commit -m "feat: GREEN - [feature implemented]"
|
|
```
|
|
|
|
Example: `feat: GREEN - add email validation`
|
|
|
|
### Step 4: Refactor Tests
|
|
**Claude reviews:** Test code for improvements
|
|
- Remove duplication
|
|
- Extract fixtures/constants
|
|
- Improve readability
|
|
- Keep tests focused on behavior, not implementation
|
|
|
|
**Developer applies:** Suggested test refactoring
|
|
|
|
**Format:**
|
|
```
|
|
git commit -m "refactor: REFACTOR - [what was refactored in tests]"
|
|
```
|
|
|
|
Example: `refactor: REFACTOR - extract email test fixtures`
|
|
|
|
### Step 5: Refactor Implementation
|
|
**Claude reviews:** Implementation code for improvements
|
|
- Apply SOLID principles
|
|
- Remove duplication (DRY)
|
|
- Improve naming and structure
|
|
- Follow project conventions from CLAUDE.md
|
|
|
|
**Developer applies:** Suggested code refactoring
|
|
|
|
**Format:**
|
|
```
|
|
git commit -m "refactor: REFACTOR - [what was improved in implementation]"
|
|
```
|
|
|
|
Example: `refactor: REFACTOR - improve email regex readability`
|
|
|
|
### Step 6: Feature Checkpoint
|
|
When feature is complete, update project CLAUDE.md and all relevant documentation with:
|
|
- Patterns discovered
|
|
- Decisions made and why
|
|
- Project-specific conventions established
|
|
- Architecture updates
|
|
- API documentation changes
|
|
|
|
**Format:**
|
|
```
|
|
git commit -m "docs: COMPLETE - [feature name]"
|
|
git tag -a "feature-[name]-v1" -m "[brief description]"
|
|
```
|
|
|
|
Example: `docs: COMPLETE - email validation feature`
|
|
|
|
### Step 7: Return to Step 1
|
|
Move to next test/feature. Repeat cycle.
|
|
|
|
## Critical Rules
|
|
|
|
### For Claude (Test Writer)
|
|
1. **One test at a time** - Never write multiple tests in one cycle
|
|
2. **Propose before writing** - Always confirm the next test with developer
|
|
3. **Test behavior, not implementation** - Focus on public interfaces and contracts
|
|
4. **Stay minimal** - Test the smallest possible increment
|
|
5. **Context awareness** - Review recent commits and CLAUDE.md before suggesting tests
|
|
6. **No assumption** - Always ask for clarification if requirements are ambiguous
|
|
|
|
### For Developer (Implementation Writer)
|
|
1. **Minimum to pass** - Don't implement more than the test requires
|
|
2. **Explain approach** - Share implementation strategy before coding
|
|
3. **Challenge bad tests** - Push back if test is too large, brittle, or testing internals
|
|
4. **Time-box refactoring** - If refactoring takes >2x implementation time, stop
|
|
5. **Update CLAUDE.md** - Add learned patterns after each feature checkpoint
|
|
|
|
## Workflow Guards
|
|
|
|
### Red Flags
|
|
- Spending more time refactoring than implementing → Tests too coupled
|
|
- Tests breaking during refactoring → Tests too brittle
|
|
- Unclear when feature is "done" → Poor acceptance criteria
|
|
- Commits getting too large → Trying to do too much per cycle
|
|
- Tests passing without implementation changes → Test not actually testing behavior
|
|
|
|
### Quality Gates (Run Before Each Commit)
|
|
```bash
|
|
make lint # Code style checks
|
|
make test # All tests pass
|
|
make verify # Static analysis (if available)
|
|
```
|
|
|
|
## Git Commit Conventions
|
|
|
|
### Commit Message Format
|
|
```
|
|
<type>: <PHASE> - <description>
|
|
|
|
[optional body]
|
|
```
|
|
|
|
All commits follow semantic commit style with TDD phase markers in the title.
|
|
|
|
### Phase Markers
|
|
- `RED` - Failing test added (use with `test:` type)
|
|
- `GREEN` - Implementation makes test pass (use with `feat:` type)
|
|
- `REFACTOR` - Code improvement, no behavior change (use with `refactor:` type)
|
|
- `COMPLETE` - Feature complete with docs updated (use with `docs:` type)
|
|
|
|
### Other Types (when not in TDD cycle)
|
|
- `chore:` - Build, config, tooling changes
|
|
- `fix:` - Bug fix
|
|
- `perf:` - Performance improvements
|
|
|
|
## Architecture Principles (Apply During Refactoring)
|
|
|
|
### Always Follow
|
|
- **YAGNI** - You Aren't Gonna Need It
|
|
- **KISS** - Keep It Simple, Stupid
|
|
- **DRY** - Don't Repeat Yourself
|
|
- **SOLID** - Single responsibility, Open/closed, Liskov substitution, Interface segregation, Dependency inversion
|
|
- **Hexagonal Architecture** - Separate domain, ports, and adapters
|
|
|
|
### Code Review Focus
|
|
1. Is the code testable?
|
|
2. Are dependencies injected?
|
|
3. Is the interface clearly defined?
|
|
4. Can we swap implementations easily?
|
|
5. Does it follow project conventions?
|
|
|
|
## Session Management
|
|
|
|
### Starting a Session
|
|
Developer provides:
|
|
- Current project CLAUDE.md
|
|
- Last 3-5 commits
|
|
- Current feature/goal
|
|
- Where we are in the workflow
|
|
|
|
### Context Loss Recovery
|
|
If Claude seems lost:
|
|
1. Show recent test code
|
|
2. Show recent implementation
|
|
3. Point to relevant CLAUDE.md sections
|
|
4. Clarify current step in TDD cycle
|
|
|
|
### Between Sessions
|
|
Keep CLAUDE.md updated with:
|
|
- Current architectural decisions
|
|
- Patterns in use
|
|
- Conventions established
|
|
- Known limitations or technical debt
|
|
- Next planned features
|
|
|
|
## Adaptation
|
|
Project-specific CLAUDE.md can override or extend this workflow, but should explicitly state deviations. Default is always this TDD ping-pong pattern.
|
|
|
|
## Tool Integration
|
|
|
|
### Recommended Make Targets
|
|
```makefile
|
|
.PHONY: test
|
|
test:
|
|
# Run all tests
|
|
|
|
.PHONY: test-watch
|
|
test-watch:
|
|
# Auto-run tests on file changes
|
|
|
|
.PHONY: lint
|
|
lint:
|
|
# Run linters/formatters
|
|
|
|
.PHONY: verify
|
|
verify: lint test
|
|
# Full verification
|
|
|
|
.PHONY: tdd
|
|
tdd: test-watch
|
|
# Alias for TDD workflow
|
|
```
|
|
|
|
### Git Aliases (Optional)
|
|
```bash
|
|
git config alias.tdd-red '!f() { git commit -m "test: RED - $1"; }; f'
|
|
git config alias.tdd-green '!f() { git commit -m "feat: GREEN - $1"; }; f'
|
|
git config alias.tdd-refactor '!f() { git commit -m "refactor: REFACTOR - $1"; }; f'
|
|
git config alias.tdd-complete '!f() { git commit -m "docs: COMPLETE - $1"; }; f'
|
|
```
|
|
|
|
Usage:
|
|
```bash
|
|
git tdd-red "validate correct email format"
|
|
git tdd-green "add email validation"
|
|
git tdd-refactor "extract email test fixtures"
|
|
git tdd-complete "email validation feature"
|
|
```
|
|
|
|
## Example Session
|
|
|
|
```
|
|
Dev: "Let's implement user email validation. Keep it simple, basic format check."
|
|
|
|
Claude: "Understood. Testing that valid email format passes validation. Edge cases deferred. Writing test for valid email."
|
|
|
|
git commit -m "test: RED - validate correct email format"
|
|
|
|
Dev: "Implemented with regex. Test passes."
|
|
|
|
git commit -m "feat: GREEN - add email validation"
|
|
|
|
Claude: "Test looks good. Could extract test email to constant for reuse."
|
|
|
|
Dev: [applies suggestion]
|
|
|
|
git commit -m "refactor: REFACTOR - extract email test fixtures"
|
|
|
|
Claude: "Implementation works. Regex could use verbose mode with comments for maintainability."
|
|
|
|
Dev: [applies suggestion]
|
|
|
|
git commit -m "refactor: REFACTOR - improve email regex readability"
|
|
|
|
Claude: "Feature looks complete. Should I suggest documentation updates for the checkpoint?"
|
|
|
|
Dev: "Yes, update docs."
|
|
|
|
[Claude suggests docs updates, dev applies]
|
|
|
|
git commit -m "docs: COMPLETE - email validation feature"
|
|
git tag -a "email-validation-v1" -m "Basic email format validation"
|
|
|
|
Claude: "Next test: invalid email format should be rejected?"
|
|
|
|
Dev: "Yes, proceed."
|
|
|
|
[cycle repeats]
|
|
```
|
|
|
|
---
|
|
|
|
**This workflow is active for all projects. Follow it unless explicitly told otherwise.**
|
|
|
|
---
|
|
|
|
*Last updated: 2025-11-06*
|