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,365 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * AIWF Feature Ledger 명령어
5
+ * 기능 개발 추적 및 관리
6
+ */
7
+
8
+ import { ResourceLoader } from '../lib/resource-loader.js';
9
+ import chalk from 'chalk';
10
+ import fs from 'fs-extra';
11
+ import path from 'path';
12
+
13
+ class FeatureCommand {
14
+ constructor() {
15
+ this.resourceLoader = new ResourceLoader();
16
+ this.featureLedgerPath = path.join(process.cwd(), 'feature-ledger');
17
+ }
18
+
19
+ /**
20
+ * Feature 명령어 실행
21
+ */
22
+ async execute(args) {
23
+ const [subcommand, ...restArgs] = args;
24
+
25
+ switch (subcommand) {
26
+ case 'list':
27
+ await this.listFeatures();
28
+ break;
29
+ case 'create':
30
+ case 'add':
31
+ await this.createFeature(restArgs);
32
+ break;
33
+ case 'update':
34
+ await this.updateFeature(restArgs);
35
+ break;
36
+ case 'status':
37
+ await this.showStatus(restArgs[0]);
38
+ break;
39
+ case 'sync':
40
+ await this.syncWithGit();
41
+ break;
42
+ default:
43
+ this.showHelp();
44
+ break;
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Feature 목록 표시
50
+ */
51
+ async listFeatures() {
52
+ try {
53
+ const indexPath = path.join(this.featureLedgerPath, 'feature-index.json');
54
+
55
+ if (!fs.existsSync(indexPath)) {
56
+ console.log(chalk.yellow('⚠️ Feature Ledger가 초기화되지 않았습니다.'));
57
+ console.log(chalk.gray('초기화하려면: aiwf feature create <기능명>'));
58
+ return;
59
+ }
60
+
61
+ const index = await fs.readJson(indexPath);
62
+ const features = index.features || [];
63
+
64
+ console.log(chalk.cyan('📋 Feature Ledger'));
65
+ console.log(chalk.gray('-'.repeat(50)));
66
+
67
+ if (features.length === 0) {
68
+ console.log('등록된 기능이 없습니다.');
69
+ } else {
70
+ features.forEach(feature => {
71
+ const statusIcon = this.getStatusIcon(feature.status);
72
+ const statusColor = this.getStatusColor(feature.status);
73
+ console.log(`${statusIcon} ${chalk.bold(feature.id)} - ${feature.name}`);
74
+ console.log(` 상태: ${chalk[statusColor](feature.status)}`);
75
+ console.log(` 설명: ${feature.description || '없음'}`);
76
+ console.log('');
77
+ });
78
+ }
79
+
80
+ console.log(chalk.gray('-'.repeat(50)));
81
+ console.log(`총 ${features.length}개의 기능`);
82
+
83
+ } catch (error) {
84
+ console.error(chalk.red('❌ Feature 목록 조회 중 오류가 발생했습니다:'), error.message);
85
+ }
86
+ }
87
+
88
+ /**
89
+ * 새 Feature 생성
90
+ */
91
+ async createFeature(args) {
92
+ const [name, ...descriptionParts] = args;
93
+
94
+ if (!name) {
95
+ console.error(chalk.red('❌ Feature 이름을 지정해주세요.'));
96
+ console.log(chalk.gray('사용법: aiwf feature create <기능명> [설명]'));
97
+ return;
98
+ }
99
+
100
+ try {
101
+ // Feature Ledger 디렉토리 생성
102
+ await fs.ensureDir(this.featureLedgerPath);
103
+
104
+ // Feature Index 로드 또는 생성
105
+ const indexPath = path.join(this.featureLedgerPath, 'feature-index.json');
106
+ let index = { features: [], lastId: 0 };
107
+
108
+ if (fs.existsSync(indexPath)) {
109
+ index = await fs.readJson(indexPath);
110
+ }
111
+
112
+ // 새 Feature ID 생성
113
+ const newId = `FL-${String(index.lastId + 1).padStart(3, '0')}`;
114
+ const description = descriptionParts.join(' ');
115
+
116
+ // Feature 데이터
117
+ const feature = {
118
+ id: newId,
119
+ name: name,
120
+ description: description,
121
+ status: 'planned',
122
+ createdAt: new Date().toISOString(),
123
+ updatedAt: new Date().toISOString(),
124
+ commits: [],
125
+ tasks: []
126
+ };
127
+
128
+ // Feature 파일 생성
129
+ const featureFile = path.join(this.featureLedgerPath, `${newId}-${name.toLowerCase().replace(/\s+/g, '-')}.json`);
130
+ await fs.writeJson(featureFile, feature, { spaces: 2 });
131
+
132
+ // Index 업데이트
133
+ index.features.push({
134
+ id: newId,
135
+ name: name,
136
+ description: description,
137
+ status: 'planned',
138
+ file: path.basename(featureFile)
139
+ });
140
+ index.lastId++;
141
+
142
+ await fs.writeJson(indexPath, index, { spaces: 2 });
143
+
144
+ console.log(chalk.green(`✅ Feature ${chalk.bold(newId)} 생성 완료!`));
145
+ console.log(`파일: ${chalk.yellow(featureFile)}`);
146
+
147
+ } catch (error) {
148
+ console.error(chalk.red('❌ Feature 생성 중 오류가 발생했습니다:'), error.message);
149
+ }
150
+ }
151
+
152
+ /**
153
+ * Feature 상태 업데이트
154
+ */
155
+ async updateFeature(args) {
156
+ const [featureId, status] = args;
157
+
158
+ if (!featureId || !status) {
159
+ console.error(chalk.red('❌ Feature ID와 상태를 지정해주세요.'));
160
+ console.log(chalk.gray('사용법: aiwf feature update <Feature ID> <상태>'));
161
+ console.log(chalk.gray('상태: planned, in-progress, completed, on-hold'));
162
+ return;
163
+ }
164
+
165
+ const validStatuses = ['planned', 'in-progress', 'completed', 'on-hold'];
166
+ if (!validStatuses.includes(status)) {
167
+ console.error(chalk.red(`❌ 유효하지 않은 상태: ${status}`));
168
+ console.log(chalk.gray('유효한 상태: ' + validStatuses.join(', ')));
169
+ return;
170
+ }
171
+
172
+ try {
173
+ const indexPath = path.join(this.featureLedgerPath, 'feature-index.json');
174
+ const index = await fs.readJson(indexPath);
175
+
176
+ const featureIndex = index.features.findIndex(f => f.id === featureId);
177
+ if (featureIndex === -1) {
178
+ console.error(chalk.red(`❌ Feature ${featureId}를 찾을 수 없습니다.`));
179
+ return;
180
+ }
181
+
182
+ // Index 업데이트
183
+ index.features[featureIndex].status = status;
184
+ await fs.writeJson(indexPath, index, { spaces: 2 });
185
+
186
+ // Feature 파일 업데이트
187
+ const featureFile = path.join(this.featureLedgerPath, index.features[featureIndex].file);
188
+ const feature = await fs.readJson(featureFile);
189
+ feature.status = status;
190
+ feature.updatedAt = new Date().toISOString();
191
+ await fs.writeJson(featureFile, feature, { spaces: 2 });
192
+
193
+ console.log(chalk.green(`✅ Feature ${chalk.bold(featureId)} 상태가 ${chalk.yellow(status)}로 업데이트되었습니다.`));
194
+
195
+ } catch (error) {
196
+ console.error(chalk.red('❌ Feature 업데이트 중 오류가 발생했습니다:'), error.message);
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Feature 상태 표시
202
+ */
203
+ async showStatus(featureId) {
204
+ if (!featureId) {
205
+ // 전체 상태 요약 표시
206
+ await this.showSummary();
207
+ return;
208
+ }
209
+
210
+ try {
211
+ const indexPath = path.join(this.featureLedgerPath, 'feature-index.json');
212
+ const index = await fs.readJson(indexPath);
213
+
214
+ const featureInfo = index.features.find(f => f.id === featureId);
215
+ if (!featureInfo) {
216
+ console.error(chalk.red(`❌ Feature ${featureId}를 찾을 수 없습니다.`));
217
+ return;
218
+ }
219
+
220
+ // Feature 상세 정보 로드
221
+ const featureFile = path.join(this.featureLedgerPath, featureInfo.file);
222
+ const feature = await fs.readJson(featureFile);
223
+
224
+ console.log(chalk.cyan(`📋 Feature: ${feature.name}`));
225
+ console.log(chalk.gray('-'.repeat(50)));
226
+ console.log(`ID: ${chalk.bold(feature.id)}`);
227
+ console.log(`상태: ${chalk[this.getStatusColor(feature.status)](feature.status)}`);
228
+ console.log(`설명: ${feature.description || '없음'}`);
229
+ console.log(`생성일: ${new Date(feature.createdAt).toLocaleString('ko-KR')}`);
230
+ console.log(`수정일: ${new Date(feature.updatedAt).toLocaleString('ko-KR')}`);
231
+
232
+ if (feature.commits.length > 0) {
233
+ console.log(`\n관련 커밋 (${feature.commits.length}개):`);
234
+ feature.commits.slice(-5).forEach(commit => {
235
+ console.log(` - ${commit.hash.slice(0, 7)} ${commit.message}`);
236
+ });
237
+ }
238
+
239
+ if (feature.tasks.length > 0) {
240
+ console.log(`\n작업 목록 (${feature.tasks.length}개):`);
241
+ feature.tasks.forEach(task => {
242
+ const icon = task.completed ? '✅' : '⬜';
243
+ console.log(` ${icon} ${task.description}`);
244
+ });
245
+ }
246
+
247
+ } catch (error) {
248
+ console.error(chalk.red('❌ Feature 상태 조회 중 오류가 발생했습니다:'), error.message);
249
+ }
250
+ }
251
+
252
+ /**
253
+ * 전체 상태 요약
254
+ */
255
+ async showSummary() {
256
+ try {
257
+ const indexPath = path.join(this.featureLedgerPath, 'feature-index.json');
258
+
259
+ if (!fs.existsSync(indexPath)) {
260
+ console.log(chalk.yellow('⚠️ Feature Ledger가 초기화되지 않았습니다.'));
261
+ return;
262
+ }
263
+
264
+ const index = await fs.readJson(indexPath);
265
+ const features = index.features || [];
266
+
267
+ const summary = {
268
+ planned: features.filter(f => f.status === 'planned').length,
269
+ 'in-progress': features.filter(f => f.status === 'in-progress').length,
270
+ completed: features.filter(f => f.status === 'completed').length,
271
+ 'on-hold': features.filter(f => f.status === 'on-hold').length
272
+ };
273
+
274
+ console.log(chalk.cyan('📊 Feature Ledger 요약'));
275
+ console.log(chalk.gray('-'.repeat(50)));
276
+ console.log(`계획됨: ${chalk.blue(summary.planned)}`);
277
+ console.log(`진행중: ${chalk.yellow(summary['in-progress'])}`);
278
+ console.log(`완료됨: ${chalk.green(summary.completed)}`);
279
+ console.log(`보류중: ${chalk.gray(summary['on-hold'])}`);
280
+ console.log(chalk.gray('-'.repeat(50)));
281
+ console.log(`총 기능: ${features.length}`);
282
+
283
+ } catch (error) {
284
+ console.error(chalk.red('❌ 요약 정보 조회 중 오류가 발생했습니다:'), error.message);
285
+ }
286
+ }
287
+
288
+ /**
289
+ * Git 커밋과 동기화
290
+ */
291
+ async syncWithGit() {
292
+ try {
293
+ console.log(chalk.cyan('🔄 Git 커밋과 Feature Ledger 동기화 중...'));
294
+
295
+ // sync-feature-commits 유틸리티 실행
296
+ const syncModule = await this.resourceLoader.loadUtil('sync-feature-commits.js');
297
+ const syncFunction = syncModule.syncFeatureCommits || syncModule.default;
298
+
299
+ if (typeof syncFunction === 'function') {
300
+ await syncFunction();
301
+ } else {
302
+ console.error(chalk.red('❌ 동기화 모듈을 로드할 수 없습니다.'));
303
+ }
304
+
305
+ } catch (error) {
306
+ console.error(chalk.red('❌ Git 동기화 중 오류가 발생했습니다:'), error.message);
307
+ }
308
+ }
309
+
310
+ /**
311
+ * 상태별 아이콘
312
+ */
313
+ getStatusIcon(status) {
314
+ const icons = {
315
+ 'planned': '📝',
316
+ 'in-progress': '🔄',
317
+ 'completed': '✅',
318
+ 'on-hold': '⏸️'
319
+ };
320
+ return icons[status] || '❓';
321
+ }
322
+
323
+ /**
324
+ * 상태별 색상
325
+ */
326
+ getStatusColor(status) {
327
+ const colors = {
328
+ 'planned': 'blue',
329
+ 'in-progress': 'yellow',
330
+ 'completed': 'green',
331
+ 'on-hold': 'gray'
332
+ };
333
+ return colors[status] || 'white';
334
+ }
335
+
336
+ /**
337
+ * 도움말 표시
338
+ */
339
+ showHelp() {
340
+ console.log(chalk.cyan('📋 AIWF Feature Ledger'));
341
+ console.log(chalk.gray('-'.repeat(50)));
342
+ console.log('사용법: aiwf feature <명령어> [옵션]');
343
+ console.log('');
344
+ console.log('명령어:');
345
+ console.log(' list 모든 기능 목록 표시');
346
+ console.log(' create <이름> [설명] 새 기능 생성');
347
+ console.log(' update <ID> <상태> 기능 상태 업데이트');
348
+ console.log(' status [ID] 기능 상태 표시');
349
+ console.log(' sync Git 커밋과 동기화');
350
+ console.log('');
351
+ console.log('상태:');
352
+ console.log(' planned 계획됨');
353
+ console.log(' in-progress 진행중');
354
+ console.log(' completed 완료됨');
355
+ console.log(' on-hold 보류중');
356
+ console.log('');
357
+ console.log('예시:');
358
+ console.log(' aiwf feature list');
359
+ console.log(' aiwf feature create "로그인 기능" "사용자 인증 구현"');
360
+ console.log(' aiwf feature update FL-001 in-progress');
361
+ console.log(' aiwf feature status FL-001');
362
+ }
363
+ }
364
+
365
+ export default FeatureCommand;
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { AIPersonaManager } from '../lib/ai-persona-manager.js';
9
+ import { ResourceLoader } from '../lib/resource-loader.js';
9
10
  import path from 'path';
10
11
  import chalk from 'chalk';
11
12
  import { fileURLToPath } from 'url';
@@ -17,6 +18,7 @@ const __dirname = dirname(__filename);
17
18
  class PersonaCommand {
18
19
  constructor() {
19
20
  this.personaManager = null;
21
+ this.resourceLoader = new ResourceLoader();
20
22
  }
21
23
 
22
24
  /**
@@ -24,11 +26,15 @@ class PersonaCommand {
24
26
  */
25
27
  async initPersonaManager() {
26
28
  if (!this.personaManager) {
29
+ // 사용자 디렉토리 초기화
30
+ await this.resourceLoader.initUserDirectory();
31
+
27
32
  this.personaManager = new AIPersonaManager({
28
33
  personaConfigPath: path.join(process.cwd(), '.aiwf', 'personas'),
29
34
  metricsPath: path.join(process.cwd(), '.aiwf', 'metrics'),
30
35
  metricsEnabled: true,
31
- autoDetectionEnabled: true
36
+ autoDetectionEnabled: true,
37
+ resourceLoader: this.resourceLoader
32
38
  });
33
39
 
34
40
  await this.personaManager.init();
@@ -88,21 +94,36 @@ class PersonaCommand {
88
94
  console.log(chalk.cyan('🎭 사용 가능한 AI 페르소나'));
89
95
  console.log(chalk.gray('-'.repeat(50)));
90
96
 
91
- // 기본 페르소나 목록을 하드코딩으로 표시 (초기화 문제 회피)
92
- const defaultPersonas = [
93
- { name: 'architect', description: '시스템 설계 및 아키텍처 전문가' },
94
- { name: 'developer', description: '일반 개발자 (기본값)' },
95
- { name: 'reviewer', description: '코드 리뷰 및 품질 관리 전문가' },
96
- { name: 'debugger', description: '디버깅 및 문제 해결 전문가' },
97
- { name: 'optimizer', description: '성능 최적화 전문가' },
98
- { name: 'security', description: '보안 및 취약점 분석 전문가' },
99
- { name: 'documenter', description: '문서화 및 기술 작성 전문가' }
100
- ];
101
-
102
- defaultPersonas.forEach(persona => {
103
- const displayName = chalk.yellow(persona.name);
104
- console.log(` ${displayName} - ${persona.description}`);
105
- });
97
+ // ResourceLoader를 사용하여 페르소나 목록 가져오기
98
+ try {
99
+ const personas = await this.resourceLoader.listPersonas();
100
+
101
+ for (const personaName of personas) {
102
+ try {
103
+ const persona = await this.resourceLoader.loadPersona(personaName);
104
+ const displayName = chalk.yellow(personaName);
105
+ const description = persona.description || '설명 없음';
106
+ console.log(` ${displayName} - ${description}`);
107
+ } catch (error) {
108
+ // 개별 페르소나 로드 실패 시 건너뛰기
109
+ console.log(` ${chalk.yellow(personaName)} - ${chalk.gray('(로드 실패)')}`);
110
+ }
111
+ }
112
+ } catch (error) {
113
+ // 페르소나 목록 가져오기 실패 시 기본 목록 표시
114
+ const defaultPersonas = [
115
+ { name: 'architect', description: '시스템 설계 및 아키텍처 전문가' },
116
+ { name: 'developer', description: '일반 개발자 (기본값)' },
117
+ { name: 'reviewer', description: '코드 리뷰 및 품질 관리 전문가' },
118
+ { name: 'analyst', description: '비즈니스 분석가' },
119
+ { name: 'tester', description: '테스트 엔지니어' }
120
+ ];
121
+
122
+ defaultPersonas.forEach(persona => {
123
+ const displayName = chalk.yellow(persona.name);
124
+ console.log(` ${displayName} - ${persona.description}`);
125
+ });
126
+ }
106
127
 
107
128
  console.log(chalk.gray('\n' + '-'.repeat(50)));
108
129
  console.log(chalk.gray('사용법: aiwf persona set <페르소나명>'));