aiwf 0.3.5 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/.aiwf/00_PROJECT_MANIFEST.md +29 -16
  2. package/.aiwf/02_REQUIREMENTS/M03_Simone_Integration_Enhancement/M03_milestone_meta.md +55 -0
  3. package/.aiwf/02_REQUIREMENTS/M03_Simone_Integration_Enhancement/SPECS_AIWF_Simplified_Plan.md +221 -0
  4. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/S03_M02_sprint_meta.md +0 -1
  5. package/.aiwf/test-results-s02.json +5 -5
  6. package/.claude/commands/aiwf/aiwf_add_task_to_sprint.md +283 -0
  7. package/.claude/commands/aiwf/aiwf_install_git_hooks.md +63 -0
  8. package/.claude/commands/aiwf/aiwf_link_feature_branch.md +43 -0
  9. package/.claude/commands/aiwf/aiwf_link_feature_commit.md +46 -0
  10. package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_create_testcase.md +561 -0
  11. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_create_testcase.md +561 -0
  12. package/package.json +1 -1
  13. package/src/cli/index.js +17 -2
  14. package/src/commands/create-project.js +10 -7
  15. package/src/commands/sprint-task.js +262 -0
  16. package/src/lib/file-downloader.js +194 -33
  17. package/src/lib/installer.js +52 -15
  18. package/tests/integration/test-persona-system/.aiwf/metrics/metrics.json +833 -0
  19. package/tests/unit/sprint-task.test.js +172 -0
  20. package/.aiwf/sessions/session_1752877859489_1t7n2fhdb.json +0 -7
  21. package/.aiwf/sessions/session_1752877859515_cwdv211ry.json +0 -7
  22. package/.aiwf/sessions/session_1752877860664_huziadmbo.json +0 -7
  23. package/.aiwf/sessions/session_1752877860666_kyr5u1np6.json +0 -7
  24. package/.aiwf/sessions/session_1752877861848_9yinepw3t.json +0 -7
  25. package/.aiwf/sessions/session_1752877861874_y32sputuc.json +0 -7
  26. package/.aiwf/sessions/session_1752877862685_ivxbl5rhz.json +0 -7
  27. package/.aiwf/sessions/session_1752877862820_wnq4glvxi.json +0 -7
  28. package/.aiwf/sessions/session_1752877864632_3ebnpaelb.json +0 -7
  29. package/.aiwf/sessions/session_1752877864879_b9zgjcb7d.json +0 -7
  30. package/.aiwf/sessions/session_1752877865533_x14m1vodi.json +0 -7
  31. package/.aiwf/sessions/session_1752877865562_gkoh19n7d.json +0 -7
  32. package/.aiwf/sessions/session_1752877866333_wp8qpdcoh.json +0 -7
  33. package/.aiwf/sessions/session_1752877866509_dawntfpab.json +0 -7
  34. package/.aiwf/sessions/session_1752877866890_plc5vfucl.json +0 -7
  35. package/.aiwf/sessions/session_1752877866895_ga8hmq3oi.json +0 -7
  36. package/.aiwf/sessions/session_1752877867761_ayjp4v5f5.json +0 -7
  37. package/.aiwf/sessions/session_1752877867892_lfz6jy252.json +0 -7
  38. package/.aiwf/sessions/session_1752877868139_7bqd9ubli.json +0 -7
  39. package/.aiwf/sessions/session_1752877868162_zq3ofjbsh.json +0 -7
  40. package/.aiwf/sessions/session_1752877869054_7rlgm9jt6.json +0 -7
  41. package/.aiwf/sessions/session_1752877869477_ax3nhbxzr.json +0 -7
  42. package/.aiwf/sessions/session_1752877870095_6hgp4vl1e.json +0 -7
  43. package/.aiwf/sessions/session_1752877870381_qfcrdg4li.json +0 -7
  44. package/.aiwf/sessions/session_1752877871895_pgd5vllhz.json +0 -7
  45. package/.aiwf/sessions/session_1752877872199_jbhv2g2da.json +0 -7
  46. package/.aiwf/sessions/session_1752877872680_x04wpffu6.json +0 -7
  47. package/.aiwf/sessions/session_1752877872895_3y4vbeauo.json +0 -7
  48. package/.aiwf/sessions/session_1752877873178_3maolzc6b.json +0 -7
  49. package/.aiwf/sessions/session_1752877873180_ytm83j07f.json +0 -7
  50. package/.aiwf/sessions/session_1752877874217_dp56c9t42.json +0 -7
  51. package/.aiwf/sessions/session_1752877874415_epwp1g1og.json +0 -7
  52. package/.aiwf/sessions/session_1752877874454_heicyuryb.json +0 -7
  53. package/.aiwf/sessions/session_1752877874869_1c2illeu5.json +0 -7
  54. package/.aiwf/sessions/session_1752877874879_k1vo4vxyx.json +0 -7
  55. package/.aiwf/sessions/session_1752877874913_bwgyiz9bp.json +0 -7
  56. package/.aiwf/sessions/session_1752877876218_44807kztz.json +0 -7
  57. package/.aiwf/sessions/session_1752877876515_qkhjv5kpw.json +0 -7
  58. package/.aiwf/sessions/session_1752877876543_p605aud1m.json +0 -7
  59. package/.aiwf/sessions/session_1752877876819_l65w7ifck.json +0 -7
  60. package/.aiwf/sessions/session_1752877876867_xrhzss4we.json +0 -7
  61. package/.aiwf/sessions/session_1752877876872_u7aso54qb.json +0 -7
  62. package/.aiwf/sessions/session_1752877877705_telnfg4o6.json +0 -7
  63. package/.aiwf/sessions/session_1752877878285_6s45im2ib.json +0 -7
  64. package/.aiwf/sessions/session_1752877878506_v0dvguqhz.json +0 -7
  65. package/.aiwf/sessions/session_1752877878581_3ri3yc66a.json +0 -7
  66. package/.aiwf/sessions/session_1752877878756_a82x9s2pd.json +0 -7
  67. package/.aiwf/sessions/session_1752877878886_20pjsfour.json +0 -7
  68. package/.aiwf/sessions/session_1752877880266_fm1ydjw0g.json +0 -7
  69. package/.aiwf/sessions/session_1752877881149_xbat4z03d.json +0 -7
  70. package/.aiwf/sessions/session_1752877881551_qy5sic9qs.json +0 -7
  71. package/.aiwf/sessions/session_1752877881554_24ugd96wu.json +0 -7
  72. package/.aiwf/sessions/session_1752877881797_e9mm25uh0.json +0 -7
  73. package/.aiwf/sessions/session_1752877881822_bxvjj8c9g.json +0 -7
  74. package/.aiwf/sessions/session_1752877881890_jv7l6jve3.json +0 -7
  75. package/.aiwf/sessions/session_1752877881991_f0qugdtcq.json +0 -7
  76. package/.aiwf/sessions/session_1752877883387_0bvw9rvnx.json +0 -7
  77. package/.aiwf/sessions/session_1752877883820_q6g2md2up.json +0 -7
  78. package/.aiwf/sessions/session_1752877884393_sqr7trvjl.json +0 -7
  79. package/.aiwf/sessions/session_1752877884500_whtypmzlf.json +0 -7
  80. package/.aiwf/sessions/session_1752877884645_y9mvvxli1.json +0 -7
  81. package/.aiwf/sessions/session_1752877884733_hk46eenel.json +0 -7
  82. package/.aiwf/sessions/session_1752877884738_c62j6214r.json +0 -7
  83. package/.aiwf/sessions/session_1752877884771_temhxehoz.json +0 -7
  84. package/.aiwf/sessions/session_1752877885643_6v5fcktc7.json +0 -7
  85. package/.aiwf/sessions/session_1752877886426_ee8di2fqh.json +0 -7
  86. package/.aiwf/sessions/session_1752877886549_3xj6tdoew.json +0 -7
  87. package/.aiwf/sessions/session_1752877886604_aj80yyfco.json +0 -7
  88. package/.aiwf/sessions/session_1752877886702_2b8841vyg.json +0 -7
  89. package/.aiwf/sessions/session_1752877886712_ntqc8b8bz.json +0 -7
  90. package/.aiwf/sessions/session_1752877886968_946m8tbw6.json +0 -7
  91. package/.aiwf/sessions/session_1752877887008_wg6zfg8dn.json +0 -7
  92. package/.aiwf/sessions/session_1752877888479_ciiu2qiqs.json +0 -7
  93. package/.aiwf/sessions/session_1752877889330_ravg8l66k.json +0 -7
  94. package/.aiwf/sessions/session_1752877889542_7zepkhjkc.json +0 -7
  95. package/.aiwf/sessions/session_1752877889638_ev4htqiu0.json +0 -7
  96. package/.aiwf/sessions/session_1752877889956_szphy2qma.json +0 -7
  97. package/.aiwf/sessions/session_1752877890220_o6aaa57tt.json +0 -7
  98. package/.aiwf/sessions/session_1752877890527_v2loy5vu1.json +0 -7
  99. package/.aiwf/sessions/session_1752877890572_cwq8fiuma.json +0 -7
  100. package/.aiwf/sessions/session_1752877892200_sgcwq1alt.json +0 -7
  101. package/.aiwf/sessions/session_1752877892268_v8kexpbc5.json +0 -7
  102. package/.aiwf/sessions/session_1752877892384_1gbbgrp4y.json +0 -7
  103. package/.aiwf/sessions/session_1752877893568_9p2n5p31a.json +0 -7
  104. package/.aiwf/sessions/session_1752877893727_un34a5tvp.json +0 -7
  105. package/.aiwf/sessions/session_1752877893778_01j79sw9i.json +0 -7
  106. package/.aiwf/sessions/session_1752877894053_jrhba6wko.json +0 -7
  107. package/.aiwf/sessions/session_1752877894082_x3bghawox.json +0 -7
  108. package/.aiwf/sessions/session_1752877894500_iytiav2ku.json +0 -7
  109. package/.aiwf/sessions/session_1752877894667_ucn0gc2ge.json +0 -7
  110. package/test-token-system.js +0 -88
  111. package/tests/temp_invalid_json/invalid.json +0 -1
  112. /package/{.aiwf/templates → templates}/README.md +0 -0
  113. /package/{.aiwf/templates → templates}/api-server/config.json +0 -0
  114. /package/{.aiwf/templates → templates}/api-server/template/.aiwf/config.json +0 -0
  115. /package/{.aiwf/templates → templates}/api-server/template/.aiwf/feature-ledger.json +0 -0
  116. /package/{.aiwf/templates → templates}/api-server/template/.aiwf/personas/backend-engineer.json +0 -0
  117. /package/{.aiwf/templates → templates}/api-server/template/.aiwf/scripts/cli.js +0 -0
  118. /package/{.aiwf/templates → templates}/api-server/template/.env.example +0 -0
  119. /package/{.aiwf/templates → templates}/api-server/template/.eslintrc.json +0 -0
  120. /package/{.aiwf/templates → templates}/api-server/template/README.md +0 -0
  121. /package/{.aiwf/templates → templates}/api-server/template/jest.config.js +0 -0
  122. /package/{.aiwf/templates → templates}/api-server/template/nodemon.json +0 -0
  123. /package/{.aiwf/templates → templates}/api-server/template/package.json +0 -0
  124. /package/{.aiwf/templates → templates}/api-server/template/src/app.ts +0 -0
  125. /package/{.aiwf/templates → templates}/api-server/template/src/config/swagger.ts +0 -0
  126. /package/{.aiwf/templates → templates}/api-server/template/src/controllers/aiwfController.ts +0 -0
  127. /package/{.aiwf/templates → templates}/api-server/template/src/controllers/authController.ts +0 -0
  128. /package/{.aiwf/templates → templates}/api-server/template/src/controllers/statusController.ts +0 -0
  129. /package/{.aiwf/templates → templates}/api-server/template/src/index.ts +0 -0
  130. /package/{.aiwf/templates → templates}/api-server/template/src/middleware/aiwfMiddleware.ts +0 -0
  131. /package/{.aiwf/templates → templates}/api-server/template/src/middleware/authMiddleware.ts +0 -0
  132. /package/{.aiwf/templates → templates}/api-server/template/src/middleware/errorHandler.ts +0 -0
  133. /package/{.aiwf/templates → templates}/api-server/template/src/middleware/notFoundHandler.ts +0 -0
  134. /package/{.aiwf/templates → templates}/api-server/template/src/middleware/requestLogger.ts +0 -0
  135. /package/{.aiwf/templates → templates}/api-server/template/src/routes/aiwf.ts +0 -0
  136. /package/{.aiwf/templates → templates}/api-server/template/src/routes/index.ts +0 -0
  137. /package/{.aiwf/templates → templates}/api-server/template/src/routes/v1/index.ts +0 -0
  138. /package/{.aiwf/templates → templates}/api-server/template/src/utils/logger.ts +0 -0
  139. /package/{.aiwf/templates → templates}/api-server/template/tests/app.test.ts +0 -0
  140. /package/{.aiwf/templates → templates}/api-server/template/tsconfig.json +0 -0
  141. /package/{.aiwf/templates → templates}/npm-library/config.json +0 -0
  142. /package/{.aiwf/templates → templates}/npm-library/template/LICENSE +0 -0
  143. /package/{.aiwf/templates → templates}/npm-library/template/README.md +0 -0
  144. /package/{.aiwf/templates → templates}/npm-library/template/package.json +0 -0
  145. /package/{.aiwf/templates → templates}/web-app/config.json +0 -0
  146. /package/{.aiwf/templates → templates}/web-app/template/.aiwf/config.json +0 -0
  147. /package/{.aiwf/templates → templates}/web-app/template/.aiwf/feature-ledger.json +0 -0
  148. /package/{.aiwf/templates → templates}/web-app/template/.aiwf/personas/fullstack-developer.json +0 -0
  149. /package/{.aiwf/templates → templates}/web-app/template/.aiwf/scripts/cli.js +0 -0
  150. /package/{.aiwf/templates → templates}/web-app/template/.eslintrc.cjs +0 -0
  151. /package/{.aiwf/templates → templates}/web-app/template/README.md +0 -0
  152. /package/{.aiwf/templates → templates}/web-app/template/index.html +0 -0
  153. /package/{.aiwf/templates → templates}/web-app/template/package.json +0 -0
  154. /package/{.aiwf/templates → templates}/web-app/template/postcss.config.js +0 -0
  155. /package/{.aiwf/templates → templates}/web-app/template/public/vite.svg +0 -0
  156. /package/{.aiwf/templates → templates}/web-app/template/src/App.tsx +0 -0
  157. /package/{.aiwf/templates → templates}/web-app/template/src/components/Layout.tsx +0 -0
  158. /package/{.aiwf/templates → templates}/web-app/template/src/components/aiwf/ContextStatus.tsx +0 -0
  159. /package/{.aiwf/templates → templates}/web-app/template/src/components/aiwf/FeatureLedger.tsx +0 -0
  160. /package/{.aiwf/templates → templates}/web-app/template/src/components/aiwf/TokenUsage.tsx +0 -0
  161. /package/{.aiwf/templates → templates}/web-app/template/src/index.css +0 -0
  162. /package/{.aiwf/templates → templates}/web-app/template/src/main.tsx +0 -0
  163. /package/{.aiwf/templates → templates}/web-app/template/src/pages/AiwfDashboard.tsx +0 -0
  164. /package/{.aiwf/templates → templates}/web-app/template/src/pages/HomePage.tsx +0 -0
  165. /package/{.aiwf/templates → templates}/web-app/template/src/pages/NotFound.tsx +0 -0
  166. /package/{.aiwf/templates → templates}/web-app/template/src/stores/aiwfStore.ts +0 -0
  167. /package/{.aiwf/templates → templates}/web-app/template/src/types/global.d.ts +0 -0
  168. /package/{.aiwf/templates → templates}/web-app/template/src/vite-env.d.ts +0 -0
  169. /package/{.aiwf/templates → templates}/web-app/template/tailwind.config.js +0 -0
  170. /package/{.aiwf/templates → templates}/web-app/template/tsconfig.json +0 -0
  171. /package/{.aiwf/templates → templates}/web-app/template/tsconfig.node.json +0 -0
  172. /package/{.aiwf/templates → templates}/web-app/template/vite.config.ts +0 -0
