moai-adk 0.8.1__py3-none-any.whl → 0.8.2__py3-none-any.whl

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.

Potentially problematic release.


This version of moai-adk might be problematic. Click here for more details.

Files changed (87) hide show
  1. moai_adk/cli/commands/update.py +15 -4
  2. moai_adk/core/tags/__init__.py +87 -0
  3. moai_adk/core/tags/ci_validator.py +435 -0
  4. moai_adk/core/tags/cli.py +283 -0
  5. moai_adk/core/tags/generator.py +109 -0
  6. moai_adk/core/tags/inserter.py +99 -0
  7. moai_adk/core/tags/mapper.py +126 -0
  8. moai_adk/core/tags/parser.py +76 -0
  9. moai_adk/core/tags/pre_commit_validator.py +355 -0
  10. moai_adk/core/tags/reporter.py +959 -0
  11. moai_adk/core/tags/tags.py +149 -0
  12. moai_adk/core/tags/validator.py +897 -0
  13. moai_adk/templates/.claude/agents/alfred/cc-manager.md +25 -2
  14. moai_adk/templates/.claude/agents/alfred/debug-helper.md +24 -12
  15. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +19 -12
  16. moai_adk/templates/.claude/agents/alfred/git-manager.md +20 -12
  17. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +19 -12
  18. moai_adk/templates/.claude/agents/alfred/project-manager.md +29 -2
  19. moai_adk/templates/.claude/agents/alfred/quality-gate.md +25 -2
  20. moai_adk/templates/.claude/agents/alfred/skill-factory.md +30 -2
  21. moai_adk/templates/.claude/agents/alfred/spec-builder.md +26 -11
  22. moai_adk/templates/.claude/agents/alfred/tag-agent.md +30 -8
  23. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +27 -12
  24. moai_adk/templates/.claude/agents/alfred/trust-checker.md +25 -2
  25. moai_adk/templates/.claude/commands/alfred/0-project.md +5 -0
  26. moai_adk/templates/.claude/commands/alfred/1-plan.md +17 -4
  27. moai_adk/templates/.claude/commands/alfred/2-run.md +7 -0
  28. moai_adk/templates/.claude/commands/alfred/3-sync.md +6 -0
  29. moai_adk/templates/.claude/hooks/alfred/.moai/cache/version-check.json +9 -0
  30. moai_adk/templates/.claude/hooks/alfred/README.md +258 -145
  31. moai_adk/templates/.claude/hooks/alfred/TROUBLESHOOTING.md +471 -0
  32. moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +92 -57
  33. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
  34. moai_adk/templates/.claude/hooks/alfred/notification__handle_events.py +102 -0
  35. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +102 -0
  36. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +108 -0
  37. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +102 -0
  38. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +102 -0
  39. moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/project.py +269 -13
  40. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
  41. moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/session.py +21 -7
  42. moai_adk/templates/.claude/hooks/alfred/stop__handle_interrupt.py +102 -0
  43. moai_adk/templates/.claude/hooks/alfred/subagent_stop__handle_subagent_end.py +102 -0
  44. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +120 -0
  45. moai_adk/templates/.claude/settings.json +5 -5
  46. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +9 -6
  47. moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +56 -56
  48. moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +101 -100
  49. moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +3 -3
  50. moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +219 -219
  51. moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +287 -287
  52. moai_adk/templates/.github/ISSUE_TEMPLATE/spec.yml +9 -11
  53. moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +9 -21
  54. moai_adk/templates/.github/workflows/moai-release-create.yml +100 -0
  55. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +182 -0
  56. moai_adk/templates/.github/workflows/release.yml +49 -0
  57. moai_adk/templates/.github/workflows/tag-report.yml +261 -0
  58. moai_adk/templates/.github/workflows/tag-validation.yml +176 -0
  59. moai_adk/templates/.moai/config.json +6 -1
  60. moai_adk/templates/.moai/hooks/install.sh +79 -0
  61. moai_adk/templates/.moai/hooks/pre-commit.sh +66 -0
  62. moai_adk/templates/CLAUDE.md +39 -40
  63. moai_adk/templates/src/moai_adk/core/__init__.py +5 -0
  64. moai_adk/templates/src/moai_adk/core/tags/__init__.py +87 -0
  65. moai_adk/templates/src/moai_adk/core/tags/ci_validator.py +435 -0
  66. moai_adk/templates/src/moai_adk/core/tags/cli.py +283 -0
  67. moai_adk/templates/src/moai_adk/core/tags/pre_commit_validator.py +355 -0
  68. moai_adk/templates/src/moai_adk/core/tags/reporter.py +959 -0
  69. moai_adk/templates/src/moai_adk/core/tags/validator.py +897 -0
  70. {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/METADATA +226 -1
  71. {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/RECORD +83 -50
  72. moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -313
  73. moai_adk/templates/.moai/memory/config-schema.md +0 -444
  74. moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
  75. moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
  76. /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/__init__.py +0 -0
  77. /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/checkpoint.py +0 -0
  78. /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/context.py +0 -0
  79. /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/tags.py +0 -0
  80. /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/__init__.py +0 -0
  81. /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/notification.py +0 -0
  82. /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/tool.py +0 -0
  83. /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/user.py +0 -0
  84. /moai_adk/templates/.moai/memory/{issue-label-mapping.md → ISSUE-LABEL-MAPPING.md} +0 -0
  85. {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/WHEEL +0 -0
  86. {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/entry_points.txt +0 -0
  87. {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,71 +1,71 @@
1
1
  # SPEC Authoring Examples
2
2
 
3
- ## 실전 EARS 예제
3
+ ## Real-World EARS Examples
4
4
 
5
- ### 예제 1: E-commerce 체크아웃
5
+ ### Example 1: E-commerce Checkout
6
6
 
7
7
  ```markdown
8
8
  ### Ubiquitous Requirements
9
- **UR-001**: 시스템은 장바구니를 제공해야 한다.
10
- **UR-002**: 시스템은 신용카드 결제를 지원해야 한다.
9
+ **UR-001**: The system shall provide a shopping cart feature.
10
+ **UR-002**: The system shall support credit card payment.
11
11
 
12
12
  ### Event-driven Requirements
13
- **ER-001**: WHEN 사용자가 장바구니에 아이템을 추가하면, 시스템은 장바구니 총액을 업데이트해야 한다.
14
- **ER-002**: WHEN 결제가 성공하면, 시스템은 주문 확인 이메일을 보내야 한다.
15
- **ER-003**: WHEN 재고가 부족하면, 시스템은 "품절" 메시지를 표시해야 한다.
13
+ **ER-001**: WHEN the user adds an item to the cart, the system shall update the cart total.
14
+ **ER-002**: WHEN payment succeeds, the system shall send a confirmation email.
15
+ **ER-003**: WHEN inventory is insufficient, the system shall display an "Out of Stock" message.
16
16
 
17
17
  ### State-driven Requirements
18
- **SR-001**: WHILE 아이템이 장바구니에 있으면, 시스템은 30분 동안 재고를 예약해야 한다.
19
- **SR-002**: WHILE 결제가 처리 중이면, UI 로딩 인디케이터를 표시해야 한다.
18
+ **SR-001**: WHILE items exist in the cart, the system shall reserve inventory for 30 minutes.
19
+ **SR-002**: WHILE payment is being processed, the UI shall display a loading indicator.
20
20
 
21
21
  ### Optional Features
22
- **OF-001**: WHERE 특급 배송이 선택된 경우, 시스템은 특급 배송 비용을 계산할 있다.
23
- **OF-002**: WHERE 선물 포장이 가능한 경우, 시스템은 선물 포장 옵션을 제공할 있다.
22
+ **OF-001**: WHERE express shipping is selected, the system can calculate express shipping cost.
23
+ **OF-002**: WHERE gift wrapping is available, the system can offer gift wrapping option.
24
24
 
25
- ### Constraints
26
- **C-001**: IF 장바구니 총액이 $50 미만이면, THEN 시스템은 $5 배송료를 추가해야 한다.
27
- **C-002**: IF 3 결제 실패 후, THEN 시스템은 주문을 1시간 동안 잠가야 한다.
28
- **C-003**: 주문 처리 시간은 5초를 초과하지 않아야 한다.
25
+ ### Unwanted Behaviors
26
+ **UB-001**: IF cart total is less than $50, THEN the system shall add a $5 shipping fee.
27
+ **UB-002**: IF 3 payment failures occur, THEN the system shall lock the order for 1 hour.
28
+ **UB-003**: Order processing time shall not exceed 5 seconds.
29
29
  ```
30
30
 
31
- ### 예제 2: 모바일 푸시 알림
31
+ ### Example 2: Mobile App Push Notifications
32
32
 
33
33
  ```markdown
34
34
  ### Ubiquitous Requirements
35
- **UR-001**: 앱은 푸시 알림을 지원해야 한다.
36
- **UR-002**: 앱은 사용자가 알림을 활성화/비활성화할 있도록 해야 한다.
35
+ **UR-001**: The app shall support push notifications.
36
+ **UR-002**: The app shall allow users to enable/disable notifications.
37
37
 
38
38
  ### Event-driven Requirements
39
- **ER-001**: WHEN 메시지가 도착하면, 앱은 푸시 알림을 표시해야 한다.
40
- **ER-002**: WHEN 알림을 탭하면, 앱은 메시지 화면으로 이동해야 한다.
41
- **ER-003**: WHEN 알림 권한이 거부되면, 앱은 인앱 알림 배너를 표시해야 한다.
39
+ **ER-001**: WHEN a new message arrives, the app shall display a push notification.
40
+ **ER-002**: WHEN the user taps a notification, the app shall navigate to the message screen.
41
+ **ER-003**: WHEN notification permission is denied, the app shall display an in-app banner.
42
42
 
43
43
  ### State-driven Requirements
44
- **SR-001**: WHILE 앱이 포어그라운드 상태이면, 시스템은 푸시 알림 대신 인앱 배너를 표시해야 한다.
45
- **SR-002**: WHILE 방해 금지 모드가 활성화된 경우, 시스템은 모든 알림을 음소거해야 한다.
44
+ **SR-001**: WHILE the app is in foreground state, the system shall display in-app banner instead of push notification.
45
+ **SR-002**: WHILE Do Not Disturb mode is enabled, the system shall mute all notifications.
46
46
 
47
47
  ### Optional Features
48
- **OF-001**: WHERE 알림 사운드가 활성화된 경우, 시스템은 알림 사운드를 재생할 있다.
49
- **OF-002**: WHERE 알림 그룹화가 지원되는 경우, 시스템은 대화별로 알림을 그룹화할 있다.
48
+ **OF-001**: WHERE notification sound is enabled, the system can play notification sound.
49
+ **OF-002**: WHERE notification grouping is supported, the system can group notifications by conversation.
50
50
 
51
- ### Constraints
52
- **C-001**: IF 10 이상의 알림이 대기 중이면, THEN 시스템은 이를 요약 알림으로 그룹화해야 한다.
53
- **C-002**: 알림 전달 지연은 5초를 초과하지 않아야 한다.
51
+ ### Unwanted Behaviors
52
+ **UB-001**: IF 10 or more notifications are pending, THEN the system shall consolidate them into a summary notification.
53
+ **UB-002**: Notification delivery latency shall not exceed 5 seconds.
54
54
  ```
55
55
 
56
56
  ---
57
57
 
58
- ## 완전한 SPEC 예제
58
+ ## Complete SPEC Examples
59
59
 
60
- ### 예제 1: 최소 SPEC
60
+ ### Example 1: Minimal SPEC
61
61
 
62
62
  ```markdown
63
63
  ---
64
64
  id: HELLO-001
65
65
  version: 0.0.1
66
66
  status: draft
67
- created: 2025-10-23
68
- updated: 2025-10-23
67
+ created: 2025-10-29
68
+ updated: 2025-10-29
69
69
  author: @Goos
70
70
  priority: low
71
71
  ---
@@ -74,8 +74,8 @@ priority: low
74
74
 
75
75
  ## HISTORY
76
76
 
77
- ### v0.0.1 (2025-10-23)
78
- - **INITIAL**: Hello World API SPEC 초안 생성
77
+ ### v0.0.1 (2025-10-29)
78
+ - **INITIAL**: Hello World API SPEC draft created
79
79
  - **AUTHOR**: @Goos
80
80
 
81
81
  ## Environment
@@ -85,33 +85,33 @@ priority: low
85
85
 
86
86
  ## Assumptions
87
87
 
88
- 1. 단일 엔드포인트 필요
89
- 2. 인증 불필요
90
- 3. JSON 응답 형식
88
+ 1. Single endpoint required
89
+ 2. No authentication needed
90
+ 3. JSON response format
91
91
 
92
92
  ## Requirements
93
93
 
94
94
  ### Ubiquitous Requirements
95
95
 
96
- **UR-001**: 시스템은 GET /hello 엔드포인트를 제공해야 한다.
96
+ **UR-001**: The system shall provide a GET /hello endpoint.
97
97
 
98
98
  ### Event-driven Requirements
99
99
 
100
- **ER-001**: WHEN GET 요청이 /hello 전송되면, 시스템은 JSON `{"message": "Hello, World!"}`를 반환해야 한다.
100
+ **ER-001**: WHEN a GET request is sent to /hello, the system shall return JSON `{"message": "Hello, World!"}`.
101
101
 
102
- ### Constraints
102
+ ### Unwanted Behaviors
103
103
 
104
- **C-001**: 응답 시간은 50ms를 초과하지 않아야 한다.
104
+ **UB-001**: Response time shall not exceed 50ms.
105
105
  ```
106
106
 
107
- ### 예제 2: 프로덕션급 SPEC
107
+ ### Example 2: Production-Grade SPEC
108
108
 
109
109
  ```markdown
110
110
  ---
111
111
  id: AUTH-001
112
112
  version: 0.1.0
113
113
  status: completed
114
- created: 2025-10-23
114
+ created: 2025-10-29
115
115
  updated: 2025-10-30
116
116
  author: @Goos
117
117
  priority: high
@@ -143,10 +143,10 @@ scope:
143
143
  ## HISTORY
144
144
 
145
145
  ### v0.1.0 (2025-10-30)
146
- - **COMPLETED**: TDD 구현 완료
146
+ - **COMPLETED**: TDD implementation finished
147
147
  - **AUTHOR**: @Goos
148
148
  - **EVIDENCE**: Commits 4c66076, 34e1bd9, 1dec08f
149
- - **TEST COVERAGE**: 89.13% (목표: 85%)
149
+ - **TEST COVERAGE**: 89.13% (target: 85%)
150
150
  - **QUALITY METRICS**:
151
151
  - Test Pass Rate: 100% (42/42 tests)
152
152
  - Linting: ruff ✅
@@ -157,15 +157,15 @@ scope:
157
157
  - @CODE:AUTH-001: 12 occurrences
158
158
 
159
159
  ### v0.0.2 (2025-10-25)
160
- - **REFINED**: 비밀번호 재설정 플로우 요구사항 추가
161
- - **REFINED**: 토큰 수명 제약 명확화
160
+ - **REFINED**: Added password reset flow requirements
161
+ - **REFINED**: Clarified token lifetime constraints
162
162
  - **AUTHOR**: @Goos
163
163
 
164
- ### v0.0.1 (2025-10-23)
165
- - **INITIAL**: JWT 인증 SPEC 초안 생성
164
+ ### v0.0.1 (2025-10-29)
165
+ - **INITIAL**: JWT authentication SPEC draft created
166
166
  - **AUTHOR**: @Goos
167
- - **SCOPE**: 사용자 인증, 토큰 생성, 토큰 검증
168
- - **CONTEXT**: 2025 4분기 제품 로드맵 요구사항
167
+ - **SCOPE**: User authentication, token generation, token validation
168
+ - **CONTEXT**: Q4 2025 product roadmap requirements
169
169
 
170
170
  ## Environment
171
171
 
@@ -184,56 +184,56 @@ scope:
184
184
 
185
185
  ## Assumptions
186
186
 
187
- 1. **User Storage**: 사용자 인증 정보는 PostgreSQL에 저장
188
- 2. **Secret Management**: JWT 시크릿은 환경변수로 관리
189
- 3. **Clock Sync**: 서버 시계는 NTP로 동기화
190
- 4. **Password Policy**: 가입 최소 8자 강제
187
+ 1. **User Storage**: User credentials are stored in PostgreSQL
188
+ 2. **Secret Management**: JWT secrets are managed via environment variables
189
+ 3. **Clock Sync**: Server clock is synchronized with NTP
190
+ 4. **Password Policy**: Minimum 8 characters enforced during registration
191
191
 
192
192
  ## Requirements
193
193
 
194
194
  ### Ubiquitous Requirements
195
195
 
196
- **UR-001**: 시스템은 JWT 기반 인증을 제공해야 한다.
196
+ **UR-001**: The system shall provide JWT-based authentication.
197
197
 
198
- **UR-002**: 시스템은 이메일과 비밀번호로 사용자 로그인을 지원해야 한다.
198
+ **UR-002**: The system shall support user login with email and password.
199
199
 
200
- **UR-003**: 시스템은 액세스 토큰과 리프레시 토큰을 발급해야 한다.
200
+ **UR-003**: The system shall issue both access and refresh tokens.
201
201
 
202
202
  ### Event-driven Requirements
203
203
 
204
- **ER-001**: WHEN 사용자가 유효한 인증 정보를 제출하면, 시스템은 15분 만료 시간을 가진 JWT 액세스 토큰을 발급해야 한다.
204
+ **ER-001**: WHEN the user submits valid credentials, the system shall issue a JWT access token with 15-minute expiration.
205
205
 
206
- **ER-002**: WHEN 토큰이 만료되면, 시스템은 HTTP 401 Unauthorized를 반환해야 한다.
206
+ **ER-002**: WHEN a token expires, the system shall return HTTP 401 Unauthorized.
207
207
 
208
- **ER-003**: WHEN 리프레시 토큰이 제시되면, 시스템은 리프레시 토큰이 유효한 경우 액세스 토큰을 발급해야 한다.
208
+ **ER-003**: WHEN a refresh token is presented, the system shall issue a new access token if the refresh token is valid.
209
209
 
210
210
  ### State-driven Requirements
211
211
 
212
- **SR-001**: WHILE 사용자가 인증된 상태이면, 시스템은 보호된 리소스에 대한 접근을 허용해야 한다.
212
+ **SR-001**: WHILE the user is in an authenticated state, the system shall permit access to protected resources.
213
213
 
214
- **SR-002**: WHILE 토큰이 유효하면, 시스템은 토큰 클레임에서 사용자 ID 추출해야 한다.
214
+ **SR-002**: WHILE a token is valid, the system shall extract the user ID from token claims.
215
215
 
216
216
  ### Optional Features
217
217
 
218
- **OF-001**: WHERE 다중 인증이 활성화된 경우, 시스템은 비밀번호 확인 OTP 검증을 요구할 있다.
218
+ **OF-001**: WHERE multi-factor authentication is enabled, the system can require OTP verification after password confirmation.
219
219
 
220
- **OF-002**: WHERE 세션 로깅이 활성화된 경우, 시스템은 로그인 타임스탬프와 IP 주소를 기록할 있다.
220
+ **OF-002**: WHERE session logging is enabled, the system can record login timestamp and IP address.
221
221
 
222
- ### Constraints
222
+ ### Unwanted Behaviors
223
223
 
224
- **C-001**: IF 토큰이 만료되었다면, 시스템은 접근을 거부하고 HTTP 401을 반환해야 한다.
224
+ **UB-001**: IF a token has expired, THEN the system shall deny access and return HTTP 401.
225
225
 
226
- **C-002**: IF 10분 이내에 5번 이상 로그인 실패가 발생하면, 시스템은 임시로 계정을 잠가야 한다.
226
+ **UB-002**: IF 5 or more login failures occur within 10 minutes, THEN the system shall temporarily lock the account.
227
227
 
228
- **C-003**: 액세스 토큰은 15분 수명을 초과하지 않아야 한다.
228
+ **UB-003**: Access token lifetime shall not exceed 15 minutes.
229
229
 
230
- **C-004**: 리프레시 토큰은 7일 수명을 초과하지 않아야 한다.
230
+ **UB-004**: Refresh token lifetime shall not exceed 7 days.
231
231
 
232
232
  ## Traceability (@TAG Chain)
233
233
 
234
- ### TAG 체인 구조
234
+ ### TAG Chain Structure
235
235
  ```
236
- @SPEC:AUTH-001 ( 문서)
236
+ @SPEC:AUTH-001 (this document)
237
237
 
238
238
  @TEST:AUTH-001 (tests/auth/service.test.ts)
239
239
 
@@ -242,300 +242,300 @@ scope:
242
242
  @DOC:AUTH-001 (docs/api/authentication.md)
243
243
  ```
244
244
 
245
- ### 검증 명령어
245
+ ### Validation Commands
246
246
  ```bash
247
- # SPEC TAG 검증
247
+ # Validate SPEC TAG
248
248
  rg '@SPEC:AUTH-001' -n .moai/specs/
249
249
 
250
- # 중복 ID 확인
250
+ # Check for duplicate IDs
251
251
  rg '@SPEC:AUTH' -n .moai/specs/
252
252
  rg 'AUTH-001' -n
253
253
 
254
- # 전체 TAG 체인 스캔
254
+ # Scan full TAG chain
255
255
  rg '@(SPEC|TEST|CODE|DOC):AUTH-001' -n
256
256
  ```
257
257
 
258
258
  ## Decision Log
259
259
 
260
- ### Decision 1: JWT vs Session Cookies (2025-10-23)
261
- **Context**: 마이크로서비스를 위한 무상태 인증 필요
262
- **Decision**: JWT 토큰 사용
263
- **Alternatives Considered**:
264
- - 세션 쿠키 (거부: 상태 기반, 확장 불가)
265
- - OAuth 2.0 (연기: MVP에 너무 복잡)
266
- **Consequences**:
267
- - ✅ 무상태, 확장 가능
268
- - ✅ 서비스 간 인증
269
- - ❌ 토큰 취소 복잡성
270
-
271
- ### Decision 2: 토큰 만료 15 (2025-10-24)
272
- **Context**: 보안과 UX 균형
273
- **Decision**: 15 액세스 토큰, 7 리프레시 토큰
274
- **Rationale**: 업계 표준, 보안 모범 사례
275
- **References**: OWASP JWT 모범 사례
260
+ ### Decision 1: JWT vs Session Cookies (2025-10-29)
261
+ **Context**: Need stateless authentication for microservices
262
+ **Decision**: Use JWT tokens
263
+ **Alternatives Considered**:
264
+ - Session cookies (rejected: stateful, not scalable)
265
+ - OAuth 2.0 (deferred: too complex for MVP)
266
+ **Consequences**:
267
+ - ✅ Stateless, scalable
268
+ - ✅ Service-to-service authentication
269
+ - ❌ Token revocation complexity
270
+
271
+ ### Decision 2: Token Expiration 15 minutes (2025-10-30)
272
+ **Context**: Balance between security and UX
273
+ **Decision**: 15-minute access token, 7-day refresh token
274
+ **Rationale**: Industry standard, OWASP best practices
275
+ **References**: OWASP JWT best practices
276
276
 
277
277
  ## Requirements Traceability Matrix
278
278
 
279
279
  | Req ID | Description | Test Cases | Status |
280
280
  |--------|-------------|------------|--------|
281
- | UR-001 | JWT 인증 | test_authenticate_valid_user | ✅ |
282
- | ER-001 | 토큰 발급 | test_token_generation | ✅ |
283
- | ER-002 | 토큰 만료 | test_expired_token_rejection | ✅ |
284
- | SR-001 | 인증된 접근 | test_protected_route_access | ✅ |
285
- | C-001 | 토큰 수명 | test_token_expiry_constraint | ✅ |
281
+ | UR-001 | JWT authentication | test_authenticate_valid_user | ✅ |
282
+ | ER-001 | Token issuance | test_token_generation | ✅ |
283
+ | ER-002 | Token expiration | test_expired_token_rejection | ✅ |
284
+ | SR-001 | Authenticated access | test_protected_route_access | ✅ |
285
+ | UB-001 | Token lifetime | test_token_expiry_constraint | ✅ |
286
286
  ```
287
287
 
288
288
  ---
289
289
 
290
- ## 고급 패턴
290
+ ## Advanced Patterns
291
291
 
292
- ### 패턴 1: 버전화된 요구사항
292
+ ### Pattern 1: Versioned Requirements
293
293
 
294
- 요구사항이 버전 변경될 때 진화 과정 문서화:
294
+ Document requirement evolution across versions:
295
295
 
296
296
  ```markdown
297
297
  ### v0.2.0 (2025-11-15)
298
- **UR-001** (CHANGED): 시스템은 요청의 99%에 대해 200ms 이내에 응답해야 한다.
299
- - 이전 (v0.1.0): 요청의 95%
300
- - 근거: 사용자 피드백 기반 성능 개선
298
+ **UR-001** (CHANGED): The system shall respond within 200ms for 99% of requests.
299
+ - Previous (v0.1.0): 95% of requests
300
+ - Rationale: User feedback-driven performance improvement
301
301
 
302
302
  ### v0.1.0 (2025-10-30)
303
- **UR-001**: 시스템은 요청의 95%에 대해 200ms 이내에 응답해야 한다.
303
+ **UR-001**: The system shall respond within 200ms for 95% of requests.
304
304
  ```
305
305
 
306
- ### 패턴 2: 요구사항 추적 매트릭스
306
+ ### Pattern 2: Requirements Traceability Matrix
307
307
 
308
- 요구사항을 테스트 케이스에 명시적으로 연결:
308
+ Explicitly link requirements to test cases:
309
309
 
310
310
  ```markdown
311
311
  ## Requirements Traceability Matrix
312
312
 
313
313
  | Req ID | Description | Test Cases | Status |
314
314
  |--------|-------------|------------|--------|
315
- | UR-001 | JWT 인증 | test_authenticate_valid_user | ✅ |
316
- | ER-001 | 토큰 발급 | test_token_generation | ✅ |
317
- | ER-002 | 토큰 만료 | test_expired_token_rejection | ✅ |
318
- | SR-001 | 인증된 접근 | test_protected_route_access | ✅ |
319
- | C-001 | 토큰 수명 | test_token_expiry_constraint | ✅ |
315
+ | UR-001 | JWT authentication | test_authenticate_valid_user | ✅ |
316
+ | ER-001 | Token issuance | test_token_generation | ✅ |
317
+ | ER-002 | Token expiration | test_expired_token_rejection | ✅ |
318
+ | SR-001 | Authenticated access | test_protected_route_access | ✅ |
319
+ | UB-001 | Token lifetime | test_token_expiry_constraint | ✅ |
320
320
  ```
321
321
 
322
- ### 패턴 3: 결정 로그
322
+ ### Pattern 3: Decision Log
323
323
 
324
- SPEC 내에서 아키텍처 결정 문서화:
324
+ Document architectural decisions within the SPEC:
325
325
 
326
326
  ```markdown
327
327
  ## Decision Log
328
328
 
329
- ### Decision 1: JWT vs Session Cookies (2025-10-23)
330
- **Context**: 마이크로서비스를 위한 무상태 인증 필요
331
- **Decision**: JWT 토큰 사용
332
- **Alternatives Considered**:
333
- - 세션 쿠키 (거부: 상태 기반, 확장 불가)
334
- - OAuth 2.0 (연기: MVP에 너무 복잡)
335
- **Consequences**:
336
- - ✅ 무상태, 확장 가능
337
- - ✅ 서비스 간 인증
338
- - ❌ 토큰 취소 복잡성
339
-
340
- ### Decision 2: 토큰 만료 15 (2025-10-24)
341
- **Context**: 보안과 UX 균형
342
- **Decision**: 15 액세스 토큰, 7 리프레시 토큰
343
- **Rationale**: 업계 표준, 보안 모범 사례
344
- **References**: OWASP JWT 모범 사례
329
+ ### Decision 1: JWT vs Session Cookies (2025-10-29)
330
+ **Context**: Need stateless authentication for microservices
331
+ **Decision**: Use JWT tokens
332
+ **Alternatives Considered**:
333
+ - Session cookies (rejected: stateful, not scalable)
334
+ - OAuth 2.0 (deferred: too complex for MVP)
335
+ **Consequences**:
336
+ - ✅ Stateless, scalable
337
+ - ✅ Service-to-service authentication
338
+ - ❌ Token revocation complexity
339
+
340
+ ### Decision 2: Token Expiration 15 minutes (2025-10-30)
341
+ **Context**: Balance between security and UX
342
+ **Decision**: 15-minute access token, 7-day refresh token
343
+ **Rationale**: Industry standard, OWASP best practices
344
+ **References**: OWASP JWT best practices
345
345
  ```
346
346
 
347
347
  ---
348
348
 
349
- ## 트러블슈팅
349
+ ## Troubleshooting
350
350
 
351
- ### 이슈: "중복 SPEC ID 감지됨"
351
+ ### Issue: "Duplicate SPEC ID detected"
352
352
 
353
- **증상**: `rg "@SPEC:AUTH-001" -n`이 여러 결과 반환
353
+ **Symptom**: `rg "@SPEC:AUTH-001" -n` returns multiple results
354
354
 
355
- **해결책**:
355
+ **Resolution**:
356
356
  ```bash
357
- # 모든 발생 찾기
357
+ # Find all occurrences
358
358
  rg "@SPEC:AUTH-001" -n .moai/specs/
359
359
 
360
- # 하나의 SPEC 유지, 나머지 이름 변경
361
- # 코드/테스트에서 TAG 참조 업데이트
360
+ # Keep one SPEC, rename the other
361
+ # Update TAG references in code/tests
362
362
  rg '@SPEC:AUTH-001' -l src/ tests/ | xargs sed -i 's/@SPEC:AUTH-001/@SPEC:AUTH-002/g'
363
363
  ```
364
364
 
365
- ### 이슈: "버전 번호가 상태와 일치하지 않음"
365
+ ### Issue: "Version number doesn't match status"
366
366
 
367
- **증상**: `status: completed`이지만 `version: 0.0.1`
367
+ **Symptom**: `status: completed` but `version: 0.0.1`
368
368
 
369
- **해결책**:
369
+ **Resolution**:
370
370
  ```yaml
371
- # 완료를 반영하도록 버전 업데이트
372
- version: 0.1.0 # 구현 완료
371
+ # Update version to reflect completion
372
+ version: 0.1.0 # Implementation completed
373
373
  status: completed
374
374
  ```
375
375
 
376
- ### 이슈: "HISTORY 섹션 버전 누락"
376
+ ### Issue: "HISTORY section missing version entry"
377
377
 
378
- **증상**: 콘텐츠가 변경되었지만 HISTORY 엔트리 없음
378
+ **Symptom**: Content changed but no new HISTORY entry
379
379
 
380
- **해결책**:
380
+ **Resolution**:
381
381
  ```markdown
382
382
  ## HISTORY
383
383
 
384
- ### v0.0.2 (2025-10-25) ← 엔트리 추가
385
- - **REFINED**: XYZ 요구사항 업데이트
384
+ ### v0.0.2 (2025-10-25) ← Add new entry
385
+ - **REFINED**: XYZ requirement updated
386
386
  - **AUTHOR**: @YourHandle
387
387
 
388
388
  ### v0.0.1 (2025-10-23)
389
- - **INITIAL**: 초안
389
+ - **INITIAL**: Initial draft
390
390
  ```
391
391
 
392
- ### 이슈: "작성자 필드 @ 접두사 누락"
392
+ ### Issue: "Author field missing @ prefix"
393
393
 
394
- **증상**: `author: Goos` 대신 `author: @Goos`
394
+ **Symptom**: `author: Goos` instead of `author: @Goos`
395
395
 
396
- **해결책**:
396
+ **Resolution**:
397
397
  ```yaml
398
- # 잘못됨
398
+ # Incorrect
399
399
  author: Goos
400
400
  author: goos
401
401
 
402
- # 올바름
402
+ # Correct
403
403
  author: @Goos
404
404
  ```
405
405
 
406
- ### 이슈: "EARS 패턴 혼합"
406
+ ### Issue: "EARS pattern mixing"
407
407
 
408
- **증상**: "WHEN 사용자가 로그인 상태이면, WHILE 세션이 활성 상태이면, 시스템은..."
408
+ **Symptom**: "WHEN user logs in, WHILE session is active, the system shall..."
409
409
 
410
- **해결책**:
410
+ **Resolution**:
411
411
  ```markdown
412
- # 나쁨 (패턴 혼합)
413
- **ER-001**: WHEN 사용자가 로그인하면, WHILE 세션이 활성 상태이면, 시스템은 접근을 허용해야 한다.
412
+ # Bad (pattern mixing)
413
+ **ER-001**: WHEN user logs in, WHILE session is active, the system shall permit access.
414
414
 
415
- # 좋음 (요구사항 분리)
416
- **ER-001**: WHEN 사용자가 성공적으로 로그인하면, 시스템은 세션을 생성해야 한다.
417
- **SR-001**: WHILE 세션이 활성 상태이면, 시스템은 보호된 리소스에 대한 접근을 허용해야 한다.
415
+ # Good (separate requirements)
416
+ **ER-001**: WHEN user successfully logs in, the system shall create a session.
417
+ **SR-001**: WHILE session is active, the system shall permit access to protected resources.
418
418
  ```
419
419
 
420
420
  ---
421
421
 
422
- ## 모범 사례 요약
422
+ ## Best Practices Summary
423
423
 
424
- ### ✅ DO (해야 할 것)
424
+ ### ✅ DO (Best Practices)
425
425
 
426
- 1. **새 SPEC 생성 중복 ID 확인**
426
+ 1. **Check for duplicate IDs before creating**
427
427
  ```bash
428
428
  rg "@SPEC:AUTH-001" -n .moai/specs/
429
429
  rg "AUTH-001" -n
430
430
  ```
431
431
 
432
- 2. **모든 콘텐츠 변경 HISTORY 업데이트**
432
+ 2. **Update HISTORY on every content change**
433
433
  ```markdown
434
434
  ### v0.0.2 (2025-10-25)
435
- - **REFINED**: XYZ 추가
435
+ - **REFINED**: XYZ added
436
436
  - **AUTHOR**: @YourHandle
437
437
  ```
438
438
 
439
- 3. **버전 생애주기 엄격히 따르기**
439
+ 3. **Follow version lifecycle strictly**
440
440
  ```
441
441
  0.0.1 → 0.0.2 → ... → 0.1.0 → 0.1.1 → ... → 1.0.0
442
442
  (draft) (draft) (completed) (patches) (stable)
443
443
  ```
444
444
 
445
- 4. **작성자 필드에 @ 접두사 사용**
445
+ 4. **Use @ prefix in author field**
446
446
  ```yaml
447
- author: @Goos # 올바름
447
+ author: @Goos # Correct
448
448
  ```
449
449
 
450
- 5. **테스트 가능하고 측정 가능한 요구사항 작성**
450
+ 5. **Write testable, measurable requirements**
451
451
  ```markdown
452
- # 좋음
453
- **UR-001**: API 응답 시간은 요청의 95%에 대해 200ms 초과하지 않아야 한다.
454
-
455
- # 나쁨
456
- **UR-001**: 시스템은 빨라야 한다.
452
+ # Good
453
+ **UR-001**: API response time shall not exceed 200ms for 95% of requests.
454
+
455
+ # Bad
456
+ **UR-001**: The system should be fast.
457
457
  ```
458
458
 
459
- 6. **7개 필수 메타데이터 필드 모두 포함**
459
+ 6. **Include all 7 required metadata fields**
460
460
  ```yaml
461
461
  id: AUTH-001
462
462
  version: 0.0.1
463
463
  status: draft
464
- created: 2025-10-23
465
- updated: 2025-10-23
464
+ created: 2025-10-29
465
+ updated: 2025-10-29
466
466
  author: @Goos
467
467
  priority: high
468
468
  ```
469
469
 
470
- 7. **EARS 패턴 일관되게 사용**
470
+ 7. **Use EARS patterns consistently**
471
471
 
472
- ### ❌ DON'T (하지 말아야 할 것)
472
+ ### ❌ DON'T (Anti-Patterns)
473
473
 
474
- 1. **할당 SPEC ID 변경하지 않기**
475
- - TAG 체인 파괴
476
- - 기존 코드/테스트 고아화
477
- - Git 히스토리 손실
474
+ 1. **Don't change SPEC ID after assignment**
475
+ - Breaks TAG chain
476
+ - Orphans existing code/tests
477
+ - Loses Git history
478
478
 
479
- 2. **HISTORY 업데이트 건너뛰지 않기**
480
- - 변경 근거 손실
481
- - 불명확한 버전 진행
482
- - 감사 추적 격차
479
+ 2. **Don't skip HISTORY updates**
480
+ - Loses change rationale
481
+ - Unclear version progression
482
+ - Audit trail gaps
483
483
 
484
- 3. **정당화 없이 버전 번호 건너뛰지 않기**
484
+ 3. **Don't jump version numbers without reason**
485
485
  ```markdown
486
- # 나쁨: 0.0.1 → 1.0.0
487
- # 좋음: 0.0.1 → 0.0.2 → ... → 0.1.0 → 1.0.0
486
+ # Bad: 0.0.1 → 1.0.0
487
+ # Good: 0.0.1 → 0.0.2 → ... → 0.1.0 → 1.0.0
488
488
  ```
489
489
 
490
- 4. **모호한 요구사항 작성하지 않기**
491
- - "빠른", "사용자 친화적", "좋은" 같은 용어 피하기
492
- - 측정 가능한 기준 사용
490
+ 4. **Don't write ambiguous requirements**
491
+ - Avoid "fast", "user-friendly", "good"
492
+ - Use measurable criteria
493
493
 
494
- 5. **하나의 요구사항에 여러 EARS 패턴 혼합하지 않기**
494
+ 5. **Don't mix EARS patterns in one requirement**
495
495
 
496
- 6. **제출 검증 잊지 않기**
496
+ 6. **Don't skip validation before submission**
497
497
  ```bash
498
498
  ./validate-spec.sh .moai/specs/SPEC-AUTH-001
499
499
  ```
500
500
 
501
- 7. **중복 SPEC ID 생성하지 않기**
501
+ 7. **Don't create duplicate SPEC IDs**
502
502
 
503
503
  ---
504
504
 
505
- ## 통합 워크플로우
505
+ ## Integration Workflow
506
506
 
507
- ### `/alfred:1-plan`과 통합
507
+ ### `/alfred:1-plan` Integration
508
508
 
509
- `/alfred:1-plan`이 호출되면, `spec-builder` 에이전트는 Skill 사용하여:
509
+ When `/alfred:1-plan` is called, the `spec-builder` agent uses this Skill to:
510
510
 
511
- 1. **분석**: 사용자 요청 프로젝트 컨텍스트 분석
512
- 2. **생성**: 적절한 구조로 SPEC 후보 생성
513
- 3. **검증**: 메타데이터 완전성 검증
514
- 4. **생성**: EARS 요구사항으로 `.moai/specs/SPEC-{ID}/spec.md` 생성
515
- 5. **초기화**: Git 워크플로우 (기능 브랜치, Draft PR)
511
+ 1. **Analyze**: User request and project context
512
+ 2. **Generate**: SPEC candidates with appropriate structure
513
+ 3. **Validate**: Metadata completeness
514
+ 4. **Create**: `.moai/specs/SPEC-{ID}/spec.md` with EARS requirements
515
+ 5. **Initialize**: Git workflow (feature branch, Draft PR)
516
516
 
517
- ### spec-builder 통합 지점
517
+ ### spec-builder Integration Points
518
518
 
519
519
  ```markdown
520
- Phase 1: SPEC 후보 생성
521
- ↓ (메타데이터 구조를 위해 moai-spec-authoring 사용)
522
- Phase 2: 사용자 승인
520
+ Phase 1: SPEC candidate generation
521
+ ↓ (uses moai-spec-authoring for metadata structure)
522
+ Phase 2: User approval
523
523
 
524
- Phase 3: SPEC 파일 생성
525
- ↓ ( Skill의 EARS 템플릿 적용)
526
- Phase 4: Git 워크플로우 초기화
524
+ Phase 3: SPEC file creation
525
+ ↓ (applies EARS templates from this Skill)
526
+ Phase 4: Git workflow initialization
527
527
 
528
- Phase 5: /alfred:2-run으로 핸드오프
528
+ Phase 5: Handoff to /alfred:2-run
529
529
  ```
530
530
 
531
- ### 에이전트 협업
531
+ ### Agent Collaboration
532
532
 
533
- - **spec-builder**: Skill의 템플릿을 사용하여 SPEC 생성
534
- - **tag-agent**: TAG 형식 고유성 검증
535
- - **trust-checker**: 메타데이터 완전성 확인
536
- - **git-manager**: 기능 브랜치 Draft PR 생성
533
+ - **spec-builder**: Creates SPEC using this Skill's templates
534
+ - **tag-agent**: Validates TAG format and uniqueness
535
+ - **trust-checker**: Verifies metadata completeness
536
+ - **git-manager**: Creates feature branch and Draft PR
537
537
 
538
538
  ---
539
539
 
540
- **Last Updated**: 2025-10-27
541
- **Version**: 1.1.0
540
+ **Last Updated**: 2025-10-29
541
+ **Version**: 1.2.0