timsquad 2.0.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 (181) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +347 -0
  3. package/bin/tsq.js +6 -0
  4. package/dist/commands/feedback.d.ts +3 -0
  5. package/dist/commands/feedback.d.ts.map +1 -0
  6. package/dist/commands/feedback.js +142 -0
  7. package/dist/commands/feedback.js.map +1 -0
  8. package/dist/commands/full.d.ts +3 -0
  9. package/dist/commands/full.d.ts.map +1 -0
  10. package/dist/commands/full.js +87 -0
  11. package/dist/commands/full.js.map +1 -0
  12. package/dist/commands/git/commit.d.ts +3 -0
  13. package/dist/commands/git/commit.d.ts.map +1 -0
  14. package/dist/commands/git/commit.js +88 -0
  15. package/dist/commands/git/commit.js.map +1 -0
  16. package/dist/commands/git/index.d.ts +5 -0
  17. package/dist/commands/git/index.d.ts.map +1 -0
  18. package/dist/commands/git/index.js +5 -0
  19. package/dist/commands/git/index.js.map +1 -0
  20. package/dist/commands/git/pr.d.ts +3 -0
  21. package/dist/commands/git/pr.d.ts.map +1 -0
  22. package/dist/commands/git/pr.js +138 -0
  23. package/dist/commands/git/pr.js.map +1 -0
  24. package/dist/commands/git/release.d.ts +3 -0
  25. package/dist/commands/git/release.d.ts.map +1 -0
  26. package/dist/commands/git/release.js +158 -0
  27. package/dist/commands/git/release.js.map +1 -0
  28. package/dist/commands/git/sync.d.ts +3 -0
  29. package/dist/commands/git/sync.d.ts.map +1 -0
  30. package/dist/commands/git/sync.js +132 -0
  31. package/dist/commands/git/sync.js.map +1 -0
  32. package/dist/commands/init.d.ts +3 -0
  33. package/dist/commands/init.d.ts.map +1 -0
  34. package/dist/commands/init.js +150 -0
  35. package/dist/commands/init.js.map +1 -0
  36. package/dist/commands/log.d.ts +3 -0
  37. package/dist/commands/log.d.ts.map +1 -0
  38. package/dist/commands/log.js +271 -0
  39. package/dist/commands/log.js.map +1 -0
  40. package/dist/commands/metrics.d.ts +3 -0
  41. package/dist/commands/metrics.d.ts.map +1 -0
  42. package/dist/commands/metrics.js +299 -0
  43. package/dist/commands/metrics.js.map +1 -0
  44. package/dist/commands/quick.d.ts +3 -0
  45. package/dist/commands/quick.d.ts.map +1 -0
  46. package/dist/commands/quick.js +136 -0
  47. package/dist/commands/quick.js.map +1 -0
  48. package/dist/commands/retro.d.ts +3 -0
  49. package/dist/commands/retro.d.ts.map +1 -0
  50. package/dist/commands/retro.js +280 -0
  51. package/dist/commands/retro.js.map +1 -0
  52. package/dist/commands/status.d.ts +3 -0
  53. package/dist/commands/status.d.ts.map +1 -0
  54. package/dist/commands/status.js +127 -0
  55. package/dist/commands/status.js.map +1 -0
  56. package/dist/commands/watch.d.ts +3 -0
  57. package/dist/commands/watch.d.ts.map +1 -0
  58. package/dist/commands/watch.js +213 -0
  59. package/dist/commands/watch.js.map +1 -0
  60. package/dist/index.d.ts +3 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +50 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/lib/config.d.ts +34 -0
  65. package/dist/lib/config.d.ts.map +1 -0
  66. package/dist/lib/config.js +108 -0
  67. package/dist/lib/config.js.map +1 -0
  68. package/dist/lib/project.d.ts +47 -0
  69. package/dist/lib/project.d.ts.map +1 -0
  70. package/dist/lib/project.js +191 -0
  71. package/dist/lib/project.js.map +1 -0
  72. package/dist/lib/template.d.ts +33 -0
  73. package/dist/lib/template.d.ts.map +1 -0
  74. package/dist/lib/template.js +151 -0
  75. package/dist/lib/template.js.map +1 -0
  76. package/dist/types/config.d.ts +75 -0
  77. package/dist/types/config.d.ts.map +1 -0
  78. package/dist/types/config.js +66 -0
  79. package/dist/types/config.js.map +1 -0
  80. package/dist/types/feedback.d.ts +59 -0
  81. package/dist/types/feedback.d.ts.map +1 -0
  82. package/dist/types/feedback.js +26 -0
  83. package/dist/types/feedback.js.map +1 -0
  84. package/dist/types/index.d.ts +4 -0
  85. package/dist/types/index.d.ts.map +1 -0
  86. package/dist/types/index.js +5 -0
  87. package/dist/types/index.js.map +1 -0
  88. package/dist/types/project.d.ts +89 -0
  89. package/dist/types/project.d.ts.map +1 -0
  90. package/dist/types/project.js +44 -0
  91. package/dist/types/project.js.map +1 -0
  92. package/dist/utils/colors.d.ts +30 -0
  93. package/dist/utils/colors.d.ts.map +1 -0
  94. package/dist/utils/colors.js +54 -0
  95. package/dist/utils/colors.js.map +1 -0
  96. package/dist/utils/date.d.ts +25 -0
  97. package/dist/utils/date.d.ts.map +1 -0
  98. package/dist/utils/date.js +65 -0
  99. package/dist/utils/date.js.map +1 -0
  100. package/dist/utils/fs.d.ts +49 -0
  101. package/dist/utils/fs.d.ts.map +1 -0
  102. package/dist/utils/fs.js +84 -0
  103. package/dist/utils/fs.js.map +1 -0
  104. package/dist/utils/prompts.d.ts +31 -0
  105. package/dist/utils/prompts.d.ts.map +1 -0
  106. package/dist/utils/prompts.js +95 -0
  107. package/dist/utils/prompts.js.map +1 -0
  108. package/dist/utils/yaml.d.ts +21 -0
  109. package/dist/utils/yaml.d.ts.map +1 -0
  110. package/dist/utils/yaml.js +40 -0
  111. package/dist/utils/yaml.js.map +1 -0
  112. package/package.json +71 -0
  113. package/templates/common/CLAUDE.md.template +254 -0
  114. package/templates/common/claude/agents/tsq-dba.md +290 -0
  115. package/templates/common/claude/agents/tsq-designer.md +304 -0
  116. package/templates/common/claude/agents/tsq-developer.md +118 -0
  117. package/templates/common/claude/agents/tsq-planner.md +90 -0
  118. package/templates/common/claude/agents/tsq-prompter.md +336 -0
  119. package/templates/common/claude/agents/tsq-qa.md +134 -0
  120. package/templates/common/claude/agents/tsq-retro.md +168 -0
  121. package/templates/common/claude/agents/tsq-security.md +190 -0
  122. package/templates/common/claude/skills/architecture/SKILL.md +123 -0
  123. package/templates/common/claude/skills/backend/node/SKILL.md +1015 -0
  124. package/templates/common/claude/skills/coding/SKILL.md +171 -0
  125. package/templates/common/claude/skills/database/prisma/SKILL.md +357 -0
  126. package/templates/common/claude/skills/frontend/nextjs/SKILL.md +279 -0
  127. package/templates/common/claude/skills/frontend/react/SKILL.md +1729 -0
  128. package/templates/common/claude/skills/methodology/bdd/SKILL.md +234 -0
  129. package/templates/common/claude/skills/methodology/ddd/SKILL.md +311 -0
  130. package/templates/common/claude/skills/methodology/tdd/SKILL.md +512 -0
  131. package/templates/common/claude/skills/planning/SKILL.md +90 -0
  132. package/templates/common/claude/skills/security/SKILL.md +234 -0
  133. package/templates/common/claude/skills/testing/SKILL.md +146 -0
  134. package/templates/common/claude/skills/typescript/SKILL.md +435 -0
  135. package/templates/common/config.template.yaml +131 -0
  136. package/templates/common/timsquad/architectures/clean/ARCHITECTURE.md +49 -0
  137. package/templates/common/timsquad/architectures/clean/backend.xml +210 -0
  138. package/templates/common/timsquad/architectures/clean/frontend.xml +148 -0
  139. package/templates/common/timsquad/architectures/fsd/ARCHITECTURE.md +67 -0
  140. package/templates/common/timsquad/architectures/fsd/frontend.xml +288 -0
  141. package/templates/common/timsquad/architectures/hexagonal/ARCHITECTURE.md +60 -0
  142. package/templates/common/timsquad/architectures/hexagonal/backend.xml +300 -0
  143. package/templates/common/timsquad/constraints/competency-framework.xml +501 -0
  144. package/templates/common/timsquad/constraints/ssot-schema.xml +433 -0
  145. package/templates/common/timsquad/feedback/feedback-router.sh +341 -0
  146. package/templates/common/timsquad/feedback/routing-rules.yaml +352 -0
  147. package/templates/common/timsquad/generators/data-design.xml +290 -0
  148. package/templates/common/timsquad/generators/prd.xml +280 -0
  149. package/templates/common/timsquad/generators/requirements.xml +220 -0
  150. package/templates/common/timsquad/generators/service-spec.xml +266 -0
  151. package/templates/common/timsquad/logs/_example.md +81 -0
  152. package/templates/common/timsquad/logs/_template.md +46 -0
  153. package/templates/common/timsquad/patterns/cqrs.xml +127 -0
  154. package/templates/common/timsquad/patterns/event-sourcing.xml +85 -0
  155. package/templates/common/timsquad/patterns/repository.xml +64 -0
  156. package/templates/common/timsquad/process/state-machine.xml +343 -0
  157. package/templates/common/timsquad/process/validation-rules.xml +308 -0
  158. package/templates/common/timsquad/process/workflow-base.xml +202 -0
  159. package/templates/common/timsquad/retrospective/cycle-report.template.md +205 -0
  160. package/templates/common/timsquad/retrospective/metrics/metrics-schema.json +203 -0
  161. package/templates/common/timsquad/retrospective/patterns/failure-patterns.md +199 -0
  162. package/templates/common/timsquad/retrospective/patterns/success-patterns.md +262 -0
  163. package/templates/common/timsquad/retrospective/retrospective-config.xml +294 -0
  164. package/templates/common/timsquad/retrospective/retrospective-state.xml +210 -0
  165. package/templates/common/timsquad/ssot/adr/ADR-000-template.md +121 -0
  166. package/templates/common/timsquad/ssot/adr/ADR-001-example.md +115 -0
  167. package/templates/common/timsquad/ssot/data-design.template.md +132 -0
  168. package/templates/common/timsquad/ssot/deployment-spec.template.md +384 -0
  169. package/templates/common/timsquad/ssot/env-config.template.md +346 -0
  170. package/templates/common/timsquad/ssot/error-codes.template.md +114 -0
  171. package/templates/common/timsquad/ssot/functional-spec.template.md +185 -0
  172. package/templates/common/timsquad/ssot/glossary.template.md +148 -0
  173. package/templates/common/timsquad/ssot/integration-spec.template.md +391 -0
  174. package/templates/common/timsquad/ssot/planning.template.md +94 -0
  175. package/templates/common/timsquad/ssot/prd.template.md +102 -0
  176. package/templates/common/timsquad/ssot/requirements.template.md +117 -0
  177. package/templates/common/timsquad/ssot/security-spec.template.md +309 -0
  178. package/templates/common/timsquad/ssot/service-spec.template.md +194 -0
  179. package/templates/common/timsquad/ssot/test-spec.template.md +264 -0
  180. package/templates/common/timsquad/ssot/ui-ux-spec.template.md +262 -0
  181. package/templates/common/timsquad/state/workspace.xml +217 -0