@@ -0,0 +1,561 @@
1
+ # 프로젝트 테스트 케이스 병렬 생성 커맨드
2
+
3
+ 이 커맨드는 프로젝트의 소스 코드를 분석하여 포괄적인 테스트(단위/통합/E2E)를 병렬로 생성합니다.
4
+
5
+ ## 사용법
6
+
7
+ ```bash
8
+ /aiwf:aiwf_create_testcase [test_type] [subagent_count]
9
+ ```
10
+
11
+ **파라미터:**
12
+ - `test_type` (선택사항): 생성할 테스트 타입 (기본값: unit)
13
+ - `unit`: 단위 테스트
14
+ - `e2e`: End-to-End 테스트
15
+ - `integration`: 통합 테스트
16
+ - `all`: 모든 종류의 테스트
17
+ - `subagent_count` (선택사항): 생성할 Subagent 수 (기본값: 5, 최대: 10)
18
+
19
+ ## 예시
20
+
21
+ ```bash
22
+ # 기본 단위 테스트 생성 (5개 Subagent)
23
+ /aiwf:aiwf_create_testcase
24
+
25
+ # E2E 테스트 생성 (5개 Subagent)
26
+ /aiwf:aiwf_create_testcase e2e
27
+
28
+ # 통합 테스트를 8개 Subagent로 생성
29
+ /aiwf:aiwf_create_testcase integration 8
30
+
31
+ # 모든 종류의 테스트를 10개 Subagent로 생성
32
+ /aiwf:aiwf_create_testcase all 10
33
+
34
+ # 단위 테스트를 3개 Subagent로 생성
35
+ /aiwf:aiwf_create_testcase unit 3
36
+ ```
37
+
38
+ ---
39
+
40
+ # 프로젝트 테스트 케이스 병렬 생성 워크플로우
41
+
42
+ **목표**: 프로젝트의 모든 주요 비즈니스 로직에 대한 포괄적인 테스트를 병렬로 생성하여 90% 이상의 테스트 커버리지를 달성
43
+
44
+ ## 정확히 다음 5개 항목으로 TODO 생성
45
+
46
+ 1. 인수 파싱 및 프로젝트 구조 분석
47
+ 2. 테스트 대상 파일 식별 및 Subagent 작업 분할
48
+ 3. 병렬 Subagent 실행으로 테스트 코드 생성
49
+ 4. 테스트 실행 및 커버리지 검증
50
+ 5. 결과 보고 및 최적화 제안
51
+
52
+ ---
53
+
54
+ ## 1 · 인수 파싱 및 프로젝트 구조 분석
55
+
56
+ ### 인수 처리
57
+ - `<$ARGUMENTS>`에서 테스트 타입과 Subagent 수 파싱
58
+ - 첫 번째 인수가 테스트 타입인지 확인 (unit, e2e, integration, all)
59
+ - 테스트 타입이 아니면 숫자로 간주하고 unit 테스트로 설정
60
+ - 유효한 테스트 타입: unit(기본값), e2e, integration, all
61
+ - 두 번째 인수가 있으면 Subagent 수로 파싱 (기본값: 5, 최대: 10)
62
+ - 잘못된 값이면 기본값 사용 및 사용자에게 알림
63
+
64
+ ### 프로젝트 구조 분석
65
+ 다음 명령어들을 **병렬로 실행**하여 프로젝트 타입과 상태 파악:
66
+
67
+ ```bash
68
+ # 프로젝트 언어 감지
69
+ find . -name "*.py" -o -name "*.js" -o -name "*.ts" -o -name "*.java" -o -name "*.go" -o -name "*.rb" -o -name "*.cs" | grep -v node_modules | grep -v venv | head -20
70
+
71
+ # 프로젝트 관리 파일 확인
72
+ ls -la | grep -E "package.json|requirements.txt|pom.xml|go.mod|Gemfile|*.csproj|Cargo.toml"
73
+
74
+ # 기존 테스트 파일 확인
75
+ find . -type f \( -name "*test*" -o -name "*spec*" \) -not -path "*/node_modules/*" -not -path "*/venv/*" -not -path "*/.git/*" | head -20
76
+
77
+ # 테스트 설정 파일 확인
78
+ find . -maxdepth 2 -name "jest.config.*" -o -name "pytest.ini" -o -name "phpunit.xml" -o -name "go.mod" -o -name ".rspec" -o -name "test.config.*"
79
+
80
+ # 빌드/테스트 스크립트 확인
81
+ if [ -f "package.json" ]; then
82
+ cat package.json | jq '.scripts' 2>/dev/null || grep -A 10 '"scripts"' package.json
83
+ elif [ -f "Makefile" ]; then
84
+ grep -E "^test:|^check:" Makefile
85
+ elif [ -f "build.gradle" ] || [ -f "pom.xml" ]; then
86
+ echo "Java/Kotlin project detected"
87
+ fi
88
+ ```
89
+
90
+ ### 테스트 환경 검증
91
+ - **언어 자동 감지**: Python, JavaScript/TypeScript, Java, Go, Ruby, C# 등
92
+ - **테스트 프레임워크 감지**: Jest, Pytest, JUnit, Go test, RSpec, xUnit 등
93
+ - **패키지 매니저 확인**: npm, pip, maven, go mod, bundler, nuget 등
94
+ - **빌드 시스템 확인**: Make, Gradle, Maven, npm scripts 등
95
+
96
+ ## 2 · 테스트 대상 파일 식별 및 Subagent 작업 분할
97
+
98
+ ### 테스트 대상 식별
99
+ 테스트 타입에 따라 대상 파일들을 식별:
100
+
101
+ ```bash
102
+ # 테스트 타입에 따른 대상 파일 식별
103
+ TEST_TYPE="${1:-unit}" # 첫 번째 인수 또는 기본값 unit
104
+
105
+ case "$TEST_TYPE" in
106
+ "unit")
107
+ echo "단위 테스트 대상 파일 검색..."
108
+ # 개별 클래스/모듈/함수 파일 검색
109
+ find . -type f \( -name "*.service.*" -o -name "*.controller.*" -o -name "*.helper.*" -o -name "*.util.*" -o -name "*.model.*" -o -name "*Service.*" -o -name "*Controller.*" -o -name "*Repository.*" -o -name "*Utils.*" \) | grep -v test | grep -v spec
110
+ ;;
111
+
112
+ "integration")
113
+ echo "통합 테스트 대상 파일 검색..."
114
+ # API 엔드포인트, 데이터베이스 연동, 서비스 간 통합 파일 검색
115
+ find . -type f \( -name "*api*" -o -name "*route*" -o -name "*endpoint*" -o -name "*repository*" -o -name "*dao*" \) | grep -v test | grep -v spec
116
+ # 설정 파일도 포함
117
+ find . -maxdepth 3 -name "*config*" -o -name "*setup*" | grep -v node_modules | grep -v venv
118
+ ;;
119
+
120
+ "e2e")
121
+ echo "E2E 테스트 대상 검색..."
122
+ # 전체 애플리케이션 플로우, 페이지, 시나리오 검색
123
+ find . -type f \( -name "*page*" -o -name "*view*" -o -name "*screen*" -o -name "*flow*" \) | grep -v test | grep -v spec
124
+ # 메인 엔트리 포인트 검색
125
+ find . -maxdepth 2 \( -name "main.*" -o -name "app.*" -o -name "index.*" -o -name "server.*" \)
126
+ ;;
127
+
128
+ "all")
129
+ echo "모든 테스트 대상 파일 검색..."
130
+ # 모든 소스 코드 파일 검색 (테스트 파일 제외)
131
+ find . -type f \( -name "*.js" -o -name "*.ts" -o -name "*.py" -o -name "*.java" -o -name "*.kt" -o -name "*.go" -o -name "*.rb" -o -name "*.cs" \) | grep -v test | grep -v spec | grep -v node_modules | grep -v venv | grep -v vendor
132
+ ;;
133
+ esac
134
+ ```
135
+
136
+ ### 작업 분할 전략
137
+ **테스트 타입별 분할 방식:**
138
+
139
+ #### 단위 테스트 (unit)
140
+ **3개 Subagent:**
141
+ 1. **Agent 1**: 핵심 비즈니스 로직 (서비스, 도메인 모델)
142
+ 2. **Agent 2**: 컨트롤러/핸들러 계층
143
+ 3. **Agent 3**: 유틸리티/헬퍼 + 모킹 인프라
144
+
145
+ **5개 Subagent (기본):**
146
+ 1. **Agent 1**: 인증/보안 관련 단위 테스트
147
+ 2. **Agent 2**: 핵심 도메인 로직 단위 테스트
148
+ 3. **Agent 3**: 데이터 접근 계층 단위 테스트
149
+ 4. **Agent 4**: 외부 서비스 모킹 및 단위 테스트
150
+ 5. **Agent 5**: 유틸리티 함수 + 테스트 헬퍼
151
+
152
+ #### 통합 테스트 (integration)
153
+ **3개 Subagent:**
154
+ 1. **Agent 1**: API 엔드포인트 통합 테스트
155
+ 2. **Agent 2**: 데이터베이스 연동 테스트
156
+ 3. **Agent 3**: 서비스 간 통합 테스트
157
+
158
+ **5개 Subagent (기본):**
159
+ 1. **Agent 1**: REST API 통합 테스트
160
+ 2. **Agent 2**: 데이터베이스 트랜잭션 테스트
161
+ 3. **Agent 3**: 외부 서비스 통합 테스트
162
+ 4. **Agent 4**: 메시징/이벤트 시스템 테스트
163
+ 5. **Agent 5**: 설정 및 환경 통합 테스트
164
+
165
+ #### E2E 테스트 (e2e)
166
+ **3개 Subagent:**
167
+ 1. **Agent 1**: 주요 사용자 시나리오 테스트
168
+ 2. **Agent 2**: 페이지/화면 네비게이션 테스트
169
+ 3. **Agent 3**: 크로스 브라우저/플랫폼 테스트
170
+
171
+ **5개 Subagent (기본):**
172
+ 1. **Agent 1**: 사용자 인증 플로우 E2E
173
+ 2. **Agent 2**: 핵심 기능 시나리오 E2E
174
+ 3. **Agent 3**: 데이터 입력/검증 플로우 E2E
175
+ 4. **Agent 4**: 에러 처리 및 복구 시나리오
176
+ 5. **Agent 5**: 성능 및 부하 테스트 시나리오
177
+
178
+ #### 전체 테스트 (all)
179
+ **8개+ Subagent 권장:**
180
+ - 단위, 통합, E2E를 모두 포함하여 분할
181
+ - 각 테스트 타입별로 2-3개 Agent 할당
182
+ - 테스트 인프라와 리포팅을 별도 Agent로 분리
183
+
184
+ ### 우선순위 매트릭스 생성
185
+ 각 파일에 대해 다음 기준으로 우선순위 설정:
186
+ - **비즈니스 중요도**: 핵심 기능 vs 부가 기능
187
+ - **복잡도**: 로직 복잡성, 의존성 수
188
+ - **테스트 부족도**: 기존 테스트 커버리지
189
+ - **변경 빈도**: Git 히스토리 기반 변경 빈도
190
+
191
+ ## 3 · 병렬 Subagent 실행으로 테스트 코드 생성
192
+
193
+ ### Subagent 작업 템플릿
194
+ 각 Subagent에게 테스트 타입에 맞는 작업 지시:
195
+
196
+ ```
197
+ /**
198
+ * Subagent {번호}: {도메인명} {테스트 타입} 테스트 구현
199
+ *
200
+ * 프로젝트 언어: {감지된 언어}
201
+ * 테스트 프레임워크: {감지된 테스트 프레임워크}
202
+ * 테스트 타입: {unit|integration|e2e}
203
+ *
204
+ * 담당 파일/영역:
205
+ * - {파일/기능 목록}
206
+ *
207
+ * 테스트 타입별 요구사항:
208
+ *
209
+ * [단위 테스트인 경우]
210
+ * - 각 함수/메서드를 독립적으로 테스트
211
+ * - 모든 의존성을 모킹/스터빙
212
+ * - 빠른 실행 속도 유지
213
+ * - 단일 책임 원칙 준수
214
+ *
215
+ * [통합 테스트인 경우]
216
+ * - 실제 데이터베이스/외부 서비스 연동
217
+ * - 트랜잭션 롤백 처리
218
+ * - API 엔드포인트 전체 플로우 검증
219
+ * - 에러 전파 및 처리 검증
220
+ *
221
+ * [E2E 테스트인 경우]
222
+ * - 실제 사용자 시나리오 시뮬레이션
223
+ * - UI 자동화 도구 활용 (Selenium, Playwright, Cypress 등)
224
+ * - 크로스 브라우저 호환성 검증
225
+ * - 성능 메트릭 수집
226
+ *
227
+ * 공통 요구사항:
228
+ * 1. 프로젝트의 기존 테스트 패턴 분석 후 동일한 스타일 적용
229
+ * 2. 90% 이상 코드 커버리지 달성 (해당 테스트 타입 범위 내)
230
+ * 3. 명확한 테스트 설명 작성
231
+ * 4. 테스트 데이터 관리 전략 수립
232
+ *
233
+ * 출력:
234
+ * 완성된 테스트 파일들의 전체 코드
235
+ * (테스트 타입별 명명 규칙 준수)
236
+ */
237
+ ```
238
+
239
+ ### 동시 실행 관리
240
+ - 모든 Subagent를 **단일 메시지에서 동시 실행**
241
+ - 각 Agent의 진행상황 추적
242
+ - 의존성 충돌 방지 (동일 파일을 여러 Agent가 처리하지 않도록)
243
+
244
+ ### 언어 및 테스트 타입별 특화 지시사항
245
+
246
+ #### JavaScript/TypeScript
247
+ **단위 테스트:**
248
+ - Jest, Mocha, Vitest의 모킹 기능 활용
249
+ - 함수/클래스 단위로 격리된 테스트
250
+
251
+ **통합 테스트:**
252
+ - Supertest로 API 엔드포인트 테스트
253
+ - 실제 데이터베이스 연결 (테스트 DB)
254
+
255
+ **E2E 테스트:**
256
+ - Playwright, Cypress, Puppeteer 활용
257
+ - 페이지 객체 모델 패턴 적용
258
+
259
+ #### Python
260
+ **단위 테스트:**
261
+ - unittest.mock, pytest-mock 활용
262
+ - 데코레이터와 context manager 테스트
263
+
264
+ **통합 테스트:**
265
+ - Django: TestCase와 TransactionTestCase
266
+ - FastAPI: TestClient와 실제 DB 연동
267
+
268
+ **E2E 테스트:**
269
+ - Selenium WebDriver, Playwright
270
+ - Behave로 BDD 스타일 테스트
271
+
272
+ #### Java/Kotlin
273
+ **단위 테스트:**
274
+ - Mockito로 의존성 모킹
275
+ - @Mock, @InjectMocks 활용
276
+
277
+ **통합 테스트:**
278
+ - @SpringBootTest, @DataJpaTest
279
+ - TestContainers로 실제 DB 테스트
280
+
281
+ **E2E 테스트:**
282
+ - Selenium Grid, Appium
283
+ - Rest Assured로 API 시나리오 테스트
284
+
285
+ #### Go
286
+ **단위 테스트:**
287
+ - 인터페이스 기반 모킹
288
+ - 테이블 드리븐 테스트
289
+
290
+ **통합 테스트:**
291
+ - httptest로 HTTP 핸들러 테스트
292
+ - 실제 DB 연결 테스트
293
+
294
+ **E2E 테스트:**
295
+ - Chromedp, Rod로 브라우저 자동화
296
+ - Ginkgo로 BDD 스타일 테스트
297
+
298
+ #### Ruby
299
+ **단위 테스트:**
300
+ - RSpec doubles, stubs
301
+ - 격리된 클래스/모듈 테스트
302
+
303
+ **통합 테스트:**
304
+ - Rails: request specs
305
+ - Database cleaner로 트랜잭션 관리
306
+
307
+ **E2E 테스트:**
308
+ - Capybara + Selenium
309
+ - 시나리오 기반 feature specs
310
+
311
+ #### C#
312
+ **단위 테스트:**
313
+ - Moq, NSubstitute로 모킹
314
+ - async/await 테스트 패턴
315
+
316
+ **통합 테스트:**
317
+ - WebApplicationFactory 활용
318
+ - In-memory DB 또는 실제 DB
319
+
320
+ **E2E 테스트:**
321
+ - Selenium, SpecFlow
322
+ - Page Object 패턴 적용
323
+
324
+ ## 4 · 테스트 실행 및 커버리지 검증
325
+
326
+ ### 테스트 실행
327
+ 테스트 타입과 언어별로 적절한 테스트 명령어를 **병렬로 실행**:
328
+
329
+ ```bash
330
+ TEST_TYPE="${1:-unit}" # 테스트 타입
331
+
332
+ # JavaScript/TypeScript
333
+ if [ -f "package.json" ]; then
334
+ case "$TEST_TYPE" in
335
+ "unit")
336
+ npm test || npm run test:unit
337
+ ;;
338
+ "integration")
339
+ npm run test:integration || npm run test:int
340
+ ;;
341
+ "e2e")
342
+ npm run test:e2e || npm run e2e || npm run cypress:run
343
+ ;;
344
+ "all")
345
+ npm test && npm run test:integration && npm run test:e2e
346
+ ;;
347
+ esac
348
+ npm run test:coverage || npm run test:cov || jest --coverage
349
+ fi
350
+
351
+ # Python
352
+ if [ -f "requirements.txt" ] || [ -f "setup.py" ]; then
353
+ case "$TEST_TYPE" in
354
+ "unit")
355
+ pytest tests/unit || pytest -m unit
356
+ ;;
357
+ "integration")
358
+ pytest tests/integration || pytest -m integration
359
+ ;;
360
+ "e2e")
361
+ pytest tests/e2e || pytest -m e2e || behave
362
+ ;;
363
+ "all")
364
+ pytest
365
+ ;;
366
+ esac
367
+ pytest --cov || coverage run -m pytest
368
+ fi
369
+
370
+ # Java/Kotlin
371
+ if [ -f "pom.xml" ]; then
372
+ case "$TEST_TYPE" in
373
+ "unit")
374
+ mvn test -Dtest="*Test"
375
+ ;;
376
+ "integration")
377
+ mvn test -Dtest="*IT"
378
+ ;;
379
+ "e2e")
380
+ mvn test -Dtest="*E2E"
381
+ ;;
382
+ "all")
383
+ mvn test
384
+ ;;
385
+ esac
386
+ mvn jacoco:report
387
+ elif [ -f "build.gradle" ]; then
388
+ case "$TEST_TYPE" in
389
+ "unit")
390
+ ./gradlew test
391
+ ;;
392
+ "integration")
393
+ ./gradlew integrationTest
394
+ ;;
395
+ "e2e")
396
+ ./gradlew e2eTest
397
+ ;;
398
+ "all")
399
+ ./gradlew check
400
+ ;;
401
+ esac
402
+ ./gradlew jacocoTestReport
403
+ fi
404
+
405
+ # Go
406
+ if [ -f "go.mod" ]; then
407
+ case "$TEST_TYPE" in
408
+ "unit")
409
+ go test -short ./...
410
+ ;;
411
+ "integration")
412
+ go test -run Integration ./...
413
+ ;;
414
+ "e2e")
415
+ go test -run E2E ./...
416
+ ;;
417
+ "all")
418
+ go test ./...
419
+ ;;
420
+ esac
421
+ go test -cover ./...
422
+ fi
423
+
424
+ # Ruby
425
+ if [ -f "Gemfile" ]; then
426
+ case "$TEST_TYPE" in
427
+ "unit")
428
+ bundle exec rspec spec/unit
429
+ ;;
430
+ "integration")
431
+ bundle exec rspec spec/integration
432
+ ;;
433
+ "e2e")
434
+ bundle exec rspec spec/features || bundle exec cucumber
435
+ ;;
436
+ "all")
437
+ bundle exec rspec
438
+ ;;
439
+ esac
440
+ fi
441
+
442
+ # C#
443
+ if ls *.csproj 1> /dev/null 2>&1; then
444
+ case "$TEST_TYPE" in
445
+ "unit")
446
+ dotnet test --filter "Category=Unit"
447
+ ;;
448
+ "integration")
449
+ dotnet test --filter "Category=Integration"
450
+ ;;
451
+ "e2e")
452
+ dotnet test --filter "Category=E2E"
453
+ ;;
454
+ "all")
455
+ dotnet test
456
+ ;;
457
+ esac
458
+ dotnet test /p:CollectCoverage=true
459
+ fi
460
+ ```
461
+
462
+ ### 커버리지 분석
463
+ - 전체 커버리지 % 확인
464
+ - 파일별 커버리지 상세 분석
465
+ - 90% 미달 파일 식별
466
+ - 미커버 라인 분석
467
+
468
+ ### 실패 테스트 처리
469
+ **테스트 실패 시 자동 수정:**
470
+ - 컴파일/문법 에러 수정
471
+ - 모킹/스텁 설정 오류 수정
472
+ - 의존성 문제 해결
473
+ - 비동기 테스트 타이밍 이슈 수정
474
+ - import/require 경로 문제 수정
475
+
476
+ **3회 재시도 후에도 실패 시:**
477
+ - 문제 분석 보고서 생성
478
+ - 수동 수정이 필요한 부분 명시
479
+ - 임시 해결책 제안
480
+
481
+ ## 5 · 결과 보고 및 최적화 제안
482
+
483
+ ### 성과 요약 보고
484
+ ```markdown
485
+ ## 🎯 테스트 생성 결과
486
+
487
+ ### 📊 커버리지 성과
488
+ - **이전**: {이전_커버리지}%
489
+ - **현재**: {현재_커버리지}%
490
+ - **개선도**: +{개선도}%
491
+
492
+ ### 📁 생성된 테스트 파일
493
+ - **총 파일 수**: {파일수}개
494
+ - **총 테스트 케이스**: {테스트케이스수}개
495
+ - **성공률**: {성공률}%
496
+
497
+ ### ⚡ 성능 지표
498
+ - **작업 시간**: {시간}
499
+ - **병렬 효율성**: {효율성}% 향상
500
+ - **품질 점수**: {품질점수}/100
501
+ ```
502
+
503
+ ### 최적화 제안사항
504
+ **높은 우선순위:**
505
+ - 90% 미달 파일에 대한 추가 테스트 제안
506
+ - 테스트 성능 최적화 방안
507
+ - CI/CD 파이프라인 통합 제안
508
+
509
+ **중간 우선순위:**
510
+ - E2E 테스트 확장 계획
511
+ - 테스트 데이터 관리 개선
512
+ - 테스트 문서화 방안
513
+
514
+ **낮은 우선순위:**
515
+ - 성능 테스트 추가
516
+ - 접근성 테스트 고려
517
+ - 국제화 테스트 방안
518
+
519
+ ### 다음 단계 액션 아이템
520
+ 1. **즉시 실행**: 90% 미달 파일 보완
521
+ 2. **1주일 내**: CI/CD 테스트 자동화 설정
522
+ 3. **1개월 내**: E2E 테스트 스위트 구축
523
+
524
+ ---
525
+
526
+ ## 🚨 중요 사항
527
+
528
+ ### 지원되는 프로젝트 타입
529
+ - **JavaScript/TypeScript**: Node.js, React, Vue, Angular 등
530
+ - **Python**: Django, Flask, FastAPI, 일반 Python 프로젝트
531
+ - **Java/Kotlin**: Spring Boot, Micronaut, 일반 Java 프로젝트
532
+ - **Go**: 표준 Go 프로젝트, Gin, Echo 등
533
+ - **Ruby**: Rails, Sinatra, 일반 Ruby 프로젝트
534
+ - **C#**: ASP.NET Core, .NET 프로젝트
535
+
536
+ ### 지원되는 테스트 프레임워크
537
+ - **JavaScript/TypeScript**: Jest, Mocha, Vitest, Jasmine
538
+ - **Python**: pytest, unittest, nose
539
+ - **Java/Kotlin**: JUnit, TestNG, Spock
540
+ - **Go**: 내장 testing 패키지, testify
541
+ - **Ruby**: RSpec, Minitest
542
+ - **C#**: xUnit, NUnit, MSTest
543
+
544
+ ### 전제 조건
545
+ - 프로젝트에 적절한 빌드 시스템이 설정되어 있어야 함
546
+ - 기본적인 테스트 실행 환경이 구성되어 있어야 함
547
+ - 의존성 패키지가 설치되어 있어야 함
548
+
549
+ ### 제한사항
550
+ - 매우 복잡한 레거시 코드의 경우 수동 수정 필요할 수 있음
551
+ - 외부 API 의존성이 매우 복잡한 경우 추가 모킹 작업 필요
552
+ - 데이터베이스 스키마가 복잡한 경우 추가 설정 필요
553
+ - GUI 관련 테스트는 단위 테스트 범위에서 제외
554
+
555
+ ### 안전장치
556
+ - 기존 테스트 파일은 백업 후 수정
557
+ - 실패한 테스트는 건너뛰고 계속 진행
558
+ - 프로젝트에 손상을 주지 않는 안전한 실행
559
+ - 언어별 관례에 따른 테스트 파일 명명
560
+
561
+ 이 커맨드를 통해 어떤 프로젝트든 빠르고 효율적으로 고품질 테스트 스위트를 구축할 수 있습니다!
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiwf",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "AI Workflow Framework for Claude Code with multi-language support (Korean/English)",
5
5
  "main": "index.js",
