Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@ DATABASE_URL_DIRECT=postgresql://user:password@host:5432/database
APP_URL=http://localhost:3000
NODE_ENV=development

# OpenAI (AI 기능용)
OPENAI_API_KEY=your_openai_api_key

# Study Configuration (optional, can be set via admin commands)
STUDY_START_DATE=2024-01-01
TOTAL_ROUNDS=10
Expand Down
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1 +1 @@
* @bbbang105
* @bbbang105 @choihooo
1 change: 1 addition & 0 deletions .github/auto-assign-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ addReviewers: true
addAssignees: author
reviewers:
- bbbang105
- choihooo
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ coverage
*.tsbuildinfo

### CLAUDE ###
/docs
#/docs

# Drizzle migration SQL (로컬 전용, DB에서 직접 실행)
packages/shared/drizzle/*.sql
.vercel
scripts
33 changes: 19 additions & 14 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# Blog Study Discord Bot

블로그 글쓰기 스터디 자동화 플랫폼. Discord 봇 + 웹 대시보드 + AI 추천.
블로그 글쓰기 스터디 자동화 플랫폼. Discord 봇 + 웹 대시보드.

## 프로젝트 구조

```
packages/
├── bot/ # Discord 봇 (discord.js v14) → AWS EC2 배포
├── web/ # Next.js 14 대시보드 → Vercel 배포
├── web/ # Next.js 16 대시보드 → Vercel 배포
└── shared/ # 공유 코드 (DB 스키마, 타입, 유틸)
```

Expand All @@ -22,7 +22,6 @@ packages/
| Web | Next.js 16 App Router, React 19, shadcn/ui, Tailwind CSS v4, Tiptap (리치 에디터) |
| DB | Supabase PostgreSQL + Drizzle ORM (Transaction Pooler, `prepare: false`) |
| Auth | Supabase Auth (Discord OAuth) + `@supabase/ssr` |
| AI | OpenAI GPT-4o-mini + text-embedding-3-small (예정) |
| 배포 | AWS EC2 (bot), Vercel (web), Supabase (DB + Auth) |

## 개발 명령어
Expand Down Expand Up @@ -114,7 +113,7 @@ pnpm --filter @blog-study/bot init-rounds # 회차 초기화
- **폰트**: Pretendard Variable
- **기본 아바타**: DiceBear `fun-emoji` 스타일 (`getDefaultAvatar()` in `utils.ts`)
- **아바타 리소스**: [DiceBear](https://www.dicebear.com/styles/) - 30+ 스타일, seed 기반 결정적 아바타 생성, API: `https://api.dicebear.com/9.x/{style}/svg?seed={seed}`
- **상세 스펙**: `docs/UI-DESIGN-SYSTEM.md` 참조
- **상세 스펙**: `docs/26-03-06-ui-design-system.md` 참조

## 에이전트 활용 가이드

Expand Down Expand Up @@ -153,11 +152,10 @@ pnpm --filter @blog-study/bot init-rounds # 회차 초기화
- `SUPABASE_SERVICE_KEY`, `DATABASE_URL`, `DATABASE_URL_DIRECT` (DB)
- `DISCORD_TOKEN`, `DISCORD_CLIENT_ID`, `DISCORD_CLIENT_SECRET`, `DISCORD_GUILD_ID`
- `ADMIN_DISCORD_IDS` (관리자 Discord ID, 쉼표 구분)
- `OPENAI_API_KEY` (AI 기능용, 예정)

**env 파일 위치** (2곳):
- `/Users/hansangho/Desktop/study-admin/.env.local` — 루트 (shared/bot용)
- `/Users/hansangho/Desktop/study-admin/packages/web/.env.local` — Next.js용
- `.env.local` — 루트 (shared/bot용)
- `packages/web/.env.local` — Next.js용

**주의**: `packages/web/.env.local`에도 동일 환경변수 필요 (Next.js는 패키지 디렉토리 기준)

Expand All @@ -167,7 +165,7 @@ pnpm --filter @blog-study/bot init-rounds # 회차 초기화

```bash
cd packages/shared
export $(grep DATABASE_URL /Users/hansangho/Desktop/study-admin/.env.local | head -1 | xargs)
export $(grep DATABASE_URL ../../.env.local | head -1 | xargs)
npx drizzle-kit push --force
```

Expand All @@ -176,9 +174,16 @@ npx drizzle-kit push --force
| 문서 | 설명 |
|------|------|
| `docs/ARCHITECTURE.md` | 시스템 아키텍처 (Mermaid 다이어그램) |
| `docs/TECH-DECISIONS.md` | 기술 선택 근거 (ADR) |
| `docs/UI-DESIGN-SYSTEM.md` | UI 디자인 시스템 스펙 |
| `docs/DEVELOPMENT.md` | 개발 환경 설정 |
| `docs/CHECKLIST.md` | 구현 체크리스트 |
| `docs/schema-summary.md` | DB 스키마 요약 (테이블/Enum/FK) |
| `docs/patterns.md` | API 패턴 & 코드 규칙 |
| `docs/26-03-06-tech-decisions.md` | 기술 선택 근거 (ADR) |
| `docs/26-03-06-ui-design-system.md` | UI 디자인 시스템 스펙 |
| `docs/26-03-06-development.md` | 개발 환경 설정 |
| `docs/26-03-06-checklist.md` | 구현 체크리스트 |
| `docs/26-03-06-schema-summary.md` | DB 스키마 요약 (테이블/Enum/FK) |
| `docs/26-03-06-patterns.md` | API 패턴 & 코드 규칙 |

## docs 파일명 컨벤션

`yy-mm-dd-{설명}.md` — 예: `26-03-03-system-architecture.md`
- 설명은 다른 문서와 구분될 정도로 구체적으로 작명
- `docs/plans/` 하위도 동일 컨벤션 적용
- 단, `docs/ARCHITECTURE.md`는 제외하며 업데이트 시에도 네이밍을 그대로 유지
21 changes: 10 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,20 @@ packages/

| 영역 | 기술 |
|------|------|
| Frontend | Next.js 14, React 18, Tailwind CSS, shadcn/ui |
| Frontend | Next.js 16, React 19, Tailwind CSS v4, shadcn/ui |
| Backend | Next.js API Routes, Supabase |
| Bot | discord.js v14, pg-boss |
| DB | PostgreSQL (Supabase), Drizzle ORM, pgvector |
| AI | OpenAI GPT-4o-mini, text-embedding-3-small |
| Deploy | Vercel (Web), Railway (Bot), Supabase (DB) |
| DB | PostgreSQL (Supabase), Drizzle ORM |
| Deploy | Vercel (Web), AWS EC2 (Bot), Supabase (DB) |

## 주요 기능

- **RSS 자동 수집** — 블로그 글 발행 감지 및 수집
- **AI 요약 & 추천** — GPT 기반 글 요약, 키워드 추출, 유사 글 추천
- **출석 자동화** — 2주 1회차, 지각/결석 자동 판정
- **벌금 관리** — 자동 부과, DM 알림, 납부 확인
- **랭킹 & 통계** — 포스트 수, 출석률 기반 실시간 랭킹
- **큐레이션** — 관심 키워드 기반 컨퍼런스/아티클 추천
- **활동 점수 & 랭킹** — 포스트 수, 출석률, 활동 기반 실시간 랭킹
- **큐레이션** — 태그 + 관심 키워드 기반 컨퍼런스/아티클 추천
- **커뮤니티 게시판** — 공지/일반/자유 게시글 + 댓글

## 시작하기

Expand Down Expand Up @@ -57,7 +56,7 @@ pnpm typecheck
## 문서

- [아키텍처](docs/ARCHITECTURE.md)
- [기술 결정](docs/TECH-DECISIONS.md)
- [UI 디자인 시스템](docs/UI-DESIGN-SYSTEM.md)
- [개발 환경](docs/DEVELOPMENT.md)
- [구현 체크리스트](docs/CHECKLIST.md)
- [기술 결정](docs/26-03-06-tech-decisions.md)
- [UI 디자인 시스템](docs/26-03-06-ui-design-system.md)
- [개발 환경](docs/26-03-06-development.md)
- [구현 체크리스트](docs/26-03-06-checklist.md)
128 changes: 128 additions & 0 deletions docs/26-03-06-checklist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# 구현 체크리스트

전면 개편 작업 순서. 의존성 순서대로 정렬.

---

## Phase 0: 기반 정리 ✅

- [x] 기존 `.kiro/`, `.vscode/`, 구 `docs/` 파일 제거
- [x] 새 `CLAUDE.md` 및 `docs/` 문서 체계 확립
- [x] Git 초기 커밋 (새 출발점)

## Phase 3: 인증 전환 (Supabase Auth) ✅

> Phase 1보다 먼저 진행됨 (인증이 모든 기능의 기반)

- [x] Supabase 프로젝트에 Discord OAuth 프로바이더 설정
- [x] `@supabase/ssr` 기반 클라이언트 설정 (`packages/web/src/lib/supabase/`)
- [x] 로그인 페이지: "Discord로 로그인" 버튼으로 교체
- [x] 회원가입 페이지 제거 (Discord OAuth로 통합)
- [x] `middleware.ts` → Supabase Auth 세션 체크로 교체
- [x] 관리자 권한: Discord ID + `ADMIN_DISCORD_IDS` 매칭
- [x] 기존 auth 관련 파일/라우트 제거
- [x] `api/auth/callback` 라우트 추가 (Supabase OAuth 콜백)
- [x] 모든 API 라우트 Supabase Auth 기반으로 리팩토링
- [x] DB 스키마에서 `users`, `sessions` 테이블 제거
- [x] 보안 강화 (오픈 리다이렉트 방지, 입력 검증)
- [x] 불필요한 의존성 제거: `bcryptjs`, `jsonwebtoken`, `jose`, `resend`
- [x] DB 연결: Transaction Pooler 지원 (`prepare: false`)
- [x] 빌드 검증 통과
- [ ] RLS 정책 설정 (배포 시)

## Phase 1: 의존성 업그레이드 ✅

- [x] Next.js 14 → 16 업그레이드 (PR #5)
- [x] Tailwind CSS v3 → v4 업그레이드 (PR #5)
- [x] React 18 → 19 업그레이드 (PR #5)
- [x] `rss-parser` → `feedsmith` 교체
- [x] `node-cron` → `pg-boss` 교체
- [x] 전체 빌드 확인 (`pnpm build`)

## Phase 4: Bot 개편 (pg-boss + feedsmith) ✅

- [x] `feedsmith` 기반 RSS 서비스 재구현
- [x] `pg-boss` 기반 스케줄러 전환 (6개 잡)
- [x] RSS→PostService.create→NotificationService 파이프라인 연결
- [x] graceful shutdown에 pg-boss 정리 추가

## Phase 6: 웹 UI 전면 리디자인

### 6-1: 디자인 시스템 기반
- [ ] globals.css 컬러 토큰 재정의 (스카이블루 포인트)
- [x] Pretendard 폰트 설정
- [x] Tailwind CSS v4 + 디자인 토큰 설정
- [x] next-themes 다크모드 설정
- [x] shadcn/ui 컴포넌트 테마 커스터마이징

### 6-2: 레이아웃 ✅
- [x] AppLayout (사이드바 + 헤더 + 메인)
- [x] Sidebar (접기/펼치기, 활성 인디케이터, 아이콘 모드)
- [x] 반응형: 모바일 드로어, 태블릿/데스크톱 사이드바

### 6-3: Public 페이지
- [ ] 랜딩 페이지 (/) - 스터디 소개, 로그인 유도
- [x] 로그인 페이지 (/login) - Discord OAuth 버튼

### 6-4: 사용자 페이지 ✅
- [x] 대시보드 (/dashboard) - 현재 회차, 내 출석, 최근 글
- [x] 글 목록 (/posts) - 스터디원 글 + 수동 등록 + 페이지네이션
- [x] 랭킹 (/ranking) - 포디움, 정렬 (총점/포스트/활동), 출석 히트맵
- [x] 큐레이션 (/curation) - 추천/최신 정렬, 카테고리/태그 필터, 무한 스크롤
- [x] 게시판 (/board) - 카테고리별 게시글 + 댓글 + 비밀글 + Tiptap 에디터
- [x] 멤버 목록 (/members) - 활동 멤버 그리드
- [x] 멤버 프로필 (/members/[id]) - 상세 프로필 + 활동 통계
- [x] 프로필 (/profile) - 내 정보 조회/수정
- [x] 온보딩 (/profile/onboarding) - 최초 가입 설정

### 6-5: 관리자 페이지
- [x] 관리자 대시보드 (/admin) - 요약 통계, 활동 피드
- [x] 멤버 관리 (/admin/members) - CRUD + 승인 + 상태 관리
- [ ] 출석 관리 (/admin/attendance) - 멤버 × 회차 그리드 (검증 필요)
- [ ] 벌금 관리 (/admin/fines) - 납부/면제 처리 (검증 필요)
- [ ] 점수 관리 (/admin/scores) - 수동 부여/삭제 (검증 필요)
- [x] 큐레이션 소스 (/admin/curation) - 소스 관리 + 크롤링
- [ ] 설정 (/admin/settings) - 스터디 설정 (검증 필요)

### 6-6: Supabase Realtime 통합 (선택적)
- [ ] 활동 피드 컴포넌트 (실시간 업데이트)
- [ ] 대시보드 통계 실시간 반영

## Phase 7: 통합 테스트 및 배포

- [ ] 전체 빌드 성공 확인
- [ ] 타입 체크 통과
- [ ] 린트 통과
- [ ] Supabase 프로덕션 설정
- RLS 정책
- Discord OAuth 프로바이더
- [ ] AWS EC2 배포 (Bot)
- 환경 변수 설정
- 빌드 확인
- [ ] Vercel 배포 (Web)
- 환경 변수 설정
- Supabase URL/키 설정
- 빌드 확인
- [ ] E2E 수동 테스트
- Discord 봇 커맨드 전체 동작
- 웹 로그인 플로우
- RSS 수집 → 알림 파이프라인
- 관리자 페이지 전체 기능

---

## 우선순위 요약

```
Phase 0 (정리) ✅
Phase 3 (인증) ✅
Phase 1 (의존성) ✅
Phase 4 (봇) ✅
Phase 6 (UI) ←── 관리자 페이지 검증 + 랜딩 + 디자인 정비 남음
Phase 7 (배포)
```
Loading