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.
- moai_adk/cli/commands/update.py +15 -4
- moai_adk/core/tags/__init__.py +87 -0
- moai_adk/core/tags/ci_validator.py +435 -0
- moai_adk/core/tags/cli.py +283 -0
- moai_adk/core/tags/generator.py +109 -0
- moai_adk/core/tags/inserter.py +99 -0
- moai_adk/core/tags/mapper.py +126 -0
- moai_adk/core/tags/parser.py +76 -0
- moai_adk/core/tags/pre_commit_validator.py +355 -0
- moai_adk/core/tags/reporter.py +959 -0
- moai_adk/core/tags/tags.py +149 -0
- moai_adk/core/tags/validator.py +897 -0
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +25 -2
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +24 -12
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +19 -12
- moai_adk/templates/.claude/agents/alfred/git-manager.md +20 -12
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +19 -12
- moai_adk/templates/.claude/agents/alfred/project-manager.md +29 -2
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +25 -2
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +30 -2
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +26 -11
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +30 -8
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +27 -12
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +25 -2
- moai_adk/templates/.claude/commands/alfred/0-project.md +5 -0
- moai_adk/templates/.claude/commands/alfred/1-plan.md +17 -4
- moai_adk/templates/.claude/commands/alfred/2-run.md +7 -0
- moai_adk/templates/.claude/commands/alfred/3-sync.md +6 -0
- moai_adk/templates/.claude/hooks/alfred/.moai/cache/version-check.json +9 -0
- moai_adk/templates/.claude/hooks/alfred/README.md +258 -145
- moai_adk/templates/.claude/hooks/alfred/TROUBLESHOOTING.md +471 -0
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +92 -57
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/notification__handle_events.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +108 -0
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/project.py +269 -13
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/session.py +21 -7
- moai_adk/templates/.claude/hooks/alfred/stop__handle_interrupt.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/subagent_stop__handle_subagent_end.py +102 -0
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +120 -0
- moai_adk/templates/.claude/settings.json +5 -5
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +9 -6
- moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +56 -56
- moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +101 -100
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +3 -3
- moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +219 -219
- moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +287 -287
- moai_adk/templates/.github/ISSUE_TEMPLATE/spec.yml +9 -11
- moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +9 -21
- moai_adk/templates/.github/workflows/moai-release-create.yml +100 -0
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +182 -0
- moai_adk/templates/.github/workflows/release.yml +49 -0
- moai_adk/templates/.github/workflows/tag-report.yml +261 -0
- moai_adk/templates/.github/workflows/tag-validation.yml +176 -0
- moai_adk/templates/.moai/config.json +6 -1
- moai_adk/templates/.moai/hooks/install.sh +79 -0
- moai_adk/templates/.moai/hooks/pre-commit.sh +66 -0
- moai_adk/templates/CLAUDE.md +39 -40
- moai_adk/templates/src/moai_adk/core/__init__.py +5 -0
- moai_adk/templates/src/moai_adk/core/tags/__init__.py +87 -0
- moai_adk/templates/src/moai_adk/core/tags/ci_validator.py +435 -0
- moai_adk/templates/src/moai_adk/core/tags/cli.py +283 -0
- moai_adk/templates/src/moai_adk/core/tags/pre_commit_validator.py +355 -0
- moai_adk/templates/src/moai_adk/core/tags/reporter.py +959 -0
- moai_adk/templates/src/moai_adk/core/tags/validator.py +897 -0
- {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/METADATA +226 -1
- {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/RECORD +83 -50
- moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -313
- moai_adk/templates/.moai/memory/config-schema.md +0 -444
- moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
- moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/__init__.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/checkpoint.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/context.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/tags.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/__init__.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/notification.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/tool.py +0 -0
- /moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/user.py +0 -0
- /moai_adk/templates/.moai/memory/{issue-label-mapping.md → ISSUE-LABEL-MAPPING.md} +0 -0
- {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/WHEEL +0 -0
- {moai_adk-0.8.1.dist-info → moai_adk-0.8.2.dist-info}/entry_points.txt +0 -0
- {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
|
-
##
|
|
3
|
+
## Real-World EARS Examples
|
|
4
4
|
|
|
5
|
-
###
|
|
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
|
|
19
|
-
**SR-002**: WHILE
|
|
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
|
-
###
|
|
26
|
-
**
|
|
27
|
-
**
|
|
28
|
-
**
|
|
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
|
-
###
|
|
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
|
-
###
|
|
52
|
-
**
|
|
53
|
-
**
|
|
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
|
-
##
|
|
58
|
+
## Complete SPEC Examples
|
|
59
59
|
|
|
60
|
-
###
|
|
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-
|
|
68
|
-
updated: 2025-10-
|
|
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-
|
|
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**:
|
|
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
|
|
100
|
+
**ER-001**: WHEN a GET request is sent to /hello, the system shall return JSON `{"message": "Hello, World!"}`.
|
|
101
101
|
|
|
102
|
-
###
|
|
102
|
+
### Unwanted Behaviors
|
|
103
103
|
|
|
104
|
-
**
|
|
104
|
+
**UB-001**: Response time shall not exceed 50ms.
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
###
|
|
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-
|
|
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% (
|
|
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-
|
|
165
|
-
- **INITIAL**: JWT
|
|
164
|
+
### v0.0.1 (2025-10-29)
|
|
165
|
+
- **INITIAL**: JWT authentication SPEC draft created
|
|
166
166
|
- **AUTHOR**: @Goos
|
|
167
|
-
- **SCOPE**:
|
|
168
|
-
- **CONTEXT**: 2025
|
|
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**:
|
|
188
|
-
2. **Secret Management**: JWT
|
|
189
|
-
3. **Clock Sync**:
|
|
190
|
-
4. **Password Policy**:
|
|
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**:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
218
|
+
**OF-001**: WHERE multi-factor authentication is enabled, the system can require OTP verification after password confirmation.
|
|
219
219
|
|
|
220
|
-
**OF-002**: WHERE
|
|
220
|
+
**OF-002**: WHERE session logging is enabled, the system can record login timestamp and IP address.
|
|
221
221
|
|
|
222
|
-
###
|
|
222
|
+
### Unwanted Behaviors
|
|
223
223
|
|
|
224
|
-
**
|
|
224
|
+
**UB-001**: IF a token has expired, THEN the system shall deny access and return HTTP 401.
|
|
225
225
|
|
|
226
|
-
**
|
|
226
|
+
**UB-002**: IF 5 or more login failures occur within 10 minutes, THEN the system shall temporarily lock the account.
|
|
227
227
|
|
|
228
|
-
**
|
|
228
|
+
**UB-003**: Access token lifetime shall not exceed 15 minutes.
|
|
229
229
|
|
|
230
|
-
**
|
|
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
|
-
#
|
|
250
|
+
# Check for duplicate IDs
|
|
251
251
|
rg '@SPEC:AUTH' -n .moai/specs/
|
|
252
252
|
rg 'AUTH-001' -n
|
|
253
253
|
|
|
254
|
-
#
|
|
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-
|
|
261
|
-
**Context**:
|
|
262
|
-
**Decision**: JWT
|
|
263
|
-
**Alternatives Considered**:
|
|
264
|
-
-
|
|
265
|
-
- OAuth 2.0 (
|
|
266
|
-
**Consequences**:
|
|
267
|
-
- ✅
|
|
268
|
-
- ✅
|
|
269
|
-
- ❌
|
|
270
|
-
|
|
271
|
-
### Decision 2:
|
|
272
|
-
**Context**:
|
|
273
|
-
**Decision**: 15
|
|
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
|
|
282
|
-
| ER-001 |
|
|
283
|
-
| ER-002 |
|
|
284
|
-
| SR-001 |
|
|
285
|
-
|
|
|
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
|
-
###
|
|
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):
|
|
299
|
-
-
|
|
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**:
|
|
303
|
+
**UR-001**: The system shall respond within 200ms for 95% of requests.
|
|
304
304
|
```
|
|
305
305
|
|
|
306
|
-
###
|
|
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
|
|
316
|
-
| ER-001 |
|
|
317
|
-
| ER-002 |
|
|
318
|
-
| SR-001 |
|
|
319
|
-
|
|
|
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
|
-
###
|
|
322
|
+
### Pattern 3: Decision Log
|
|
323
323
|
|
|
324
|
-
|
|
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-
|
|
330
|
-
**Context**:
|
|
331
|
-
**Decision**: JWT
|
|
332
|
-
**Alternatives Considered**:
|
|
333
|
-
-
|
|
334
|
-
- OAuth 2.0 (
|
|
335
|
-
**Consequences**:
|
|
336
|
-
- ✅
|
|
337
|
-
- ✅
|
|
338
|
-
- ❌
|
|
339
|
-
|
|
340
|
-
### Decision 2:
|
|
341
|
-
**Context**:
|
|
342
|
-
**Decision**: 15
|
|
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
|
-
###
|
|
351
|
+
### Issue: "Duplicate SPEC ID detected"
|
|
352
352
|
|
|
353
|
-
|
|
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
|
-
#
|
|
361
|
-
#
|
|
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
|
-
|
|
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
|
-
###
|
|
376
|
+
### Issue: "HISTORY section missing version entry"
|
|
377
377
|
|
|
378
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
406
|
+
### Issue: "EARS pattern mixing"
|
|
407
407
|
|
|
408
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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. **
|
|
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-
|
|
465
|
-
updated: 2025-10-
|
|
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.
|
|
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. **
|
|
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
|
-
#
|
|
487
|
-
#
|
|
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.
|
|
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.
|
|
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
|
|
509
|
+
When `/alfred:1-plan` is called, the `spec-builder` agent uses this Skill to:
|
|
510
510
|
|
|
511
|
-
1.
|
|
512
|
-
2.
|
|
513
|
-
3.
|
|
514
|
-
4.
|
|
515
|
-
5.
|
|
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
|
-
↓ (
|
|
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
|
-
↓ (
|
|
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**:
|
|
534
|
-
- **tag-agent**: TAG
|
|
535
|
-
- **trust-checker**:
|
|
536
|
-
- **git-manager**:
|
|
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-
|
|
541
|
-
**Version**: 1.
|
|
540
|
+
**Last Updated**: 2025-10-29
|
|
541
|
+
**Version**: 1.2.0
|