- Constitution and project spec (spec.yml) - 7 comprehensive feature specs (tasks, batches, labor, compliance, inventory, integrations, comms) - Phase 1 implementation plan (6-week roadmap) - Week 1 task breakdown (15 concrete tasks) - Architecture and compliance documentation - Backend and frontend setup guides - Deployment guide for nexus-vector - CI/CD workflows (Forgejo Actions) - Quick start guide for developers Project is ready for implementation with: - Automated testing on every push - Automatic deployment to nexus-vector on push to main - Database migrations handled automatically - Health checks and monitoring Stack: TypeScript, Fastify, React, Vite, PostgreSQL, Prisma, Docker
720 lines
14 KiB
Markdown
720 lines
14 KiB
Markdown
# Tasks: Week 1 — Infrastructure Setup
|
|
|
|
**Plan**: Phase 1 Foundation
|
|
**Week**: 1 of 6
|
|
**Status**: Ready
|
|
**Created**: 2025-12-08
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
Week 1 focuses on setting up the development environment, project structure, and foundational tooling for both backend and frontend. By the end of this week, developers should be able to run the full stack locally with hot reload.
|
|
|
|
**Success Criteria**:
|
|
|
|
- ✅ Backend runs on `http://localhost:3000` with hot reload
|
|
- ✅ Frontend runs on `http://localhost:5173` with hot reload
|
|
- ✅ PostgreSQL database accessible
|
|
- ✅ Docker Compose brings up entire stack
|
|
- ✅ Linting and formatting configured
|
|
- ✅ Testing frameworks configured
|
|
|
|
---
|
|
|
|
## Task List
|
|
|
|
### Backend Setup
|
|
|
|
#### TASK-001: Initialize Backend Project
|
|
|
|
**Priority**: P0 (Blocker)
|
|
**Estimated Time**: 1 hour
|
|
**Assignee**: Backend Lead
|
|
|
|
**Description**: Create Node.js project with TypeScript and Fastify
|
|
|
|
**Steps**:
|
|
|
|
```bash
|
|
cd ca-grow-ops-manager
|
|
mkdir backend
|
|
cd backend
|
|
npm init -y
|
|
npm install fastify @fastify/cors @fastify/helmet @fastify/jwt
|
|
npm install -D typescript @types/node tsx nodemon
|
|
npm install -D @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint prettier
|
|
npx tsc --init
|
|
```
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] `package.json` created with correct dependencies
|
|
- [ ] `tsconfig.json` configured for Node.js
|
|
- [ ] TypeScript compiles without errors
|
|
- [ ] Basic Fastify server runs on port 3000
|
|
|
|
**Files to Create**:
|
|
|
|
- `backend/package.json`
|
|
- `backend/tsconfig.json`
|
|
- `backend/src/server.ts` (basic Fastify server)
|
|
- `backend/src/app.ts` (Fastify app configuration)
|
|
|
|
---
|
|
|
|
#### TASK-002: Configure Prisma with PostgreSQL
|
|
|
|
**Priority**: P0 (Blocker)
|
|
**Estimated Time**: 1.5 hours
|
|
**Assignee**: Backend Lead
|
|
**Depends On**: TASK-001
|
|
|
|
**Description**: Set up Prisma ORM with PostgreSQL connection
|
|
|
|
**Steps**:
|
|
|
|
```bash
|
|
cd backend
|
|
npm install prisma @prisma/client
|
|
npm install -D prisma
|
|
npx prisma init
|
|
```
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] Prisma schema file created (`prisma/schema.prisma`)
|
|
- [ ] Database connection string configured in `.env`
|
|
- [ ] Prisma Client generated
|
|
- [ ] Can connect to PostgreSQL database
|
|
|
|
**Files to Create**:
|
|
|
|
- `backend/prisma/schema.prisma`
|
|
- `backend/.env.example`
|
|
- `backend/.env` (gitignored)
|
|
|
|
**Prisma Schema (Initial)**:
|
|
|
|
```prisma
|
|
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model User {
|
|
id String @id @default(cuid())
|
|
email String @unique
|
|
name String
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### TASK-003: Configure ESLint and Prettier (Backend)
|
|
|
|
**Priority**: P1
|
|
**Estimated Time**: 30 minutes
|
|
**Assignee**: Backend Lead
|
|
**Depends On**: TASK-001
|
|
|
|
**Description**: Set up code quality tools for backend
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] ESLint configured for TypeScript
|
|
- [ ] Prettier configured
|
|
- [ ] `npm run lint` works
|
|
- [ ] `npm run format` works
|
|
- [ ] VS Code auto-formats on save
|
|
|
|
**Files to Create**:
|
|
|
|
- `backend/.eslintrc.json`
|
|
- `backend/.prettierrc`
|
|
- `backend/.prettierignore`
|
|
|
|
**ESLint Config**:
|
|
|
|
```json
|
|
{
|
|
"parser": "@typescript-eslint/parser",
|
|
"extends": [
|
|
"eslint:recommended",
|
|
"plugin:@typescript-eslint/recommended"
|
|
],
|
|
"rules": {
|
|
"@typescript-eslint/no-unused-vars": "error",
|
|
"@typescript-eslint/no-explicit-any": "warn"
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### TASK-004: Configure Jest for Backend Testing
|
|
|
|
**Priority**: P1
|
|
**Estimated Time**: 1 hour
|
|
**Assignee**: Backend Lead
|
|
**Depends On**: TASK-001
|
|
|
|
**Description**: Set up Jest for unit and integration testing
|
|
|
|
**Steps**:
|
|
|
|
```bash
|
|
cd backend
|
|
npm install -D jest @types/jest ts-jest supertest @types/supertest
|
|
npx ts-jest config:init
|
|
```
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] Jest configured for TypeScript
|
|
- [ ] `npm test` runs tests
|
|
- [ ] Sample test passes
|
|
- [ ] Test coverage report generated
|
|
|
|
**Files to Create**:
|
|
|
|
- `backend/jest.config.js`
|
|
- `backend/src/__tests__/example.test.ts`
|
|
|
|
**Sample Test**:
|
|
|
|
```typescript
|
|
describe('Example Test', () => {
|
|
it('should pass', () => {
|
|
expect(1 + 1).toBe(2);
|
|
});
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
#### TASK-005: Create Backend Docker Configuration
|
|
|
|
**Priority**: P1
|
|
**Estimated Time**: 1 hour
|
|
**Assignee**: Backend Lead
|
|
**Depends On**: TASK-001, TASK-002
|
|
|
|
**Description**: Create Dockerfile and Docker Compose for backend
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] Dockerfile builds successfully
|
|
- [ ] Backend runs in Docker container
|
|
- [ ] Hot reload works in Docker
|
|
- [ ] Environment variables passed correctly
|
|
|
|
**Files to Create**:
|
|
|
|
- `backend/Dockerfile`
|
|
- `backend/Dockerfile.dev`
|
|
- `backend/.dockerignore`
|
|
|
|
**Dockerfile.dev**:
|
|
|
|
```dockerfile
|
|
FROM node:20-alpine
|
|
WORKDIR /app
|
|
COPY package*.json ./
|
|
RUN npm install
|
|
COPY . .
|
|
CMD ["npm", "run", "dev"]
|
|
```
|
|
|
|
---
|
|
|
|
### Frontend Setup
|
|
|
|
#### TASK-006: Initialize Frontend Project with Vite
|
|
|
|
**Priority**: P0 (Blocker)
|
|
**Estimated Time**: 1 hour
|
|
**Assignee**: Frontend Lead
|
|
|
|
**Description**: Create Vite + React + TypeScript project
|
|
|
|
**Steps**:
|
|
|
|
```bash
|
|
cd ca-grow-ops-manager
|
|
npm create vite@latest frontend -- --template react-ts
|
|
cd frontend
|
|
npm install
|
|
npm install react-router-dom
|
|
npm install -D @types/react-router-dom
|
|
```
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] Vite project created
|
|
- [ ] React + TypeScript configured
|
|
- [ ] Dev server runs on port 5173
|
|
- [ ] Hot reload works
|
|
|
|
**Files Created** (by Vite):
|
|
|
|
- `frontend/package.json`
|
|
- `frontend/tsconfig.json`
|
|
- `frontend/vite.config.ts`
|
|
- `frontend/src/main.tsx`
|
|
- `frontend/src/App.tsx`
|
|
|
|
---
|
|
|
|
#### TASK-007: Install and Configure Tailwind CSS
|
|
|
|
**Priority**: P0 (Blocker)
|
|
**Estimated Time**: 1 hour
|
|
**Assignee**: Frontend Lead
|
|
**Depends On**: TASK-006
|
|
|
|
**Description**: Set up Tailwind CSS with custom design tokens
|
|
|
|
**Steps**:
|
|
|
|
```bash
|
|
cd frontend
|
|
npm install -D tailwindcss postcss autoprefixer
|
|
npx tailwindcss init -p
|
|
```
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] Tailwind CSS configured
|
|
- [ ] Custom design tokens defined (colors, spacing, fonts)
|
|
- [ ] Dark mode configured
|
|
- [ ] Tailwind classes work in components
|
|
|
|
**Files to Create/Modify**:
|
|
|
|
- `frontend/tailwind.config.js`
|
|
- `frontend/postcss.config.js`
|
|
- `frontend/src/index.css`
|
|
|
|
**Tailwind Config**:
|
|
|
|
```javascript
|
|
export default {
|
|
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
|
|
darkMode: 'class',
|
|
theme: {
|
|
extend: {
|
|
colors: {
|
|
primary: '#10b981',
|
|
secondary: '#3b82f6',
|
|
danger: '#ef4444',
|
|
warning: '#f59e0b',
|
|
success: '#10b981',
|
|
},
|
|
},
|
|
},
|
|
plugins: [],
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
#### TASK-008: Set Up shadcn/ui Components
|
|
|
|
**Priority**: P1
|
|
**Estimated Time**: 1.5 hours
|
|
**Assignee**: Frontend Lead
|
|
**Depends On**: TASK-007
|
|
|
|
**Description**: Install shadcn/ui and create base components
|
|
|
|
**Steps**:
|
|
|
|
```bash
|
|
cd frontend
|
|
npx shadcn-ui@latest init
|
|
npx shadcn-ui@latest add button
|
|
npx shadcn-ui@latest add input
|
|
npx shadcn-ui@latest add card
|
|
npx shadcn-ui@latest add dialog
|
|
npx shadcn-ui@latest add dropdown-menu
|
|
```
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] shadcn/ui configured
|
|
- [ ] Base components installed (Button, Input, Card, Dialog, Dropdown)
|
|
- [ ] Components render correctly
|
|
- [ ] Dark mode works with components
|
|
|
|
**Files Created**:
|
|
|
|
- `frontend/components.json`
|
|
- `frontend/src/components/ui/button.tsx`
|
|
- `frontend/src/components/ui/input.tsx`
|
|
- `frontend/src/components/ui/card.tsx`
|
|
- etc.
|
|
|
|
---
|
|
|
|
#### TASK-009: Configure React Router
|
|
|
|
**Priority**: P1
|
|
**Estimated Time**: 1 hour
|
|
**Assignee**: Frontend Lead
|
|
**Depends On**: TASK-006
|
|
|
|
**Description**: Set up React Router with basic routes
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] React Router configured
|
|
- [ ] Basic routes created (/, /login, /dashboard)
|
|
- [ ] Navigation works
|
|
- [ ] 404 page created
|
|
|
|
**Files to Create**:
|
|
|
|
- `frontend/src/router.tsx`
|
|
- `frontend/src/pages/HomePage.tsx`
|
|
- `frontend/src/pages/LoginPage.tsx`
|
|
- `frontend/src/pages/DashboardPage.tsx`
|
|
- `frontend/src/pages/NotFoundPage.tsx`
|
|
|
|
**Router Setup**:
|
|
|
|
```typescript
|
|
import { createBrowserRouter } from 'react-router-dom';
|
|
import HomePage from './pages/HomePage';
|
|
import LoginPage from './pages/LoginPage';
|
|
import DashboardPage from './pages/DashboardPage';
|
|
|
|
export const router = createBrowserRouter([
|
|
{ path: '/', element: <HomePage /> },
|
|
{ path: '/login', element: <LoginPage /> },
|
|
{ path: '/dashboard', element: <DashboardPage /> },
|
|
{ path: '*', element: <NotFoundPage /> },
|
|
]);
|
|
```
|
|
|
|
---
|
|
|
|
#### TASK-010: Configure ESLint and Prettier (Frontend)
|
|
|
|
**Priority**: P1
|
|
**Estimated Time**: 30 minutes
|
|
**Assignee**: Frontend Lead
|
|
**Depends On**: TASK-006
|
|
|
|
**Description**: Set up code quality tools for frontend
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] ESLint configured for React + TypeScript
|
|
- [ ] Prettier configured
|
|
- [ ] `npm run lint` works
|
|
- [ ] `npm run format` works
|
|
- [ ] VS Code auto-formats on save
|
|
|
|
**Files to Create**:
|
|
|
|
- `frontend/.eslintrc.json`
|
|
- `frontend/.prettierrc`
|
|
- `frontend/.prettierignore`
|
|
|
|
---
|
|
|
|
#### TASK-011: Configure Vitest for Frontend Testing
|
|
|
|
**Priority**: P1
|
|
**Estimated Time**: 1 hour
|
|
**Assignee**: Frontend Lead
|
|
**Depends On**: TASK-006
|
|
|
|
**Description**: Set up Vitest and React Testing Library
|
|
|
|
**Steps**:
|
|
|
|
```bash
|
|
cd frontend
|
|
npm install -D vitest @testing-library/react @testing-library/jest-dom @testing-library/user-event jsdom
|
|
```
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] Vitest configured
|
|
- [ ] React Testing Library configured
|
|
- [ ] `npm test` runs tests
|
|
- [ ] Sample component test passes
|
|
|
|
**Files to Create**:
|
|
|
|
- `frontend/vite.config.ts` (add test config)
|
|
- `frontend/src/setupTests.ts`
|
|
- `frontend/src/components/__tests__/Button.test.tsx`
|
|
|
|
---
|
|
|
|
### Infrastructure & DevOps
|
|
|
|
#### TASK-012: Create Docker Compose Configuration
|
|
|
|
**Priority**: P0 (Blocker)
|
|
**Estimated Time**: 2 hours
|
|
**Assignee**: DevOps/Backend Lead
|
|
**Depends On**: TASK-005, TASK-006
|
|
|
|
**Description**: Create Docker Compose for full stack (backend, frontend, db, redis)
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] `docker-compose up` starts all services
|
|
- [ ] Backend accessible at `http://localhost:3000`
|
|
- [ ] Frontend accessible at `http://localhost:5173`
|
|
- [ ] PostgreSQL accessible at `localhost:5432`
|
|
- [ ] Redis accessible at `localhost:6379`
|
|
- [ ] Hot reload works for backend and frontend
|
|
|
|
**Files to Create**:
|
|
|
|
- `docker-compose.yml`
|
|
- `docker-compose.dev.yml`
|
|
|
|
**Docker Compose**:
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
|
|
services:
|
|
db:
|
|
image: postgres:15-alpine
|
|
environment:
|
|
POSTGRES_USER: ca_grow_ops
|
|
POSTGRES_PASSWORD: dev_password
|
|
POSTGRES_DB: ca_grow_ops_dev
|
|
ports:
|
|
- "5432:5432"
|
|
volumes:
|
|
- postgres_data:/var/lib/postgresql/data
|
|
|
|
redis:
|
|
image: redis:7-alpine
|
|
ports:
|
|
- "6379:6379"
|
|
|
|
backend:
|
|
build:
|
|
context: ./backend
|
|
dockerfile: Dockerfile.dev
|
|
ports:
|
|
- "3000:3000"
|
|
environment:
|
|
DATABASE_URL: postgresql://ca_grow_ops:dev_password@db:5432/ca_grow_ops_dev
|
|
REDIS_URL: redis://redis:6379
|
|
NODE_ENV: development
|
|
volumes:
|
|
- ./backend:/app
|
|
- /app/node_modules
|
|
depends_on:
|
|
- db
|
|
- redis
|
|
|
|
frontend:
|
|
build:
|
|
context: ./frontend
|
|
dockerfile: Dockerfile.dev
|
|
ports:
|
|
- "5173:5173"
|
|
environment:
|
|
VITE_API_URL: http://localhost:3000/api
|
|
volumes:
|
|
- ./frontend:/app
|
|
- /app/node_modules
|
|
depends_on:
|
|
- backend
|
|
|
|
volumes:
|
|
postgres_data:
|
|
```
|
|
|
|
---
|
|
|
|
#### TASK-013: Create Git Repository and .gitignore
|
|
|
|
**Priority**: P0 (Blocker)
|
|
**Estimated Time**: 30 minutes
|
|
**Assignee**: Any Developer
|
|
|
|
**Description**: Initialize Git repository with proper .gitignore files
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] Git repository initialized
|
|
- [ ] `.gitignore` files created for root, backend, frontend
|
|
- [ ] Initial commit made
|
|
- [ ] Remote repository created (GitHub/GitLab)
|
|
|
|
**Files to Create**:
|
|
|
|
- `.gitignore` (root)
|
|
- `backend/.gitignore`
|
|
- `frontend/.gitignore`
|
|
|
|
**Root .gitignore**:
|
|
|
|
```
|
|
node_modules/
|
|
.env
|
|
.env.local
|
|
*.log
|
|
.DS_Store
|
|
dist/
|
|
build/
|
|
coverage/
|
|
```
|
|
|
|
---
|
|
|
|
#### TASK-014: Create VS Code Workspace Settings
|
|
|
|
**Priority**: P2
|
|
**Estimated Time**: 30 minutes
|
|
**Assignee**: Any Developer
|
|
|
|
**Description**: Configure VS Code for optimal DX
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] Workspace settings configured
|
|
- [ ] Recommended extensions listed
|
|
- [ ] Auto-format on save enabled
|
|
- [ ] ESLint integration working
|
|
|
|
**Files to Create**:
|
|
|
|
- `.vscode/settings.json`
|
|
- `.vscode/extensions.json`
|
|
|
|
**VS Code Settings**:
|
|
|
|
```json
|
|
{
|
|
"editor.formatOnSave": true,
|
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
"editor.codeActionsOnSave": {
|
|
"source.fixAll.eslint": true
|
|
},
|
|
"typescript.tsdk": "node_modules/typescript/lib"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### TASK-015: Create README Files
|
|
|
|
**Priority**: P2
|
|
**Estimated Time**: 1 hour
|
|
**Assignee**: Any Developer
|
|
|
|
**Description**: Update README files with setup instructions
|
|
|
|
**Acceptance Criteria**:
|
|
|
|
- [ ] Root README updated with quick start
|
|
- [ ] Backend README updated
|
|
- [ ] Frontend README updated
|
|
- [ ] Docker Compose instructions included
|
|
|
|
**Files to Update**:
|
|
|
|
- `README.md` (root)
|
|
- `backend/README.md`
|
|
- `frontend/README.md`
|
|
|
|
---
|
|
|
|
## Task Dependencies
|
|
|
|
```
|
|
TASK-001 (Backend Init)
|
|
├─> TASK-002 (Prisma)
|
|
├─> TASK-003 (ESLint/Prettier)
|
|
├─> TASK-004 (Jest)
|
|
└─> TASK-005 (Docker)
|
|
|
|
TASK-006 (Frontend Init)
|
|
├─> TASK-007 (Tailwind)
|
|
│ └─> TASK-008 (shadcn/ui)
|
|
├─> TASK-009 (React Router)
|
|
├─> TASK-010 (ESLint/Prettier)
|
|
└─> TASK-011 (Vitest)
|
|
|
|
TASK-005 + TASK-006
|
|
└─> TASK-012 (Docker Compose)
|
|
|
|
TASK-013 (Git) - No dependencies
|
|
TASK-014 (VS Code) - No dependencies
|
|
TASK-015 (READMEs) - After all setup tasks
|
|
```
|
|
|
|
---
|
|
|
|
## Verification Checklist
|
|
|
|
At the end of Week 1, verify:
|
|
|
|
### Backend
|
|
|
|
- [ ] `cd backend && npm install` works
|
|
- [ ] `npm run dev` starts server on port 3000
|
|
- [ ] `npm run lint` passes
|
|
- [ ] `npm test` passes
|
|
- [ ] Prisma Client generated
|
|
- [ ] Can connect to PostgreSQL
|
|
|
|
### Frontend
|
|
|
|
- [ ] `cd frontend && npm install` works
|
|
- [ ] `npm run dev` starts server on port 5173
|
|
- [ ] `npm run lint` passes
|
|
- [ ] `npm test` passes
|
|
- [ ] Tailwind classes work
|
|
- [ ] shadcn/ui components render
|
|
|
|
### Docker
|
|
|
|
- [ ] `docker-compose up` starts all services
|
|
- [ ] Backend accessible at <http://localhost:3000>
|
|
- [ ] Frontend accessible at <http://localhost:5173>
|
|
- [ ] Hot reload works for both
|
|
|
|
### Git
|
|
|
|
- [ ] Repository initialized
|
|
- [ ] Initial commit made
|
|
- [ ] Remote repository connected
|
|
|
|
---
|
|
|
|
## Estimated Total Time
|
|
|
|
**Backend**: 6 hours
|
|
**Frontend**: 6.5 hours
|
|
**Infrastructure**: 3 hours
|
|
**Total**: ~15.5 hours (2 days for 1 developer, or 1 day for 2 developers)
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
After completing Week 1 tasks:
|
|
|
|
1. **Review** all setup with the team
|
|
2. **Test** full stack locally
|
|
3. **Proceed to Week 2**: Authentication & RBAC
|