@@ -0,0 +1,264 @@
1
+ ---
2
+ title: "테스트 명세서 (Test Specification)"
3
+ version: 1.0.0
4
+ last_updated: {{DATE}}
5
+ author: tsq-qa
6
+ status: draft
7
+ project: {{PROJECT_NAME}}
8
+ ---
9
+
10
+ # 테스트 명세서 (Test Specification)
11
+
12
+ > 테스트 전략, 테스트 케이스, 품질 기준을 정의합니다.
13
+ > QA 에이전트와 Developer가 참조하는 테스트 가이드라인입니다.
14
+
15
+ ---
16
+
17
+ ## 1. 테스트 전략
18
+
19
+ ### 1.1 테스트 피라미드
20
+
21
+ ```
22
+ /\
23
+ /E2E\ 10% - 핵심 사용자 흐름
24
+ /──────\
25
+ /Integration\ 20% - API, 서비스 간 연동
26
+ /──────────────\
27
+ / Unit Tests \ 70% - 함수, 클래스 단위
28
+ ────────────────────
29
+ ```
30
+
31
+ ### 1.2 테스트 유형별 목표
32
+
33
+ | 테스트 유형 | 범위 | 목표 커버리지 | 실행 시점 |
34
+ |-----------|------|:-----------:|----------|
35
+ | Unit | 함수, 클래스 | 80% | 커밋 전 |
36
+ | Integration | API, DB 연동 | 70% | PR 시 |
37
+ | E2E | 사용자 시나리오 | 핵심 흐름 100% | 배포 전 |
38
+ | Performance | 부하, 응답시간 | NFR 충족 | 릴리스 전 |
39
+ | Security | 취약점 | OWASP Top 10 | 릴리스 전 |
40
+
41
+ ### 1.3 테스트 환경
42
+
43
+ | 환경 | 용도 | DB | 외부 연동 |
44
+ |-----|------|-----|----------|
45
+ | Local | 개발 중 테스트 | SQLite/Docker | Mock |
46
+ | CI | 자동화 테스트 | Test DB | Mock |
47
+ | Staging | 통합 테스트 | Staging DB | Sandbox |
48
+ | Production | 스모크 테스트 | Prod DB (읽기) | Real |
49
+
50
+ ---
51
+
52
+ ## 2. 테스트 컨벤션
53
+
54
+ ### 2.1 파일 명명 규칙
55
+
56
+ | 테스트 유형 | 파일 패턴 | 예시 |
57
+ |-----------|----------|------|
58
+ | Unit | `*.test.ts`, `*.spec.ts` | `user.service.test.ts` |
59
+ | Integration | `*.integration.test.ts` | `auth.integration.test.ts` |
60
+ | E2E | `*.e2e.test.ts` | `login.e2e.test.ts` |
61
+
62
+ ### 2.2 테스트 구조 (AAA / Given-When-Then)
63
+
64
+ ```typescript
65
+ describe('UserService', () => {
66
+ describe('createUser', () => {
67
+ it('should create a user with valid data', () => {
68
+ // Arrange (Given)
69
+ const userData = { email: 'test@example.com', name: 'Test' };
70
+
71
+ // Act (When)
72
+ const result = userService.createUser(userData);
73
+
74
+ // Assert (Then)
75
+ expect(result).toHaveProperty('id');
76
+ expect(result.email).toBe(userData.email);
77
+ });
78
+
79
+ it('should throw error when email is invalid', () => {
80
+ // Arrange
81
+ const invalidData = { email: 'invalid', name: 'Test' };
82
+
83
+ // Act & Assert
84
+ expect(() => userService.createUser(invalidData))
85
+ .toThrow('Invalid email format');
86
+ });
87
+ });
88
+ });
89
+ ```
90
+
91
+ ### 2.3 테스트 네이밍
92
+
93
+ ```
94
+ [테스트 대상] should [기대 동작] when [조건]
95
+ ```
96
+
97
+ | 예시 |
98
+ |------|
99
+ | `createUser should return user with id when valid data provided` |
100
+ | `login should throw AuthError when password is wrong` |
101
+ | `getOrders should return empty array when user has no orders` |
102
+
103
+ ---
104
+
105
+ ## 3. 테스트 케이스
106
+
107
+ ### 3.1 기능별 테스트 케이스
108
+
109
+ #### TC-001: [기능명] 테스트
110
+
111
+ | 항목 | 내용 |
112
+ |-----|------|
113
+ | **관련 기능** | [FS-001](./functional-spec.md#FS-001) |
114
+ | **관련 API** | [POST /api/auth/login](./service-spec.md) |
115
+ | **우선순위** | High |
116
+
117
+ ##### 테스트 시나리오
118
+
119
+ | TC ID | 시나리오 | 입력 | 기대 결과 | 우선순위 |
120
+ |-------|---------|------|----------|:--------:|
121
+ | TC-001-01 | 정상 로그인 | 유효한 이메일/비밀번호 | 200 + 토큰 반환 | High |
122
+ | TC-001-02 | 잘못된 비밀번호 | 유효한 이메일 + 틀린 비밀번호 | 401 + AUTH_001 | High |
123
+ | TC-001-03 | 존재하지 않는 사용자 | 미등록 이메일 | 401 + AUTH_002 | High |
124
+ | TC-001-04 | 이메일 형식 오류 | 잘못된 이메일 형식 | 400 + VALIDATION_001 | Medium |
125
+ | TC-001-05 | 빈 비밀번호 | 이메일만 입력 | 400 + VALIDATION_002 | Medium |
126
+ | TC-001-06 | 계정 잠금 | 5회 실패한 계정 | 403 + AUTH_003 | High |
127
+
128
+ ##### 테스트 데이터
129
+
130
+ ```json
131
+ {
132
+ "validUser": {
133
+ "email": "test@example.com",
134
+ "password": "Test1234!"
135
+ },
136
+ "invalidUser": {
137
+ "email": "wrong@example.com",
138
+ "password": "wrong"
139
+ },
140
+ "lockedUser": {
141
+ "email": "locked@example.com",
142
+ "password": "any"
143
+ }
144
+ }
145
+ ```
146
+
147
+ ---
148
+
149
+ ### 3.2 API 테스트 매트릭스
150
+
151
+ | API | Happy Path | Invalid Input | Auth Error | Not Found | Server Error |
152
+ |-----|:----------:|:-------------:|:----------:|:---------:|:------------:|
153
+ | POST /auth/login | ✅ | ✅ | ✅ | N/A | ✅ |
154
+ | GET /users/:id | ✅ | ✅ | ✅ | ✅ | ✅ |
155
+ | POST /orders | ✅ | ✅ | ✅ | N/A | ✅ |
156
+
157
+ ---
158
+
159
+ ## 4. 비기능 테스트
160
+
161
+ ### 4.1 성능 테스트
162
+
163
+ | 테스트 | 조건 | 기준 | 도구 |
164
+ |-------|------|------|------|
165
+ | 응답 시간 | 일반 요청 | < 200ms (p95) | k6, Artillery |
166
+ | 처리량 | 동시 사용자 1000명 | > 500 RPS | k6 |
167
+ | 부하 | 피크 타임 시뮬레이션 | 에러율 < 1% | k6 |
168
+
169
+ ### 4.2 보안 테스트
170
+
171
+ → [security-spec.md](./security-spec.md) 참조
172
+
173
+ | 테스트 | 대상 | 도구 |
174
+ |-------|------|------|
175
+ | OWASP ZAP 스캔 | API 전체 | ZAP |
176
+ | 의존성 취약점 | npm packages | npm audit, Snyk |
177
+ | 코드 정적 분석 | 소스 코드 | ESLint security plugin |
178
+
179
+ ---
180
+
181
+ ## 5. 테스트 자동화
182
+
183
+ ### 5.1 CI 파이프라인
184
+
185
+ ```yaml
186
+ test:
187
+ stages:
188
+ - lint # 코드 스타일 검사
189
+ - unit # 단위 테스트
190
+ - integration # 통합 테스트
191
+ - e2e # E2E 테스트 (선택적)
192
+ - coverage # 커버리지 리포트
193
+ ```
194
+
195
+ ### 5.2 커버리지 기준
196
+
197
+ | 메트릭 | 최소 기준 | 목표 |
198
+ |-------|:--------:|:----:|
199
+ | Line Coverage | 80% | 90% |
200
+ | Branch Coverage | 70% | 80% |
201
+ | Function Coverage | 80% | 90% |
202
+
203
+ ### 5.3 실패 시 조치
204
+
205
+ | 상황 | 조치 |
206
+ |-----|------|
207
+ | 커버리지 미달 | PR 머지 차단 |
208
+ | 테스트 실패 | PR 머지 차단 |
209
+ | 보안 취약점 (High) | 배포 차단 |
210
+
211
+ ---
212
+
213
+ ## 6. 테스트 리포트
214
+
215
+ ### 6.1 리포트 항목
216
+
217
+ | 항목 | 설명 |
218
+ |-----|------|
219
+ | 총 테스트 수 | 실행된 테스트 케이스 수 |
220
+ | 성공/실패 | 통과/실패 테스트 수 |
221
+ | 커버리지 | 라인/브랜치/함수 커버리지 |
222
+ | 실행 시간 | 전체 테스트 실행 시간 |
223
+ | 실패 상세 | 실패한 테스트 목록 및 원인 |
224
+
225
+ ### 6.2 리포트 템플릿
226
+
227
+ ```markdown
228
+ ## 테스트 리포트 - {{날짜}}
229
+
230
+ ### 요약
231
+ - 총 테스트: XX개
232
+ - 성공: XX개 (XX%)
233
+ - 실패: XX개
234
+ - 스킵: XX개
235
+
236
+ ### 커버리지
237
+ - Lines: XX%
238
+ - Branches: XX%
239
+ - Functions: XX%
240
+
241
+ ### 실패 테스트
242
+ 1. `test_name` - 실패 원인
243
+
244
+ ### 성능 테스트
245
+ - P95 응답시간: XXms
246
+ - 처리량: XX RPS
247
+ ```
248
+
249
+ ---
250
+
251
+ ## 7. 관련 문서
252
+
253
+ - [기능 명세](./functional-spec.md) - 테스트 대상 기능
254
+ - [서비스 명세](./service-spec.md) - API 테스트 기준
255
+ - [에러 코드](./error-codes.md) - 예상 에러 응답
256
+ - [보안 명세](./security-spec.md) - 보안 테스트 기준
257
+
258
+ ---
259
+
260
+ ## 변경 이력
261
+
262
+ | 버전 | 날짜 | 작성자 | 변경 내용 |
263
+ |------|------|--------|----------|
264
+ | 1.0.0 | {{DATE}} | tsq-qa | 초기 작성 |
@@ -0,0 +1,262 @@
1
+ ---
2
+ title: "UI/UX 명세서"
3
+ version: 1.0.0
4
+ last_updated: {{DATE}}
5
+ author: tsq-planner
6
+ status: draft
7
+ project: {{PROJECT_NAME}}
8
+ ---
9
+
10
+ # UI/UX 명세서
11
+
12
+ > 사용자 인터페이스와 사용자 경험을 정의합니다.
13
+ > 와이어프레임, 화면 흐름, 인터랙션 패턴을 문서화합니다.
14
+
15
+ ---
16
+
17
+ ## 1. 디자인 원칙
18
+
19
+ ### 1.1 UX 원칙
20
+
21
+ | 원칙 | 설명 | 적용 예시 |
22
+ |-----|------|----------|
23
+ | 일관성 | 동일한 요소는 동일하게 동작 | 버튼 스타일, 폼 레이아웃 |
24
+ | 피드백 | 사용자 행동에 즉각 반응 | 로딩 표시, 성공/실패 메시지 |
25
+ | 단순성 | 핵심 기능에 집중 | 불필요한 요소 제거 |
26
+ | 접근성 | 모든 사용자가 사용 가능 | 키보드 네비게이션, 스크린리더 |
27
+
28
+ ### 1.2 디자인 시스템
29
+
30
+ | 요소 | 정의 | 토큰/값 |
31
+ |-----|------|--------|
32
+ | Primary Color | 주요 액션 색상 | #3B82F6 |
33
+ | Secondary Color | 보조 색상 | #6B7280 |
34
+ | Error Color | 에러 표시 | #EF4444 |
35
+ | Success Color | 성공 표시 | #10B981 |
36
+ | Font Family | 기본 폰트 | Inter, system-ui |
37
+ | Border Radius | 모서리 둥글기 | 8px |
38
+
39
+ ---
40
+
41
+ ## 2. 화면 구조
42
+
43
+ ### 2.1 사이트맵
44
+
45
+ ```
46
+ [홈]
47
+ ├── [인증]
48
+ │ ├── 로그인
49
+ │ ├── 회원가입
50
+ │ └── 비밀번호 찾기
51
+ ├── [대시보드]
52
+ │ ├── 개요
53
+ │ └── 통계
54
+ ├── [기능1]
55
+ │ ├── 목록
56
+ │ ├── 상세
57
+ │ └── 등록/수정
58
+ └── [설정]
59
+ ├── 프로필
60
+ └── 알림
61
+ ```
62
+
63
+ ### 2.2 화면 목록
64
+
65
+ | 화면 ID | 화면명 | URL | 인증 필요 | 관련 기능 |
66
+ |--------|-------|-----|:--------:|----------|
67
+ | SCR-001 | 로그인 | /login | N | FS-001 |
68
+ | SCR-002 | 대시보드 | /dashboard | Y | FS-002 |
69
+ | SCR-003 | | | | |
70
+
71
+ ---
72
+
73
+ ## 3. 화면 상세
74
+
75
+ ### SCR-001: 로그인
76
+
77
+ #### 3.1.1 기본 정보
78
+
79
+ | 항목 | 내용 |
80
+ |-----|------|
81
+ | **화면명** | 로그인 |
82
+ | **URL** | /login |
83
+ | **접근 권한** | 비회원 |
84
+ | **관련 기능** | [FS-001](./functional-spec.md#FS-001) |
85
+ | **관련 API** | [POST /api/auth/login](./service-spec.md) |
86
+
87
+ #### 3.1.2 와이어프레임
88
+
89
+ ```
90
+ ┌─────────────────────────────────────────┐
91
+ │ [로고] │
92
+ │ │
93
+ │ ┌─────────────────────────────────┐ │
94
+ │ │ 이메일 │ │
95
+ │ └─────────────────────────────────┘ │
96
+ │ │
97
+ │ ┌─────────────────────────────────┐ │
98
+ │ │ 비밀번호 [👁] │ │
99
+ │ └─────────────────────────────────┘ │
100
+ │ │
101
+ │ ☐ 로그인 상태 유지 │
102
+ │ │
103
+ │ ┌─────────────────────────────────┐ │
104
+ │ │ 로그인 │ │
105
+ │ └─────────────────────────────────┘ │
106
+ │ │
107
+ │ 비밀번호 찾기 | 회원가입 │
108
+ │ │
109
+ │ ─────────── 또는 ─────────── │
110
+ │ │
111
+ │ [Google 로그인] [Apple 로그인] │
112
+ │ │
113
+ └─────────────────────────────────────────┘
114
+ ```
115
+
116
+ #### 3.1.3 UI 요소
117
+
118
+ | 요소 | 타입 | 필수 | 유효성 검사 | 에러 메시지 |
119
+ |-----|------|:----:|-----------|-----------|
120
+ | 이메일 | Input (email) | Y | 이메일 형식 | "올바른 이메일을 입력하세요" |
121
+ | 비밀번호 | Input (password) | Y | 최소 8자 | "비밀번호를 입력하세요" |
122
+ | 로그인 유지 | Checkbox | N | - | - |
123
+ | 로그인 버튼 | Button (primary) | - | - | - |
124
+
125
+ #### 3.1.4 인터랙션
126
+
127
+ | 트리거 | 액션 | 결과 |
128
+ |-------|------|------|
129
+ | 로그인 버튼 클릭 | API 호출 | 성공: 대시보드 이동 / 실패: 에러 표시 |
130
+ | 비밀번호 보기 클릭 | 토글 | 비밀번호 표시/숨김 |
131
+ | 회원가입 링크 클릭 | 네비게이션 | 회원가입 화면 이동 |
132
+
133
+ #### 3.1.5 상태별 화면
134
+
135
+ | 상태 | 설명 | UI 변화 |
136
+ |-----|------|--------|
137
+ | 기본 | 초기 상태 | 빈 폼 |
138
+ | 로딩 | API 호출 중 | 버튼 비활성화 + 스피너 |
139
+ | 에러 | 인증 실패 | 에러 메시지 표시 (빨간색) |
140
+ | 성공 | 인증 성공 | 대시보드로 리다이렉트 |
141
+
142
+ #### 3.1.6 반응형
143
+
144
+ | 브레이크포인트 | 레이아웃 변경 |
145
+ |--------------|-------------|
146
+ | Desktop (≥1024px) | 중앙 정렬, 최대 너비 400px |
147
+ | Tablet (768-1023px) | 중앙 정렬, 패딩 조정 |
148
+ | Mobile (<768px) | 전체 너비, 패딩 16px |
149
+
150
+ ---
151
+
152
+ ### SCR-002: [화면명]
153
+
154
+ (위와 동일한 형식으로 작성)
155
+
156
+ ---
157
+
158
+ ## 4. 공통 컴포넌트
159
+
160
+ ### 4.1 네비게이션
161
+
162
+ ```
163
+ ┌─────────────────────────────────────────────────┐
164
+ │ [로고] [메뉴1] [메뉴2] [메뉴3] [프로필▼] │
165
+ └─────────────────────────────────────────────────┘
166
+ ```
167
+
168
+ ### 4.2 푸터
169
+
170
+ ```
171
+ ┌─────────────────────────────────────────────────┐
172
+ │ 이용약관 | 개인정보처리방침 | 고객센터 │
173
+ │ © 2026 {{PROJECT_NAME}}. All rights reserved. │
174
+ └─────────────────────────────────────────────────┘
175
+ ```
176
+
177
+ ### 4.3 모달
178
+
179
+ | 타입 | 용도 | 크기 |
180
+ |-----|------|------|
181
+ | Alert | 단순 알림 | Small (300px) |
182
+ | Confirm | 확인 요청 | Small (300px) |
183
+ | Form | 폼 입력 | Medium (500px) |
184
+ | Full | 복잡한 작업 | Large (800px) |
185
+
186
+ ### 4.4 토스트/알림
187
+
188
+ | 타입 | 색상 | 지속 시간 | 예시 |
189
+ |-----|------|---------|------|
190
+ | Success | Green | 3초 | "저장되었습니다" |
191
+ | Error | Red | 5초 | "오류가 발생했습니다" |
192
+ | Warning | Yellow | 4초 | "저장하지 않은 변경사항이 있습니다" |
193
+ | Info | Blue | 3초 | "새로운 알림이 있습니다" |
194
+
195
+ ---
196
+
197
+ ## 5. 화면 흐름
198
+
199
+ ### 5.1 인증 흐름
200
+
201
+ ```mermaid
202
+ graph TD
203
+ A[앱 시작] --> B{로그인 상태?}
204
+ B -->|Yes| C[대시보드]
205
+ B -->|No| D[로그인 화면]
206
+ D --> E{로그인 시도}
207
+ E -->|성공| C
208
+ E -->|실패| F[에러 표시]
209
+ F --> D
210
+ D --> G[회원가입]
211
+ G --> H{가입 완료?}
212
+ H -->|Yes| D
213
+ H -->|No| G
214
+ ```
215
+
216
+ ### 5.2 주요 기능 흐름
217
+
218
+ ```mermaid
219
+ graph LR
220
+ A[목록] --> B[상세]
221
+ B --> C[수정]
222
+ C --> B
223
+ A --> D[등록]
224
+ D --> A
225
+ ```
226
+
227
+ ---
228
+
229
+ ## 6. 접근성 (Accessibility)
230
+
231
+ ### 6.1 WCAG 준수 항목
232
+
233
+ | 기준 | 레벨 | 적용 |
234
+ |-----|:----:|------|
235
+ | 키보드 접근성 | A | 모든 기능 키보드로 사용 가능 |
236
+ | 색상 대비 | AA | 텍스트 4.5:1 이상 |
237
+ | 대체 텍스트 | A | 모든 이미지에 alt 속성 |
238
+ | 포커스 표시 | AA | 포커스 상태 명확히 표시 |
239
+
240
+ ### 6.2 스크린리더 지원
241
+
242
+ | 요소 | aria 속성 | 예시 |
243
+ |-----|----------|------|
244
+ | 버튼 | aria-label | `aria-label="로그인"` |
245
+ | 폼 | aria-describedby | 에러 메시지 연결 |
246
+ | 모달 | role="dialog" | 포커스 트랩 |
247
+
248
+ ---
249
+
250
+ ## 7. 관련 문서
251
+
252
+ - [기능 명세](./functional-spec.md) - 기능 상세
253
+ - [서비스 명세](./service-spec.md) - API 정의
254
+ - [에러 코드](./error-codes.md) - 에러 메시지
255
+
256
+ ---
257
+
258
+ ## 변경 이력
259
+
260
+ | 버전 | 날짜 | 작성자 | 변경 내용 |
261
+ |------|------|--------|----------|
262
+ | 1.0.0 | {{DATE}} | tsq-planner | 초기 작성 |