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,885 +0,0 @@
1
- /**
2
- * Metrics Collector
3
- * Collects and analyzes metrics for AI persona performance
4
- */
5
-
6
- import fs from 'fs/promises';
7
- import path from 'path';
8
- import { EventEmitter } from 'events';
9
-
10
- class MetricsCollector extends EventEmitter {
11
- constructor(options = {}) {
12
- super();
13
-
14
- this.options = {
15
- metricsPath: options.metricsPath ||
16
- path.join(process.cwd(), '.aiwf', 'metrics'),
17
- maxHistorySize: options.maxHistorySize || 1000,
18
- aggregationInterval: options.aggregationInterval || 3600000, // 1 hour
19
- persistInterval: options.persistInterval || 300000, // 5 minutes
20
- ...options
21
- };
22
-
23
- this.metrics = {
24
- sessions: [],
25
- personaPerformance: {},
26
- taskOutcomes: [],
27
- aggregated: {}
28
- };
29
-
30
- this.currentSession = null;
31
- this.startTime = Date.now();
32
- this.persistTimer = null;
33
- }
34
-
35
- /**
36
- * Initialize metrics collector
37
- */
38
- async init() {
39
- try {
40
- // Ensure metrics directory exists
41
- await fs.mkdir(this.options.metricsPath, { recursive: true });
42
-
43
- // Load existing metrics
44
- await this.loadMetrics();
45
-
46
- // Start persist timer
47
- this.startPersistTimer();
48
-
49
- this.emit('initialized', {
50
- sessionsLoaded: this.metrics.sessions.length,
51
- startTime: this.startTime
52
- });
53
-
54
- return true;
55
- } catch (error) {
56
- this.emit('error', { error, phase: 'initialization' });
57
- throw error;
58
- }
59
- }
60
-
61
- /**
62
- * Start a new metrics session
63
- */
64
- startSession(persona, task) {
65
- // End current session if exists
66
- if (this.currentSession) {
67
- this.endSession();
68
- }
69
-
70
- this.currentSession = {
71
- id: this.generateSessionId(),
72
- persona: persona.name || persona,
73
- task: {
74
- type: task.type || 'general',
75
- description: task.description || task.command || '',
76
- complexity: this.estimateTaskComplexity(task)
77
- },
78
- startTime: Date.now(),
79
- events: [],
80
- metrics: {
81
- tokenUsage: {
82
- start: this.getCurrentTokenCount(),
83
- end: null,
84
- contextSwitches: 0
85
- },
86
- interactions: 0,
87
- errors: 0,
88
- completionStatus: null
89
- }
90
- };
91
-
92
- this.emit('sessionStarted', {
93
- sessionId: this.currentSession.id,
94
- persona: this.currentSession.persona
95
- });
96
-
97
- return this.currentSession.id;
98
- }
99
-
100
- /**
101
- * End current session
102
- */
103
- endSession(status = 'completed') {
104
- if (!this.currentSession) return;
105
-
106
- this.currentSession.endTime = Date.now();
107
- this.currentSession.duration = this.currentSession.endTime - this.currentSession.startTime;
108
- this.currentSession.metrics.completionStatus = status;
109
- this.currentSession.metrics.tokenUsage.end = this.getCurrentTokenCount();
110
-
111
- // Calculate quality metrics
112
- this.currentSession.qualityMetrics = this.calculateQualityMetrics(this.currentSession);
113
-
114
- // Store session
115
- this.metrics.sessions.push(this.currentSession);
116
- this.updatePersonaPerformance(this.currentSession);
117
-
118
- // Limit history size
119
- if (this.metrics.sessions.length > this.options.maxHistorySize) {
120
- this.metrics.sessions = this.metrics.sessions.slice(-this.options.maxHistorySize);
121
- }
122
-
123
- this.emit('sessionEnded', {
124
- sessionId: this.currentSession.id,
125
- duration: this.currentSession.duration,
126
- status
127
- });
128
-
129
- const session = this.currentSession;
130
- this.currentSession = null;
131
-
132
- return session;
133
- }
134
-
135
- /**
136
- * Track an event
137
- */
138
- trackEvent(eventType, data = {}) {
139
- const event = {
140
- type: eventType,
141
- timestamp: Date.now(),
142
- data
143
- };
144
-
145
- // Add to current session if active
146
- if (this.currentSession) {
147
- this.currentSession.events.push(event);
148
-
149
- // Update session metrics based on event
150
- this.updateSessionMetrics(eventType, data);
151
- }
152
-
153
- // Track global events
154
- this.trackGlobalEvent(eventType, data);
155
-
156
- this.emit('eventTracked', event);
157
- }
158
-
159
- /**
160
- * Update session metrics based on event
161
- */
162
- updateSessionMetrics(eventType, data) {
163
- if (!this.currentSession) return;
164
-
165
- switch (eventType) {
166
- case 'interaction':
167
- this.currentSession.metrics.interactions++;
168
- break;
169
-
170
- case 'error':
171
- this.currentSession.metrics.errors++;
172
- break;
173
-
174
- case 'context_switch':
175
- this.currentSession.metrics.tokenUsage.contextSwitches++;
176
- break;
177
-
178
- case 'task_completed':
179
- this.currentSession.metrics.completionStatus = 'completed';
180
- break;
181
-
182
- case 'task_failed':
183
- this.currentSession.metrics.completionStatus = 'failed';
184
- break;
185
- }
186
- }
187
-
188
- /**
189
- * Track global events (not session-specific)
190
- */
191
- trackGlobalEvent(eventType, data) {
192
- // Aggregate event counts
193
- if (!this.metrics.aggregated.eventCounts) {
194
- this.metrics.aggregated.eventCounts = {};
195
- }
196
-
197
- this.metrics.aggregated.eventCounts[eventType] =
198
- (this.metrics.aggregated.eventCounts[eventType] || 0) + 1;
199
-
200
- // Track persona switches
201
- if (eventType === 'persona_switch') {
202
- if (!this.metrics.aggregated.personaSwitches) {
203
- this.metrics.aggregated.personaSwitches = [];
204
- }
205
-
206
- this.metrics.aggregated.personaSwitches.push({
207
- from: data.from,
208
- to: data.to,
209
- trigger: data.trigger,
210
- timestamp: Date.now()
211
- });
212
- }
213
- }
214
-
215
- /**
216
- * Calculate quality metrics for a session
217
- */
218
- calculateQualityMetrics(session) {
219
- const metrics = {
220
- completionTime: session.duration,
221
- tokenEfficiency: this.calculateTokenEfficiency(session),
222
- errorRate: this.calculateErrorRate(session),
223
- interactionEfficiency: this.calculateInteractionEfficiency(session),
224
- overallScore: 0
225
- };
226
-
227
- // Calculate overall score (0-1)
228
- const weights = {
229
- completion: 0.3,
230
- tokenEfficiency: 0.3,
231
- errorRate: 0.2,
232
- interactionEfficiency: 0.2
233
- };
234
-
235
- let score = 0;
236
-
237
- // Completion score
238
- if (session.metrics.completionStatus === 'completed') {
239
- score += weights.completion;
240
- }
241
-
242
- // Token efficiency score
243
- score += metrics.tokenEfficiency * weights.tokenEfficiency;
244
-
245
- // Error rate score (inverse - lower is better)
246
- score += (1 - metrics.errorRate) * weights.errorRate;
247
-
248
- // Interaction efficiency score
249
- score += metrics.interactionEfficiency * weights.interactionEfficiency;
250
-
251
- metrics.overallScore = score;
252
-
253
- return metrics;
254
- }
255
-
256
- /**
257
- * Calculate token efficiency
258
- */
259
- calculateTokenEfficiency(session) {
260
- const tokensUsed = (session.metrics.tokenUsage.end || 0) -
261
- (session.metrics.tokenUsage.start || 0);
262
-
263
- if (tokensUsed === 0) return 1;
264
-
265
- // Estimate expected tokens based on task complexity
266
- const expectedTokens = session.task.complexity * 1000;
267
-
268
- // Efficiency is inverse of usage ratio (lower usage = higher efficiency)
269
- const efficiency = Math.min(expectedTokens / tokensUsed, 1);
270
-
271
- return efficiency;
272
- }
273
-
274
- /**
275
- * Calculate error rate
276
- */
277
- calculateErrorRate(session) {
278
- if (session.metrics.interactions === 0) return 0;
279
-
280
- return Math.min(session.metrics.errors / session.metrics.interactions, 1);
281
- }
282
-
283
- /**
284
- * Calculate interaction efficiency
285
- */
286
- calculateInteractionEfficiency(session) {
287
- if (session.metrics.interactions === 0) return 0;
288
-
289
- // Estimate expected interactions based on task complexity
290
- const expectedInteractions = Math.max(session.task.complexity * 2, 1);
291
-
292
- // Efficiency is inverse of interaction ratio
293
- const efficiency = Math.min(expectedInteractions / session.metrics.interactions, 1);
294
-
295
- return efficiency;
296
- }
297
-
298
- /**
299
- * Estimate task complexity
300
- */
301
- estimateTaskComplexity(task) {
302
- let complexity = 1; // Base complexity
303
-
304
- // Increase based on task type
305
- const complexTypes = ['debug', 'optimize', 'architect', 'refactor'];
306
- if (complexTypes.includes(task.type)) {
307
- complexity += 1;
308
- }
309
-
310
- // Increase based on keywords
311
- const complexKeywords = ['complex', 'difficult', 'large', 'entire', 'all'];
312
- const description = (task.description || '').toLowerCase();
313
- complexKeywords.forEach(keyword => {
314
- if (description.includes(keyword)) {
315
- complexity += 0.5;
316
- }
317
- });
318
-
319
- // Cap at 5
320
- return Math.min(complexity, 5);
321
- }
322
-
323
- /**
324
- * Update persona performance metrics
325
- */
326
- updatePersonaPerformance(session) {
327
- const personaName = session.persona;
328
-
329
- if (!this.metrics.personaPerformance[personaName]) {
330
- this.metrics.personaPerformance[personaName] = {
331
- totalSessions: 0,
332
- completedSessions: 0,
333
- totalDuration: 0,
334
- totalTokens: 0,
335
- totalErrors: 0,
336
- qualityScores: [],
337
- taskTypes: {}
338
- };
339
- }
340
-
341
- const perf = this.metrics.personaPerformance[personaName];
342
-
343
- perf.totalSessions++;
344
- if (session.metrics.completionStatus === 'completed') {
345
- perf.completedSessions++;
346
- }
347
-
348
- perf.totalDuration += session.duration;
349
-
350
- const tokensUsed = (session.metrics.tokenUsage.end || 0) -
351
- (session.metrics.tokenUsage.start || 0);
352
- perf.totalTokens += tokensUsed;
353
-
354
- perf.totalErrors += session.metrics.errors;
355
-
356
- if (session.qualityMetrics) {
357
- perf.qualityScores.push(session.qualityMetrics.overallScore);
358
- }
359
-
360
- // Track task types
361
- const taskType = session.task.type;
362
- perf.taskTypes[taskType] = (perf.taskTypes[taskType] || 0) + 1;
363
- }
364
-
365
- /**
366
- * Get current token count (simulated)
367
- */
368
- getCurrentTokenCount() {
369
- // In a real implementation, this would interface with the token tracking system
370
- // For now, return a simulated increasing value
371
- return Math.floor((Date.now() - this.startTime) / 100);
372
- }
373
-
374
- /**
375
- * Collect current metrics
376
- */
377
- async collectCurrentMetrics() {
378
- if (!this.currentSession) return null;
379
-
380
- return {
381
- duration: Date.now() - this.currentSession.startTime,
382
- interactions: this.currentSession.metrics.interactions,
383
- errors: this.currentSession.metrics.errors,
384
- tokenUsage: {
385
- current: this.getCurrentTokenCount() - this.currentSession.metrics.tokenUsage.start,
386
- contextSwitches: this.currentSession.metrics.tokenUsage.contextSwitches
387
- }
388
- };
389
- }
390
-
391
- /**
392
- * Get persona history
393
- */
394
- async getPersonaHistory(personaName) {
395
- return this.metrics.sessions.filter(
396
- session => session.persona === personaName
397
- );
398
- }
399
-
400
- /**
401
- * Get persona statistics
402
- */
403
- async getPersonaStats(personaName) {
404
- const perf = this.metrics.personaPerformance[personaName];
405
-
406
- if (!perf || perf.totalSessions === 0) {
407
- return {
408
- message: `No data available for persona: ${personaName}`
409
- };
410
- }
411
-
412
- const avgQualityScore = perf.qualityScores.length > 0 ?
413
- perf.qualityScores.reduce((a, b) => a + b, 0) / perf.qualityScores.length : 0;
414
-
415
- return {
416
- totalSessions: perf.totalSessions,
417
- completionRate: perf.completedSessions / perf.totalSessions,
418
- averageDuration: perf.totalDuration / perf.totalSessions,
419
- averageTokens: perf.totalTokens / perf.totalSessions,
420
- errorRate: perf.totalErrors / perf.totalSessions,
421
- averageQualityScore: avgQualityScore,
422
- taskDistribution: perf.taskTypes
423
- };
424
- }
425
-
426
- /**
427
- * Generate comprehensive report
428
- */
429
- async generateReport(options = {}) {
430
- const timeRange = options.timeRange || 'all';
431
- const startTime = this.getStartTime(timeRange);
432
-
433
- // Filter sessions by time range
434
- const sessions = this.metrics.sessions.filter(
435
- session => session.startTime >= startTime
436
- );
437
-
438
- const report = {
439
- generatedAt: new Date().toISOString(),
440
- timeRange,
441
- summary: {
442
- totalSessions: sessions.length,
443
- averageCompletionTime: this.calculateAverageTime(sessions),
444
- personaUsage: this.getPersonaUsageStats(sessions),
445
- qualityTrend: this.calculateQualityTrend(sessions)
446
- },
447
- personaAnalysis: this.analyzePersonaEffectiveness(sessions),
448
- taskAnalysis: this.analyzeTaskTypes(sessions),
449
- recommendations: this.generateRecommendations(sessions)
450
- };
451
-
452
- return report;
453
- }
454
-
455
- /**
456
- * Get start time for time range
457
- */
458
- getStartTime(timeRange) {
459
- const now = Date.now();
460
-
461
- switch (timeRange) {
462
- case 'hour':
463
- return now - 3600000;
464
- case 'day':
465
- return now - 86400000;
466
- case 'week':
467
- return now - 604800000;
468
- case 'month':
469
- return now - 2592000000;
470
- default:
471
- return 0;
472
- }
473
- }
474
-
475
- /**
476
- * Calculate average completion time
477
- */
478
- calculateAverageTime(sessions) {
479
- if (sessions.length === 0) return 0;
480
-
481
- const totalTime = sessions.reduce((sum, session) => sum + session.duration, 0);
482
- return totalTime / sessions.length;
483
- }
484
-
485
- /**
486
- * Get persona usage statistics
487
- */
488
- getPersonaUsageStats(sessions) {
489
- const usage = {};
490
-
491
- sessions.forEach(session => {
492
- usage[session.persona] = (usage[session.persona] || 0) + 1;
493
- });
494
-
495
- // Convert to percentages
496
- const total = sessions.length;
497
- const stats = {};
498
-
499
- for (const [persona, count] of Object.entries(usage)) {
500
- stats[persona] = {
501
- count,
502
- percentage: (count / total) * 100
503
- };
504
- }
505
-
506
- return stats;
507
- }
508
-
509
- /**
510
- * Calculate quality trend
511
- */
512
- calculateQualityTrend(sessions) {
513
- if (sessions.length < 2) {
514
- return { trend: 'insufficient_data' };
515
- }
516
-
517
- // Get quality scores over time
518
- const scores = sessions
519
- .filter(s => s.qualityMetrics)
520
- .map(s => ({
521
- time: s.startTime,
522
- score: s.qualityMetrics.overallScore
523
- }))
524
- .sort((a, b) => a.time - b.time);
525
-
526
- if (scores.length < 2) {
527
- return { trend: 'insufficient_data' };
528
- }
529
-
530
- // Calculate trend (simple linear regression)
531
- const n = scores.length;
532
- const sumX = scores.reduce((sum, s, i) => sum + i, 0);
533
- const sumY = scores.reduce((sum, s) => sum + s.score, 0);
534
- const sumXY = scores.reduce((sum, s, i) => sum + i * s.score, 0);
535
- const sumX2 = scores.reduce((sum, s, i) => sum + i * i, 0);
536
-
537
- const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
538
-
539
- return {
540
- trend: slope > 0.01 ? 'improving' : slope < -0.01 ? 'declining' : 'stable',
541
- slope,
542
- latestScore: scores[scores.length - 1].score,
543
- averageScore: sumY / n
544
- };
545
- }
546
-
547
- /**
548
- * Analyze persona effectiveness
549
- */
550
- analyzePersonaEffectiveness(sessions) {
551
- const analysis = {};
552
-
553
- // Group sessions by persona
554
- const personaSessions = {};
555
- sessions.forEach(session => {
556
- if (!personaSessions[session.persona]) {
557
- personaSessions[session.persona] = [];
558
- }
559
- personaSessions[session.persona].push(session);
560
- });
561
-
562
- // Analyze each persona
563
- for (const [persona, personaSessions] of Object.entries(personaSessions)) {
564
- const completed = personaSessions.filter(s => s.metrics.completionStatus === 'completed');
565
- const qualityScores = personaSessions
566
- .filter(s => s.qualityMetrics)
567
- .map(s => s.qualityMetrics.overallScore);
568
-
569
- analysis[persona] = {
570
- sessionCount: personaSessions.length,
571
- completionRate: completed.length / personaSessions.length,
572
- averageCompletionTime: this.calculateAverageTime(personaSessions),
573
- averageQualityScore: qualityScores.length > 0 ?
574
- qualityScores.reduce((a, b) => a + b, 0) / qualityScores.length : 0,
575
- tokenEfficiency: this.calculateAverageTokenEfficiency(personaSessions),
576
- bestUseCases: this.identifyBestUseCases(persona, personaSessions),
577
- improvementAreas: this.identifyImprovementAreas(persona, personaSessions)
578
- };
579
- }
580
-
581
- return analysis;
582
- }
583
-
584
- /**
585
- * Calculate average token efficiency
586
- */
587
- calculateAverageTokenEfficiency(sessions) {
588
- const efficiencies = sessions
589
- .filter(s => s.qualityMetrics)
590
- .map(s => s.qualityMetrics.tokenEfficiency);
591
-
592
- if (efficiencies.length === 0) return 0;
593
-
594
- return efficiencies.reduce((a, b) => a + b, 0) / efficiencies.length;
595
- }
596
-
597
- /**
598
- * Identify best use cases for persona
599
- */
600
- identifyBestUseCases(persona, sessions) {
601
- // Group by task type and calculate success rate
602
- const taskStats = {};
603
-
604
- sessions.forEach(session => {
605
- const taskType = session.task.type;
606
- if (!taskStats[taskType]) {
607
- taskStats[taskType] = {
608
- total: 0,
609
- successful: 0,
610
- avgQuality: 0,
611
- qualityCount: 0
612
- };
613
- }
614
-
615
- taskStats[taskType].total++;
616
-
617
- if (session.metrics.completionStatus === 'completed') {
618
- taskStats[taskType].successful++;
619
- }
620
-
621
- if (session.qualityMetrics) {
622
- taskStats[taskType].avgQuality += session.qualityMetrics.overallScore;
623
- taskStats[taskType].qualityCount++;
624
- }
625
- });
626
-
627
- // Calculate success rates and find best
628
- const taskScores = Object.entries(taskStats).map(([type, stats]) => ({
629
- type,
630
- successRate: stats.successful / stats.total,
631
- avgQuality: stats.qualityCount > 0 ? stats.avgQuality / stats.qualityCount : 0,
632
- count: stats.total
633
- }));
634
-
635
- // Return top 3 task types
636
- return taskScores
637
- .filter(t => t.count >= 2) // Minimum sample size
638
- .sort((a, b) => (b.successRate + b.avgQuality) - (a.successRate + a.avgQuality))
639
- .slice(0, 3)
640
- .map(t => t.type);
641
- }
642
-
643
- /**
644
- * Identify improvement areas
645
- */
646
- identifyImprovementAreas(persona, sessions) {
647
- const areas = [];
648
-
649
- // Check completion rate
650
- const completionRate = sessions.filter(s =>
651
- s.metrics.completionStatus === 'completed'
652
- ).length / sessions.length;
653
-
654
- if (completionRate < 0.8) {
655
- areas.push('completion_rate');
656
- }
657
-
658
- // Check error rate
659
- const avgErrors = sessions.reduce((sum, s) =>
660
- sum + s.metrics.errors, 0
661
- ) / sessions.length;
662
-
663
- if (avgErrors > 1) {
664
- areas.push('error_rate');
665
- }
666
-
667
- // Check token efficiency
668
- const avgTokenEfficiency = this.calculateAverageTokenEfficiency(sessions);
669
- if (avgTokenEfficiency < 0.5) {
670
- areas.push('token_efficiency');
671
- }
672
-
673
- return areas;
674
- }
675
-
676
- /**
677
- * Analyze task types
678
- */
679
- analyzeTaskTypes(sessions) {
680
- const taskAnalysis = {};
681
-
682
- sessions.forEach(session => {
683
- const taskType = session.task.type;
684
-
685
- if (!taskAnalysis[taskType]) {
686
- taskAnalysis[taskType] = {
687
- count: 0,
688
- totalDuration: 0,
689
- completedCount: 0,
690
- totalQuality: 0,
691
- qualityCount: 0,
692
- personas: {}
693
- };
694
- }
695
-
696
- const analysis = taskAnalysis[taskType];
697
- analysis.count++;
698
- analysis.totalDuration += session.duration;
699
-
700
- if (session.metrics.completionStatus === 'completed') {
701
- analysis.completedCount++;
702
- }
703
-
704
- if (session.qualityMetrics) {
705
- analysis.totalQuality += session.qualityMetrics.overallScore;
706
- analysis.qualityCount++;
707
- }
708
-
709
- // Track which personas handle this task type
710
- analysis.personas[session.persona] = (analysis.personas[session.persona] || 0) + 1;
711
- });
712
-
713
- // Calculate averages
714
- for (const [taskType, analysis] of Object.entries(taskAnalysis)) {
715
- analysis.averageDuration = analysis.totalDuration / analysis.count;
716
- analysis.completionRate = analysis.completedCount / analysis.count;
717
- analysis.averageQuality = analysis.qualityCount > 0 ?
718
- analysis.totalQuality / analysis.qualityCount : 0;
719
-
720
- // Find best persona for this task type
721
- analysis.bestPersona = Object.entries(analysis.personas)
722
- .sort(([,a], [,b]) => b - a)[0]?.[0];
723
- }
724
-
725
- return taskAnalysis;
726
- }
727
-
728
- /**
729
- * Generate recommendations
730
- */
731
- generateRecommendations(sessions) {
732
- const recommendations = [];
733
-
734
- // Analyze overall patterns
735
- const personaAnalysis = this.analyzePersonaEffectiveness(sessions);
736
- const taskAnalysis = this.analyzeTaskTypes(sessions);
737
-
738
- // Recommendation 1: Underutilized personas
739
- for (const [persona, stats] of Object.entries(personaAnalysis)) {
740
- if (stats.sessionCount < sessions.length * 0.1) {
741
- recommendations.push({
742
- type: 'persona_usage',
743
- priority: 'medium',
744
- message: `Consider using ${persona} persona more often for ${stats.bestUseCases.join(', ')} tasks`,
745
- data: { persona, usage: stats.sessionCount }
746
- });
747
- }
748
- }
749
-
750
- // Recommendation 2: Task-persona mismatches
751
- for (const [taskType, analysis] of Object.entries(taskAnalysis)) {
752
- if (analysis.averageQuality < 0.6 && analysis.count > 3) {
753
- recommendations.push({
754
- type: 'task_persona_match',
755
- priority: 'high',
756
- message: `${taskType} tasks have low quality scores. Try using ${analysis.bestPersona} persona`,
757
- data: { taskType, currentQuality: analysis.averageQuality }
758
- });
759
- }
760
- }
761
-
762
- // Recommendation 3: High error rates
763
- for (const [persona, stats] of Object.entries(personaAnalysis)) {
764
- if (stats.improvementAreas.includes('error_rate')) {
765
- recommendations.push({
766
- type: 'error_rate',
767
- priority: 'high',
768
- message: `${persona} persona has high error rate. Review context rules and tool recommendations`,
769
- data: { persona, areas: stats.improvementAreas }
770
- });
771
- }
772
- }
773
-
774
- return recommendations;
775
- }
776
-
777
- /**
778
- * Load metrics from disk
779
- */
780
- async loadMetrics() {
781
- try {
782
- const metricsFile = path.join(this.options.metricsPath, 'metrics.json');
783
- const data = await fs.readFile(metricsFile, 'utf-8');
784
- const loaded = JSON.parse(data);
785
-
786
- // Merge with current metrics
787
- this.metrics = {
788
- ...this.metrics,
789
- ...loaded,
790
- sessions: [...(loaded.sessions || []), ...this.metrics.sessions]
791
- };
792
-
793
- // Limit to max history size
794
- if (this.metrics.sessions.length > this.options.maxHistorySize) {
795
- this.metrics.sessions = this.metrics.sessions.slice(-this.options.maxHistorySize);
796
- }
797
- } catch (error) {
798
- // No existing metrics or error loading - start fresh
799
- }
800
- }
801
-
802
- /**
803
- * Persist metrics to disk
804
- */
805
- async persistMetrics() {
806
- try {
807
- const metricsFile = path.join(this.options.metricsPath, 'metrics.json');
808
- await fs.writeFile(
809
- metricsFile,
810
- JSON.stringify(this.metrics, null, 2),
811
- 'utf-8'
812
- );
813
-
814
- this.emit('metricsPersisted', {
815
- sessionCount: this.metrics.sessions.length
816
- });
817
- } catch (error) {
818
- this.emit('error', { error, phase: 'persist' });
819
- }
820
- }
821
-
822
- /**
823
- * Start persist timer
824
- */
825
- startPersistTimer() {
826
- this.persistTimer = setInterval(
827
- () => this.persistMetrics(),
828
- this.options.persistInterval
829
- );
830
- }
831
-
832
- /**
833
- * Generate session ID
834
- */
835
- generateSessionId() {
836
- return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
837
- }
838
-
839
- /**
840
- * Get current session metrics
841
- */
842
- async getCurrentSessionMetrics() {
843
- if (!this.currentSession) {
844
- return { message: 'No active session' };
845
- }
846
-
847
- return await this.collectCurrentMetrics();
848
- }
849
-
850
- /**
851
- * Reset metrics
852
- */
853
- async reset() {
854
- this.metrics = {
855
- sessions: [],
856
- personaPerformance: {},
857
- taskOutcomes: [],
858
- aggregated: {}
859
- };
860
-
861
- this.currentSession = null;
862
-
863
- await this.persistMetrics();
864
-
865
- this.emit('reset');
866
- }
867
-
868
- /**
869
- * Cleanup resources
870
- */
871
- async cleanup() {
872
- if (this.persistTimer) {
873
- clearInterval(this.persistTimer);
874
- this.persistTimer = null;
875
- }
876
-
877
- // Persist final metrics
878
- await this.persistMetrics();
879
-
880
- this.removeAllListeners();
881
- }
882
- }
883
-
884
- export default MetricsCollector;
885
- export { MetricsCollector };