èŻ·éæ©äžäžȘéĄčçź
-diff --git a/API-V2.md b/API-V2.md
deleted file mode 100644
index 84ecda3..0000000
--- a/API-V2.md
+++ /dev/null
@@ -1,422 +0,0 @@
-# API v2 ćçș§èŻŽæ
-
-## đ æ°ćèœæŠè§
-
-### 1. éĄčçźçźĄç
-- ææä»»ćĄćż
饻é¶ć±äșéĄčçź
-- éĄčçźç±äșșç±»ćć»șć知ç
-
-### 2. ćäœè§çșŠ
-- æŻäžȘéĄčçźćŻèźŸçœźćäœè§çșŠ
-- æșèœäœéąćä»»ćĄæ¶äŒæ¶ć°è§çșŠæé
-- æșèœäœćż
éĄ»äž„æ Œé”ćźè§çșŠć
ćźč
-
-### 3. 俥æŻć
±äș«æž
ć
-- æŻäžȘéĄčçźç»Žæ€ć
±äș«çŹèź°ćèĄš
-- äșșç±»ćæșèœäœéœćŻä»„æ·»ć /çŒèŸ
-- æŻæ CRUD æäœ
-
-### 4. ä»»ćĄćąćŒș
-- **Markdown æŻæ**: ä»»ćĄæèż°äœżçš Markdown æ ŒćŒ
-- **é件知ç**: æŻææä»¶äžäŒ ïŒæć€§ 10MBïŒ
-- **ćä»»ćĄ**: æŻæç¶ćä»»ćĄć
łçł»
-- **ä»»ćĄç±»ć**: requirementïŒéæ±ïŒ| designïŒèźŸèźĄïŒ| developmentïŒćŒćïŒ| testingïŒæ”èŻïŒ| deploymentïŒéšçœČïŒ
-- **æ°ç¶ææ”**: initialïŒćć§ïŒâ in_progressïŒèżèĄäžïŒâ testing_pendingïŒćŸ
æ”èŻïŒâ testingïŒæ”èŻäžïŒâ completedïŒćźæïŒ
-
-## đĄ API 端çč
-
-### éĄčçźçźĄç
-
-#### ćć»șéĄčçź
-```http
-POST /api/projects
-Content-Type: application/json
-
-{
- "name": "éĄčçźćç§°",
- "description": "éĄčçźæèż°",
- "created_by": "human"
-}
-```
-
-#### è·ćææéĄčçź
-```http
-GET /api/projects
-```
-
-#### è·ćéĄčçźèŻŠæ
-```http
-GET /api/projects/:id
-```
-
-#### æŽæ°éĄčçź
-```http
-PUT /api/projects/:id
-Content-Type: application/json
-
-{
- "name": "æ°ćç§°",
- "description": "æ°æèż°",
- "status": "active" | "archived"
-}
-```
-
-### ćäœè§çșŠ
-
-#### èźŸçœźć
šć±ćäœè§çșŠ
-```http
-POST /api/rules/global
-Content-Type: application/json
-
-{
- "content": "# ć
šć±ćäœè§çșŠ\n\néçšäșææéĄčçź...",
- "created_by": "human"
-}
-```
-
-#### è·ćć
šć±ćäœè§çșŠ
-```http
-GET /api/rules/global
-
-ććș:
-{
- "id": "xxx",
- "content": "è§çșŠć
ćźčïŒMarkdownïŒ",
- "created_by": "human",
- "created_at": 1234567890,
- "updated_at": 1234567890
-}
-```
-
-#### èźŸçœźéĄčçźćäœè§çșŠ
-```http
-POST /api/projects/:projectId/rules
-Content-Type: application/json
-
-{
- "content": "ćäœè§çșŠć
ćźčïŒMarkdownïŒ",
- "created_by": "human"
-}
-```
-
-#### è·ććäœè§çșŠ
-```http
-GET /api/projects/:projectId/rules
-```
-
-### 俥æŻć
±äș«æž
ć
-
-#### æ·»ć ć
±äș«çŹèź°
-```http
-POST /api/projects/:projectId/notes
-Content-Type: application/json
-
-{
- "content": "çŹèź°ć
ćźčïŒMarkdownïŒ",
- "created_by": "human" | "agent_id"
-}
-```
-
-#### è·ćć
±äș«çŹèź°ćèĄš
-```http
-GET /api/projects/:projectId/notes
-```
-
-#### æŽæ°ć
±äș«çŹèź°
-```http
-PUT /api/projects/:projectId/notes/:noteId
-Content-Type: application/json
-
-{
- "content": "æŽæ°ćçć
ćźč"
-}
-```
-
-#### ć é€ć
±äș«çŹèź°
-```http
-DELETE /api/projects/:projectId/notes/:noteId
-```
-
-### ä»»ćĄçźĄçïŒćąćŒșïŒ
-
-#### ćć»șä»»ćĄ
-```http
-POST /api/tasks
-Content-Type: application/json
-
-{
- "project_id": "éĄčçźID", // ćż
楫
- "parent_task_id": "ç¶ä»»ćĄID", // ćŻéïŒćć»șćä»»ćĄæ¶äœżçš
- "title": "ä»»ćĄæ éą",
- "description": "# ä»»ćĄæèż°\n\näœżçš **Markdown** æ ŒćŒ",
- "task_type": "development", // requirement | design | development | testing | deployment
- "priority": "normal", // low | normal | high
- "created_by": "human"
-}
-```
-
-#### è·ćä»»ćĄćèĄš
-```http
-GET /api/tasks?project_id=xxx&status=initial&root=true
-
-ćæ°ïŒ
-- project_id: æéĄčçźèżæ»€
-- status: initial | in_progress | testing_pending | testing | completed
-- parent_task_id: è·ćæä»»ćĄçćä»»ćĄ
-- root=true: ćȘè·ćæ čä»»ćĄïŒæ ç¶ä»»ćĄïŒ
-```
-
-#### è·ćä»»ćĄèŻŠæ
ïŒć«ćä»»ćĄćéä»¶ïŒ
-```http
-GET /api/tasks/:id
-
-ććș:
-{
- "id": "xxx",
- "title": "...",
- ...
- "subtasks": [ ... ], // ćä»»ćĄćèĄš
- "attachments": [ ... ] // éä»¶ćèĄš
-}
-```
-
-#### éąćä»»ćĄïŒæșèœäœäŒćæ¶æ¶ć°ć
šć±è§çșŠćéĄčçźè§çșŠïŒ
-```http
-POST /api/tasks/:id/claim
-Content-Type: application/json
-
-{
- "agent_id": "æșèœäœID"
-}
-
-ććșïŒćŠææè§çșŠïŒ:
-{
- "message": "ä»»ćĄéąćæć",
- "collaboration_rules": {
- "global_rules": "ć
šć±ćäœè§çșŠć
ćźč",
- "project_rules": "éĄčçźćäœè§çșŠć
ćźč"
- },
- "notice": "â ïž èŻ·äž„æ Œé”ćźćäœè§çșŠ"
-}
-```
-
-#### æŽæ°ä»»ćĄ
-```http
-PUT /api/tasks/:id
-Content-Type: application/json
-
-{
- "status": "in_progress",
- "description": "æŽæ°æèż°",
- "task_type": "testing",
- "priority": "high",
- "result": "ä»»ćĄç»æ"
-}
-```
-
-### é件知ç
-
-#### äžäŒ éä»¶
-```http
-POST /api/tasks/:taskId/attachments
-Content-Type: multipart/form-data
-
-file: [æä»¶]
-uploaded_by: "human" | "agent_id"
-
-éć¶ïŒćæä»¶æć€§ 10MB
-```
-
-#### è·ćä»»ćĄéä»¶ćèĄš
-```http
-GET /api/tasks/:taskId/attachments
-
-ććș:
-[
- {
- "id": "xxx",
- "filename": "...",
- "original_name": "ćć§æä»¶ć",
- "file_size": 12345,
- "mime_type": "image/png",
- "url": "/uploads/xxx",
- ...
- }
-]
-```
-
-#### ć é€éä»¶
-```http
-DELETE /api/tasks/:taskId/attachments/:attachmentId
-```
-
-### ç»èźĄäżĄæŻïŒćąćŒșïŒ
-
-```http
-GET /api/stats
-
-ććș:
-{
- "total_agents": 5,
- "active_agents": 2,
- "total_projects": 3,
- "total_tasks": 20,
- "tasks_by_status": {
- "initial": 5,
- "in_progress": 3,
- "testing_pending": 2,
- "testing": 1,
- "completed": 9
- },
- "tasks_by_type": {
- "requirement": 4,
- "design": 3,
- "development": 8,
- "testing": 3,
- "deployment": 2
- }
-}
-```
-
-## đïž æ°æźćșćæŽ
-
-### æ°ćąèĄš
-
-1. **projects** - éĄčçźèĄš
- - id, name, description, created_by, created_at, updated_at, status
-
-2. **collaboration_rules** - ćäœè§çșŠèĄš
- - id, project_id, content, created_by, created_at, updated_at
-
-3. **project_notes** - éĄčçźć
±äș«çŹèź°èĄš
- - id, project_id, content, created_by, created_at, updated_at
-
-4. **attachments** - éä»¶èĄš
- - id, task_id, filename, original_name, file_path, file_size, mime_type, uploaded_by, uploaded_at
-
-### äżźæčèĄš
-
-**tasks** èĄšæ°ćąćæź”ïŒ
-- `project_id` - æć±éĄčçźïŒć€éźïŒćż
楫ïŒ
-- `parent_task_id` - ç¶ä»»ćĄIDïŒć€éźïŒćŻéïŒ
-- `task_type` - ä»»ćĄç±»ćïŒrequirement/design/development/testing/deploymentïŒ
-- ç¶æćŒæŽæ°äžșïŒinitial | in_progress | testing_pending | testing | completed
-
-## đ§ äœżçšç€șäŸ
-
-### Python ćźąæ·ç«Żç€șäŸ
-
-```python
-import requests
-
-API_BASE = "http://localhost:3000/api"
-
-# 1. ćć»șéĄčçź
-project = requests.post(f"{API_BASE}/projects", json={
- "name": "æșèœćźąæçł»ç»",
- "description": "ćșäș AI çćźąæçł»ç»ćŒćéĄčçź"
-}).json()
-
-project_id = project['id']
-
-# 2. èźŸçœźćäœè§çșŠ
-requests.post(f"{API_BASE}/projects/{project_id}/rules", json={
- "content": """
-# ćäœè§çșŠ
-
-1. **代ç è§è**: äž„æ Œé”ćŸȘ PEP 8
-2. **æäș€è§è**: æŻæŹĄæäș€ćż
饻ć
㫿”èŻ
-3. **æČéè§è**: éć°éźéąćæ¶ćšć
±äș«æž
ćèź°ćœ
-4. **æ”èŻèŠæ±**: èŠççäžäœäș 80%
- """
-})
-
-# 3. ćć»șä»»ćĄ
-task = requests.post(f"{API_BASE}/tasks", json={
- "project_id": project_id,
- "title": "èźŸèźĄæ°æźćșæ¶æ",
- "description": "## éæ±\n\nèźŸèźĄçšæ·ăäŒèŻăæ¶æŻäžćŒ èĄš",
- "task_type": "design",
- "priority": "high"
-}).json()
-
-task_id = task['id']
-
-# 4. æșèœäœæłšććč¶éąćä»»ćĄ
-agent = requests.post(f"{API_BASE}/agents/register", json={
- "name": "æ°æźćșèźŸèźĄäžćź¶",
- "type": "design",
- "capabilities": ["database_design", "sql"]
-}).json()
-
-response = requests.post(f"{API_BASE}/tasks/{task_id}/claim", json={
- "agent_id": agent['id']
-}).json()
-
-# æșèœäœäŒæ¶ć°ćäœè§çșŠ
-if 'collaboration_rules' in response:
- print("æ¶ć°ćäœè§çșŠ:")
- print(response['collaboration_rules'])
-
-# 5. æ·»ć ć
±äș«çŹèź°
-requests.post(f"{API_BASE}/projects/{project_id}/notes", json={
- "content": "æ°æźćșć·Čéæ© PostgreSQL 15",
- "created_by": agent['id']
-})
-
-# 6. äžäŒ éä»¶ïŒèźŸèźĄćŸïŒ
-with open('database_schema.png', 'rb') as f:
- requests.post(
- f"{API_BASE}/tasks/{task_id}/attachments",
- files={'file': f},
- data={'uploaded_by': agent['id']}
- )
-
-# 7. ćźæä»»ćĄ
-requests.put(f"{API_BASE}/tasks/{task_id}", json={
- "status": "completed",
- "result": "æ°æźćșæ¶æèźŸèźĄćźæïŒèŻŠè§éä»¶"
-})
-```
-
-## đ èżç§»æć
-
-ćŠæäœ æäœżçš v1 çæŹçæ°æźïŒéèŠïŒ
-
-1. **ć€ä»œæ°æźćș**
-```bash
-pg_dump agent_tasks > backup.sql
-```
-
-2. **èżèĄ v2 æćĄ**ïŒäŒèȘćšćć»șæ°èĄšïŒ
-```bash
-node server-v2.js
-```
-
-3. **æćšèżç§»ä»»ćĄ**
- - ćć»șäžäžȘé»èź€éĄčçź
- - ć°ææ v1 ä»»ćĄć
łèć°èŻ„éĄčçź
-
-## đ éšçœČ
-
-äœżçš `server-v2.js` æżä»Ł `server-postgres.js`:
-
-```bash
-DB_HOST=localhost DB_PORT=5433 DB_PASSWORD=postgres node server-v2.js
-```
-
-ææŽæ° `package.json`:
-```json
-{
- "scripts": {
- "start": "node server-v2.js"
- }
-}
-```
-
-## â ïž éèŠćæŽ
-
-1. **ææä»»ćĄćż
饻ć±äșéĄčçź** - ćć»șä»»ćĄæ¶ `project_id` äžșćż
楫
-2. **ä»»ćĄç¶æćæŽ** - ä» 3 äžȘç¶ææ©ć±ć° 5 äžȘç¶æ
-3. **æ°ćąä»»ćĄç±»ć** - ćż
饻æćźä»»ćĄç±»ć
-4. **ćäœè§çșŠćŒșć¶æšé** - æșèœäœéąćä»»ćĄæ¶èȘćšè·ćè§çșŠ
diff --git a/CHANGES-v3.1.md b/CHANGES-v3.1.md
new file mode 100644
index 0000000..94fa1b8
--- /dev/null
+++ b/CHANGES-v3.1.md
@@ -0,0 +1,270 @@
+# v3.0 ćèœäŒććźææ„ć
+
+**æ„æ**: 2026-02-24
+**çæŹ**: v3.1
+**ç¶æ**: â
ć·Čćźæ
+
+---
+
+## đ äżźæčæž
ć
+
+### äżźæč 4: 䟧èŸčæ æ¶è”·äŒć â
+
+**éæ±**: ć·ŠäŸ§ćŻŒèȘæ æ¶è”·æ¶éèæććȘæŸç€șlogo
+
+**ćźç°**:
+- æ·»ć æ¶è”·ç¶æ CSS æ ·ćŒ
+- æ¶è”·æ¶ćźœćșŠ: 240px â 60px
+- èȘćšéèæææćć
ćźč
+- ćȘæŸç€șćŸæ ć emoji
+
+**ææ**:
+```
+ć±ćŒç¶æ: đ ä»ȘèĄšç | đ€ æșèœäœçźĄç | đ éĄčçźćç§°
+æ¶è”·ç¶æ: đ | đ€ | đ
+```
+
+**CSS æčćš**:
+```css
+#sidebar.collapsed {
+ width: 60px;
+}
+
+#sidebar.collapsed .section-title,
+#sidebar.collapsed .agent-summary,
+#sidebar.collapsed .project-item span,
+#sidebar.collapsed .project-delete-btn {
+ display: none;
+}
+
+#sidebar.collapsed .project-item::before {
+ content: 'đ';
+ font-size: 20px;
+}
+```
+
+---
+
+### äżźæč 5: è§çșŠć€æĄçźçźĄç â
+
+**éæ±**: è§çșŠćșæŻæć€äžȘæĄçźïŒæŻæĄć
æŹïŒéĄčçźçŒć·ïŒè§çșŠçŒć·ïŒè§çșŠç±»ćïŒć
ćźčæèż°ïŒïŒć
šć±è§çșŠäžæćźć
·äœçéĄčçźçŒć·
+
+**æ°æźćșèĄšç»æ**:
+```sql
+CREATE TABLE rules (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ project_id INTEGER, -- NULL = ć
šć±è§çșŠ
+ rule_no TEXT NOT NULL, -- è§çșŠçŒć· (R001, R002...)
+ rule_type TEXT NOT NULL, -- è§çșŠç±»ć
+ description TEXT NOT NULL, -- ć
ćźčæèż°
+ created_at DATETIME,
+ updated_at DATETIME,
+ FOREIGN KEY (project_id) REFERENCES projects(id)
+);
+```
+
+**API 端çč**:
+| æčæł | è·ŻćŸ | èŻŽæ |
+|------|------|------|
+| GET | /api/rules/global | è·ćć
šć±è§çșŠćèĄš |
+| GET | /api/rules/project/:id | è·ćéĄčçźè§çșŠćèĄš |
+| POST | /api/rules | ćć»șè§çșŠ |
+| PUT | /api/rules/:id | æŽæ°è§çșŠ |
+| DELETE | /api/rules/:id | ć é€è§çșŠ |
+
+**ć端çéą**:
+- èĄšæ ŒćœąćŒć±ç€șè§çșŠćèĄš
+- ć: éĄčçźçŒć· / è§çșŠçŒć· / è§çșŠç±»ć / ć
ćźčæèż°
+- ć
šć±è§çșŠ Tab + éĄčçźè§çșŠ Tab
+- "æ·»ć è§çșŠ" æéź
+- èĄšćć
ć«: è§çșŠçŒć·ăç±»ćéæ©ăæèż°èŸć
„
+
+**è§çșŠç±»ć**:
+- 代ç è§è
+- æäș€è§è
+- æ”èŻè§è
+- ææĄŁè§è
+- ćźć
šè§è
+- ć
¶ä»
+
+---
+
+### äżźæč 6: ç»èźĄæ äŒć â
+
+**éæ±**: 猩ć°ç»èźĄæ æć çé«ćșŠ
+
+**æčèż**:
+1. **ćžć±æčć**: ä»ćçŽćžć±æčäžșæšȘććžć±
+2. **é«ćșŠçŒ©ć**: padding ä» 32px â 16px
+3. **ćŸæ 猩ć°**: 48px â 32px
+4. **æ°ć猩ć°**: 36px â 24px
+5. **éŽè·äŒć**: gap ä» 24px â 16px
+
+**ćŻčæŻ**:
+```
+äżźæčć:
+âââââââââââââââ
+â đ â
+â â
+â æ»éĄčçźæ° â
+â â
+â 8 â
+â â
+âââââââââââââââ
+é«ćșŠ: ~120px
+
+äżźæčć:
+âââââââââââââââ
+â đ æ»éĄčçźæ° â
+â 8 â
+âââââââââââââââ
+é«ćșŠ: ~60px (猩ć 50%)
+```
+
+**CSS æčćš**:
+```css
+.stat-card {
+ padding: var(--spacing-md); /* 16px (ć 32px) */
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-md);
+}
+
+.stat-card-icon {
+ font-size: 32px; /* ć 48px */
+}
+
+.stat-card-value {
+ font-size: 24px; /* ć 36px */
+}
+```
+
+---
+
+## đ 代ç ćć
+
+| æä»¶ | äżźæčć | äżźæčć | ćąé |
+|------|--------|--------|------|
+| index-v3.html | 2406 èĄ | 2582 èĄ | +176 èĄ |
+| server-v3.js | 285 èĄ | 343 èĄ | +58 èĄ |
+| **æ»èźĄ** | **2691 èĄ** | **2925 èĄ** | **+234 èĄ** |
+
+---
+
+## đ§Ș æ”èŻç»æ
+
+### 䟧èŸčæ æ”èŻ â
+- [x] çč㻿㠿éź
+- [x] ćźœćșŠććæ”ç
+- [x] æćæŁçĄźéè
+- [x] ćŸæ ć±
äžæŸç€ș
+- [x] hover æç€șæŁćžž
+
+### è§çșŠćèœæ”èŻ â
+- [x] ćć»șć
šć±è§çșŠ
+- [x] ćć»șéĄčçźè§çșŠ
+- [x] è§çșŠćèĄšæŸç€ș
+- [x] Tab ćæąæŁćžž
+- [x] èĄšæ ŒæžČæćźæŽ
+
+**æ”èŻæ°æź**:
+```bash
+curl -X POST http://localhost:3000/api/rules \
+ -H "Content-Type: application/json" \
+ -d '{
+ "rule_no": "R001",
+ "rule_type": "代ç è§è",
+ "description": "ææä»Łç ćż
饻éèż ESLint æŁæ„"
+ }'
+
+# ććș: {"id":1, "rule_no":"R001", ...}
+```
+
+### ç»èźĄæ æ”èŻ â
+- [x] é«ćșŠææŸçŒ©ć°
+- [x] æšȘććžć±æŁçĄź
+- [x] ćŸæ ćæ°ććŻčéœ
+- [x] ććșćŒæŁćžž
+- [x] hover ææäżç
+
+---
+
+## đ ćœ±ćæä»¶
+
+### æ°ćą
+- `test-rules.sh` - è§çșŠ API æ”èŻèæŹ
+
+### äżźæč
+- `public/index-v3.html` - ć端çéą
+ - 䟧èŸčæ æ¶è”·æ ·ćŒ
+ - ç»èźĄćĄçćžć±
+ - è§çșŠçźĄççéą
+- `server-v3.js` - ć端æćĄćš
+ - è§çșŠæ°æźćșèĄš
+ - è§çșŠ CRUD API
+
+---
+
+## đŻ ćèœćŻčæŻ
+
+| ćèœ | äżźæčć | äżźæčć |
+|------|--------|--------|
+| 䟧èŸčæ æ¶è”· | ä»
猩ć°ćźœćșŠ | éèæććȘæŸç€șćŸæ â
|
+| è§çșŠçźĄç | MarkdownćææŹ | 〿ĄçźèĄšæ ŒçźĄç â
|
+| ç»èźĄæ é«ćșŠ | ~120px | ~60px â
|
+
+---
+
+## đ äœżçšèŻŽæ
+
+### 䟧èŸčæ æäœ
+1. çčć»ć·Šäžè§ â° æéź
+2. 䟧èŸčæ æ¶è”·ïŒćȘæŸç€șćŸæ
+3. ćæŹĄçčć»ć±ćŒ
+
+### è§çșŠçźĄç
+1. çčć»éĄ¶éš "đ è§çșŠ" æéź
+2. éæ© "ć
šć±è§çșŠ" æ "éĄčçźè§çșŠ" Tab
+3. çčć» "+ æ·»ć è§çșŠ" æéź
+4. 楫ć:
+ - è§çșŠçŒć· (ćŠ R001)
+ - è§çșŠç±»ć (éæ©)
+ - ć
ćźčæèż°
+5. æäș€äżć
+
+### æ„çç»èźĄ
+- Dashboard 饔éąèȘćšæŸç€ș
+- 4äžȘç»èźĄćĄç玧ćæć
+- äžçźäșç¶
+
+---
+
+## â
éȘæ¶çĄźèź€
+
+### ćèœćźæŽæ§
+- [x] 䟧èŸčæ æ¶è”·æŁćžžć·„äœ
+- [x] è§çșŠć€æĄçźçźĄçćźæŽ
+- [x] ç»èźĄæ é«ćșŠć·Č猩ć°
+- [x] ææ API æ”èŻéèż
+- [x] ć端çéąçŸè§
+
+### çšæ·äœéȘ
+- [x] äș€äșæ”ç
æ ćĄéĄż
+- [x] çéąćžć±ćç
+- [x] æç€șäżĄæŻæž
æ°
+- [x] ććșćŒéé
æŁćžž
+
+---
+
+## đ æłšæäșéĄč
+
+1. **䟧èŸčæ ç¶æ**: æ¶è”·ç¶æäžäŒæäč
ćïŒć·æ°éĄ”éąćæąć€ć±ćŒ
+2. **è§çșŠçŒć·**: ć»șèźźäœżçšç»äžæ ŒćŒïŒćŠ R001, R002, R003...
+3. **ç»èźĄæ **: æ°æźæŻ30ç§èȘćšć·æ°
+
+---
+
+**äżźæčćźææ¶éŽ**: 2026-02-24 10:53
+**äżźæčäșș**: AI Assistant
+**ç¶æ**: â
çäș§ć°±ç»Ș
+**èźżéźć°ć**: http://10.0.6.5:3000/index-v3.html
diff --git a/DESIGN-v3.md b/DESIGN-v3.md
index d831bb0..f445760 100644
--- a/DESIGN-v3.md
+++ b/DESIGN-v3.md
@@ -4,18 +4,24 @@
- **çæŹ**: v3.0
- **èźŸèźĄæ„æ**: 2026-02-15
+- **ææŻæ **: Vue 3 + Vite + Element Plus + Pinia
- **èźŸèźĄćž**: AI Assistant
-- **ćźĄæ žç¶æ**: â
ć·Čéèż
+- **ćźĄæ žç¶æ**: đ ćŸ
ćźĄæ ž
---
## đŻ èźŸèźĄçźæ
-1. æćçšæ·äœéȘïŒéçšéĄčçźçźĄçć·„ć
·çç»ć
žćžć±
-2. ć
ćć©çšæ°æźç»æïŒéĄčçź-ä»»ćĄ-ćä»»ćĄçć±çș§ć
łçł»ïŒ
-3. ćŻè§ćä»»ćĄæ”èœŹèżçšïŒKanbançæżïŒ
-4. ćć°éĄ”éąè·łèœŹïŒæé«æäœæç
-5. æŻæćż«æ·éźćææœçé«çș§äș€äș
+### æ žćżçźæ
+1. **æćçšæ·äœéȘ** - éçšç°ä»ŁéĄčçźçźĄçć·„ć
·çç»ć
žćžć±ïŒç±»äŒŒ Jira / TrelloïŒ
+2. **ćŻè§ćæ”çš** - éèż Kanban çæżæž
æ°ć±ç€șä»»ćĄæ”èœŹèżçš
+3. **ćć°è·łèœŹ** - ć©çšäŸ§èŸčæ ăæ”źć±ćć°éĄ”éąè·łèœŹïŒæé«æäœæç
+4. **ć±çș§çźĄç** - ć
ćć©çšéĄčçźâä»»ćĄâćä»»ćĄçć±çș§ć
łçł»
+5. **æșèœäș€äș** - æŻæææœăćż«æ·éźăćźæ¶æŽæ°çé«çș§äș€äș
+
+### çšæ·è§èČ
+- **äșșç±»çšæ·** - éĄčçźçźĄçè
ïŒćć»șéĄčçźăćé
ä»»ćĄăćźĄæ žç»æ
+- **æșèœäœ** - ä»»ćĄæ§èĄè
ïŒéąćä»»ćĄăćźæć·„äœăäžäŒ ææ
---
@@ -24,44 +30,1003 @@
### ćžć±ç»æ
```
-âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
-â Header (ćșćźéĄ¶éšïŒ60px) â
-â Logo | ć
šć±ç»èźĄ | è§çșŠ | éç„ | çšæ· â
-ââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââ€
-â â â
-â Sidebar â Main Content â
-â (240px) â (auto width) â
-â â â
-â éĄčçźćèĄšâ âą éĄčçźæŠè§éĄ” â
-â æșèœäœ â âą ä»»ćĄçæż/ćèĄš/æ ćœą â
-â â âą æșèœäœçźĄç饔 â
-â (ćŻæć )â â
-â â â
-ââââââââââââŽâââââââââââââââââââââââââââââââââââââââââââââââââââ
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â Header (ćșćźéĄ¶éšïŒ60px) â
+â đ€ çł»ç»ć | đéĄčçź3 đä»»ćĄ15 đ€æșèœäœ5/8 | đè§çșŠ đéç„ â
+ââââââââââââââŹâââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â â
+â Sidebar â Main Content Area â
+â (240px) â (èȘéćșćźœćșŠ) â
+â â â
+â đ éĄčçź â ââââââââââââââââââââââââââââââââââââââââââââââââ â
+â âą éĄčçźA â â â â
+â âą éĄčçźB â â ćšæè·Żç±ć
ćźčćș â â
+â âą éĄčçźC â â - Dashboard ä»ȘèĄšç â â
+â â â - TaskBoard ä»»ćĄçæż â â
+â âââââââââ â â - ProjectDetail éĄčçźèŻŠæ
â â
+â â â - AgentList æșèœäœçźĄç â â
+â đ€ æșèœäœ â â â â
+â âȘ ç©șéČ:3 â ââââââââââââââââââââââââââââââââââââââââââââââââ â
+â đą ć·„äœ:2 â â
+â â â
+â [æć æéź] â â
+ââââââââââââââŽâââââââââââââââââââââââââââââââââââââââââââââââââââââ
+
+ ââââââââââââââââââââââââââââ
+ â TaskDetail Sidebar â
+ â (ćłäŸ§æ»ćșïŒ480px) â
+ â â
+ â ä»»ćĄèŻŠæ
ăçŒèŸăéä»¶ â
+ â ćä»»ćĄçźĄç â
+ â â
+ ââââââââââââââââââââââââââââ
```
-ćźæŽèźŸèźĄææĄŁèŻ·è§: DESIGN-v3.md
+### ææŻæ¶æ
+
+```
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â Vue 3 Application â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â
+â Presentation Layer (è§ćŸć±) â
+â âââââââââââââââŹââââââââââââââŹâââââââââââââââ â
+â â Layouts â Views â Components â â
+â â MainLayout â Dashboard â TaskCard â â
+â â â TaskBoard â MarkdownEd â â
+â â â AgentList â FileUpload â â
+â âââââââââââââââŽââââââââââââââŽâââââââââââââââ â
+â â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â
+â State Management (ç¶æçźĄç - Pinia) â
+â ââââââââââââŹâââââââââââŹâââââââââââŹâââââââââââ â
+â â project â task â agent â stats â â
+â â store â store â store â store â â
+â ââââââââââââŽâââââââââââŽâââââââââââŽâââââââââââ â
+â â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â
+â API Layer (æ„ćŁć±) â
+â ââââââââââââââââââââââââââââââââââââââââââââ â
+â â axios instance + interceptors â â
+â â project.js task.js agent.js ... â â
+â ââââââââââââââââââââââââââââââââââââââââââââ â
+â â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â
+â Utilities (ć·„ć
·ć±) â
+â ââââââââââââââââââââââââââââââââââââââââââââ â
+â â constants date markdown helpers â â
+â ââââââââââââââââââââââââââââââââââââââââââââ â
+â â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+ â HTTP
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â Backend API (Node.js) â
+â /api/projects /api/tasks ... â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+```
---
-## đ ćŒćèźĄć
+## đš 饔éąèŻŠç»èźŸèźĄ
-### Phase 1-6 ć
±èźĄ 11-17 ć°æ¶
+### 1. Dashboard - ä»ȘèĄšç
-1. ćșçĄćžć± (1-2h)
-2. éĄčçźçźĄç (2-3h)
-3. ä»»ćĄçæż (3-4h)
-4. ä»»ćĄèŻŠæ
(2-3h)
-5. æșèœäœçźĄç (1-2h)
-6. äŒćæ”èŻ (2-3h)
+**è·Żç±**: `/`
+
+**ćèœ**: ć
šć±æ°æźæŠè§ïŒćż«éèźżéźć
„ćŁ
+
+**ćžć±**:
+
+```
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â đ ä»ȘèĄšç â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â
+â ââââââââââ ââââââââââ ââââââââââ ââââââââââ â
+â âđ â âđ â âđĄ â ââ
â â
+â âéĄčçźæ»æ°â âä»»ćĄæ»æ°â âèżèĄäž â âć·Čćźæ â â
+â â 8 â â 45 â â 12 â â 28 â â
+â ââââââââââ ââââââââââ ââââââââââ ââââââââââ â
+â â
+ââââââââââââââââââââââââââââŹâââââââââââââââââââââââââââââââ€
+â â â
+â đ ä»»ćĄç¶æććž â đ ä»»ćĄç±»ćććž â
+â ââââââââââââââââââââââ â ââââââââââââââââââââââ â
+â â â â â â â
+â â é„ŒćŸ (ECharts) â â â é„ŒćŸ (ECharts) â â
+â â â â â â â
+â â âą ćć§ 5 â â â âą éæ± 8 â â
+â â âą èżèĄäž 12 â â â âą èźŸèźĄ 6 â â
+â â âą ćŸ
æ”èŻ 3 â â â âą ćŒć 18 â â
+â â âą æ”èŻäž 2 â â â âą æ”èŻ 7 â â
+â â âą ćźæ 28 â â â âą éšçœČ 6 â â
+â ââââââââââââââââââââââ â ââââââââââââââââââââââ â
+â â â
+ââââââââââââââââââââââââââââŽâââââââââââââââââââââââââââââââ
+â â
+â đ æèżæŽ»è·éĄčçź â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â éĄčçźćç§° â æèż° â ćć»șæ¶éŽ â â
+â ââââââââââââââââââââââââââââââââââââââââââââââââââââ†â
+â â æșèœćźąæçł»ç» â AIćźąæ... â 2怩ć [æ„ç]â â
+â â æ°æźćæćčłć° â ć€§æ°æź... â 5怩ć [æ„ç]â â
+â â çšæ·ç»ćçł»ç» â çšæ·æ çŸ... â 1ćšć [æ„ç]â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+```
+
+**ç»ä»¶**:
+- `el-statistic` - ç»èźĄćĄç
+- `v-chart` (ECharts) - 鄌ćŸ
+- `el-table` - éĄčçźćèĄš
+
+**äș€äș**:
+- çčć»ç»èźĄćĄç â è·łèœŹć°ćŻčćșçéçä»»ćĄćèĄš
+- çčć»ćŸèĄšćșć â é«äșźćŻčćșæ°æź
+- çčć»éĄčçźćç§° â è·łèœŹć°éĄčçźèŻŠæ
---
-## â
æ žćżçčæ§
+### 2. TaskBoard - ä»»ćĄçæżïŒKanbanïŒ
-- â
ć·ŠäŸ§ćŻŒèȘ + äž»ć
ćźčćșćžć±
-- â
Kanban çæżææœ
-- â
ä»»ćĄèŻŠæ
䟧èŸčæ
-- â
ćźæ¶ç»èźĄæŽæ°
-- â
Markdown æžČæ
-- â
ććșćŒèźŸèźĄ
+**è·Żç±**: `/tasks/board/:projectId`
+
+**ćèœ**: ćŻè§ćä»»ćĄæ”èœŹïŒææœæčćç¶æ
+
+**ćžć±**:
+
+```
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â đ ä»»ćĄçæż - æșèœćźąæçł»ç» â
+â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â [+ æ°ć»șä»»ćĄ] [đ æçŽą...] [ç±»ćâŒ] [äŒć
çș§âŒ] [çéâŒ] â â
+â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â
+â ââââââââââ ââââââââââ ââââââââââ ââââââââââ ââââââââââ â
+â â ćć§ â âèżèĄäž â âćŸ
æ”èŻ â âæ”èŻäž â â ćźæ â â
+â â (5) â â (12) â â (3) â â (2) â â (28) â â
+â âââââââââ†âââââââââ†âââââââââ†âââââââââ†âââââââââ†â
+â â â â â â â â â â â â
+â â ââââââ â â ââââââ â â ââââââ â â ââââââ â â ââââââ â â
+â â âä»»ćĄâ â â âä»»ćĄâ â â âä»»ćĄâ â â âä»»ćĄâ â â âä»»ćĄâ â â
+â â âćĄçâ â â âćĄçâ â â âćĄçâ â â âćĄçâ â â âćĄçâ â â
+â â â 1 â â â â 3 â â â â 7 â â â â 9 â â â â10 â â â
+â â ââââââ â â ââââââ â â ââââââ â â ââââââ â â ââââââ â â
+â â â â â â â â â â â â
+â â ââââââ â â ââââââ â â ââââââ â â ââââââ â â ââââââ â â
+â â âä»»ćĄâ â â âä»»ćĄâ â â âä»»ćĄâ â â âä»»ćĄâ â â âä»»ćĄâ â â
+â â âćĄçâ â â âćĄçâ â â âćĄçâ â â âćĄçâ â â âćĄçâ â â
+â â â 2 â â â â 4 â â â â 8 â â â â â â â â11 â â â
+â â ââââââ â â ââââââ â â ââââââ â â ââââââ â â ââââââ â â
+â â ... â â ... â â â â â â ... â â
+â â â â â â â â â â â â
+â ââââââââââ ââââââââââ ââââââââââ ââââââââââ ââââââââââ â
+â ćŻææœ âââââââââââ â
+â â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+```
+
+**ä»»ćĄćĄçèźŸèźĄ**:
+
+```
+ââââââââââââââââââââââââââââââââââââââââ
+â ćźç°çšæ·ç»ćœćèœ â â æ éą (14px, ć çČ)
+â âââââââââââââââââââââââââââââââââ â
+â [ćŒć] [é«äŒć
çș§] â â ćŸœç« (ç±»ć + äŒć
çș§)
+â âââââââââââââââââââââââââââââââââ â
+â đ€ Agent-001 đ 3/5 đ 2 â â ćșéšäżĄæŻ
+ââââââââââââââââââââââââââââââââââââââââ
+ â ćé
çæșèœäœ âćä»»ćĄ âéä»¶æ°
+```
+
+**ćĄçéąèČè§è**:
+- **ä»»ćĄç±»ććŸœç« **:
+ - éæ±: 玫èČ `#9C27B0`
+ - èźŸèźĄ: èèČ `#2196F3`
+ - ćŒć: 绿èČ `#4CAF50`
+ - æ”èŻ: æ©èČ `#FF9800`
+ - éšçœČ: çșąèČ `#F44336`
+
+- **äŒć
çș§ćŸœç« **:
+ - é«: çșąèČèæŻ
+ - æźé: é»èź€
+ - äœ: ç°èČèæŻ
+
+**ç»ä»¶**:
+- `draggable` (vuedraggable) - ææœćźčćš
+- `TaskCard` - èȘćźäčä»»ćĄćĄçç»ä»¶
+- `el-input` - æçŽąæĄ
+- `el-select` - çéäžæ
+
+**äș€äș**:
+1. **ææœ** - æćšä»»ćĄćĄçć°ć
¶ä»ćæčćç¶æ
+2. **çčć»ćĄç** - æćŒćłäŸ§ä»»ćĄèŻŠæ
Sidebar
+3. **çé** - æç±»ćăäŒć
çș§ăć
łéźèŻçé
+4. **æçŽą** - ćźæ¶æçŽąä»»ćĄæ éąćæèż°
+
+---
+
+### 3. TaskDetail Sidebar - ä»»ćĄèŻŠæ
䟧èŸčæ
+
+**è§ŠćæčćŒ**: çčć»ä»»ćĄćĄç
+
+**äœçœź**: ä»ćłäŸ§æ»ć
„ïŒèŠçćšäž»ć
ćźčćșäžæč
+
+**ćźœćșŠ**: `480px`
+
+**ćžć±**:
+
+```
+ ââââââââââââââââââââââââââââââââ
+ â Ă â
+ â ćźç°çšæ·ç»ćœćèœ â
+ â âââââââââââââââââââââââââ â
+ â [çŒèŸ] [ć é€] â
+ ââââââââââââââââââââââââââââââââ€
+ â â
+ â đ ćșæŹäżĄæŻ â
+ â ç¶æ: [èżèĄäž âŒ] â
+ â ç±»ć: [ćŒć âŒ] â
+ â äŒć
çș§: [é« âŒ] â
+ â ćć»șè
: äșșç±» â
+ â ćé
ç»: Agent-001 â
+ â ćć»șæ¶éŽ: 2怩ć â
+ â â
+ â âââââââââââââââââââââââââ â
+ â â
+ â đ æèż° â
+ â ââââââââââââââââââââââââ â
+ â â â â
+ â â ## éæ± â â
+ â â ćźç°çšæ·ç»ćœ... â â
+ â â â â
+ â â ## ææŻèŠæ± â â
+ â â - JWTèź€èŻ â â
+ â â - ćŻç ć ćŻ â â
+ â â â â
+ â ââââââââââââââââââââââââ â
+ â [çŒèŸæèż°] â
+ â â
+ â âââââââââââââââââââââââââ â
+ â â
+ â đ éä»¶ (2) â
+ â [èźŸèźĄćŸ.png] [äžèœœ] â â
+ â [APIææĄŁ.pdf] [äžèœœ] â â
+ â [+ äžäŒ éä»¶] â
+ â â
+ â âââââââââââââââââââââââââ â
+ â â
+ â đ ćä»»ćĄ (3/5 ćźæ) â
+ â â ć端ç»ćœéĄ”éą â
+ â â ć端APIæ„ćŁ â
+ â â ćć
æ”èŻ â
+ â â éææ”èŻ â
+ â â ææĄŁæŽæ° â
+ â [+ æ·»ć ćä»»ćĄ] â
+ â â
+ â âââââââââââââââââââââââââ â
+ â â
+ â đŹ èŻèźș (ćłć°äžçșż) â
+ â â
+ ââââââââââââââââââââââââââââââââ
+```
+
+**ç»ä»¶**:
+- `el-drawer` - æœć±ç»ä»¶
+- `el-select` - äžæéæ©ćš
+- `MarkdownEditor` - èȘćźäč Markdown çŒèŸćš
+- `FileUpload` - èȘćźäčæä»¶äžäŒ ç»ä»¶
+- `SubtaskList` - èȘćźäčćä»»ćĄćèĄš
+
+**äș€äș**:
+- çčć» `Ă` æçčć»éźçœ©ć±ć
łé
+- äžæéæ©ćšćłæ¶æŽæ°ïŒćžŠéČæïŒ
+- éä»¶ææœäžäŒ
+- ćä»»ćĄçčć»ćæąç¶æ
+
+---
+
+### 4. ProjectDetail - éĄčçźèŻŠæ
+
+**è·Żç±**: `/projects/:id`
+
+**ćèœ**: æ„çéĄčçźèŻŠæ
ăè§çșŠăć
±äș«çŹèź°
+
+**ćžć±**:
+
+```
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â đ æșèœćźąæçł»ç» [çŒèŸ] [ćœæĄŁ] â
+â äžäžȘćșäșAIçæșèœćźąæçł»ç»... â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â [æŠè§] [ä»»ćĄćèĄš] [ćäœè§çșŠ] [ć
±äș«çŹèź°] [ç»èźĄ] â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â
+â Tab 1 - æŠè§ â
+â ââââââââââââ ââââââââââââ ââââââââââââ â
+â â æ»ä»»ćĄ â â èżèĄäž â â ć·Čćźæ â â
+â â 45 â â 12 â â 28 â â
+â ââââââââââââ ââââââââââââ ââââââââââââ â
+â â
+â æèżä»»ćĄ â
+â âą [ćŒć] ćźç°çšæ·ç»ćœ Agent-001 èżèĄäž â
+â âą [èźŸèźĄ] æ°æźćșèźŸèźĄ Agent-002 ćŸ
æ”èŻ â
+â âą [æ”èŻ] ćć
æ”èŻ Agent-003 ćźæ â
+â â
+â [æ„çćźæŽçæż] â
+â â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â
+â Tab 2 - ćäœè§çșŠ (Markdown) â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â # ćäœè§çșŠ â â
+â â â â
+â â ## 代ç è§è â â
+â â - é”ćŸȘ PEP 8 â â
+â â - æäș€ććż
饻éèż lint â â
+â â â â
+â â ## æäș€è§è â â
+â â - äœżçš conventional commits â â
+â â â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â [çŒèŸè§çșŠ] â
+â â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â
+â Tab 3 - ć
±äș«çŹèź° â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â đ æ°æźćșéćçĄźćź Agent-001 â â
+â â PostgreSQL 15 + Redis 2怩ć â â
+â ââââââââââââââââââââââââââââââââââââââââââââââââââââ†â
+â â đ APIèźŸèźĄćźæ äșșç±» â â
+â â RESTful APIèźŸèźĄææĄŁć·ČäžäŒ 3怩ć â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â [+ æ°ć»șçŹèź°] â
+â â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+```
+
+**ç»ä»¶**:
+- `el-tabs` - ééĄčćĄ
+- `el-statistic` - ç»èźĄćĄç
+- `MarkdownViewer` - Markdown æžČæćš
+- `el-timeline` - æ¶éŽçșżïŒçŹèź°ćèĄšïŒ
+
+---
+
+### 5. AgentList - æșèœäœçźĄç
+
+**è·Żç±**: `/agents`
+
+**ćèœ**: æ„çæșèœäœç¶æăæłšćæ°æșèœäœ
+
+**ćžć±**:
+
+```
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â đ€ æșèœäœçźĄç [æłšćæ°æșèœäœ] â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â [ć
šéš(8)] [ç©șéČ(3)] [ć·„äœäž(5)] â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â â
+â ćç§° ç¶æ ćœćä»»ćĄ ćźææ° æććżè·łâ
+â ââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â Agent-001 đąć·„äœ ćźç°ç»ćœ 12 1ćéćâ
+â Agent-002 đąć·„äœ æ°æźćșèźŸèźĄ 8 2ćéćâ
+â Agent-003 âȘç©șéČ - 15 5ćéćâ
+â Agent-004 đąć·„äœ ćć
æ”èŻ 6 1ćéćâ
+â Agent-005 âȘç©șéČ - 9 3ćéćâ
+â Agent-006 đąć·„äœ ć端ćŒć 11 1ćéćâ
+â Agent-007 âȘç©șéČ - 13 4ćéćâ
+â Agent-008 đąć·„äœ APIćŒć 7 2ćéćâ
+â â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+
+éäžæäžȘæșèœäœćïŒćłäŸ§æŸç€șèŻŠæ
:
+
+ââââââââââââââââââââââââââââââ
+â Agent-001 â
+â ââââââââââââââââââââââââââ
+â ç±»ć: ćŒć â
+â èœć: â
+â âą backend â
+â âą python â
+â âą database â
+â â
+â ćœćä»»ćĄ: â
+â ćźç°çšæ·ç»ćœćèœ â
+â â
+â ććČç»èźĄ: â
+â âą æ»ćźæ: 12 â
+â âą ćčłćçšæ¶: 2.3ć°æ¶ â
+â âą æćç: 95% â
+â â
+â æććżè·ł: 1ćéć â
+â æłšćæ¶éŽ: 2ćšć â
+ââââââââââââââââââââââââââââââ
+```
+
+**ç»ä»¶**:
+- `el-table` - æșèœäœćèĄšèĄšæ Œ
+- `el-tag` - ç¶ææ çŸ
+- `el-descriptions` - èŻŠæ
æèż°ćèĄš
+
+---
+
+## đš è§è§èźŸèźĄè§è
+
+### éąèČçł»ç»
+
+```scss
+// äž»éąèČ
+$primary: #667eea; // äž»èČïŒæžćè”·çčïŒ
+$primary-dark: #764ba2; // äž»èČïŒæžćç»çčïŒ
+
+// ç¶æèČ
+$success: #67C23A; // æć/ćźæ
+$warning: #E6A23C; // èŠć/èżèĄäž
+$danger: #F56C6C; // ć±é©/ć é€
+$info: #909399; // 俥æŻ/ćć§
+
+// ä»»ćĄç¶æèČ
+$status-initial: #3498db; // ćć§ - èèČ
+$status-in-progress: #f39c12; // èżèĄäž - æ©èČ
+$status-testing-pending: #9b59b6; // ćŸ
æ”èŻ - 玫èČ
+$status-testing: #e67e22; // æ”èŻäž - æ·±æ©
+$status-completed: #27ae60; // ćźæ - 绿èČ
+
+// ä»»ćĄç±»ćèČ
+$type-requirement: #9C27B0; // éæ± - 玫èČ
+$type-design: #2196F3; // èźŸèźĄ - èèČ
+$type-development: #4CAF50; // ćŒć - 绿èČ
+$type-testing: #FF9800; // æ”èŻ - æ©èČ
+$type-deployment: #F44336; // éšçœČ - çșąèČ
+
+// ç°ćșŠèČ
+$text-primary: #303133;
+$text-regular: #606266;
+$text-secondary: #909399;
+$text-placeholder: #C0C4CC;
+
+$border-base: #DCDFE6;
+$border-light: #E4E7ED;
+$border-lighter: #EBEEF5;
+$border-extra-light: #F2F6FC;
+
+$bg-base: #FFFFFF;
+$bg-light: #F5F7FA;
+$bg-dark: #F0F2F5;
+```
+
+### éŽè·çł»ç»
+
+```scss
+$spacing-xs: 4px;
+$spacing-sm: 8px;
+$spacing-md: 16px;
+$spacing-lg: 24px;
+$spacing-xl: 32px;
+$spacing-xxl: 48px;
+```
+
+### ćè§
+
+```scss
+$radius-sm: 4px;
+$radius-md: 8px;
+$radius-lg: 12px;
+$radius-xl: 16px;
+```
+
+### éŽćœ±
+
+```scss
+$shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.08);
+$shadow-md: 0 4px 8px rgba(0, 0, 0, 0.12);
+$shadow-lg: 0 8px 16px rgba(0, 0, 0, 0.15);
+```
+
+### ćäœ
+
+```scss
+$font-family-base: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
+$font-family-mono: 'Consolas', 'Monaco', 'Courier New', monospace;
+
+$font-size-xs: 12px;
+$font-size-sm: 13px;
+$font-size-md: 14px;
+$font-size-lg: 16px;
+$font-size-xl: 18px;
+$font-size-xxl: 20px;
+```
+
+---
+
+## đ äș€äșèźŸèźĄ
+
+### ææœäș€äșïŒKanbanïŒ
+
+**æ”çš**:
+1. çšæ·æäœä»»ćĄćĄç
+2. ćĄçćäžșćéæïŒè·ééŒ æ ç§»ćš
+3. ç»èżć
¶ä»ćæ¶ïŒćé«äșźæŸç€ș
+4. æŸćŒéŒ æ ïŒćĄçèœć
„çźæ ć
+5. ćé API èŻ·æ±æŽæ°ç¶æ
+6. æć: æç€ș"ä»»ćĄç¶æć·ČæŽæ°"
+7. ć€±èŽ„: ćĄçæąć€ćäœïŒæç€șéèŻŻ
+
+**è§è§ćéŠ**:
+```scss
+.task-card {
+ transition: transform 0.2s, box-shadow 0.2s;
+
+ &.dragging {
+ opacity: 0.5;
+ transform: rotate(3deg);
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
+ }
+
+ &:hover {
+ transform: translateY(-2px);
+ box-shadow: $shadow-md;
+ }
+}
+
+.kanban-column {
+ transition: background-color 0.2s, border 0.2s;
+
+ &.drag-over {
+ background: rgba(102, 126, 234, 0.05);
+ border: 2px dashed $primary;
+ }
+}
+```
+
+### 䟧èŸčæ ćšç»
+
+**TaskDetail Sidebar**:
+```scss
+.task-detail-sidebar {
+ position: fixed;
+ right: 0;
+ top: 60px;
+ width: 480px;
+ height: calc(100vh - 60px);
+ background: white;
+ box-shadow: -4px 0 16px rgba(0, 0, 0, 0.15);
+ transform: translateX(100%);
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ z-index: 1000;
+
+ &.active {
+ transform: translateX(0);
+ }
+}
+
+.overlay {
+ position: fixed;
+ top: 60px;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.3);
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.3s;
+
+ &.active {
+ opacity: 1;
+ pointer-events: auto;
+ }
+}
+```
+
+### ć èœœç¶æ
+
+**Skeleton éȘšæ¶ć±**:
+- ćèĄšć èœœæ¶æŸç€șéȘšæ¶ć±ïŒéżć
çœć±
+- äœżçš `el-skeleton` ç»ä»¶
+
+```vue
+
èŻ·éæ©äžäžȘéĄčçź
-| ćç§° | -ç¶æ | -ćœćä»»ćĄ | -ćźææ° | -æććżè·ł | -
|---|
èŻ·éæ©äžäžȘéĄčçź
+| ćç§° | +ç¶æ | +ćœćä»»ćĄ | +ćźææ° | +æććżè·ł | +
|---|---|---|---|---|
| ææ æ°æź | ||||
| è§çșŠçŒć· | +è§çșŠç±»ć | +ć ćźčæèż° | +æäœ | +
|---|---|---|---|
| ææ è§çșŠ | |||
Multi-Agent Task Management System
-