🀝 Project Collaboration

AIκ°€ μžλ™μœΌλ‘œ μ±„μš°λŠ” ν”„λ‘œμ νŠΈ νšŒμ˜μ‹€

ν”„λ‘œμ νŠΈ λͺ©λ‘

← λͺ©λ‘μœΌλ‘œ

μƒˆ ν”„λ‘œμ νŠΈ λ§Œλ“€κΈ°

Meeting Server v2 API λ¬Έμ„œ

πŸš€ 톡합 생성 API (μ‹ κ·œ)

ν”„λ‘œμ νŠΈ + λͺ¨λ“  κ΄€λ ¨ 정보λ₯Ό ν•œ λ²ˆμ— μƒμ„±ν•©λ‹ˆλ‹€. (6번 μš”μ²­ β†’ 1번 μš”μ²­)

POST /api/projects/full

{
  "project": {
    "name": "Meeting Server v2",
    "description": "AI ν˜‘μ—… ν”Œλž«νΌ",
    "owner": "Kim & Claude",
    "status": "진행쀑"
  },
  "architecture": {
    "stack": "Node.js, Express, SQLite",
    "database": "SQLite with WAL mode",
    "infrastructure": "PM2, Nginx, SSH Tunnel"
  },
  "roadmap": {
    "phases": [
      {"week": 1, "goal": "SQLite μ „ν™˜"},
      {"week": 2, "goal": "ν”„λ‘ νŠΈμ—”λ“œ κ°œμ„ "}
    ],
    "timeline": "2 weeks"
  },
  "decisions": [
    {
      "title": "SQLite μ‚¬μš©",
      "content": "KimDB λŒ€μ‹  SQLite 채택",
      "priority": "high"
    }
  ],
  "meetings": [
    {
      "title": "ν‚₯μ˜€ν”„ λ―ΈνŒ…",
      "date": "2025-01-08",
      "participants": ["Kim", "Claude"],
      "summary": "ν”„λ‘œμ νŠΈ μ‹œμž‘"
    }
  ],
  "checklist": {
    "items": [
      {"task": "SQLite μ„€μ •", "priority": 1, "status": "completed"},
      {"task": "ν”„λ‘ νŠΈμ—”λ“œ 개발", "priority": 2, "status": "pending"}
    ]
  }
}

πŸ“‹ ν”„λ‘œμ νŠΈ 관리

GET    /api/projects               # ν”„λ‘œμ νŠΈ λͺ©λ‘
POST   /api/projects               # ν”„λ‘œμ νŠΈ 생성 (메타데이터 μžλ™ μΆ”κ°€)
GET    /api/projects/:id           # ν”„λ‘œμ νŠΈ 상세
PUT    /api/projects/:id           # ν”„λ‘œμ νŠΈ 전체 μˆ˜μ •
PATCH  /api/projects/:id           # ν”„λ‘œμ νŠΈ λΆ€λΆ„ μˆ˜μ • (μ‹ κ·œ)
GET    /api/projects/:id/full      # 전체 정보 ν•œ λ²ˆμ— 쑰회 (μ‹ κ·œ)
GET    /api/projects/:id/stats     # ν”„λ‘œμ νŠΈ 톡계 (μ‹ κ·œ)

# ν”„λ‘œμ νŠΈ 생성 μ‹œ μžλ™ μΆ”κ°€λ˜λŠ” 메타데이터:
# - created_by: "Claude Sonnet 4.5"
# - server_location: "DESKTOP-CD5THBO"
# - status: "진행쀑"
# - created_at: timestamp

πŸ” 검색 API (μ‹ κ·œ)

GET /api/projects/search?q=ν‚€μ›Œλ“œ              # ν‚€μ›Œλ“œ 검색
GET /api/projects/search?owner=Claude          # λ‹΄λ‹Ήμž ν•„ν„°
GET /api/projects/search?status=진행쀑          # μƒνƒœ ν•„ν„°
GET /api/projects/search?tags=AI,ML            # νƒœκ·Έ ν•„ν„°

# μ˜ˆμ‹œ
GET /api/projects/search?q=SQLite&status=μ™„λ£Œ

πŸ“Š 톡계 API (μ‹ κ·œ)

GET /api/projects/:id/stats

# 응닡 μ˜ˆμ‹œ
{
  "success": true,
  "stats": {
    "total_decisions": 3,
    "total_meetings": 2,
    "checklist_progress": "5/10 (50%)",
    "roadmap_progress": "2/4 phases",
    "last_updated": "2025-01-08T12:00:00Z"
  }
}

