--- description: Initialize a new Bun + TypeScript backend project with best practices setup (Hono, Prisma, Biome, testing, Docker) allowed-tools: Bash, Write, AskUserQuestion, TodoWrite, Read --- ## Mission Set up a production-ready Bun + TypeScript backend project from scratch with all necessary tooling, configuration, and project structure. This creates a solid foundation following industry best practices. ## Project Setup Request $ARGUMENTS ## Workflow ### STEP 0: Initialize Todo List (MANDATORY FIRST STEP) Create a todo list to track the setup process: ``` TodoWrite with the following items: - content: "Gather project requirements and configuration preferences" status: "in_progress" activeForm: "Gathering project requirements" - content: "Initialize Bun project and install dependencies" status: "pending" activeForm: "Initializing Bun project" - content: "Configure TypeScript (strict mode)" status: "pending" activeForm: "Configuring TypeScript" - content: "Configure Biome (formatter + linter)" status: "pending" activeForm: "Configuring Biome" - content: "Set up Prisma with PostgreSQL" status: "pending" activeForm: "Setting up Prisma" - content: "Create project structure (folders)" status: "pending" activeForm: "Creating project structure" - content: "Create core utilities (errors, logger, config)" status: "pending" activeForm: "Creating core utilities" - content: "Set up Hono app and server" status: "pending" activeForm: "Setting up Hono app" - content: "Create middleware (error handler, logging, validation)" status: "pending" activeForm: "Creating middleware" - content: "Set up environment variables and configuration" status: "pending" activeForm: "Setting up environment configuration" - content: "Create Docker configuration" status: "pending" activeForm: "Creating Docker configuration" - content: "Set up testing infrastructure" status: "pending" activeForm: "Setting up testing" - content: "Create package.json scripts" status: "pending" activeForm: "Creating npm scripts" - content: "Create .gitignore and other config files" status: "pending" activeForm: "Creating config files" - content: "Create README.md with project documentation" status: "pending" activeForm: "Creating README" - content: "Initialize git repository" status: "pending" activeForm: "Initializing git" - content: "Run initial quality checks" status: "pending" activeForm: "Running quality checks" ``` ### STEP 1: Gather Requirements Ask the user for project configuration preferences: ``` Use AskUserQuestion with the following questions: 1. Project Name: Question: "What is the name of your backend project?" Options: [Let user type custom name] 2. Database: Question: "Which database will you use?" Options: - "PostgreSQL (recommended)" - "MySQL" - "SQLite (development only)" 3. Authentication: Question: "Do you need JWT authentication set up from the start?" Options: - "Yes, set up JWT authentication" - "No, I'll add it later" 4. Docker: Question: "Include Docker configuration for containerization?" Options: - "Yes, include Dockerfile and docker-compose.yml" - "No, skip Docker" 5. Additional Features: Question: "Which additional features would you like included?" Multi-select: true Options: - "Redis caching utilities" - "File upload handling" - "Email service integration" - "Health check endpoint" ``` **Store answers** for use in setup steps. ### STEP 2: Initialize Bun Project 1. **Initialize project** ```bash bun init -y ``` 2. **Install runtime dependencies** ```bash bun add hono @hono/node-server bun add zod @prisma/client bcrypt jsonwebtoken pino ``` If JWT authentication selected: ```bash bun add bcrypt jsonwebtoken ``` If Redis caching selected: ```bash bun add ioredis ``` 3. **Install dev dependencies** ```bash bun add -d @types/node @types/bun typescript prisma @biomejs/biome ``` If JWT authentication selected: ```bash bun add -d @types/bcrypt @types/jsonwebtoken ``` ### STEP 3: Configure TypeScript Create `tsconfig.json` with strict configuration: ```json { "compilerOptions": { "target": "ES2022", "module": "ESNext", "lib": ["ES2022"], "moduleResolution": "bundler", "rootDir": "./src", "outDir": "./dist", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, "allowImportingTsExtensions": true, "noUnusedLocals": true, "noUnusedParameters": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "types": ["bun-types"], "baseUrl": ".", "paths": { "@core/*": ["src/core/*"], "@database/*": ["src/database/*"], "@services/*": ["src/services/*"], "@/*": ["src/*"] } }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "tests"] } ``` ### STEP 4: Configure Biome 1. **Initialize Biome** ```bash bunx @biomejs/biome init ``` 2. **Update biome.json** ```json { "$schema": "https://raw.githubusercontent.com/biomejs/biome/main/configuration_schema.json", "files": { "ignore": ["node_modules", "dist"] }, "formatter": { "indentStyle": "space", "indentSize": 2, "lineWidth": 100, "quoteStyle": "single", "semicolons": "always" }, "organizeImports": true, "javascript": { "formatter": { "trailingComma": "es5" } }, "typescript": { "formatter": { "trailingComma": "es5" } } } ``` ### STEP 5: Set Up Prisma 1. **Initialize Prisma** ```bash bunx prisma init ``` 2. **Update DATABASE_URL in .env** (based on database selection) For PostgreSQL: ``` DATABASE_URL="postgresql://user:password@localhost:5432/dbname?schema=public" ``` For MySQL: ``` DATABASE_URL="mysql://user:password@localhost:3306/dbname" ``` For SQLite: ``` DATABASE_URL="file:./dev.db" ``` 3. **Create initial Prisma schema** in `prisma/schema.prisma`: - Update datasource provider based on database selection - Add example User model - Add Session model if JWT auth selected ### STEP 6: Create Project Structure Create directory structure: ```bash mkdir -p src/{core,database/repositories,services,controllers,middleware,routes,schemas,types,utils} mkdir -p tests/{unit,integration,e2e} ``` Result: ``` src/ ├── core/ # Core utilities ├── database/ │ ├── client.ts │ └── repositories/ # Data access layer ├── services/ # Business logic ├── controllers/ # HTTP handlers ├── middleware/ # Middleware functions ├── routes/ # API routes ├── schemas/ # Zod validation schemas ├── types/ # TypeScript types └── utils/ # Utility functions tests/ ├── unit/ ├── integration/ └── e2e/ ``` ### STEP 7: Create Core Utilities 1. **Error classes** (`src/core/errors.ts`) - ApiError base class - BadRequestError, UnauthorizedError, ForbiddenError, NotFoundError, ConflictError, ValidationError 2. **Logger** (`src/core/logger.ts`) - Pino logger with development/production config - Pretty printing in development 3. **Config** (`src/core/config.ts`) - Environment variable loading - Type-safe configuration object - Validation for required env vars ### STEP 8: Set Up Hono App 1. **Create Hono app** (`src/app.ts`) - Initialize Hono - Add CORS middleware - Add security headers middleware - Add request logging middleware - Add global error handler - Mount health check route (if selected) 2. **Create server** (`src/server.ts`) - Import Hono app - Set up graceful shutdown - Start server on configured port ### STEP 9: Create Middleware 1. **Error handler** (`src/middleware/errorHandler.ts`) - Global error handling - ApiError response formatting - Logging 2. **Validation middleware** (`src/middleware/validator.ts`) - validate() for request body - validateQuery() for query params 3. **Request logger** (`src/middleware/requestLogger.ts`) - Log incoming requests - Log responses with duration 4. **Security headers** (`src/middleware/security.ts`) - X-Content-Type-Options - X-Frame-Options - X-XSS-Protection - Strict-Transport-Security 5. **Authentication middleware** (if JWT selected) (`src/middleware/auth.ts`) - authenticate() middleware - authorize() middleware for role-based access ### STEP 10: Set Up Environment Configuration 1. **Create .env.example** ``` NODE_ENV=development PORT=3000 DATABASE_URL=postgresql://user:password@localhost:5432/dbname JWT_SECRET=your-secret-key-change-in-production LOG_LEVEL=debug # Add REDIS_URL if Redis selected # Add other env vars based on selections ``` 2. **Create .env** (copy from .env.example) 3. **Update .gitignore** to exclude .env ### STEP 11: Create Docker Configuration (if selected) 1. **Create Dockerfile** (multi-stage build) - Base stage - Dependencies stage - Build stage - Runner stage - Health check 2. **Create docker-compose.yml** - App service - PostgreSQL service - Redis service (if selected) - Health checks - Volume mounts 3. **Create .dockerignore** ### STEP 12: Set Up Testing 1. **Create test utilities** (`tests/setup.ts`) - Test database connection - Test data factories - Cleanup utilities 2. **Create example tests** - Unit test example (`tests/unit/example.test.ts`) - Integration test example (`tests/integration/health.test.ts`) ### STEP 13: Create Package.json Scripts Update `package.json` with comprehensive scripts: ```json { "scripts": { "dev": "bun --hot src/server.ts", "start": "NODE_ENV=production bun src/server.ts", "build": "bun build src/server.ts --target bun --outdir dist", "test": "bun test", "test:watch": "bun test --watch", "test:coverage": "bun test --coverage", "lint": "biome lint --write", "format": "biome format --write", "check": "biome check --write", "typecheck": "tsc --noEmit", "db:generate": "prisma generate", "db:migrate": "prisma migrate dev", "db:migrate:deploy": "prisma migrate deploy", "db:studio": "prisma studio", "db:seed": "bun run src/database/seed.ts", "docker:build": "docker build -t [project-name] .", "docker:run": "docker-compose up", "docker:down": "docker-compose down" } } ``` ### STEP 14: Create Configuration Files 1. **Create .gitignore** ``` node_modules/ dist/ .env .env.local *.log .DS_Store coverage/ prisma/migrations/ bun.lockb ``` 2. **Create .editorconfig** (optional) 3. **Create .vscode/settings.json** (Biome integration) ```json { "editor.defaultFormatter": "biomejs.biome", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.organizeImports.biome": true, "source.fixAll.biome": true } } ``` ### STEP 15: Create README.md Create comprehensive README with: - Project description - Technology stack - Project structure - Prerequisites - Installation instructions - Development commands - Testing instructions - Docker instructions - Environment variables - API documentation (placeholder) - Contributing guidelines - License ### STEP 16: Initialize Git Repository 1. **Initialize git** ```bash git init ``` 2. **Create initial commit** ```bash git add . git commit -m "Initial project setup: Bun + TypeScript + Hono + Prisma" ``` ### STEP 17: Run Quality Checks 1. **Run Prisma generate** ```bash bunx prisma generate ``` 2. **Run formatter** ```bash bun run format ``` 3. **Run linter** ```bash bun run lint ``` 4. **Run type checker** ```bash bun run typecheck ``` 5. **Run tests** ```bash bun test ``` **Verify all checks pass** before finalizing. ### STEP 18: Completion Summary Present final summary: ``` ✅ Project Setup Complete! Project: [project-name] Stack: Bun + TypeScript + Hono + Prisma + [database] Created: - ✅ Project structure (src/, tests/) - ✅ TypeScript configuration (strict mode) - ✅ Biome configuration (format + lint) - ✅ Prisma ORM setup ([database]) - ✅ Hono web framework - ✅ Core utilities (errors, logger, config) - ✅ Middleware (validation, auth, logging, security) - ✅ Environment configuration - ✅ Testing infrastructure - ✅ [Docker configuration] (if selected) - ✅ [JWT authentication] (if selected) - ✅ [Redis caching] (if selected) - ✅ Git repository initialized Next steps: 1. Review .env and update with your database credentials 2. Run database migration: bun run db:migrate 3. Start development server: bun run dev 4. Open http://localhost:3000/health to verify setup 5. Begin implementing your API features! Useful commands: - bun run dev # Start dev server with hot reload - bun run test # Run tests - bun run check # Format + lint - bun run db:studio # Open Prisma Studio - bun run docker:run # Start with Docker Documentation: - See README.md for full documentation - See best-practices skill for development guidelines - Use /implement-api command to build features ``` ## Success Criteria Project setup is complete when: - ✅ All dependencies installed - ✅ TypeScript configured (strict mode) - ✅ Biome configured (format + lint) - ✅ Prisma set up with database connection - ✅ Project structure created - ✅ Core utilities implemented - ✅ Hono app and server created - ✅ Middleware set up - ✅ Environment configuration created - ✅ Testing infrastructure ready - ✅ Docker configuration created (if selected) - ✅ All quality checks pass - ✅ Git repository initialized - ✅ README.md created ## Error Handling If any step fails: 1. **Identify the issue** - Read error message - Check what command failed 2. **Common issues:** - Bun not installed → Install Bun first - Database connection failed → Update DATABASE_URL in .env - Port already in use → Change PORT in .env - Missing dependencies → Run `bun install` 3. **Recovery:** - Fix the issue - Re-run the failed step - Continue with remaining steps ## Remember This command creates a **production-ready foundation**. After setup: - Use `/implement-api` to build features - Use `backend-developer` agent for implementation - Use `api-architect` agent for planning - Follow the best-practices skill for guidelines The result is a clean, well-structured, fully-configured Bun backend project ready for feature development.