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,766 +0,0 @@
1
- # Backend 페르소나 Best Practices
2
-
3
- ## 개요
4
- Backend 페르소나는 서버 사이드 로직, 데이터베이스 설계, API 개발에 중점을 둡니다. 확장성, 성능, 데이터 무결성을 최우선으로 고려합니다.
5
-
6
- ## 핵심 원칙
7
-
8
- ### 1. API 설계 원칙
9
- - RESTful 원칙 준수
10
- - GraphQL 스키마 최적화
11
- - API 버전 관리
12
- - 일관된 응답 형식
13
-
14
- ### 2. 데이터베이스 설계
15
- ```sql
16
- -- 정규화와 성능의 균형
17
- CREATE TABLE users (
18
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
19
- email VARCHAR(255) UNIQUE NOT NULL,
20
- created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
21
- updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
22
- );
23
-
24
- -- 인덱스 전략
25
- CREATE INDEX idx_users_email ON users(email);
26
- CREATE INDEX idx_users_created_at ON users(created_at DESC);
27
-
28
- -- 파티셔닝 (대용량 테이블)
29
- CREATE TABLE orders (
30
- id BIGSERIAL,
31
- user_id UUID REFERENCES users(id),
32
- order_date DATE NOT NULL,
33
- total_amount DECIMAL(10,2),
34
- PRIMARY KEY (id, order_date)
35
- ) PARTITION BY RANGE (order_date);
36
- ```
37
-
38
- ### 3. 마이크로서비스 아키텍처
39
- ```javascript
40
- // 서비스 간 통신 패턴
41
- class OrderService {
42
- constructor(eventBus, userService, inventoryService) {
43
- this.eventBus = eventBus;
44
- this.userService = userService;
45
- this.inventoryService = inventoryService;
46
- }
47
-
48
- async createOrder(orderData) {
49
- // Saga 패턴으로 분산 트랜잭션 처리
50
- const saga = new OrderSaga();
51
-
52
- try {
53
- // 1. 사용자 검증
54
- const user = await this.userService.validateUser(orderData.userId);
55
- saga.addCompensation(() => this.userService.rollback(user));
56
-
57
- // 2. 재고 확인 및 예약
58
- const reservation = await this.inventoryService.reserve(orderData.items);
59
- saga.addCompensation(() => this.inventoryService.release(reservation));
60
-
61
- // 3. 주문 생성
62
- const order = await this.createOrderRecord(orderData);
63
- saga.addCompensation(() => this.deleteOrder(order.id));
64
-
65
- // 4. 이벤트 발행
66
- await this.eventBus.publish('order.created', {
67
- orderId: order.id,
68
- userId: user.id,
69
- items: orderData.items
70
- });
71
-
72
- return order;
73
- } catch (error) {
74
- await saga.compensate();
75
- throw error;
76
- }
77
- }
78
- }
79
- ```
80
-
81
- ## API 개발 Best Practices
82
-
83
- ### RESTful API 설계
84
- ```javascript
85
- // Express.js 라우터
86
- class UserController {
87
- // GET /api/v1/users?page=1&limit=20&sort=created_at:desc
88
- async getUsers(req, res) {
89
- const { page = 1, limit = 20, sort, filter } = req.query;
90
-
91
- try {
92
- const users = await this.userService.findAll({
93
- pagination: { page, limit },
94
- sorting: this.parseSortParam(sort),
95
- filters: this.parseFilterParam(filter)
96
- });
97
-
98
- res.json({
99
- success: true,
100
- data: users,
101
- meta: {
102
- page: parseInt(page),
103
- limit: parseInt(limit),
104
- total: users.total,
105
- totalPages: Math.ceil(users.total / limit)
106
- }
107
- });
108
- } catch (error) {
109
- this.handleError(error, res);
110
- }
111
- }
112
-
113
- // POST /api/v1/users
114
- async createUser(req, res) {
115
- try {
116
- // 입력 검증
117
- const validatedData = await this.validator.validate(req.body, UserSchema);
118
-
119
- // 비즈니스 로직
120
- const user = await this.userService.create(validatedData);
121
-
122
- // 201 Created with Location header
123
- res.status(201)
124
- .location(`/api/v1/users/${user.id}`)
125
- .json({
126
- success: true,
127
- data: user
128
- });
129
- } catch (error) {
130
- this.handleError(error, res);
131
- }
132
- }
133
-
134
- // Error handling
135
- handleError(error, res) {
136
- if (error instanceof ValidationError) {
137
- return res.status(400).json({
138
- success: false,
139
- error: {
140
- code: 'VALIDATION_ERROR',
141
- message: error.message,
142
- details: error.details
143
- }
144
- });
145
- }
146
-
147
- if (error instanceof NotFoundError) {
148
- return res.status(404).json({
149
- success: false,
150
- error: {
151
- code: 'NOT_FOUND',
152
- message: error.message
153
- }
154
- });
155
- }
156
-
157
- // 500 Internal Server Error
158
- console.error('Unexpected error:', error);
159
- res.status(500).json({
160
- success: false,
161
- error: {
162
- code: 'INTERNAL_ERROR',
163
- message: 'An unexpected error occurred'
164
- }
165
- });
166
- }
167
- }
168
- ```
169
-
170
- ### GraphQL 스키마 설계
171
- ```graphql
172
- # Schema Definition
173
- type User {
174
- id: ID!
175
- email: String!
176
- profile: Profile!
177
- orders(
178
- first: Int = 10
179
- after: String
180
- filter: OrderFilter
181
- ): OrderConnection!
182
- createdAt: DateTime!
183
- updatedAt: DateTime!
184
- }
185
-
186
- type Profile {
187
- firstName: String!
188
- lastName: String!
189
- avatar: String
190
- preferences: UserPreferences!
191
- }
192
-
193
- # Pagination using Relay specification
194
- type OrderConnection {
195
- edges: [OrderEdge!]!
196
- pageInfo: PageInfo!
197
- totalCount: Int!
198
- }
199
-
200
- type OrderEdge {
201
- node: Order!
202
- cursor: String!
203
- }
204
-
205
- # Input types
206
- input CreateUserInput {
207
- email: String!
208
- password: String!
209
- profile: ProfileInput!
210
- }
211
-
212
- # Queries
213
- type Query {
214
- user(id: ID!): User
215
- users(
216
- first: Int
217
- after: String
218
- filter: UserFilter
219
- orderBy: UserOrderBy
220
- ): UserConnection!
221
- me: User @auth
222
- }
223
-
224
- # Mutations
225
- type Mutation {
226
- createUser(input: CreateUserInput!): CreateUserPayload!
227
- updateUser(id: ID!, input: UpdateUserInput!): UpdateUserPayload!
228
- deleteUser(id: ID!): DeleteUserPayload!
229
- }
230
-
231
- # Subscriptions
232
- type Subscription {
233
- userUpdated(userId: ID!): User!
234
- orderCreated(userId: ID!): Order!
235
- }
236
- ```
237
-
238
- ## 데이터베이스 최적화
239
-
240
- ### 쿼리 최적화
241
- ```javascript
242
- // Query Builder Pattern
243
- class UserRepository {
244
- constructor(db) {
245
- this.db = db;
246
- }
247
-
248
- // N+1 문제 방지
249
- async findWithOrders(userId) {
250
- const query = `
251
- SELECT
252
- u.id, u.email, u.created_at,
253
- o.id as order_id, o.total_amount, o.order_date,
254
- oi.product_id, oi.quantity, oi.price
255
- FROM users u
256
- LEFT JOIN orders o ON u.id = o.user_id
257
- LEFT JOIN order_items oi ON o.id = oi.order_id
258
- WHERE u.id = $1
259
- ORDER BY o.order_date DESC
260
- `;
261
-
262
- const result = await this.db.query(query, [userId]);
263
- return this.mapResultToUser(result.rows);
264
- }
265
-
266
- // Batch loading
267
- async findByIds(userIds) {
268
- if (userIds.length === 0) return [];
269
-
270
- const query = `
271
- SELECT * FROM users
272
- WHERE id = ANY($1::uuid[])
273
- `;
274
-
275
- const result = await this.db.query(query, [userIds]);
276
-
277
- // 순서 보장
278
- const userMap = new Map(
279
- result.rows.map(row => [row.id, row])
280
- );
281
-
282
- return userIds.map(id => userMap.get(id)).filter(Boolean);
283
- }
284
-
285
- // 동적 쿼리 빌더
286
- async search(criteria) {
287
- let query = 'SELECT * FROM users WHERE 1=1';
288
- const params = [];
289
- let paramIndex = 1;
290
-
291
- if (criteria.email) {
292
- query += ` AND email ILIKE $${paramIndex}`;
293
- params.push(`%${criteria.email}%`);
294
- paramIndex++;
295
- }
296
-
297
- if (criteria.createdAfter) {
298
- query += ` AND created_at >= $${paramIndex}`;
299
- params.push(criteria.createdAfter);
300
- paramIndex++;
301
- }
302
-
303
- if (criteria.sortBy) {
304
- const validColumns = ['email', 'created_at'];
305
- if (validColumns.includes(criteria.sortBy)) {
306
- query += ` ORDER BY ${criteria.sortBy} ${
307
- criteria.sortOrder === 'desc' ? 'DESC' : 'ASC'
308
- }`;
309
- }
310
- }
311
-
312
- query += ` LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`;
313
- params.push(criteria.limit || 20, criteria.offset || 0);
314
-
315
- return this.db.query(query, params);
316
- }
317
- }
318
- ```
319
-
320
- ### 캐싱 전략
321
- ```javascript
322
- // Redis 캐싱 레이어
323
- class CacheService {
324
- constructor(redis, ttl = 3600) {
325
- this.redis = redis;
326
- this.ttl = ttl;
327
- }
328
-
329
- // Cache-Aside Pattern
330
- async get(key, fetchFn) {
331
- // 1. 캐시 확인
332
- const cached = await this.redis.get(key);
333
- if (cached) {
334
- return JSON.parse(cached);
335
- }
336
-
337
- // 2. 캐시 미스 시 데이터 조회
338
- const data = await fetchFn();
339
-
340
- // 3. 캐시 저장
341
- await this.redis.setex(
342
- key,
343
- this.ttl,
344
- JSON.stringify(data)
345
- );
346
-
347
- return data;
348
- }
349
-
350
- // Write-Through Pattern
351
- async set(key, data, ttl = this.ttl) {
352
- await this.redis.setex(
353
- key,
354
- ttl,
355
- JSON.stringify(data)
356
- );
357
- return data;
358
- }
359
-
360
- // Cache Invalidation
361
- async invalidate(pattern) {
362
- const keys = await this.redis.keys(pattern);
363
- if (keys.length > 0) {
364
- await this.redis.del(...keys);
365
- }
366
- }
367
-
368
- // Distributed Lock (분산 환경)
369
- async acquireLock(lockKey, ttl = 10) {
370
- const identifier = uuidv4();
371
- const result = await this.redis.set(
372
- `lock:${lockKey}`,
373
- identifier,
374
- 'NX',
375
- 'EX',
376
- ttl
377
- );
378
-
379
- return result === 'OK' ? identifier : null;
380
- }
381
-
382
- async releaseLock(lockKey, identifier) {
383
- const script = `
384
- if redis.call("get", KEYS[1]) == ARGV[1] then
385
- return redis.call("del", KEYS[1])
386
- else
387
- return 0
388
- end
389
- `;
390
-
391
- return this.redis.eval(
392
- script,
393
- 1,
394
- `lock:${lockKey}`,
395
- identifier
396
- );
397
- }
398
- }
399
- ```
400
-
401
- ## 메시지 큐와 이벤트 처리
402
-
403
- ### RabbitMQ 패턴
404
- ```javascript
405
- // Publisher/Subscriber Pattern
406
- class EventPublisher {
407
- constructor(channel) {
408
- this.channel = channel;
409
- }
410
-
411
- async publish(exchange, routingKey, message) {
412
- const messageBuffer = Buffer.from(JSON.stringify({
413
- ...message,
414
- timestamp: new Date().toISOString(),
415
- messageId: uuidv4()
416
- }));
417
-
418
- await this.channel.publish(
419
- exchange,
420
- routingKey,
421
- messageBuffer,
422
- {
423
- persistent: true,
424
- contentType: 'application/json',
425
- headers: {
426
- 'x-retry-count': 0
427
- }
428
- }
429
- );
430
- }
431
- }
432
-
433
- // Consumer with Error Handling
434
- class EventConsumer {
435
- constructor(channel, options = {}) {
436
- this.channel = channel;
437
- this.maxRetries = options.maxRetries || 3;
438
- }
439
-
440
- async consume(queue, handler) {
441
- await this.channel.consume(queue, async (msg) => {
442
- if (!msg) return;
443
-
444
- try {
445
- const content = JSON.parse(msg.content.toString());
446
- await handler(content);
447
-
448
- // Acknowledge message
449
- this.channel.ack(msg);
450
- } catch (error) {
451
- console.error('Error processing message:', error);
452
-
453
- // Retry logic
454
- const retryCount = (msg.properties.headers['x-retry-count'] || 0) + 1;
455
-
456
- if (retryCount <= this.maxRetries) {
457
- // Requeue with delay
458
- setTimeout(() => {
459
- this.channel.sendToQueue(
460
- queue,
461
- msg.content,
462
- {
463
- ...msg.properties,
464
- headers: {
465
- ...msg.properties.headers,
466
- 'x-retry-count': retryCount
467
- }
468
- }
469
- );
470
- }, Math.pow(2, retryCount) * 1000); // Exponential backoff
471
- } else {
472
- // Send to DLQ
473
- await this.sendToDeadLetter(msg, error);
474
- }
475
-
476
- // Reject without requeue
477
- this.channel.nack(msg, false, false);
478
- }
479
- });
480
- }
481
-
482
- async sendToDeadLetter(msg, error) {
483
- const dlq = `${msg.fields.routingKey}.dlq`;
484
- await this.channel.sendToQueue(
485
- dlq,
486
- msg.content,
487
- {
488
- headers: {
489
- 'x-death-reason': error.message,
490
- 'x-original-queue': msg.fields.routingKey
491
- }
492
- }
493
- );
494
- }
495
- }
496
- ```
497
-
498
- ## 보안 구현
499
-
500
- ### 인증/인가 미들웨어
501
- ```javascript
502
- // JWT Authentication
503
- class AuthMiddleware {
504
- constructor(jwtService, userService) {
505
- this.jwtService = jwtService;
506
- this.userService = userService;
507
- }
508
-
509
- authenticate() {
510
- return async (req, res, next) => {
511
- try {
512
- const token = this.extractToken(req);
513
- if (!token) {
514
- return res.status(401).json({
515
- error: 'No authentication token provided'
516
- });
517
- }
518
-
519
- const payload = await this.jwtService.verify(token);
520
-
521
- // Token blacklist check
522
- if (await this.isTokenBlacklisted(payload.jti)) {
523
- return res.status(401).json({
524
- error: 'Token has been revoked'
525
- });
526
- }
527
-
528
- req.user = await this.userService.findById(payload.sub);
529
- next();
530
- } catch (error) {
531
- if (error.name === 'TokenExpiredError') {
532
- return res.status(401).json({
533
- error: 'Token has expired'
534
- });
535
- }
536
-
537
- return res.status(401).json({
538
- error: 'Invalid authentication token'
539
- });
540
- }
541
- };
542
- }
543
-
544
- authorize(...roles) {
545
- return (req, res, next) => {
546
- if (!req.user) {
547
- return res.status(401).json({
548
- error: 'Authentication required'
549
- });
550
- }
551
-
552
- if (roles.length > 0 && !roles.includes(req.user.role)) {
553
- return res.status(403).json({
554
- error: 'Insufficient permissions'
555
- });
556
- }
557
-
558
- next();
559
- };
560
- }
561
-
562
- extractToken(req) {
563
- const authHeader = req.headers.authorization;
564
- if (authHeader && authHeader.startsWith('Bearer ')) {
565
- return authHeader.substring(7);
566
- }
567
-
568
- return req.cookies?.accessToken;
569
- }
570
- }
571
- ```
572
-
573
- ## 테스팅 전략
574
-
575
- ### 단위 테스트
576
- ```javascript
577
- describe('UserService', () => {
578
- let userService;
579
- let userRepository;
580
- let emailService;
581
-
582
- beforeEach(() => {
583
- userRepository = {
584
- findByEmail: jest.fn(),
585
- create: jest.fn(),
586
- update: jest.fn()
587
- };
588
-
589
- emailService = {
590
- sendWelcomeEmail: jest.fn()
591
- };
592
-
593
- userService = new UserService(userRepository, emailService);
594
- });
595
-
596
- describe('createUser', () => {
597
- it('should create user with hashed password', async () => {
598
- const userData = {
599
- email: 'test@example.com',
600
- password: 'password123'
601
- };
602
-
603
- userRepository.findByEmail.mockResolvedValue(null);
604
- userRepository.create.mockResolvedValue({
605
- id: 'user-123',
606
- ...userData,
607
- password: 'hashed-password'
608
- });
609
-
610
- const user = await userService.createUser(userData);
611
-
612
- expect(userRepository.findByEmail).toHaveBeenCalledWith(userData.email);
613
- expect(userRepository.create).toHaveBeenCalledWith({
614
- email: userData.email,
615
- password: expect.stringMatching(/^\$2[aby]\$/)
616
- });
617
- expect(emailService.sendWelcomeEmail).toHaveBeenCalledWith(userData.email);
618
- expect(user).not.toHaveProperty('password');
619
- });
620
-
621
- it('should throw error if email already exists', async () => {
622
- userRepository.findByEmail.mockResolvedValue({ id: 'existing-user' });
623
-
624
- await expect(
625
- userService.createUser({ email: 'test@example.com', password: 'pass' })
626
- ).rejects.toThrow('Email already registered');
627
- });
628
- });
629
- });
630
- ```
631
-
632
- ### 통합 테스트
633
- ```javascript
634
- describe('API Integration Tests', () => {
635
- let app;
636
- let db;
637
-
638
- beforeAll(async () => {
639
- // Test database setup
640
- db = await createTestDatabase();
641
- app = createApp(db);
642
- });
643
-
644
- afterAll(async () => {
645
- await db.close();
646
- });
647
-
648
- describe('POST /api/users', () => {
649
- it('should create user and return 201', async () => {
650
- const response = await request(app)
651
- .post('/api/users')
652
- .send({
653
- email: 'newuser@example.com',
654
- password: 'SecurePass123!',
655
- profile: {
656
- firstName: 'John',
657
- lastName: 'Doe'
658
- }
659
- });
660
-
661
- expect(response.status).toBe(201);
662
- expect(response.headers.location).toMatch(/\/api\/users\/[\w-]+/);
663
- expect(response.body).toMatchObject({
664
- success: true,
665
- data: {
666
- email: 'newuser@example.com',
667
- profile: {
668
- firstName: 'John',
669
- lastName: 'Doe'
670
- }
671
- }
672
- });
673
-
674
- // Verify database
675
- const user = await db.query(
676
- 'SELECT * FROM users WHERE email = $1',
677
- ['newuser@example.com']
678
- );
679
- expect(user.rows).toHaveLength(1);
680
- });
681
- });
682
- });
683
- ```
684
-
685
- ## 모니터링과 로깅
686
-
687
- ### 구조화된 로깅
688
- ```javascript
689
- class Logger {
690
- constructor(service) {
691
- this.service = service;
692
- this.winston = winston.createLogger({
693
- format: winston.format.combine(
694
- winston.format.timestamp(),
695
- winston.format.errors({ stack: true }),
696
- winston.format.json()
697
- ),
698
- defaultMeta: { service },
699
- transports: [
700
- new winston.transports.Console({
701
- format: winston.format.simple()
702
- }),
703
- new winston.transports.File({
704
- filename: 'error.log',
705
- level: 'error'
706
- }),
707
- new winston.transports.File({
708
- filename: 'combined.log'
709
- })
710
- ]
711
- });
712
- }
713
-
714
- log(level, message, meta = {}) {
715
- this.winston.log({
716
- level,
717
- message,
718
- ...meta,
719
- timestamp: new Date().toISOString()
720
- });
721
- }
722
-
723
- // Request logging middleware
724
- requestLogger() {
725
- return (req, res, next) => {
726
- const start = Date.now();
727
-
728
- res.on('finish', () => {
729
- const duration = Date.now() - start;
730
-
731
- this.log('info', 'HTTP Request', {
732
- method: req.method,
733
- path: req.path,
734
- statusCode: res.statusCode,
735
- duration,
736
- ip: req.ip,
737
- userAgent: req.get('user-agent'),
738
- userId: req.user?.id
739
- });
740
- });
741
-
742
- next();
743
- };
744
- }
745
- }
746
- ```
747
-
748
- ## 배포 전 체크리스트
749
-
750
- ### 성능
751
- - [ ] 데이터베이스 인덱스 최적화
752
- - [ ] N+1 쿼리 제거
753
- - [ ] 캐싱 전략 구현
754
- - [ ] 비동기 처리 적용
755
-
756
- ### 보안
757
- - [ ] 환경 변수로 민감 정보 관리
758
- - [ ] SQL Injection 방지
759
- - [ ] Rate Limiting 설정
760
- - [ ] CORS 정책 구성
761
-
762
- ### 안정성
763
- - [ ] 에러 처리 및 복구 메커니즘
764
- - [ ] 서킷 브레이커 패턴
765
- - [ ] 헬스체크 엔드포인트
766
- - [ ] 우아한 종료(Graceful Shutdown)