create-claude-pipeline 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/bin/cli.js +359 -0
  2. package/package.json +32 -0
  3. package/template/.claude/agents/be-developer.md +218 -0
  4. package/template/.claude/agents/designer.md +192 -0
  5. package/template/.claude/agents/fe-developer.md +175 -0
  6. package/template/.claude/agents/infra-developer.md +270 -0
  7. package/template/.claude/agents/planner.md +126 -0
  8. package/template/.claude/agents/pm.md +130 -0
  9. package/template/.claude/agents/qa-engineer.md +270 -0
  10. package/template/.claude/agents/security-reviewer.md +281 -0
  11. package/template/.claude/settings.json +5 -0
  12. package/template/.claude/skills/analyze-requirements/SKILL.md +166 -0
  13. package/template/.claude/skills/api-integration/SKILL.md +354 -0
  14. package/template/.claude/skills/assemble-context/SKILL.md +192 -0
  15. package/template/.claude/skills/db-migration/SKILL.md +228 -0
  16. package/template/.claude/skills/explore-be-codebase/SKILL.md +260 -0
  17. package/template/.claude/skills/explore-codebase/SKILL.md +190 -0
  18. package/template/.claude/skills/explore-design-system/SKILL.md +150 -0
  19. package/template/.claude/skills/explore-fe-codebase/SKILL.md +209 -0
  20. package/template/.claude/skills/explore-implementation/SKILL.md +147 -0
  21. package/template/.claude/skills/explore-infra/SKILL.md +242 -0
  22. package/template/.claude/skills/implement-api/SKILL.md +477 -0
  23. package/template/.claude/skills/implement-components/SKILL.md +217 -0
  24. package/template/.claude/skills/review-auth/SKILL.md +175 -0
  25. package/template/.claude/skills/scan-vulnerabilities/SKILL.md +200 -0
  26. package/template/.claude/skills/write-cicd/SKILL.md +293 -0
  27. package/template/.claude/skills/write-design-spec/SKILL.md +363 -0
  28. package/template/.claude/skills/write-dockerfile/SKILL.md +269 -0
  29. package/template/.claude/skills/write-plan-doc/SKILL.md +164 -0
  30. package/template/.claude/skills/write-plan-doc/assets/plan_template.html +251 -0
  31. package/template/.claude/skills/write-qa-report/SKILL.md +151 -0
  32. package/template/.claude/skills/write-security-report/SKILL.md +185 -0
  33. package/template/.claude/skills/write-test-cases/SKILL.md +234 -0
  34. package/template/.claude-pipeline/dashboard/.env.example +1 -0
  35. package/template/.claude-pipeline/dashboard/.eslintrc.json +3 -0
  36. package/template/.claude-pipeline/dashboard/README.md +36 -0
  37. package/template/.claude-pipeline/dashboard/next.config.mjs +6 -0
  38. package/template/.claude-pipeline/dashboard/package-lock.json +8148 -0
  39. package/template/.claude-pipeline/dashboard/package.json +36 -0
  40. package/template/.claude-pipeline/dashboard/postcss.config.mjs +8 -0
  41. package/template/.claude-pipeline/dashboard/server.ts +24 -0
  42. package/template/.claude-pipeline/dashboard/src/app/api/pipelines/[id]/checkpoint/route.ts +23 -0
  43. package/template/.claude-pipeline/dashboard/src/app/api/pipelines/[id]/outputs/[...filepath]/route.ts +18 -0
  44. package/template/.claude-pipeline/dashboard/src/app/api/pipelines/[id]/route.ts +10 -0
  45. package/template/.claude-pipeline/dashboard/src/app/api/pipelines/route.ts +64 -0
  46. package/template/.claude-pipeline/dashboard/src/app/favicon.ico +0 -0
  47. package/template/.claude-pipeline/dashboard/src/app/fonts/GeistMonoVF.woff +0 -0
  48. package/template/.claude-pipeline/dashboard/src/app/fonts/GeistVF.woff +0 -0
  49. package/template/.claude-pipeline/dashboard/src/app/globals.css +52 -0
  50. package/template/.claude-pipeline/dashboard/src/app/layout.tsx +33 -0
  51. package/template/.claude-pipeline/dashboard/src/app/page.tsx +49 -0
  52. package/template/.claude-pipeline/dashboard/src/app/pipeline/[id]/page.tsx +84 -0
  53. package/template/.claude-pipeline/dashboard/src/components/agent-card.tsx +40 -0
  54. package/template/.claude-pipeline/dashboard/src/components/agent-logs.tsx +65 -0
  55. package/template/.claude-pipeline/dashboard/src/components/artifact-viewer.tsx +130 -0
  56. package/template/.claude-pipeline/dashboard/src/components/checkpoint-banner.tsx +59 -0
  57. package/template/.claude-pipeline/dashboard/src/components/new-pipeline-modal.tsx +63 -0
  58. package/template/.claude-pipeline/dashboard/src/components/output-list.tsx +57 -0
  59. package/template/.claude-pipeline/dashboard/src/components/phase-dots.tsx +37 -0
  60. package/template/.claude-pipeline/dashboard/src/components/pipeline-card.tsx +53 -0
  61. package/template/.claude-pipeline/dashboard/src/components/resizable-panels.tsx +91 -0
  62. package/template/.claude-pipeline/dashboard/src/hooks/use-pipeline-detail.ts +65 -0
  63. package/template/.claude-pipeline/dashboard/src/hooks/use-pipelines.ts +60 -0
  64. package/template/.claude-pipeline/dashboard/src/hooks/use-websocket.ts +58 -0
  65. package/template/.claude-pipeline/dashboard/src/lib/agents.ts +30 -0
  66. package/template/.claude-pipeline/dashboard/src/lib/checkpoint.ts +37 -0
  67. package/template/.claude-pipeline/dashboard/src/lib/pipelines.ts +91 -0
  68. package/template/.claude-pipeline/dashboard/src/lib/watcher.ts +90 -0
  69. package/template/.claude-pipeline/dashboard/src/lib/ws-server.ts +123 -0
  70. package/template/.claude-pipeline/dashboard/src/types/pipeline.ts +61 -0
  71. package/template/.claude-pipeline/dashboard/tailwind.config.ts +31 -0
  72. package/template/.claude-pipeline/dashboard/tsconfig.json +26 -0
  73. package/template/CLAUDE.md +301 -0
  74. package/template/references/context-structure.md +34 -0
  75. package/template/references/pm-context-assembly.md +34 -0
  76. package/template/references/task-context-template.md +65 -0
