aiwf 0.3.7 → 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 (267) 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/ko/.claude/commands/aiwf/aiwf_compress_aggressive_persona.md +2 -2
  129. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_compress_minimal_persona.md +2 -2
  130. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_compress_stats.md +10 -47
  131. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_compress_with_persona.md +2 -2
  132. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_create_feature_ledger.md +1 -1
  133. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_default_mode.md +1 -1
  134. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_evaluate.md +2 -2
  135. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_get_feature_details.md +1 -1
  136. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_link_feature_to_milestone.md +1 -1
  137. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_list_features.md +1 -1
  138. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_architect.md +1 -1
  139. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_backend.md +1 -1
  140. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_data_analyst.md +1 -1
  141. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_frontend.md +1 -1
  142. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_security.md +1 -1
  143. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_persona_status.md +1 -1
  144. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_update_feature_status.md +1 -1
  145. package/package.json +1 -1
  146. package/src/cli/index.js +174 -0
  147. package/src/commands/compress.js +60 -0
  148. package/src/commands/create-project.js +23 -17
  149. package/src/commands/evaluate.js +459 -0
  150. package/src/commands/feature.js +365 -0
  151. package/src/commands/persona.js +37 -16
  152. package/src/commands/token.js +312 -0
  153. package/src/lib/resource-loader.js +250 -0
  154. package/src/lib/resources/commands/ai-persona.js +602 -0
  155. package/src/lib/resources/commands/compress-context.js +389 -0
  156. package/src/lib/resources/commands/evaluate.js +246 -0
  157. package/src/lib/resources/commands/feature-ledger.js +565 -0
  158. package/src/lib/resources/commands/feature_commit_report.js +370 -0
  159. package/src/lib/resources/commands/persona-context-apply.js +562 -0
  160. package/src/lib/resources/commands/scan_git_history.js +234 -0
  161. package/src/lib/resources/commands/sync_feature_commits.js +154 -0
  162. package/src/lib/resources/commands/token-tracking.js +443 -0
  163. package/src/lib/resources/config/commit-patterns.js +103 -0
  164. package/src/lib/resources/config/language.json +6 -0
  165. package/src/lib/resources/personas/PERSONA_INDEX.md +57 -0
  166. package/src/lib/resources/personas/analyst.json +44 -0
  167. package/src/lib/resources/personas/architect/best_practices.md +136 -0
  168. package/src/lib/resources/personas/architect/knowledge_base.md +377 -0
  169. package/src/lib/resources/personas/architect.json +44 -0
  170. package/src/lib/resources/personas/backend/best_practices.md +766 -0
  171. package/src/lib/resources/personas/backend/knowledge_base.md +1070 -0
  172. package/src/lib/resources/personas/data_analyst/best_practices.md +594 -0
  173. package/src/lib/resources/personas/data_analyst/knowledge_base.md +1057 -0
  174. package/src/lib/resources/personas/developer.json +44 -0
  175. package/src/lib/resources/personas/developer.md +37 -0
  176. package/src/lib/resources/personas/evaluation_criteria.json +137 -0
  177. package/src/lib/resources/personas/frontend/best_practices.md +445 -0
  178. package/src/lib/resources/personas/frontend/knowledge_base.md +729 -0
  179. package/src/lib/resources/personas/persona-index.json +31 -0
  180. package/src/lib/resources/personas/reviewer.json +44 -0
  181. package/src/lib/resources/personas/security/best_practices.md +307 -0
  182. package/src/lib/resources/personas/security/knowledge_base.md +498 -0
  183. package/src/lib/resources/personas/tester.json +44 -0
  184. package/src/lib/resources/templates/README.md +78 -0
  185. package/src/lib/resources/templates/api-server/config.json +64 -0
  186. package/src/lib/resources/templates/api-server/template/.aiwf/config.json +56 -0
  187. package/src/lib/resources/templates/api-server/template/.aiwf/feature-ledger.json +42 -0
  188. package/src/lib/resources/templates/api-server/template/.aiwf/personas/backend-engineer.json +40 -0
  189. package/src/lib/resources/templates/api-server/template/.aiwf/scripts/cli.js +111 -0
  190. package/src/lib/resources/templates/api-server/template/.env.example +29 -0
  191. package/src/lib/resources/templates/api-server/template/.eslintrc.json +23 -0
  192. package/src/lib/resources/templates/api-server/template/README.md +171 -0
  193. package/src/lib/resources/templates/api-server/template/jest.config.js +26 -0
  194. package/src/lib/resources/templates/api-server/template/nodemon.json +9 -0
  195. package/src/lib/resources/templates/api-server/template/package.json +61 -0
  196. package/src/lib/resources/templates/api-server/template/src/app.ts +60 -0
  197. package/src/lib/resources/templates/api-server/template/src/config/swagger.ts +38 -0
  198. package/src/lib/resources/templates/api-server/template/src/controllers/aiwfController.ts +68 -0
  199. package/src/lib/resources/templates/api-server/template/src/controllers/authController.ts +128 -0
  200. package/src/lib/resources/templates/api-server/template/src/controllers/statusController.ts +28 -0
  201. package/src/lib/resources/templates/api-server/template/src/index.ts +28 -0
  202. package/src/lib/resources/templates/api-server/template/src/middleware/aiwfMiddleware.ts +50 -0
  203. package/src/lib/resources/templates/api-server/template/src/middleware/authMiddleware.ts +41 -0
  204. package/src/lib/resources/templates/api-server/template/src/middleware/errorHandler.ts +42 -0
  205. package/src/lib/resources/templates/api-server/template/src/middleware/notFoundHandler.ts +14 -0
  206. package/src/lib/resources/templates/api-server/template/src/middleware/requestLogger.ts +20 -0
  207. package/src/lib/resources/templates/api-server/template/src/routes/aiwf.ts +42 -0
  208. package/src/lib/resources/templates/api-server/template/src/routes/index.ts +13 -0
  209. package/src/lib/resources/templates/api-server/template/src/routes/v1/index.ts +67 -0
  210. package/src/lib/resources/templates/api-server/template/src/utils/logger.ts +37 -0
  211. package/src/lib/resources/templates/api-server/template/tests/app.test.ts +40 -0
  212. package/src/lib/resources/templates/api-server/template/tsconfig.json +43 -0
  213. package/src/lib/resources/templates/npm-library/config.json +61 -0
  214. package/src/lib/resources/templates/npm-library/template/LICENSE +21 -0
  215. package/src/lib/resources/templates/npm-library/template/README.md +201 -0
  216. package/src/lib/resources/templates/npm-library/template/package.json +78 -0
  217. package/src/lib/resources/templates/web-app/config.json +53 -0
  218. package/src/lib/resources/templates/web-app/template/.aiwf/config.json +54 -0
  219. package/src/lib/resources/templates/web-app/template/.aiwf/feature-ledger.json +37 -0
  220. package/src/lib/resources/templates/web-app/template/.aiwf/personas/fullstack-developer.json +40 -0
  221. package/src/lib/resources/templates/web-app/template/.aiwf/scripts/cli.js +110 -0
  222. package/src/lib/resources/templates/web-app/template/.eslintrc.cjs +20 -0
  223. package/src/lib/resources/templates/web-app/template/README.md +151 -0
  224. package/src/lib/resources/templates/web-app/template/index.html +14 -0
  225. package/src/lib/resources/templates/web-app/template/package.json +44 -0
  226. package/src/lib/resources/templates/web-app/template/postcss.config.js +6 -0
  227. package/src/lib/resources/templates/web-app/template/public/vite.svg +1 -0
  228. package/src/lib/resources/templates/web-app/template/src/App.tsx +21 -0
  229. package/src/lib/resources/templates/web-app/template/src/components/Layout.tsx +57 -0
  230. package/src/lib/resources/templates/web-app/template/src/components/aiwf/ContextStatus.tsx +107 -0
  231. package/src/lib/resources/templates/web-app/template/src/components/aiwf/FeatureLedger.tsx +93 -0
  232. package/src/lib/resources/templates/web-app/template/src/components/aiwf/TokenUsage.tsx +71 -0
  233. package/src/lib/resources/templates/web-app/template/src/index.css +60 -0
  234. package/src/lib/resources/templates/web-app/template/src/main.tsx +10 -0
  235. package/src/lib/resources/templates/web-app/template/src/pages/AiwfDashboard.tsx +60 -0
  236. package/src/lib/resources/templates/web-app/template/src/pages/HomePage.tsx +89 -0
  237. package/src/lib/resources/templates/web-app/template/src/pages/NotFound.tsx +25 -0
  238. package/src/lib/resources/templates/web-app/template/src/stores/aiwfStore.ts +126 -0
  239. package/src/lib/resources/templates/web-app/template/src/types/global.d.ts +9 -0
  240. package/src/lib/resources/templates/web-app/template/src/vite-env.d.ts +1 -0
  241. package/src/lib/resources/templates/web-app/template/tailwind.config.js +30 -0
  242. package/src/lib/resources/templates/web-app/template/tsconfig.json +37 -0
  243. package/src/lib/resources/templates/web-app/template/tsconfig.node.json +10 -0
  244. package/src/lib/resources/templates/web-app/template/vite.config.ts +23 -0
  245. package/src/lib/resources/utils/background-monitor.js +223 -0
  246. package/src/lib/resources/utils/compression-metrics.js +1031 -0
  247. package/src/lib/resources/utils/compression-strategies.js +557 -0
  248. package/src/lib/resources/utils/content-normalizer.js +455 -0
  249. package/src/lib/resources/utils/context-compressor.js +583 -0
  250. package/src/lib/resources/utils/context-rule-parser.js +180 -0
  251. package/src/lib/resources/utils/context-token-monitor.js +463 -0
  252. package/src/lib/resources/utils/context-update-manager.js +502 -0
  253. package/src/lib/resources/utils/feature-updater.js +271 -0
  254. package/src/lib/resources/utils/git-utils.js +220 -0
  255. package/src/lib/resources/utils/importance-classifier.js +645 -0
  256. package/src/lib/resources/utils/information-filter.js +710 -0
  257. package/src/lib/resources/utils/persona-aware-compressor.js +598 -0
  258. package/src/lib/resources/utils/prompt-injector.js +242 -0
  259. package/src/lib/resources/utils/simplified-evaluator.js +119 -0
  260. package/src/lib/resources/utils/text-summarizer.js +492 -0
  261. package/src/lib/resources/utils/token-counter.js +177 -0
  262. package/src/lib/resources/utils/token-monitor.js +484 -0
  263. package/src/lib/resources/utils/token-reporter.js +453 -0
  264. package/src/lib/resources/utils/token-storage.js +433 -0
  265. package/src/lib/resources/utils/token-tracker.js +283 -0
  266. package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_switch_language.md +0 -160
  267. /package/claude-code/aiwf/ko/.claude/commands/aiwf/{aiwf_update_docs_kr.md → aiwf_update_docs.md} +0 -0
