moai-adk 0.8.0__py3-none-any.whl → 0.15.0__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 (207) hide show
  1. moai_adk/cli/commands/init.py +14 -2
  2. moai_adk/cli/commands/update.py +229 -60
  3. moai_adk/core/config/migration.py +1 -1
  4. moai_adk/core/issue_creator.py +313 -0
  5. moai_adk/core/project/detector.py +201 -12
  6. moai_adk/core/project/initializer.py +62 -1
  7. moai_adk/core/project/phase_executor.py +48 -6
  8. moai_adk/core/tags/__init__.py +86 -0
  9. moai_adk/core/tags/ci_validator.py +463 -0
  10. moai_adk/core/tags/cli.py +283 -0
  11. moai_adk/core/tags/generator.py +109 -0
  12. moai_adk/core/tags/inserter.py +99 -0
  13. moai_adk/core/tags/mapper.py +126 -0
  14. moai_adk/core/tags/parser.py +76 -0
  15. moai_adk/core/tags/pre_commit_validator.py +393 -0
  16. moai_adk/core/tags/reporter.py +956 -0
  17. moai_adk/core/tags/tags.py +149 -0
  18. moai_adk/core/tags/validator.py +897 -0
  19. moai_adk/core/template_engine.py +268 -0
  20. moai_adk/templates/.claude/agents/alfred/backend-expert.md +319 -0
  21. moai_adk/templates/.claude/agents/alfred/cc-manager.md +25 -2
  22. moai_adk/templates/.claude/agents/alfred/debug-helper.md +24 -12
  23. moai_adk/templates/.claude/agents/alfred/devops-expert.md +464 -0
  24. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +20 -13
  25. moai_adk/templates/.claude/agents/alfred/frontend-expert.md +357 -0
  26. moai_adk/templates/.claude/agents/alfred/git-manager.md +47 -16
  27. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +95 -15
  28. moai_adk/templates/.claude/agents/alfred/project-manager.md +78 -12
  29. moai_adk/templates/.claude/agents/alfred/quality-gate.md +28 -5
  30. moai_adk/templates/.claude/agents/alfred/skill-factory.md +30 -2
  31. moai_adk/templates/.claude/agents/alfred/spec-builder.md +133 -13
  32. moai_adk/templates/.claude/agents/alfred/tag-agent.md +104 -8
  33. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +133 -16
  34. moai_adk/templates/.claude/agents/alfred/trust-checker.md +27 -4
  35. moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +571 -0
  36. moai_adk/templates/.claude/commands/alfred/0-project.md +466 -125
  37. moai_adk/templates/.claude/commands/alfred/1-plan.md +208 -71
  38. moai_adk/templates/.claude/commands/alfred/2-run.md +276 -55
  39. moai_adk/templates/.claude/commands/alfred/3-sync.md +439 -53
  40. moai_adk/templates/.claude/commands/alfred/9-feedback.md +149 -0
  41. moai_adk/templates/.claude/hooks/alfred/core/project.py +361 -29
  42. moai_adk/templates/.claude/hooks/alfred/core/timeout.py +136 -0
  43. moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +108 -0
  44. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
  45. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +14 -6
  46. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +94 -0
  47. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +100 -0
  48. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +94 -0
  49. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +94 -0
  50. moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/__init__.py +2 -2
  51. moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/checkpoint.py +3 -3
  52. moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/context.py +5 -5
  53. moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +749 -0
  54. moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/tags.py +55 -23
  55. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
  56. moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +21 -0
  57. moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +154 -0
  58. moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/session.py +28 -15
  59. moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/tool.py +3 -6
  60. moai_adk/templates/.claude/hooks/alfred/{handlers → shared/handlers}/user.py +19 -0
  61. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +112 -0
  62. moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +1 -0
  63. moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +161 -0
  64. moai_adk/templates/.claude/settings.json +5 -5
  65. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +70 -0
  66. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +62 -0
  67. moai_adk/templates/{.moai/memory/CLAUDE-AGENTS-GUIDE.md → .claude/skills/moai-alfred-agent-guide/reference.md} +34 -0
  68. moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +56 -0
  69. moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +28 -0
  70. moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +62 -0
  71. moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +28 -0
  72. moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +405 -0
  73. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +51 -0
  74. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +355 -0
  75. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +239 -0
  76. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +323 -0
  77. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +286 -0
  78. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +126 -0
  79. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +74 -0
  80. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +4 -0
  81. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +269 -0
  82. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +19 -0
  83. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +4 -0
  84. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +150 -0
  85. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +198 -0
  86. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +431 -0
  87. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +141 -0
  88. moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +89 -0
  89. moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +122 -0
  90. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +508 -0
  91. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +481 -0
  92. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +100 -0
  93. moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +273 -0
  94. moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +77 -0
  95. moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +265 -0
  96. moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +19 -0
  97. moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +4 -0
  98. moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +84 -0
  99. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +137 -0
  100. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +219 -0
  101. moai_adk/templates/.claude/skills/{moai-spec-authoring → moai-alfred-spec-authoring}/examples/validate-spec.sh +3 -3
  102. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +541 -0
  103. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +622 -0
  104. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +115 -0
  105. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +4 -0
  106. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +348 -0
  107. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +19 -0
  108. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +4 -0
  109. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +211 -0
  110. moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +288 -0
  111. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +19 -0
  112. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +4 -0
  113. moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/SKILL.md +3 -3
  114. moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +802 -0
  115. moai_adk/templates/.claude/skills/moai-design-systems/examples.md +1238 -0
  116. moai_adk/templates/.claude/skills/moai-design-systems/reference.md +673 -0
  117. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +17 -13
  118. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +9 -6
  119. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +15 -12
  120. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +14 -12
  121. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +14 -11
  122. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +10 -8
  123. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +15 -12
  124. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +13 -11
  125. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +16 -10
  126. moai_adk/templates/.claude/skills/moai-project-documentation.md +622 -0
  127. moai_adk/templates/.git-hooks/pre-push +143 -0
  128. moai_adk/templates/.github/workflows/c-tag-validation.yml +11 -0
  129. moai_adk/templates/.github/workflows/cpp-tag-validation.yml +11 -0
  130. moai_adk/templates/.github/workflows/csharp-tag-validation.yml +11 -0
  131. moai_adk/templates/.github/workflows/dart-tag-validation.yml +11 -0
  132. moai_adk/templates/.github/workflows/go-tag-validation.yml +130 -0
  133. moai_adk/templates/.github/workflows/java-tag-validation.yml +11 -0
  134. moai_adk/templates/.github/workflows/javascript-tag-validation.yml +135 -0
  135. moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +11 -0
  136. moai_adk/templates/.github/workflows/moai-gitflow.yml +166 -3
  137. moai_adk/templates/.github/workflows/moai-release-create.yml +100 -0
  138. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +188 -0
  139. moai_adk/templates/.github/workflows/php-tag-validation.yml +11 -0
  140. moai_adk/templates/.github/workflows/python-tag-validation.yml +118 -0
  141. moai_adk/templates/.github/workflows/release.yml +118 -0
  142. moai_adk/templates/.github/workflows/ruby-tag-validation.yml +11 -0
  143. moai_adk/templates/.github/workflows/rust-tag-validation.yml +11 -0
  144. moai_adk/templates/.github/workflows/shell-tag-validation.yml +11 -0
  145. moai_adk/templates/.github/workflows/spec-issue-sync.yml +206 -35
  146. moai_adk/templates/.github/workflows/swift-tag-validation.yml +11 -0
  147. moai_adk/templates/.github/workflows/tag-report.yml +269 -0
  148. moai_adk/templates/.github/workflows/tag-validation.yml +186 -0
  149. moai_adk/templates/.github/workflows/typescript-tag-validation.yml +154 -0
  150. moai_adk/templates/.moai/config.json +21 -2
  151. moai_adk/templates/CLAUDE.md +972 -78
  152. moai_adk/templates/workflows/go-tag-validation.yml +30 -0
  153. moai_adk/templates/workflows/javascript-tag-validation.yml +41 -0
  154. moai_adk/templates/workflows/python-tag-validation.yml +42 -0
  155. moai_adk/templates/workflows/typescript-tag-validation.yml +31 -0
  156. moai_adk/utils/banner.py +5 -5
  157. {moai_adk-0.8.0.dist-info → moai_adk-0.15.0.dist-info}/METADATA +1518 -161
  158. {moai_adk-0.8.0.dist-info → moai_adk-0.15.0.dist-info}/RECORD +183 -100
  159. moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -313
  160. moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
  161. moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -174
  162. moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
  163. moai_adk/templates/.claude/hooks/alfred/test_hook_output.py +0 -175
  164. moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -640
  165. moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -696
  166. moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -474
  167. moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +0 -137
  168. moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +0 -218
  169. moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +0 -541
  170. moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +0 -622
  171. moai_adk/templates/.github/ISSUE_TEMPLATE/spec.yml +0 -176
  172. moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
  173. moai_adk/templates/.moai/memory/DEVELOPMENT-GUIDE.md +0 -344
  174. moai_adk/templates/.moai/memory/GITFLOW-PROTECTION-POLICY.md +0 -220
  175. moai_adk/templates/.moai/memory/SPEC-METADATA.md +0 -356
  176. moai_adk/templates/.moai/memory/config-schema.md +0 -444
  177. moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
  178. moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
  179. moai_adk/templates/.moai/project/product.md +0 -161
  180. moai_adk/templates/.moai/project/structure.md +0 -156
  181. moai_adk/templates/.moai/project/tech.md +0 -227
  182. moai_adk/templates/__init__.py +0 -2
  183. /moai_adk/templates/{.moai/memory/CONFIG-SCHEMA.md → .claude/skills/moai-alfred-config-schema/reference.md} +0 -0
  184. /moai_adk/templates/{.moai/memory/CLAUDE-PRACTICES.md → .claude/skills/moai-alfred-practices/reference.md} +0 -0
  185. /moai_adk/templates/{.moai/memory/CLAUDE-RULES.md → .claude/skills/moai-alfred-rules/reference.md} +0 -0
  186. /moai_adk/templates/{.moai/memory/SKILLS-DESCRIPTION-POLICY.md → .claude/skills/moai-cc-skill-descriptions/reference.md} +0 -0
  187. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/CHECKLIST.md +0 -0
  188. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/EXAMPLES.md +0 -0
  189. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/INTERACTIVE-DISCOVERY.md +0 -0
  190. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/METADATA.md +0 -0
  191. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/PARALLEL-ANALYSIS-REPORT.md +0 -0
  192. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/PYTHON-VERSION-MATRIX.md +0 -0
  193. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/SKILL-FACTORY-WORKFLOW.md +0 -0
  194. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/SKILL-UPDATE-ADVISOR.md +0 -0
  195. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/STEP-BY-STEP-GUIDE.md +0 -0
  196. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/STRUCTURE.md +0 -0
  197. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/WEB-RESEARCH.md +0 -0
  198. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/reference.md +0 -0
  199. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/scripts/generate-structure.sh +0 -0
  200. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/scripts/validate-skill.sh +0 -0
  201. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/templates/SKILL_TEMPLATE.md +0 -0
  202. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/templates/examples-template.md +0 -0
  203. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/templates/reference-template.md +0 -0
  204. /moai_adk/templates/.claude/skills/{moai-skill-factory → moai-cc-skill-factory}/templates/scripts-template.sh +0 -0
  205. {moai_adk-0.8.0.dist-info → moai_adk-0.15.0.dist-info}/WHEEL +0 -0
  206. {moai_adk-0.8.0.dist-info → moai_adk-0.15.0.dist-info}/entry_points.txt +0 -0
  207. {moai_adk-0.8.0.dist-info → moai_adk-0.15.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,541 +0,0 @@
1
- # SPEC Authoring Examples
2
-
3
- ## 실전 EARS 예제
4
-
5
- ### 예제 1: E-commerce 체크아웃
6
-
7
- ```markdown
8
- ### Ubiquitous Requirements
9
- **UR-001**: 시스템은 장바구니를 제공해야 한다.
10
- **UR-002**: 시스템은 신용카드 결제를 지원해야 한다.
11
-
12
- ### Event-driven Requirements
13
- **ER-001**: WHEN 사용자가 장바구니에 아이템을 추가하면, 시스템은 장바구니 총액을 업데이트해야 한다.
14
- **ER-002**: WHEN 결제가 성공하면, 시스템은 주문 확인 이메일을 보내야 한다.
15
- **ER-003**: WHEN 재고가 부족하면, 시스템은 "품절" 메시지를 표시해야 한다.
16
-
17
- ### State-driven Requirements
18
- **SR-001**: WHILE 아이템이 장바구니에 있으면, 시스템은 30분 동안 재고를 예약해야 한다.
19
- **SR-002**: WHILE 결제가 처리 중이면, UI는 로딩 인디케이터를 표시해야 한다.
20
-
21
- ### Optional Features
22
- **OF-001**: WHERE 특급 배송이 선택된 경우, 시스템은 특급 배송 비용을 계산할 수 있다.
23
- **OF-002**: WHERE 선물 포장이 가능한 경우, 시스템은 선물 포장 옵션을 제공할 수 있다.
24
-
25
- ### Constraints
26
- **C-001**: IF 장바구니 총액이 $50 미만이면, THEN 시스템은 $5 배송료를 추가해야 한다.
27
- **C-002**: IF 3번 결제 실패 후, THEN 시스템은 주문을 1시간 동안 잠가야 한다.
28
- **C-003**: 주문 처리 시간은 5초를 초과하지 않아야 한다.
29
- ```
30
-
31
- ### 예제 2: 모바일 앱 푸시 알림
32
-
33
- ```markdown
34
- ### Ubiquitous Requirements
35
- **UR-001**: 앱은 푸시 알림을 지원해야 한다.
36
- **UR-002**: 앱은 사용자가 알림을 활성화/비활성화할 수 있도록 해야 한다.
37
-
38
- ### Event-driven Requirements
39
- **ER-001**: WHEN 새 메시지가 도착하면, 앱은 푸시 알림을 표시해야 한다.
40
- **ER-002**: WHEN 알림을 탭하면, 앱은 메시지 화면으로 이동해야 한다.
41
- **ER-003**: WHEN 알림 권한이 거부되면, 앱은 인앱 알림 배너를 표시해야 한다.
42
-
43
- ### State-driven Requirements
44
- **SR-001**: WHILE 앱이 포어그라운드 상태이면, 시스템은 푸시 알림 대신 인앱 배너를 표시해야 한다.
45
- **SR-002**: WHILE 방해 금지 모드가 활성화된 경우, 시스템은 모든 알림을 음소거해야 한다.
46
-
47
- ### Optional Features
48
- **OF-001**: WHERE 알림 사운드가 활성화된 경우, 시스템은 알림 사운드를 재생할 수 있다.
49
- **OF-002**: WHERE 알림 그룹화가 지원되는 경우, 시스템은 대화별로 알림을 그룹화할 수 있다.
50
-
51
- ### Constraints
52
- **C-001**: IF 10개 이상의 알림이 대기 중이면, THEN 시스템은 이를 요약 알림으로 그룹화해야 한다.
53
- **C-002**: 알림 전달 지연은 5초를 초과하지 않아야 한다.
54
- ```
55
-
56
- ---
57
-
58
- ## 완전한 SPEC 예제
59
-
60
- ### 예제 1: 최소 SPEC
61
-
62
- ```markdown
63
- ---
64
- id: HELLO-001
65
- version: 0.0.1
66
- status: draft
67
- created: 2025-10-23
68
- updated: 2025-10-23
69
- author: @Goos
70
- priority: low
71
- ---
72
-
73
- # @SPEC:HELLO-001: Hello World API
74
-
75
- ## HISTORY
76
-
77
- ### v0.0.1 (2025-10-23)
78
- - **INITIAL**: Hello World API SPEC 초안 생성
79
- - **AUTHOR**: @Goos
80
-
81
- ## Environment
82
-
83
- **Runtime**: Node.js 20.x
84
- **Framework**: Express.js
85
-
86
- ## Assumptions
87
-
88
- 1. 단일 엔드포인트 필요
89
- 2. 인증 불필요
90
- 3. JSON 응답 형식
91
-
92
- ## Requirements
93
-
94
- ### Ubiquitous Requirements
95
-
96
- **UR-001**: 시스템은 GET /hello 엔드포인트를 제공해야 한다.
97
-
98
- ### Event-driven Requirements
99
-
100
- **ER-001**: WHEN GET 요청이 /hello로 전송되면, 시스템은 JSON `{"message": "Hello, World!"}`를 반환해야 한다.
101
-
102
- ### Constraints
103
-
104
- **C-001**: 응답 시간은 50ms를 초과하지 않아야 한다.
105
- ```
106
-
107
- ### 예제 2: 프로덕션급 SPEC
108
-
109
- ```markdown
110
- ---
111
- id: AUTH-001
112
- version: 0.1.0
113
- status: completed
114
- created: 2025-10-23
115
- updated: 2025-10-30
116
- author: @Goos
117
- priority: high
118
- category: feature
119
- labels:
120
- - authentication
121
- - jwt
122
- - security
123
- depends_on:
124
- - USER-001
125
- - TOKEN-001
126
- blocks:
127
- - AUTH-002
128
- - PAYMENT-001
129
- related_issue: "https://github.com/modu-ai/moai-adk/issues/42"
130
- scope:
131
- packages:
132
- - src/core/auth
133
- - src/core/token
134
- - src/api/routes/auth
135
- files:
136
- - auth-service.ts
137
- - token-manager.ts
138
- - auth.routes.ts
139
- ---
140
-
141
- # @SPEC:AUTH-001: JWT Authentication System
142
-
143
- ## HISTORY
144
-
145
- ### v0.1.0 (2025-10-30)
146
- - **COMPLETED**: TDD 구현 완료
147
- - **AUTHOR**: @Goos
148
- - **EVIDENCE**: Commits 4c66076, 34e1bd9, 1dec08f
149
- - **TEST COVERAGE**: 89.13% (목표: 85%)
150
- - **QUALITY METRICS**:
151
- - Test Pass Rate: 100% (42/42 tests)
152
- - Linting: ruff ✅
153
- - Type Checking: mypy ✅
154
- - **TAG CHAIN**:
155
- - @SPEC:AUTH-001: 1 occurrence
156
- - @TEST:AUTH-001: 8 occurrences
157
- - @CODE:AUTH-001: 12 occurrences
158
-
159
- ### v0.0.2 (2025-10-25)
160
- - **REFINED**: 비밀번호 재설정 플로우 요구사항 추가
161
- - **REFINED**: 토큰 수명 제약 명확화
162
- - **AUTHOR**: @Goos
163
-
164
- ### v0.0.1 (2025-10-23)
165
- - **INITIAL**: JWT 인증 SPEC 초안 생성
166
- - **AUTHOR**: @Goos
167
- - **SCOPE**: 사용자 인증, 토큰 생성, 토큰 검증
168
- - **CONTEXT**: 2025년 4분기 제품 로드맵 요구사항
169
-
170
- ## Environment
171
-
172
- **Execution Context**:
173
- - Runtime: Node.js 20.x or later
174
- - Framework: Express.js
175
- - Database: PostgreSQL 15+
176
-
177
- **Technical Stack**:
178
- - JWT library: jsonwebtoken ^9.0.0
179
- - Hashing: bcrypt ^5.1.0
180
-
181
- **Constraints**:
182
- - Token lifetime: 15 minutes (access), 7 days (refresh)
183
- - Security: HTTPS required in production
184
-
185
- ## Assumptions
186
-
187
- 1. **User Storage**: 사용자 인증 정보는 PostgreSQL에 저장
188
- 2. **Secret Management**: JWT 시크릿은 환경변수로 관리
189
- 3. **Clock Sync**: 서버 시계는 NTP로 동기화
190
- 4. **Password Policy**: 가입 시 최소 8자 강제
191
-
192
- ## Requirements
193
-
194
- ### Ubiquitous Requirements
195
-
196
- **UR-001**: 시스템은 JWT 기반 인증을 제공해야 한다.
197
-
198
- **UR-002**: 시스템은 이메일과 비밀번호로 사용자 로그인을 지원해야 한다.
199
-
200
- **UR-003**: 시스템은 액세스 토큰과 리프레시 토큰을 발급해야 한다.
201
-
202
- ### Event-driven Requirements
203
-
204
- **ER-001**: WHEN 사용자가 유효한 인증 정보를 제출하면, 시스템은 15분 만료 시간을 가진 JWT 액세스 토큰을 발급해야 한다.
205
-
206
- **ER-002**: WHEN 토큰이 만료되면, 시스템은 HTTP 401 Unauthorized를 반환해야 한다.
207
-
208
- **ER-003**: WHEN 리프레시 토큰이 제시되면, 시스템은 리프레시 토큰이 유효한 경우 새 액세스 토큰을 발급해야 한다.
209
-
210
- ### State-driven Requirements
211
-
212
- **SR-001**: WHILE 사용자가 인증된 상태이면, 시스템은 보호된 리소스에 대한 접근을 허용해야 한다.
213
-
214
- **SR-002**: WHILE 토큰이 유효하면, 시스템은 토큰 클레임에서 사용자 ID를 추출해야 한다.
215
-
216
- ### Optional Features
217
-
218
- **OF-001**: WHERE 다중 인증이 활성화된 경우, 시스템은 비밀번호 확인 후 OTP 검증을 요구할 수 있다.
219
-
220
- **OF-002**: WHERE 세션 로깅이 활성화된 경우, 시스템은 로그인 타임스탬프와 IP 주소를 기록할 수 있다.
221
-
222
- ### Constraints
223
-
224
- **C-001**: IF 토큰이 만료되었다면, 시스템은 접근을 거부하고 HTTP 401을 반환해야 한다.
225
-
226
- **C-002**: IF 10분 이내에 5번 이상 로그인 실패가 발생하면, 시스템은 임시로 계정을 잠가야 한다.
227
-
228
- **C-003**: 액세스 토큰은 15분 수명을 초과하지 않아야 한다.
229
-
230
- **C-004**: 리프레시 토큰은 7일 수명을 초과하지 않아야 한다.
231
-
232
- ## Traceability (@TAG Chain)
233
-
234
- ### TAG 체인 구조
235
- ```
236
- @SPEC:AUTH-001 (이 문서)
237
-
238
- @TEST:AUTH-001 (tests/auth/service.test.ts)
239
-
240
- @CODE:AUTH-001 (src/auth/service.ts, src/auth/token-manager.ts)
241
-
242
- @DOC:AUTH-001 (docs/api/authentication.md)
243
- ```
244
-
245
- ### 검증 명령어
246
- ```bash
247
- # SPEC TAG 검증
248
- rg '@SPEC:AUTH-001' -n .moai/specs/
249
-
250
- # 중복 ID 확인
251
- rg '@SPEC:AUTH' -n .moai/specs/
252
- rg 'AUTH-001' -n
253
-
254
- # 전체 TAG 체인 스캔
255
- rg '@(SPEC|TEST|CODE|DOC):AUTH-001' -n
256
- ```
257
-
258
- ## Decision Log
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 모범 사례
276
-
277
- ## Requirements Traceability Matrix
278
-
279
- | Req ID | Description | Test Cases | Status |
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 | ✅ |
286
- ```
287
-
288
- ---
289
-
290
- ## 고급 패턴
291
-
292
- ### 패턴 1: 버전화된 요구사항
293
-
294
- 요구사항이 버전 간 변경될 때 진화 과정 문서화:
295
-
296
- ```markdown
297
- ### v0.2.0 (2025-11-15)
298
- **UR-001** (CHANGED): 시스템은 요청의 99%에 대해 200ms 이내에 응답해야 한다.
299
- - 이전 (v0.1.0): 요청의 95%
300
- - 근거: 사용자 피드백 기반 성능 개선
301
-
302
- ### v0.1.0 (2025-10-30)
303
- **UR-001**: 시스템은 요청의 95%에 대해 200ms 이내에 응답해야 한다.
304
- ```
305
-
306
- ### 패턴 2: 요구사항 추적 매트릭스
307
-
308
- 요구사항을 테스트 케이스에 명시적으로 연결:
309
-
310
- ```markdown
311
- ## Requirements Traceability Matrix
312
-
313
- | Req ID | Description | Test Cases | Status |
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 | ✅ |
320
- ```
321
-
322
- ### 패턴 3: 결정 로그
323
-
324
- SPEC 내에서 아키텍처 결정 문서화:
325
-
326
- ```markdown
327
- ## Decision Log
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 모범 사례
345
- ```
346
-
347
- ---
348
-
349
- ## 트러블슈팅
350
-
351
- ### 이슈: "중복 SPEC ID 감지됨"
352
-
353
- **증상**: `rg "@SPEC:AUTH-001" -n`이 여러 결과 반환
354
-
355
- **해결책**:
356
- ```bash
357
- # 모든 발생 찾기
358
- rg "@SPEC:AUTH-001" -n .moai/specs/
359
-
360
- # 하나의 SPEC 유지, 나머지 이름 변경
361
- # 코드/테스트에서 TAG 참조 업데이트
362
- rg '@SPEC:AUTH-001' -l src/ tests/ | xargs sed -i 's/@SPEC:AUTH-001/@SPEC:AUTH-002/g'
363
- ```
364
-
365
- ### 이슈: "버전 번호가 상태와 일치하지 않음"
366
-
367
- **증상**: `status: completed`이지만 `version: 0.0.1`
368
-
369
- **해결책**:
370
- ```yaml
371
- # 완료를 반영하도록 버전 업데이트
372
- version: 0.1.0 # 구현 완료
373
- status: completed
374
- ```
375
-
376
- ### 이슈: "HISTORY 섹션 버전 누락"
377
-
378
- **증상**: 콘텐츠가 변경되었지만 새 HISTORY 엔트리 없음
379
-
380
- **해결책**:
381
- ```markdown
382
- ## HISTORY
383
-
384
- ### v0.0.2 (2025-10-25) ← 새 엔트리 추가
385
- - **REFINED**: XYZ 요구사항 업데이트
386
- - **AUTHOR**: @YourHandle
387
-
388
- ### v0.0.1 (2025-10-23)
389
- - **INITIAL**: 첫 초안
390
- ```
391
-
392
- ### 이슈: "작성자 필드 @ 접두사 누락"
393
-
394
- **증상**: `author: Goos` 대신 `author: @Goos`
395
-
396
- **해결책**:
397
- ```yaml
398
- # 잘못됨
399
- author: Goos
400
- author: goos
401
-
402
- # 올바름
403
- author: @Goos
404
- ```
405
-
406
- ### 이슈: "EARS 패턴 혼합"
407
-
408
- **증상**: "WHEN 사용자가 로그인 상태이면, WHILE 세션이 활성 상태이면, 시스템은..."
409
-
410
- **해결책**:
411
- ```markdown
412
- # 나쁨 (패턴 혼합)
413
- **ER-001**: WHEN 사용자가 로그인하면, WHILE 세션이 활성 상태이면, 시스템은 접근을 허용해야 한다.
414
-
415
- # 좋음 (요구사항 분리)
416
- **ER-001**: WHEN 사용자가 성공적으로 로그인하면, 시스템은 세션을 생성해야 한다.
417
- **SR-001**: WHILE 세션이 활성 상태이면, 시스템은 보호된 리소스에 대한 접근을 허용해야 한다.
418
- ```
419
-
420
- ---
421
-
422
- ## 모범 사례 요약
423
-
424
- ### ✅ DO (해야 할 것)
425
-
426
- 1. **새 SPEC 생성 전 중복 ID 확인**
427
- ```bash
428
- rg "@SPEC:AUTH-001" -n .moai/specs/
429
- rg "AUTH-001" -n
430
- ```
431
-
432
- 2. **모든 콘텐츠 변경 시 HISTORY 업데이트**
433
- ```markdown
434
- ### v0.0.2 (2025-10-25)
435
- - **REFINED**: XYZ 추가
436
- - **AUTHOR**: @YourHandle
437
- ```
438
-
439
- 3. **버전 생애주기 엄격히 따르기**
440
- ```
441
- 0.0.1 → 0.0.2 → ... → 0.1.0 → 0.1.1 → ... → 1.0.0
442
- (draft) (draft) (completed) (patches) (stable)
443
- ```
444
-
445
- 4. **작성자 필드에 @ 접두사 사용**
446
- ```yaml
447
- author: @Goos # 올바름
448
- ```
449
-
450
- 5. **테스트 가능하고 측정 가능한 요구사항 작성**
451
- ```markdown
452
- # 좋음
453
- **UR-001**: API 응답 시간은 요청의 95%에 대해 200ms를 초과하지 않아야 한다.
454
-
455
- # 나쁨
456
- **UR-001**: 시스템은 빨라야 한다.
457
- ```
458
-
459
- 6. **7개 필수 메타데이터 필드 모두 포함**
460
- ```yaml
461
- id: AUTH-001
462
- version: 0.0.1
463
- status: draft
464
- created: 2025-10-23
465
- updated: 2025-10-23
466
- author: @Goos
467
- priority: high
468
- ```
469
-
470
- 7. **EARS 패턴 일관되게 사용**
471
-
472
- ### ❌ DON'T (하지 말아야 할 것)
473
-
474
- 1. **할당 후 SPEC ID 변경하지 않기**
475
- - TAG 체인 파괴
476
- - 기존 코드/테스트 고아화
477
- - Git 히스토리 손실
478
-
479
- 2. **HISTORY 업데이트 건너뛰지 않기**
480
- - 변경 근거 손실
481
- - 불명확한 버전 진행
482
- - 감사 추적 격차
483
-
484
- 3. **정당화 없이 버전 번호 건너뛰지 않기**
485
- ```markdown
486
- # 나쁨: 0.0.1 → 1.0.0
487
- # 좋음: 0.0.1 → 0.0.2 → ... → 0.1.0 → 1.0.0
488
- ```
489
-
490
- 4. **모호한 요구사항 작성하지 않기**
491
- - "빠른", "사용자 친화적", "좋은" 같은 용어 피하기
492
- - 측정 가능한 기준 사용
493
-
494
- 5. **하나의 요구사항에 여러 EARS 패턴 혼합하지 않기**
495
-
496
- 6. **제출 전 검증 잊지 않기**
497
- ```bash
498
- ./validate-spec.sh .moai/specs/SPEC-AUTH-001
499
- ```
500
-
501
- 7. **중복 SPEC ID 생성하지 않기**
502
-
503
- ---
504
-
505
- ## 통합 워크플로우
506
-
507
- ### `/alfred:1-plan`과 통합
508
-
509
- `/alfred:1-plan`이 호출되면, `spec-builder` 에이전트는 이 Skill을 사용하여:
510
-
511
- 1. **분석**: 사용자 요청 및 프로젝트 컨텍스트 분석
512
- 2. **생성**: 적절한 구조로 SPEC 후보 생성
513
- 3. **검증**: 메타데이터 완전성 검증
514
- 4. **생성**: EARS 요구사항으로 `.moai/specs/SPEC-{ID}/spec.md` 생성
515
- 5. **초기화**: Git 워크플로우 (기능 브랜치, Draft PR)
516
-
517
- ### spec-builder 통합 지점
518
-
519
- ```markdown
520
- Phase 1: SPEC 후보 생성
521
- ↓ (메타데이터 구조를 위해 moai-spec-authoring 사용)
522
- Phase 2: 사용자 승인
523
-
524
- Phase 3: SPEC 파일 생성
525
- ↓ (이 Skill의 EARS 템플릿 적용)
526
- Phase 4: Git 워크플로우 초기화
527
-
528
- Phase 5: /alfred:2-run으로 핸드오프
529
- ```
530
-
531
- ### 에이전트 협업
532
-
533
- - **spec-builder**: 이 Skill의 템플릿을 사용하여 SPEC 생성
534
- - **tag-agent**: TAG 형식 및 고유성 검증
535
- - **trust-checker**: 메타데이터 완전성 확인
536
- - **git-manager**: 기능 브랜치 및 Draft PR 생성
537
-
538
- ---
539
-
540
- **Last Updated**: 2025-10-27
541
- **Version**: 1.1.0