Instruction file imported from kjon-life/mimir (
.cursor/rules/web-frontend.mdc). Copyright stays with the author.
Web Frontend (web/)
Tech Stack
Vite 5, React 18, TypeScript 5.8, Tailwind CSS, shadcn/ui, React Query, react-router-dom, Lucide icons.
Structure
web/src/
├── lib/ # api.ts (fetch + SSE), types.ts, colors.ts, utils.ts
├── hooks/ # use-api.ts (React Query + SSE), use-mobile, use-toast
├── pages/ # Index, Agents, Activity, NotFound
├── components/
│ ├── layout/ # AppSidebar, DashboardLayout, Header
│ ├── board/ # KanbanColumn, TaskCard, ProjectBadge
│ └── ui/ # shadcn primitives (don't edit unless necessary)
├── index.css # Tailwind + CSS vars; @import must be first
└── App.tsx # QueryClient, Router, routes
Conventions
- Data fetching — React Query via
useProjects,useBoard,useAgents,useActivityfromhooks/use-api.ts. 30s polling; SSE invalidates onboard_updated,agent_changed,activity_new. - API client —
lib/api.ts; base URL fromVITE_API_URLorhttp://localhost:8400. - Types —
lib/types.tsmirrors API shapes (Project, Task, BoardData, Agent, ActivityEvent). - Styling — Tailwind + CSS vars in
index.css. Usecn()fromlib/utilsfor conditional classes. Dark theme; tokens:--surface,--status-active, etc. - New pages — Add route in
App.tsx; useDashboardLayoutfor sidebar + SSE; add NavLink inAppSidebar.
Path Aliases
@/ → src/ (e.g. @/lib/api, @/components/ui).
