aiwf 0.3.22 → 0.4.0

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 (456) hide show
  1. package/.claude-plugin/marketplace.json +146 -0
  2. package/CHANGELOG.md +49 -1
  3. package/README.ko.md +118 -309
  4. package/README.md +68 -254
  5. package/docs/modernization/BROWNFIELD-GREENFIELD.ko.md +105 -0
  6. package/docs/modernization/CLAUDE-PLAN-REVIEW-2026-10-03.ko.md +77 -0
  7. package/docs/modernization/CLI-PRODUCTIVITY-REVIEWED-2026-10-03.ko.md +177 -0
  8. package/docs/modernization/CLI-PRODUCTIVITY.ko.md +193 -0
  9. package/docs/modernization/CORE-PACKAGE-PLAN.md +7 -0
  10. package/docs/modernization/DEEP-REVERSE-ENGINEERING.ko.md +88 -0
  11. package/docs/modernization/DELEGATION-OPTIONAL.ko.md +57 -0
  12. package/docs/modernization/DIRECTION.ko.md +56 -0
  13. package/docs/modernization/FULL-TEST-2026-10-03.md +49 -0
  14. package/docs/modernization/LEGACY-REMOVAL-PLAN.md +9 -0
  15. package/docs/modernization/PILOT-RESULT-2026-10-03.ko.md +85 -0
  16. package/docs/modernization/PILOT-UC-001.ko.md +79 -0
  17. package/docs/modernization/PLAN.md +28 -0
  18. package/docs/modernization/SKILLS.ko.md +105 -0
  19. package/docs/modernization/SPRINTABLE.ko.md +47 -0
  20. package/docs/modernization/SYNC-DOCS-VALIDATION-2026-10-04.ko.md +38 -0
  21. package/docs/modernization/VALIDATION.md +79 -0
  22. package/docs/modernization/evidence/example-review-packet.json +115 -0
  23. package/docs/modernization/evidence/example-spec-pin.json +48 -0
  24. package/docs/modernization/evidence/full-test-20261003/claude-lint.md +22 -0
  25. package/docs/modernization/evidence/full-test-20261003/claude-review-retry.md +56 -0
  26. package/docs/modernization/evidence/full-test-20261003/codex-review-packet.json +159 -0
  27. package/docs/modernization/evidence/full-test-20261003/src/expense.mjs +40 -0
  28. package/docs/modernization/evidence/full-test-20261003/summary.json +106 -0
  29. package/docs/modernization/evidence/full-test-20261003/tests/expense.test.mjs +61 -0
  30. package/docs/modernization/evidence/local-pilot-20261003/README.ko.md +40 -0
  31. package/docs/modernization/evidence/local-pilot-20261003/execution.json +1055 -0
  32. package/docs/modernization/evidence/local-pilot-20261003/maintenance/dependencies.json +24 -0
  33. package/docs/modernization/evidence/local-pilot-20261003/maintenance/dependencies.stderr.txt +0 -0
  34. package/docs/modernization/evidence/local-pilot-20261003/maintenance/dependencies.stdout.txt +5 -0
  35. package/docs/modernization/evidence/local-pilot-20261003/maintenance/docs.json +24 -0
  36. package/docs/modernization/evidence/local-pilot-20261003/maintenance/docs.stderr.txt +0 -0
  37. package/docs/modernization/evidence/local-pilot-20261003/maintenance/docs.stdout.txt +6 -0
  38. package/docs/modernization/evidence/local-pilot-20261003/maintenance/example.json +24 -0
  39. package/docs/modernization/evidence/local-pilot-20261003/maintenance/example.stderr.txt +0 -0
  40. package/docs/modernization/evidence/local-pilot-20261003/maintenance/example.stdout.txt +5 -0
  41. package/docs/modernization/evidence/local-pilot-20261003/maintenance/local-docs.json +24 -0
  42. package/docs/modernization/evidence/local-pilot-20261003/maintenance/local-docs.stderr.txt +0 -0
  43. package/docs/modernization/evidence/local-pilot-20261003/maintenance/local-docs.stdout.txt +6 -0
  44. package/docs/modernization/evidence/local-pilot-20261003/maintenance/node.json +23 -0
  45. package/docs/modernization/evidence/local-pilot-20261003/maintenance/node.stderr.txt +0 -0
  46. package/docs/modernization/evidence/local-pilot-20261003/maintenance/node.stdout.txt +535 -0
  47. package/docs/modernization/evidence/local-pilot-20261003/maintenance/provenance.json +24 -0
  48. package/docs/modernization/evidence/local-pilot-20261003/maintenance/provenance.stderr.txt +0 -0
  49. package/docs/modernization/evidence/local-pilot-20261003/maintenance/provenance.stdout.txt +5 -0
  50. package/docs/modernization/evidence/local-pilot-20261003/maintenance/readme-replay.json +24 -0
  51. package/docs/modernization/evidence/local-pilot-20261003/maintenance/readme-replay.stderr.txt +0 -0
  52. package/docs/modernization/evidence/local-pilot-20261003/maintenance/readme-replay.stdout.txt +273 -0
  53. package/docs/modernization/evidence/local-pilot-20261003/maintenance/upstream.json +24 -0
  54. package/docs/modernization/evidence/local-pilot-20261003/maintenance/upstream.stderr.txt +0 -0
  55. package/docs/modernization/evidence/local-pilot-20261003/maintenance/upstream.stdout.txt +7 -0
  56. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-service.stderr.txt +0 -0
  57. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-service.stdout.txt +148 -0
  58. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-structure.stderr.txt +0 -0
  59. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-structure.stdout.txt +9 -0
  60. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-check.stderr.txt +0 -0
  61. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-check.stdout.txt +67 -0
  62. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-evidence.json +34 -0
  63. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-packet.json +128 -0
  64. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-packet.stderr.txt +0 -0
  65. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-packet.stdout.txt +128 -0
  66. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-pin.json +54 -0
  67. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-pin.stderr.txt +0 -0
  68. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-pin.stdout.txt +60 -0
  69. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-readback.json +15 -0
  70. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-service.stderr.txt +0 -0
  71. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-service.stdout.txt +82 -0
  72. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-structure.stderr.txt +0 -0
  73. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-structure.stdout.txt +9 -0
  74. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-check.stderr.txt +0 -0
  75. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-check.stdout.txt +79 -0
  76. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-packet-refused.stderr.txt +0 -0
  77. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-packet-refused.stdout.txt +7 -0
  78. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-pin-refresh.stderr.txt +0 -0
  79. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-pin-refresh.stdout.txt +66 -0
  80. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-pin.json +60 -0
  81. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-structure.stderr.txt +0 -0
  82. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-structure.stdout.txt +9 -0
  83. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-check.stderr.txt +0 -0
  84. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-check.stdout.txt +73 -0
  85. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-evidence.json +34 -0
  86. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-packet.json +134 -0
  87. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-packet.stderr.txt +0 -0
  88. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-packet.stdout.txt +134 -0
  89. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-readback.json +15 -0
  90. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-service.stderr.txt +0 -0
  91. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-service.stdout.txt +148 -0
  92. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-structure.stderr.txt +0 -0
  93. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-structure.stdout.txt +9 -0
  94. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/node-version.stderr.txt +0 -0
  95. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/node-version.stdout.txt +1 -0
  96. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/python-version.stderr.txt +0 -0
  97. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/python-version.stdout.txt +1 -0
  98. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-evidence.json +34 -0
  99. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-packet.json +134 -0
  100. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-packet.stderr.txt +0 -0
  101. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-packet.stdout.txt +134 -0
  102. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-readback.json +15 -0
  103. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-service.stderr.txt +0 -0
  104. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-service.stdout.txt +266 -0
  105. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-structure.stderr.txt +0 -0
  106. package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-structure.stdout.txt +9 -0
  107. package/docs/modernization/evidence/local-pilot-20261003/project/docs/entity_model.md +33 -0
  108. package/docs/modernization/evidence/local-pilot-20261003/project/docs/glossary.md +9 -0
  109. package/docs/modernization/evidence/local-pilot-20261003/project/docs/plans/UC-001.md +20 -0
  110. package/docs/modernization/evidence/local-pilot-20261003/project/docs/requirements.md +10 -0
  111. package/docs/modernization/evidence/local-pilot-20261003/project/docs/test_cases/TC-001-submit-expense.md +37 -0
  112. package/docs/modernization/evidence/local-pilot-20261003/project/docs/test_cases/TC-002-description-limit.md +42 -0
  113. package/docs/modernization/evidence/local-pilot-20261003/project/docs/use_cases/UC-001-submit-expense.md +76 -0
  114. package/docs/modernization/evidence/local-pilot-20261003/project/docs/use_cases.puml +12 -0
  115. package/docs/modernization/evidence/local-pilot-20261003/project/docs/vision.md +21 -0
  116. package/docs/modernization/evidence/local-pilot-20261003/project/src/expense.mjs +48 -0
  117. package/docs/modernization/evidence/local-pilot-20261003/project/tests/expense.test.mjs +116 -0
  118. package/docs/modernization/evidence/local-pilot-20261003/scope.json +31 -0
  119. package/docs/modernization/reviews/2026-10-03-claude-cli/CONTRACTS.ko.md +122 -0
  120. package/docs/modernization/reviews/2026-10-03-claude-cli/DIRECTION.ko.md +84 -0
  121. package/examples/spec-workflow/README.md +54 -0
  122. package/examples/spec-workflow/docs/entity_model.md +33 -0
  123. package/examples/spec-workflow/docs/glossary.md +9 -0
  124. package/examples/spec-workflow/docs/requirements.md +10 -0
  125. package/examples/spec-workflow/docs/test_cases/TC-001-submit-expense.md +37 -0
  126. package/examples/spec-workflow/docs/use_cases/UC-001-submit-expense.md +63 -0
  127. package/examples/spec-workflow/docs/use_cases.puml +12 -0
  128. package/examples/spec-workflow/docs/vision.md +21 -0
  129. package/package.json +37 -104
  130. package/plugins/aiwf-angular-jpa/.claude-plugin/plugin.json +11 -0
  131. package/plugins/aiwf-angular-jpa/LICENSE +201 -0
  132. package/plugins/aiwf-angular-jpa/NOTICE +16 -0
  133. package/plugins/aiwf-angular-jpa/README.md +54 -0
  134. package/plugins/aiwf-angular-jpa/UPSTREAM.json +35 -0
  135. package/plugins/aiwf-angular-jpa/agents/uc-coverage.md +263 -0
  136. package/plugins/aiwf-angular-jpa/rules/mcp-servers.md +64 -0
  137. package/plugins/aiwf-angular-jpa/skills/coverage-check/SKILL.md +190 -0
  138. package/plugins/aiwf-angular-jpa/skills/flyway-migration/SKILL.md +119 -0
  139. package/plugins/aiwf-angular-jpa/skills/implement/SKILL.md +528 -0
  140. package/plugins/aiwf-angular-jpa/skills/implement/references/module-layout.md +95 -0
  141. package/plugins/aiwf-angular-jpa/skills/playwright-test/SKILL.md +360 -0
  142. package/plugins/aiwf-angular-jpa/skills/spring-boot-test/SKILL.md +504 -0
  143. package/plugins/aiwf-angular-jpa/skills/vitest-test/SKILL.md +309 -0
  144. package/plugins/aiwf-blazor-dotnet/.claude-plugin/plugin.json +11 -0
  145. package/plugins/aiwf-blazor-dotnet/LICENSE +201 -0
  146. package/plugins/aiwf-blazor-dotnet/NOTICE +16 -0
  147. package/plugins/aiwf-blazor-dotnet/README.md +53 -0
  148. package/plugins/aiwf-blazor-dotnet/UPSTREAM.json +31 -0
  149. package/plugins/aiwf-blazor-dotnet/rules/mcp-servers.md +25 -0
  150. package/plugins/aiwf-blazor-dotnet/skills/bunit-test/SKILL.md +110 -0
  151. package/plugins/aiwf-blazor-dotnet/skills/dotnet-test/SKILL.md +108 -0
  152. package/plugins/aiwf-blazor-dotnet/skills/ef-migration/SKILL.md +43 -0
  153. package/plugins/aiwf-blazor-dotnet/skills/implement/SKILL.md +149 -0
  154. package/plugins/aiwf-blazor-dotnet/skills/playwright-test/SKILL.md +130 -0
  155. package/plugins/aiwf-core/.claude-plugin/plugin.json +11 -0
  156. package/plugins/aiwf-core/LICENSE +201 -0
  157. package/plugins/aiwf-core/NOTICE +20 -0
  158. package/plugins/aiwf-core/README.md +38 -0
  159. package/plugins/aiwf-core/UPSTREAM.json +50 -0
  160. package/plugins/aiwf-core/skills/entity-model/SKILL.md +160 -0
  161. package/plugins/aiwf-core/skills/entity-model/references/REFERENCE.md +36 -0
  162. package/plugins/aiwf-core/skills/requirements/SKILL.md +157 -0
  163. package/plugins/aiwf-core/skills/requirements/references/REFERENCE.md +70 -0
  164. package/plugins/aiwf-core/skills/requirements/references/glossary.md +7 -0
  165. package/plugins/aiwf-core/skills/reverse-engineer/SKILL.md +509 -0
  166. package/plugins/aiwf-core/skills/reverse-engineer/references/stack-signals.md +210 -0
  167. package/plugins/aiwf-core/skills/spec-review/SKILL.md +197 -0
  168. package/plugins/aiwf-core/skills/spec-review/references/lint-codes.md +63 -0
  169. package/plugins/aiwf-core/skills/spec-review/references/review-checklist.md +189 -0
  170. package/plugins/aiwf-core/skills/spec-review/scripts/spec_lint.py +1216 -0
  171. package/plugins/aiwf-core/skills/test-case/SKILL.md +138 -0
  172. package/plugins/aiwf-core/skills/test-case/references/example-process.bpmn +118 -0
  173. package/plugins/aiwf-core/skills/test-case/references/example.md +38 -0
  174. package/plugins/aiwf-core/skills/test-case/references/test-case.md +35 -0
  175. package/plugins/aiwf-core/skills/test-case/scripts/bpmn_paths.py +542 -0
  176. package/plugins/aiwf-core/skills/use-case-diagram/SKILL.md +99 -0
  177. package/plugins/aiwf-core/skills/use-case-spec/SKILL.md +257 -0
  178. package/plugins/aiwf-core/skills/use-case-spec/references/clarify-checklist.md +70 -0
  179. package/plugins/aiwf-core/skills/use-case-spec/references/example.md +88 -0
  180. package/plugins/aiwf-core/skills/use-case-spec/references/format-spec.md +246 -0
  181. package/plugins/aiwf-core/skills/use-case-spec/references/use-case.md +50 -0
  182. package/plugins/aiwf-core/skills/use-case-spec/scripts/validate_use_case.py +941 -0
  183. package/plugins/aiwf-delegate-claude/.claude-plugin/plugin.json +9 -0
  184. package/{src/lib/resources/templates/npm-library/template → plugins/aiwf-delegate-claude}/LICENSE +2 -2
  185. package/plugins/aiwf-delegate-claude/NOTICE +4 -0
  186. package/plugins/aiwf-delegate-claude/README.md +10 -0
  187. package/plugins/aiwf-delegate-claude/plugin.json +13 -0
  188. package/plugins/aiwf-delegate-claude/skills/delegate-claude/LICENSE +21 -0
  189. package/plugins/aiwf-delegate-claude/skills/delegate-claude/NOTICE +4 -0
  190. package/plugins/aiwf-delegate-claude/skills/delegate-claude/SKILL.md +49 -0
  191. package/plugins/aiwf-delegate-claude/skills/delegate-claude/agents/openai.yaml +2 -0
  192. package/plugins/aiwf-delegate-codex/.claude-plugin/plugin.json +9 -0
  193. package/plugins/aiwf-delegate-codex/LICENSE +21 -0
  194. package/plugins/aiwf-delegate-codex/NOTICE +4 -0
  195. package/plugins/aiwf-delegate-codex/README.md +10 -0
  196. package/plugins/aiwf-delegate-codex/plugin.json +13 -0
  197. package/plugins/aiwf-delegate-codex/skills/delegate-codex/LICENSE +21 -0
  198. package/plugins/aiwf-delegate-codex/skills/delegate-codex/NOTICE +4 -0
  199. package/plugins/aiwf-delegate-codex/skills/delegate-codex/SKILL.md +47 -0
  200. package/plugins/aiwf-delegate-codex/skills/delegate-codex/agents/openai.yaml +2 -0
  201. package/plugins/aiwf-nestjs-nextjs/.claude-plugin/plugin.json +11 -0
  202. package/plugins/aiwf-nestjs-nextjs/LICENSE +201 -0
  203. package/plugins/aiwf-nestjs-nextjs/NOTICE +16 -0
  204. package/plugins/aiwf-nestjs-nextjs/README.md +53 -0
  205. package/plugins/aiwf-nestjs-nextjs/UPSTREAM.json +32 -0
  206. package/plugins/aiwf-nestjs-nextjs/rules/mcp-servers.md +59 -0
  207. package/plugins/aiwf-nestjs-nextjs/skills/drizzle-migration/SKILL.md +222 -0
  208. package/plugins/aiwf-nestjs-nextjs/skills/implement/SKILL.md +393 -0
  209. package/plugins/aiwf-nestjs-nextjs/skills/implement/references/project-layout.md +158 -0
  210. package/plugins/aiwf-nestjs-nextjs/skills/nest-test/SKILL.md +300 -0
  211. package/plugins/aiwf-nestjs-nextjs/skills/playwright-test/SKILL.md +245 -0
  212. package/plugins/aiwf-nestjs-nextjs/skills/react-test/SKILL.md +217 -0
  213. package/plugins/aiwf-spec/.claude-plugin/plugin.json +9 -0
  214. package/plugins/aiwf-spec/LICENSE +201 -0
  215. package/plugins/aiwf-spec/NOTICE +20 -0
  216. package/plugins/aiwf-spec/README.md +36 -0
  217. package/plugins/aiwf-spec/skills/sync-docs/SKILL.md +47 -0
  218. package/plugins/aiwf-spec/skills/workflow/SKILL.md +42 -0
  219. package/plugins/aiwf-vaadin-jooq/.claude-plugin/plugin.json +11 -0
  220. package/plugins/aiwf-vaadin-jooq/LICENSE +201 -0
  221. package/plugins/aiwf-vaadin-jooq/NOTICE +16 -0
  222. package/plugins/aiwf-vaadin-jooq/README.md +56 -0
  223. package/plugins/aiwf-vaadin-jooq/UPSTREAM.json +43 -0
  224. package/plugins/aiwf-vaadin-jooq/agents/uc-coverage.md +260 -0
  225. package/plugins/aiwf-vaadin-jooq/rules/mcp-servers.md +44 -0
  226. package/plugins/aiwf-vaadin-jooq/skills/browserless-test/SKILL.md +407 -0
  227. package/plugins/aiwf-vaadin-jooq/skills/browserless-test/references/UC001ManagePersonsTest.java +111 -0
  228. package/plugins/aiwf-vaadin-jooq/skills/coverage-check/SKILL.md +190 -0
  229. package/plugins/aiwf-vaadin-jooq/skills/flyway-migration/SKILL.md +70 -0
  230. package/plugins/aiwf-vaadin-jooq/skills/hilla-test/SKILL.md +350 -0
  231. package/plugins/aiwf-vaadin-jooq/skills/hilla-test/references/UC001ManagePersonsServiceTest.java +81 -0
  232. package/plugins/aiwf-vaadin-jooq/skills/hilla-test/references/UC001ManagePersonsViewTest.tsx +87 -0
  233. package/plugins/aiwf-vaadin-jooq/skills/implement/SKILL.md +196 -0
  234. package/plugins/aiwf-vaadin-jooq/skills/implement-hilla/SKILL.md +216 -0
  235. package/plugins/aiwf-vaadin-jooq/skills/karibu-test/SKILL.md +298 -0
  236. package/plugins/aiwf-vaadin-jooq/skills/karibu-test/references/UC001ManagePersonsTest.java +93 -0
  237. package/plugins/aiwf-vaadin-jooq/skills/playwright-test/SKILL.md +237 -0
  238. package/plugins/aiwf-vaadin-jooq/skills/playwright-test/references/ExampleViewIT.java +143 -0
  239. package/plugins/aiwf-vaadin-jooq/skills/playwright-test/references/TC001CustomerOnboardingIT.java +144 -0
  240. package/plugins/aiwf-vaadin-jooq/skills/playwright-test/references/dramafinder-api.md +190 -0
  241. package/scripts/check-dependencies.js +26 -96
  242. package/scripts/install-spec-skills.mjs +126 -0
  243. package/scripts/validate-spec-plugin.mjs +145 -0
  244. package/src/cli/spec-cli.js +292 -0
  245. package/src/lib/spec-workflow.js +982 -0
  246. package/docs/ADR_MANAGEMENT_GUIDE.ko.md +0 -602
  247. package/docs/ADR_MANAGEMENT_GUIDE.md +0 -602
  248. package/docs/AI-WORKFLOW.ko.md +0 -299
  249. package/docs/AI-WORKFLOW.md +0 -401
  250. package/docs/API_REFERENCE_FULL.ko.md +0 -1135
  251. package/docs/API_REFERENCE_FULL.md +0 -1135
  252. package/docs/ARCHITECTURE.ko.md +0 -314
  253. package/docs/ARCHITECTURE.md +0 -314
  254. package/docs/CLI_USAGE_GUIDE.ko.md +0 -634
  255. package/docs/CLI_USAGE_GUIDE.md +0 -640
  256. package/docs/CODE_CLEANUP_GUIDE.ko.md +0 -415
  257. package/docs/CODE_CLEANUP_GUIDE.md +0 -415
  258. package/docs/COMMANDS_GUIDE.ko.md +0 -1037
  259. package/docs/COMMANDS_GUIDE.md +0 -1037
  260. package/docs/CONTRIBUTING.ko.md +0 -408
  261. package/docs/CONTRIBUTING.md +0 -408
  262. package/docs/DEVELOPMENT_GUIDE.ko.md +0 -440
  263. package/docs/DEVELOPMENT_GUIDE.md +0 -727
  264. package/docs/EXAMPLES.ko.md +0 -695
  265. package/docs/EXAMPLES.md +0 -693
  266. package/docs/GETTING_STARTED.ko.md +0 -219
  267. package/docs/GETTING_STARTED.md +0 -476
  268. package/docs/MODULE_MANAGEMENT_GUIDE.ko.md +0 -289
  269. package/docs/MODULE_MANAGEMENT_GUIDE.md +0 -289
  270. package/docs/PERFORMANCE_ARCHITECTURE.md +0 -494
  271. package/docs/PERFORMANCE_GUIDELINES.ko.md +0 -388
  272. package/docs/PERFORMANCE_GUIDELINES.md +0 -553
  273. package/docs/PRD.ko.md +0 -148
  274. package/docs/PRD.md +0 -150
  275. package/docs/ROADMAP_v0.4.0.md +0 -286
  276. package/docs/STATE_MANAGEMENT_GUIDE.ko.md +0 -278
  277. package/docs/STATE_MANAGEMENT_GUIDE.md +0 -278
  278. package/docs/TROUBLESHOOTING.ko.md +0 -366
  279. package/docs/TROUBLESHOOTING.md +0 -722
  280. package/docs/VALIDATOR_API.ko.md +0 -324
  281. package/docs/VALIDATOR_API.md +0 -324
  282. package/docs/YOLO_SYSTEM_GUIDE.ko.md +0 -542
  283. package/docs/YOLO_SYSTEM_GUIDE.md +0 -542
  284. package/docs/designs/AI_PERSONA_SYSTEM_DESIGN.md +0 -516
  285. package/docs/designs/API_DOCUMENTATION.md +0 -932
  286. package/docs/designs/API_REFERENCE.md +0 -979
  287. package/docs/designs/Enhanced_Installation_Flow_Design.md +0 -498
  288. package/docs/designs/aiwf-metadata-system-prd.md +0 -127
  289. package/docs/designs/offline-template-cache.md +0 -323
  290. package/docs/designs/persona-aware-compression.md +0 -168
  291. package/docs/guides/ai-personas-guide-ko.md +0 -239
  292. package/docs/guides/ai-personas-guide.md +0 -239
  293. package/docs/guides/checkpoint-system-guide-ko.md +0 -356
  294. package/docs/guides/checkpoint-system-guide.md +0 -356
  295. package/docs/guides/context-compression-guide-ko.md +0 -313
  296. package/docs/guides/context-compression-guide.md +0 -313
  297. package/docs/guides/independent-sprint-guide-ko.md +0 -321
  298. package/docs/guides/independent-sprint-guide.md +0 -321
  299. package/rules/global/aiwf-code-style-guide.md +0 -30
  300. package/rules/global/aiwf-coding-principles.md +0 -33
  301. package/rules/global/aiwf-development-process.md +0 -41
  302. package/rules/global/aiwf-global-rules.md +0 -84
  303. package/rules/manual/aiwf-generate-plan-docs.md +0 -280
  304. package/scripts/run-integration-tests.js +0 -317
  305. package/scripts/update-file-lists.js +0 -267
  306. package/scripts/validate-commands.js +0 -254
  307. package/src/DEPENDENCY_MAP.md +0 -90
  308. package/src/cli/cache-cli.js +0 -459
  309. package/src/cli/checkpoint-cli.js +0 -417
  310. package/src/cli/index.js +0 -481
  311. package/src/cli/language-cli.js +0 -286
  312. package/src/cli/sprint-cli.js +0 -287
  313. package/src/commands/ai-tool.js +0 -383
  314. package/src/commands/compress.js +0 -60
  315. package/src/commands/create-project.js +0 -160
  316. package/src/commands/evaluate.js +0 -459
  317. package/src/commands/persona.js +0 -309
  318. package/src/commands/sprint-independent.js +0 -393
  319. package/src/commands/sprint-task.js +0 -262
  320. package/src/commands/state.js +0 -1164
  321. package/src/commands/token.js +0 -312
  322. package/src/commands/yolo-config.js +0 -502
  323. package/src/config/file-lists.js +0 -147
  324. package/src/config/yolo-config-template.yaml +0 -168
  325. package/src/lib/ai-persona-manager.js +0 -711
  326. package/src/lib/backup-manager.js +0 -271
  327. package/src/lib/cache-system.js +0 -332
  328. package/src/lib/context-engine.js +0 -568
  329. package/src/lib/file-downloader.js +0 -304
  330. package/src/lib/github-integration.js +0 -402
  331. package/src/lib/installer.js +0 -1066
  332. package/src/lib/memory-profiler.js +0 -471
  333. package/src/lib/metrics-collector.js +0 -885
  334. package/src/lib/offline-detector.js +0 -386
  335. package/src/lib/resource-loader-enhanced.js +0 -399
  336. package/src/lib/resource-loader.js +0 -250
  337. package/src/lib/resources/commands/ai-persona.js +0 -602
  338. package/src/lib/resources/commands/compress-context.js +0 -389
  339. package/src/lib/resources/commands/evaluate.js +0 -246
  340. package/src/lib/resources/commands/persona-context-apply.js +0 -562
  341. package/src/lib/resources/commands/token-tracking.js +0 -443
  342. package/src/lib/resources/config/commit-patterns.js +0 -103
  343. package/src/lib/resources/config/language.json +0 -6
  344. package/src/lib/resources/personas/PERSONA_INDEX.md +0 -57
  345. package/src/lib/resources/personas/analyst.json +0 -44
  346. package/src/lib/resources/personas/architect/best_practices.md +0 -136
  347. package/src/lib/resources/personas/architect/knowledge_base.md +0 -377
  348. package/src/lib/resources/personas/architect.json +0 -44
  349. package/src/lib/resources/personas/backend/best_practices.md +0 -766
  350. package/src/lib/resources/personas/backend/knowledge_base.md +0 -1070
  351. package/src/lib/resources/personas/data_analyst/best_practices.md +0 -594
  352. package/src/lib/resources/personas/data_analyst/knowledge_base.md +0 -1057
  353. package/src/lib/resources/personas/developer.json +0 -44
  354. package/src/lib/resources/personas/developer.md +0 -37
  355. package/src/lib/resources/personas/evaluation_criteria.json +0 -137
  356. package/src/lib/resources/personas/frontend/best_practices.md +0 -445
  357. package/src/lib/resources/personas/frontend/knowledge_base.md +0 -729
  358. package/src/lib/resources/personas/persona-index.json +0 -31
  359. package/src/lib/resources/personas/reviewer.json +0 -44
  360. package/src/lib/resources/personas/security/best_practices.md +0 -307
  361. package/src/lib/resources/personas/security/knowledge_base.md +0 -498
  362. package/src/lib/resources/personas/tester.json +0 -44
  363. package/src/lib/resources/templates/README.md +0 -78
  364. package/src/lib/resources/templates/api-server/config.json +0 -64
  365. package/src/lib/resources/templates/api-server/template/.aiwf/config.json +0 -56
  366. package/src/lib/resources/templates/api-server/template/.aiwf/feature-ledger.json +0 -42
  367. package/src/lib/resources/templates/api-server/template/.aiwf/personas/backend-engineer.json +0 -40
  368. package/src/lib/resources/templates/api-server/template/.aiwf/scripts/cli.js +0 -111
  369. package/src/lib/resources/templates/api-server/template/.env.example +0 -29
  370. package/src/lib/resources/templates/api-server/template/.eslintrc.json +0 -23
  371. package/src/lib/resources/templates/api-server/template/README.md +0 -171
  372. package/src/lib/resources/templates/api-server/template/jest.config.js +0 -26
  373. package/src/lib/resources/templates/api-server/template/nodemon.json +0 -9
  374. package/src/lib/resources/templates/api-server/template/package.json +0 -61
  375. package/src/lib/resources/templates/api-server/template/src/app.ts +0 -60
  376. package/src/lib/resources/templates/api-server/template/src/config/swagger.ts +0 -38
  377. package/src/lib/resources/templates/api-server/template/src/controllers/aiwfController.ts +0 -54
  378. package/src/lib/resources/templates/api-server/template/src/controllers/authController.ts +0 -128
  379. package/src/lib/resources/templates/api-server/template/src/controllers/statusController.ts +0 -28
  380. package/src/lib/resources/templates/api-server/template/src/index.ts +0 -28
  381. package/src/lib/resources/templates/api-server/template/src/middleware/aiwfMiddleware.ts +0 -50
  382. package/src/lib/resources/templates/api-server/template/src/middleware/authMiddleware.ts +0 -41
  383. package/src/lib/resources/templates/api-server/template/src/middleware/errorHandler.ts +0 -42
  384. package/src/lib/resources/templates/api-server/template/src/middleware/notFoundHandler.ts +0 -14
  385. package/src/lib/resources/templates/api-server/template/src/middleware/requestLogger.ts +0 -20
  386. package/src/lib/resources/templates/api-server/template/src/routes/aiwf.ts +0 -31
  387. package/src/lib/resources/templates/api-server/template/src/routes/index.ts +0 -13
  388. package/src/lib/resources/templates/api-server/template/src/routes/v1/index.ts +0 -67
  389. package/src/lib/resources/templates/api-server/template/src/utils/logger.ts +0 -37
  390. package/src/lib/resources/templates/api-server/template/tests/app.test.ts +0 -40
  391. package/src/lib/resources/templates/api-server/template/tsconfig.json +0 -43
  392. package/src/lib/resources/templates/npm-library/config.json +0 -61
  393. package/src/lib/resources/templates/npm-library/template/README.md +0 -201
  394. package/src/lib/resources/templates/npm-library/template/package.json +0 -78
  395. package/src/lib/resources/templates/web-app/config.json +0 -53
  396. package/src/lib/resources/templates/web-app/template/.aiwf/config.json +0 -54
  397. package/src/lib/resources/templates/web-app/template/.aiwf/feature-ledger.json +0 -37
  398. package/src/lib/resources/templates/web-app/template/.aiwf/personas/fullstack-developer.json +0 -40
  399. package/src/lib/resources/templates/web-app/template/.aiwf/scripts/cli.js +0 -110
  400. package/src/lib/resources/templates/web-app/template/.eslintrc.cjs +0 -20
  401. package/src/lib/resources/templates/web-app/template/README.md +0 -151
  402. package/src/lib/resources/templates/web-app/template/index.html +0 -14
  403. package/src/lib/resources/templates/web-app/template/package.json +0 -44
  404. package/src/lib/resources/templates/web-app/template/postcss.config.js +0 -6
  405. package/src/lib/resources/templates/web-app/template/public/vite.svg +0 -1
  406. package/src/lib/resources/templates/web-app/template/src/App.tsx +0 -21
  407. package/src/lib/resources/templates/web-app/template/src/components/Layout.tsx +0 -57
  408. package/src/lib/resources/templates/web-app/template/src/components/aiwf/ContextStatus.tsx +0 -107
  409. package/src/lib/resources/templates/web-app/template/src/components/aiwf/TokenUsage.tsx +0 -71
  410. package/src/lib/resources/templates/web-app/template/src/index.css +0 -60
  411. package/src/lib/resources/templates/web-app/template/src/main.tsx +0 -10
  412. package/src/lib/resources/templates/web-app/template/src/pages/AiwfDashboard.tsx +0 -57
  413. package/src/lib/resources/templates/web-app/template/src/pages/HomePage.tsx +0 -89
  414. package/src/lib/resources/templates/web-app/template/src/pages/NotFound.tsx +0 -25
  415. package/src/lib/resources/templates/web-app/template/src/stores/aiwfStore.ts +0 -126
  416. package/src/lib/resources/templates/web-app/template/src/types/global.d.ts +0 -9
  417. package/src/lib/resources/templates/web-app/template/src/vite-env.d.ts +0 -1
  418. package/src/lib/resources/templates/web-app/template/tailwind.config.js +0 -30
  419. package/src/lib/resources/templates/web-app/template/tsconfig.json +0 -37
  420. package/src/lib/resources/templates/web-app/template/tsconfig.node.json +0 -10
  421. package/src/lib/resources/templates/web-app/template/vite.config.ts +0 -23
  422. package/src/lib/resources/utils/background-monitor.js +0 -223
  423. package/src/lib/resources/utils/compression-metrics.js +0 -1031
  424. package/src/lib/resources/utils/compression-strategies.js +0 -557
  425. package/src/lib/resources/utils/content-normalizer.js +0 -455
  426. package/src/lib/resources/utils/context-compressor.js +0 -583
  427. package/src/lib/resources/utils/context-rule-parser.js +0 -180
  428. package/src/lib/resources/utils/context-token-monitor.js +0 -463
  429. package/src/lib/resources/utils/context-update-manager.js +0 -502
  430. package/src/lib/resources/utils/git-utils.js +0 -220
  431. package/src/lib/resources/utils/importance-classifier.js +0 -645
  432. package/src/lib/resources/utils/information-filter.js +0 -710
  433. package/src/lib/resources/utils/persona-aware-compressor.js +0 -598
  434. package/src/lib/resources/utils/prompt-injector.js +0 -242
  435. package/src/lib/resources/utils/simplified-evaluator.js +0 -119
  436. package/src/lib/resources/utils/text-summarizer.js +0 -492
  437. package/src/lib/resources/utils/token-counter.js +0 -177
  438. package/src/lib/resources/utils/token-monitor.js +0 -484
  439. package/src/lib/resources/utils/token-reporter.js +0 -452
  440. package/src/lib/resources/utils/token-storage.js +0 -433
  441. package/src/lib/resources/utils/token-tracker.js +0 -283
  442. package/src/lib/rollback-manager.js +0 -418
  443. package/src/lib/state/priority-calculator.js +0 -217
  444. package/src/lib/state/state-index.js +0 -155
  445. package/src/lib/state/task-scanner.js +0 -328
  446. package/src/lib/task-analyzer.js +0 -599
  447. package/src/lib/template-cache-system.js +0 -559
  448. package/src/lib/template-downloader.js +0 -467
  449. package/src/lib/template-version-manager.js +0 -491
  450. package/src/lib/token-optimizer.js +0 -517
  451. package/src/lib/validator.js +0 -376
  452. package/src/utils/checkpoint-manager.js +0 -435
  453. package/src/utils/engineering-guard.js +0 -399
  454. package/src/utils/language-utils.js +0 -331
  455. package/src/utils/messages.js +0 -166
  456. package/src/utils/paths.js +0 -112