@@ -0,0 +1,228 @@
1
+ ---
2
+ name: db-migration
3
+ description: "BE 개발자가 DB 스키마를 변경할 때 안전하게 마이그레이션하기 위한 절차와 주의사항을 제공하는 skill. 기존 데이터 영향 검토부터 롤백 계획까지 포함한다. BE Agent가 테이블/컬럼을 추가·변경·삭제하거나, 인덱스를 생성하거나, 관계(FK)를 수정할 때 반드시 사용한다. 'DB 마이그레이션', '스키마 변경', '테이블 추가', '컬럼 변경', '인덱스 추가', 'prisma migrate', 'ALTER TABLE', 'FK 추가', 'NOT NULL 컬럼 추가' 등의 상황에서 트리거된다."
4
+ ---
5
+
6
+ # DB Migration
7
+
8
+ BE 개발자가 DB 스키마를 변경할 때 따르는 절차다.
9
+
10
+ 프로덕션 DB에는 이미 데이터가 있다. 개발 환경에서 잘 돌아가는 마이그레이션이 프로덕션에서 데이터 유실이나 장시간 락을 일으킬 수 있다. 이 skill은 "변경 전 영향을 먼저 파악하고, 안전한 방식으로 변경하고, 문제 시 되돌릴 수 있는" 절차를 제공한다.
11
+
12
+ ---
13
+
14
+ ## STEP 1: 변경 전 영향 분석
15
+
16
+ 스키마를 바꾸기 전에 현재 상태를 파악한다. 기존 데이터가 없는 신규 테이블이면 이 단계를 가볍게 넘겨도 되지만, 기존 테이블을 수정하는 경우 반드시 확인한다.
17
+
18
+ ### 확인 항목
19
+
20
+ ```
21
+ Glob: prisma/schema.prisma
22
+ Glob: src/models/**/*
23
+ Glob: src/entities/**/*
24
+ Grep: @relation|references:|foreignKey|@ManyToOne|@OneToMany|@ManyToMany
25
+ ```
26
+
27
+ | 확인 항목 | 왜 중요한가 |
28
+ |---------|-----------|
29
+ | 변경되는 테이블/컬럼 목록 | 영향 범위를 한정한다 |
30
+ | 해당 테이블에 기존 데이터가 있는지 | 데이터 마이그레이션 필요 여부를 결정한다 |
31
+ | 다른 테이블과의 관계(FK) | FK가 있으면 변경 순서가 중요하다 — 참조되는 쪽을 먼저 바꿔야 한다 |
32
+ | 해당 컬럼을 사용하는 쿼리/서비스 | 스키마 변경이 애플리케이션 코드에 미치는 영향을 파악한다 |
33
+ | 인덱스 현황 | 기존 인덱스가 새 스키마에서도 유효한지 확인한다 |
34
+
35
+ ### 출력 형식
36
+
37
+ 분석 결과를 아래 형식으로 정리한다:
38
+
39
+ ```markdown
40
+ ## 영향 분석
41
+
42
+ | 테이블 | 변경 유형 | 기존 데이터 | FK 관계 | 영향받는 코드 |
43
+ |--------|---------|-----------|---------|-------------|
44
+ | orders | 컬럼 추가 | 있음 (약 10만 건) | users.id → orders.userId | services/orders.ts, repositories/orders.ts |
45
+ | order_items | 신규 생성 | 없음 | orders.id → order_items.orderId | - |
46
+
47
+ ### 위험 요소
48
+ - orders 테이블에 NOT NULL 컬럼 추가 시 기존 데이터에 default 값 필요
49
+ - order_items FK 생성 시 orders 테이블에 락 발생 가능
50
+ ```
51
+
52
+ ---
53
+
54
+ ## STEP 2: 안전한 변경 원칙
55
+
56
+ 프로덕션 DB를 안전하게 변경하기 위한 원칙이다. 핵심은 "되돌릴 수 없는 변경을 피하고, 불가피하면 단계를 나눈다"이다.
57
+
58
+ ### 위험한 변경과 안전한 대안
59
+
60
+ | 위험한 변경 | 왜 위험한가 | 안전한 대안 |
61
+ |-----------|-----------|-----------|
62
+ | 컬럼 삭제 | 데이터 유실, 롤백 불가 | nullable로 변경 → 앱에서 사용 안 함 확인 → 추후 별도 마이그레이션으로 삭제 |
63
+ | 컬럼명 변경 | 앱 코드와 동시 배포 필요, 실패 시 양쪽 다 깨짐 | 새 컬럼 추가 → 데이터 복사 → 앱이 새 컬럼 사용 → 구 컬럼 제거 |
64
+ | NOT NULL 컬럼 추가 (default 없음) | 기존 행에 값이 없어서 실패 | default 값 반드시 지정 |
65
+ | 타입 변경 (예: varchar → int) | 기존 데이터 변환 실패 가능 | 새 컬럼 추가 → 데이터 변환 스크립트 → 컬럼 교체 |
66
+ | 대형 테이블에 인덱스 추가 | 장시간 테이블 락 | 별도 마이그레이션으로 분리, `CREATE INDEX CONCURRENTLY` 사용 (PostgreSQL) |
67
+
68
+ ### NOT NULL 컬럼 추가 시
69
+
70
+ 기존 데이터가 있는 테이블에 NOT NULL 컬럼을 추가하려면:
71
+
72
+ ```
73
+ -- 1단계: nullable + default로 추가
74
+ ALTER TABLE orders ADD COLUMN priority VARCHAR(10) DEFAULT 'normal';
75
+
76
+ -- 2단계: 기존 행에 값 채우기 (필요 시)
77
+ UPDATE orders SET priority = 'normal' WHERE priority IS NULL;
78
+
79
+ -- 3단계: NOT NULL 제약 추가
80
+ ALTER TABLE orders ALTER COLUMN priority SET NOT NULL;
81
+ ```
82
+
83
+ Prisma의 경우:
84
+
85
+ ```prisma
86
+ // 1단계 마이그레이션: optional + default로 추가
87
+ model Order {
88
+ priority String? @default("normal")
89
+ }
90
+
91
+ // 2단계 마이그레이션: required로 변경
92
+ model Order {
93
+ priority String @default("normal")
94
+ }
95
+ ```
96
+
97
+ ---
98
+
99
+ ## STEP 3: 마이그레이션 파일 작성
100
+
101
+ ### 파일명 규칙
102
+
103
+ ```
104
+ YYYYMMDD_HHMMSS_description
105
+ ```
106
+
107
+ 설명은 변경 내용을 명확하게 나타내야 한다. "뭘 했는지" 한눈에 알 수 있어야 나중에 마이그레이션 히스토리를 추적할 수 있다.
108
+
109
+ **좋은 예:**
110
+ - `20260323_143000_add_priority_to_orders`
111
+ - `20260323_150000_create_order_items_table`
112
+ - `20260323_160000_add_index_orders_userId`
113
+
114
+ **나쁜 예:**
115
+ - `20260323_143000_update_schema`
116
+ - `20260323_150000_fix`
117
+ - `migration_1`
118
+
119
+ ### up/down 구조
120
+
121
+ 모든 마이그레이션은 반드시 up(적용)과 down(롤백)을 모두 작성한다. 롤백을 작성하지 않으면 문제 발생 시 수동으로 되돌려야 하는데, 장애 상황에서 수동 작업은 실수가 나기 쉽다.
122
+
123
+ ```ts
124
+ // Knex 예시
125
+ export async function up(knex: Knex): Promise<void> {
126
+ await knex.schema.alterTable("orders", (table) => {
127
+ table.string("priority", 10).defaultTo("normal").notNullable();
128
+ });
129
+ }
130
+
131
+ export async function down(knex: Knex): Promise<void> {
132
+ await knex.schema.alterTable("orders", (table) => {
133
+ table.dropColumn("priority");
134
+ });
135
+ }
136
+ ```
137
+
138
+ ```sql
139
+ -- Raw SQL 예시
140
+ -- up
141
+ ALTER TABLE orders ADD COLUMN priority VARCHAR(10) NOT NULL DEFAULT 'normal';
142
+
143
+ -- down
144
+ ALTER TABLE orders DROP COLUMN priority;
145
+ ```
146
+
147
+ Prisma의 경우 `prisma migrate dev`가 자동으로 마이그레이션 파일을 생성하지만, 생성된 SQL을 반드시 확인한다. Prisma는 down 마이그레이션을 자동 생성하지 않으므로, 위험한 변경에는 롤백 SQL을 별도로 문서화한다.
148
+
149
+ ### 하나의 마이그레이션 = 하나의 변경
150
+
151
+ 마이그레이션 하나에 여러 변경을 넣지 않는다. 테이블 생성과 인덱스 추가는 별도 마이그레이션으로 분리한다. 이유:
152
+ - 인덱스 생성이 실패해도 테이블 생성은 유지된다
153
+ - 롤백 범위를 세밀하게 제어할 수 있다
154
+ - 대형 테이블의 인덱스 생성은 시간이 오래 걸릴 수 있다
155
+
156
+ ```
157
+ # 좋은 예: 분리된 마이그레이션
158
+ 20260323_143000_create_order_items_table
159
+ 20260323_143100_add_index_order_items_orderId
160
+
161
+ # 나쁜 예: 하나에 다 넣음
162
+ 20260323_143000_create_order_items_with_indexes
163
+ ```
164
+
165
+ ---
166
+
167
+ ## STEP 4: 인덱스 설계
168
+
169
+ 인덱스는 쿼리 성능에 직접적인 영향을 미치지만, 불필요한 인덱스는 쓰기 성능을 떨어뜨리고 저장 공간을 낭비한다. "이 쿼리가 느릴 것 같으니 인덱스를 걸자"가 아니라 "실제 쿼리 패턴에 맞는 인덱스를 설계하자"가 맞다.
170
+
171
+ ### 인덱스가 필요한 경우
172
+
173
+ | 상황 | 예시 | 인덱스 대상 |
174
+ |------|------|-----------|
175
+ | WHERE 절에 자주 쓰이는 컬럼 | `WHERE status = 'active'` | `status` |
176
+ | JOIN 조건의 FK 컬럼 | `JOIN orders ON users.id = orders.userId` | `orders.userId` |
177
+ | 정렬에 자주 쓰이는 컬럼 | `ORDER BY createdAt DESC` | `createdAt` |
178
+ | 유니크 제약이 필요한 컬럼 | `email`, `slug` | UNIQUE 인덱스 |
179
+
180
+ ### 복합 인덱스 순서
181
+
182
+ 복합 인덱스는 컬럼 순서가 중요하다. 카디널리티(고유값 수)가 높은 컬럼을 앞에 놓는다.
183
+
184
+ ```sql
185
+ -- 좋은 예: userId(카디널리티 높음) → status(카디널리티 낮음)
186
+ CREATE INDEX idx_orders_userId_status ON orders(userId, status);
187
+
188
+ -- 쿼리에서 활용:
189
+ -- SELECT * FROM orders WHERE userId = ? AND status = ? ← 인덱스 사용
190
+ -- SELECT * FROM orders WHERE userId = ? ← 인덱스 사용 (선두 컬럼)
191
+ -- SELECT * FROM orders WHERE status = ? ← 인덱스 미사용 (선두 컬럼 없음)
192
+ ```
193
+
194
+ ### 인덱스를 걸지 말아야 할 경우
195
+
196
+ - 행 수가 적은 테이블 (수천 건 이하) — 풀스캔이 더 빠를 수 있다
197
+ - INSERT/UPDATE가 매우 빈번한 컬럼 — 인덱스 유지 비용이 조회 이점을 초과
198
+ - 카디널리티가 매우 낮은 컬럼 단독 (예: boolean) — 인덱스 효과가 미미
199
+
200
+ ### Prisma에서 인덱스 정의
201
+
202
+ ```prisma
203
+ model Order {
204
+ id String @id @default(uuid())
205
+ userId String
206
+ status String
207
+ createdAt DateTime @default(now())
208
+
209
+ user User @relation(fields: [userId], references: [id])
210
+
211
+ @@index([userId, status]) // 복합 인덱스
212
+ @@index([createdAt]) // 정렬용 인덱스
213
+ }
214
+ ```
215
+
216
+ ---
217
+
218
+ ## 마이그레이션 실행 체크리스트
219
+
220
+ 마이그레이션을 실행하기 전에 아래를 확인한다:
221
+
222
+ 1. [ ] **영향 분석 완료** — 변경 대상 테이블, 기존 데이터 유무, FK 관계 파악
223
+ 2. [ ] **안전한 변경 원칙 준수** — 컬럼 삭제/변경 대신 안전한 대안 적용
224
+ 3. [ ] **마이그레이션 파일 작성** — 명확한 파일명, up/down 모두 작성
225
+ 4. [ ] **인덱스 분리** — 테이블 변경과 인덱스 생성은 별도 마이그레이션
226
+ 5. [ ] **롤백 테스트** — down 마이그레이션이 정상 동작하는지 확인
227
+ 6. [ ] **앱 코드 호환성** — 스키마 변경 후에도 기존 앱 코드가 동작하는지 확인
228
+ 7. [ ] **데이터 마이그레이션** — 기존 데이터에 대한 변환/채우기 스크립트 준비 (필요 시)
@@ -0,0 +1,260 @@
1
+ ---
2
+ name: explore-be-codebase
3
+ description: "BE 개발자가 구현 전 기존 백엔드 코드 구조를 파악할 때 사용하는 skill. 폴더 구조, ORM 패턴, 인증 방식, 에러 핸들링 패턴을 탐색해서 일관된 구현이 가능하게 한다. BE Agent가 04_task_BE.md를 받고 구현에 착수하기 전, 코드베이스를 처음 접하는 상황, 또는 기존 BE 코드에 새 API를 추가할 때 반드시 사용한다."
4
+ context: fork
5
+ agent: Explore
6
+ ---
7
+
8
+ # Explore BE Codebase
9
+
10
+ BE Agent가 구현을 시작하기 전에 기존 백엔드 코드의 구조와 패턴을 파악하는 skill이다.
11
+
12
+ 기존 프로젝트에 API를 추가할 때, 기존 패턴과 다른 방식으로 구현하면 코드베이스가 일관성을 잃는다. 이 skill은 기존 코드를 탐색해서 "이 프로젝트에서는 이렇게 한다"를 파악하고, BE Agent가 동일한 패턴으로 구현할 수 있도록 현황을 정리한다.
13
+
14
+ 신규 프로젝트(기존 코드 없음)의 경우에도 실행하되, "기존 BE 코드 없음 — 처음부터 구현"으로 보고한다.
15
+
16
+ ---
17
+
18
+ ## 탐색 절차
19
+
20
+ Explore agent를 사용하여 아래 항목들을 순서대로 탐색한다.
21
+
22
+ ### 1. 의존성 파악
23
+
24
+ `package.json`을 읽어서 프레임워크와 주요 라이브러리를 파악한다.
25
+
26
+ ```
27
+ Glob: **/package.json
28
+ ```
29
+
30
+ 확인할 항목:
31
+
32
+ | 카테고리 | 찾을 패키지 |
33
+ |---------|-----------|
34
+ | 프레임워크 | `express`, `fastify`, `@nestjs/core`, `hono`, `koa`, `@hapi/hapi` |
35
+ | ORM/DB | `prisma`, `@prisma/client`, `typeorm`, `drizzle-orm`, `sequelize`, `mongoose`, `knex`, `pg`, `mysql2`, `better-sqlite3` |
36
+ | 인증 | `jsonwebtoken`, `passport`, `@nestjs/jwt`, `bcrypt`, `bcryptjs`, `express-session`, `cookie-session` |
37
+ | 유효성 검사 | `zod`, `joi`, `class-validator`, `yup`, `ajv` |
38
+ | API 문서 | `@nestjs/swagger`, `swagger-jsdoc`, `swagger-ui-express` |
39
+ | 테스트 | `jest`, `vitest`, `supertest`, `mocha`, `chai` |
40
+ | 로깅 | `winston`, `pino`, `morgan`, `@nestjs/common` (Logger) |
41
+ | 기타 | `dotenv`, `cors`, `helmet`, `express-rate-limit`, `multer`, `nodemailer`, `bull`, `ioredis` |
42
+
43
+ 버전도 함께 기록한다 — 메이저 버전에 따라 API가 다를 수 있다.
44
+
45
+ Python 프로젝트인 경우 `requirements.txt`, `pyproject.toml`, `Pipfile`을 확인한다:
46
+
47
+ | 카테고리 | 찾을 패키지 |
48
+ |---------|-----------|
49
+ | 프레임워크 | `fastapi`, `django`, `flask`, `starlette` |
50
+ | ORM/DB | `sqlalchemy`, `tortoise-orm`, `django-orm`, `prisma`, `peewee`, `sqlmodel` |
51
+ | 인증 | `python-jose`, `pyjwt`, `passlib`, `python-multipart` |
52
+ | 유효성 검사 | `pydantic` |
53
+
54
+ ### 2. 폴더 구조 파악
55
+
56
+ 프로젝트의 디렉토리 레이아웃을 파악한다.
57
+
58
+ ```
59
+ Glob: src/**/*
60
+ Glob: server/**/*
61
+ Glob: api/**/*
62
+ Glob: routes/**/*
63
+ Glob: controllers/**/*
64
+ Glob: services/**/*
65
+ Glob: models/**/*
66
+ Glob: middlewares/**/*
67
+ ```
68
+
69
+ 확인할 패턴:
70
+
71
+ | 패턴 | 의미 |
72
+ |------|------|
73
+ | `src/routes/` | 라우트 정의 |
74
+ | `src/controllers/` | 컨트롤러 레이어 |
75
+ | `src/services/` | 비즈니스 로직 레이어 |
76
+ | `src/models/` 또는 `src/entities/` | DB 모델/엔티티 |
77
+ | `src/middlewares/` 또는 `src/middleware/` | 미들웨어 |
78
+ | `src/utils/` 또는 `src/lib/` | 유틸리티/헬퍼 |
79
+ | `src/config/` | 설정 파일 |
80
+ | `src/types/` | 타입 정의 |
81
+ | `prisma/` | Prisma 스키마/마이그레이션 |
82
+ | `src/modules/` (NestJS) | 모듈 단위 구성 |
83
+ | `src/dto/` (NestJS) | DTO 정의 |
84
+
85
+ ### 3. 기존 API 엔드포인트 목록
86
+
87
+ ```
88
+ Grep: router\.(get|post|put|patch|delete)\(|app\.(get|post|put|patch|delete)\(|@(Get|Post|Put|Patch|Delete)\(|@api_view|@app\.(get|post|put|patch|delete)
89
+ Glob: src/routes/**/*.{ts,js}
90
+ Glob: src/controllers/**/*.{ts,js}
91
+ ```
92
+
93
+ 기존에 구현된 API 엔드포인트 목록을 정리한다:
94
+ - HTTP 메서드
95
+ - 경로 (path)
96
+ - 담당 컨트롤러/핸들러
97
+ - 인증 필요 여부
98
+
99
+ ### 4. 인증 미들웨어 구현 방식
100
+
101
+ ```
102
+ Grep: jwt|passport|auth|token|Bearer|session
103
+ Glob: src/middlewares/auth*
104
+ Glob: src/middleware/auth*
105
+ Glob: src/guards/**/*
106
+ Glob: src/auth/**/*
107
+ ```
108
+
109
+ 확인할 것:
110
+ - 인증 방식 (JWT / Session / OAuth / API Key)
111
+ - 토큰 저장 위치 (header / cookie)
112
+ - 토큰 검증 로직 (미들웨어/가드 위치와 구현)
113
+ - 역할 기반 접근 제어 (RBAC) 유무
114
+ - 리프레시 토큰 처리 방식
115
+
116
+ ### 5. ORM 스키마 / 모델 파일
117
+
118
+ ```
119
+ Glob: prisma/schema.prisma
120
+ Glob: src/models/**/*.{ts,js}
121
+ Glob: src/entities/**/*.{ts,js}
122
+ Glob: src/schemas/**/*.{ts,js}
123
+ Grep: @Entity|@Table|@Column|model\s+\w+\s*\{|Schema\(|defineTable
124
+ ```
125
+
126
+ 확인할 것:
127
+ - 사용하는 ORM과 스키마 정의 방식
128
+ - 기존 모델/테이블 목록
129
+ - 관계 설정 패턴 (1:N, N:M 등)
130
+ - 마이그레이션 관리 방식
131
+ - soft delete, timestamp 등 공통 필드 패턴
132
+
133
+ ### 6. 에러 핸들링 패턴
134
+
135
+ ```
136
+ Grep: class\s+\w*Error|class\s+\w*Exception|ErrorHandler|errorHandler|@Catch|HttpException|createError
137
+ Glob: src/errors/**/*
138
+ Glob: src/exceptions/**/*
139
+ Glob: src/utils/error*
140
+ ```
141
+
142
+ 확인할 것:
143
+ - 커스텀 에러 클래스 정의 여부
144
+ - 에러 응답 형식 (JSON 구조)
145
+ - 글로벌 에러 핸들러 위치와 구현
146
+ - HTTP 상태 코드 사용 패턴
147
+ - 유효성 검사 에러 처리 방식
148
+
149
+ ### 7. 환경변수 구성
150
+
151
+ ```
152
+ Glob: .env.example
153
+ Glob: .env.sample
154
+ Glob: src/config/**/*
155
+ Grep: process\.env\.|config\.(get|has)|@ConfigService|os\.environ|settings\.
156
+ ```
157
+
158
+ 확인할 것:
159
+ - 환경변수 목록과 용도
160
+ - 설정 로딩 방식 (dotenv / @nestjs/config / config 모듈)
161
+ - 환경별 분기 (dev / staging / prod)
162
+
163
+ ---
164
+
165
+ ## 출력 형식
166
+
167
+ 탐색 결과를 아래 형식으로 정리하여 반환한다:
168
+
169
+ ```markdown
170
+ # 기존 BE 코드 현황
171
+
172
+ ## 기술 스택
173
+
174
+ | 카테고리 | 사용 기술 | 버전 |
175
+ |---------|---------|------|
176
+ | 프레임워크 | Express | 4.x |
177
+ | ORM | Prisma | 5.x |
178
+ | 인증 | jsonwebtoken + bcrypt | 9.x / 5.x |
179
+ | 유효성 검사 | zod | 3.x |
180
+ | 테스트 | Jest + supertest | 29.x / 6.x |
181
+ | 로깅 | winston | 3.x |
182
+
183
+ ## 폴더 구조
184
+
185
+ (실제 디렉토리 트리)
186
+
187
+ ## 기존 API 목록
188
+
189
+ | 메서드 | 경로 | 설명 | 인증 |
190
+ |--------|------|------|------|
191
+ | POST | /api/auth/login | 로그인 | X |
192
+ | GET | /api/users/me | 내 정보 조회 | O |
193
+ | POST | /api/posts | 게시글 생성 | O |
194
+
195
+ ## 인증 방식
196
+
197
+ - 방식: JWT (Access + Refresh)
198
+ - 토큰 위치: Authorization header (Bearer)
199
+ - 미들웨어: src/middlewares/auth.ts
200
+ - RBAC: 없음 / 있음 (역할: admin, user)
201
+
202
+ ## ORM / DB 스키마
203
+
204
+ - ORM: Prisma
205
+ - 스키마: prisma/schema.prisma
206
+ - 기존 모델: User, Post, Comment, ...
207
+ - 관계: User 1:N Post, Post 1:N Comment
208
+ - 공통 패턴: createdAt/updatedAt 자동 생성, soft delete 미사용
209
+
210
+ ## 에러 핸들링 패턴
211
+
212
+ - 커스텀 에러: AppError (statusCode, message, isOperational)
213
+ - 응답 형식: { success: false, error: { code, message } }
214
+ - 글로벌 핸들러: src/middlewares/errorHandler.ts
215
+ - 유효성 검사: zod → 400 Bad Request
216
+
217
+ ## 재사용 가능한 미들웨어
218
+
219
+ | 미들웨어 | 경로 | 용도 |
220
+ |---------|------|------|
221
+ | auth | middlewares/auth.ts | JWT 검증 |
222
+ | validate | middlewares/validate.ts | 요청 유효성 검사 |
223
+ | upload | middlewares/upload.ts | 파일 업로드 (multer) |
224
+
225
+ ## 환경변수
226
+
227
+ | 변수 | 용도 |
228
+ |------|------|
229
+ | DATABASE_URL | DB 연결 |
230
+ | JWT_SECRET | 토큰 서명 |
231
+ | PORT | 서버 포트 |
232
+
233
+ ## 주의사항
234
+
235
+ - (기존 패턴과 충돌 가능성, 따라야 할 컨벤션, 주의할 점)
236
+ - 예: "모든 라우트는 /api 접두사를 사용 — 직접 / 에 매핑하지 말 것"
237
+ - 예: "비즈니스 로직은 반드시 services/ 레이어에 — controller에서 직접 DB 호출하지 말 것"
238
+ - 예: "에러는 반드시 AppError 클래스를 사용 — new Error() 직접 사용 금지"
239
+ ```
240
+
241
+ ---
242
+
243
+ ## 신규 프로젝트인 경우
244
+
245
+ BE 관련 파일이 전혀 없으면:
246
+
247
+ ```markdown
248
+ # 기존 BE 코드 현황
249
+
250
+ 기존 BE 코드 없음 — 처음부터 구현.
251
+
252
+ ## 프로젝트 설정 감지
253
+
254
+ - package.json: (있음/없음)
255
+ - 감지된 기술: (있으면 나열)
256
+
257
+ ## 권장사항
258
+
259
+ (04_task_BE.md의 기술 스택 지시에 따름)
260
+ ```
@@ -0,0 +1,190 @@
1
+ ---
2
+ name: explore-codebase
3
+ description: "기획자 Agent가 기획안 작성 전에 기존 코드베이스의 현황을 파악할 때 사용하는 skill. 현재 구현된 기능, 화면 구조, API 패턴, DB 모델을 탐색해서 기획안이 기존 서비스와 일관성을 유지하도록 한다. 기획자가 STEP 2(기존 서비스 파악)를 수행할 때, 코드베이스를 처음 접하는 상황에서, 또는 기존 기능을 수정/확장하는 기획을 할 때 반드시 사용한다."
4
+ ---
5
+
6
+ # Explore Codebase
7
+
8
+ 기획자 Agent가 기획안을 작성하기 전에 기존 코드베이스를 체계적으로 탐색하는 skill이다.
9
+
10
+ 기획안이 기존 서비스와 충돌하지 않으려면, 현재 무엇이 구현되어 있는지를 정확히 알아야 한다. 이 skill은 코드베이스를 실제로 읽고 기존 패턴을 파악해서, 기획자가 현실에 맞는 기획을 할 수 있도록 돕는다.
11
+
12
+ ---
13
+
14
+ ## 탐색 절차
15
+
16
+ ### Step 1: 프로젝트 루트 구조 파악
17
+
18
+ 프로젝트의 전체적인 모습을 빠르게 스캔한다.
19
+
20
+ ```
21
+ Glob: package.json, requirements.txt, go.mod, Cargo.toml, pom.xml, build.gradle
22
+ Glob: docker-compose*, Dockerfile*
23
+ Glob: .github/workflows/*, .gitlab-ci.yml
24
+ ```
25
+
26
+ 파악할 내용:
27
+ - **기술 스택**: 언어, 프레임워크, 주요 라이브러리
28
+ - **프로젝트 구조**: 모노레포 / FE·BE 분리 / 풀스택 일체형
29
+ - **인프라**: Docker, CI/CD 파이프라인 유무
30
+
31
+ package.json이나 requirements.txt의 dependencies를 읽어서 사용 중인 프레임워크와 라이브러리를 정확히 파악한다. 버전도 함께 기록한다 — 기획 시 해당 버전에서 지원하는 기능인지 확인하는 데 쓰인다.
32
+
33
+ ### Step 2: 화면/라우트 목록 파악
34
+
35
+ 사용자에게 노출되는 화면 구조를 파악한다. 프레임워크에 따라 탐색 방법이 다르다.
36
+
37
+ **Next.js (Pages Router):**
38
+ ```
39
+ Glob: src/pages/**/*.tsx, pages/**/*.tsx
40
+ ```
41
+ → 파일 경로가 곧 라우트다. `[id].tsx`는 동적 라우트.
42
+
43
+ **Next.js (App Router):**
44
+ ```
45
+ Glob: src/app/**/page.tsx, app/**/page.tsx
46
+ ```
47
+ → `page.tsx`가 있는 폴더 경로가 라우트.
48
+
49
+ **React (React Router 등):**
50
+ ```
51
+ Grep: Route, path=, createBrowserRouter
52
+ Glob: src/pages/**/*.tsx, src/views/**/*.tsx
53
+ ```
54
+ → 라우터 설정 파일에서 경로 매핑을 추출.
55
+
56
+ **Vue / Nuxt:**
57
+ ```
58
+ Glob: pages/**/*.vue, src/views/**/*.vue
59
+ ```
60
+
61
+ **백엔드 전용 (Express, FastAPI 등):**
62
+ → 화면 없음. Step 3으로 직접 이동.
63
+
64
+ 각 화면에 대해 파악할 것:
65
+ - 라우트 경로 (예: `/login`, `/products/:id`)
66
+ - 해당 화면의 주요 컴포넌트
67
+ - 사용하는 데이터 (어떤 API를 호출하는지)
68
+
69
+ ### Step 3: API 엔드포인트 목록 파악
70
+
71
+ 서버 사이드 API를 탐색한다.
72
+
73
+ ```
74
+ Glob: **/routes/**/*.ts, **/routes/**/*.js, **/api/**/*.ts
75
+ Grep: router\.(get|post|put|delete|patch), app\.(get|post|put|delete|patch)
76
+ Grep: @Get|@Post|@Put|@Delete|@Patch
77
+ ```
78
+
79
+ 각 엔드포인트에 대해 파악할 것:
80
+ - HTTP Method + Path
81
+ - 간단한 역할 설명
82
+ - 인증 필요 여부 (미들웨어로 보호되고 있는지)
83
+
84
+ Next.js API Routes(`pages/api/`, `app/api/`)도 별도로 탐색한다.
85
+
86
+ ### Step 4: DB 스키마/모델 파악
87
+
88
+ 데이터 모델 구조를 파악한다.
89
+
90
+ ```
91
+ Glob: **/prisma/schema.prisma
92
+ Glob: **/models/**/*.ts, **/models/**/*.py, **/entities/**/*.ts
93
+ Grep: @Entity, @Table, @model, class.*Model
94
+ ```
95
+
96
+ 파악할 내용:
97
+ - 모델 이름과 주요 필드
98
+ - 모델 간 관계 (1:N, N:M 등)
99
+ - 특이사항 (soft delete, timestamp, enum 등)
100
+
101
+ ORM을 사용하지 않는 경우 migration 파일이나 SQL 스키마를 확인한다:
102
+ ```
103
+ Glob: **/migrations/**/*.sql, **/schema.sql
104
+ ```
105
+
106
+ ### Step 5: 기존 패턴 분석
107
+
108
+ 코드베이스에서 반복되는 패턴을 파악한다. 기획안이 이 패턴을 따라야 구현 팀의 생산성이 높아진다.
109
+
110
+ 확인할 패턴:
111
+ - **상태 관리**: Redux, Zustand, React Context, useState 등
112
+ - **API 호출 방식**: axios, fetch, React Query, SWR 등
113
+ - **인증 방식**: JWT, Session, NextAuth, Passport 등
114
+ - **에러 처리**: 공통 에러 핸들러가 있는지, 에러 바운더리 사용 여부
115
+ - **스타일링**: CSS Modules, Tailwind, styled-components, 바닐라 CSS 등
116
+
117
+ ```
118
+ Grep: useQuery|useSWR|axios|fetch\(
119
+ Grep: useAuth|getSession|getServerSession|passport
120
+ Grep: import.*\.module\.|tailwind|styled
121
+ ```
122
+
123
+ ---
124
+
125
+ ## 출력 형식
126
+
127
+ 탐색이 완료되면 아래 형식으로 결과를 정리하여 반환한다. 이 결과는 기획자가 기획안 작성 시 참고하는 내부 문서이므로 파일로 저장하지 않는다.
128
+
129
+ ```markdown
130
+ # 기존 서비스 현황
131
+
132
+ ## 기술 스택
133
+
134
+ | 영역 | 기술 | 버전 |
135
+ |------|------|------|
136
+ | FE | (예: React 18, Next.js 14) | (예: 18.2.0, 14.1.0) |
137
+ | BE | (예: Express 4) | (예: 4.18.2) |
138
+ | DB | (예: PostgreSQL + Prisma) | (예: Prisma 5.9.1) |
139
+ | Infra | (예: Docker, GitHub Actions) | - |
140
+ | 스타일링 | (예: Tailwind CSS) | (예: 3.4.1) |
141
+ | 상태관리 | (예: Zustand) | (예: 4.5.0) |
142
+
143
+ ## 기존 화면 목록
144
+
145
+ | 라우트 | 화면명 | 주요 기능 |
146
+ |--------|--------|-----------|
147
+ | / | 홈 | 랜딩 페이지, 상품 목록 표시 |
148
+ | /login | 로그인 | 이메일/비밀번호 인증 |
149
+ | /products/:id | 상품 상세 | 상품 정보 표시, 장바구니 추가 |
150
+
151
+ ## 기존 API 목록
152
+
153
+ | Method | Path | 설명 | 인증 |
154
+ |--------|------|------|------|
155
+ | GET | /api/products | 상품 목록 조회 | X |
156
+ | POST | /api/orders | 주문 생성 | O |
157
+
158
+ ## 기존 DB 모델
159
+
160
+ | 모델 | 주요 필드 | 관계 |
161
+ |------|-----------|------|
162
+ | User | id, email, name, role | Order(1:N) |
163
+ | Product | id, name, price, stock | OrderItem(1:N) |
164
+
165
+ ## 기존 코드 패턴
166
+
167
+ - **API 호출**: (예: axios 인스턴스 + 커스텀 훅 패턴)
168
+ - **인증**: (예: NextAuth + JWT 전략)
169
+ - **에러 처리**: (예: 공통 에러 핸들러 없음, 컴포넌트별 try-catch)
170
+ - **스타일링**: (예: 바닐라 CSS, globals.css 단일 파일)
171
+
172
+ ## 기획 시 주의사항
173
+
174
+ - (기존 기능과 충돌할 수 있는 부분)
175
+ - (재사용 가능한 기존 컴포넌트/API)
176
+ - (기존 패턴을 따라야 하는 이유와 구체적 사항)
177
+ - (기존 코드에서 발견된 제약사항 — 예: 인증 미구현)
178
+ ```
179
+
180
+ ---
181
+
182
+ ## 탐색 품질 체크리스트
183
+
184
+ 결과를 반환하기 전에 점검한다:
185
+
186
+ - [ ] 화면 목록에 누락된 페이지가 없는가?
187
+ - [ ] API 목록에 누락된 엔드포인트가 없는가?
188
+ - [ ] DB 모델 간 관계가 정확한가?
189
+ - [ ] 코드 패턴 분석이 실제 코드에 근거하는가?
190
+ - [ ] 주의사항이 기획에 실질적으로 도움이 되는 내용인가?