Skip to content

Commit 781d4af

Browse files
authored
Merge pull request depromeet#887 from depromeet/main
AI 에이전트 문서 시스템 구축 및 CI/CD 규칙 개선
2 parents 7829315 + 65aaea0 commit 781d4af

10 files changed

Lines changed: 630 additions & 17 deletions

File tree

.claude/docs/README.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Layer AI Documentation Index
2+
3+
이 디렉터리는 AI 에이전트가 Layer 프로젝트를 이해하고 작업할 때 참조하는 문서 저장소다. 루트 `AGENTS.md`는 진입점이고, 실제 제품/기술/아키텍처 문서는 이 디렉터리 아래에 둔다.
4+
5+
## Directory Structure
6+
7+
```text
8+
.claude/docs
9+
├── README.md
10+
├── product
11+
│ └── PRD.md
12+
├── engineering
13+
│ └── WRD.md
14+
└── architecture
15+
└── PROJECT_ARCHITECTURE.md
16+
```
17+
18+
## Read Guide
19+
20+
| 작업 유형 | 먼저 읽을 문서 |
21+
|-----------|----------------|
22+
| 제품 목적, 사용자 가치, 기능 범위 확인 | `product/PRD.md` |
23+
| 구현 방식, 기술 경계, 기능별 개발 요구사항 확인 | `engineering/WRD.md` |
24+
| 전체 폴더 구조, 런타임 흐름, 상태/API 경계 확인 | `architecture/PROJECT_ARCHITECTURE.md` |
25+
| Git/PR/릴리즈 작업 | `../../docs/git-workflow-guide/README.md` |
26+
| rebase, 충돌, release sync 작업 | `../../docs/git-workflow-conflict-2026_05_12.md` |
27+
28+
## Maintenance Rules
29+
30+
- 제품 범위가 바뀌면 `product/PRD.md`를 갱신한다.
31+
- 구현 방식이나 기술 경계가 바뀌면 `engineering/WRD.md`를 갱신한다.
32+
- 폴더 구조, 라우팅, 상태관리, API 경계가 바뀌면 `architecture/PROJECT_ARCHITECTURE.md`를 갱신한다.
33+
- 문서와 실제 코드가 충돌하면 실제 코드를 우선하고, 문서를 함께 수정한다.
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
# Project Architecture: Layer
2+
3+
## Overview
4+
5+
Layer는 `pnpm` workspace 기반 monorepo로 구성된 회고 협업 플랫폼이다. 현재 주요 실행 단위는 React/Vite 기반 `apps/web`, Expo 기반 `apps/mobile`, 공유 패키지 `packages/shared`다. 제품 도메인은 스페이스, 회고, 템플릿, 분석, 액션 아이템, 인증/사용자 정보로 나뉜다.
6+
7+
## Repository Layout
8+
9+
```text
10+
.
11+
├── apps
12+
│ ├── web
13+
│ │ ├── src
14+
│ │ │ ├── api
15+
│ │ │ ├── app
16+
│ │ │ ├── component
17+
│ │ │ ├── hooks
18+
│ │ │ ├── layout
19+
│ │ │ ├── lib
20+
│ │ │ ├── router
21+
│ │ │ ├── store
22+
│ │ │ ├── style
23+
│ │ │ ├── types
24+
│ │ │ └── utils
25+
│ │ └── package.json
26+
│ └── mobile
27+
│ ├── app
28+
│ ├── bridge
29+
│ ├── components
30+
│ ├── layout
31+
│ ├── provider
32+
│ └── package.json
33+
├── packages
34+
│ └── shared
35+
├── docs
36+
├── .github
37+
│ └── workflows
38+
├── .claude
39+
│ └── docs
40+
├── AGENTS.md
41+
├── CLAUDE.md
42+
├── pnpm-workspace.yaml
43+
└── package.json
44+
```
45+
46+
## Workspace Architecture
47+
48+
| 영역 | 역할 |
49+
|------|------|
50+
| `apps/web` | 웹/PWA 앱. 모바일과 데스크탑 라우트를 디바이스 타입에 따라 분기한다. |
51+
| `apps/mobile` | Expo 기반 네이티브 앱. Expo Router와 WebView bridge 관련 구조를 포함한다. |
52+
| `packages/shared` | 앱 간 공유 상수, 경로, 유틸리티 진입점. |
53+
| `docs` | Git workflow와 충돌 대응 같은 협업 문서. |
54+
| `.claude/docs` | AI 에이전트가 읽는 제품/기술/아키텍처 문서. |
55+
56+
## Web App Architecture
57+
58+
`apps/web`은 React Router를 중심으로 모바일/데스크탑 라우트를 구성한다. `getDeviceType()` 결과에 따라 모바일은 `/` 기준, 데스크탑은 `/desktop` 기준 라우트로 이동한다.
59+
60+
### Key Directories
61+
62+
| 경로 | 역할 |
63+
|------|------|
64+
| `src/router/index.tsx` | 모바일/데스크탑 라우트 정의, 인증 레이아웃 적용, device type 분기 |
65+
| `src/app/mobile` | 모바일 페이지 단위 화면 |
66+
| `src/app/desktop` | 데스크탑 페이지 단위 화면 |
67+
| `src/component/common` | 재사용 가능한 공통 UI 컴포넌트 |
68+
| `src/component/{domain}` | 도메인별 UI 컴포넌트 |
69+
| `src/hooks/api` | 도메인별 TanStack Query hook |
70+
| `src/api` | Axios client, token refresh, interceptor |
71+
| `src/store` | Jotai 기반 클라이언트 상태 |
72+
| `src/types` | 도메인 타입 정의 |
73+
| `src/lib/provider` | Query, analytics, bridge, PWA, offline provider |
74+
75+
### Runtime Flow
76+
77+
```text
78+
React entry
79+
-> app.tsx
80+
-> ClarityProvider
81+
-> MixpanelProvider
82+
-> QueryClientProvider
83+
-> BridgeProvider
84+
-> Routers
85+
-> MobileGlobalLayout or DesktopGlobalLayout
86+
-> RequireLoginLayout when route.auth is true
87+
-> page/component
88+
```
89+
90+
### State Boundaries
91+
92+
| 상태 유형 | 사용 기술 | 위치 |
93+
|-----------|-----------|------|
94+
| 서버 데이터 | TanStack Query | `src/hooks/api`, `src/lib/tanstack-query` |
95+
| UI/플로우 상태 | Jotai | `src/store`, 일부 `src/hooks/store` |
96+
| 인증 토큰 | Cookie + Axios interceptor | `src/api`, `src/config/storage-keys` |
97+
| 전역 UI 알림 | Jotai + Toast component | `src/store/toast`, `src/component/common/Toast` |
98+
99+
### API Boundary
100+
101+
API 요청은 도메인별 hook에서 시작하고, 공통 Axios instance를 통해 서버와 통신한다.
102+
103+
```text
104+
Page/Component
105+
-> hooks/api/{domain}/use...
106+
-> api instance
107+
-> request interceptor adds Authorization
108+
-> response interceptor handles refresh/logout/error
109+
```
110+
111+
신규 API는 기존 도메인 hook 경계를 먼저 따른다. 직접 `axios`를 사용하는 경우는 OAuth token 교환, presigned URL 업로드처럼 공통 API client 경계를 벗어나야 하는 케이스로 제한한다.
112+
113+
## Mobile App Architecture
114+
115+
`apps/mobile`은 Expo Router 기반 구조다. 현재 라우트는 `app` 디렉터리에 있으며, 주요 화면은 홈 탭, 분석, 목표, 로그인, 닉네임 설정, 스페이스, 회고 생성, 회고 작성으로 나뉜다.
116+
117+
### Key Directories
118+
119+
| 경로 | 역할 |
120+
|------|------|
121+
| `app` | Expo Router 페이지 |
122+
| `app/(tabs)` | 탭 기반 홈, 분석, 목표 화면 |
123+
| `app/space` | 스페이스 목록, 생성, 상세 |
124+
| `app/retrospect` | 회고 생성 관련 화면 |
125+
| `app/write` | 회고 작성 화면 |
126+
| `bridge` | WebView bridge 경계 |
127+
| `layout` | WebView layout 등 화면 레이아웃 |
128+
| `provider` | 모바일 앱 provider |
129+
130+
## Domain Map
131+
132+
| 도메인 | 주요 Web 위치 | 관련 API hook |
133+
|--------|---------------|---------------|
134+
| 인증/사용자 | `component/login`, `app/*/login`, `app/mobile/info` | `hooks/api/login`, `hooks/api/auth`, `hooks/api/user` |
135+
| 스페이스 | `component/space`, `app/mobile/space`, `app/desktop/space` | `hooks/api/space` |
136+
| 회고 생성 | `component/retrospectCreate`, `app/mobile/retrospectCreate`, `app/desktop/component/retrospectCreate` | `hooks/api/retrospect/create` |
137+
| 회고 작성 | `component/write`, `app/mobile/write`, `app/desktop/retrospectWrite` | `hooks/api/write` |
138+
| 템플릿 | `component/template`, `component/retrospect/template` | `hooks/api/template`, `hooks/api/retrospect/recommend` |
139+
| 분석 | `component/retrospect/analysis`, `app/*/retrospect/analysis` | `hooks/api/analysis`, `hooks/api/retrospect/analysis` |
140+
| 액션 아이템 | `component/ActionItem`, `component/retrospect/space/actionItems` | `hooks/api/actionItem` |
141+
142+
## Development Commands
143+
144+
| 목적 | 명령 |
145+
|------|------|
146+
| 전체 개발 서버 | `pnpm -r --parallel run dev` |
147+
| Web package 명령 진입 | `pnpm -F @layer/web ...` |
148+
| Mobile package 명령 진입 | `pnpm -F @layer/mobile ...` |
149+
| Web 타입 검증 | `pnpm -F @layer/web exec tsc --noEmit` |
150+
| Web 빌드 | `pnpm -F @layer/web run build` |
151+
| 전체 lint | `pnpm -r --parallel run lint` |
152+
153+
## Architecture Change Rules
154+
155+
- 라우트 구조를 바꾸면 `apps/web/src/router/index.tsx`와 이 문서를 함께 갱신한다.
156+
- API hook 경계를 바꾸면 `.claude/docs/engineering/WRD.md`와 이 문서를 함께 갱신한다.
157+
- 신규 도메인을 추가하면 `Domain Map`에 위치와 API hook 경계를 추가한다.
158+
- `.claude/docs` 문서는 AI 에이전트의 컨텍스트 진입점이므로, 코드 구조와 다르게 방치하지 않는다.

