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
@@ -0,0 +1,143 @@
1
+ package com.example.app.views;
2
+
3
+ import java.time.LocalDate;
4
+
5
+ import org.junit.jupiter.api.DisplayName;
6
+ import org.junit.jupiter.api.Nested;
7
+ import org.junit.jupiter.api.Test;
8
+ import org.springframework.boot.test.context.SpringBootTest;
9
+ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
10
+ import org.springframework.boot.test.web.server.LocalServerPort;
11
+ import org.vaadin.addons.dramafinder.AbstractBasePlaywrightIT;
12
+ import org.vaadin.addons.dramafinder.element.button.ButtonElement;
13
+ import org.vaadin.addons.dramafinder.element.checkbox.CheckboxElement;
14
+ import org.vaadin.addons.dramafinder.element.combobox.ComboBoxElement;
15
+ import org.vaadin.addons.dramafinder.element.datepicker.DatePickerElement;
16
+ import org.vaadin.addons.dramafinder.element.dialog.DialogElement;
17
+ import org.vaadin.addons.dramafinder.element.grid.GridElement;
18
+ import org.vaadin.addons.dramafinder.element.notification.NotificationElement;
19
+ import org.vaadin.addons.dramafinder.element.textfield.TextFieldElement;
20
+
21
+ import static org.assertj.core.api.Assertions.assertThat;
22
+
23
+ @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
24
+ class ExampleViewIT extends AbstractBasePlaywrightIT {
25
+
26
+ @LocalServerPort
27
+ private int port;
28
+
29
+ @Override
30
+ public String getUrl() {
31
+ return String.format("http://localhost:%d/", port);
32
+ }
33
+
34
+ @Override
35
+ public String getView() {
36
+ return "example";
37
+ }
38
+
39
+ @Nested
40
+ @DisplayName("Grid Display")
41
+ class GridDisplay {
42
+
43
+ @Test
44
+ @DisplayName("Grid shows data on page load")
45
+ void grid_displays_data() {
46
+ GridElement grid = GridElement.get(page);
47
+
48
+ // Use total count — viewport limits rendered rows
49
+ assertThat(grid.getTotalRowCount()).isGreaterThan(0);
50
+ }
51
+
52
+ @Test
53
+ @DisplayName("Grid headers match expected columns")
54
+ void grid_has_expected_headers() {
55
+ GridElement grid = GridElement.get(page);
56
+
57
+ assertThat(grid.getHeaderCellContents()).contains("Name", "Email", "Status");
58
+ }
59
+
60
+ }
61
+
62
+ @Nested
63
+ @DisplayName("Row Selection and Form")
64
+ class RowSelectionAndForm {
65
+
66
+ @Test
67
+ @DisplayName("Selecting a row populates the form")
68
+ void select_row_populates_form() {
69
+ GridElement grid = GridElement.get(page);
70
+ var cell = grid.findCell(0, "Name");
71
+ String expectedName = cell.get().getCellContentLocator().innerText();
72
+
73
+ grid.select(0);
74
+
75
+ TextFieldElement nameField = TextFieldElement.getByLabel(page, "Name");
76
+ nameField.assertValue(expectedName);
77
+ }
78
+
79
+ @Test
80
+ @DisplayName("Saving updates the grid cell")
81
+ void save_updates_grid() {
82
+ GridElement grid = GridElement.get(page);
83
+ grid.select(0);
84
+
85
+ TextFieldElement nameField = TextFieldElement.getByLabel(page, "Name");
86
+ nameField.setValue("Updated Name");
87
+
88
+ ButtonElement saveButton = ButtonElement.getByText(page, "Save");
89
+ saveButton.click();
90
+
91
+ var updatedCell = grid.findCell(0, "Name");
92
+ assertThat(updatedCell.get().getCellContentLocator()).hasText("Updated Name");
93
+ }
94
+
95
+ }
96
+
97
+ @Nested
98
+ @DisplayName("Form Validation")
99
+ class FormValidation {
100
+
101
+ @Test
102
+ @DisplayName("Required field shows error when empty")
103
+ void required_field_shows_error() {
104
+ GridElement grid = GridElement.get(page);
105
+ grid.select(0);
106
+
107
+ TextFieldElement nameField = TextFieldElement.getByLabel(page, "Name");
108
+ nameField.clear();
109
+
110
+ ButtonElement saveButton = ButtonElement.getByText(page, "Save");
111
+ saveButton.click();
112
+
113
+ nameField.assertInvalid();
114
+ nameField.assertErrorMessage("Field is required");
115
+ }
116
+
117
+ }
118
+
119
+ @Nested
120
+ @DisplayName("Dialog Interactions")
121
+ class DialogInteractions {
122
+
123
+ @Test
124
+ @DisplayName("Delete button opens confirmation dialog")
125
+ void delete_opens_confirm_dialog() {
126
+ GridElement grid = GridElement.get(page);
127
+ grid.select(0);
128
+
129
+ ButtonElement deleteButton = ButtonElement.getByText(page, "Delete");
130
+ deleteButton.click();
131
+
132
+ DialogElement dialog = DialogElement.getByHeaderText(page, "Confirm Delete");
133
+ dialog.assertOpen();
134
+
135
+ ButtonElement cancelButton = ButtonElement.getByText(dialog.getLocator(), "Cancel");
136
+ cancelButton.click();
137
+
138
+ dialog.assertClosed();
139
+ }
140
+
141
+ }
142
+
143
+ }
@@ -0,0 +1,144 @@
1
+ package com.example.app.e2e;
2
+
3
+ import java.util.List;
4
+
5
+ import org.junit.jupiter.api.AfterEach;
6
+ import org.junit.jupiter.api.DisplayName;
7
+ import org.junit.jupiter.api.Test;
8
+ import org.springframework.boot.test.context.SpringBootTest;
9
+ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
10
+ import org.springframework.boot.test.web.server.LocalServerPort;
11
+ import org.vaadin.addons.dramafinder.AbstractBasePlaywrightIT;
12
+ import org.vaadin.addons.dramafinder.element.button.ButtonElement;
13
+ import org.vaadin.addons.dramafinder.element.combobox.ComboBoxElement;
14
+ import org.vaadin.addons.dramafinder.element.dialog.DialogElement;
15
+ import org.vaadin.addons.dramafinder.element.grid.GridElement;
16
+ import org.vaadin.addons.dramafinder.element.notification.NotificationElement;
17
+ import org.vaadin.addons.dramafinder.element.textfield.EmailFieldElement;
18
+ import org.vaadin.addons.dramafinder.element.textfield.TextFieldElement;
19
+
20
+ import static org.assertj.core.api.Assertions.assertThat;
21
+
22
+ /**
23
+ * Executes test case TC-001 (docs/test_cases/TC-001-customer-onboarding.md):
24
+ * a new customer is created (UC-001) and places a first order (UC-004).
25
+ */
26
+ @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
27
+ class TC001CustomerOnboardingIT extends AbstractBasePlaywrightIT {
28
+
29
+ private static final String CUSTOMER_NAME = "Jane Doe";
30
+
31
+ @LocalServerPort
32
+ private int port;
33
+
34
+ @Override
35
+ public String getUrl() {
36
+ return String.format("http://localhost:%d/", port);
37
+ }
38
+
39
+ @Override
40
+ public String getView() {
41
+ // Route of the first Flow step; later steps navigate onward
42
+ return "customers";
43
+ }
44
+
45
+ @Test
46
+ @DisplayName("TC-001: New customer can be onboarded and place a first order")
47
+ void customer_onboarding() {
48
+ // Step 1: Create customer (UC-001)
49
+ createCustomer(CUSTOMER_NAME, "jane.doe@example.com");
50
+
51
+ // Step 2: Customer appears in the customer list
52
+ assertCustomerListed(CUSTOMER_NAME);
53
+
54
+ // Step 3: Place first order for the new customer (UC-004)
55
+ placeOrder(CUSTOMER_NAME, "Starter Kit");
56
+
57
+ // Step 4: Order confirmation is shown
58
+ NotificationElement confirmation = new NotificationElement(page);
59
+ confirmation.assertOpen();
60
+
61
+ // Validation 1: Customer status is Active after the first order
62
+ assertCustomerStatus(CUSTOMER_NAME, "Active");
63
+ }
64
+
65
+ private void createCustomer(String name, String email) {
66
+ ButtonElement.getByText(page, "Add Customer").click();
67
+
68
+ DialogElement dialog = DialogElement.getByHeaderText(page, "New Customer");
69
+ TextFieldElement.getByLabel(dialog.getLocator(), "Name").setValue(name);
70
+ EmailFieldElement.getByLabel(dialog.getLocator(), "Email").setValue(email);
71
+ ButtonElement.getByText(dialog.getLocator(), "Save").click();
72
+
73
+ dialog.assertClosed();
74
+ }
75
+
76
+ private void assertCustomerListed(String name) {
77
+ GridElement grid = GridElement.get(page);
78
+ assertThat(grid.findRowIndexesWithColumnText(0, name)).isNotEmpty();
79
+ }
80
+
81
+ private void placeOrder(String customer, String product) {
82
+ // Prefer navigating through the UI (side navigation, buttons); fall
83
+ // back to direct navigation when the UI offers no path
84
+ page.navigate(getUrl() + "orders");
85
+ GridElement grid = GridElement.get(page);
86
+ grid.assertVisible();
87
+
88
+ ButtonElement.getByText(page, "New Order").click();
89
+
90
+ DialogElement dialog = DialogElement.getByHeaderText(page, "New Order");
91
+ ComboBoxElement.getByLabel(dialog.getLocator(), "Customer").selectItem(customer);
92
+ ComboBoxElement.getByLabel(dialog.getLocator(), "Product").selectItem(product);
93
+ ButtonElement.getByText(dialog.getLocator(), "Place Order").click();
94
+
95
+ dialog.assertClosed();
96
+ }
97
+
98
+ private void assertCustomerStatus(String name, String expectedStatus) {
99
+ page.navigate(getUrl() + "customers");
100
+ GridElement grid = GridElement.get(page);
101
+
102
+ List<Integer> rows = grid.findRowIndexesWithColumnText(0, name);
103
+ assertThat(rows).isNotEmpty();
104
+ var statusCell = grid.findCell(rows.get(0), "Status");
105
+ assertThat(statusCell.get().getCellContentLocator()).hasText(expectedStatus);
106
+ }
107
+
108
+ @AfterEach
109
+ void cleanUpTestCaseData() {
110
+ // Idempotent: the test may have failed midway, so remove only
111
+ // what actually exists — and only data this test case created
112
+ deleteOrderIfPresent(CUSTOMER_NAME);
113
+ deleteCustomerIfPresent(CUSTOMER_NAME);
114
+ }
115
+
116
+ private void deleteOrderIfPresent(String customer) {
117
+ page.navigate(getUrl() + "orders");
118
+ GridElement grid = GridElement.get(page);
119
+
120
+ List<Integer> rows = grid.findRowIndexesWithColumnText(0, customer);
121
+ if (!rows.isEmpty()) {
122
+ grid.select(rows.get(0));
123
+ ButtonElement.getByText(page, "Delete").click();
124
+ DialogElement confirm = DialogElement.getByHeaderText(page, "Confirm Delete");
125
+ ButtonElement.getByText(confirm.getLocator(), "Confirm").click();
126
+ confirm.assertClosed();
127
+ }
128
+ }
129
+
130
+ private void deleteCustomerIfPresent(String name) {
131
+ page.navigate(getUrl() + "customers");
132
+ GridElement grid = GridElement.get(page);
133
+
134
+ List<Integer> rows = grid.findRowIndexesWithColumnText(0, name);
135
+ if (!rows.isEmpty()) {
136
+ grid.select(rows.get(0));
137
+ ButtonElement.getByText(page, "Delete").click();
138
+ DialogElement confirm = DialogElement.getByHeaderText(page, "Confirm Delete");
139
+ ButtonElement.getByText(confirm.getLocator(), "Confirm").click();
140
+ confirm.assertClosed();
141
+ }
142
+ }
143
+
144
+ }
@@ -0,0 +1,190 @@
1
+ <!--
2
+ Copyright 2025-2026 Simon Martinelli and the AI Unified Process contributors.
3
+ Part of the AI Unified Process — https://unifiedprocess.ai
4
+ Licensed under the Apache License, Version 2.0. See LICENSE and NOTICE.
5
+ -->
6
+
7
+ # Drama Finder API Reference
8
+
9
+ Vendored from the Drama Finder `1.1.0` Javadoc (`org.vaadin.addons:dramafinder:1.1.0`). This is the
10
+ authoritative API reference for writing Playwright tests — use it instead of fetching docs at runtime.
11
+ If you need a class not listed here, or have upgraded the dependency, look it up via the JavaDocs MCP
12
+ server (see SKILL.md) and update this file.
13
+
14
+ All element wrappers live under `org.vaadin.addons.dramafinder.element` (shared mixins under
15
+ `...element.shared`). The test base class is `org.vaadin.addons.dramafinder.AbstractBasePlaywrightIT`.
16
+
17
+ ## Locator levels
18
+
19
+ Every wrapper exposes two locator levels (from `VaadinElement` / `HasValueElement`):
20
+
21
+ - `getLocator()` — the component root. Use for `theme`, CSS class, `opened`, `invalid` state.
22
+ - `getInputLocator()` — the internal native input. Use for `value`, `maxlength`, `pattern`, focus.
23
+
24
+ CSS selectors pierce shadow DOM automatically; XPath does NOT.
25
+
26
+ ## Available element classes
27
+
28
+ `AccordionElement`, `AccordionPanelElement`, `AvatarElement`, `BigDecimalFieldElement`,
29
+ `ButtonElement`, `CardElement`, `CheckboxElement`, `ComboBoxElement`, `ContextMenuElement`,
30
+ `DatePickerElement`, `DateTimePickerElement`, `DetailsElement`, `DialogElement`, `EmailFieldElement`,
31
+ `GridElement` (+ `RowElement`, `CellElement`, `HeaderCellElement`), `IntegerFieldElement`,
32
+ `ListBoxElement`, `MenuBarElement`, `MenuElement`, `MenuItemElement`, `MessageInputElement`,
33
+ `MessageListElement`, `MultiSelectComboBoxElement`, `NotificationElement`, `NumberFieldElement`,
34
+ `PasswordFieldElement`, `PopoverElement`, `ProgressBarElement`, `RadioButtonGroupElement`,
35
+ `SelectElement`, `SideNavigationElement`, `SideNavigationItemElement`, `SplitLayoutElement`,
36
+ `TabElement`, `TabSheetElement`, `TextAreaElement`, `TextFieldElement`, `TimePickerElement`,
37
+ `TreeGridElement` (+ `TreeRowElement`), `UploadElement`, `VirtualListElement`.
38
+
39
+ ## Shared methods (available on every element)
40
+
41
+ ### `VaadinElement` (base class)
42
+
43
+ - `void click()` — click the component root
44
+ - `String getText()` — text content of the root (or `null`)
45
+ - `com.microsoft.playwright.Locator getLocator()`
46
+ - `boolean isVisible()` / `void assertVisible()`
47
+ - `boolean isHidden()` / `void assertHidden()`
48
+ - `Object getProperty(String name)` / `void setProperty(String name, Object value)` — raw DOM property access
49
+
50
+ ### Shared mixin interfaces (inherited where the component supports them)
51
+
52
+ - **`HasValueElement`**: `void setValue(String)`, `String getValue()`, `void clear()`,
53
+ `void assertValue(String)`, `Locator getInputLocator()`
54
+ - **`HasValidationPropertiesElement`**: `void assertValid()`, `void assertInvalid()`,
55
+ `void assertErrorMessage(String)`, `Locator getErrorMessageLocator()`
56
+ - **`HasEnabledElement`**: `boolean isEnabled()`, `void assertEnabled()`, `void assertDisabled()`
57
+ - **`HasLabelElement`**: `String getLabel()`, `void assertLabel(String)`
58
+ - **`HasPlaceholderElement`**: `String getPlaceholder()`, `void setPlaceholder(String)`, `void assertPlaceholder(String)`
59
+ - **`HasHelperElement`**: `String getHelperText()`, `void assertHelperHasText(String)`
60
+ - **`HasClearButtonElement`**: `void clickClearButton()`, `boolean isClearButtonVisible()`,
61
+ `void assertClearButtonVisible()` / `assertClearButtonNotVisible()`
62
+ - **`FocusableElement`**: `void focus()`, `void blur()`, `void assertIsFocused()`, `void assertIsNotFocused()`, `int getTabIndex()`
63
+ - **`HasAriaLabelElement`**: `String getAriaLabel()`, `void assertAriaLabel(String)`
64
+ - **`HasThemeElement`**: `String getTheme()`, `void assertTheme(String)`
65
+ - **`HasStyleElement`**: `void assertCssClass(String...)`, `String getCssClass()`
66
+ - **`HasTooltipElement`**: `String getTooltipText()`, `void assertTooltipHasText(String)`
67
+ - **`HasPrefixElement`** / **`HasSuffixElement`**: `assertPrefixHasText(String)` / `assertSuffixHasText(String)`
68
+
69
+ ## Element APIs
70
+
71
+ ### `TextFieldElement` (and subclasses `EmailFieldElement`, `PasswordFieldElement`, `TextAreaElement`)
72
+
73
+ Implements `HasValueElement`, `HasValidationPropertiesElement`, `HasEnabledElement`, `HasLabelElement`,
74
+ `HasPlaceholderElement`, `HasHelperElement`, `HasClearButtonElement`, `FocusableElement` and more.
75
+
76
+ - `static TextFieldElement getByLabel(Page page, String label)`
77
+ - `static TextFieldElement getByLabel(Locator scope, String label)`
78
+ - `Integer getMinLength()` / `void setMinLength(int)` / `void assertMinLength(Integer)`
79
+ - `Integer getMaxLength()` / `void setMaxLength(int)` / `void assertMaxLength(Integer)`
80
+ - `String getPattern()` / `void setPattern(String)` / `void assertPattern(String)`
81
+ - plus all `HasValueElement` (`setValue`/`getValue`/`clear`/`assertValue`) and validation asserts
82
+
83
+ ### `ButtonElement`
84
+
85
+ `getByText` matches accessible name OR visible text. For icon-only buttons set `setAriaLabel(...)`
86
+ server-side, then look up with `getByText(page, "<aria label>")`.
87
+
88
+ - `static ButtonElement getByText(Page page, String text)`
89
+ - `static ButtonElement getByText(Locator scope, String text)`
90
+ - `static ButtonElement getByLabel(Page page, String text)` — alias for `getByText`
91
+ - inherits `click()`, `assertEnabled()/assertDisabled()`, `focus()`, theming/tooltip asserts
92
+
93
+ ### `ComboBoxElement`
94
+
95
+ Implements `HasValueElement` (read-only `getValue`/`assertValue` — value is the displayed label),
96
+ `HasValidationPropertiesElement`, `HasEnabledElement`, `HasLabelElement`.
97
+
98
+ - `static ComboBoxElement getByLabel(Page page, String label)` / `(Locator scope, String label)`
99
+ - `void selectItem(String item)` — open overlay and click the matching item by visible label
100
+ - `void filterAndSelectItem(String filter, String item)`
101
+ - `void setFilter(String filter)` / `String getFilter()`
102
+ - `void open()` / `void close()` / `boolean isOpened()` / `assertOpened()` / `assertClosed()`
103
+ - `void clickToggleButton()`
104
+ - `int getOverlayItemCount()` / `void assertItemCount(int)`
105
+ - `boolean isReadOnly()` / `assertReadOnly()` / `assertNotReadOnly()`
106
+ - `String getValue()` / `void assertValue(String)`
107
+
108
+ ### `CheckboxElement`
109
+
110
+ Implements `HasValueElement`, `HasValidationPropertiesElement`, `HasEnabledElement`, `HasLabelElement`.
111
+
112
+ - `static CheckboxElement getByLabel(Page page, String label)`
113
+ - `void check()` / `void uncheck()`
114
+ - `boolean isChecked()` / `void assertChecked()` / `void assertNotChecked()`
115
+ - `boolean isIndeterminate()` / `void setIndeterminate(boolean)` / `assertIndeterminate()` / `assertNotIndeterminate()`
116
+
117
+ ### `DatePickerElement`
118
+
119
+ Works with `java.time.LocalDate`. The String value/`setValue(String)` uses the view format `dd/mm/yyyy`.
120
+
121
+ - `static DatePickerElement getByLabel(Page page, String label)` / `(Locator scope, String label)`
122
+ - `void setValue(LocalDate date)` — sets value as ISO-8601
123
+ - `void setValue(String value)` — value formatted as in the view (`dd/mm/yyyy`)
124
+ - `LocalDate getValueAsLocalDate()`
125
+ - `void assertValue(LocalDate value)` / `void assertValue(String value)`
126
+ - inherits validation, clear-button, enablement asserts
127
+
128
+ ### `DialogElement`
129
+
130
+ - `new DialogElement(Page page)` — resolve the dialog via ARIA role
131
+ - `new DialogElement(Locator locator)`
132
+ - `static DialogElement getByHeaderText(Page page, String headerText)`
133
+ - `boolean isOpen()` / `void assertOpen()` / `void assertClosed()`
134
+ - `String getHeaderText()` / `void assertHeaderText(String)`
135
+ - `boolean isModal()` / `void assertModal()` / `void assertModeless()`
136
+ - `void closeWithEscape()`
137
+ - `Locator getHeaderLocator()` / `getContentLocator()` / `getFooterLocator()`
138
+
139
+ Scope lookups within a dialog by passing `dialog.getLocator()` to another element's factory, e.g.
140
+ `ButtonElement.getByText(dialog.getLocator(), "Confirm")`.
141
+
142
+ ### `NotificationElement`
143
+
144
+ Wraps `<vaadin-notification-card>`.
145
+
146
+ - `new NotificationElement(Page page)` / `new NotificationElement(Locator locator)`
147
+ - `boolean isOpen()` / `void assertOpen()` / `void assertClosed()`
148
+ - `Locator getContentLocator()`
149
+
150
+ ### `GridElement`
151
+
152
+ Cell access uses JS evaluation on the grid's internal APIs (body cells are virtualized in shadow DOM).
153
+ Always use `getTotalRowCount()` for data assertions — the viewport limits how many rows render.
154
+
155
+ - `static GridElement get(Page page)` / `static GridElement get(Locator parent)`
156
+ - `static GridElement getById(Page page, String id)`
157
+ - `int getTotalRowCount()` — total data items (use this for counts)
158
+ - `int getRenderedRowCount()` — rows currently in the DOM (≤ total due to virtualization)
159
+ - `int getColumnCount()`
160
+ - `List<String> getHeaderCellContents()`
161
+ - `Optional<CellElement> findCell(int row, int column)`
162
+ - `Optional<CellElement> findCell(int row, String columnHeaderText)`
163
+ - `Optional<RowElement> findRow(int rowIndex)` — scrolls if needed
164
+ - `Optional<HeaderCellElement> findHeaderCell(int columnIndex)` / `findHeaderCellByText(String)`
165
+ - `List<Integer> findRowIndexesWithColumnText(int columnIndex, String text)`
166
+ - `void select(int rowIndex)` / `void deselect(int rowIndex)` / `int getSelectedItemCount()`
167
+ - select-all: `checkSelectAll()` / `uncheckSelectAll()` / `isSelectAllChecked()` / `isSelectAllIndeterminate()`
168
+ - `void scrollToRow(int)` / `scrollToStart()` / `scrollToEnd()`
169
+ - `void waitForGridToStopLoading()` — call after scrolling an async/lazy grid
170
+
171
+ #### `GridElement.RowElement`
172
+
173
+ - `int getRowIndex()` / `Locator getRowLocator()`
174
+ - `CellElement getCell(int columnIndex)` / `CellElement getCell(String columnHeaderText)`
175
+ - `void select()` / `void deselect()` / `boolean isSelected()`
176
+ - `void openDetails()` / `void closeDetails()` / `boolean isDetailsOpen()` / `CellElement getDetailsCell()`
177
+
178
+ #### `GridElement.CellElement`
179
+
180
+ - `Locator getCellContentLocator()` — the `vaadin-grid-cell-content` (use for text asserts, e.g. `assertThat(cell.getCellContentLocator()).hasText("..."))`
181
+ - `Locator getTableCellLocator()` — the `td`/`th`
182
+ - `int getColumnIndex()` (`-1` for details cells)
183
+ - `void click()`
184
+
185
+ ## Notes
186
+
187
+ - Prefer auto-retrying assertions (`assertValue`, `assertVisible`, Playwright `assertThat(locator)...`) over
188
+ raw `isVisible()`/`getAttribute()` boolean checks — only the asserts retry.
189
+ - `TreeGridElement` extends `GridElement` (adds `TreeRowElement`); `MultiSelectComboBoxElement` mirrors
190
+ `ComboBoxElement` for multi-select.
@@ -1,101 +1,31 @@
1
1
  #!/usr/bin/env node
2
+ import assert from 'node:assert/strict';
3
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
4
+ import { isBuiltin } from 'node:module';
5
+ import { dirname, join, resolve } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
2
7
 
3
- /**
4
- * 의존성 검증 스크립트
5
- * 모든 import된 패키지가 package.json에 선언되어 있는지 확인
6
- */
7
-
8
- import fs from 'fs/promises';
9
- import path from 'path';
10
- import { glob } from 'glob';
11
- import { builtinModules } from 'module';
12
-
13
- // Node.js 내장 모듈 체크 함수
14
- function isBuiltinModule(moduleName) {
15
- const rootModule = moduleName.split('/')[0];
16
- return builtinModules.includes(rootModule);
8
+ const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
9
+ const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
10
+ const declared = { ...pkg.dependencies, ...pkg.devDependencies };
11
+ function files(directory) {
12
+ return readdirSync(directory, { withFileTypes: true }).flatMap(entry => {
13
+ const path = join(directory, entry.name);
14
+ return entry.isDirectory() ? files(path) : /\.m?js$/.test(path) ? [path] : [];
15
+ });
17
16
  }
18
-
19
- async function checkDependencies() {
20
- console.log('🔍 의존성 검증을 시작합니다...\n');
21
-
22
- try {
23
- // package.json 읽기
24
- const packageJson = JSON.parse(await fs.readFile('package.json', 'utf8'));
25
- const dependencies = {
26
- ...packageJson.dependencies,
27
- ...packageJson.devDependencies
28
- };
29
-
30
- // 모든 JS 파일 찾기 (템플릿 제외)
31
- const jsFiles = await glob('src/**/*.js', {
32
- ignore: ['src/lib/resources/templates/**/*.js']
33
- });
34
-
35
- const missingDeps = new Set();
36
- const foundImports = new Set();
37
-
38
- for (const file of jsFiles) {
39
- const content = await fs.readFile(file, 'utf8');
40
-
41
- // import 문 찾기
42
- const importMatches = content.match(/import\s+.*?\s+from\s+['"`]([^'"`]+)['"`]/g);
43
- if (importMatches) {
44
- for (const match of importMatches) {
45
- const packageName = match.match(/from\s+['"`]([^'"`]+)['"`]/)[1];
46
-
47
- // 내장 모듈이나 상대 경로가 아닌 경우만 체크
48
- if (!packageName.startsWith('.') && !packageName.startsWith('node:') && !isBuiltinModule(packageName)) {
49
- const rootPackage = packageName.split('/')[0];
50
- foundImports.add(rootPackage);
51
-
52
- if (!dependencies[rootPackage]) {
53
- missingDeps.add(`${rootPackage} (used in ${file})`);
54
- }
55
- }
56
- }
57
- }
58
-
59
- // require 문도 찾기 (혹시 있을 경우)
60
- const requireMatches = content.match(/require\s*\(\s*['"`]([^'"`]+)['"`]\s*\)/g);
61
- if (requireMatches) {
62
- for (const match of requireMatches) {
63
- const packageName = match.match(/['"`]([^'"`]+)['"`]/)[1];
64
-
65
- if (!packageName.startsWith('.') && !packageName.startsWith('node:') && !isBuiltinModule(packageName)) {
66
- const rootPackage = packageName.split('/')[0];
67
- foundImports.add(rootPackage);
68
-
69
- if (!dependencies[rootPackage]) {
70
- missingDeps.add(`${rootPackage} (used in ${file})`);
71
- }
72
- }
73
- }
74
- }
75
- }
76
-
77
- // 결과 출력
78
- console.log(`✅ 검사한 파일: ${jsFiles.length}개`);
79
- console.log(`📦 발견된 외부 패키지: ${foundImports.size}개`);
80
- console.log(` ${Array.from(foundImports).join(', ')}\n`);
81
-
82
- if (missingDeps.size > 0) {
83
- console.log('❌ 누락된 의존성:');
84
- for (const dep of missingDeps) {
85
- console.log(` - ${dep}`);
86
- }
87
- console.log('\n💡 다음 명령어로 설치하세요:');
88
- const packages = Array.from(missingDeps).map(dep => dep.split(' ')[0]);
89
- console.log(` npm install ${packages.join(' ')}`);
90
- process.exit(1);
91
- } else {
92
- console.log('✅ 모든 의존성이 올바르게 선언되어 있습니다!');
93
- }
94
-
95
- } catch (error) {
96
- console.error('❌ 의존성 검증 중 오류 발생:', error.message);
97
- process.exit(1);
17
+ const sources = ['src', 'scripts'].flatMap(directory => files(join(root, directory)));
18
+ for (const file of sources) {
19
+ const source = readFileSync(file, 'utf8');
20
+ // Check literal imports used by these small Node entry points, including dynamic imports.
21
+ for (const match of source.matchAll(/(?:\bfrom\s*|\bimport\s*\(?\s*|\brequire\s*\(\s*)['"]([^'"]+)['"]/g)) {
22
+ const name = match[1];
23
+ if (name.startsWith('.')) {
24
+ assert.ok(existsSync(resolve(dirname(file), name)), `Missing local import: ${file}: ${name}`);
25
+ } else if (!isBuiltin(name)) {
26
+ const packageName = name.startsWith('@') ? name.split('/').slice(0, 2).join('/') : name.split('/')[0];
27
+ assert.ok(declared[packageName], `Undeclared dependency: ${file}: ${name}`);
98
28
  }
29
+ }
99
30
  }
100
-
101
- checkDependencies();
31
+ console.log(`Dependency declarations and local imports checked in ${sources.length} Node source files.`);