πŸ”„ μ›Œν¬ν”Œλ‘œμš° μ§„ν–‰λ₯  API (μ‹ κ·œ)

AI μž‘μ—…μ˜ 5단계 μ§„ν–‰ 상황을 μžλ™μœΌλ‘œ νŒλ‹¨ν•©λ‹ˆλ‹€.

GET /api/projects/:id/workflow

# 5단계 μ›Œν¬ν”Œλ‘œμš°
1️⃣ κ³„νš      β†’ ν”„λ‘œμ νŠΈ 생성
2️⃣ ν”Œλžœλͺ¨λ“œ   β†’ μ•„ν‚€ν…μ²˜ + λ‘œλ“œλ§΅
3️⃣ κ΅¬ν˜„      β†’ 체크리슀트 + 결정사항
4️⃣ ν…ŒμŠ€νŠΈ    β†’ "[ν…ŒμŠ€νŠΈ]" λ…ΈνŠΈ
5️⃣ μ™„λ£Œ      β†’ status "μ™„λ£Œ" or "[μ™„λ£Œ]" λ…ΈνŠΈ

# 응닡 μ˜ˆμ‹œ
{
  "success": true,
  "workflow": {
    "steps": [
      {
        "step": 1,
        "name": "κ³„νš",
        "status": "completed",
        "description": "ν”„λ‘œμ νŠΈ 생성"
      },
      {
        "step": 2,
        "name": "ν”Œλžœλͺ¨λ“œ",
        "status": "pending",
        "description": "μ•„ν‚€ν…μ²˜ + λ‘œλ“œλ§΅ + ν•™μŠ΅μžλ£Œ"
      },
      ...
    ],
    "progress": 60,              // μ§„ν–‰λ₯  (%)
    "completed_steps": 3,        // μ™„λ£Œλœ 단계
    "total_steps": 5,            // 전체 단계
    "current_step": 2,           // ν˜„μž¬ 단계
    "project_status": "κ΅¬ν˜„μ€‘"   // ν”„λ‘œμ νŠΈ μƒνƒœ
  }
}

πŸ—οΈ μ„ΈλΆ€ ν•­λͺ© 쑰회 (μ‹ κ·œ)

GET /api/projects/:id/architecture    # μ•„ν‚€ν…μ²˜
GET /api/projects/:id/roadmap          # λ‘œλ“œλ§΅
GET /api/projects/:id/decisions        # 결정사항 λͺ©λ‘
GET /api/projects/:id/meetings         # 회의둝 λͺ©λ‘
GET /api/projects/:id/checklist        # 체크리슀트

πŸ“ Notes API (MD 파일 + Gogs μžλ™ μ—…λ‘œλ“œ)

POST /api/projects/:id/notes
{
  "title": "API 섀계 λ¬Έμ„œ",
  "content": "# API 섀계\n\n## κ°œμš”\n...",
  "auto_upload": true  // Gogs μžλ™ μ—…λ‘œλ“œ (κΈ°λ³Έκ°’: true)
}

GET /api/projects/:id/notes              # λ…ΈνŠΈ λͺ©λ‘
GET /api/projects/:id/notes/:noteId      # νŠΉμ • λ…ΈνŠΈ 쑰회

# Gogs μžλ™ μ—…λ‘œλ“œ κΈ°λŠ₯:
# - Markdown νŒŒμΌμ„ Gogs μ €μž₯μ†Œμ— μžλ™ 컀밋
# - gogs_url ν•„λ“œμ— 링크 μ €μž₯
# - comupload.ai-empire.kr API μ‚¬μš©

πŸ”§ κ°œλ³„ ν•­λͺ© 생성

POST /api/projects/:id/architecture
{
  "stack": "Node.js, Express",
  "database": "SQLite",
  "infrastructure": "PM2, Nginx"
}

POST /api/projects/:id/roadmap
{
  "phases": [{"week": 1, "goal": "개발"}],
  "timeline": "2 weeks"
}

POST /api/projects/:id/decisions
{
  "title": "기술 μŠ€νƒ κ²°μ •",
  "content": "SQLite μ‚¬μš©",
  "priority": "high"
}

POST /api/projects/:id/meetings
{
  "title": "μ£Όκ°„ 회의",
  "date": "2025-01-08",
  "participants": ["Kim", "Claude"],
  "summary": "μ§„ν–‰ 상황 λ…Όμ˜"
}

POST /api/projects/:id/checklist
{
  "items": [
    {"task": "DB μ„€μ •", "priority": 1, "status": "completed"}
  ]
}

