aiwf 0.3.6 → 0.3.8

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 (271) hide show
  1. package/.aiwf/00_PROJECT_MANIFEST.md +226 -2
  2. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/S03_M02_sprint_meta.md +112 -0
  3. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T01_S03_new_test_task.md +39 -0
  4. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T02_S03_first_task.md +39 -0
  5. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T03_S03_test_task.md +39 -0
  6. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T04_S03_task_with_special_characters.md +39 -0
  7. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T05_S03_test.md +39 -0
  8. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T06_S03_test_task.md +39 -0
  9. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T07_S03_next_task.md +39 -0
  10. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T08_S03_next_task.md +39 -0
  11. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T09_S03_new_test_task.md +39 -0
  12. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T100_S03_task_with_special_characters.md +39 -0
  13. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T101_S03_test.md +39 -0
  14. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T102_S03_test_task.md +39 -0
  15. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T103_S03_next_task.md +39 -0
  16. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T104_S03_next_task.md +39 -0
  17. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T105_S03_new_test_task.md +39 -0
  18. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T106_S03_first_task.md +39 -0
  19. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T107_S03_test_task.md +39 -0
  20. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T108_S03_task_with_special_characters.md +39 -0
  21. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T109_S03_test.md +39 -0
  22. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T10_S03_first_task.md +39 -0
  23. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T110_S03_test_task.md +39 -0
  24. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T111_S03_next_task.md +39 -0
  25. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T112_S03_next_task.md +39 -0
  26. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T11_S03_test_task.md +39 -0
  27. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T12_S03_task_with_special_characters.md +39 -0
  28. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T13_S03_test.md +39 -0
  29. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T14_S03_test_task.md +39 -0
  30. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T15_S03_next_task.md +39 -0
  31. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T16_S03_next_task.md +39 -0
  32. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T17_S03_new_test_task.md +39 -0
  33. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T18_S03_first_task.md +39 -0
  34. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T19_S03_test_task.md +39 -0
  35. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T20_S03_task_with_special_characters.md +39 -0
  36. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T21_S03_test.md +39 -0
  37. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T22_S03_test_task.md +39 -0
  38. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T23_S03_next_task.md +39 -0
  39. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T24_S03_next_task.md +39 -0
  40. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T25_S03_new_test_task.md +39 -0
  41. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T26_S03_first_task.md +39 -0
  42. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T27_S03_test_task.md +39 -0
  43. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T28_S03_task_with_special_characters.md +39 -0
  44. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T29_S03_test.md +39 -0
  45. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T30_S03_test_task.md +39 -0
  46. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T31_S03_next_task.md +39 -0
  47. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T32_S03_next_task.md +39 -0
  48. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T33_S03_new_test_task.md +39 -0
  49. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T34_S03_first_task.md +39 -0
  50. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T35_S03_test_task.md +39 -0
  51. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T36_S03_task_with_special_characters.md +39 -0
  52. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T37_S03_test.md +39 -0
  53. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T38_S03_test_task.md +39 -0
  54. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T39_S03_next_task.md +39 -0
  55. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T40_S03_next_task.md +39 -0
  56. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T41_S03_new_test_task.md +39 -0
  57. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T42_S03_first_task.md +39 -0
  58. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T43_S03_test_task.md +39 -0
  59. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T44_S03_task_with_special_characters.md +39 -0
  60. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T45_S03_test.md +39 -0
  61. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T46_S03_test_task.md +39 -0
  62. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T47_S03_next_task.md +39 -0
  63. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T48_S03_next_task.md +39 -0
  64. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T49_S03_new_test_task.md +39 -0
  65. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T50_S03_first_task.md +39 -0
  66. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T51_S03_test_task.md +39 -0
  67. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T52_S03_task_with_special_characters.md +39 -0
  68. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T53_S03_test.md +39 -0
  69. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T54_S03_test_task.md +39 -0
  70. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T55_S03_next_task.md +39 -0
  71. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T56_S03_next_task.md +39 -0
  72. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T57_S03_new_test_task.md +39 -0
  73. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T58_S03_first_task.md +39 -0
  74. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T59_S03_test_task.md +39 -0
  75. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T60_S03_task_with_special_characters.md +39 -0
  76. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T61_S03_test.md +39 -0
  77. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T62_S03_test_task.md +39 -0
  78. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T63_S03_next_task.md +39 -0
  79. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T64_S03_next_task.md +39 -0
  80. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T65_S03_new_test_task.md +39 -0
  81. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T66_S03_first_task.md +39 -0
  82. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T67_S03_test_task.md +39 -0
  83. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T68_S03_task_with_special_characters.md +39 -0
  84. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T69_S03_test.md +39 -0
  85. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T70_S03_test_task.md +39 -0
  86. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T71_S03_next_task.md +39 -0
  87. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T72_S03_next_task.md +39 -0
  88. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T73_S03_new_test_task.md +39 -0
  89. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T74_S03_first_task.md +39 -0
  90. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T75_S03_test_task.md +39 -0
  91. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T76_S03_task_with_special_characters.md +39 -0
  92. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T77_S03_test.md +39 -0
  93. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T78_S03_test_task.md +39 -0
  94. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T79_S03_next_task.md +39 -0
  95. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T80_S03_next_task.md +39 -0
  96. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T81_S03_new_test_task.md +39 -0
  97. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T82_S03_first_task.md +39 -0
  98. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T83_S03_test_task.md +39 -0
  99. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T84_S03_task_with_special_characters.md +39 -0
  100. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T85_S03_test.md +39 -0
  101. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T86_S03_test_task.md +39 -0
  102. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T87_S03_next_task.md +39 -0
  103. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T88_S03_next_task.md +39 -0
  104. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T89_S03_new_test_task.md +39 -0
  105. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T90_S03_first_task.md +39 -0
  106. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T91_S03_test_task.md +39 -0
  107. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T92_S03_task_with_special_characters.md +39 -0
  108. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T93_S03_test.md +39 -0
  109. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T94_S03_test_task.md +39 -0
  110. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T95_S03_next_task.md +39 -0
  111. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T96_S03_next_task.md +39 -0
  112. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T97_S03_new_test_task.md +39 -0
  113. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T98_S03_first_task.md +39 -0
  114. package/.aiwf/03_SPRINTS/S03_M02_ecosystem_integration/T99_S03_test_task.md +39 -0
  115. package/.aiwf/test-results-s02.json +5 -5
  116. package/.claude/commands/aiwf/aiwf_compress_aggressive_persona.md +3 -15
  117. package/.claude/commands/aiwf/aiwf_compress_minimal_persona.md +2 -15
  118. package/.claude/commands/aiwf/aiwf_compress_stats.md +2 -51
  119. package/.claude/commands/aiwf/aiwf_compress_with_persona.md +5 -18
  120. package/.claude/commands/aiwf/aiwf_create_feature_ledger.md +1 -1
  121. package/.claude/commands/aiwf/aiwf_default_mode.md +1 -1
  122. package/.claude/commands/aiwf/aiwf_evaluate.md +3 -16
  123. package/.claude/commands/aiwf/aiwf_get_feature_details.md +1 -1
  124. package/.claude/commands/aiwf/aiwf_link_feature_to_milestone.md +1 -1
  125. package/.claude/commands/aiwf/aiwf_list_features.md +1 -1
  126. package/.claude/commands/aiwf/aiwf_switch_language.md +48 -120
  127. package/.claude/commands/aiwf/aiwf_update_feature_status.md +1 -1
  128. package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_create_testcase.md +561 -0
  129. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_compress_aggressive_persona.md +2 -2
  130. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_compress_minimal_persona.md +2 -2
  131. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_compress_stats.md +10 -47
  132. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_compress_with_persona.md +2 -2
  133. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_create_feature_ledger.md +1 -1
  134. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_create_testcase.md +561 -0
  135. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_default_mode.md +1 -1
  136. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_evaluate.md +2 -2
  137. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_get_feature_details.md +1 -1
  138. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_link_feature_to_milestone.md +1 -1
  139. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_list_features.md +1 -1
  140. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_architect.md +1 -1
  141. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_backend.md +1 -1
  142. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_data_analyst.md +1 -1
  143. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_frontend.md +1 -1
  144. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_security.md +1 -1
  145. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_status.md +1 -1
  146. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_update_feature_status.md +1 -1
  147. package/package.json +1 -1
  148. package/src/cli/index.js +174 -0
  149. package/src/commands/compress.js +60 -0
  150. package/src/commands/create-project.js +23 -17
  151. package/src/commands/evaluate.js +459 -0
  152. package/src/commands/feature.js +365 -0
  153. package/src/commands/persona.js +37 -16
  154. package/src/commands/token.js +312 -0
  155. package/src/lib/file-downloader.js +189 -33
  156. package/src/lib/installer.js +38 -11
  157. package/src/lib/resource-loader.js +250 -0
  158. package/src/lib/resources/commands/ai-persona.js +602 -0
  159. package/src/lib/resources/commands/compress-context.js +389 -0
  160. package/src/lib/resources/commands/evaluate.js +246 -0
  161. package/src/lib/resources/commands/feature-ledger.js +565 -0
  162. package/src/lib/resources/commands/feature_commit_report.js +370 -0
  163. package/src/lib/resources/commands/persona-context-apply.js +562 -0
  164. package/src/lib/resources/commands/scan_git_history.js +234 -0
  165. package/src/lib/resources/commands/sync_feature_commits.js +154 -0
  166. package/src/lib/resources/commands/token-tracking.js +443 -0
  167. package/src/lib/resources/config/commit-patterns.js +103 -0
  168. package/src/lib/resources/config/language.json +6 -0
  169. package/src/lib/resources/personas/PERSONA_INDEX.md +57 -0
  170. package/src/lib/resources/personas/analyst.json +44 -0
  171. package/src/lib/resources/personas/architect/best_practices.md +136 -0
  172. package/src/lib/resources/personas/architect/knowledge_base.md +377 -0
  173. package/src/lib/resources/personas/architect.json +44 -0
  174. package/src/lib/resources/personas/backend/best_practices.md +766 -0
  175. package/src/lib/resources/personas/backend/knowledge_base.md +1070 -0
  176. package/src/lib/resources/personas/data_analyst/best_practices.md +594 -0
  177. package/src/lib/resources/personas/data_analyst/knowledge_base.md +1057 -0
  178. package/src/lib/resources/personas/developer.json +44 -0
  179. package/src/lib/resources/personas/developer.md +37 -0
  180. package/src/lib/resources/personas/evaluation_criteria.json +137 -0
  181. package/src/lib/resources/personas/frontend/best_practices.md +445 -0
  182. package/src/lib/resources/personas/frontend/knowledge_base.md +729 -0
  183. package/src/lib/resources/personas/persona-index.json +31 -0
  184. package/src/lib/resources/personas/reviewer.json +44 -0
  185. package/src/lib/resources/personas/security/best_practices.md +307 -0
  186. package/src/lib/resources/personas/security/knowledge_base.md +498 -0
  187. package/src/lib/resources/personas/tester.json +44 -0
  188. package/src/lib/resources/templates/README.md +78 -0
  189. package/src/lib/resources/templates/api-server/config.json +64 -0
  190. package/src/lib/resources/templates/api-server/template/.aiwf/config.json +56 -0
  191. package/src/lib/resources/templates/api-server/template/.aiwf/feature-ledger.json +42 -0
  192. package/src/lib/resources/templates/api-server/template/.aiwf/personas/backend-engineer.json +40 -0
  193. package/src/lib/resources/templates/api-server/template/.aiwf/scripts/cli.js +111 -0
  194. package/src/lib/resources/templates/api-server/template/.env.example +29 -0
  195. package/src/lib/resources/templates/api-server/template/.eslintrc.json +23 -0
  196. package/src/lib/resources/templates/api-server/template/README.md +171 -0
  197. package/src/lib/resources/templates/api-server/template/jest.config.js +26 -0
  198. package/src/lib/resources/templates/api-server/template/nodemon.json +9 -0
  199. package/src/lib/resources/templates/api-server/template/package.json +61 -0
  200. package/src/lib/resources/templates/api-server/template/src/app.ts +60 -0
  201. package/src/lib/resources/templates/api-server/template/src/config/swagger.ts +38 -0
  202. package/src/lib/resources/templates/api-server/template/src/controllers/aiwfController.ts +68 -0
  203. package/src/lib/resources/templates/api-server/template/src/controllers/authController.ts +128 -0
  204. package/src/lib/resources/templates/api-server/template/src/controllers/statusController.ts +28 -0
  205. package/src/lib/resources/templates/api-server/template/src/index.ts +28 -0
  206. package/src/lib/resources/templates/api-server/template/src/middleware/aiwfMiddleware.ts +50 -0
  207. package/src/lib/resources/templates/api-server/template/src/middleware/authMiddleware.ts +41 -0
  208. package/src/lib/resources/templates/api-server/template/src/middleware/errorHandler.ts +42 -0
  209. package/src/lib/resources/templates/api-server/template/src/middleware/notFoundHandler.ts +14 -0
  210. package/src/lib/resources/templates/api-server/template/src/middleware/requestLogger.ts +20 -0
  211. package/src/lib/resources/templates/api-server/template/src/routes/aiwf.ts +42 -0
  212. package/src/lib/resources/templates/api-server/template/src/routes/index.ts +13 -0
  213. package/src/lib/resources/templates/api-server/template/src/routes/v1/index.ts +67 -0
  214. package/src/lib/resources/templates/api-server/template/src/utils/logger.ts +37 -0
  215. package/src/lib/resources/templates/api-server/template/tests/app.test.ts +40 -0
  216. package/src/lib/resources/templates/api-server/template/tsconfig.json +43 -0
  217. package/src/lib/resources/templates/npm-library/config.json +61 -0
  218. package/src/lib/resources/templates/npm-library/template/LICENSE +21 -0
  219. package/src/lib/resources/templates/npm-library/template/README.md +201 -0
  220. package/src/lib/resources/templates/npm-library/template/package.json +78 -0
  221. package/src/lib/resources/templates/web-app/config.json +53 -0
  222. package/src/lib/resources/templates/web-app/template/.aiwf/config.json +54 -0
  223. package/src/lib/resources/templates/web-app/template/.aiwf/feature-ledger.json +37 -0
  224. package/src/lib/resources/templates/web-app/template/.aiwf/personas/fullstack-developer.json +40 -0
  225. package/src/lib/resources/templates/web-app/template/.aiwf/scripts/cli.js +110 -0
  226. package/src/lib/resources/templates/web-app/template/.eslintrc.cjs +20 -0
  227. package/src/lib/resources/templates/web-app/template/README.md +151 -0
  228. package/src/lib/resources/templates/web-app/template/index.html +14 -0
  229. package/src/lib/resources/templates/web-app/template/package.json +44 -0
  230. package/src/lib/resources/templates/web-app/template/postcss.config.js +6 -0
  231. package/src/lib/resources/templates/web-app/template/public/vite.svg +1 -0
  232. package/src/lib/resources/templates/web-app/template/src/App.tsx +21 -0
  233. package/src/lib/resources/templates/web-app/template/src/components/Layout.tsx +57 -0
  234. package/src/lib/resources/templates/web-app/template/src/components/aiwf/ContextStatus.tsx +107 -0
  235. package/src/lib/resources/templates/web-app/template/src/components/aiwf/FeatureLedger.tsx +93 -0
  236. package/src/lib/resources/templates/web-app/template/src/components/aiwf/TokenUsage.tsx +71 -0
  237. package/src/lib/resources/templates/web-app/template/src/index.css +60 -0
  238. package/src/lib/resources/templates/web-app/template/src/main.tsx +10 -0
  239. package/src/lib/resources/templates/web-app/template/src/pages/AiwfDashboard.tsx +60 -0
  240. package/src/lib/resources/templates/web-app/template/src/pages/HomePage.tsx +89 -0
  241. package/src/lib/resources/templates/web-app/template/src/pages/NotFound.tsx +25 -0
  242. package/src/lib/resources/templates/web-app/template/src/stores/aiwfStore.ts +126 -0
  243. package/src/lib/resources/templates/web-app/template/src/types/global.d.ts +9 -0
  244. package/src/lib/resources/templates/web-app/template/src/vite-env.d.ts +1 -0
  245. package/src/lib/resources/templates/web-app/template/tailwind.config.js +30 -0
  246. package/src/lib/resources/templates/web-app/template/tsconfig.json +37 -0
  247. package/src/lib/resources/templates/web-app/template/tsconfig.node.json +10 -0
  248. package/src/lib/resources/templates/web-app/template/vite.config.ts +23 -0
  249. package/src/lib/resources/utils/background-monitor.js +223 -0
  250. package/src/lib/resources/utils/compression-metrics.js +1031 -0
  251. package/src/lib/resources/utils/compression-strategies.js +557 -0
  252. package/src/lib/resources/utils/content-normalizer.js +455 -0
  253. package/src/lib/resources/utils/context-compressor.js +583 -0
  254. package/src/lib/resources/utils/context-rule-parser.js +180 -0
  255. package/src/lib/resources/utils/context-token-monitor.js +463 -0
  256. package/src/lib/resources/utils/context-update-manager.js +502 -0
  257. package/src/lib/resources/utils/feature-updater.js +271 -0
  258. package/src/lib/resources/utils/git-utils.js +220 -0
  259. package/src/lib/resources/utils/importance-classifier.js +645 -0
  260. package/src/lib/resources/utils/information-filter.js +710 -0
  261. package/src/lib/resources/utils/persona-aware-compressor.js +598 -0
  262. package/src/lib/resources/utils/prompt-injector.js +242 -0
  263. package/src/lib/resources/utils/simplified-evaluator.js +119 -0
  264. package/src/lib/resources/utils/text-summarizer.js +492 -0
  265. package/src/lib/resources/utils/token-counter.js +177 -0
  266. package/src/lib/resources/utils/token-monitor.js +484 -0
  267. package/src/lib/resources/utils/token-reporter.js +453 -0
  268. package/src/lib/resources/utils/token-storage.js +433 -0
  269. package/src/lib/resources/utils/token-tracker.js +283 -0
  270. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_switch_language.md +0 -160
  271. /package/claude-code/aiwf/ko/.claude/commands/aiwf/{aiwf_update_docs_kr.md → aiwf_update_docs.md} +0 -0
