Add comprehensive development intelligence system that tracks: - Development sessions with automatic start/stop - Full conversation history with semantic search - Tool usage and file operation analytics - Think time and engagement analysis - Git activity correlation - Learning pattern recognition - Productivity insights and metrics Features: - FastAPI backend with SQLite database - Modern web dashboard with interactive charts - Claude Code hook integration for automatic tracking - Comprehensive test suite with 100+ tests - Complete API documentation (OpenAPI/Swagger) - Privacy-first design with local data storage 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
562 lines
12 KiB
Markdown
562 lines
12 KiB
Markdown
# Development Setup Guide
|
|
|
|
This guide covers setting up a local development environment for the Claude Code Project Tracker.
|
|
|
|
## Prerequisites
|
|
|
|
- **Python 3.8+** with pip
|
|
- **Git** for version control
|
|
- **Node.js 16+** (for web dashboard development)
|
|
- **SQLite3** (usually included with Python)
|
|
|
|
## Quick Setup
|
|
|
|
```bash
|
|
# Clone the repository
|
|
git clone <repository-url>
|
|
cd claude-tracker
|
|
|
|
# Create virtual environment
|
|
python -m venv venv
|
|
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
|
|
# Install dependencies
|
|
pip install -r requirements.txt
|
|
pip install -r requirements-dev.txt
|
|
|
|
# Initialize database
|
|
python -m app.database.init_db
|
|
|
|
# Run tests
|
|
pytest
|
|
|
|
# Start development server
|
|
uvicorn main:app --reload --host 0.0.0.0 --port 8000
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
claude-tracker/
|
|
├── main.py # FastAPI application entry point
|
|
├── requirements.txt # Production dependencies
|
|
├── requirements-dev.txt # Development dependencies
|
|
├── pytest.ini # Pytest configuration
|
|
├── .env.example # Environment variable template
|
|
├── app/ # Main application code
|
|
│ ├── __init__.py
|
|
│ ├── models/ # Database models
|
|
│ │ ├── __init__.py
|
|
│ │ ├── base.py # Base model class
|
|
│ │ ├── project.py # Project model
|
|
│ │ ├── session.py # Session model
|
|
│ │ └── ... # Other models
|
|
│ ├── api/ # API route handlers
|
|
│ │ ├── __init__.py
|
|
│ │ ├── dependencies.py # FastAPI dependencies
|
|
│ │ ├── sessions.py # Session endpoints
|
|
│ │ ├── conversations.py # Conversation endpoints
|
|
│ │ └── ... # Other endpoints
|
|
│ ├── database/ # Database management
|
|
│ │ ├── __init__.py
|
|
│ │ ├── connection.py # Database connection
|
|
│ │ ├── init_db.py # Database initialization
|
|
│ │ └── migrations/ # Schema migrations
|
|
│ ├── analytics/ # Analytics and insights engine
|
|
│ │ ├── __init__.py
|
|
│ │ ├── productivity.py # Productivity metrics
|
|
│ │ ├── patterns.py # Pattern analysis
|
|
│ │ └── reports.py # Report generation
|
|
│ └── dashboard/ # Web dashboard
|
|
│ ├── static/ # CSS, JS, images
|
|
│ ├── templates/ # HTML templates
|
|
│ └── routes.py # Dashboard routes
|
|
├── tests/ # Test suite
|
|
│ ├── __init__.py
|
|
│ ├── conftest.py # Pytest fixtures
|
|
│ ├── test_models.py # Model tests
|
|
│ ├── test_api.py # API tests
|
|
│ ├── test_analytics.py # Analytics tests
|
|
│ └── integration/ # Integration tests
|
|
├── config/ # Configuration files
|
|
├── docs/ # Documentation
|
|
├── data/ # Database files (created at runtime)
|
|
└── migrations/ # Database migrations
|
|
```
|
|
|
|
## Dependencies
|
|
|
|
### Core Dependencies (`requirements.txt`)
|
|
|
|
```
|
|
fastapi==0.104.1 # Web framework
|
|
uvicorn[standard]==0.24.0 # ASGI server
|
|
sqlalchemy==2.0.23 # ORM
|
|
sqlite3 # Database (built into Python)
|
|
pydantic==2.5.0 # Data validation
|
|
jinja2==3.1.2 # Template engine
|
|
python-multipart==0.0.6 # Form parsing
|
|
python-jose[cryptography]==3.3.0 # JWT tokens
|
|
passlib[bcrypt]==1.7.4 # Password hashing
|
|
```
|
|
|
|
### Development Dependencies (`requirements-dev.txt`)
|
|
|
|
```
|
|
pytest==7.4.3 # Testing framework
|
|
pytest-asyncio==0.21.1 # Async testing
|
|
pytest-cov==4.1.0 # Coverage reporting
|
|
httpx==0.25.2 # HTTP client for testing
|
|
faker==20.1.0 # Test data generation
|
|
black==23.11.0 # Code formatting
|
|
isort==5.12.0 # Import sorting
|
|
flake8==6.1.0 # Linting
|
|
mypy==1.7.1 # Type checking
|
|
pre-commit==3.6.0 # Git hooks
|
|
```
|
|
|
|
## Environment Configuration
|
|
|
|
Copy the example environment file:
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
Configure these variables in `.env`:
|
|
|
|
```bash
|
|
# Database
|
|
DATABASE_URL=sqlite:///./data/tracker.db
|
|
|
|
# API Configuration
|
|
API_HOST=0.0.0.0
|
|
API_PORT=8000
|
|
DEBUG=true
|
|
|
|
# Security (generate with: openssl rand -hex 32)
|
|
SECRET_KEY=your-secret-key-here
|
|
ACCESS_TOKEN_EXPIRE_MINUTES=30
|
|
|
|
# Analytics
|
|
ENABLE_ANALYTICS=true
|
|
ANALYTICS_BATCH_SIZE=1000
|
|
|
|
# Logging
|
|
LOG_LEVEL=INFO
|
|
LOG_FILE=tracker.log
|
|
```
|
|
|
|
## Database Setup
|
|
|
|
### Initialize Database
|
|
|
|
```bash
|
|
# Create database and tables
|
|
python -m app.database.init_db
|
|
|
|
# Verify database creation
|
|
sqlite3 data/tracker.db ".tables"
|
|
```
|
|
|
|
### Database Migrations
|
|
|
|
```bash
|
|
# Create a new migration
|
|
python -m app.database.migrate create "add_new_field"
|
|
|
|
# Apply migrations
|
|
python -m app.database.migrate up
|
|
|
|
# Rollback migration
|
|
python -m app.database.migrate down
|
|
```
|
|
|
|
### Sample Data
|
|
|
|
Load test data for development:
|
|
|
|
```bash
|
|
# Load sample projects and sessions
|
|
python -m app.database.seed_data
|
|
|
|
# Clear all data
|
|
python -m app.database.clear_data
|
|
```
|
|
|
|
## Testing
|
|
|
|
### Run Tests
|
|
|
|
```bash
|
|
# Run all tests
|
|
pytest
|
|
|
|
# Run with coverage
|
|
pytest --cov=app --cov-report=html
|
|
|
|
# Run specific test file
|
|
pytest tests/test_api.py
|
|
|
|
# Run tests matching pattern
|
|
pytest -k "test_session"
|
|
|
|
# Run tests with verbose output
|
|
pytest -v
|
|
```
|
|
|
|
### Test Database
|
|
|
|
Tests use a separate in-memory database:
|
|
|
|
```python
|
|
# tests/conftest.py
|
|
@pytest.fixture
|
|
async def test_db():
|
|
# Create in-memory SQLite database for testing
|
|
engine = create_async_engine("sqlite+aiosqlite:///:memory:")
|
|
# ... setup code
|
|
```
|
|
|
|
### Writing Tests
|
|
|
|
```python
|
|
# tests/test_api.py
|
|
import pytest
|
|
from httpx import AsyncClient
|
|
from app.main import app
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_create_session(test_db, test_client):
|
|
response = await test_client.post(
|
|
"/api/session/start",
|
|
json={
|
|
"session_type": "startup",
|
|
"working_directory": "/test/path"
|
|
}
|
|
)
|
|
assert response.status_code == 201
|
|
data = response.json()
|
|
assert data["session_id"] is not None
|
|
```
|
|
|
|
## Development Workflow
|
|
|
|
### Code Style
|
|
|
|
We use Black for formatting and isort for import sorting:
|
|
|
|
```bash
|
|
# Format code
|
|
black app/ tests/
|
|
|
|
# Sort imports
|
|
isort app/ tests/
|
|
|
|
# Check formatting without changes
|
|
black --check app/ tests/
|
|
```
|
|
|
|
### Linting
|
|
|
|
```bash
|
|
# Run flake8 linting
|
|
flake8 app/ tests/
|
|
|
|
# Type checking with mypy
|
|
mypy app/
|
|
```
|
|
|
|
### Pre-commit Hooks
|
|
|
|
Install pre-commit hooks to run checks automatically:
|
|
|
|
```bash
|
|
# Install hooks
|
|
pre-commit install
|
|
|
|
# Run hooks manually
|
|
pre-commit run --all-files
|
|
```
|
|
|
|
### Git Workflow
|
|
|
|
1. **Create feature branch:**
|
|
```bash
|
|
git checkout -b feature/new-analytics-endpoint
|
|
```
|
|
|
|
2. **Make changes and test:**
|
|
```bash
|
|
# Make your changes
|
|
pytest # Run tests
|
|
black app/ tests/ # Format code
|
|
```
|
|
|
|
3. **Commit changes:**
|
|
```bash
|
|
git add .
|
|
git commit -m "Add new analytics endpoint for productivity metrics"
|
|
```
|
|
|
|
4. **Push and create PR:**
|
|
```bash
|
|
git push origin feature/new-analytics-endpoint
|
|
```
|
|
|
|
## API Development
|
|
|
|
### Adding New Endpoints
|
|
|
|
1. **Define Pydantic schemas** in `app/models/schemas.py`:
|
|
```python
|
|
class NewFeatureRequest(BaseModel):
|
|
name: str
|
|
description: Optional[str] = None
|
|
```
|
|
|
|
2. **Create route handler** in appropriate module:
|
|
```python
|
|
@router.post("/api/new-feature", response_model=NewFeatureResponse)
|
|
async def create_new_feature(
|
|
request: NewFeatureRequest,
|
|
db: AsyncSession = Depends(get_db)
|
|
):
|
|
# Implementation
|
|
```
|
|
|
|
3. **Add tests** in `tests/test_api.py`:
|
|
```python
|
|
async def test_create_new_feature(test_client):
|
|
# Test implementation
|
|
```
|
|
|
|
### Database Queries
|
|
|
|
Use SQLAlchemy with async/await:
|
|
|
|
```python
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy import select
|
|
from app.models.project import Project
|
|
|
|
async def get_projects(db: AsyncSession, limit: int = 10):
|
|
result = await db.execute(
|
|
select(Project).limit(limit)
|
|
)
|
|
return result.scalars().all()
|
|
```
|
|
|
|
## Frontend Development
|
|
|
|
### Web Dashboard
|
|
|
|
The dashboard uses vanilla HTML/CSS/JavaScript:
|
|
|
|
```
|
|
app/dashboard/
|
|
├── static/
|
|
│ ├── css/
|
|
│ │ └── dashboard.css
|
|
│ ├── js/
|
|
│ │ ├── dashboard.js
|
|
│ │ ├── charts.js
|
|
│ │ └── api-client.js
|
|
│ └── images/
|
|
└── templates/
|
|
├── base.html
|
|
├── dashboard.html
|
|
└── projects.html
|
|
```
|
|
|
|
### Adding New Dashboard Pages
|
|
|
|
1. **Create HTML template:**
|
|
```html
|
|
<!-- app/dashboard/templates/new-page.html -->
|
|
{% extends "base.html" %}
|
|
{% block content %}
|
|
<!-- Page content -->
|
|
{% endblock %}
|
|
```
|
|
|
|
2. **Add route handler:**
|
|
```python
|
|
@dashboard_router.get("/new-page")
|
|
async def new_page(request: Request):
|
|
return templates.TemplateResponse("new-page.html", {"request": request})
|
|
```
|
|
|
|
3. **Add JavaScript if needed:**
|
|
```javascript
|
|
// app/dashboard/static/js/new-page.js
|
|
class NewPageController {
|
|
// Page logic
|
|
}
|
|
```
|
|
|
|
## Debugging
|
|
|
|
### Logging
|
|
|
|
Configure logging in `main.py`:
|
|
|
|
```python
|
|
import logging
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
handlers=[
|
|
logging.FileHandler("tracker.log"),
|
|
logging.StreamHandler()
|
|
]
|
|
)
|
|
```
|
|
|
|
### Database Debugging
|
|
|
|
Enable SQL query logging:
|
|
|
|
```python
|
|
# In development.py
|
|
engine = create_async_engine(
|
|
DATABASE_URL,
|
|
echo=True # This logs all SQL queries
|
|
)
|
|
```
|
|
|
|
### API Debugging
|
|
|
|
Use FastAPI's automatic documentation:
|
|
|
|
- **Swagger UI**: http://localhost:8000/docs
|
|
- **ReDoc**: http://localhost:8000/redoc
|
|
|
|
### Hook Debugging
|
|
|
|
Test hooks manually:
|
|
|
|
```bash
|
|
# Test session start
|
|
curl -X POST http://localhost:8000/api/session/start \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"session_type":"startup","working_directory":"'$(pwd)'"}'
|
|
|
|
# Check logs
|
|
tail -f tracker.log
|
|
```
|
|
|
|
## Performance
|
|
|
|
### Database Optimization
|
|
|
|
```bash
|
|
# Analyze query performance
|
|
sqlite3 data/tracker.db "EXPLAIN QUERY PLAN SELECT ..."
|
|
|
|
# Rebuild indexes
|
|
sqlite3 data/tracker.db "REINDEX;"
|
|
|
|
# Vacuum database
|
|
sqlite3 data/tracker.db "VACUUM;"
|
|
```
|
|
|
|
### API Performance
|
|
|
|
```bash
|
|
# Profile API endpoints
|
|
pip install line_profiler
|
|
kernprof -l -v app/api/sessions.py
|
|
```
|
|
|
|
## Deployment
|
|
|
|
### Production Setup
|
|
|
|
1. **Environment variables:**
|
|
```bash
|
|
DEBUG=false
|
|
API_HOST=127.0.0.1
|
|
```
|
|
|
|
2. **Database backup:**
|
|
```bash
|
|
cp data/tracker.db data/tracker.db.backup
|
|
```
|
|
|
|
3. **Run with Gunicorn:**
|
|
```bash
|
|
pip install gunicorn
|
|
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker
|
|
```
|
|
|
|
### Docker Setup
|
|
|
|
```dockerfile
|
|
FROM python:3.11-slim
|
|
|
|
WORKDIR /app
|
|
COPY requirements.txt .
|
|
RUN pip install -r requirements.txt
|
|
|
|
COPY . .
|
|
EXPOSE 8000
|
|
|
|
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
```
|
|
|
|
## Contributing
|
|
|
|
1. **Fork the repository**
|
|
2. **Create a feature branch**
|
|
3. **Add tests for new features**
|
|
4. **Ensure all tests pass**
|
|
5. **Follow code style guidelines**
|
|
6. **Submit a pull request**
|
|
|
|
### Pull Request Checklist
|
|
|
|
- [ ] Tests added/updated
|
|
- [ ] Documentation updated
|
|
- [ ] Code formatted with Black
|
|
- [ ] Type hints added
|
|
- [ ] No linting errors
|
|
- [ ] Database migrations created if needed
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **Import errors:**
|
|
```bash
|
|
# Ensure you're in the virtual environment
|
|
source venv/bin/activate
|
|
|
|
# Check Python path
|
|
python -c "import sys; print(sys.path)"
|
|
```
|
|
|
|
2. **Database locked:**
|
|
```bash
|
|
# Check for hanging processes
|
|
ps aux | grep python
|
|
|
|
# Remove lock files
|
|
rm data/tracker.db-wal data/tracker.db-shm
|
|
```
|
|
|
|
3. **Port already in use:**
|
|
```bash
|
|
# Find process using port 8000
|
|
lsof -i :8000
|
|
|
|
# Use different port
|
|
uvicorn main:app --port 8001
|
|
```
|
|
|
|
### Getting Help
|
|
|
|
- Check the [API documentation](api-spec.yaml)
|
|
- Review test files for usage examples
|
|
- Open an issue for bugs or feature requests
|
|
- Join development discussions in issues |