.claude/docs/engineering/WRD.md

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# WRD: Layer 회고 협업 플랫폼
2+
3+
## 기술 스택
4+
| 구분 | 기술 |
5+
|------|------|
6+
| Monorepo | pnpm workspace, Lerna |
7+
| Web Frontend | React, TypeScript, Vite, React Router |
8+
| Mobile App | Expo, React Native, Expo Router |
9+
| Server State | TanStack Query |
10+
| Client State | Jotai |
11+
| Styling | Emotion, CSS, design token modules |
12+
| API Client | Axios, cookie 기반 인증 토큰, refresh interceptor |
13+
| Analytics/Support | Mixpanel, Microsoft Clarity, ChannelTalk |
14+
| Shared Package | `@layer/shared` |
15+
16+
## 프로젝트 구조
17+
- `apps/web`: 주요 웹/PWA 앱. 모바일/데스크탑 화면을 같은 React Router 안에서 디바이스별로 분기한다.
18+
- `apps/mobile`: Expo 기반 네이티브 앱. `app` 라우트와 WebView/bridge 관련 레이어를 포함한다.
19+
- `packages/shared`: 앱 간 공유 상수와 경로 모듈.
20+
- `docs`: Git workflow 등 협업 문서.
21+
- `.github/workflows`: PR 메시지 생성, 리뷰어 배정, 빌드 테스트 자동화.
22+
23+
## 기능 명세
24+
25+
### 인증 및 세션
26+
- 구현 방식: `apps/web/src/api/index.ts`의 Axios interceptor가 access token을 요청 헤더에 주입하고 401/403 응답에서 refresh를 시도한다.
27+
- 입력: 소셜 로그인 OAuth redirect, 닉네임, 프로필 정보.
28+
- 출력: 인증 쿠키, 로그인 상태, 보호 라우트 접근 허용.
29+
- 엣지케이스: refresh 실패 시 쿠키 삭제 후 인증 만료 이벤트를 발생시킨다.
30+
31+
### 라우팅 및 레이아웃
32+
- 구현 방식: `apps/web/src/router/index.tsx`에서 `getDeviceType()` 결과에 따라 mobile/desktop route set을 생성한다.
33+
- 입력: URL path, 디바이스 타입, 인증 필요 여부.
34+
- 출력: `MobileGlobalLayout` 또는 `DesktopGlobalLayout` 하위 화면.
35+
- 제약사항: 신규 기능은 모바일/데스크탑 중 적용 대상 라우트를 명시해야 한다.
36+
37+
### 스페이스 관리
38+
- 구현 방식: `hooks/api/space`의 query/mutation hook과 `store/space` atom을 사용한다.
39+
- 입력: 스페이스 이름, 분야, 이미지, 초대 ID, 멤버 액션.
40+
- 출력: 스페이스 목록, 상세 정보, 멤버 목록, 초대/수정/삭제 결과.
41+
- 엣지케이스: 이미지 업로드는 presigned URL에 직접 PUT하므로 파일 타입과 실패 처리를 분리한다.
42+
43+
### 회고 생성
44+
- 구현 방식: `store/retrospect/retrospectCreate` 계열 atom으로 단계별 입력을 보관하고 `usePostRetrospectCreate`로 제출한다.
45+
- 입력: 스페이스 ID, 제목, 기간, 마감일, 템플릿 ID 또는 커스텀 질문.
46+
- 출력: 생성된 회고와 완료 화면 이동.
47+
- 제약사항: 생성 단계 변경 시 모바일/데스크탑 생성 플로우를 함께 확인한다.
48+
49+
### 템플릿 탐색 및 커스텀
50+
- 구현 방식: `hooks/api/template``hooks/api/retrospect/recommend`를 사용하고 추천 상태는 Jotai atom으로 관리한다.
51+
- 입력: 추천 조건, 검색어, 템플릿 선택, 커스텀 질문 편집.
52+
- 출력: 기본 템플릿 목록, 커스텀 템플릿 목록, 추천 템플릿, 선택된 템플릿.
53+
- 엣지케이스: 템플릿 제목 수정/삭제 후 관련 query cache를 무효화해야 한다.
54+
55+
### 회고 작성
56+
- 구현 방식: `hooks/api/write`에서 질문/답변/임시 저장 데이터를 조회하고 제출 mutation을 호출한다.
57+
- 입력: 회고 ID, 질문별 답변, 임시 저장 여부.
58+
- 출력: 저장된 답변, 작성 완료 상태, 완료 페이지.
59+
- 엣지케이스: 작성 중 이탈 시 `useTemporarySave`와 수정 상태 atom을 기준으로 모달 노출을 결정한다.
60+
61+
### 분석 및 인사이트
62+
- 구현 방식: `hooks/api/analysis`, `hooks/api/retrospect/analysis`로 분석 데이터를 조회한다.
63+
- 입력: 스페이스 ID, 회고 ID, 멤버 ID.
64+
- 출력: 분석 요약, 만족도 차트, 인사이트, 답변 기반 분석.
65+
- 제약사항: 분석 API는 비동기 생성 가능성이 있으므로 pending/empty/error 상태를 화면별로 분리한다.
66+
67+
### 액션 아이템
68+
- 구현 방식: `hooks/api/actionItem` query/mutation으로 개인/팀 액션 아이템을 관리한다.
69+
- 입력: 스페이스 ID, 액션 아이템 내용, 완료/수정/삭제 액션.
70+
- 출력: 홈 목표 목록, 스페이스별 팀 액션 아이템 목록.
71+
- 엣지케이스: 생성/수정/삭제 후 관련 query cache를 갱신한다.
72+
73+
### 사용자 정보 및 지원 화면
74+
- 구현 방식: `hooks/api/user`, `app/mobile/info`, 공통 Modal/ProfileImage 컴포넌트를 사용한다.
75+
- 입력: 닉네임, 프로필 이미지, 탈퇴 요청, 피드백.
76+
- 출력: 내 정보 화면, 수정 결과, 안내 문서 화면.
77+
- 제약사항: 계정 삭제 성공 시 인증 상태와 로컬 사용자 상태를 함께 정리한다.
78+
79+
## API 설계
80+
현재 프론트엔드는 구체 endpoint 문자열을 각 API hook 내부에 캡슐화한다. 신규 API는 아래 도메인별 hook 경계를 유지한다.
81+
82+
| Method | Path 범위 | 설명 |
83+
|--------|-----------|------|
84+
| GET/POST | `/api/auth`, OAuth redirect | 로그인, 회원가입, 로그아웃, 토큰 교환 |
85+
| GET/POST/PATCH/DELETE | `/spaces` | 스페이스 목록, 생성, 수정, 삭제, 참여 |
86+
| GET/POST/PATCH/DELETE | `/spaces/{spaceId}/members` | 멤버 목록, 리더 변경, 내보내기 |
87+
| GET/POST/PATCH/DELETE | `/retrospects` | 회고 목록, 생성, 수정, 삭제, 마감 |
88+
| GET/POST/PATCH/DELETE | `/templates` | 기본/커스텀 템플릿 조회, 선택, 수정, 삭제 |
89+
| GET/POST | `/write`, `/answers` | 질문/답변 조회, 임시 저장, 제출 |
90+
| GET | `/analysis` | 팀/개인 분석 조회 |
91+
| GET/POST/PATCH/DELETE | `/action-items` | 액션 아이템 조회, 생성, 수정, 삭제 |
92+
| POST | `/backoffice/*` | 클릭/노출 이벤트 수집 |
93+
94+
## 데이터 모델
95+
```ts
96+
User {
97+
id: string
98+
nickname: string
99+
profileImageUrl?: string
100+
socialType: "kakao" | "google" | "apple"
101+
}
102+
103+
Space {
104+
id: string
105+
name: string
106+
field?: string
107+
imageUrl?: string
108+
leaderId: string
109+
members: Member[]
110+
}
111+
112+
Retrospect {
113+
id: string
114+
spaceId: string
115+
title: string
116+
templateId: string
117+
status: "inProgress" | "completed" | "closed"
118+
dueDate?: string
119+
}
120+
121+
Template {
122+
id: string
123+
title: string
124+
questions: Question[]
125+
type: "default" | "custom" | "recommended"
126+
}
127+
128+
ActionItem {
129+
id: string
130+
spaceId?: string
131+
retrospectId?: string
132+
content: string
133+
isCompleted: boolean
134+
}
135+
```
136+
137+
## 비기능 요구사항
138+
- 성능: route component는 lazy loading을 유지하고, 서버 데이터는 TanStack Query cache를 사용한다.
139+
- 인증: access token은 요청 interceptor에서만 주입하고, refresh 실패 시 인증 상태를 일관되게 정리한다.
140+
- 안정성: mutation 성공 후 관련 query invalidation 또는 local state reset을 명시한다.
141+
- 반응형: web 앱은 device type 분기에 따라 모바일/데스크탑 라우트를 분리한다.
142+
- 유지보수: 공통 UI는 `component/common`, 도메인 UI는 `component/{domain}` 또는 `app/{device}/{domain}` 경계를 따른다.
143+
- 협업: `main`, `develop`은 직접 푸시하지 않고 PR로 머지한다.
144+
145+
## 구현 우선순위
146+
| 우선순위 | 기능 | 이유 |
147+
|----------|------|------|
148+
| P0 | 인증/세션/보호 라우트 | 로그인 사용자가 모든 핵심 기능에 접근하기 위한 기반 |
149+
| P0 | 스페이스 생성/참여/조회 | 회고가 소속될 기본 단위 |
150+
| P0 | 회고 생성/작성/제출 | 제품의 핵심 사용자 플로우 |
151+
| P1 | 템플릿 추천/커스텀 | 회고 품질과 생성 완료율에 직접 영향 |
152+
| P1 | 분석/인사이트 | 회고 결과를 가치로 전환하는 핵심 경험 |
153+
| P1 | 액션 아이템 | 회고 이후 실행으로 이어지는 기능 |
154+
| P2 | 내 정보/공지/도움말/피드백 | 운영 및 사용자 지원 경험 |
155+
| P2 | 백오피스 이벤트 수집 | 제품 개선을 위한 행동 데이터 확보 |
156+
157+
## 개발 검증
158+
- Web 타입 검증: `pnpm -F @layer/web exec tsc --noEmit`
159+
- Web 빌드: `pnpm -F @layer/web run build`
160+
- 전체 lint: `pnpm -r --parallel run lint`
161+
- 변경 범위가 React UI일 경우 로컬 실행 후 모바일/데스크탑 라우트 중 영향 화면을 확인한다.

0 commit comments

Comments
 (0)