# Combined Project Guidelines for Bookhoard ## 🚨 CRITICAL PROHIBITIONS (Never violate these) ### Backend & Database - ❌ **NEVER modify backend code when working on frontend-only tasks** - ❌ **NEVER modify database schema** unless explicitly instructed for full-stack changes - ❌ **NEVER use Docker** - use Podman only - ❌ **NEVER build server binaries locally** - all builds through Dockerfile/docker-compose - ❌ **NEVER create new migration files** - merge changes into current one until release - ❌ **NEVER use `git checkout` on schema files** without checking what will be lost - ❌ **NEVER break existing functionality** unless explicitly instructed - ❌ **NEVER duplicate business logic** - keep logic in services, not handlers - ❌ **NEVER bypass service layer** - all database operations must go through services ### Frontend & Styling - ❌ **NEVER modify backend/API for frontend features without user confirmation** - ❌ **NEVER use custom CSS** - TailwindCSS classes only - ❌ **NEVER use JavaScript** - convert all to TypeScript - ❌ **NEVER use object-oriented programming patterns in TypeScript** - avoid classes, inheritance, and OOP bloat; use functional/other paradigms - ❌ **NEVER add new Dockerfiles without user confirmation - ❌ **NEVER fetch initial data via AJAX on page load** - use server-side rendering instead - ❌ **NEVER break progressive enhancement** - pages must work without JavaScript **Note:** Go methods in the backend are fine and encouraged. This guideline applies to TypeScript/JavaScript frontend code only.** ### General - ❌ **NEVER skip pre-commit hooks** unless explicitly requested - ❌ **NEVER force push to main/master** branches - ❌ **NEVER commit files with secrets** (.env, credentials.json, etc.) - ❌ **NEVER make assumptions** - ask clarifying questions when uncertain - ❌ **NEVER delete code without reading full context first** (minimum 20 lines before/after) - ❌ **NEVER make cascading fix-up edits without git diff review** - After compilation error: STOP, review `git diff`, understand full impact - Use revert/re-apply pattern instead of blind fixes - ❌ **NEVER skip post-edit verification** - must compile after each file edit ### Cascading Fix-up Pattern (PROHIBITED) **WHAT NOT TO DO** - This caused critical bugs: ```go // ❌ WRONG: Blindly making fixes after compilation error Edit 1: Delete deprecated code [Compilation error: undefined Register] Edit 2: Try to fix error (over-broad deletion) [More errors: undefined Login, GetProfile, etc.] Edit 3: Try to fix again (worse damage) [Even more errors: major functionality broken] ``` **CORRECT APPROACH**: ```go // ✅ CORRECT: Stop, understand, then fix deliberately Edit 1: Delete deprecated code [Compilation error: undefined Register] STOP → Review git diff → Understand Register was accidentally deleted RESTORE → Get exact Register function from git history VERIFY → Compile successfully ``` **Key Principle**: When compilation errors occur after edits: 1. STOP - Don't make more edits 2. ANALYZE - Use `git diff` to understand what was changed 3. RECOVER - Restore what was accidentally deleted/broken 4. VERIFY - Compile and test before proceeding --- ## 🎯 CONTEXT-SPECIFIC RULES ### When Working on Frontend-Only Tasks - **DO NOT touch backend code** - handlers, services, database layer - **DO NOT modify API routes** - use existing endpoints only - **DO NOT change database schema** - work with existing structure - **If backend change seems necessary**: 1. Identify the required change 2. Explain why you need it 3. Provide impact analysis 4. **ASK FOR USER CONFIRMATION before proceeding** ### When Working on Full-Stack Tasks - Backend changes are allowed when explicitly part of the task - Still follow all database protocols (atomic changes, validation, etc.) - Still use Podman for all builds - Still include Bruno tests for API changes --- ## ✅ MANDATORY REQUIREMENTS ### Database Operations (Full-Stack Tasks Only) - ✅ Follow **pgx v5 standards** for all database operations - ✅ Treat schema changes as **ATOMIC** - complete success or complete rejection - ✅ When schema changes occur: delete database and rebuild with clean Podman cache - ✅ Use **pre-change checklist**: read schema → identify columns → plan changes → verify → read back - ✅ **Post-change validation**: ensure schema.sql, models.go, and queries.sql are in sync ### Build & Deployment - ✅ Use **Podman** exclusively (not Docker) - ✅ All builds through existing **Dockerfile** and **docker-compose.yml** - ✅ Stop building server binaries - everything goes through containers ### API Changes (Full-Stack Tasks Only) - ✅ Include **Bruno v3.0 .bru requests** with all API documentation - ✅ Tests must be **comprehensive and cover three contexts**: no user, user, and admin - ✅ Maintain backward compatibility for mobile apps and external consumers ### Frontend & Styling - ✅ Always use **TailwindCSS classes** for all styling - ✅ Convert all JavaScript to **TypeScript** - ✅ Avoid OOP patterns - prefer functional/other paradigms - ✅ **Render initial data server-side** in Go templates for fast page loads - ✅ **Use JavaScript/HTMX for CRUD operations** (create, update, delete) - ✅ **Ensure progressive enhancement** - pages work without JavaScript ### Service Layer Architecture - ✅ **All business logic in services** - never in handlers - ✅ **Services must be reusable** by both SSR handlers and API endpoints - ✅ **Database operations through services only** - never direct from handlers - ✅ **When adding features**: Add service logic → Create API endpoint → Use SSR for initial render → Use JS for updates ### Code Organization - ✅ Minimize project structure changes - ✅ Place new files in **contextually appropriate directories** - ✅ Follow **KISS**, **DRY**, and **YAGNI** principles - ✅ Use **multiple, logical git commits** with clear messages ### Configuration & Environment - ✅ If **.env is missing**, auto-generate secure values - ✅ Never commit secrets to repository ### Code Modification Safety - ✅ **Post-Edit Verification (MANDATORY for ALL file modifications)**: - Run `go build` for affected packages immediately after each edit - Review `git diff filename` to verify only intended changes - Validate functionality still works as expected - Never proceed to next file until current edit is verified - ✅ **Backup Before Large Changes**: - Create a stash: `git stash push -m "Pre-cleanup snapshot"` before removing >50 lines - Or create a backup branch: `git branch backup-before-cleanup` - This allows instant recovery if mistakes occur - ✅ **Large Deletion Safety Pattern**: - Read at least 20 lines before/after deletion target - Include unique identifiers in match (function signatures, specific comments) - Use narrow matches - avoid generic patterns - Verify line numbers match intended section ### Documentation **Documentation Structure** (updated with full docs system): - ✅ **README.md** - Project overview, quick start, and setup instructions only - ✅ **docs/** - Comprehensive documentation system with search - ✅ **docs/developer/api/** - API reference documentation (split by endpoint/category) - ✅ **docs/user/** - User-facing features, guides, and workflows - ✅ **docs/user/devices/** - Device setup guides (KOBO, KOReader, etc.) - ✅ **docs/contributing/** - Development and contribution guides **Where to document changes**: | Change Type | Location | Examples | |-------------|----------|----------| | **User-facing features** | `docs/user/` | New features, UI changes, workflows | | **API endpoints** | `docs/developer/api//.md` | New endpoints, modified responses, authentication changes | | **API behavior** | Update existing `docs/developer/api/` files | Parameter changes, error codes, rate limits | | **Device setup** | `docs/user/devices/` | New device support, setup instructions | | **Development** | `docs/contributing/` | Build changes, architecture decisions | | **Quick start/setup** | `README.md` | Installation, environment setup, first-run | | **Breaking changes** | Both `README.md` and relevant `docs/` | Migration guides, deprecation notices | | **Bug fixes** | Update relevant `docs/` only if user-visible | Clarifications, troubleshooting additions | | **Bruno API tests** | `.bru` files alongside code | API contract testing, examples | **Documentation Update Workflow**: 1. **Identify the audience** (end users, developers, API consumers) 2. **Choose appropriate location** based on table above 3. **Update documentation** before or with code changes 4. **Verify documentation renders** at `/docs` endpoint 5. **Test search** finds new/updated content 6. **For API changes**: Update both `docs/developer/api/` files AND Bruno `.bru` files 7. **Commit separately** with clear message: `docs: ` **When in doubt**: - End-user visible → `docs/user/` - API reference → `docs/developer/api/` - Setup/onboarding → `README.md` - Development related → `docs/contributing/` ### Process & Continuity - ✅ If mid-task and receive "no response", **continue the task** - ✅ Verify no regressions before modifying/removing code --- ## 🔧 TECHNICAL STANDARDS ### Backend Stack - **Language**: Go 1.25+ - **Database**: PostgreSQL 15+ with **pgx v5 driver** only - **Authentication**: JWT tokens with bcrypt password hashing - **Architecture**: Service layer pattern (handlers → services → database) ### Frontend Stack - **Styling**: TailwindCSS (no custom CSS) - **Language**: TypeScript (no JavaScript) - **Templates**: HTMX with server-side rendering - **Patterns**: Functional/other (no OOP) ### Containerization - **Runtime**: Podman (not Docker) - **Build**: Existing Dockerfile and docker-compose.yml only - **No local builds** allowed --- ## 🔄 ERROR RECOVERY PROTOCOL When code modification mistakes occur (deleted wrong code, broke compilation, etc.): ### Immediate Actions 1. **STOP** - Don't make more edits 2. **ASSESS** - What was deleted? Is it critical? 3. **REVIEW** - Run `git diff` to see exact changes 4. **RESTORE** - Choose appropriate recovery method: - **Recent mistake**: `git checkout -- filename` - **Complex restoration**: Use `git show HEAD:filename` to recover deleted code - **Multiple files**: `git reset HEAD~1` (if safe) 5. **VERIFY** - Compile and test restored code 6. **DOCUMENT** - Note what went wrong for future reference ### Recovery Examples ```bash # Recover a deleted function from original file git show HEAD:internal/handlers/auth.go | sed -n '70,275p' > recovery.txt # Revert entire file to original state git checkout HEAD -- internal/handlers/auth.go # Use git stash to save current state before rollback git stash push -m "Broken state before fix" git checkout -- internal/handlers/auth.go ``` ### Prevention (Learn From Mistakes) - Why did the mistake happen? - Was it too-broad matching? - Was it insufficient context reading? - Was it cascading fix-up attempts? - Update guidelines to prevent recurrence --- ## 📋 WORKFLOW CHECKLISTS ### Before Making Frontend-Only Changes - [ ] Identify if backend modification could make implementation simpler - [ ] Plan to use existing API endpoints only - [ ] If backend change seems necessary, prepare confirmation request: - Required change description - Why it would help - Impact analysis - Alternative approaches considered - [ ] Plan git commit structure (multiple logical commits) - [ ] **Identify documentation location** (see Documentation section): - [ ] User-facing feature → `docs/user/` - [ ] UI/workflow changes → `docs/user/` - [ ] Setup instructions → `README.md` ### Before Making Full-Stack Changes - [ ] Read current schema completely (if database changes) - [ ] Identify all columns that must be preserved - [ ] Plan exact changes needed - [ ] Verify Podman will be used for builds - [ ] Plan git commit structure (multiple logical commits) - [ ] **Identify documentation location**: - [ ] API changes → `docs/developer/api//` - [ ] New endpoints → Create new `.md` file in `docs/developer/api/` - [ ] API behavior → Update existing `docs/developer/api/` files - [ ] Breaking changes → Both `README.md` + relevant `docs/` - [ ] Bruno `.bru` files → Update/create alongside API changes ### During Schema Changes (Full-Stack Only) - [ ] Read current schema completely - [ ] Identify all columns that must be preserved - [ ] Plan exact changes needed - [ ] Set up verification step - [ ] Make intended changes - [ ] Immediately verify by reading back modified sections - [ ] Confirm ALL expected columns are present - [ ] Verify schema.sql, models.go, and queries.sql are in sync ### After API Changes - [ ] Create/update Bruno v3.0 .bru requests - [ ] Test with no user context - [ ] Test with regular user context - [ ] Test with admin context - [ ] Verify backward compatibility ### Before Committing - [ ] Run tests: `go test ./... -v` - [ ] Run lint/typecheck if available - [ ] Ensure no secrets in changes - [ ] Verify logical commit structure - [ ] **Update documentation** (see Documentation section): - [ ] User-facing changes → `docs/user/` - [ ] API changes → `docs/developer/api/` + Bruno `.bru` files - [ ] Setup/onboarding → `README.md` - [ ] Development changes → `docs/contributing/` - [ ] **Verify docs render** at `/docs` endpoint - [ ] **Test docs search** finds new content ### Error Recovery Protocol (If Code Mistakes Occur) - [ ] **Stop immediately** - don't make more edits - [ ] **Assess impact**: What was deleted? Is it critical? - [ ] **Review git diff**: See exact changes made - [ ] **Restore strategy**: - If recent mistake: `git checkout -- filename` - If complex: Reconstruct from git diff using `git show HEAD:filename` - [ ] **Verify recovery**: Compile and test restored code - [ ] **Document mistake**: Note what went wrong for future reference ### Phase Completion Verification (Before Declaring "Complete") - [ ] All target code is removed/intact as intended - [ ] No unintended code was deleted - [ ] All affected files compile successfully - [ ] Run `go build ./...` for entire project - [ ] No critical functionality was broken - [ ] Git diff shows only intended changes - [ ] Review all modified files with `git diff --stat` --- ## 🏗 ARCHITECTURAL PATTERNS ### Current: Hybrid SSR ``` Browser → Go template (with data) → Display instantly ↓ JavaScript for interactivity (CRUD) ↓ Shared service layer ``` Ultimately, whenever you are unsure just ask for confirmation.