6
6
  "type": "module",
package/src/cli/index.js CHANGED
@@ -6,6 +6,7 @@ import { installAIWF } from '../lib/installer.js';
6
6
  import AIToolCommand from '../commands/ai-tool.js';
7
7
  import PersonaCommand from '../commands/persona.js';
8
8
  import { CacheCLI } from './cache-cli.js';
9
+ import { addTaskToSprint } from '../commands/sprint-task.js';
9
10
 
10
11
  // Parse version from package.json
11
12
  import { readFileSync } from 'fs';
@@ -22,9 +23,9 @@ program
22
23
  .version(packageJson.version)
23
24
  .description('AIWF - AI Workflow Framework');
24
25
 
25
- // Install command (default action)
26
+ // Install command
26
27
  program
27
- .command('install', { isDefault: true })
28
+ .command('install')
28
29
  .description('Install AIWF framework')
29
30
  .option('-f, --force', 'Force install without prompts')
30
31
  .action((options) => installAIWF({ ...options, debugLog: true }));
@@ -202,5 +203,19 @@ persona
202
203
  await personaCmd.resetPersona();
203
204
  });
204
205
 
206
+ // Sprint task management command
207
+ program
208
+ .command('sprint-task <sprintId> <taskTitle>')
209
+ .alias('st')
210
+ .description('Add a task to an existing sprint / 스프린트에 태스크 추가')
211
+ .action(async (sprintId, taskTitle) => {
212
+ try {
213
+ await addTaskToSprint(sprintId, taskTitle);
214
+ } catch (error) {
215
+ console.error(chalk.red(`오류: ${error.message}`));
216
+ process.exit(1);
217
+ }
218
+ });
219
+
205
220
  // Parse command line arguments
206
221
  program.parse(process.argv);
@@ -1,12 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const fs = require('fs-extra');
4
- const path = require('path');
5
- const prompts = require('prompts');
6
- const chalk = require('chalk');
7
- const ora = require('ora');
3
+ import fs from 'fs-extra';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import prompts from 'prompts';
7
+ import chalk from 'chalk';
8
+ import ora from 'ora';
8
9
 
9
- const TEMPLATES_DIR = path.join(__dirname, '../templates');
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+ const TEMPLATES_DIR = path.join(__dirname, '../../templates');
10
13
 
11
14
  async function createProject() {
12
15
  console.log(chalk.cyan('\n🚀 AIWF 프로젝트 생성기\n'));
@@ -148,4 +151,4 @@ if (require.main === module) {
148
151
  });
149
152
  }
150
153
 
151
- module.exports = { createProject };
154
+ export { createProject };