@@ -0,0 +1,484 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { TokenStorage } from './token-storage.js';
4
+
5
+ /**
6
+ * 토큰 사용량 모니터링 및 임계값 알림을 관리하는 클래스
7
+ */
8
+ export class TokenMonitor {
9
+ constructor() {
10
+ this.storage = new TokenStorage();
11
+ this.configFile = '.aiwf/token-data/monitor-config.json';
12
+ this.alertsFile = '.aiwf/token-data/alerts.json';
13
+ this.isEnabled = false;
14
+ this.thresholds = this.loadConfig();
15
+ this.alerts = this.loadAlerts();
16
+
17
+ this.ensureConfigExists();
18
+ }
19
+
20
+ /**
21
+ * 모니터링 설정을 로드합니다
22
+ * @returns {Object} 모니터링 설정
23
+ */
24
+ loadConfig() {
25
+ try {
26
+ if (fs.existsSync(this.configFile)) {
27
+ const config = JSON.parse(fs.readFileSync(this.configFile, 'utf8'));
28
+ this.isEnabled = config.enabled || false;
29
+ return config.thresholds || this.getDefaultThresholds();
30
+ }
31
+ } catch (error) {
32
+ console.error('모니터링 설정 로드 중 오류 발생:', error);
33
+ }
34
+
35
+ return this.getDefaultThresholds();
36
+ }
37
+
38
+ /**
39
+ * 기본 임계값 설정을 반환합니다
40
+ * @returns {Object} 기본 임계값
41
+ */
42
+ getDefaultThresholds() {
43
+ return {
44
+ dailyTokenLimit: 10000,
45
+ sessionTokenLimit: 2000,
46
+ warningThreshold: 80, // 80%에서 경고
47
+ criticalThreshold: 95, // 95%에서 위험 경고
48
+ sessionsPerDayLimit: 20,
49
+ tokensPerCommandLimit: 500
50
+ };
51
+ }
52
+
53
+ /**
54
+ * 알림 히스토리를 로드합니다
55
+ * @returns {Array<Object>} 알림 목록
56
+ */
57
+ loadAlerts() {
58
+ try {
59
+ if (fs.existsSync(this.alertsFile)) {
60
+ return JSON.parse(fs.readFileSync(this.alertsFile, 'utf8'));
61
+ }
62
+ } catch (error) {
63
+ console.error('알림 히스토리 로드 중 오류 발생:', error);
64
+ }
65
+
66
+ return [];
67
+ }
68
+
69
+ /**
70
+ * 설정 파일이 존재하는지 확인하고 생성합니다
71
+ */
72
+ ensureConfigExists() {
73
+ try {
74
+ const configDir = path.dirname(this.configFile);
75
+ if (!fs.existsSync(configDir)) {
76
+ fs.mkdirSync(configDir, { recursive: true });
77
+ }
78
+
79
+ if (!fs.existsSync(this.configFile)) {
80
+ this.saveConfig();
81
+ }
82
+ } catch (error) {
83
+ console.error('설정 파일 생성 중 오류 발생:', error);
84
+ }
85
+ }
86
+
87
+ /**
88
+ * 설정을 저장합니다
89
+ */
90
+ saveConfig() {
91
+ try {
92
+ const config = {
93
+ enabled: this.isEnabled,
94
+ thresholds: this.thresholds,
95
+ lastUpdated: Date.now()
96
+ };
97
+
98
+ fs.writeFileSync(this.configFile, JSON.stringify(config, null, 2));
99
+ } catch (error) {
100
+ console.error('설정 저장 중 오류 발생:', error);
101
+ }
102
+ }
103
+
104
+ /**
105
+ * 알림을 저장합니다
106
+ */
107
+ saveAlerts() {
108
+ try {
109
+ fs.writeFileSync(this.alertsFile, JSON.stringify(this.alerts, null, 2));
110
+ } catch (error) {
111
+ console.error('알림 저장 중 오류 발생:', error);
112
+ }
113
+ }
114
+
115
+ /**
116
+ * 모니터링을 활성화/비활성화합니다
117
+ * @param {boolean} enabled - 활성화 여부
118
+ */
119
+ setEnabled(enabled) {
120
+ this.isEnabled = enabled;
121
+ this.saveConfig();
122
+ console.log(`토큰 모니터링이 ${enabled ? '활성화' : '비활성화'}되었습니다.`);
123
+ }
124
+
125
+ /**
126
+ * 임계값을 설정합니다
127
+ * @param {Object} newThresholds - 새 임계값 설정
128
+ */
129
+ setThresholds(newThresholds) {
130
+ this.thresholds = { ...this.thresholds, ...newThresholds };
131
+ this.saveConfig();
132
+ console.log('임계값이 업데이트되었습니다.');
133
+ }
134
+
135
+ /**
136
+ * 현재 토큰 사용량을 확인하고 임계값을 검사합니다
137
+ * @returns {Array<Object>} 임계값 위반 목록
138
+ */
139
+ checkThresholds() {
140
+ if (!this.isEnabled) {
141
+ return [];
142
+ }
143
+
144
+ try {
145
+ const violations = this.storage.checkThresholds(this.thresholds);
146
+
147
+ // 새로운 위반사항에 대해 알림 생성
148
+ for (const violation of violations) {
149
+ if (!this.hasRecentAlert(violation.type)) {
150
+ this.createAlert(violation);
151
+ }
152
+ }
153
+
154
+ return violations;
155
+ } catch (error) {
156
+ console.error('임계값 확인 중 오류 발생:', error);
157
+ return [];
158
+ }
159
+ }
160
+
161
+ /**
162
+ * 최근 알림이 있는지 확인합니다
163
+ * @param {string} type - 알림 타입
164
+ * @returns {boolean} 최근 알림 존재 여부
165
+ */
166
+ hasRecentAlert(type) {
167
+ const oneHour = 60 * 60 * 1000;
168
+ const cutoff = Date.now() - oneHour;
169
+
170
+ return this.alerts.some(alert =>
171
+ alert.type === type && alert.timestamp > cutoff
172
+ );
173
+ }
174
+
175
+ /**
176
+ * 새 알림을 생성합니다
177
+ * @param {Object} violation - 위반 정보
178
+ */
179
+ createAlert(violation) {
180
+ try {
181
+ const alert = {
182
+ id: this.generateAlertId(),
183
+ type: violation.type,
184
+ level: this.getAlertLevel(violation),
185
+ message: violation.message,
186
+ threshold: violation.threshold,
187
+ current: violation.current,
188
+ timestamp: Date.now(),
189
+ acknowledged: false
190
+ };
191
+
192
+ this.alerts.push(alert);
193
+ this.saveAlerts();
194
+
195
+ // 알림 출력
196
+ this.displayAlert(alert);
197
+
198
+ // 중요한 알림의 경우 추가 처리
199
+ if (alert.level === 'critical') {
200
+ this.handleCriticalAlert(alert);
201
+ }
202
+ } catch (error) {
203
+ console.error('알림 생성 중 오류 발생:', error);
204
+ }
205
+ }
206
+
207
+ /**
208
+ * 알림 ID를 생성합니다
209
+ * @returns {string} 알림 ID
210
+ */
211
+ generateAlertId() {
212
+ return `alert_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
213
+ }
214
+
215
+ /**
216
+ * 알림 레벨을 결정합니다
217
+ * @param {Object} violation - 위반 정보
218
+ * @returns {string} 알림 레벨
219
+ */
220
+ getAlertLevel(violation) {
221
+ const currentPercentage = (violation.current / violation.threshold) * 100;
222
+
223
+ if (currentPercentage >= this.thresholds.criticalThreshold) {
224
+ return 'critical';
225
+ } else if (currentPercentage >= this.thresholds.warningThreshold) {
226
+ return 'warning';
227
+ } else {
228
+ return 'info';
229
+ }
230
+ }
231
+
232
+ /**
233
+ * 알림을 화면에 표시합니다
234
+ * @param {Object} alert - 알림 정보
235
+ */
236
+ displayAlert(alert) {
237
+ const levelEmoji = {
238
+ info: 'ℹ️',
239
+ warning: '⚠️',
240
+ critical: '🚨'
241
+ };
242
+
243
+ const emoji = levelEmoji[alert.level] || 'ℹ️';
244
+ const timestamp = new Date(alert.timestamp).toLocaleString();
245
+
246
+ console.log(`\n${emoji} [${alert.level.toUpperCase()}] ${timestamp}`);
247
+ console.log(`${alert.message}`);
248
+ console.log(`현재: ${alert.current.toLocaleString()}, 임계값: ${alert.threshold.toLocaleString()}`);
249
+
250
+ if (alert.level === 'critical') {
251
+ console.log('🛑 즉시 조치가 필요합니다!');
252
+ }
253
+
254
+ console.log('─'.repeat(50));
255
+ }
256
+
257
+ /**
258
+ * 위험 알림을 처리합니다
259
+ * @param {Object} alert - 알림 정보
260
+ */
261
+ handleCriticalAlert(alert) {
262
+ try {
263
+ // 위험 알림 로그 파일 생성
264
+ const criticalLogFile = '.aiwf/token-data/critical-alerts.log';
265
+ const logEntry = `[${new Date(alert.timestamp).toISOString()}] ${alert.message}\n`;
266
+
267
+ fs.appendFileSync(criticalLogFile, logEntry);
268
+
269
+ // 자동 압축 제안
270
+ if (alert.type === 'daily_token_limit') {
271
+ console.log('\n🔧 자동 압축을 실행하여 토큰 사용량을 줄이시겠습니까?');
272
+ console.log('명령어: aiwf compress --mode aggressive');
273
+ }
274
+
275
+ // 세션 정리 제안
276
+ if (alert.type === 'daily_session_limit') {
277
+ console.log('\n🧹 오래된 세션을 정리하시겠습니까?');
278
+ console.log('명령어: aiwf cleanup-sessions --older-than 7d');
279
+ }
280
+ } catch (error) {
281
+ console.error('위험 알림 처리 중 오류 발생:', error);
282
+ }
283
+ }
284
+
285
+ /**
286
+ * 실시간 모니터링을 시작합니다
287
+ * @param {number} interval - 모니터링 간격 (밀리초)
288
+ */
289
+ startMonitoring(interval = 60000) { // 기본 1분
290
+ if (!this.isEnabled) {
291
+ console.log('모니터링이 비활성화되어 있습니다.');
292
+ return;
293
+ }
294
+
295
+ console.log(`토큰 모니터링을 시작합니다 (${interval/1000}초 간격)`);
296
+
297
+ this.monitoringInterval = setInterval(() => {
298
+ this.checkThresholds();
299
+ }, interval);
300
+ }
301
+
302
+ /**
303
+ * 실시간 모니터링을 중지합니다
304
+ */
305
+ stopMonitoring() {
306
+ if (this.monitoringInterval) {
307
+ clearInterval(this.monitoringInterval);
308
+ this.monitoringInterval = null;
309
+ console.log('토큰 모니터링을 중지했습니다.');
310
+ }
311
+ }
312
+
313
+ /**
314
+ * 알림을 확인 처리합니다
315
+ * @param {string} alertId - 알림 ID
316
+ */
317
+ acknowledgeAlert(alertId) {
318
+ try {
319
+ const alert = this.alerts.find(a => a.id === alertId);
320
+ if (alert) {
321
+ alert.acknowledged = true;
322
+ alert.acknowledgedAt = Date.now();
323
+ this.saveAlerts();
324
+ console.log(`알림 ${alertId}를 확인 처리했습니다.`);
325
+ } else {
326
+ console.log(`알림 ${alertId}를 찾을 수 없습니다.`);
327
+ }
328
+ } catch (error) {
329
+ console.error('알림 확인 처리 중 오류 발생:', error);
330
+ }
331
+ }
332
+
333
+ /**
334
+ * 모든 알림을 확인 처리합니다
335
+ */
336
+ acknowledgeAllAlerts() {
337
+ try {
338
+ let count = 0;
339
+ for (const alert of this.alerts) {
340
+ if (!alert.acknowledged) {
341
+ alert.acknowledged = true;
342
+ alert.acknowledgedAt = Date.now();
343
+ count++;
344
+ }
345
+ }
346
+
347
+ this.saveAlerts();
348
+ console.log(`${count}개의 알림을 확인 처리했습니다.`);
349
+ } catch (error) {
350
+ console.error('모든 알림 확인 처리 중 오류 발생:', error);
351
+ }
352
+ }
353
+
354
+ /**
355
+ * 미확인 알림을 조회합니다
356
+ * @returns {Array<Object>} 미확인 알림 목록
357
+ */
358
+ getUnacknowledgedAlerts() {
359
+ return this.alerts.filter(alert => !alert.acknowledged);
360
+ }
361
+
362
+ /**
363
+ * 알림 히스토리를 조회합니다
364
+ * @param {number} limit - 조회할 알림 수
365
+ * @returns {Array<Object>} 알림 목록
366
+ */
367
+ getAlertHistory(limit = 50) {
368
+ return this.alerts
369
+ .sort((a, b) => b.timestamp - a.timestamp)
370
+ .slice(0, limit);
371
+ }
372
+
373
+ /**
374
+ * 알림 통계를 조회합니다
375
+ * @returns {Object} 알림 통계
376
+ */
377
+ getAlertStats() {
378
+ try {
379
+ const stats = {
380
+ total: this.alerts.length,
381
+ byLevel: { info: 0, warning: 0, critical: 0 },
382
+ byType: {},
383
+ acknowledged: 0,
384
+ recent: 0 // 최근 24시간
385
+ };
386
+
387
+ const dayAgo = Date.now() - (24 * 60 * 60 * 1000);
388
+
389
+ for (const alert of this.alerts) {
390
+ stats.byLevel[alert.level]++;
391
+ stats.byType[alert.type] = (stats.byType[alert.type] || 0) + 1;
392
+
393
+ if (alert.acknowledged) {
394
+ stats.acknowledged++;
395
+ }
396
+
397
+ if (alert.timestamp > dayAgo) {
398
+ stats.recent++;
399
+ }
400
+ }
401
+
402
+ return stats;
403
+ } catch (error) {
404
+ console.error('알림 통계 조회 중 오류 발생:', error);
405
+ return null;
406
+ }
407
+ }
408
+
409
+ /**
410
+ * 오래된 알림을 정리합니다
411
+ * @param {number} daysToKeep - 보관할 일수
412
+ */
413
+ cleanupOldAlerts(daysToKeep = 30) {
414
+ try {
415
+ const cutoff = Date.now() - (daysToKeep * 24 * 60 * 60 * 1000);
416
+ const originalCount = this.alerts.length;
417
+
418
+ this.alerts = this.alerts.filter(alert => alert.timestamp > cutoff);
419
+
420
+ const removedCount = originalCount - this.alerts.length;
421
+ if (removedCount > 0) {
422
+ this.saveAlerts();
423
+ console.log(`${removedCount}개의 오래된 알림을 정리했습니다.`);
424
+ }
425
+ } catch (error) {
426
+ console.error('알림 정리 중 오류 발생:', error);
427
+ }
428
+ }
429
+
430
+ /**
431
+ * 모니터링 상태를 조회합니다
432
+ * @returns {Object} 모니터링 상태
433
+ */
434
+ getStatus() {
435
+ return {
436
+ enabled: this.isEnabled,
437
+ thresholds: this.thresholds,
438
+ unacknowledgedAlerts: this.getUnacknowledgedAlerts().length,
439
+ totalAlerts: this.alerts.length,
440
+ isRunning: !!this.monitoringInterval,
441
+ lastCheck: this.lastCheck || null
442
+ };
443
+ }
444
+
445
+ /**
446
+ * 모니터링 대시보드를 출력합니다
447
+ */
448
+ displayDashboard() {
449
+ console.log('\n=== 토큰 모니터링 대시보드 ===');
450
+
451
+ const status = this.getStatus();
452
+ const stats = this.getAlertStats();
453
+
454
+ console.log(`상태: ${status.enabled ? '✅ 활성화' : '❌ 비활성화'}`);
455
+ console.log(`실행 중: ${status.isRunning ? '✅ 예' : '❌ 아니오'}`);
456
+
457
+ console.log('\n--- 임계값 설정 ---');
458
+ console.log(`일일 토큰 한도: ${status.thresholds.dailyTokenLimit.toLocaleString()}`);
459
+ console.log(`세션 토큰 한도: ${status.thresholds.sessionTokenLimit.toLocaleString()}`);
460
+ console.log(`경고 임계값: ${status.thresholds.warningThreshold}%`);
461
+ console.log(`위험 임계값: ${status.thresholds.criticalThreshold}%`);
462
+
463
+ console.log('\n--- 알림 통계 ---');
464
+ console.log(`총 알림: ${stats.total}`);
465
+ console.log(`미확인 알림: ${status.unacknowledgedAlerts}`);
466
+ console.log(`최근 24시간: ${stats.recent}`);
467
+ console.log(`위험 알림: ${stats.byLevel.critical}`);
468
+ console.log(`경고 알림: ${stats.byLevel.warning}`);
469
+
470
+ const unacknowledged = this.getUnacknowledgedAlerts();
471
+ if (unacknowledged.length > 0) {
472
+ console.log('\n--- 미확인 알림 ---');
473
+ unacknowledged.slice(0, 5).forEach(alert => {
474
+ const emoji = alert.level === 'critical' ? '🚨' :
475
+ alert.level === 'warning' ? '⚠️' : 'ℹ️';
476
+ console.log(`${emoji} ${alert.message}`);
477
+ });
478
+ }
479
+
480
+ console.log('\n========================\n');
481
+ }
482
+ }
483
+
484
+ export default TokenMonitor;