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,151 @@
1
+ ---
2
+ name: write-qa-report
3
+ description: "QA 엔지니어가 검증 완료 후 최종 QA 보고서를 작성할 때 참조하는 skill. PM이 배포 결정을 내릴 수 있는 수준의 보고서를 context/qa_report.md로 저장한다. 검증 범위, 결과 요약, 버그 목록, 심각도별 분석, 미검증 항목, 배포 권고까지 포함한다. QA Agent가 테스트를 모두 마치고 보고서를 작성할 때, PM에게 QA 결과를 전달할 때, 배포 승인 여부를 판단해야 할 때 반드시 사용한다. 'QA 보고서 작성', 'qa_report 생성', '테스트 결과 정리', '배포 가능 여부 판단', 'QA 완료 보고' 등의 상황에서 트리거된다."
4
+ ---
5
+
6
+ # Write QA Report
7
+
8
+ QA 엔지니어가 검증을 마친 후 최종 보고서를 작성하는 skill이다.
9
+
10
+ 이 보고서의 독자는 PM이다. PM은 이 보고서 하나만 보고 "배포해도 되는가?"를 판단해야 한다. 따라서 보고서는 기술적 세부사항보다 **의사결정에 필요한 정보**에 집중한다. 버그가 몇 개이고, 얼마나 심각하고, 해결됐는지, 배포해도 안전한지를 명확하게 전달하는 것이 목적이다.
11
+
12
+ ---
13
+
14
+ ## 작성 절차
15
+
16
+ ### 1. 테스트 결과 수집
17
+
18
+ 보고서를 작성하기 전에 아래 정보를 정리한다:
19
+
20
+ - 실행한 테스트 케이스 전체 목록과 결과 (통과/실패/보류)
21
+ - 발견된 버그 목록과 현재 상태 (수정됨/미수정/재현불가)
22
+ - 기획안(`context/01_plan.md`)에서 명시된 기능 중 검증하지 못한 항목
23
+ - 검증 과정에서 발견한 위험 요소
24
+
25
+ ### 2. 보고서 작성
26
+
27
+ 아래 템플릿에 따라 `context/qa_report.md`를 작성한다.
28
+
29
+ ---
30
+
31
+ ## 보고서 템플릿
32
+
33
+ ```markdown
34
+ # QA 보고서
35
+
36
+ > 작성일: YYYY-MM-DD
37
+ > 검증 대상: (기능/버전 명시)
38
+ > 기준 문서: context/01_plan.md
39
+
40
+ ---
41
+
42
+ ## 1. 검증 범위
43
+
44
+ - 테스트 케이스: **N개**
45
+ - 검증 기준: context/01_plan.md 기획안 + context/03_api_spec.md API 명세
46
+ - 검증 기간: YYYY-MM-DD
47
+
48
+ ---
49
+
50
+ ## 2. 결과 요약
51
+
52
+ | 구분 | 수량 |
53
+ |------|------|
54
+ | 전체 | N |
55
+ | ✅ 통과 | N |
56
+ | ❌ 실패 | N |
57
+ | ⏸ 보류 | N |
58
+
59
+ **통과율: N%**
60
+
61
+ ---
62
+
63
+ ## 3. 버그 목록
64
+
65
+ | ID | 심각도 | 제목 | 대상 | 상태 |
66
+ |----|--------|------|------|------|
67
+ | BUG-001 | 🔴 Critical | 결제 시 금액 0원 처리 | BE - payments API | ✅ 수정됨 |
68
+ | BUG-002 | 🟠 High | 로그인 후 리다이렉트 실패 | FE - auth | ✅ 수정됨 |
69
+ | BUG-003 | 🟡 Medium | 목록 빈 상태 UI 미표시 | FE - orders | ⏳ 미수정 |
70
+ | BUG-004 | 🔵 Low | 날짜 포맷 불일치 | FE - common | ⏳ 미수정 |
71
+
72
+ 발견된 버그가 없으면 "발견된 버그 없음"으로 작성한다.
73
+
74
+ ---
75
+
76
+ ## 4. 심각도별 분석
77
+
78
+ ### 🔴 Critical (서비스 불가 수준)
79
+ - BUG-001: 결제 시 금액 0원 처리 → **수정 완료, 재검증 통과**
80
+
81
+ ### 🟠 High (핵심 기능 장애)
82
+ - BUG-002: 로그인 후 리다이렉트 실패 → **수정 완료, 재검증 통과**
83
+
84
+ ### 🟡 Medium (불편하지만 우회 가능)
85
+ - BUG-003: 목록 빈 상태 UI 미표시 → 배포 후 처리 가능 (기능 동작에 영향 없음)
86
+
87
+ ### 🔵 Low (사소한 개선)
88
+ - BUG-004: 날짜 포맷 불일치 → 배포 후 처리 가능
89
+
90
+ 해당 심각도의 버그가 없으면 "없음"으로 작성한다.
91
+
92
+ ---
93
+
94
+ ## 5. 미검증 항목
95
+
96
+ | 항목 | 미검증 이유 |
97
+ |------|------------|
98
+ | (항목 없으면 "모든 기획 항목 검증 완료" 작성) | |
99
+
100
+ 미검증 항목이 있으면 PM이 리스크를 판단할 수 있도록 이유를 명확히 작성한다.
101
+ 예: "외부 결제 API 연동 — 테스트 환경에서 실제 결제 불가"
102
+
103
+ ---
104
+
105
+ ## 6. 배포 권고
106
+
107
+ (아래 두 가지 중 하나를 선택하여 작성한다)
108
+
109
+ ### ✅ 배포 가능
110
+
111
+ **판단 근거:**
112
+ - Critical/High 버그 0건 (또는 모두 수정 완료)
113
+ - 통과율 N%
114
+ - 미수정 버그는 Medium/Low만 N건 — 배포 후 처리 가능
115
+
116
+ ### ❌ 배포 불가
117
+
118
+ **미해결 차단 버그:**
119
+ - BUG-XXX: (제목) — Critical/High, 미수정
120
+ - BUG-YYY: (제목) — Critical/High, 미수정
121
+
122
+ **배포를 위해 필요한 조치:**
123
+ 1. (구체적 수정 사항)
124
+ 2. (재검증 필요 범위)
125
+ ```
126
+
127
+ ---
128
+
129
+ ## 판단 기준
130
+
131
+ 배포 권고를 결정할 때 아래 기준을 따른다:
132
+
133
+ | 조건 | 배포 권고 |
134
+ |------|----------|
135
+ | Critical/High 미수정 0건 | ✅ 배포 가능 |
136
+ | Critical 미수정 1건 이상 | ❌ 배포 불가 |
137
+ | High 미수정 1건 이상 | ❌ 배포 불가 (PM 판단에 따라 예외 가능) |
138
+ | Medium/Low만 미수정 | ✅ 배포 가능 (배포 후 처리 명시) |
139
+ | 미검증 항목 있음 | 리스크 명시 후 PM 판단에 위임 |
140
+
141
+ 이 기준은 기본값이다. PM이 비즈니스 상황에 따라 다르게 판단할 수 있으므로, 보고서는 판단의 **근거**를 제공하는 데 집중한다.
142
+
143
+ ---
144
+
145
+ ## 작성 규칙
146
+
147
+ - 버그 ID는 `BUG-001`부터 순번으로 매긴다
148
+ - 심각도 이모지를 일관되게 사용한다: 🔴 Critical, 🟠 High, 🟡 Medium, 🔵 Low
149
+ - 상태 이모지를 일관되게 사용한다: ✅ 수정됨, ⏳ 미수정, 🔄 재현불가
150
+ - "배포 가능"이라도 미수정 Medium/Low가 있으면 반드시 목록을 남긴다
151
+ - 파일 저장 경로: `context/qa_report.md`
@@ -0,0 +1,185 @@
1
+ ---
2
+ name: write-security-report
3
+ description: "보안 리뷰어가 검토 완료 후 최종 보안 보고서를 작성할 때 참조하는 skill. OWASP Top 10 체크 결과와 발견된 취약점을 PM이 배포 결정에 사용할 수 있는 형식으로 context/security_report.md에 작성한다. Security Agent가 취약점 탐색을 마치고 보고서를 작성할 때, PM에게 보안 검토 결과를 전달할 때, 배포 전 보안 승인이 필요할 때 반드시 사용한다. '보안 보고서 작성', 'security_report 생성', '보안 검토 결과 정리', '배포 보안 승인', 'OWASP 체크 결과 보고' 등의 상황에서 트리거된다."
4
+ ---
5
+
6
+ # Write Security Report
7
+
8
+ 보안 리뷰어가 검토를 완료한 후 최종 보안 보고서를 작성할 때 따르는 패턴이다.
9
+
10
+ 보안 보고서의 핵심 목적은 PM이 "이 코드를 프로덕션에 배포해도 되는가?"를 판단할 수 있게 하는 것이다. 기술적 세부 사항을 나열하는 것이 아니라, 심각도별로 정리된 취약점 목록과 명확한 배포 권고를 제공한다.
11
+
12
+ 보고서는 `context/security_report.md`에 저장한다.
13
+
14
+ ---
15
+
16
+ ## 보고서 구조
17
+
18
+ 아래 6개 섹션을 순서대로 작성한다.
19
+
20
+ ### Section 1: 검토 범위
21
+
22
+ 검토 대상과 기준을 명시한다. PM이 "무엇을 검토했는지"를 한눈에 파악할 수 있어야 한다.
23
+
24
+ ```markdown
25
+ ## 1. 검토 범위
26
+
27
+ | 항목 | 내용 |
28
+ |------|------|
29
+ | 검토 대상 | FE (Next.js) + BE (Express) + Infra (Docker, CI/CD) |
30
+ | 검토 기준 | OWASP Top 10 (2021) |
31
+ | 검토 일시 | 2026-03-23 |
32
+ | 검토 방법 | 정적 분석 (패턴 기반 코드 탐색) |
33
+ | 검토 범위 외 | 의존성 취약점 (npm audit 별도), 인프라 네트워크 보안 |
34
+ ```
35
+
36
+ ### Section 2: 결과 요약
37
+
38
+ 심각도별 발견/수정/미해결 건수를 한 테이블로 보여준다. PM이 이 테이블만 보고도 전체 상황을 파악할 수 있어야 한다.
39
+
40
+ ```markdown
41
+ ## 2. 결과 요약
42
+
43
+ | 심각도 | 발견 | 수정완료 | 미해결 |
44
+ |--------|------|---------|--------|
45
+ | Critical | 1 | 1 | 0 |
46
+ | High | 2 | 2 | 0 |
47
+ | Medium | 3 | 2 | 1 |
48
+ | Low | 2 | 0 | 2 |
49
+ | **합계** | **8** | **5** | **3** |
50
+ ```
51
+
52
+ ### Section 3: 취약점 상세
53
+
54
+ 발견된 모든 취약점을 테이블로 나열한다. 심각도 높은 것부터 정렬한다.
55
+
56
+ ```markdown
57
+ ## 3. 취약점 상세
58
+
59
+ | ID | 심각도 | 제목 | 대상 파일 | OWASP | 상태 |
60
+ |----|--------|------|----------|-------|------|
61
+ | SEC-001 | Critical | DB 비밀번호 하드코딩 | src/config/db.ts:15 | A07 | 수정완료 |
62
+ | SEC-002 | High | 관리자 API 인증 미들웨어 누락 | src/routes/admin.ts:42 | A01 | 수정완료 |
63
+ | SEC-003 | High | 사용자 응답에 password 필드 포함 | src/controllers/users.ts:28 | A01 | 수정완료 |
64
+ | SEC-004 | Medium | dangerouslySetInnerHTML 사용 | src/components/Comment.tsx:35 | A03 | 미해결 |
65
+ | SEC-005 | Medium | 와일드카드 CORS 설정 | src/app.ts:12 | A05 | 수정완료 |
66
+ | SEC-006 | Medium | process.env 직접 참조 | src/services/email.ts:8 | A05 | 수정완료 |
67
+ | SEC-007 | Low | HTTP URL 사용 | src/utils/api.ts:22 | A02 | 미해결 |
68
+ | SEC-008 | Low | console.log에 요청 데이터 출력 | src/middleware/logger.ts:15 | A09 | 미해결 |
69
+ ```
70
+
71
+ 각 취약점에 대해 필요하면 상세 설명을 추가한다:
72
+
73
+ ```markdown
74
+ ### SEC-004: dangerouslySetInnerHTML 사용 (Medium)
75
+ - **위치:** src/components/Comment.tsx:35
76
+ - **설명:** 사용자 입력 댓글을 dangerouslySetInnerHTML로 렌더링. sanitize 처리 없이 사용하면 XSS 공격 가능.
77
+ - **권장 조치:** DOMPurify 등으로 sanitize 처리 추가, 또는 마크다운 라이브러리로 교체
78
+ - **현재 상태:** 미해결 — BE에서 sanitize 후 저장하는 방식으로 변경 예정
79
+ ```
80
+
81
+ ### Section 4: OWASP Top 10 체크 결과
82
+
83
+ OWASP Top 10 각 항목에 대해 검토 결과를 표시한다. "검토하지 않았다"와 "문제 없었다"를 구분하는 것이 중요하다.
84
+
85
+ ```markdown
86
+ ## 4. OWASP Top 10 체크 결과
87
+
88
+ | # | OWASP 항목 | 결과 | 비고 |
89
+ |---|-----------|------|------|
90
+ | A01 | Broken Access Control | ⚠️ 발견 (수정완료) | SEC-002, SEC-003 |
91
+ | A02 | Cryptographic Failures | ⚠️ 발견 (미해결) | SEC-007 |
92
+ | A03 | Injection | ⚠️ 발견 (미해결) | SEC-004 |
93
+ | A04 | Insecure Design | ✅ 문제 없음 | |
94
+ | A05 | Security Misconfiguration | ⚠️ 발견 (수정완료) | SEC-005, SEC-006 |
95
+ | A06 | Vulnerable Components | ➖ 검토 범위 외 | npm audit 별도 실행 필요 |
96
+ | A07 | Identification Failures | ⚠️ 발견 (수정완료) | SEC-001 |
97
+ | A08 | Software/Data Integrity | ✅ 문제 없음 | |
98
+ | A09 | Logging Failures | ⚠️ 발견 (미해결) | SEC-008 |
99
+ | A10 | SSRF | ✅ 문제 없음 | |
100
+ ```
101
+
102
+ 범례:
103
+ - ✅ 문제 없음 — 검토했고 위험 패턴 미발견
104
+ - ⚠️ 발견 — 취약점 발견됨 (수정완료/미해결 구분)
105
+ - ➖ 검토 범위 외 — 이번 검토에서 다루지 않음
106
+
107
+ ### Section 5: 미해결 취약점
108
+
109
+ 미해결 항목이 있으면 별도로 모아서 PM이 즉시 판단할 수 있게 한다.
110
+
111
+ ```markdown
112
+ ## 5. 미해결 취약점
113
+
114
+ | ID | 심각도 | 제목 | 미해결 사유 | 위험 평가 |
115
+ |----|--------|------|-----------|----------|
116
+ | SEC-004 | Medium | dangerouslySetInnerHTML | BE 수정 후 적용 예정 | 현재 관리자만 댓글 작성 가능 — 즉시 위험 낮음 |
117
+ | SEC-007 | Low | HTTP URL 사용 | 개발 환경 전용 | 프로덕션에서는 HTTPS 강제 — 실제 위험 없음 |
118
+ | SEC-008 | Low | console.log 데이터 출력 | 다음 스프린트에서 로거 교체 예정 | 민감 데이터 포함 여부 확인 필요 |
119
+ ```
120
+
121
+ 미해결 항목이 없으면:
122
+
123
+ ```markdown
124
+ ## 5. 미해결 취약점
125
+
126
+ 미해결 취약점 없음.
127
+ ```
128
+
129
+ ### Section 6: 배포 권고
130
+
131
+ PM이 배포 결정을 내릴 수 있도록 명확한 권고를 제공한다.
132
+
133
+ ```markdown
134
+ ## 6. 배포 권고
135
+
136
+ ### 판단: ✅ 배포 가능
137
+
138
+ **근거:**
139
+ - Critical 미해결: 0건
140
+ - High 미해결: 0건
141
+ - Medium 미해결: 1건 (SEC-004 — 현재 위험 낮음, 다음 스프린트에서 해결 예정)
142
+ - Low 미해결: 2건 (운영 영향 없음)
143
+
144
+ **조건:**
145
+ - SEC-004는 다음 스프린트에서 반드시 수정할 것
146
+ - 프로덕션 배포 전 `npm audit` 실행하여 의존성 취약점 확인할 것
147
+ ```
148
+
149
+ ---
150
+
151
+ ## 배포 권고 판단 기준
152
+
153
+ | 조건 | 판단 |
154
+ |------|------|
155
+ | Critical 미해결 ≥ 1 | ❌ 배포 불가 |
156
+ | High 미해결 ≥ 1 | ❌ 배포 불가 |
157
+ | Medium 미해결만 있음 | ⚠️ PM이 판단 (위험 평가 포함) |
158
+ | Low 미해결만 있음 | ✅ 배포 가능 (조건부) |
159
+ | 미해결 없음 | ✅ 배포 가능 |
160
+
161
+ 배포 불가 판단 시:
162
+
163
+ ```markdown
164
+ ### 판단: ❌ 배포 불가
165
+
166
+ **근거:**
167
+ - Critical 미해결: 1건 (SEC-001 — DB 비밀번호 하드코딩)
168
+ - 해당 취약점이 수정되기 전까지 배포를 진행하면 안 됩니다.
169
+
170
+ **필요 조치:**
171
+ 1. SEC-001 수정 → BE Agent에게 전달 완료
172
+ 2. 수정 후 재검토 필요
173
+ ```
174
+
175
+ ---
176
+
177
+ ## 보고서 작성 체크리스트
178
+
179
+ 1. [ ] **검토 범위** — 대상, 기준, 방법, 범위 외 항목이 명시됐는가
180
+ 2. [ ] **결과 요약** — 심각도별 발견/수정/미해결 수가 정확한가
181
+ 3. [ ] **취약점 상세** — 모든 발견 항목에 ID, 심각도, 파일:라인, OWASP 분류가 있는가
182
+ 4. [ ] **OWASP 체크** — 10개 항목 전체가 체크됐는가 (검토 범위 외도 표시)
183
+ 5. [ ] **미해결 취약점** — 미해결 사유와 위험 평가가 있는가
184
+ 6. [ ] **배포 권고** — 가능/불가 판단과 근거가 명확한가
185
+ 7. [ ] **저장 위치** — `context/security_report.md`에 저장했는가
@@ -0,0 +1,234 @@
1
+ ---
2
+ name: write-test-cases
3
+ description: "QA 엔지니어가 기획안을 기반으로 테스트 케이스를 작성할 때 참조하는 skill. 기능 테스트, 엣지케이스, E2E, API 검증으로 분류해서 작성하며 누락 없이 기획안을 커버한다. QA Agent가 04_task_QA.md를 받고 검증을 시작할 때, 테스트 케이스를 처음 작성할 때, 또는 기획안이 수정되어 TC를 업데이트해야 할 때 반드시 사용한다. '테스트 케이스 작성', 'TC 작성', 'QA 시작', '검증 준비', '테스트 시나리오 만들기' 등의 상황에서 트리거된다."
4
+ ---
5
+
6
+ # Write Test Cases
7
+
8
+ QA 엔지니어가 기획안(01_plan.md)을 기반으로 테스트 케이스를 작성할 때 따르는 패턴이다.
9
+
10
+ 테스트 케이스가 기획안을 빠짐없이 커버하지 않으면 검증에 구멍이 생긴다. 기획안에 "비밀번호 찾기" 기능이 있는데 TC가 없으면 해당 기능은 아무도 검증하지 않은 채 배포된다. 이 skill은 기획안의 각 섹션에서 TC를 체계적으로 도출하고, 마지막에 누락 여부를 대조 검증하는 절차를 제공한다.
11
+
12
+ ---
13
+
14
+ ## TC 도출 원칙: 기획안 Section → TC 분류
15
+
16
+ 기획안(01_plan.md)의 각 섹션이 특정 유형의 TC로 매핑된다. 이 매핑을 따르면 기획안의 모든 내용이 자연스럽게 TC로 변환된다.
17
+
18
+ | 기획안 섹션 | TC 분류 | 도출 방법 |
19
+ |------------|---------|----------|
20
+ | Section 2 (유저 스토리) | E2E 시나리오 | 각 유저 스토리를 처음부터 끝까지 흐름으로 변환 |
21
+ | Section 3 (기능 명세) | 기능 테스트 | 각 기능의 정상 동작을 개별 TC로 작성 |
22
+ | Section 5 (API 목록) | API 검증 | 각 API의 요청/응답을 검증하는 TC 작성 |
23
+ | Section 6 (엣지케이스) | 엣지케이스 테스트 | 기획안에 명시된 예외 상황을 TC로 작성 |
24
+
25
+ ---
26
+
27
+ ## TC 작성 형식
28
+
29
+ 모든 TC는 아래 형식으로 작성한다. "기준" 필드가 핵심이다 — 기준이 없는 TC는 검증 기준이 모호해서 통과/실패를 판단할 수 없다.
30
+
31
+ ```
32
+ TC-001
33
+ 분류: 기능 / 엣지케이스 / E2E / API / 보안
34
+ 제목: 로그인 성공 시 대시보드로 이동
35
+ 전제 조건: 유효한 계정(test@example.com / password123)이 존재함
36
+ 테스트 순서:
37
+ 1. 로그인 페이지 접속
38
+ 2. 이메일: test@example.com 입력
39
+ 3. 비밀번호: password123 입력
40
+ 4. 로그인 버튼 클릭
41
+ 기대 결과: 대시보드 페이지(/dashboard)로 이동, 헤더에 사용자 이름 표시
42
+ 기준: 01_plan.md Section 3.1 - 로그인 기능
43
+ ```
44
+
45
+ ### 번호 규칙
46
+
47
+ | 분류 | 번호 범위 | 예시 |
48
+ |------|----------|------|
49
+ | 기능 테스트 | TC-001 ~ TC-099 | TC-001, TC-002 |
50
+ | 엣지케이스 | TC-100 ~ TC-199 | TC-100, TC-101 |
51
+ | E2E 시나리오 | TC-200 ~ TC-299 | TC-200, TC-201 |
52
+ | API 검증 | TC-300 ~ TC-399 | TC-300, TC-301 |
53
+ | 보안 | TC-400 ~ TC-499 | TC-400, TC-401 |
54
+
55
+ ---
56
+
57
+ ## STEP 1: 기능 테스트 TC 도출 (Section 3 → TC-0XX)
58
+
59
+ 기획안 Section 3의 각 기능마다 최소 2개 TC를 작성한다:
60
+ - **정상 동작** TC: 올바른 입력으로 기대 결과 확인
61
+ - **실패 동작** TC: 잘못된 입력이나 조건 불충족 시 에러 처리 확인
62
+
63
+ **예시 — "게시글 작성" 기능:**
64
+
65
+ ```
66
+ TC-010
67
+ 분류: 기능
68
+ 제목: 게시글 작성 성공
69
+ 전제 조건: 로그인 상태
70
+ 테스트 순서:
71
+ 1. 글쓰기 페이지 접속
72
+ 2. 제목 입력: "테스트 게시글"
73
+ 3. 본문 입력: "본문 내용입니다."
74
+ 4. 작성 버튼 클릭
75
+ 기대 결과: 게시글 상세 페이지로 이동, 작성한 제목/본문 표시
76
+ 기준: 01_plan.md Section 3.4 - 게시글 작성
77
+
78
+ TC-011
79
+ 분류: 기능
80
+ 제목: 비로그인 상태에서 게시글 작성 시도
81
+ 전제 조건: 로그아웃 상태
82
+ 테스트 순서:
83
+ 1. 글쓰기 URL 직접 접속
84
+ 기대 결과: 로그인 페이지로 리다이렉트
85
+ 기준: 01_plan.md Section 3.4 - 게시글 작성 (인증 필요)
86
+ ```
87
+
88
+ ---
89
+
90
+ ## STEP 2: 엣지케이스 TC 도출 (Section 6 → TC-1XX)
91
+
92
+ 기획안 Section 6에 명시된 엣지케이스를 TC로 변환한다. 추가로, 기획안에 명시되지 않았더라도 아래 항목은 반드시 포함한다 — 이런 케이스에서 버그가 가장 자주 발생하기 때문이다.
93
+
94
+ ### 반드시 포함해야 할 엣지케이스
95
+
96
+ | 카테고리 | TC 내용 | 왜 필요한가 |
97
+ |---------|---------|-----------|
98
+ | 빈 값 입력 | 모든 입력 폼에 빈 값으로 제출 | 서버 에러 방지, 유효성 검사 확인 |
99
+ | 최대 길이 초과 | 제목 100자+, 본문 10000자+ | DB 에러, 화면 깨짐 방지 |
100
+ | 특수문자/이모지 | `<script>alert(1)</script>`, 이모지 | XSS 방지, 인코딩 확인 |
101
+ | 중복 데이터 | 동일 이메일 회원가입, 동일 제목 게시글 | 유니크 제약조건 확인 |
102
+ | 인증 없이 접근 | 인증 필요한 모든 API/화면에 토큰 없이 접근 | 보안 확인 |
103
+ | 권한 없는 접근 | 다른 사용자의 데이터 수정/삭제 시도 | 인가 확인 |
104
+ | 동시 요청 | 같은 데이터에 동시에 수정 요청 | 데이터 무결성 확인 |
105
+
106
+ **예시:**
107
+
108
+ ```
109
+ TC-100
110
+ 분류: 엣지케이스
111
+ 제목: 게시글 제목 빈 값 제출
112
+ 전제 조건: 로그인 상태, 글쓰기 페이지
113
+ 테스트 순서:
114
+ 1. 제목 비워둠
115
+ 2. 본문 입력: "본문"
116
+ 3. 작성 버튼 클릭
117
+ 기대 결과: "제목을 입력해주세요" 에러 메시지 표시, 게시글 미생성
118
+ 기준: 01_plan.md Section 6 - 입력값 검증
119
+ ```
120
+
121
+ ---
122
+
123
+ ## STEP 3: E2E 시나리오 TC 도출 (Section 2 → TC-2XX)
124
+
125
+ 기획안 Section 2의 유저 스토리를 처음부터 끝까지 이어지는 시나리오로 변환한다. E2E는 개별 기능이 아니라 "사용자가 실제로 하는 일련의 행동"을 검증하는 것이 목적이다.
126
+
127
+ 각 단계에서 확인할 것:
128
+ - 화면 전환이 올바른가
129
+ - 이전 단계의 데이터가 다음 단계에 반영되는가
130
+ - 중간에 실패하면 적절한 복구가 되는가
131
+
132
+ **예시:**
133
+
134
+ ```
135
+ TC-200
136
+ 분류: E2E
137
+ 제목: 신규 사용자 회원가입 → 로그인 → 게시글 작성 → 확인
138
+ 전제 조건: 없음 (완전히 새로운 사용자)
139
+ 테스트 순서:
140
+ 1. 회원가입 페이지 접속
141
+ 2. 이메일/비밀번호/이름 입력 후 가입
142
+ 3. 가입 성공 메시지 확인
143
+ 4. 로그인 페이지에서 방금 가입한 계정으로 로그인
144
+ 5. 대시보드 접근 확인
145
+ 6. 게시글 작성 페이지 이동
146
+ 7. 제목/본문 입력 후 작성
147
+ 8. 게시글 목록에서 방금 작성한 글 확인
148
+ 기대 결과: 모든 단계 정상 완료, 게시글 목록에 새 글 표시
149
+ 기준: 01_plan.md Section 2.1 - 신규 사용자 시나리오
150
+ ```
151
+
152
+ ---
153
+
154
+ ## STEP 4: API 검증 TC 도출 (Section 5 → TC-3XX)
155
+
156
+ 기획안 Section 5의 API 목록과 API 명세(03_api_spec.md)를 기준으로 각 API마다 최소 3개 TC를 작성한다:
157
+
158
+ | TC 유형 | 확인 내용 |
159
+ |---------|----------|
160
+ | 정상 요청 | 올바른 입력 → 기대 응답 형식, 상태 코드 |
161
+ | 인증 없이 요청 | 토큰 없이 → 401 반환 |
162
+ | 잘못된 입력 | 필수 필드 누락/형식 오류 → 400 또는 422 반환 |
163
+
164
+ **예시:**
165
+
166
+ ```
167
+ TC-300
168
+ 분류: API
169
+ 제목: POST /api/posts - 게시글 생성 정상 요청
170
+ 전제 조건: 유효한 JWT 토큰
171
+ 테스트 순서:
172
+ 1. POST /api/posts 요청
173
+ Header: Authorization: Bearer {token}
174
+ Body: { "title": "테스트", "content": "본문" }
175
+ 기대 결과:
176
+ - 상태 코드: 201
177
+ - 응답: { "success": true, "data": { "id": "...", "title": "테스트", ... } }
178
+ 기준: 03_api_spec.md - POST /api/posts
179
+
180
+ TC-301
181
+ 분류: API
182
+ 제목: POST /api/posts - 인증 없이 요청
183
+ 전제 조건: 토큰 없음
184
+ 테스트 순서:
185
+ 1. POST /api/posts 요청 (Authorization 헤더 없음)
186
+ Body: { "title": "테스트", "content": "본문" }
187
+ 기대 결과:
188
+ - 상태 코드: 401
189
+ - 응답: { "success": false, "error": { "code": "UNAUTHORIZED" } }
190
+ 기준: 03_api_spec.md - 인증 정책
191
+ ```
192
+
193
+ ---
194
+
195
+ ## STEP 5: 누락 검증 (Coverage Check)
196
+
197
+ 모든 TC를 작성한 후, 기획안의 기능 목록과 대조하여 빠진 것이 없는지 확인한다. 이 단계를 건너뛰면 "TC를 열심히 작성했지만 핵심 기능이 빠졌다"는 상황이 발생한다.
198
+
199
+ ### 대조 방법
200
+
201
+ 1. 기획안 Section 3의 기능 목록을 뽑는다
202
+ 2. 각 기능에 대응하는 TC가 있는지 체크한다
203
+ 3. 누락된 기능이 있으면 TC를 추가한다
204
+
205
+ ### 출력 형식
206
+
207
+ ```markdown
208
+ ## 커버리지 매트릭스
209
+
210
+ | 기획안 기능 | 기능 TC | 엣지 TC | E2E TC | API TC | 커버 여부 |
211
+ |------------|---------|---------|--------|--------|----------|
212
+ | 회원가입 | TC-001 | TC-100,101 | TC-200 | TC-300,301 | ✅ |
213
+ | 로그인 | TC-002 | TC-102,103 | TC-200 | TC-302,303 | ✅ |
214
+ | 게시글 작성 | TC-010 | TC-110,111 | TC-200 | TC-310,311 | ✅ |
215
+ | 게시글 수정 | - | - | - | - | ❌ 누락 |
216
+ | 비밀번호 찾기 | TC-020 | TC-120 | - | TC-320 | ✅ |
217
+
218
+ ### 누락 항목
219
+ - 게시글 수정: TC 추가 필요 (기능 + 엣지케이스 + API)
220
+ ```
221
+
222
+ 누락 항목이 있으면 TC를 추가한 뒤 다시 매트릭스를 갱신한다. 모든 기능이 ✅가 될 때까지 반복한다.
223
+
224
+ ---
225
+
226
+ ## TC 작성 체크리스트
227
+
228
+ 1. [ ] **기능 테스트** — Section 3의 모든 기능에 정상/실패 TC가 있는가
229
+ 2. [ ] **엣지케이스** — Section 6의 모든 항목이 TC로 변환됐는가
230
+ 3. [ ] **필수 엣지케이스** — 빈 값, 인증 없음, 권한 없음, 중복 데이터 TC가 있는가
231
+ 4. [ ] **E2E 시나리오** — Section 2의 모든 유저 스토리가 시나리오로 변환됐는가
232
+ 5. [ ] **API 검증** — Section 5의 모든 API에 정상/인증/입력오류 TC가 있는가
233
+ 6. [ ] **커버리지 매트릭스** — 모든 기능이 ✅인가
234
+ 7. [ ] **기준 명시** — 모든 TC에 기획안 기준 섹션이 명시됐는가
@@ -0,0 +1 @@
1
+ PIPELINES_DIR=../pipelines
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": ["next/core-web-vitals", "next/typescript"]
3
+ }
@@ -0,0 +1,36 @@
1
+ This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
2
+
3
+ ## Getting Started
4
+
5
+ First, run the development server:
6
+
7
+ ```bash
8
+ npm run dev
9
+ # or
10
+ yarn dev
11
+ # or
12
+ pnpm dev
13
+ # or
14
+ bun dev
15
+ ```
16
+
17
+ Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18
+
19
+ You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20
+
21
+ This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22
+
23
+ ## Learn More
24
+
25
+ To learn more about Next.js, take a look at the following resources:
26
+
27
+ - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28
+ - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29
+
30
+ You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31
+
32
+ ## Deploy on Vercel
33
+
34
+ The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35
+
36
+ Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
@@ -0,0 +1,6 @@
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ transpilePackages: ["react-markdown", "react-syntax-highlighter"],
4
+ };
5
+
6
+ export default nextConfig;