mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-26 17:26:23 +02:00
141 lines
10 KiB
Markdown
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)`.
|