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.
- package/.claude-plugin/marketplace.json +146 -0
- package/CHANGELOG.md +49 -1
- package/README.ko.md +118 -309
- package/README.md +68 -254
- package/docs/modernization/BROWNFIELD-GREENFIELD.ko.md +105 -0
- package/docs/modernization/CLAUDE-PLAN-REVIEW-2026-10-03.ko.md +77 -0
- package/docs/modernization/CLI-PRODUCTIVITY-REVIEWED-2026-10-03.ko.md +177 -0
- package/docs/modernization/CLI-PRODUCTIVITY.ko.md +193 -0
- package/docs/modernization/CORE-PACKAGE-PLAN.md +7 -0
- package/docs/modernization/DEEP-REVERSE-ENGINEERING.ko.md +88 -0
- package/docs/modernization/DELEGATION-OPTIONAL.ko.md +57 -0
- package/docs/modernization/DIRECTION.ko.md +56 -0
- package/docs/modernization/FULL-TEST-2026-10-03.md +49 -0
- package/docs/modernization/LEGACY-REMOVAL-PLAN.md +9 -0
- package/docs/modernization/PILOT-RESULT-2026-10-03.ko.md +85 -0
- package/docs/modernization/PILOT-UC-001.ko.md +79 -0
- package/docs/modernization/PLAN.md +28 -0
- package/docs/modernization/SKILLS.ko.md +105 -0
- package/docs/modernization/SPRINTABLE.ko.md +47 -0
- package/docs/modernization/SYNC-DOCS-VALIDATION-2026-10-04.ko.md +38 -0
- package/docs/modernization/VALIDATION.md +79 -0
- package/docs/modernization/evidence/example-review-packet.json +115 -0
- package/docs/modernization/evidence/example-spec-pin.json +48 -0
- package/docs/modernization/evidence/full-test-20261003/claude-lint.md +22 -0
- package/docs/modernization/evidence/full-test-20261003/claude-review-retry.md +56 -0
- package/docs/modernization/evidence/full-test-20261003/codex-review-packet.json +159 -0
- package/docs/modernization/evidence/full-test-20261003/src/expense.mjs +40 -0
- package/docs/modernization/evidence/full-test-20261003/summary.json +106 -0
- package/docs/modernization/evidence/full-test-20261003/tests/expense.test.mjs +61 -0
- package/docs/modernization/evidence/local-pilot-20261003/README.ko.md +40 -0
- package/docs/modernization/evidence/local-pilot-20261003/execution.json +1055 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/dependencies.json +24 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/dependencies.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/dependencies.stdout.txt +5 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/docs.json +24 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/docs.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/docs.stdout.txt +6 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/example.json +24 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/example.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/example.stdout.txt +5 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/local-docs.json +24 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/local-docs.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/local-docs.stdout.txt +6 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/node.json +23 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/node.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/node.stdout.txt +535 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/provenance.json +24 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/provenance.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/provenance.stdout.txt +5 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/readme-replay.json +24 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/readme-replay.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/readme-replay.stdout.txt +273 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/upstream.json +24 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/upstream.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/maintenance/upstream.stdout.txt +7 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-service.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-service.stdout.txt +148 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-structure.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/archive-structure.stdout.txt +9 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-check.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-check.stdout.txt +67 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-evidence.json +34 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-packet.json +128 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-packet.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-packet.stdout.txt +128 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-pin.json +54 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-pin.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-pin.stdout.txt +60 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-readback.json +15 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-service.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-service.stdout.txt +82 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-structure.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/baseline-structure.stdout.txt +9 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-check.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-check.stdout.txt +79 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-packet-refused.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-packet-refused.stdout.txt +7 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-pin-refresh.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-pin-refresh.stdout.txt +66 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-pin.json +60 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-structure.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/changed-structure.stdout.txt +9 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-check.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-check.stdout.txt +73 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-evidence.json +34 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-packet.json +134 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-packet.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-packet.stdout.txt +134 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-readback.json +15 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-service.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-service.stdout.txt +148 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-structure.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/final-structure.stdout.txt +9 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/node-version.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/node-version.stdout.txt +1 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/python-version.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/python-version.stdout.txt +1 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-evidence.json +34 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-packet.json +134 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-packet.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-packet.stdout.txt +134 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-readback.json +15 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-service.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-service.stdout.txt +266 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-structure.stderr.txt +0 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/artifacts/red-structure.stdout.txt +9 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/docs/entity_model.md +33 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/docs/glossary.md +9 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/docs/plans/UC-001.md +20 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/docs/requirements.md +10 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/docs/test_cases/TC-001-submit-expense.md +37 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/docs/test_cases/TC-002-description-limit.md +42 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/docs/use_cases/UC-001-submit-expense.md +76 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/docs/use_cases.puml +12 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/docs/vision.md +21 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/src/expense.mjs +48 -0
- package/docs/modernization/evidence/local-pilot-20261003/project/tests/expense.test.mjs +116 -0
- package/docs/modernization/evidence/local-pilot-20261003/scope.json +31 -0
- package/docs/modernization/reviews/2026-10-03-claude-cli/CONTRACTS.ko.md +122 -0
- package/docs/modernization/reviews/2026-10-03-claude-cli/DIRECTION.ko.md +84 -0
- package/examples/spec-workflow/README.md +54 -0
- package/examples/spec-workflow/docs/entity_model.md +33 -0
- package/examples/spec-workflow/docs/glossary.md +9 -0
- package/examples/spec-workflow/docs/requirements.md +10 -0
- package/examples/spec-workflow/docs/test_cases/TC-001-submit-expense.md +37 -0
- package/examples/spec-workflow/docs/use_cases/UC-001-submit-expense.md +63 -0
- package/examples/spec-workflow/docs/use_cases.puml +12 -0
- package/examples/spec-workflow/docs/vision.md +21 -0
- package/package.json +37 -104
- package/plugins/aiwf-angular-jpa/.claude-plugin/plugin.json +11 -0
- package/plugins/aiwf-angular-jpa/LICENSE +201 -0
- package/plugins/aiwf-angular-jpa/NOTICE +16 -0
- package/plugins/aiwf-angular-jpa/README.md +54 -0
- package/plugins/aiwf-angular-jpa/UPSTREAM.json +35 -0
- package/plugins/aiwf-angular-jpa/agents/uc-coverage.md +263 -0
- package/plugins/aiwf-angular-jpa/rules/mcp-servers.md +64 -0
- package/plugins/aiwf-angular-jpa/skills/coverage-check/SKILL.md +190 -0
- package/plugins/aiwf-angular-jpa/skills/flyway-migration/SKILL.md +119 -0
- package/plugins/aiwf-angular-jpa/skills/implement/SKILL.md +528 -0
- package/plugins/aiwf-angular-jpa/skills/implement/references/module-layout.md +95 -0
- package/plugins/aiwf-angular-jpa/skills/playwright-test/SKILL.md +360 -0
- package/plugins/aiwf-angular-jpa/skills/spring-boot-test/SKILL.md +504 -0
- package/plugins/aiwf-angular-jpa/skills/vitest-test/SKILL.md +309 -0
- package/plugins/aiwf-blazor-dotnet/.claude-plugin/plugin.json +11 -0
- package/plugins/aiwf-blazor-dotnet/LICENSE +201 -0
- package/plugins/aiwf-blazor-dotnet/NOTICE +16 -0
- package/plugins/aiwf-blazor-dotnet/README.md +53 -0
- package/plugins/aiwf-blazor-dotnet/UPSTREAM.json +31 -0
- package/plugins/aiwf-blazor-dotnet/rules/mcp-servers.md +25 -0
- package/plugins/aiwf-blazor-dotnet/skills/bunit-test/SKILL.md +110 -0
- package/plugins/aiwf-blazor-dotnet/skills/dotnet-test/SKILL.md +108 -0
- package/plugins/aiwf-blazor-dotnet/skills/ef-migration/SKILL.md +43 -0
- package/plugins/aiwf-blazor-dotnet/skills/implement/SKILL.md +149 -0
- package/plugins/aiwf-blazor-dotnet/skills/playwright-test/SKILL.md +130 -0
- package/plugins/aiwf-core/.claude-plugin/plugin.json +11 -0
- package/plugins/aiwf-core/LICENSE +201 -0
- package/plugins/aiwf-core/NOTICE +20 -0
- package/plugins/aiwf-core/README.md +38 -0
- package/plugins/aiwf-core/UPSTREAM.json +50 -0
- package/plugins/aiwf-core/skills/entity-model/SKILL.md +160 -0
- package/plugins/aiwf-core/skills/entity-model/references/REFERENCE.md +36 -0
- package/plugins/aiwf-core/skills/requirements/SKILL.md +157 -0
- package/plugins/aiwf-core/skills/requirements/references/REFERENCE.md +70 -0
- package/plugins/aiwf-core/skills/requirements/references/glossary.md +7 -0
- package/plugins/aiwf-core/skills/reverse-engineer/SKILL.md +509 -0
- package/plugins/aiwf-core/skills/reverse-engineer/references/stack-signals.md +210 -0
- package/plugins/aiwf-core/skills/spec-review/SKILL.md +197 -0
- package/plugins/aiwf-core/skills/spec-review/references/lint-codes.md +63 -0
- package/plugins/aiwf-core/skills/spec-review/references/review-checklist.md +189 -0
- package/plugins/aiwf-core/skills/spec-review/scripts/spec_lint.py +1216 -0
- package/plugins/aiwf-core/skills/test-case/SKILL.md +138 -0
- package/plugins/aiwf-core/skills/test-case/references/example-process.bpmn +118 -0
- package/plugins/aiwf-core/skills/test-case/references/example.md +38 -0
- package/plugins/aiwf-core/skills/test-case/references/test-case.md +35 -0
- package/plugins/aiwf-core/skills/test-case/scripts/bpmn_paths.py +542 -0
- package/plugins/aiwf-core/skills/use-case-diagram/SKILL.md +99 -0
- package/plugins/aiwf-core/skills/use-case-spec/SKILL.md +257 -0
- package/plugins/aiwf-core/skills/use-case-spec/references/clarify-checklist.md +70 -0
- package/plugins/aiwf-core/skills/use-case-spec/references/example.md +88 -0
- package/plugins/aiwf-core/skills/use-case-spec/references/format-spec.md +246 -0
- package/plugins/aiwf-core/skills/use-case-spec/references/use-case.md +50 -0
- package/plugins/aiwf-core/skills/use-case-spec/scripts/validate_use_case.py +941 -0
- package/plugins/aiwf-delegate-claude/.claude-plugin/plugin.json +9 -0
- package/{src/lib/resources/templates/npm-library/template → plugins/aiwf-delegate-claude}/LICENSE +2 -2
- package/plugins/aiwf-delegate-claude/NOTICE +4 -0
- package/plugins/aiwf-delegate-claude/README.md +10 -0
- package/plugins/aiwf-delegate-claude/plugin.json +13 -0
- package/plugins/aiwf-delegate-claude/skills/delegate-claude/LICENSE +21 -0
- package/plugins/aiwf-delegate-claude/skills/delegate-claude/NOTICE +4 -0
- package/plugins/aiwf-delegate-claude/skills/delegate-claude/SKILL.md +49 -0
- package/plugins/aiwf-delegate-claude/skills/delegate-claude/agents/openai.yaml +2 -0
- package/plugins/aiwf-delegate-codex/.claude-plugin/plugin.json +9 -0
- package/plugins/aiwf-delegate-codex/LICENSE +21 -0
- package/plugins/aiwf-delegate-codex/NOTICE +4 -0
- package/plugins/aiwf-delegate-codex/README.md +10 -0
- package/plugins/aiwf-delegate-codex/plugin.json +13 -0
- package/plugins/aiwf-delegate-codex/skills/delegate-codex/LICENSE +21 -0
- package/plugins/aiwf-delegate-codex/skills/delegate-codex/NOTICE +4 -0
- package/plugins/aiwf-delegate-codex/skills/delegate-codex/SKILL.md +47 -0
- package/plugins/aiwf-delegate-codex/skills/delegate-codex/agents/openai.yaml +2 -0
- package/plugins/aiwf-nestjs-nextjs/.claude-plugin/plugin.json +11 -0
- package/plugins/aiwf-nestjs-nextjs/LICENSE +201 -0
- package/plugins/aiwf-nestjs-nextjs/NOTICE +16 -0
- package/plugins/aiwf-nestjs-nextjs/README.md +53 -0
- package/plugins/aiwf-nestjs-nextjs/UPSTREAM.json +32 -0
- package/plugins/aiwf-nestjs-nextjs/rules/mcp-servers.md +59 -0
- package/plugins/aiwf-nestjs-nextjs/skills/drizzle-migration/SKILL.md +222 -0
- package/plugins/aiwf-nestjs-nextjs/skills/implement/SKILL.md +393 -0
- package/plugins/aiwf-nestjs-nextjs/skills/implement/references/project-layout.md +158 -0
- package/plugins/aiwf-nestjs-nextjs/skills/nest-test/SKILL.md +300 -0
- package/plugins/aiwf-nestjs-nextjs/skills/playwright-test/SKILL.md +245 -0
- package/plugins/aiwf-nestjs-nextjs/skills/react-test/SKILL.md +217 -0
- package/plugins/aiwf-spec/.claude-plugin/plugin.json +9 -0
- package/plugins/aiwf-spec/LICENSE +201 -0
- package/plugins/aiwf-spec/NOTICE +20 -0
- package/plugins/aiwf-spec/README.md +36 -0
- package/plugins/aiwf-spec/skills/sync-docs/SKILL.md +47 -0
- package/plugins/aiwf-spec/skills/workflow/SKILL.md +42 -0
- package/plugins/aiwf-vaadin-jooq/.claude-plugin/plugin.json +11 -0
- package/plugins/aiwf-vaadin-jooq/LICENSE +201 -0
- package/plugins/aiwf-vaadin-jooq/NOTICE +16 -0
- package/plugins/aiwf-vaadin-jooq/README.md +56 -0
- package/plugins/aiwf-vaadin-jooq/UPSTREAM.json +43 -0
- package/plugins/aiwf-vaadin-jooq/agents/uc-coverage.md +260 -0
- package/plugins/aiwf-vaadin-jooq/rules/mcp-servers.md +44 -0
- package/plugins/aiwf-vaadin-jooq/skills/browserless-test/SKILL.md +407 -0
- package/plugins/aiwf-vaadin-jooq/skills/browserless-test/references/UC001ManagePersonsTest.java +111 -0
- package/plugins/aiwf-vaadin-jooq/skills/coverage-check/SKILL.md +190 -0
- package/plugins/aiwf-vaadin-jooq/skills/flyway-migration/SKILL.md +70 -0
- package/plugins/aiwf-vaadin-jooq/skills/hilla-test/SKILL.md +350 -0
- package/plugins/aiwf-vaadin-jooq/skills/hilla-test/references/UC001ManagePersonsServiceTest.java +81 -0
- package/plugins/aiwf-vaadin-jooq/skills/hilla-test/references/UC001ManagePersonsViewTest.tsx +87 -0
- package/plugins/aiwf-vaadin-jooq/skills/implement/SKILL.md +196 -0
- package/plugins/aiwf-vaadin-jooq/skills/implement-hilla/SKILL.md +216 -0
- package/plugins/aiwf-vaadin-jooq/skills/karibu-test/SKILL.md +298 -0
- package/plugins/aiwf-vaadin-jooq/skills/karibu-test/references/UC001ManagePersonsTest.java +93 -0
- package/plugins/aiwf-vaadin-jooq/skills/playwright-test/SKILL.md +237 -0
- package/plugins/aiwf-vaadin-jooq/skills/playwright-test/references/ExampleViewIT.java +143 -0
- package/plugins/aiwf-vaadin-jooq/skills/playwright-test/references/TC001CustomerOnboardingIT.java +144 -0
- package/plugins/aiwf-vaadin-jooq/skills/playwright-test/references/dramafinder-api.md +190 -0
- package/scripts/check-dependencies.js +26 -96
- package/scripts/install-spec-skills.mjs +126 -0
- package/scripts/validate-spec-plugin.mjs +145 -0
- package/src/cli/spec-cli.js +292 -0
- package/src/lib/spec-workflow.js +982 -0
- package/docs/ADR_MANAGEMENT_GUIDE.ko.md +0 -602
- package/docs/ADR_MANAGEMENT_GUIDE.md +0 -602
- package/docs/AI-WORKFLOW.ko.md +0 -299
- package/docs/AI-WORKFLOW.md +0 -401
- package/docs/API_REFERENCE_FULL.ko.md +0 -1135
- package/docs/API_REFERENCE_FULL.md +0 -1135
- package/docs/ARCHITECTURE.ko.md +0 -314
- package/docs/ARCHITECTURE.md +0 -314
- package/docs/CLI_USAGE_GUIDE.ko.md +0 -634
- package/docs/CLI_USAGE_GUIDE.md +0 -640
- package/docs/CODE_CLEANUP_GUIDE.ko.md +0 -415
- package/docs/CODE_CLEANUP_GUIDE.md +0 -415
- package/docs/COMMANDS_GUIDE.ko.md +0 -1037
- package/docs/COMMANDS_GUIDE.md +0 -1037
- package/docs/CONTRIBUTING.ko.md +0 -408
- package/docs/CONTRIBUTING.md +0 -408
- package/docs/DEVELOPMENT_GUIDE.ko.md +0 -440
- package/docs/DEVELOPMENT_GUIDE.md +0 -727
- package/docs/EXAMPLES.ko.md +0 -695
- package/docs/EXAMPLES.md +0 -693
- package/docs/GETTING_STARTED.ko.md +0 -219
- package/docs/GETTING_STARTED.md +0 -476
- package/docs/MODULE_MANAGEMENT_GUIDE.ko.md +0 -289
- package/docs/MODULE_MANAGEMENT_GUIDE.md +0 -289
- package/docs/PERFORMANCE_ARCHITECTURE.md +0 -494
- package/docs/PERFORMANCE_GUIDELINES.ko.md +0 -388
- package/docs/PERFORMANCE_GUIDELINES.md +0 -553
- package/docs/PRD.ko.md +0 -148
- package/docs/PRD.md +0 -150
- package/docs/ROADMAP_v0.4.0.md +0 -286
- package/docs/STATE_MANAGEMENT_GUIDE.ko.md +0 -278
- package/docs/STATE_MANAGEMENT_GUIDE.md +0 -278
- package/docs/TROUBLESHOOTING.ko.md +0 -366
- package/docs/TROUBLESHOOTING.md +0 -722
- package/docs/VALIDATOR_API.ko.md +0 -324
- package/docs/VALIDATOR_API.md +0 -324
- package/docs/YOLO_SYSTEM_GUIDE.ko.md +0 -542
- package/docs/YOLO_SYSTEM_GUIDE.md +0 -542
- package/docs/designs/AI_PERSONA_SYSTEM_DESIGN.md +0 -516
- package/docs/designs/API_DOCUMENTATION.md +0 -932
- package/docs/designs/API_REFERENCE.md +0 -979
- package/docs/designs/Enhanced_Installation_Flow_Design.md +0 -498
- package/docs/designs/aiwf-metadata-system-prd.md +0 -127
- package/docs/designs/offline-template-cache.md +0 -323
- package/docs/designs/persona-aware-compression.md +0 -168
- package/docs/guides/ai-personas-guide-ko.md +0 -239
- package/docs/guides/ai-personas-guide.md +0 -239
- package/docs/guides/checkpoint-system-guide-ko.md +0 -356
- package/docs/guides/checkpoint-system-guide.md +0 -356
- package/docs/guides/context-compression-guide-ko.md +0 -313
- package/docs/guides/context-compression-guide.md +0 -313
- package/docs/guides/independent-sprint-guide-ko.md +0 -321
- package/docs/guides/independent-sprint-guide.md +0 -321
- package/rules/global/aiwf-code-style-guide.md +0 -30
- package/rules/global/aiwf-coding-principles.md +0 -33
- package/rules/global/aiwf-development-process.md +0 -41
- package/rules/global/aiwf-global-rules.md +0 -84
- package/rules/manual/aiwf-generate-plan-docs.md +0 -280
- package/scripts/run-integration-tests.js +0 -317
- package/scripts/update-file-lists.js +0 -267
- package/scripts/validate-commands.js +0 -254
- package/src/DEPENDENCY_MAP.md +0 -90
- package/src/cli/cache-cli.js +0 -459
- package/src/cli/checkpoint-cli.js +0 -417
- package/src/cli/index.js +0 -481
- package/src/cli/language-cli.js +0 -286
- package/src/cli/sprint-cli.js +0 -287
- package/src/commands/ai-tool.js +0 -383
- package/src/commands/compress.js +0 -60
- package/src/commands/create-project.js +0 -160
- package/src/commands/evaluate.js +0 -459
- package/src/commands/persona.js +0 -309
- package/src/commands/sprint-independent.js +0 -393
- package/src/commands/sprint-task.js +0 -262
- package/src/commands/state.js +0 -1164
- package/src/commands/token.js +0 -312
- package/src/commands/yolo-config.js +0 -502
- package/src/config/file-lists.js +0 -147
- package/src/config/yolo-config-template.yaml +0 -168
- package/src/lib/ai-persona-manager.js +0 -711
- package/src/lib/backup-manager.js +0 -271
- package/src/lib/cache-system.js +0 -332
- package/src/lib/context-engine.js +0 -568
- package/src/lib/file-downloader.js +0 -304
- package/src/lib/github-integration.js +0 -402
- package/src/lib/installer.js +0 -1066
- package/src/lib/memory-profiler.js +0 -471
- package/src/lib/metrics-collector.js +0 -885
- package/src/lib/offline-detector.js +0 -386
- package/src/lib/resource-loader-enhanced.js +0 -399
- package/src/lib/resource-loader.js +0 -250
- package/src/lib/resources/commands/ai-persona.js +0 -602
- package/src/lib/resources/commands/compress-context.js +0 -389
- package/src/lib/resources/commands/evaluate.js +0 -246
- package/src/lib/resources/commands/persona-context-apply.js +0 -562
- package/src/lib/resources/commands/token-tracking.js +0 -443
- package/src/lib/resources/config/commit-patterns.js +0 -103
- package/src/lib/resources/config/language.json +0 -6
- package/src/lib/resources/personas/PERSONA_INDEX.md +0 -57
- package/src/lib/resources/personas/analyst.json +0 -44
- package/src/lib/resources/personas/architect/best_practices.md +0 -136
- package/src/lib/resources/personas/architect/knowledge_base.md +0 -377
- package/src/lib/resources/personas/architect.json +0 -44
- package/src/lib/resources/personas/backend/best_practices.md +0 -766
- package/src/lib/resources/personas/backend/knowledge_base.md +0 -1070
- package/src/lib/resources/personas/data_analyst/best_practices.md +0 -594
- package/src/lib/resources/personas/data_analyst/knowledge_base.md +0 -1057
- package/src/lib/resources/personas/developer.json +0 -44
- package/src/lib/resources/personas/developer.md +0 -37
- package/src/lib/resources/personas/evaluation_criteria.json +0 -137
- package/src/lib/resources/personas/frontend/best_practices.md +0 -445
- package/src/lib/resources/personas/frontend/knowledge_base.md +0 -729
- package/src/lib/resources/personas/persona-index.json +0 -31
- package/src/lib/resources/personas/reviewer.json +0 -44
- package/src/lib/resources/personas/security/best_practices.md +0 -307
- package/src/lib/resources/personas/security/knowledge_base.md +0 -498
- package/src/lib/resources/personas/tester.json +0 -44
- package/src/lib/resources/templates/README.md +0 -78
- package/src/lib/resources/templates/api-server/config.json +0 -64
- package/src/lib/resources/templates/api-server/template/.aiwf/config.json +0 -56
- package/src/lib/resources/templates/api-server/template/.aiwf/feature-ledger.json +0 -42
- package/src/lib/resources/templates/api-server/template/.aiwf/personas/backend-engineer.json +0 -40
- package/src/lib/resources/templates/api-server/template/.aiwf/scripts/cli.js +0 -111
- package/src/lib/resources/templates/api-server/template/.env.example +0 -29
- package/src/lib/resources/templates/api-server/template/.eslintrc.json +0 -23
- package/src/lib/resources/templates/api-server/template/README.md +0 -171
- package/src/lib/resources/templates/api-server/template/jest.config.js +0 -26
- package/src/lib/resources/templates/api-server/template/nodemon.json +0 -9
- package/src/lib/resources/templates/api-server/template/package.json +0 -61
- package/src/lib/resources/templates/api-server/template/src/app.ts +0 -60
- package/src/lib/resources/templates/api-server/template/src/config/swagger.ts +0 -38
- package/src/lib/resources/templates/api-server/template/src/controllers/aiwfController.ts +0 -54
- package/src/lib/resources/templates/api-server/template/src/controllers/authController.ts +0 -128
- package/src/lib/resources/templates/api-server/template/src/controllers/statusController.ts +0 -28
- package/src/lib/resources/templates/api-server/template/src/index.ts +0 -28
- package/src/lib/resources/templates/api-server/template/src/middleware/aiwfMiddleware.ts +0 -50
- package/src/lib/resources/templates/api-server/template/src/middleware/authMiddleware.ts +0 -41
- package/src/lib/resources/templates/api-server/template/src/middleware/errorHandler.ts +0 -42
- package/src/lib/resources/templates/api-server/template/src/middleware/notFoundHandler.ts +0 -14
- package/src/lib/resources/templates/api-server/template/src/middleware/requestLogger.ts +0 -20
- package/src/lib/resources/templates/api-server/template/src/routes/aiwf.ts +0 -31
- package/src/lib/resources/templates/api-server/template/src/routes/index.ts +0 -13
- package/src/lib/resources/templates/api-server/template/src/routes/v1/index.ts +0 -67
- package/src/lib/resources/templates/api-server/template/src/utils/logger.ts +0 -37
- package/src/lib/resources/templates/api-server/template/tests/app.test.ts +0 -40
- package/src/lib/resources/templates/api-server/template/tsconfig.json +0 -43
- package/src/lib/resources/templates/npm-library/config.json +0 -61
- package/src/lib/resources/templates/npm-library/template/README.md +0 -201
- package/src/lib/resources/templates/npm-library/template/package.json +0 -78
- package/src/lib/resources/templates/web-app/config.json +0 -53
- package/src/lib/resources/templates/web-app/template/.aiwf/config.json +0 -54
- package/src/lib/resources/templates/web-app/template/.aiwf/feature-ledger.json +0 -37
- package/src/lib/resources/templates/web-app/template/.aiwf/personas/fullstack-developer.json +0 -40
- package/src/lib/resources/templates/web-app/template/.aiwf/scripts/cli.js +0 -110
- package/src/lib/resources/templates/web-app/template/.eslintrc.cjs +0 -20
- package/src/lib/resources/templates/web-app/template/README.md +0 -151
- package/src/lib/resources/templates/web-app/template/index.html +0 -14
- package/src/lib/resources/templates/web-app/template/package.json +0 -44
- package/src/lib/resources/templates/web-app/template/postcss.config.js +0 -6
- package/src/lib/resources/templates/web-app/template/public/vite.svg +0 -1
- package/src/lib/resources/templates/web-app/template/src/App.tsx +0 -21
- package/src/lib/resources/templates/web-app/template/src/components/Layout.tsx +0 -57
- package/src/lib/resources/templates/web-app/template/src/components/aiwf/ContextStatus.tsx +0 -107
- package/src/lib/resources/templates/web-app/template/src/components/aiwf/TokenUsage.tsx +0 -71
- package/src/lib/resources/templates/web-app/template/src/index.css +0 -60
- package/src/lib/resources/templates/web-app/template/src/main.tsx +0 -10
- package/src/lib/resources/templates/web-app/template/src/pages/AiwfDashboard.tsx +0 -57
- package/src/lib/resources/templates/web-app/template/src/pages/HomePage.tsx +0 -89
- package/src/lib/resources/templates/web-app/template/src/pages/NotFound.tsx +0 -25
- package/src/lib/resources/templates/web-app/template/src/stores/aiwfStore.ts +0 -126
- package/src/lib/resources/templates/web-app/template/src/types/global.d.ts +0 -9
- package/src/lib/resources/templates/web-app/template/src/vite-env.d.ts +0 -1
- package/src/lib/resources/templates/web-app/template/tailwind.config.js +0 -30
- package/src/lib/resources/templates/web-app/template/tsconfig.json +0 -37
- package/src/lib/resources/templates/web-app/template/tsconfig.node.json +0 -10
- package/src/lib/resources/templates/web-app/template/vite.config.ts +0 -23
- package/src/lib/resources/utils/background-monitor.js +0 -223
- package/src/lib/resources/utils/compression-metrics.js +0 -1031
- package/src/lib/resources/utils/compression-strategies.js +0 -557
- package/src/lib/resources/utils/content-normalizer.js +0 -455
- package/src/lib/resources/utils/context-compressor.js +0 -583
- package/src/lib/resources/utils/context-rule-parser.js +0 -180
- package/src/lib/resources/utils/context-token-monitor.js +0 -463
- package/src/lib/resources/utils/context-update-manager.js +0 -502
- package/src/lib/resources/utils/git-utils.js +0 -220
- package/src/lib/resources/utils/importance-classifier.js +0 -645
- package/src/lib/resources/utils/information-filter.js +0 -710
- package/src/lib/resources/utils/persona-aware-compressor.js +0 -598
- package/src/lib/resources/utils/prompt-injector.js +0 -242
- package/src/lib/resources/utils/simplified-evaluator.js +0 -119
- package/src/lib/resources/utils/text-summarizer.js +0 -492
- package/src/lib/resources/utils/token-counter.js +0 -177
- package/src/lib/resources/utils/token-monitor.js +0 -484
- package/src/lib/resources/utils/token-reporter.js +0 -452
- package/src/lib/resources/utils/token-storage.js +0 -433
- package/src/lib/resources/utils/token-tracker.js +0 -283
- package/src/lib/rollback-manager.js +0 -418
- package/src/lib/state/priority-calculator.js +0 -217
- package/src/lib/state/state-index.js +0 -155
- package/src/lib/state/task-scanner.js +0 -328
- package/src/lib/task-analyzer.js +0 -599
- package/src/lib/template-cache-system.js +0 -559
- package/src/lib/template-downloader.js +0 -467
- package/src/lib/template-version-manager.js +0 -491
- package/src/lib/token-optimizer.js +0 -517
- package/src/lib/validator.js +0 -376
- package/src/utils/checkpoint-manager.js +0 -435
- package/src/utils/engineering-guard.js +0 -399
- package/src/utils/language-utils.js +0 -331
- package/src/utils/messages.js +0 -166
- 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
|
+
}
|
package/plugins/aiwf-vaadin-jooq/skills/playwright-test/references/TC001CustomerOnboardingIT.java
ADDED
|
@@ -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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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.`);
|