@@ -1,180 +0,0 @@
1
- /**
2
- * 페르소나 컨텍스트 규칙 파서
3
- * AI 페르소나별 컨텍스트 규칙을 파싱하고 처리하는 모듈
4
- */
5
-
6
- const fs = require('fs').promises;
7
- const path = require('path');
8
- const yaml = require('js-yaml');
9
-
10
- class ContextRuleParser {
11
- constructor() {
12
- this.cache = new Map();
13
- this.lastModifiedTimes = new Map();
14
- }
15
-
16
- /**
17
- * 페르소나 컨텍스트 규칙 파일 파싱
18
- * @param {string} personaName - 페르소나 이름
19
- * @returns {Object} 파싱된 컨텍스트 규칙
20
- */
21
- async parseContextRules(personaName) {
22
- const contextPath = path.join(
23
- process.cwd(),
24
- '.aiwf',
25
- '07_AI_PERSONAS',
26
- personaName,
27
- 'context_rules.md'
28
- );
29
-
30
- try {
31
- // 캐시 확인
32
- const cached = await this.getCachedRules(contextPath);
33
- if (cached) return cached;
34
-
35
- // 파일 읽기
36
- const content = await fs.readFile(contextPath, 'utf-8');
37
-
38
- // YAML frontmatter와 마크다운 본문 분리
39
- const { frontmatter, body } = this.separateFrontmatter(content);
40
-
41
- // 컨텍스트 규칙 구조화
42
- const rules = {
43
- ...frontmatter,
44
- content: body,
45
- parsedAt: new Date().toISOString()
46
- };
47
-
48
- // 캐시 저장
49
- this.cache.set(contextPath, rules);
50
-
51
- return rules;
52
- } catch (error) {
53
- console.error(`컨텍스트 규칙 파싱 오류 (${personaName}):`, error.message);
54
- return this.getDefaultContext(personaName);
55
- }
56
- }
57
-
58
- /**
59
- * YAML frontmatter와 마크다운 본문 분리
60
- * @param {string} content - 전체 파일 내용
61
- * @returns {Object} frontmatter와 body
62
- */
63
- separateFrontmatter(content) {
64
- const frontmatterRegex = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/;
65
- const match = content.match(frontmatterRegex);
66
-
67
- if (match) {
68
- try {
69
- const frontmatter = yaml.load(match[1]);
70
- const body = match[2].trim();
71
- return { frontmatter, body };
72
- } catch (error) {
73
- console.error('YAML 파싱 오류:', error);
74
- return { frontmatter: {}, body: content };
75
- }
76
- }
77
-
78
- return { frontmatter: {}, body: content };
79
- }
80
-
81
- /**
82
- * 캐시된 규칙 확인 및 반환
83
- * @param {string} filePath - 파일 경로
84
- * @returns {Object|null} 캐시된 규칙 또는 null
85
- */
86
- async getCachedRules(filePath) {
87
- try {
88
- const stats = await fs.stat(filePath);
89
- const lastModified = stats.mtimeMs;
90
-
91
- const cachedTime = this.lastModifiedTimes.get(filePath);
92
- if (cachedTime && cachedTime === lastModified) {
93
- return this.cache.get(filePath);
94
- }
95
-
96
- this.lastModifiedTimes.set(filePath, lastModified);
97
- return null;
98
- } catch {
99
- return null;
100
- }
101
- }
102
-
103
- /**
104
- * 기본 컨텍스트 규칙 반환
105
- * @param {string} personaName - 페르소나 이름
106
- * @returns {Object} 기본 컨텍스트 규칙
107
- */
108
- getDefaultContext(personaName) {
109
- const defaults = {
110
- architect: {
111
- persona_name: 'architect',
112
- analysis_approach: '시스템 설계 중심',
113
- design_principles: ['확장성', '유지보수성', '성능'],
114
- communication_style: '구조적이고 논리적',
115
- content: '아키텍트 페르소나는 시스템 전체 구조를 고려하여 설계합니다.'
116
- },
117
- frontend: {
118
- persona_name: 'frontend',
119
- analysis_approach: 'UI/UX 중심',
120
- design_principles: ['사용성', '접근성', '반응성'],
121
- communication_style: '시각적이고 직관적',
122
- content: '프론트엔드 페르소나는 사용자 경험을 최우선으로 고려합니다.'
123
- },
124
- backend: {
125
- persona_name: 'backend',
126
- analysis_approach: 'API 및 데이터 처리 중심',
127
- design_principles: ['보안', '효율성', '확장성'],
128
- communication_style: '기술적이고 정확함',
129
- content: '백엔드 페르소나는 서버 사이드 로직과 데이터 처리에 집중합니다.'
130
- },
131
- data_analyst: {
132
- persona_name: 'data_analyst',
133
- analysis_approach: '데이터 기반 의사결정',
134
- design_principles: ['정확성', '통찰력', '시각화'],
135
- communication_style: '분석적이고 통계적',
136
- content: '데이터 분석가 페르소나는 데이터를 통한 인사이트 도출에 집중합니다.'
137
- },
138
- security: {
139
- persona_name: 'security',
140
- analysis_approach: '보안 취약점 중심',
141
- design_principles: ['보안성', '무결성', '기밀성'],
142
- communication_style: '신중하고 방어적',
143
- content: '보안 페르소나는 시스템의 보안 측면을 최우선으로 고려합니다.'
144
- }
145
- };
146
-
147
- return defaults[personaName] || {
148
- persona_name: personaName,
149
- analysis_approach: '일반적 접근',
150
- design_principles: ['품질', '효율성'],
151
- communication_style: '표준적',
152
- content: '기본 페르소나 컨텍스트입니다.'
153
- };
154
- }
155
-
156
- /**
157
- * 모든 페르소나의 컨텍스트 규칙 로드
158
- * @returns {Object} 모든 페르소나의 컨텍스트 규칙
159
- */
160
- async loadAllPersonaContexts() {
161
- const personas = ['architect', 'frontend', 'backend', 'data_analyst', 'security'];
162
- const contexts = {};
163
-
164
- for (const persona of personas) {
165
- contexts[persona] = await this.parseContextRules(persona);
166
- }
167
-
168
- return contexts;
169
- }
170
-
171
- /**
172
- * 캐시 초기화
173
- */
174
- clearCache() {
175
- this.cache.clear();
176
- this.lastModifiedTimes.clear();
177
- }
178
- }
179
-
180
- module.exports = ContextRuleParser;
@@ -1,463 +0,0 @@
1
- /**
2
- * 컨텍스트 토큰 모니터
3
- * 페르소나 컨텍스트 주입으로 인한 토큰 사용량을 모니터링하는 모듈
4
- */
5
-
6
- const TokenCounter = require('./token-counter');
7
- const fs = require('fs').promises;
8
- const path = require('path');
9
-
10
- class ContextTokenMonitor {
11
- constructor() {
12
- this.tokenCounter = new TokenCounter();
13
- this.usageHistory = [];
14
- this.personaStats = new Map();
15
- this.thresholds = {
16
- warning: 2000, // 경고 임계값 (토큰)
17
- critical: 3000 // 위험 임계값 (토큰)
18
- };
19
- }
20
-
21
- /**
22
- * 컨텍스트 주입 토큰 사용량 추적
23
- * @param {Object} injectionResult - 프롬프트 주입 결과
24
- * @returns {Object} 토큰 사용량 분석
25
- */
26
- async trackContextUsage(injectionResult) {
27
- const { tokenMetrics, personaName, context } = injectionResult;
28
-
29
- const usage = {
30
- personaName,
31
- timestamp: new Date().toISOString(),
32
- originalTokens: tokenMetrics.originalTokens,
33
- contextTokens: tokenMetrics.contextTokens,
34
- totalTokens: tokenMetrics.injectedTokens,
35
- percentageIncrease: tokenMetrics.percentageIncrease,
36
- contextElements: await this.analyzeContextElements(context),
37
- alert: this.checkThresholds(tokenMetrics.contextTokens)
38
- };
39
-
40
- // 히스토리에 추가
41
- this.usageHistory.push(usage);
42
-
43
- // 페르소나별 통계 업데이트
44
- this.updatePersonaStats(personaName, usage);
45
-
46
- return usage;
47
- }
48
-
49
- /**
50
- * 컨텍스트 요소별 토큰 사용량 분석
51
- * @param {Object} context - 페르소나 컨텍스트
52
- * @returns {Object} 요소별 토큰 사용량
53
- */
54
- async analyzeContextElements(context) {
55
- const elements = {};
56
-
57
- // 각 컨텍스트 요소의 토큰 수 계산
58
- if (context.persona_name) {
59
- elements.persona_name = await this.tokenCounter.estimateTokens(context.persona_name);
60
- }
61
-
62
- if (context.analysis_approach) {
63
- elements.analysis_approach = await this.tokenCounter.estimateTokens(context.analysis_approach);
64
- }
65
-
66
- if (context.design_principles) {
67
- const principlesText = context.design_principles.join(', ');
68
- elements.design_principles = await this.tokenCounter.estimateTokens(principlesText);
69
- }
70
-
71
- if (context.communication_style) {
72
- elements.communication_style = await this.tokenCounter.estimateTokens(context.communication_style);
73
- }
74
-
75
- if (context.content) {
76
- elements.content = await this.tokenCounter.estimateTokens(context.content);
77
- }
78
-
79
- // 총 토큰 수
80
- elements.total = Object.values(elements).reduce((sum, tokens) => sum + tokens, 0);
81
-
82
- return elements;
83
- }
84
-
85
- /**
86
- * 임계값 확인
87
- * @param {number} contextTokens - 컨텍스트 토큰 수
88
- * @returns {Object} 알림 정보
89
- */
90
- checkThresholds(contextTokens) {
91
- if (contextTokens >= this.thresholds.critical) {
92
- return {
93
- level: 'critical',
94
- message: `컨텍스트 토큰이 위험 수준(${this.thresholds.critical})을 초과했습니다: ${contextTokens}`
95
- };
96
- } else if (contextTokens >= this.thresholds.warning) {
97
- return {
98
- level: 'warning',
99
- message: `컨텍스트 토큰이 경고 수준(${this.thresholds.warning})에 도달했습니다: ${contextTokens}`
100
- };
101
- }
102
- return null;
103
- }
104
-
105
- /**
106
- * 페르소나별 통계 업데이트
107
- * @param {string} personaName - 페르소나 이름
108
- * @param {Object} usage - 사용량 정보
109
- */
110
- updatePersonaStats(personaName, usage) {
111
- if (!this.personaStats.has(personaName)) {
112
- this.personaStats.set(personaName, {
113
- totalUsages: 0,
114
- totalContextTokens: 0,
115
- averageContextTokens: 0,
116
- maxContextTokens: 0,
117
- minContextTokens: Infinity,
118
- warningCount: 0,
119
- criticalCount: 0
120
- });
121
- }
122
-
123
- const stats = this.personaStats.get(personaName);
124
-
125
- // 통계 업데이트
126
- stats.totalUsages++;
127
- stats.totalContextTokens += usage.contextTokens;
128
- stats.averageContextTokens = stats.totalContextTokens / stats.totalUsages;
129
- stats.maxContextTokens = Math.max(stats.maxContextTokens, usage.contextTokens);
130
- stats.minContextTokens = Math.min(stats.minContextTokens, usage.contextTokens);
131
-
132
- // 알림 카운트
133
- if (usage.alert) {
134
- if (usage.alert.level === 'warning') stats.warningCount++;
135
- if (usage.alert.level === 'critical') stats.criticalCount++;
136
- }
137
-
138
- this.personaStats.set(personaName, stats);
139
- }
140
-
141
- /**
142
- * 토큰 사용량 리포트 생성
143
- * @param {Object} options - 리포트 옵션
144
- * @returns {Object} 토큰 사용량 리포트
145
- */
146
- generateReport(options = {}) {
147
- const {
148
- startDate = null,
149
- endDate = null,
150
- personaName = null,
151
- format = 'summary'
152
- } = options;
153
-
154
- // 필터링된 데이터 가져오기
155
- let filteredHistory = this.filterHistory(startDate, endDate, personaName);
156
-
157
- if (format === 'detailed') {
158
- return this.generateDetailedReport(filteredHistory);
159
- } else {
160
- return this.generateSummaryReport(filteredHistory);
161
- }
162
- }
163
-
164
- /**
165
- * 히스토리 필터링
166
- * @param {Date} startDate - 시작 날짜
167
- * @param {Date} endDate - 종료 날짜
168
- * @param {string} personaName - 페르소나 이름
169
- * @returns {Array} 필터링된 히스토리
170
- */
171
- filterHistory(startDate, endDate, personaName) {
172
- let filtered = this.usageHistory;
173
-
174
- if (startDate) {
175
- filtered = filtered.filter(u => new Date(u.timestamp) >= startDate);
176
- }
177
-
178
- if (endDate) {
179
- filtered = filtered.filter(u => new Date(u.timestamp) <= endDate);
180
- }
181
-
182
- if (personaName) {
183
- filtered = filtered.filter(u => u.personaName === personaName);
184
- }
185
-
186
- return filtered;
187
- }
188
-
189
- /**
190
- * 요약 리포트 생성
191
- * @param {Array} history - 필터링된 히스토리
192
- * @returns {Object} 요약 리포트
193
- */
194
- generateSummaryReport(history) {
195
- if (history.length === 0) {
196
- return { message: '해당 기간의 데이터가 없습니다.' };
197
- }
198
-
199
- const totalContextTokens = history.reduce((sum, u) => sum + u.contextTokens, 0);
200
- const averageContextTokens = totalContextTokens / history.length;
201
- const maxUsage = history.reduce((max, u) => u.contextTokens > max.contextTokens ? u : max);
202
- const minUsage = history.reduce((min, u) => u.contextTokens < min.contextTokens ? u : min);
203
-
204
- // 페르소나별 집계
205
- const personaSummary = {};
206
- history.forEach(usage => {
207
- if (!personaSummary[usage.personaName]) {
208
- personaSummary[usage.personaName] = {
209
- count: 0,
210
- totalTokens: 0,
211
- alerts: { warning: 0, critical: 0 }
212
- };
213
- }
214
-
215
- personaSummary[usage.personaName].count++;
216
- personaSummary[usage.personaName].totalTokens += usage.contextTokens;
217
-
218
- if (usage.alert) {
219
- personaSummary[usage.personaName].alerts[usage.alert.level]++;
220
- }
221
- });
222
-
223
- return {
224
- period: {
225
- start: history[0].timestamp,
226
- end: history[history.length - 1].timestamp
227
- },
228
- totalUsages: history.length,
229
- tokenStats: {
230
- total: totalContextTokens,
231
- average: Math.round(averageContextTokens),
232
- max: {
233
- tokens: maxUsage.contextTokens,
234
- persona: maxUsage.personaName,
235
- timestamp: maxUsage.timestamp
236
- },
237
- min: {
238
- tokens: minUsage.contextTokens,
239
- persona: minUsage.personaName,
240
- timestamp: minUsage.timestamp
241
- }
242
- },
243
- personaSummary,
244
- alerts: {
245
- total: history.filter(u => u.alert).length,
246
- warning: history.filter(u => u.alert?.level === 'warning').length,
247
- critical: history.filter(u => u.alert?.level === 'critical').length
248
- }
249
- };
250
- }
251
-
252
- /**
253
- * 상세 리포트 생성
254
- * @param {Array} history - 필터링된 히스토리
255
- * @returns {Object} 상세 리포트
256
- */
257
- generateDetailedReport(history) {
258
- const summary = this.generateSummaryReport(history);
259
-
260
- // 시간대별 분석
261
- const hourlyAnalysis = this.analyzeHourlyPattern(history);
262
-
263
- // 컨텍스트 요소별 분석
264
- const elementAnalysis = this.analyzeContextElements(history);
265
-
266
- // 트렌드 분석
267
- const trendAnalysis = this.analyzeTrends(history);
268
-
269
- return {
270
- summary,
271
- hourlyAnalysis,
272
- elementAnalysis,
273
- trendAnalysis,
274
- rawData: history
275
- };
276
- }
277
-
278
- /**
279
- * 시간대별 패턴 분석
280
- * @param {Array} history - 필터링된 히스토리
281
- * @returns {Object} 시간대별 분석
282
- */
283
- analyzeHourlyPattern(history) {
284
- const hourlyData = {};
285
-
286
- history.forEach(usage => {
287
- const hour = new Date(usage.timestamp).getHours();
288
- if (!hourlyData[hour]) {
289
- hourlyData[hour] = {
290
- count: 0,
291
- totalTokens: 0
292
- };
293
- }
294
- hourlyData[hour].count++;
295
- hourlyData[hour].totalTokens += usage.contextTokens;
296
- });
297
-
298
- // 평균 계산
299
- Object.keys(hourlyData).forEach(hour => {
300
- hourlyData[hour].average = hourlyData[hour].totalTokens / hourlyData[hour].count;
301
- });
302
-
303
- return hourlyData;
304
- }
305
-
306
- /**
307
- * 트렌드 분석
308
- * @param {Array} history - 필터링된 히스토리
309
- * @returns {Object} 트렌드 정보
310
- */
311
- analyzeTrends(history) {
312
- if (history.length < 2) {
313
- return { message: '트렌드 분석을 위한 데이터가 부족합니다.' };
314
- }
315
-
316
- // 시간 순 정렬
317
- const sorted = [...history].sort((a, b) =>
318
- new Date(a.timestamp) - new Date(b.timestamp)
319
- );
320
-
321
- // 이동 평균 계산
322
- const windowSize = Math.min(5, Math.floor(sorted.length / 3));
323
- const movingAverages = [];
324
-
325
- for (let i = windowSize - 1; i < sorted.length; i++) {
326
- const window = sorted.slice(i - windowSize + 1, i + 1);
327
- const average = window.reduce((sum, u) => sum + u.contextTokens, 0) / windowSize;
328
- movingAverages.push({
329
- timestamp: sorted[i].timestamp,
330
- average: Math.round(average)
331
- });
332
- }
333
-
334
- // 증가/감소 트렌드 판단
335
- const firstAvg = movingAverages[0].average;
336
- const lastAvg = movingAverages[movingAverages.length - 1].average;
337
- const trendDirection = lastAvg > firstAvg ? 'increasing' :
338
- lastAvg < firstAvg ? 'decreasing' : 'stable';
339
- const trendPercentage = ((lastAvg - firstAvg) / firstAvg * 100).toFixed(2);
340
-
341
- return {
342
- direction: trendDirection,
343
- changePercentage: trendPercentage + '%',
344
- movingAverages,
345
- prediction: this.predictNextUsage(movingAverages)
346
- };
347
- }
348
-
349
- /**
350
- * 다음 사용량 예측
351
- * @param {Array} movingAverages - 이동 평균 데이터
352
- * @returns {number} 예측 토큰 수
353
- */
354
- predictNextUsage(movingAverages) {
355
- if (movingAverages.length < 3) {
356
- return null;
357
- }
358
-
359
- // 간단한 선형 예측
360
- const recent = movingAverages.slice(-3);
361
- const trend = (recent[2].average - recent[0].average) / 2;
362
- const prediction = recent[2].average + trend;
363
-
364
- return Math.round(Math.max(0, prediction));
365
- }
366
-
367
- /**
368
- * 토큰 사용량 최적화 제안
369
- * @param {string} personaName - 페르소나 이름
370
- * @returns {Object} 최적화 제안
371
- */
372
- getOptimizationSuggestions(personaName) {
373
- const stats = this.personaStats.get(personaName);
374
- if (!stats) {
375
- return { message: '해당 페르소나의 사용 기록이 없습니다.' };
376
- }
377
-
378
- const suggestions = [];
379
-
380
- // 평균 토큰 사용량이 높은 경우
381
- if (stats.averageContextTokens > this.thresholds.warning * 0.8) {
382
- suggestions.push({
383
- type: 'high_average',
384
- message: '평균 컨텍스트 토큰 사용량이 높습니다. 컨텍스트 내용을 간소화하는 것을 고려하세요.',
385
- currentAverage: Math.round(stats.averageContextTokens),
386
- recommendedMax: Math.round(this.thresholds.warning * 0.8)
387
- });
388
- }
389
-
390
- // 경고/위험 발생률이 높은 경우
391
- const alertRate = (stats.warningCount + stats.criticalCount) / stats.totalUsages;
392
- if (alertRate > 0.2) {
393
- suggestions.push({
394
- type: 'high_alert_rate',
395
- message: '토큰 한계 초과가 자주 발생합니다. 컨텍스트 압축을 활성화하세요.',
396
- alertRate: (alertRate * 100).toFixed(2) + '%',
397
- warningCount: stats.warningCount,
398
- criticalCount: stats.criticalCount
399
- });
400
- }
401
-
402
- // 최대 사용량이 위험 수준에 근접한 경우
403
- if (stats.maxContextTokens > this.thresholds.critical * 0.9) {
404
- suggestions.push({
405
- type: 'near_critical',
406
- message: '최대 토큰 사용량이 위험 수준에 근접합니다. 긴 컨텍스트를 분할하거나 요약하세요.',
407
- maxTokens: stats.maxContextTokens,
408
- criticalThreshold: this.thresholds.critical
409
- });
410
- }
411
-
412
- return {
413
- personaName,
414
- suggestions,
415
- currentStats: stats
416
- };
417
- }
418
-
419
- /**
420
- * 리포트 파일로 저장
421
- * @param {Object} report - 리포트 데이터
422
- * @param {string} filename - 파일명
423
- */
424
- async saveReport(report, filename) {
425
- const reportsDir = path.join(process.cwd(), '.aiwf', 'reports', 'token-usage');
426
-
427
- // 디렉토리 생성
428
- await fs.mkdir(reportsDir, { recursive: true });
429
-
430
- // 파일 경로
431
- const filePath = path.join(reportsDir, filename);
432
-
433
- // JSON 형식으로 저장
434
- await fs.writeFile(filePath, JSON.stringify(report, null, 2), 'utf-8');
435
-
436
- console.log(`토큰 사용량 리포트 저장: ${filePath}`);
437
- return filePath;
438
- }
439
-
440
- /**
441
- * 임계값 설정
442
- * @param {Object} thresholds - 새로운 임계값
443
- */
444
- setThresholds(thresholds) {
445
- if (thresholds.warning) {
446
- this.thresholds.warning = thresholds.warning;
447
- }
448
- if (thresholds.critical) {
449
- this.thresholds.critical = thresholds.critical;
450
- }
451
- }
452
-
453
- /**
454
- * 모니터링 데이터 초기화
455
- */
456
- reset() {
457
- this.usageHistory = [];
458
- this.personaStats.clear();
459
- console.log('토큰 모니터링 데이터가 초기화되었습니다.');
460
- }
461
- }
462
-
463
- module.exports = ContextTokenMonitor;