SurfSense/_bmad-output/project-context.md

141 lines
10 KiB
Markdown

---
project_name: 'SurfSense'
user_name: 'Luisphan'
date: '2026-04-12'
sections_completed: ['technology_stack']
existing_patterns_found: 10
---
# Project Context for AI Agents
_This file contains critical rules and patterns that AI agents must follow when implementing code in this project. Focus on unobvious details that agents might otherwise miss._
---
## Technology Stack & Versions
- **Backend:** Python >= 3.12, FastAPI (0.115.8), PostgreSQL (`asyncpg`, `pgvector` 0.3.6).
- **Frontend (Web/Extension):** Next.js (16.1.0) App Router (có Turbopack), React (19.2.3), TypeScript (5.8.3), TailwindCSS (4.1.11).
- **ORM & Database State:** Drizzle ORM (0.44.5) cho Frontend, SQLAlchemy quản lý DB queries trên Backend.
- **Data Sync & Client State:** `@rocicorp/zero` (0.26.2), Zustand (5.0.9), TanStack Query (5.90.7).
- **Background Tasks:** Queue và Workers bằng Celery (5.5.3) trên Redis (5.2.1).
- **AI/LLM Ecosystem:** Xử lý luồng bằng LangChain (1.2.13), gọi API bằng LiteLLM (1.83.0), tìm kiếm bằng Elasticsearch (9.1.1).
- **Data Processing/Scraping:** Trích xuất file bằng Unstructured (0.18.31) / Docling (2.15.0), Scraping qua Playwright (1.50.0).
## Language-Specific Rules
### 1. Python (Backend)
- **Type Hinting:** Bắt buộc sử dụng Strict Type Hints cho tất cả các function, endpoint signature và dataclasses/pydantic models. Tận dụng syntax mới của Python 3.12+ (ví dụ: dùng `dict | None` thay vì `Optional[Dict]`).
- **Concurrency (Async/Await):** Bắt buộc dùng `async def` cho các I/O-bound operations (Database calls bằng `asyncpg`, gọi LLM APIs bằng LiteLLM). Code nào CPU-bound hoặc dùng thư viện sync thì đẩy vào background task (Celery) hoặc thread pool.
- **Dependency Injection:** Tận dụng tối đa `fastapi.Depends()` cho các logic như xác thực, cấp phát Database Session, cấu hình.
- **Naming Conventions:**
- `snake_case` cho variables, functions, module files và methods.
- `PascalCase` cho Classes và Pydantic Models.
- `UPPER_SNAKE_CASE` cho constants và environment variables.
- **Docstrings:** Sử dụng chuẩn Google docstrings cho các Public Functions và Classes, mô tả rõ Parameters (`Args:`) và Return values (`Returns:`).
- **Linting & Formatting:** Tuân thủ `ruff` cho cả linting và formatting. Ghi đè các rules theo cấu hình trong `pyproject.toml`.
### 2. TypeScript/JavaScript (Web Frontend & Extension)
- **Strict Typing:** Không sử dụng `any` trừ trường hợp bất khả kháng. Luôn define `interface` hoặc `type` rõ ràng, đặc biệt với các props truyền qua Component hay Data Model lấy từ APIs/DB.
- **Next.js Paradigms:** Mặc định coi mọi component React là **Server Components**. Chỉ thêm `"use client"` trên đầu file khi component đó bắt buộc phải sử dụng Browser API, Client State (Zustand) hoặc Effects (`useEffect`).
- **Naming Conventions:**
- `camelCase` cho variables, functions, methods, instances, và hooks (ví dụ: `useAuth`).
- `PascalCase` cho React Components, Types, Interfaces, và Classes.
- `UPPER_SNAKE_CASE` cho global constant configs.
- **File & Folder naming:**
- `kebab-case` cho tên file và thư mục thông thường (VD: `user-profile.tsx`, `components/ui`).
- Đối với Next.js App Router rules: Tuân thủ cấu trúc framework như `page.tsx`, `layout.tsx`, `route.ts`.
- **Biome Formatting & Linting (`biome.json`):**
- Thụt lề bằng `tab` (với hiển thị thụt lề bằng 2 spaces).
- Sử dụng dấu ngoặc kép `"double"` cho chuỗi và thuộc tính JSX.
- Bắt buộc chấm phẩy ở cuối dòng (`semicolons: "always"`).
- Bật các cảnh báo kiểm tra Exhaustive Dependencies cho React hooks.
- **Comments:** Prefer các bình luận giải thích *TẠI SAO (Why)* thay vì *LÀM GÌ (What)*. Sử dụng TSDoc syntax (`/** ... */`) cho việc ghi chú function signature, component interface.
## Framework & Library Rules
### 1. Next.js 16 (App Router) & React
- **Data Fetching:** Ưu tiên dùng Server Components (`async/await` trực tiếp trong component) cho dữ liệu tải ở lần đầu tiên (Initial Load) để tối ưu hiển thị.
- **Client Side Fetching & Mutations:** Sử dụng React Query (`TanStack Query`) cho các thao tác gọi API phía client cần quản lý cache, loading, error state.
- **Server Actions:** Sử dụng Server Actions cho các form submission trên Server Components. Với WebApp cần tính realtime/phức tạp, có thể trực tiếp gọi REST APIs của FastAPI (hoặc thông qua `@rocicorp/zero`).
### 2. FastAPI (Backend)
- **Route Organization:** Phải chia nhỏ API endpoints thành các module `APIRouter` (ví dụ trong `app/routers/` hay `app/api/`). Tuyệt đối không nhét chung tất cả logic vào tệp `main.py`.
- **Validation:** Sử dụng triệt để các **Pydantic Models** nhận request object để tự động validate input.
- **Error Handling:** Nếu có lỗi, bắt buộc trả về bằng lệnh raise `HTTPException(status_code=..., detail=...)`. Không bắt lỗi rồi return thành công (HTTP 200) kèm thêm key `"error": true`.
### 3. Database & Real-Time Sync
- **Backend Migrations:** Mọi sự thay đổi về Cấu trúc bảng Database phải thông qua công cụ Migration Engine `Alembic` (cho SQLAlchemy). Không chạy lệnh `ALTER TABLE` trực tiếp.
- **Local-First Sync:** Các state/dữ liệu realtime trên giao diện cần tận dụng `@rocicorp/zero`. Khi làm việc với Zero Database, hãy tuân theo schema định nghĩa sẵn dành riêng cho Zero Client.
- **Client State (Theo mức độ):**
- *Server State (Dữ liệu từ API):* Quản lý bởi `TanStack Query` hoặc `@rocicorp/zero`.
- *Global UI State (VD: Theme, Tooltip, Panel mở rông):* Quản lý qua `Zustand` hoặc `Jotai`.
- *Local Component State:* Sử dụng `useState`.
### 4. Styling (TailwindCSS 4)
- **Convention:** Tuân thủ Utility-First CSS. Không viết custom CSS class trong file `index.css` trừ phi xử lý animation phức tạp hoặc theme variables.
- **Responsive Design:** Thiết kế theo luồng Mobile-First. Class mặc định dùng cho màn hình di động, dùng tiếp các prefix `sm:`, `md:`, `lg:` để build giao diện cho PC / Tablet.
## Critical Implementation Rules
## Testing Rules
### 1. Backend Testing (Python/FastAPI)
- **Framework:** Sử dụng `pytest` làm test runner chính cho cả Unit Tests và Integration Tests.
- **Coverage:** Bắt buộc phải có test bao phủ các API Endpoints (sử dụng `TestClient`) và các Core Services quan trọng (VD: RAG Pipeline, Sync logic).
- **Fixtures & Mocking:**
- Khai thác `pytest.fixture` để chia sẻ database sessions, settings hoặc authentication override.
- Sử dụng `unittest.mock` (hoặc `pytest-mock`) thay thế các external LLM Services, third-party APIs nhằm đảm bảo test chạy độc lập, offline và nhanh chóng.
### 2. Frontend Testing (Next.js/React)
- **Component Tests:** Áp dụng `Vitest/Jest` kết hợp cùng `React Testing Library` để kiểm chứng luồng hoạt động của React Hooks (đặc biệt là state management phức tạp) và logic UI Components (Form validations).
- **End-to-End (E2E) Tests:** Dùng `Playwright` để thực hiện User Journey chính yếu (User Login, Thêm Extension, Chat RAG query) nhằm xác nhận frontend - backend kết nối hoàn hảo.
## AI Agent & Workflow Rules (BMad)
- **Ngôn ngữ vận hành:** Giao tiếp trả lời bằng **Tiếng Việt + thuật ngữ chuyên ngành Tiếng Anh**, tuyệt đối viết code, comments và logic biến bằng **Tiếng Anh**.
- **Khai báo Artifacts:** Mọi cấu trúc kiến trúc (Architecture), ý tưởng dự án (PRD) và phân tách Tasks (Stories/Epics) phải được lưu trữ đúng quy cách tại thư mục `_bmad-output/`.
### 🔧 MCP Tool Usage Rules (MANDATORY)
Luôn dùng MCP tools theo thứ tự ưu tiên sau:
1. **Sequential Thinking (Dùng TRƯỚC khi code):**
- Bắt buộc cho mọi task phức tạp (>10 dòng code, refactor, thiết kế API, debug khó, data model). Tối thiểu 5 bước suy luận, nếu liên quan logic phức tạp/performance: tối thiểu 8 bước.
- Không bỏ qua dù người dùng yêu cầu nhanh.
2. **Context7 (Tra cứu docs trước khi dùng thư viện):**
- Bắt buộc gọi khi nhắc đến bất kỳ library/framework nào (FastAPI, Next.js, Radix UI, Drizzle, @rocicorp/zero, Celery, LangChain, etc.).
- Luôn resolve library ID trước (`resolve-library-id`) rồi gọi `get-library-docs`.
- Không dựa vào training knowledge, luôn verify qua Context7 lấy docs mới nhất.
3. **Memory (Lưu và tra cứu context):**
- **Đầu mỗi session:** Search memory để load project context, coding preferences, past decisions.
- **Cuối mỗi task quan trọng:** Save summary của những gì đã làm, architecture decisions, pattern preferences, bugs fixed.
4. **Serena (Navigation & Code Understanding):**
- Dùng Serena thay vì `read_file` để hiểu codebase (tìm symbol, trace reference, find callers).
- Check implementation hiện có trước khi viết hàm mới và hiểu impact trước khi refactor.
### ⚙️ Execution Behavior
- **Parallel Execution:** Tools không phụ thuộc nhau (đọc nhiều file, search context) CẦN execute song song.
- **Silent Execution:** Không giải thích từng tool call làm gì. Chỉ báo cáo sau khi hoàn thành.
- **Verification Before Action:** Xác nhận với user trước khi xoá/rename/refactor lớn. Review lại code trước khi present.
### 🐛 Debug Protocol
Khi gặp bug, làm theo thứ tự:
1. Reproduce với minimal case.
2. Inspect logs và add instrumentation nếu cần.
3. **Verify assumptions qua Context7 docs** (Không đoán).
4. Dùng Serena trace call flow.
5. Dùng Sequential Thinking để reason về root cause.
6. Nếu >3 attempts không fix được, escalate cung cấp repro steps, logs, hypotheses đã thử.
### 💾 Memory Hygiene
- Cần **Lưu**: Thay đổi architecture, Bug fix & nguyên nhân, Pattern mới, External API behavior khác docs.
- Khuyên dùng format topic để organize memories.
- **Đóng khung điều hướng:** Theo chuẩn BMad Help, mỗi bước output cần kết thúc bằng Terminal Navigation `[A] (Advanced)`, `[P] (Party Mode/Review)`, `[C] (Continue)`.