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,271 +0,0 @@
1
- import fs from 'fs/promises';
2
- import path from 'path';
3
- import ora from 'ora';
4
- import chalk from 'chalk';
5
- import {
6
- TOOL_DIRS,
7
- AIWF_DIRS,
8
- FILES
9
- } from '../utils/paths.js';
10
-
11
- let BACKUP_DIR = null;
12
-
13
- /**
14
- * Generate backup directory name with timestamp
15
- * @returns {string} Backup directory name
16
- */
17
- function getBackupDirName() {
18
- const now = new Date();
19
- const timestamp = now.toISOString().replace(/[:.]/g, '-').slice(0, -5);
20
- return `backup-${timestamp}`;
21
- }
22
-
23
- /**
24
- * Backup a single file with proper naming convention
25
- * @param {string} filePath - File to backup
26
- * @param {string} backupDir - Backup directory path
27
- * @returns {Promise<string|null>} Backup file path or null
28
- */
29
- async function backupFile(filePath, backupDir) {
30
- try {
31
- const exists = await fs.access(filePath).then(() => true).catch(() => false);
32
- if (exists) {
33
- await fs.mkdir(backupDir, { recursive: true });
34
- const backupPath = `${filePath}.bak`;
35
- await fs.copyFile(filePath, backupPath);
36
-
37
- // Tool-specific backup file naming rules
38
- let bakFileName;
39
- if (filePath.startsWith(TOOL_DIRS.CLAUDE_COMMANDS + '/')) {
40
- // Claude Code command files
41
- const relativePath = filePath.substring(TOOL_DIRS.CLAUDE_COMMANDS.length + 1);
42
- bakFileName = `claude-commands-aiwf-${relativePath.replace(/\//g, '-')}.bak`;
43
- } else if (filePath.startsWith(TOOL_DIRS.GEMINI_PROMPTS + '/')) {
44
- // Gemini CLI prompt files
45
- const relativePath = filePath.substring(TOOL_DIRS.GEMINI_PROMPTS.length + 1);
46
- bakFileName = `gemini-prompts-aiwf-${relativePath.replace(/\//g, '-')}.bak`;
47
- } else if (filePath.startsWith(TOOL_DIRS.CURSOR_RULES + '/')) {
48
- // Cursor rule files
49
- const relativePath = filePath.substring(TOOL_DIRS.CURSOR_RULES.length + 1);
50
- bakFileName = `cursor-rules-${relativePath.replace(/\//g, '-')}.bak`;
51
- } else if (filePath.startsWith(TOOL_DIRS.WINDSURF_RULES + '/')) {
52
- // Windsurf rule files
53
- const relativePath = filePath.substring(TOOL_DIRS.WINDSURF_RULES.length + 1);
54
- bakFileName = `windsurf-rules-${relativePath.replace(/\//g, '-')}.bak`;
55
- } else if (filePath.startsWith(AIWF_DIRS.ROOT + '/')) {
56
- // AIWF core files
57
- const relativePath = filePath.substring(AIWF_DIRS.ROOT.length + 1);
58
- bakFileName = `aiwf-${relativePath.replace(/\//g, '-')}.bak`;
59
- } else {
60
- // Other files
61
- bakFileName = path.basename(filePath) + '.bak';
62
- }
63
-
64
- const destPath = path.join(backupDir, bakFileName);
65
- await fs.rename(backupPath, destPath);
66
- return destPath;
67
- }
68
- } catch (error) {
69
- // Backup failed, but continue
70
- }
71
- return null;
72
- }
73
-
74
- /**
75
- * Backup commands and documentation files
76
- * @param {Object} messages - Localized messages
77
- * @param {string} [commandsDir] - Commands directory
78
- * @returns {Promise<Array<string>>} Array of backed up file paths
79
- */
80
- async function backupCommandsAndDocs(messages, commandsDir = TOOL_DIRS.CLAUDE_COMMANDS) {
81
- if (!BACKUP_DIR) BACKUP_DIR = getBackupDirName();
82
- const spinner = ora(messages.backingUp).start();
83
- const backedUpFiles = [];
84
- await fs.mkdir(BACKUP_DIR, { recursive: true });
85
-
86
- try {
87
- // Files that will be updated and need backup
88
- const filesToBackup = Object.values(FILES.CLAUDE_MD);
89
-
90
- // Backup CLAUDE.md files
91
- for (const file of filesToBackup) {
92
- const backupPath = await backupFile(file, BACKUP_DIR);
93
- if (backupPath) {
94
- backedUpFiles.push(backupPath);
95
- }
96
- }
97
-
98
- // Backup all command files
99
- const commandsExist = await fs.access(commandsDir).then(() => true).catch(() => false);
100
- if (commandsExist) {
101
- try {
102
- const commandFiles = await fs.readdir(commandsDir);
103
- for (const file of commandFiles) {
104
- const filePath = path.join(commandsDir, file);
105
- const stat = await fs.stat(filePath);
106
- if (stat.isFile() && file.endsWith('.md')) {
107
- const backupPath = await backupFile(filePath, BACKUP_DIR);
108
- if (backupPath) {
109
- backedUpFiles.push(backupPath);
110
- }
111
- }
112
- }
113
- } catch (error) {
114
- // Commands directory might be empty or have issues
115
- }
116
- }
117
-
118
- // Backup IDE rule files (Cursor)
119
- const cursorRulesExist = await fs.access(TOOL_DIRS.CURSOR_RULES).then(() => true).catch(() => false);
120
- if (cursorRulesExist) {
121
- try {
122
- const cursorFiles = await fs.readdir(TOOL_DIRS.CURSOR_RULES);
123
- for (const file of cursorFiles) {
124
- if (file.endsWith('.mdc')) {
125
- const filePath = path.join(TOOL_DIRS.CURSOR_RULES, file);
126
- const backupPath = await backupFile(filePath, BACKUP_DIR);
127
- if (backupPath) {
128
- backedUpFiles.push(backupPath);
129
- }
130
- }
131
- }
132
- } catch (error) {
133
- // Cursor rules directory might have issues
134
- }
135
- }
136
-
137
- // Backup IDE rule files (Windsurf)
138
- const windsurfRulesExist = await fs.access(TOOL_DIRS.WINDSURF_RULES).then(() => true).catch(() => false);
139
- if (windsurfRulesExist) {
140
- try {
141
- const windsurfFiles = await fs.readdir(TOOL_DIRS.WINDSURF_RULES);
142
- for (const file of windsurfFiles) {
143
- if (file.endsWith('.md')) {
144
- const filePath = path.join(TOOL_DIRS.WINDSURF_RULES, file);
145
- const backupPath = await backupFile(filePath, BACKUP_DIR);
146
- if (backupPath) {
147
- backedUpFiles.push(backupPath);
148
- }
149
- }
150
- }
151
- } catch (error) {
152
- // Windsurf rules directory might have issues
153
- }
154
- }
155
-
156
- if (backedUpFiles.length > 0) {
157
- spinner.succeed(chalk.green(messages.backupComplete.replace('{count}', backedUpFiles.length)));
158
- } else {
159
- spinner.succeed(chalk.gray(messages.noFilesToBackup));
160
- }
161
- return backedUpFiles;
162
- } catch (error) {
163
- spinner.fail(chalk.red(messages.backupFailed));
164
- throw error;
165
- }
166
- }
167
-
168
- /**
169
- * Restore files from backup
170
- * @param {Object} spinner - Ora spinner instance
171
- * @param {Object} messages - Localized messages
172
- * @returns {Promise<void>}
173
- */
174
- async function restoreFromBackup(spinner, messages) {
175
- if (!BACKUP_DIR) return;
176
-
177
- try {
178
- spinner.text = messages.restoringBackup;
179
-
180
- // Get all backup files
181
- const backupFiles = await fs.readdir(BACKUP_DIR);
182
- let restoredCount = 0;
183
-
184
- for (const bakFile of backupFiles) {
185
- if (bakFile.endsWith('.bak')) {
186
- const backupPath = path.join(BACKUP_DIR, bakFile);
187
- let originalPath;
188
-
189
- // Determine original path from backup filename
190
- if (bakFile.startsWith('claude-commands-aiwf-')) {
191
- const relativePath = bakFile
192
- .replace('claude-commands-aiwf-', '')
193
- .replace('.bak', '')
194
- .replace(/-/g, '/');
195
- originalPath = path.join(TOOL_DIRS.CLAUDE_COMMANDS, relativePath);
196
- } else if (bakFile.startsWith('gemini-prompts-aiwf-')) {
197
- const relativePath = bakFile
198
- .replace('gemini-prompts-aiwf-', '')
199
- .replace('.bak', '')
200
- .replace(/-/g, '/');
201
- originalPath = path.join(TOOL_DIRS.GEMINI_PROMPTS, relativePath);
202
- } else if (bakFile.startsWith('cursor-rules-')) {
203
- const relativePath = bakFile
204
- .replace('cursor-rules-', '')
205
- .replace('.bak', '')
206
- .replace(/-/g, '/');
207
- originalPath = path.join(TOOL_DIRS.CURSOR_RULES, relativePath);
208
- } else if (bakFile.startsWith('windsurf-rules-')) {
209
- const relativePath = bakFile
210
- .replace('windsurf-rules-', '')
211
- .replace('.bak', '')
212
- .replace(/-/g, '/');
213
- originalPath = path.join(TOOL_DIRS.WINDSURF_RULES, relativePath);
214
- } else if (bakFile.startsWith('aiwf-')) {
215
- const relativePath = bakFile
216
- .replace('aiwf-', '')
217
- .replace('.bak', '')
218
- .replace(/-/g, '/');
219
- originalPath = path.join(AIWF_DIRS.ROOT, relativePath);
220
- } else {
221
- // Simple filename.ext.bak format
222
- originalPath = bakFile.replace('.bak', '');
223
- }
224
-
225
- try {
226
- // Ensure directory exists
227
- await fs.mkdir(path.dirname(originalPath), { recursive: true });
228
- // Copy backup to original location
229
- await fs.copyFile(backupPath, originalPath);
230
- restoredCount++;
231
- } catch (error) {
232
- // Individual file restore failed, continue with others
233
- }
234
- }
235
- }
236
-
237
- // Clean up backup directory
238
- await fs.rm(BACKUP_DIR, { recursive: true, force: true });
239
- BACKUP_DIR = null;
240
-
241
- spinner.text = messages.backupRestored.replace('{count}', restoredCount);
242
- } catch (error) {
243
- spinner.fail(chalk.red(messages.restoreFailed));
244
- throw error;
245
- }
246
- }
247
-
248
- /**
249
- * Get current backup directory
250
- * @returns {string|null} Current backup directory path
251
- */
252
- function getCurrentBackupDir() {
253
- return BACKUP_DIR;
254
- }
255
-
256
- /**
257
- * Set backup directory
258
- * @param {string} dir - Backup directory path
259
- */
260
- function setBackupDir(dir) {
261
- BACKUP_DIR = dir;
262
- }
263
-
264
- export {
265
- getBackupDirName,
266
- backupFile,
267
- backupCommandsAndDocs,
268
- restoreFromBackup,
269
- getCurrentBackupDir,
270
- setBackupDir
271
- };
@@ -1,332 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import fs from 'fs/promises';
4
- import path from 'path';
5
- import { createHash } from 'crypto';
6
-
7
- /**
8
- * GitHub API 캐싱 시스템
9
- * - API 호출 결과를 메모리와 디스크에 캐싱
10
- * - TTL 기반 캐시 만료 처리
11
- * - 중복 요청 방지
12
- */
13
- class GitHubAPICache {
14
- constructor(cacheDir = '.aiwf/cache', ttl = 300000) { // 5분 TTL
15
- this.cacheDir = cacheDir;
16
- this.ttl = ttl;
17
- this.memoryCache = new Map();
18
- this.pendingRequests = new Map();
19
- this.stats = {
20
- hits: 0,
21
- misses: 0,
22
- requests: 0
23
- };
24
- }
25
-
26
- async init() {
27
- try {
28
- await fs.mkdir(this.cacheDir, { recursive: true });
29
- } catch (error) {
30
- console.warn('Failed to create cache directory:', error.message);
31
- }
32
- }
33
-
34
- // 캐시 키 생성
35
- generateCacheKey(url, headers = {}) {
36
- const keyData = JSON.stringify({ url, headers });
37
- return createHash('sha256').update(keyData).digest('hex');
38
- }
39
-
40
- // 메모리 캐시에서 가져오기
41
- getFromMemory(key) {
42
- const cached = this.memoryCache.get(key);
43
- if (cached && Date.now() - cached.timestamp < this.ttl) {
44
- this.stats.hits++;
45
- return cached.data;
46
- }
47
- return null;
48
- }
49
-
50
- // 디스크 캐시에서 가져오기
51
- async getFromDisk(key) {
52
- try {
53
- const cachePath = path.join(this.cacheDir, `${key}.json`);
54
- const cacheData = await fs.readFile(cachePath, 'utf8');
55
- const cached = JSON.parse(cacheData);
56
-
57
- if (Date.now() - cached.timestamp < this.ttl) {
58
- // 메모리 캐시에도 저장
59
- this.memoryCache.set(key, cached);
60
- this.stats.hits++;
61
- return cached.data;
62
- } else {
63
- // 만료된 캐시 삭제
64
- await fs.unlink(cachePath).catch(() => {});
65
- }
66
- } catch (error) {
67
- // 캐시 파일이 없거나 읽기 실패
68
- }
69
- return null;
70
- }
71
-
72
- // 캐시에 저장
73
- async saveToCache(key, data) {
74
- const cacheEntry = {
75
- data,
76
- timestamp: Date.now()
77
- };
78
-
79
- // 메모리 캐시에 저장
80
- this.memoryCache.set(key, cacheEntry);
81
-
82
- // 디스크 캐시에 저장
83
- try {
84
- const cachePath = path.join(this.cacheDir, `${key}.json`);
85
- await fs.writeFile(cachePath, JSON.stringify(cacheEntry, null, 2));
86
- } catch (error) {
87
- console.warn('Failed to save to disk cache:', error.message);
88
- }
89
- }
90
-
91
- // 캐시된 데이터 가져오기
92
- async get(url, headers = {}) {
93
- const key = this.generateCacheKey(url, headers);
94
-
95
- // 메모리 캐시 확인
96
- let cachedData = this.getFromMemory(key);
97
- if (cachedData) {
98
- return cachedData;
99
- }
100
-
101
- // 디스크 캐시 확인
102
- cachedData = await this.getFromDisk(key);
103
- if (cachedData) {
104
- return cachedData;
105
- }
106
-
107
- this.stats.misses++;
108
- return null;
109
- }
110
-
111
- // 캐시에 저장
112
- async set(url, data, headers = {}) {
113
- const key = this.generateCacheKey(url, headers);
114
- await this.saveToCache(key, data);
115
- }
116
-
117
- // 중복 요청 방지
118
- async getOrFetch(url, fetchFunction, headers = {}) {
119
- const key = this.generateCacheKey(url, headers);
120
- this.stats.requests++;
121
-
122
- // 캐시에서 확인
123
- const cachedData = await this.get(url, headers);
124
- if (cachedData) {
125
- return cachedData;
126
- }
127
-
128
- // 이미 진행 중인 요청이 있는지 확인
129
- if (this.pendingRequests.has(key)) {
130
- return await this.pendingRequests.get(key);
131
- }
132
-
133
- // 새로운 요청 시작
134
- const fetchPromise = fetchFunction().then(async (data) => {
135
- await this.set(url, data, headers);
136
- this.pendingRequests.delete(key);
137
- return data;
138
- }).catch((error) => {
139
- this.pendingRequests.delete(key);
140
- throw error;
141
- });
142
-
143
- this.pendingRequests.set(key, fetchPromise);
144
- return await fetchPromise;
145
- }
146
-
147
- // 캐시 통계
148
- getStats() {
149
- return {
150
- ...this.stats,
151
- hitRate: this.stats.requests > 0 ? (this.stats.hits / this.stats.requests * 100).toFixed(2) + '%' : '0%',
152
- memorySize: this.memoryCache.size,
153
- cacheDir: this.cacheDir
154
- };
155
- }
156
-
157
- // 캐시 정리
158
- async cleanup() {
159
- const now = Date.now();
160
- const expiredKeys = [];
161
-
162
- // 메모리 캐시 정리
163
- for (const [key, cached] of this.memoryCache.entries()) {
164
- if (now - cached.timestamp >= this.ttl) {
165
- expiredKeys.push(key);
166
- }
167
- }
168
-
169
- expiredKeys.forEach(key => this.memoryCache.delete(key));
170
-
171
- // 디스크 캐시 정리
172
- try {
173
- const files = await fs.readdir(this.cacheDir);
174
- for (const file of files) {
175
- if (file.endsWith('.json')) {
176
- const filePath = path.join(this.cacheDir, file);
177
- try {
178
- const stat = await fs.stat(filePath);
179
- if (now - stat.mtime.getTime() >= this.ttl) {
180
- await fs.unlink(filePath);
181
- }
182
- } catch (error) {
183
- // 파일 삭제 실패는 무시
184
- }
185
- }
186
- }
187
- } catch (error) {
188
- // 디렉토리 읽기 실패는 무시
189
- }
190
-
191
- return {
192
- expiredMemoryKeys: expiredKeys.length,
193
- message: `Cleaned up ${expiredKeys.length} expired cache entries`
194
- };
195
- }
196
-
197
- // 전체 캐시 초기화
198
- async clear() {
199
- this.memoryCache.clear();
200
- this.stats = { hits: 0, misses: 0, requests: 0 };
201
-
202
- try {
203
- const files = await fs.readdir(this.cacheDir);
204
- for (const file of files) {
205
- if (file.endsWith('.json')) {
206
- await fs.unlink(path.join(this.cacheDir, file));
207
- }
208
- }
209
- } catch (error) {
210
- // 디렉토리 읽기 실패는 무시
211
- }
212
- }
213
- }
214
-
215
- // 배치 처리를 위한 GitHub API 클라이언트
216
- class OptimizedGitHubClient {
217
- constructor(baseUrl = 'https://api.github.com', cacheOptions = {}) {
218
- this.baseUrl = baseUrl;
219
- this.cache = new GitHubAPICache(cacheOptions.cacheDir, cacheOptions.ttl);
220
- this.rateLimiter = new RateLimiter(60, 60000); // 60 requests per minute
221
- this.batchQueue = [];
222
- this.batchTimeout = null;
223
- }
224
-
225
- async init() {
226
- await this.cache.init();
227
- }
228
-
229
- // 캐시된 HTTP 요청
230
- async cachedFetch(url, options = {}) {
231
- const headers = { 'User-Agent': 'aiwf', ...options.headers };
232
-
233
- return await this.cache.getOrFetch(url, async () => {
234
- // Rate limiting
235
- await this.rateLimiter.waitForNext();
236
-
237
- const response = await fetch(url, { ...options, headers });
238
- if (!response.ok) {
239
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
240
- }
241
-
242
- return await response.json();
243
- }, headers);
244
- }
245
-
246
- // 배치 요청 처리
247
- async batchRequest(urls, options = {}) {
248
- const results = [];
249
- const batchSize = options.batchSize || 5;
250
-
251
- for (let i = 0; i < urls.length; i += batchSize) {
252
- const batch = urls.slice(i, i + batchSize);
253
- const batchPromises = batch.map(url => this.cachedFetch(url, options));
254
-
255
- try {
256
- const batchResults = await Promise.allSettled(batchPromises);
257
- results.push(...batchResults);
258
- } catch (error) {
259
- console.error('Batch request failed:', error);
260
- results.push(...batch.map(() => ({ status: 'rejected', reason: error })));
261
- }
262
- }
263
-
264
- return results;
265
- }
266
-
267
- // 디렉토리 구조 가져오기 (캐시 적용)
268
- async getDirectoryStructure(repoPath, dirPath = '') {
269
- const url = `${this.baseUrl}/repos/${repoPath}/contents/${dirPath}`;
270
- return await this.cachedFetch(url);
271
- }
272
-
273
- // 파일 내용 가져오기 (캐시 적용)
274
- async getFileContent(repoPath, filePath) {
275
- const url = `${this.baseUrl}/repos/${repoPath}/contents/${filePath}`;
276
- return await this.cachedFetch(url);
277
- }
278
-
279
- // 통계 정보
280
- getStats() {
281
- return {
282
- cache: this.cache.getStats(),
283
- rateLimit: this.rateLimiter.getStats()
284
- };
285
- }
286
-
287
- // 캐시 정리
288
- async cleanup() {
289
- return await this.cache.cleanup();
290
- }
291
- }
292
-
293
- // Rate Limiter 클래스
294
- class RateLimiter {
295
- constructor(maxRequests, timeWindow) {
296
- this.maxRequests = maxRequests;
297
- this.timeWindow = timeWindow;
298
- this.requests = [];
299
- this.stats = { totalRequests: 0, throttledRequests: 0 };
300
- }
301
-
302
- async waitForNext() {
303
- const now = Date.now();
304
-
305
- // 시간 윈도우를 벗어난 요청 제거
306
- this.requests = this.requests.filter(time => now - time < this.timeWindow);
307
-
308
- if (this.requests.length >= this.maxRequests) {
309
- const oldestRequest = Math.min(...this.requests);
310
- const waitTime = this.timeWindow - (now - oldestRequest);
311
-
312
- if (waitTime > 0) {
313
- this.stats.throttledRequests++;
314
- await new Promise(resolve => setTimeout(resolve, waitTime));
315
- }
316
- }
317
-
318
- this.requests.push(now);
319
- this.stats.totalRequests++;
320
- }
321
-
322
- getStats() {
323
- return {
324
- ...this.stats,
325
- currentRequests: this.requests.length,
326
- maxRequests: this.maxRequests,
327
- timeWindow: this.timeWindow
328
- };
329
- }
330
- }
331
-
332
- export { GitHubAPICache, OptimizedGitHubClient, RateLimiter };