✨ μŠ€ν‚€λ§ˆ μžλ™ 필터링 (AI νŽΈμ˜μ„± 100%)

AIκ°€ 아무 ν•„λ“œλ‚˜ 넣어도 μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€!
λͺ¨λ“  API μ—”λ“œν¬μΈνŠΈμ—μ„œ μžλ™μœΌλ‘œ μŠ€ν‚€λ§ˆ 필터링이 μ μš©λ˜μ–΄, ν—ˆμš©λœ ν•„λ“œλ§Œ μ €μž₯되고 잘λͺ»λœ ν•„λ“œλŠ” μžλ™μœΌλ‘œ μ œκ±°λ©λ‹ˆλ‹€.

# ν—ˆμš© ν•„λ“œ (ν…Œμ΄λΈ”λ³„)

projects: name, description, status, owner, tags, created_by, server_location
architecture: project_id, stack, database, infrastructure, diagram
roadmap: project_id, phases
decisions: project_id, title, content, rationale
meetings: project_id, date, participants, agenda, summary
checklist: project_id, items
notes: project_id, title, content, filename, gogs_url

# μžλ™ μ œκ±°λ˜λŠ” μ˜ˆμ‹œ ν•„λ“œ
❌ decisions: priority, decided_by, decided_at, impact, status
❌ meetings: title, action_items, attendees
❌ roadmap: milestones, timeline, duration
❌ projects: μž„μ˜μ˜ ν•„λ“œ

# μ‚¬μš© μ˜ˆμ‹œ
POST /api/projects/123/decisions
{
  "title": "JWT μ‚¬μš©",
  "content": "stateless 인증",
  "priority": 1,           // ← μžλ™ 제거됨 (둜그 기둝)
  "decided_by": "Kim",     // ← μžλ™ 제거됨 (둜그 기둝)
  "impact": "high",        // ← μžλ™ 제거됨 (둜그 기둝)
  "anything": "ignored"    // ← μžλ™ 제거됨 (둜그 기둝)
}

# κ²°κ³Ό: μ—λŸ¬ 없이 성곡! (title, content만 μ €μž₯됨)
# 둜그: [Schema Filter] decisions: 제거된 ν•„λ“œ β†’ priority, decided_by, impact, anything

# λ°°μ—΄ ν•„λ“œ μžλ™ λ³€ν™˜
phases: "string"      β†’ ["string"]    (μžλ™ λ³€ν™˜)
phases: {...}         β†’ [{...}]       (μžλ™ λ³€ν™˜)
items: {...}          β†’ [{...}]       (μžλ™ λ³€ν™˜)
participants: "Kim"   β†’ ["Kim"]       (μžλ™ λ³€ν™˜)
πŸ’‘ AI μž‘μ„± 팁

이제 ν•„λ“œλ₯Ό μ‹ κ²½μ“°μ§€ μ•Šκ³  자유둭게 데이터λ₯Ό μ „μ†‘ν•˜μ„Έμš”. μ‹œμŠ€ν…œμ΄ μžλ™μœΌλ‘œ μ˜¬λ°”λ₯Έ ν•„λ“œλ§Œ μ €μž₯ν•˜κ³ , 잘λͺ»λœ ν•„λ“œλŠ” μ œκ±°ν•©λ‹ˆλ‹€. μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λΉ λ₯Έ ν”„λ‘œν† νƒ€μ΄ν•‘κ³Ό 반볡 개발이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

⚑ μ„±λŠ₯ κ°œμ„ 

  • SQLite WAL λͺ¨λ“œ: λ™μ‹œ 읽기/μ“°κΈ° μ„±λŠ₯ ν–₯상
  • 톡합 API: 6번 μš”μ²­ β†’ 1번 μš”μ²­ (λ„€νŠΈμ›Œν¬ λΉ„μš© 절감)
  • PATCH 지원: ν•„μš”ν•œ ν•„λ“œλ§Œ λΆ€λΆ„ μ—…λ°μ΄νŠΈ
  • 인덱싱: project_id 기반 λΉ λ₯Έ 쑰회
  • μŠ€ν‚€λ§ˆ 필터링: 잘λͺ»λœ ν•„λ“œ μžλ™ 제거 (100% AI νŽΈμ˜μ„±)

πŸ”— 접속 정보

도메인: https://meeting2.dclub.kr
둜컬:   http://localhost:50400
ν—¬μŠ€:   /health

μ„œλ²„: νšŒμ‚¬ WSL (DESKTOP-CD5THBO)
DB:   SQLite (data/meeting.db)
PM2:  meeting-v2