@@ -0,0 +1,68 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import fs from 'fs/promises';
3
+ import path from 'path';
4
+
5
+ export const aiwfController = {
6
+ getFeatures: async (req: Request, res: Response, next: NextFunction) => {
7
+ try {
8
+ const ledgerPath = path.join(process.cwd(), '.aiwf', 'feature-ledger.json');
9
+ const ledgerData = await fs.readFile(ledgerPath, 'utf-8');
10
+ const ledger = JSON.parse(ledgerData);
11
+
12
+ res.json({
13
+ success: true,
14
+ data: ledger,
15
+ });
16
+ } catch (error) {
17
+ next(error);
18
+ }
19
+ },
20
+
21
+ getTokenUsage: async (req: Request, res: Response, next: NextFunction) => {
22
+ try {
23
+ // 실제 구현에서는 토큰 사용량을 추적하는 로직 필요
24
+ const mockData = {
25
+ total: parseInt(process.env.AIWF_TOKEN_LIMIT || '100000'),
26
+ used: 45000,
27
+ remaining: 55000,
28
+ percentage: 45,
29
+ history: [
30
+ {
31
+ date: new Date().toISOString(),
32
+ tokens: 1500,
33
+ action: 'API endpoint creation',
34
+ endpoint: 'POST /api/v1/users',
35
+ },
36
+ ],
37
+ };
38
+
39
+ res.json({
40
+ success: true,
41
+ data: mockData,
42
+ });
43
+ } catch (error) {
44
+ next(error);
45
+ }
46
+ },
47
+
48
+ getContextStatus: async (req: Request, res: Response, next: NextFunction) => {
49
+ try {
50
+ const configPath = path.join(process.cwd(), '.aiwf', 'config.json');
51
+ const configData = await fs.readFile(configPath, 'utf-8');
52
+ const config = JSON.parse(configData);
53
+
54
+ res.json({
55
+ success: true,
56
+ data: {
57
+ compressionLevel: config.features.context_compression.level,
58
+ cacheEnabled: config.features.context_compression.cache_enabled,
59
+ tokenLimit: config.features.context_compression.token_limit,
60
+ activePersona: config.features.ai_persona.default,
61
+ availablePersonas: config.features.ai_persona.available,
62
+ },
63
+ });
64
+ } catch (error) {
65
+ next(error);
66
+ }
67
+ },
68
+ };
@@ -0,0 +1,128 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import { validationResult } from 'express-validator';
3
+ import bcrypt from 'bcryptjs';
4
+ import jwt from 'jsonwebtoken';
5
+
6
+ interface User {
7
+ id: string;
8
+ email: string;
9
+ password: string;
10
+ name: string;
11
+ }
12
+
13
+ // 임시 메모리 저장소 (실제로는 데이터베이스 사용)
14
+ const users: User[] = [];
15
+
16
+ export const authController = {
17
+ register: async (req: Request, res: Response, next: NextFunction) => {
18
+ try {
19
+ const errors = validationResult(req);
20
+ if (!errors.isEmpty()) {
21
+ return res.status(400).json({
22
+ success: false,
23
+ errors: errors.array()
24
+ });
25
+ }
26
+
27
+ const { email, password, name } = req.body;
28
+
29
+ // 중복 체크
30
+ const existingUser = users.find(u => u.email === email);
31
+ if (existingUser) {
32
+ return res.status(409).json({
33
+ success: false,
34
+ error: { message: 'Email already exists' }
35
+ });
36
+ }
37
+
38
+ // 비밀번호 해싱
39
+ const hashedPassword = await bcrypt.hash(
40
+ password,
41
+ parseInt(process.env.BCRYPT_ROUNDS || '10')
42
+ );
43
+
44
+ // 사용자 생성
45
+ const newUser: User = {
46
+ id: Date.now().toString(),
47
+ email,
48
+ password: hashedPassword,
49
+ name,
50
+ };
51
+ users.push(newUser);
52
+
53
+ // JWT 토큰 생성
54
+ const token = jwt.sign(
55
+ { id: newUser.id, email: newUser.email },
56
+ process.env.JWT_SECRET || 'secret',
57
+ { expiresIn: process.env.JWT_EXPIRES_IN || '7d' }
58
+ );
59
+
60
+ res.status(201).json({
61
+ success: true,
62
+ data: {
63
+ user: {
64
+ id: newUser.id,
65
+ email: newUser.email,
66
+ name: newUser.name,
67
+ },
68
+ token,
69
+ },
70
+ });
71
+ } catch (error) {
72
+ next(error);
73
+ }
74
+ },
75
+
76
+ login: async (req: Request, res: Response, next: NextFunction) => {
77
+ try {
78
+ const errors = validationResult(req);
79
+ if (!errors.isEmpty()) {
80
+ return res.status(400).json({
81
+ success: false,
82
+ errors: errors.array()
83
+ });
84
+ }
85
+
86
+ const { email, password } = req.body;
87
+
88
+ // 사용자 찾기
89
+ const user = users.find(u => u.email === email);
90
+ if (!user) {
91
+ return res.status(401).json({
92
+ success: false,
93
+ error: { message: 'Invalid credentials' }
94
+ });
95
+ }
96
+
97
+ // 비밀번호 확인
98
+ const isPasswordValid = await bcrypt.compare(password, user.password);
99
+ if (!isPasswordValid) {
100
+ return res.status(401).json({
101
+ success: false,
102
+ error: { message: 'Invalid credentials' }
103
+ });
104
+ }
105
+
106
+ // JWT 토큰 생성
107
+ const token = jwt.sign(
108
+ { id: user.id, email: user.email },
109
+ process.env.JWT_SECRET || 'secret',
110
+ { expiresIn: process.env.JWT_EXPIRES_IN || '7d' }
111
+ );
112
+
113
+ res.json({
114
+ success: true,
115
+ data: {
116
+ user: {
117
+ id: user.id,
118
+ email: user.email,
119
+ name: user.name,
120
+ },
121
+ token,
122
+ },
123
+ });
124
+ } catch (error) {
125
+ next(error);
126
+ }
127
+ },
128
+ };
@@ -0,0 +1,28 @@
1
+ import { Request, Response } from 'express';
2
+ import os from 'os';
3
+
4
+ export const statusController = {
5
+ getStatus: (req: Request, res: Response) => {
6
+ res.json({
7
+ success: true,
8
+ data: {
9
+ service: '{{projectName}}',
10
+ version: process.env.npm_package_version || '0.0.1',
11
+ environment: process.env.NODE_ENV || 'development',
12
+ uptime: process.uptime(),
13
+ timestamp: new Date().toISOString(),
14
+ system: {
15
+ platform: os.platform(),
16
+ release: os.release(),
17
+ totalMemory: os.totalmem(),
18
+ freeMemory: os.freemem(),
19
+ cpus: os.cpus().length,
20
+ },
21
+ aiwf: {
22
+ enabled: process.env.AIWF_ENABLED === 'true',
23
+ compressionLevel: process.env.AIWF_COMPRESSION_LEVEL || 'balanced',
24
+ },
25
+ },
26
+ });
27
+ },
28
+ };
@@ -0,0 +1,28 @@
1
+ import 'dotenv/config';
2
+ import app from './app';
3
+ import logger from '@utils/logger';
4
+
5
+ const PORT = process.env.PORT || 3000;
6
+ const HOST = process.env.HOST || 'localhost';
7
+
8
+ const server = app.listen(PORT, () => {
9
+ logger.info(`🚀 Server is running on http://${HOST}:${PORT}`);
10
+ logger.info(`📚 API Documentation available at http://${HOST}:${PORT}/docs`);
11
+ logger.info(`🤖 AIWF Integration enabled`);
12
+ });
13
+
14
+ // Graceful shutdown
15
+ process.on('SIGTERM', () => {
16
+ logger.info('SIGTERM signal received: closing HTTP server');
17
+ server.close(() => {
18
+ logger.info('HTTP server closed');
19
+ process.exit(0);
20
+ });
21
+ });
22
+
23
+ process.on('unhandledRejection', (reason, promise) => {
24
+ logger.error('Unhandled Rejection at:', promise, 'reason:', reason);
25
+ // Application specific logging, throwing an error, or other logic here
26
+ });
27
+
28
+ export default server;
@@ -0,0 +1,50 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import fs from 'fs/promises';
3
+ import path from 'path';
4
+
5
+ interface AiwfRequest extends Request {
6
+ aiwf?: {
7
+ featureId?: string;
8
+ persona?: string;
9
+ tokenUsage?: number;
10
+ };
11
+ }
12
+
13
+ export const aiwfMiddleware = async (
14
+ req: AiwfRequest,
15
+ res: Response,
16
+ next: NextFunction
17
+ ) => {
18
+ // AIWF 헤더 체크
19
+ const featureId = req.headers['x-aiwf-feature-id'] as string;
20
+ const persona = req.headers['x-aiwf-persona'] as string;
21
+
22
+ req.aiwf = {
23
+ featureId,
24
+ persona: persona || 'backend-engineer',
25
+ tokenUsage: 0,
26
+ };
27
+
28
+ // Feature 추적
29
+ if (featureId && process.env.AIWF_ENABLED === 'true') {
30
+ try {
31
+ const ledgerPath = path.join(process.cwd(), '.aiwf', 'feature-ledger.json');
32
+ const ledgerData = await fs.readFile(ledgerPath, 'utf-8');
33
+ const ledger = JSON.parse(ledgerData);
34
+
35
+ // API 엔드포인트 추적 로직
36
+ const endpoint = `${req.method} ${req.route?.path || req.path}`;
37
+ const feature = ledger.features.find((f: any) => f.id === featureId);
38
+
39
+ if (feature && !feature.endpoints?.includes(endpoint)) {
40
+ feature.endpoints = feature.endpoints || [];
41
+ feature.endpoints.push(endpoint);
42
+ await fs.writeFile(ledgerPath, JSON.stringify(ledger, null, 2));
43
+ }
44
+ } catch (error) {
45
+ // 에러 무시 (AIWF 기능이 없어도 API는 동작해야 함)
46
+ }
47
+ }
48
+
49
+ next();
50
+ };
@@ -0,0 +1,41 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import jwt from 'jsonwebtoken';
3
+
4
+ interface AuthRequest extends Request {
5
+ user?: {
6
+ id: string;
7
+ email: string;
8
+ };
9
+ }
10
+
11
+ export const authMiddleware = (
12
+ req: AuthRequest,
13
+ res: Response,
14
+ next: NextFunction
15
+ ) => {
16
+ const authHeader = req.headers.authorization;
17
+
18
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
19
+ return res.status(401).json({
20
+ success: false,
21
+ error: { message: 'No token provided' }
22
+ });
23
+ }
24
+
25
+ const token = authHeader.substring(7);
26
+
27
+ try {
28
+ const decoded = jwt.verify(
29
+ token,
30
+ process.env.JWT_SECRET || 'secret'
31
+ ) as { id: string; email: string };
32
+
33
+ req.user = decoded;
34
+ next();
35
+ } catch (error) {
36
+ return res.status(401).json({
37
+ success: false,
38
+ error: { message: 'Invalid token' }
39
+ });
40
+ }
41
+ };
@@ -0,0 +1,42 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import logger from '@utils/logger';
3
+
4
+ interface CustomError extends Error {
5
+ statusCode?: number;
6
+ status?: string;
7
+ isOperational?: boolean;
8
+ }
9
+
10
+ export const errorHandler = (
11
+ err: CustomError,
12
+ req: Request,
13
+ res: Response,
14
+ next: NextFunction
15
+ ) => {
16
+ let { statusCode = 500, message } = err;
17
+
18
+ logger.error({
19
+ error: err,
20
+ request: {
21
+ method: req.method,
22
+ url: req.url,
23
+ headers: req.headers,
24
+ body: req.body,
25
+ },
26
+ });
27
+
28
+ // Don't leak error details in production
29
+ if (process.env.NODE_ENV === 'production' && statusCode === 500) {
30
+ message = 'Internal Server Error';
31
+ }
32
+
33
+ res.status(statusCode).json({
34
+ success: false,
35
+ error: {
36
+ statusCode,
37
+ message,
38
+ ...(process.env.NODE_ENV === 'development' && { stack: err.stack }),
39
+ },
40
+ timestamp: new Date().toISOString(),
41
+ });
42
+ };
@@ -0,0 +1,14 @@
1
+ import { Request, Response } from 'express';
2
+
3
+ export const notFoundHandler = (req: Request, res: Response) => {
4
+ res.status(404).json({
5
+ success: false,
6
+ error: {
7
+ statusCode: 404,
8
+ message: 'Resource not found',
9
+ path: req.url,
10
+ method: req.method,
11
+ },
12
+ timestamp: new Date().toISOString(),
13
+ });
14
+ };
@@ -0,0 +1,20 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import logger from '@utils/logger';
3
+
4
+ export const requestLogger = (req: Request, res: Response, next: NextFunction) => {
5
+ const start = Date.now();
6
+
7
+ res.on('finish', () => {
8
+ const duration = Date.now() - start;
9
+ logger.info({
10
+ method: req.method,
11
+ url: req.url,
12
+ status: res.statusCode,
13
+ duration: `${duration}ms`,
14
+ ip: req.ip,
15
+ userAgent: req.get('user-agent'),
16
+ });
17
+ });
18
+
19
+ next();
20
+ };
@@ -0,0 +1,42 @@
1
+ import { Router } from 'express';
2
+ import { aiwfController } from '@controllers/aiwfController';
3
+
4
+ const router = Router();
5
+
6
+ /**
7
+ * @swagger
8
+ * /api/aiwf/features:
9
+ * get:
10
+ * summary: Feature Ledger 조회
11
+ * tags: [AIWF]
12
+ * responses:
13
+ * 200:
14
+ * description: Feature 목록
15
+ */
16
+ router.get('/features', aiwfController.getFeatures);
17
+
18
+ /**
19
+ * @swagger
20
+ * /api/aiwf/token-usage:
21
+ * get:
22
+ * summary: 토큰 사용량 조회
23
+ * tags: [AIWF]
24
+ * responses:
25
+ * 200:
26
+ * description: 토큰 사용 현황
27
+ */
28
+ router.get('/token-usage', aiwfController.getTokenUsage);
29
+
30
+ /**
31
+ * @swagger
32
+ * /api/aiwf/context:
33
+ * get:
34
+ * summary: Context 상태 조회
35
+ * tags: [AIWF]
36
+ * responses:
37
+ * 200:
38
+ * description: Context 압축 상태
39
+ */
40
+ router.get('/context', aiwfController.getContextStatus);
41
+
42
+ export default router;
@@ -0,0 +1,13 @@
1
+ import { Router } from 'express';
2
+ import v1Routes from './v1';
3
+ import aiwfRoutes from './aiwf';
4
+
5
+ const router = Router();
6
+
7
+ // API 버전 라우팅
8
+ router.use('/v1', v1Routes);
9
+
10
+ // AIWF 전용 라우트
11
+ router.use('/aiwf', aiwfRoutes);
12
+
13
+ export default router;
@@ -0,0 +1,67 @@
1
+ import { Router } from 'express';
2
+ import { statusController } from '@controllers/statusController';
3
+ import { authController } from '@controllers/authController';
4
+ import { authMiddleware } from '@middleware/authMiddleware';
5
+
6
+ const router = Router();
7
+
8
+ /**
9
+ * @swagger
10
+ * /api/v1/status:
11
+ * get:
12
+ * summary: API 상태 확인
13
+ * tags: [Status]
14
+ * responses:
15
+ * 200:
16
+ * description: API 상태 정보
17
+ */
18
+ router.get('/status', statusController.getStatus);
19
+
20
+ /**
21
+ * @swagger
22
+ * /api/v1/auth/register:
23
+ * post:
24
+ * summary: 사용자 등록
25
+ * tags: [Auth]
26
+ * requestBody:
27
+ * required: true
28
+ * content:
29
+ * application/json:
30
+ * schema:
31
+ * type: object
32
+ * properties:
33
+ * email:
34
+ * type: string
35
+ * password:
36
+ * type: string
37
+ * name:
38
+ * type: string
39
+ */
40
+ router.post('/auth/register', authController.register);
41
+
42
+ /**
43
+ * @swagger
44
+ * /api/v1/auth/login:
45
+ * post:
46
+ * summary: 사용자 로그인
47
+ * tags: [Auth]
48
+ * requestBody:
49
+ * required: true
50
+ * content:
51
+ * application/json:
52
+ * schema:
53
+ * type: object
54
+ * properties:
55
+ * email:
56
+ * type: string
57
+ * password:
58
+ * type: string
59
+ */
60
+ router.post('/auth/login', authController.login);
61
+
62
+ // Protected routes example
63
+ router.get('/protected', authMiddleware, (req, res) => {
64
+ res.json({ message: 'This is a protected route' });
65
+ });
66
+
67
+ export default router;
@@ -0,0 +1,37 @@
1
+ import winston from 'winston';
2
+
3
+ const logger = winston.createLogger({
4
+ level: process.env.LOG_LEVEL || 'info',
5
+ format: winston.format.combine(
6
+ winston.format.timestamp(),
7
+ winston.format.errors({ stack: true }),
8
+ winston.format.splat(),
9
+ winston.format.json()
10
+ ),
11
+ defaultMeta: { service: '{{projectName}}' },
12
+ transports: [
13
+ new winston.transports.Console({
14
+ format: winston.format.combine(
15
+ winston.format.colorize(),
16
+ winston.format.simple()
17
+ ),
18
+ }),
19
+ ],
20
+ });
21
+
22
+ // Production에서는 파일 로깅 추가
23
+ if (process.env.NODE_ENV === 'production') {
24
+ logger.add(
25
+ new winston.transports.File({
26
+ filename: 'logs/error.log',
27
+ level: 'error',
28
+ })
29
+ );
30
+ logger.add(
31
+ new winston.transports.File({
32
+ filename: 'logs/combined.log',
33
+ })
34
+ );
35
+ }
36
+
37
+ export default logger;
@@ -0,0 +1,40 @@
1
+ import request from 'supertest';
2
+ import app from '../src/app';
3
+
4
+ describe('App', () => {
5
+ describe('GET /health', () => {
6
+ it('should return health status', async () => {
7
+ const response = await request(app)
8
+ .get('/health')
9
+ .expect(200);
10
+
11
+ expect(response.body).toHaveProperty('status', 'healthy');
12
+ expect(response.body).toHaveProperty('timestamp');
13
+ expect(response.body).toHaveProperty('uptime');
14
+ });
15
+ });
16
+
17
+ describe('GET /api/v1/status', () => {
18
+ it('should return API status', async () => {
19
+ const response = await request(app)
20
+ .get('/api/v1/status')
21
+ .expect(200);
22
+
23
+ expect(response.body.success).toBe(true);
24
+ expect(response.body.data).toHaveProperty('service');
25
+ expect(response.body.data).toHaveProperty('version');
26
+ expect(response.body.data).toHaveProperty('aiwf');
27
+ });
28
+ });
29
+
30
+ describe('404 Handler', () => {
31
+ it('should return 404 for unknown routes', async () => {
32
+ const response = await request(app)
33
+ .get('/unknown-route')
34
+ .expect(404);
35
+
36
+ expect(response.body.success).toBe(false);
37
+ expect(response.body.error.statusCode).toBe(404);
38
+ });
39
+ });
40
+ });
@@ -0,0 +1,43 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "commonjs",
5
+ "lib": ["ES2022"],
6
+ "outDir": "./dist",
7
+ "rootDir": "./src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "resolveJsonModule": true,
13
+ "declaration": true,
14
+ "declarationMap": true,
15
+ "sourceMap": true,
16
+ "removeComments": true,
17
+ "noImplicitAny": true,
18
+ "strictNullChecks": true,
19
+ "strictFunctionTypes": true,
20
+ "noImplicitThis": true,
21
+ "noUnusedLocals": true,
22
+ "noUnusedParameters": true,
23
+ "noImplicitReturns": true,
24
+ "noFallthroughCasesInSwitch": true,
25
+ "allowSyntheticDefaultImports": true,
26
+ "emitDecoratorMetadata": true,
27
+ "experimentalDecorators": true,
28
+ "baseUrl": ".",
29
+ "paths": {
30
+ "@/*": ["src/*"],
31
+ "@config/*": ["src/config/*"],
32
+ "@controllers/*": ["src/controllers/*"],
33
+ "@middleware/*": ["src/middleware/*"],
34
+ "@models/*": ["src/models/*"],
35
+ "@routes/*": ["src/routes/*"],
36
+ "@services/*": ["src/services/*"],
37
+ "@utils/*": ["src/utils/*"],
38
+ "@types/*": ["src/types/*"]
39
+ }
40
+ },
41
+ "include": ["src/**/*"],
42
+ "exclude": ["node_modules", "dist", "tests"]
43
+ }