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,565 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Feature Ledger 관리 명령어 (한국어)
5
+ * Feature 생성, 업데이트, 조회, 연결 기능 제공
6
+ */
7
+
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import chalk from 'chalk';
11
+ import prompts from 'prompts';
12
+
13
+ // 상수 정의
14
+ const FEATURE_STATES = {
15
+ active: '개발 중',
16
+ completed: '완료',
17
+ paused: '일시 중지',
18
+ archived: '보관됨'
19
+ };
20
+
21
+ const PRIORITIES = {
22
+ critical: '긴급',
23
+ high: '높음',
24
+ medium: '보통',
25
+ low: '낮음'
26
+ };
27
+
28
+ const CATEGORIES = {
29
+ feature: '기능',
30
+ enhancement: '개선',
31
+ bugfix: '버그 수정',
32
+ refactor: '리팩토링'
33
+ };
34
+
35
+ // 헬퍼 함수들
36
+ function getProjectRoot() {
37
+ const cwd = process.cwd();
38
+ return cwd.endsWith('.aiwf') ? path.dirname(cwd) : cwd;
39
+ }
40
+
41
+ function getFeatureLedgerPath() {
42
+ return path.join(getProjectRoot(), '.aiwf', '06_FEATURE_LEDGERS');
43
+ }
44
+
45
+ function getNextFeatureId() {
46
+ const ledgerPath = getFeatureLedgerPath();
47
+ const activePath = path.join(ledgerPath, 'active');
48
+
49
+ if (!fs.existsSync(activePath)) {
50
+ fs.mkdirSync(activePath, { recursive: true });
51
+ }
52
+
53
+ const files = fs.readdirSync(activePath).filter(f => f.match(/^FL\d{3}/));
54
+ if (files.length === 0) return 'FL001';
55
+
56
+ const ids = files.map(f => parseInt(f.match(/FL(\d{3})/)[1]));
57
+ const nextId = Math.max(...ids) + 1;
58
+ return `FL${String(nextId).padStart(3, '0')}`;
59
+ }
60
+
61
+ function sanitizeFilename(name) {
62
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_|_$/g, '');
63
+ }
64
+
65
+ // Feature 생성
66
+ async function createFeature(name) {
67
+ try {
68
+ // 대화형 모드
69
+ if (!name) {
70
+ const response = await prompts([
71
+ {
72
+ type: 'text',
73
+ name: 'title',
74
+ message: 'Feature 제목을 입력하세요:',
75
+ validate: value => value.length > 0 || '제목은 필수입니다'
76
+ },
77
+ {
78
+ type: 'text',
79
+ name: 'description',
80
+ message: 'Feature 설명을 입력하세요:'
81
+ },
82
+ {
83
+ type: 'select',
84
+ name: 'priority',
85
+ message: '우선순위를 선택하세요:',
86
+ choices: Object.entries(PRIORITIES).map(([value, title]) => ({
87
+ title: title,
88
+ value: value
89
+ }))
90
+ },
91
+ {
92
+ type: 'select',
93
+ name: 'category',
94
+ message: '카테고리를 선택하세요:',
95
+ choices: Object.entries(CATEGORIES).map(([value, title]) => ({
96
+ title: title,
97
+ value: value
98
+ }))
99
+ }
100
+ ]);
101
+
102
+ if (!response.title) return;
103
+
104
+ name = response.title;
105
+ var { description, priority, category } = response;
106
+ } else {
107
+ // 기본값 설정
108
+ var description = '';
109
+ var priority = 'medium';
110
+ var category = 'feature';
111
+ }
112
+
113
+ const featureId = getNextFeatureId();
114
+ const filename = `${featureId}_${sanitizeFilename(name)}.md`;
115
+ const filepath = path.join(getFeatureLedgerPath(), 'active', filename);
116
+
117
+ // Feature 파일 내용
118
+ const content = `# ${featureId}: ${name}
119
+
120
+ ## 메타데이터
121
+
122
+ - **Feature ID**: ${featureId}
123
+ - **제목**: ${name}
124
+ - **상태**: active
125
+ - **우선순위**: ${priority}
126
+ - **카테고리**: ${category}
127
+ - **생성일**: ${new Date().toISOString()}
128
+ - **업데이트**: ${new Date().toISOString()}
129
+
130
+ ## 설명
131
+
132
+ ${description || '(설명을 추가해주세요)'}
133
+
134
+ ## 진행 상황
135
+
136
+ - **진행률**: 0%
137
+ - **시작일**: ${new Date().toISOString().split('T')[0]}
138
+ - **예상 완료일**: TBD
139
+
140
+ ## 마일스톤 & 스프린트
141
+
142
+ - **마일스톤**: (미지정)
143
+ - **스프린트**: (미지정)
144
+
145
+ ## 태스크
146
+
147
+ - [ ] 초기 설계
148
+ - [ ] 구현
149
+ - [ ] 테스트
150
+ - [ ] 문서화
151
+
152
+ ## 기술 스택
153
+
154
+ (사용할 기술 스택을 명시해주세요)
155
+
156
+ ## 진행 내역
157
+
158
+ - [${new Date().toISOString().split('T')[0]}] Feature 생성
159
+
160
+ ## 관련 링크
161
+
162
+ - Git 브랜치: \`feature/${featureId}-${sanitizeFilename(name)}\`
163
+ - PR: (미생성)
164
+ - 이슈: (미생성)
165
+ `;
166
+
167
+ // 파일 생성
168
+ fs.writeFileSync(filepath, content);
169
+
170
+ // 인덱스 업데이트
171
+ await updateFeatureIndex();
172
+
173
+ console.log(chalk.green('🎯 Feature Ledger 생성 완료!'));
174
+ console.log(chalk.gray('━'.repeat(50)));
175
+ console.log(`Feature ID: ${chalk.yellow(featureId)}`);
176
+ console.log(`제목: ${name}`);
177
+ console.log(`상태: ${chalk.green('active')}`);
178
+ console.log(`우선순위: ${priority}`);
179
+ console.log(`카테고리: ${category}`);
180
+ console.log('');
181
+ console.log(`📁 파일 위치: ${chalk.blue(path.relative(getProjectRoot(), filepath))}`);
182
+ console.log('');
183
+ console.log(chalk.yellow('💡 다음 단계:'));
184
+ console.log(`git checkout -b feature/${featureId}-${sanitizeFilename(name)}`);
185
+
186
+ } catch (error) {
187
+ console.error(chalk.red(`❌ 오류: ${error.message}`));
188
+ }
189
+ }
190
+
191
+ // Feature 상태 업데이트
192
+ async function updateFeatureStatus(featureId, newStatus) {
193
+ try {
194
+ // 대화형 모드
195
+ if (!featureId) {
196
+ const features = await getActiveFeatures();
197
+ if (features.length === 0) {
198
+ console.log(chalk.yellow('활성 Feature가 없습니다.'));
199
+ return;
200
+ }
201
+
202
+ const response = await prompts([
203
+ {
204
+ type: 'select',
205
+ name: 'featureId',
206
+ message: 'Feature를 선택하세요:',
207
+ choices: features.map(f => ({
208
+ title: `${f.id} - ${f.title}`,
209
+ value: f.id
210
+ }))
211
+ },
212
+ {
213
+ type: 'select',
214
+ name: 'newStatus',
215
+ message: '새로운 상태를 선택하세요:',
216
+ choices: Object.entries(FEATURE_STATES).map(([value, title]) => ({
217
+ title: title,
218
+ value: value
219
+ }))
220
+ }
221
+ ]);
222
+
223
+ if (!response.featureId) return;
224
+
225
+ featureId = response.featureId;
226
+ newStatus = response.newStatus;
227
+ }
228
+
229
+ // Feature 파일 찾기
230
+ const feature = await findFeature(featureId);
231
+ if (!feature) {
232
+ console.log(chalk.red(`❌ Feature ${featureId}를 찾을 수 없습니다.`));
233
+ return;
234
+ }
235
+
236
+ // 상태 전이 검증
237
+ const validTransitions = {
238
+ active: ['completed', 'paused', 'archived'],
239
+ paused: ['active', 'archived'],
240
+ completed: ['archived'],
241
+ archived: []
242
+ };
243
+
244
+ if (!validTransitions[feature.status].includes(newStatus)) {
245
+ console.log(chalk.red(`❌ ${feature.status} → ${newStatus} 전이는 허용되지 않습니다.`));
246
+ return;
247
+ }
248
+
249
+ // 파일 이동 (필요한 경우)
250
+ const oldPath = feature.path;
251
+ let newPath = oldPath;
252
+
253
+ if (newStatus === 'archived') {
254
+ const archivePath = path.join(getFeatureLedgerPath(), 'archived');
255
+ if (!fs.existsSync(archivePath)) {
256
+ fs.mkdirSync(archivePath, { recursive: true });
257
+ }
258
+ newPath = path.join(archivePath, path.basename(oldPath));
259
+ fs.renameSync(oldPath, newPath);
260
+ }
261
+
262
+ // 파일 내용 업데이트
263
+ let content = fs.readFileSync(newPath, 'utf8');
264
+ content = content.replace(/- \*\*상태\*\*: \w+/, `- **상태**: ${newStatus}`);
265
+ content = content.replace(/- \*\*업데이트\*\*: .+/, `- **업데이트**: ${new Date().toISOString()}`);
266
+
267
+ // 진행 내역 추가
268
+ const historyMarker = '## 진행 내역';
269
+ const historyIndex = content.indexOf(historyMarker);
270
+ if (historyIndex !== -1) {
271
+ const nextSection = content.indexOf('\n##', historyIndex + 1);
272
+ const insertPoint = nextSection !== -1 ? nextSection : content.length;
273
+ const historyEntry = `\n- [${new Date().toISOString().split('T')[0]}] 상태 변경: ${feature.status} → ${newStatus}`;
274
+ content = content.slice(0, insertPoint) + historyEntry + content.slice(insertPoint);
275
+ }
276
+
277
+ fs.writeFileSync(newPath, content);
278
+
279
+ // 인덱스 업데이트
280
+ await updateFeatureIndex();
281
+
282
+ console.log(chalk.green('✅ Feature 상태 업데이트 완료'));
283
+ console.log(chalk.gray('━'.repeat(50)));
284
+ console.log(`Feature ID: ${featureId}`);
285
+ console.log(`이전 상태: ${feature.status} → 새 상태: ${chalk.yellow(newStatus)}`);
286
+ console.log(`업데이트 시간: ${new Date().toLocaleString('ko-KR')}`);
287
+
288
+ } catch (error) {
289
+ console.error(chalk.red(`❌ 오류: ${error.message}`));
290
+ }
291
+ }
292
+
293
+ // Feature 목록 조회
294
+ async function listFeatures(options = {}) {
295
+ try {
296
+ const features = await getAllFeatures();
297
+
298
+ // 필터링
299
+ let filtered = features;
300
+
301
+ if (options.status && options.status !== 'all') {
302
+ filtered = filtered.filter(f => f.status === options.status);
303
+ }
304
+
305
+ if (options.priority) {
306
+ filtered = filtered.filter(f => f.priority === options.priority);
307
+ }
308
+
309
+ if (options.category) {
310
+ filtered = filtered.filter(f => f.category === options.category);
311
+ }
312
+
313
+ // 정렬
314
+ const sortBy = options.sort || 'id';
315
+ filtered.sort((a, b) => {
316
+ switch (sortBy) {
317
+ case 'id':
318
+ return a.id.localeCompare(b.id);
319
+ case 'updated':
320
+ return new Date(b.updated) - new Date(a.updated);
321
+ case 'priority':
322
+ const priorityOrder = ['critical', 'high', 'medium', 'low'];
323
+ return priorityOrder.indexOf(a.priority) - priorityOrder.indexOf(b.priority);
324
+ default:
325
+ return 0;
326
+ }
327
+ });
328
+
329
+ // 출력
330
+ const format = options.format || 'table';
331
+
332
+ if (format === 'table') {
333
+ console.log(chalk.cyan('📋 Feature Ledger 목록'));
334
+ console.log(chalk.gray('━'.repeat(60)));
335
+ console.log('ID | Title | Status | Priority | Progress');
336
+ console.log('------+------------------------+-----------+----------+---------');
337
+
338
+ filtered.forEach(f => {
339
+ const statusColor = f.status === 'active' ? 'green' :
340
+ f.status === 'completed' ? 'blue' : 'gray';
341
+ console.log(
342
+ `${f.id.padEnd(5)} | ${f.title.padEnd(22).slice(0, 22)} | ${
343
+ chalk[statusColor](f.status.padEnd(9))
344
+ } | ${f.priority.padEnd(8)} | ${f.progress || '0%'}`
345
+ );
346
+ });
347
+
348
+ console.log(chalk.gray('━'.repeat(60)));
349
+
350
+ // 통계
351
+ const stats = {
352
+ total: filtered.length,
353
+ active: filtered.filter(f => f.status === 'active').length,
354
+ completed: filtered.filter(f => f.status === 'completed').length,
355
+ paused: filtered.filter(f => f.status === 'paused').length
356
+ };
357
+
358
+ console.log(`\n총 ${stats.total}개 Feature | Active: ${stats.active} | Completed: ${stats.completed} | Paused: ${stats.paused}`);
359
+
360
+ } else if (format === 'list') {
361
+ filtered.forEach(f => {
362
+ console.log(`\n${chalk.yellow(f.id)}: ${f.title}`);
363
+ console.log(` 상태: ${f.status} | 우선순위: ${f.priority} | 진행률: ${f.progress || '0%'}`);
364
+ });
365
+ }
366
+
367
+ } catch (error) {
368
+ console.error(chalk.red(`❌ 오류: ${error.message}`));
369
+ }
370
+ }
371
+
372
+ // Feature 상세 정보
373
+ async function getFeatureDetails(featureId, options = {}) {
374
+ try {
375
+ if (!featureId) {
376
+ const features = await getAllFeatures();
377
+ if (features.length === 0) {
378
+ console.log(chalk.yellow('Feature가 없습니다.'));
379
+ return;
380
+ }
381
+
382
+ const response = await prompts({
383
+ type: 'select',
384
+ name: 'featureId',
385
+ message: 'Feature를 선택하세요:',
386
+ choices: features.map(f => ({
387
+ title: `${f.id} - ${f.title}`,
388
+ value: f.id
389
+ }))
390
+ });
391
+
392
+ if (!response.featureId) return;
393
+ featureId = response.featureId;
394
+ }
395
+
396
+ const feature = await findFeature(featureId);
397
+ if (!feature) {
398
+ console.log(chalk.red(`❌ Feature ${featureId}를 찾을 수 없습니다.`));
399
+ return;
400
+ }
401
+
402
+ // 파일 내용 읽기
403
+ const content = fs.readFileSync(feature.path, 'utf8');
404
+
405
+ console.log(chalk.cyan('🎯 Feature 상세 정보'));
406
+ console.log(chalk.gray('━'.repeat(50)));
407
+ console.log(content);
408
+
409
+ } catch (error) {
410
+ console.error(chalk.red(`❌ 오류: ${error.message}`));
411
+ }
412
+ }
413
+
414
+ // 헬퍼: Feature 찾기
415
+ async function findFeature(featureId) {
416
+ const features = await getAllFeatures();
417
+ return features.find(f => f.id === featureId);
418
+ }
419
+
420
+ // 헬퍼: 모든 Feature 가져오기
421
+ async function getAllFeatures() {
422
+ const features = [];
423
+ const ledgerPath = getFeatureLedgerPath();
424
+
425
+ // active 디렉토리
426
+ const activePath = path.join(ledgerPath, 'active');
427
+ if (fs.existsSync(activePath)) {
428
+ const files = fs.readdirSync(activePath).filter(f => f.endsWith('.md'));
429
+ files.forEach(file => {
430
+ const content = fs.readFileSync(path.join(activePath, file), 'utf8');
431
+ const feature = parseFeatureFile(content, path.join(activePath, file));
432
+ if (feature) features.push(feature);
433
+ });
434
+ }
435
+
436
+ // archived 디렉토리
437
+ const archivedPath = path.join(ledgerPath, 'archived');
438
+ if (fs.existsSync(archivedPath)) {
439
+ const files = fs.readdirSync(archivedPath).filter(f => f.endsWith('.md'));
440
+ files.forEach(file => {
441
+ const content = fs.readFileSync(path.join(archivedPath, file), 'utf8');
442
+ const feature = parseFeatureFile(content, path.join(archivedPath, file));
443
+ if (feature) features.push(feature);
444
+ });
445
+ }
446
+
447
+ return features;
448
+ }
449
+
450
+ // 헬퍼: active Feature 가져오기
451
+ async function getActiveFeatures() {
452
+ const features = await getAllFeatures();
453
+ return features.filter(f => f.status === 'active');
454
+ }
455
+
456
+ // 헬퍼: Feature 파일 파싱
457
+ function parseFeatureFile(content, filepath) {
458
+ const idMatch = content.match(/- \*\*Feature ID\*\*: (FL\d{3})/);
459
+ const titleMatch = content.match(/# FL\d{3}: (.+)/);
460
+ const statusMatch = content.match(/- \*\*상태\*\*: (\w+)/);
461
+ const priorityMatch = content.match(/- \*\*우선순위\*\*: (\w+)/);
462
+ const categoryMatch = content.match(/- \*\*카테고리\*\*: (\w+)/);
463
+ const progressMatch = content.match(/- \*\*진행률\*\*: (\d+%)/);
464
+ const updatedMatch = content.match(/- \*\*업데이트\*\*: (.+)/);
465
+
466
+ if (!idMatch || !titleMatch) return null;
467
+
468
+ return {
469
+ id: idMatch[1],
470
+ title: titleMatch[1],
471
+ status: statusMatch ? statusMatch[1] : 'active',
472
+ priority: priorityMatch ? priorityMatch[1] : 'medium',
473
+ category: categoryMatch ? categoryMatch[1] : 'feature',
474
+ progress: progressMatch ? progressMatch[1] : '0%',
475
+ updated: updatedMatch ? updatedMatch[1] : '',
476
+ path: filepath
477
+ };
478
+ }
479
+
480
+ // 헬퍼: Feature 인덱스 업데이트
481
+ async function updateFeatureIndex() {
482
+ const indexPath = path.join(getFeatureLedgerPath(), 'FEATURE_LEDGER_INDEX.md');
483
+ const features = await getAllFeatures();
484
+
485
+ let content = `# Feature Ledger 인덱스
486
+
487
+ 마지막 업데이트: ${new Date().toISOString()}
488
+
489
+ ## 활성 Features
490
+
491
+ | ID | 제목 | 상태 | 우선순위 | 진행률 | 업데이트 |
492
+ |----|------|------|----------|--------|----------|
493
+ `;
494
+
495
+ const activeFeatures = features.filter(f => f.status !== 'archived');
496
+ activeFeatures.forEach(f => {
497
+ content += `| ${f.id} | ${f.title} | ${f.status} | ${f.priority} | ${f.progress} | ${f.updated.split('T')[0]} |\n`;
498
+ });
499
+
500
+ content += `\n## 보관된 Features\n\n`;
501
+ content += `| ID | 제목 | 완료일 |\n`;
502
+ content += `|----|------|--------|\n`;
503
+
504
+ const archivedFeatures = features.filter(f => f.status === 'archived');
505
+ archivedFeatures.forEach(f => {
506
+ content += `| ${f.id} | ${f.title} | ${f.updated.split('T')[0]} |\n`;
507
+ });
508
+
509
+ content += `\n## 통계\n\n`;
510
+ content += `- 총 Features: ${features.length}\n`;
511
+ content += `- 활성: ${features.filter(f => f.status === 'active').length}\n`;
512
+ content += `- 완료: ${features.filter(f => f.status === 'completed').length}\n`;
513
+ content += `- 일시 중지: ${features.filter(f => f.status === 'paused').length}\n`;
514
+ content += `- 보관됨: ${features.filter(f => f.status === 'archived').length}\n`;
515
+
516
+ fs.writeFileSync(indexPath, content);
517
+ }
518
+
519
+ // 명령행 인자 처리
520
+ const command = process.argv[2];
521
+ const args = process.argv.slice(3);
522
+
523
+ switch (command) {
524
+ case 'create':
525
+ createFeature(args[0]);
526
+ break;
527
+
528
+ case 'update-status':
529
+ updateFeatureStatus(args[0], args[1]);
530
+ break;
531
+
532
+ case 'list':
533
+ const listOptions = {};
534
+ args.forEach(arg => {
535
+ if (arg.startsWith('--')) {
536
+ const [key, value] = arg.slice(2).split('=');
537
+ listOptions[key] = value || true;
538
+ }
539
+ });
540
+ listFeatures(listOptions);
541
+ break;
542
+
543
+ case 'details':
544
+ const detailsOptions = {};
545
+ args.slice(1).forEach(arg => {
546
+ if (arg.startsWith('--')) {
547
+ const [key, value] = arg.slice(2).split('=');
548
+ detailsOptions[key] = value || true;
549
+ }
550
+ });
551
+ getFeatureDetails(args[0], detailsOptions);
552
+ break;
553
+
554
+ case 'link-milestone':
555
+ console.log(chalk.yellow('마일스톤 연결 기능은 개발 중입니다.'));
556
+ break;
557
+
558
+ default:
559
+ console.log(chalk.yellow('사용법:'));
560
+ console.log(' feature-ledger.js create [name]');
561
+ console.log(' feature-ledger.js update-status [id] [status]');
562
+ console.log(' feature-ledger.js list [options]');
563
+ console.log(' feature-ledger.js details [id]');
564
+ console.log(' feature-ledger.js link-milestone [id] [milestone]');
565
+ }