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,399 +0,0 @@
1
- /**
2
- * AIWF Enhanced Resource Loader with Memory Caching
3
- * 번들된 리소스와 사용자 디렉토리 리소스를 통합 관리하며 메모리 캐싱 기능 제공
4
- */
5
-
6
- import fs from 'fs/promises';
7
- import path from 'path';
8
- import { fileURLToPath } from 'url';
9
- import { dirname } from 'path';
10
- import { existsSync } from 'fs';
11
-
12
- const __filename = fileURLToPath(import.meta.url);
13
- const __dirname = dirname(__filename);
14
-
15
- // 리소스 기본 경로
16
- const BUNDLED_RESOURCES_PATH = path.join(__dirname, 'resources');
17
- const USER_RESOURCES_PATH = path.join(process.env.HOME || process.env.USERPROFILE, '.aiwf');
18
-
19
- export class EnhancedResourceLoader {
20
- constructor(options = {}) {
21
- this.bundledPath = options.bundledPath || BUNDLED_RESOURCES_PATH;
22
- this.userPath = options.userPath || USER_RESOURCES_PATH;
23
- this.preferUserResources = options.preferUserResources ?? true;
24
-
25
- // 메모리 캐시 설정
26
- this.cache = new Map();
27
- this.cacheEnabled = options.cacheEnabled ?? true;
28
- this.maxCacheSize = options.maxCacheSize || 100; // 최대 캐시 항목 수
29
- this.cacheTTL = options.cacheTTL || 5 * 60 * 1000; // 5분 TTL
30
-
31
- // 캐시 통계
32
- this.stats = {
33
- hits: 0,
34
- misses: 0,
35
- evictions: 0,
36
- totalRequests: 0
37
- };
38
-
39
- // 주기적 캐시 정리 (5분마다)
40
- if (this.cacheEnabled) {
41
- this.cleanupInterval = setInterval(() => {
42
- this.cleanExpiredCache();
43
- }, 5 * 60 * 1000);
44
- }
45
- }
46
-
47
- /**
48
- * 캐시 키 생성
49
- */
50
- generateCacheKey(resourceType, resourceName, operation = 'load') {
51
- return `${operation}:${resourceType}:${resourceName}`;
52
- }
53
-
54
- /**
55
- * 캐시에서 리소스 조회
56
- */
57
- getFromCache(cacheKey) {
58
- if (!this.cacheEnabled) return null;
59
-
60
- const cached = this.cache.get(cacheKey);
61
- if (!cached) return null;
62
-
63
- // TTL 확인
64
- if (Date.now() > cached.expiresAt) {
65
- this.cache.delete(cacheKey);
66
- return null;
67
- }
68
-
69
- this.stats.hits++;
70
- cached.lastAccessed = Date.now();
71
- return cached.data;
72
- }
73
-
74
- /**
75
- * 캐시에 리소스 저장
76
- */
77
- setCache(cacheKey, data) {
78
- if (!this.cacheEnabled) return;
79
-
80
- // 캐시 크기 제한
81
- if (this.cache.size >= this.maxCacheSize) {
82
- this.evictLRU();
83
- }
84
-
85
- this.cache.set(cacheKey, {
86
- data,
87
- createdAt: Date.now(),
88
- lastAccessed: Date.now(),
89
- expiresAt: Date.now() + this.cacheTTL
90
- });
91
- }
92
-
93
- /**
94
- * LRU 방식으로 캐시 항목 제거
95
- */
96
- evictLRU() {
97
- let oldestKey = null;
98
- let oldestTime = Date.now();
99
-
100
- for (const [key, value] of this.cache.entries()) {
101
- if (value.lastAccessed < oldestTime) {
102
- oldestTime = value.lastAccessed;
103
- oldestKey = key;
104
- }
105
- }
106
-
107
- if (oldestKey) {
108
- this.cache.delete(oldestKey);
109
- this.stats.evictions++;
110
- }
111
- }
112
-
113
- /**
114
- * 만료된 캐시 항목 정리
115
- */
116
- cleanExpiredCache() {
117
- const now = Date.now();
118
- const keysToDelete = [];
119
-
120
- for (const [key, value] of this.cache.entries()) {
121
- if (now > value.expiresAt) {
122
- keysToDelete.push(key);
123
- }
124
- }
125
-
126
- keysToDelete.forEach(key => this.cache.delete(key));
127
- }
128
-
129
- /**
130
- * 리소스 파일 경로 해결 (캐시된 버전)
131
- * 사용자 디렉토리 우선, 없으면 번들된 리소스 사용
132
- */
133
- async resolvePath(resourceType, resourceName) {
134
- const cacheKey = this.generateCacheKey(resourceType, resourceName, 'resolve');
135
-
136
- // 캐시 확인
137
- const cached = this.getFromCache(cacheKey);
138
- if (cached) {
139
- return cached;
140
- }
141
-
142
- this.stats.misses++;
143
- this.stats.totalRequests++;
144
-
145
- const userResourcePath = path.join(this.userPath, resourceType, resourceName);
146
- const bundledResourcePath = path.join(this.bundledPath, resourceType, resourceName);
147
-
148
- let resolvedPath = null;
149
-
150
- if (this.preferUserResources && existsSync(userResourcePath)) {
151
- resolvedPath = userResourcePath;
152
- } else if (existsSync(bundledResourcePath)) {
153
- resolvedPath = bundledResourcePath;
154
- }
155
-
156
- // 결과 캐시
157
- this.setCache(cacheKey, resolvedPath);
158
-
159
- return resolvedPath;
160
- }
161
-
162
- /**
163
- * 템플릿 로드 (캐시된 버전)
164
- */
165
- async loadTemplate(templateName) {
166
- const cacheKey = this.generateCacheKey('templates', templateName);
167
-
168
- // 캐시 확인
169
- const cached = this.getFromCache(cacheKey);
170
- if (cached) {
171
- return cached;
172
- }
173
-
174
- this.stats.misses++;
175
- this.stats.totalRequests++;
176
-
177
- const templatePath = await this.resolvePath('templates', templateName);
178
-
179
- if (!templatePath) {
180
- throw new Error(`Template ${templateName} not found`);
181
- }
182
-
183
- try {
184
- const content = await fs.readFile(templatePath, 'utf8');
185
-
186
- // 결과 캐시
187
- this.setCache(cacheKey, content);
188
-
189
- return content;
190
- } catch (error) {
191
- throw new Error(`Failed to load template ${templateName}: ${error.message}`);
192
- }
193
- }
194
-
195
- /**
196
- * 페르소나 로드 (캐시된 버전)
197
- */
198
- async loadPersona(personaName) {
199
- const cacheKey = this.generateCacheKey('personas', personaName);
200
-
201
- // 캐시 확인
202
- const cached = this.getFromCache(cacheKey);
203
- if (cached) {
204
- return cached;
205
- }
206
-
207
- this.stats.misses++;
208
- this.stats.totalRequests++;
209
-
210
- const personaPath = await this.resolvePath('personas', `${personaName}.json`);
211
-
212
- if (!personaPath) {
213
- throw new Error(`Persona ${personaName} not found`);
214
- }
215
-
216
- try {
217
- const content = await fs.readFile(personaPath, 'utf8');
218
- const personaData = JSON.parse(content);
219
-
220
- // 결과 캐시
221
- this.setCache(cacheKey, personaData);
222
-
223
- return personaData;
224
- } catch (error) {
225
- throw new Error(`Failed to load persona ${personaName}: ${error.message}`);
226
- }
227
- }
228
-
229
- /**
230
- * 유틸리티 모듈 로드 (캐시된 버전)
231
- */
232
- async loadUtil(utilName) {
233
- const cacheKey = this.generateCacheKey('utils', utilName);
234
-
235
- // 캐시 확인 (모듈은 실행 코드이므로 매번 새로 import 필요)
236
- // 하지만 경로 해결은 캐시 가능
237
- const pathCacheKey = this.generateCacheKey('utils', utilName, 'path');
238
- let utilPath = this.getFromCache(pathCacheKey);
239
-
240
- if (!utilPath) {
241
- this.stats.misses++;
242
- utilPath = await this.resolvePath('utils', utilName);
243
- this.setCache(pathCacheKey, utilPath);
244
- } else {
245
- this.stats.hits++;
246
- }
247
-
248
- this.stats.totalRequests++;
249
-
250
- if (!utilPath) {
251
- throw new Error(`Utility ${utilName} not found`);
252
- }
253
-
254
- try {
255
- // 동적 import (모듈은 캐시하지 않음)
256
- const module = await import(utilPath);
257
- return module;
258
- } catch (error) {
259
- throw new Error(`Failed to load utility ${utilName}: ${error.message}`);
260
- }
261
- }
262
-
263
- /**
264
- * 명령어 템플릿 로드 (캐시된 버전)
265
- */
266
- async loadCommand(commandName) {
267
- const cacheKey = this.generateCacheKey('commands', commandName);
268
-
269
- // 캐시 확인
270
- const cached = this.getFromCache(cacheKey);
271
- if (cached) {
272
- return cached;
273
- }
274
-
275
- this.stats.misses++;
276
- this.stats.totalRequests++;
277
-
278
- const commandPath = await this.resolvePath('commands', `${commandName}.md`);
279
-
280
- if (!commandPath) {
281
- throw new Error(`Command ${commandName} not found`);
282
- }
283
-
284
- try {
285
- const content = await fs.readFile(commandPath, 'utf8');
286
-
287
- // 결과 캐시
288
- this.setCache(cacheKey, content);
289
-
290
- return content;
291
- } catch (error) {
292
- throw new Error(`Failed to load command ${commandName}: ${error.message}`);
293
- }
294
- }
295
-
296
- /**
297
- * 사용자 디렉토리 초기화 (캐시된 체크)
298
- */
299
- async initUserDirectory() {
300
- const cacheKey = 'system:user_directory:initialized';
301
-
302
- // 캐시 확인
303
- const cached = this.getFromCache(cacheKey);
304
- if (cached) {
305
- return;
306
- }
307
-
308
- if (!existsSync(this.userPath)) {
309
- await fs.mkdir(this.userPath, { recursive: true });
310
- }
311
-
312
- // 하위 디렉토리 생성
313
- const subdirs = ['templates', 'personas', 'utils', 'commands', 'cache'];
314
- for (const subdir of subdirs) {
315
- const subdirPath = path.join(this.userPath, subdir);
316
- if (!existsSync(subdirPath)) {
317
- await fs.mkdir(subdirPath, { recursive: true });
318
- }
319
- }
320
-
321
- // 초기화 완료 캐시
322
- this.setCache(cacheKey, true);
323
- }
324
-
325
- /**
326
- * 캐시 통계 조회
327
- */
328
- getCacheStats() {
329
- const hitRate = this.stats.totalRequests > 0
330
- ? (this.stats.hits / this.stats.totalRequests * 100).toFixed(2)
331
- : 0;
332
-
333
- return {
334
- ...this.stats,
335
- hitRate: `${hitRate}%`,
336
- cacheSize: this.cache.size,
337
- maxCacheSize: this.maxCacheSize,
338
- memoryUsage: this.estimateMemoryUsage()
339
- };
340
- }
341
-
342
- /**
343
- * 캐시 메모리 사용량 추정
344
- */
345
- estimateMemoryUsage() {
346
- let totalSize = 0;
347
-
348
- for (const [key, value] of this.cache.entries()) {
349
- // 대략적인 크기 추정 (문자열 기준)
350
- totalSize += key.length * 2; // key size
351
- if (typeof value.data === 'string') {
352
- totalSize += value.data.length * 2;
353
- } else {
354
- totalSize += JSON.stringify(value.data).length * 2;
355
- }
356
- totalSize += 64; // 메타데이터 크기 추정
357
- }
358
-
359
- return `${(totalSize / 1024).toFixed(2)} KB`;
360
- }
361
-
362
- /**
363
- * 캐시 지우기
364
- */
365
- clearCache() {
366
- this.cache.clear();
367
- this.stats = {
368
- hits: 0,
369
- misses: 0,
370
- evictions: 0,
371
- totalRequests: 0
372
- };
373
- }
374
-
375
- /**
376
- * 특정 리소스 타입의 캐시 무효화
377
- */
378
- invalidateResourceType(resourceType) {
379
- const keysToDelete = [];
380
-
381
- for (const key of this.cache.keys()) {
382
- if (key.includes(`:${resourceType}:`)) {
383
- keysToDelete.push(key);
384
- }
385
- }
386
-
387
- keysToDelete.forEach(key => this.cache.delete(key));
388
- }
389
-
390
- /**
391
- * 리소스 로더 종료 시 정리
392
- */
393
- destroy() {
394
- if (this.cleanupInterval) {
395
- clearInterval(this.cleanupInterval);
396
- }
397
- this.clearCache();
398
- }
399
- }
@@ -1,250 +0,0 @@
1
- /**
2
- * AIWF Resource Loader
3
- * 번들된 리소스와 사용자 디렉토리 리소스를 통합 관리
4
- */
5
-
6
- import fs from 'fs/promises';
7
- import path from 'path';
8
- import { fileURLToPath } from 'url';
9
- import { dirname } from 'path';
10
- import { existsSync } from 'fs';
11
-
12
- const __filename = fileURLToPath(import.meta.url);
13
- const __dirname = dirname(__filename);
14
-
15
- // 리소스 기본 경로
16
- const BUNDLED_RESOURCES_PATH = path.join(__dirname, 'resources');
17
- const USER_RESOURCES_PATH = path.join(process.env.HOME || process.env.USERPROFILE, '.aiwf');
18
-
19
- export class ResourceLoader {
20
- constructor(options = {}) {
21
- this.bundledPath = options.bundledPath || BUNDLED_RESOURCES_PATH;
22
- this.userPath = options.userPath || USER_RESOURCES_PATH;
23
- this.preferUserResources = options.preferUserResources ?? true;
24
- }
25
-
26
- /**
27
- * 리소스 파일 경로 해결
28
- * 사용자 디렉토리 우선, 없으면 번들된 리소스 사용
29
- */
30
- async resolvePath(resourceType, resourceName) {
31
- const paths = this.preferUserResources
32
- ? [
33
- path.join(this.userPath, resourceType, resourceName),
34
- path.join(this.bundledPath, resourceType, resourceName)
35
- ]
36
- : [
37
- path.join(this.bundledPath, resourceType, resourceName),
38
- path.join(this.userPath, resourceType, resourceName)
39
- ];
40
-
41
- for (const resourcePath of paths) {
42
- if (existsSync(resourcePath)) {
43
- return resourcePath;
44
- }
45
- }
46
-
47
- throw new Error(`Resource not found: ${resourceType}/${resourceName}`);
48
- }
49
-
50
- /**
51
- * JSON 리소스 로드
52
- */
53
- async loadJSON(resourceType, resourceName) {
54
- const resourcePath = await this.resolvePath(resourceType, resourceName);
55
- const content = await fs.readFile(resourcePath, 'utf8');
56
- return JSON.parse(content);
57
- }
58
-
59
- /**
60
- * 텍스트 리소스 로드
61
- */
62
- async loadText(resourceType, resourceName) {
63
- const resourcePath = await this.resolvePath(resourceType, resourceName);
64
- return await fs.readFile(resourcePath, 'utf8');
65
- }
66
-
67
- /**
68
- * 리소스 목록 가져오기
69
- */
70
- async listResources(resourceType, options = {}) {
71
- const resources = new Set();
72
-
73
- // 번들된 리소스 목록
74
- const bundledDir = path.join(this.bundledPath, resourceType);
75
- if (existsSync(bundledDir)) {
76
- const bundledFiles = await fs.readdir(bundledDir);
77
- bundledFiles.forEach(file => resources.add(file));
78
- }
79
-
80
- // 사용자 리소스 목록
81
- const userDir = path.join(this.userPath, resourceType);
82
- if (existsSync(userDir)) {
83
- const userFiles = await fs.readdir(userDir);
84
- userFiles.forEach(file => resources.add(file));
85
- }
86
-
87
- // 필터링
88
- let fileList = Array.from(resources);
89
- if (options.extension) {
90
- fileList = fileList.filter(file => file.endsWith(options.extension));
91
- }
92
- if (options.filter) {
93
- fileList = fileList.filter(options.filter);
94
- }
95
-
96
- return fileList.sort();
97
- }
98
-
99
- /**
100
- * 페르소나 로드
101
- */
102
- async loadPersona(personaName) {
103
- if (!personaName.endsWith('.json')) {
104
- personaName += '.json';
105
- }
106
- return await this.loadJSON('personas', personaName);
107
- }
108
-
109
- /**
110
- * 모든 페르소나 목록
111
- */
112
- async listPersonas() {
113
- const personas = await this.listResources('personas', {
114
- extension: '.json',
115
- filter: (file) => file !== 'persona-index.json' && file !== 'evaluation_criteria.json'
116
- });
117
- return personas.map(file => path.basename(file, '.json'));
118
- }
119
-
120
- /**
121
- * 템플릿 설정 로드
122
- */
123
- async loadTemplateConfig(templateName) {
124
- return await this.loadJSON('templates', path.join(templateName, 'config.json'));
125
- }
126
-
127
- /**
128
- * 템플릿 목록
129
- */
130
- async listTemplates() {
131
- const templates = [];
132
- const templateDir = path.join(this.bundledPath, 'templates');
133
-
134
- if (existsSync(templateDir)) {
135
- const entries = await fs.readdir(templateDir, { withFileTypes: true });
136
- for (const entry of entries) {
137
- if (entry.isDirectory()) {
138
- const configPath = path.join(templateDir, entry.name, 'config.json');
139
- if (existsSync(configPath)) {
140
- templates.push(entry.name);
141
- }
142
- }
143
- }
144
- }
145
-
146
- return templates;
147
- }
148
-
149
- /**
150
- * 템플릿 경로 가져오기
151
- */
152
- async getTemplatePath(templateName) {
153
- const templatePath = await this.resolvePath('templates', templateName);
154
- const configPath = path.join(templatePath, 'config.json');
155
-
156
- if (!existsSync(configPath)) {
157
- throw new Error(`Invalid template: ${templateName}`);
158
- }
159
-
160
- return path.join(templatePath, 'template');
161
- }
162
-
163
- /**
164
- * 명령어 모듈 로드
165
- */
166
- async loadCommand(commandName) {
167
- if (!commandName.endsWith('.js')) {
168
- commandName += '.js';
169
- }
170
-
171
- const commandPath = await this.resolvePath('commands', commandName);
172
- return await import(commandPath);
173
- }
174
-
175
- /**
176
- * 유틸리티 모듈 로드
177
- */
178
- async loadUtil(utilName) {
179
- if (!utilName.endsWith('.js')) {
180
- utilName += '.js';
181
- }
182
-
183
- const utilPath = await this.resolvePath('utils', utilName);
184
- return await import(utilPath);
185
- }
186
-
187
- /**
188
- * 사용자 리소스 디렉토리 초기화
189
- */
190
- async initUserDirectory() {
191
- const dirs = ['personas', 'templates', 'commands', 'utils', 'config'];
192
-
193
- for (const dir of dirs) {
194
- const dirPath = path.join(this.userPath, dir);
195
- if (!existsSync(dirPath)) {
196
- await fs.mkdir(dirPath, { recursive: true });
197
- }
198
- }
199
-
200
- // 기본 설정 파일 복사
201
- const configFiles = ['language.json', 'personas/current.json'];
202
- for (const configFile of configFiles) {
203
- const userFile = path.join(this.userPath, configFile);
204
- if (!existsSync(userFile)) {
205
- try {
206
- const bundledFile = path.join(this.bundledPath, configFile);
207
- if (existsSync(bundledFile)) {
208
- await fs.copyFile(bundledFile, userFile);
209
- }
210
- } catch (error) {
211
- // 기본 설정 파일이 없어도 계속 진행
212
- }
213
- }
214
- }
215
- }
216
-
217
- /**
218
- * 리소스 존재 여부 확인
219
- */
220
- async exists(resourceType, resourceName) {
221
- try {
222
- await this.resolvePath(resourceType, resourceName);
223
- return true;
224
- } catch {
225
- return false;
226
- }
227
- }
228
-
229
- /**
230
- * 리소스 복사 (번들 -> 사용자 디렉토리)
231
- */
232
- async copyToUserDirectory(resourceType, resourceName) {
233
- const bundledPath = path.join(this.bundledPath, resourceType, resourceName);
234
- const userPath = path.join(this.userPath, resourceType, resourceName);
235
-
236
- if (!existsSync(bundledPath)) {
237
- throw new Error(`Bundled resource not found: ${resourceType}/${resourceName}`);
238
- }
239
-
240
- await fs.mkdir(path.dirname(userPath), { recursive: true });
241
- await fs.copyFile(bundledPath, userPath);
242
-
243
- return userPath;
244
- }
245
- }
246
-
247
- // 기본 인스턴스 export
248
- export const defaultLoader = new ResourceLoader();
249
-
250
- export default ResourceLoader;