@jhl8041/dooray-mcp 0.1.4 → 0.1.6
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/commands/bmad_agent_bmad-master.md +14 -0
- package/.claude/commands/bmad_bmm_agent_analyst.md +14 -0
- package/.claude/commands/bmad_bmm_agent_architect.md +14 -0
- package/.claude/commands/bmad_bmm_agent_dev.md +14 -0
- package/.claude/commands/bmad_bmm_agent_pm.md +14 -0
- package/.claude/commands/bmad_bmm_agent_quick-flow-solo-dev.md +14 -0
- package/.claude/commands/bmad_bmm_agent_sm.md +14 -0
- package/.claude/commands/bmad_bmm_agent_tea.md +14 -0
- package/.claude/commands/bmad_bmm_agent_tech-writer_tech-writer.md +14 -0
- package/.claude/commands/bmad_bmm_agent_ux-designer.md +14 -0
- package/.claude/commands/bmad_bmm_check-implementation-readiness.md +5 -0
- package/.claude/commands/bmad_bmm_code-review.md +13 -0
- package/.claude/commands/bmad_bmm_correct-course.md +13 -0
- package/.claude/commands/bmad_bmm_create-architecture.md +5 -0
- package/.claude/commands/bmad_bmm_create-epics-and-stories.md +5 -0
- package/.claude/commands/bmad_bmm_create-excalidraw-dataflow.md +13 -0
- package/.claude/commands/bmad_bmm_create-excalidraw-diagram.md +13 -0
- package/.claude/commands/bmad_bmm_create-excalidraw-flowchart.md +13 -0
- package/.claude/commands/bmad_bmm_create-excalidraw-wireframe.md +13 -0
- package/.claude/commands/bmad_bmm_create-prd.md +5 -0
- package/.claude/commands/bmad_bmm_create-product-brief.md +5 -0
- package/.claude/commands/bmad_bmm_create-story.md +13 -0
- package/.claude/commands/bmad_bmm_create-ux-design.md +5 -0
- package/.claude/commands/bmad_bmm_dev-story.md +13 -0
- package/.claude/commands/bmad_bmm_document-project.md +13 -0
- package/.claude/commands/bmad_bmm_quick-dev.md +5 -0
- package/.claude/commands/bmad_bmm_quick-spec.md +5 -0
- package/.claude/commands/bmad_bmm_research.md +5 -0
- package/.claude/commands/bmad_bmm_retrospective.md +13 -0
- package/.claude/commands/bmad_bmm_sprint-planning.md +13 -0
- package/.claude/commands/bmad_bmm_sprint-status.md +13 -0
- package/.claude/commands/bmad_bmm_testarch-atdd.md +13 -0
- package/.claude/commands/bmad_bmm_testarch-automate.md +13 -0
- package/.claude/commands/bmad_bmm_testarch-ci.md +13 -0
- package/.claude/commands/bmad_bmm_testarch-framework.md +13 -0
- package/.claude/commands/bmad_bmm_testarch-nfr.md +13 -0
- package/.claude/commands/bmad_bmm_testarch-test-design.md +13 -0
- package/.claude/commands/bmad_bmm_testarch-test-review.md +13 -0
- package/.claude/commands/bmad_bmm_testarch-trace.md +13 -0
- package/.claude/commands/bmad_brainstorming.md +5 -0
- package/.claude/commands/bmad_editorial-review-prose.md +9 -0
- package/.claude/commands/bmad_editorial-review-structure.md +10 -0
- package/.claude/commands/bmad_help.md +9 -0
- package/.claude/commands/bmad_index-docs.md +9 -0
- package/.claude/commands/bmad_party-mode.md +5 -0
- package/.claude/commands/bmad_review-adversarial-general.md +9 -0
- package/.claude/commands/bmad_shard-doc.md +9 -0
- package/_bmad/_config/agent-manifest.csv +11 -0
- package/_bmad/_config/agents/bmm-analyst.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-architect.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-dev.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-pm.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-quick-flow-solo-dev.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-sm.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-tea.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-tech-writer.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-ux-designer.customize.yaml +41 -0
- package/_bmad/_config/agents/core-bmad-master.customize.yaml +41 -0
- package/_bmad/_config/bmad-help.csv +40 -0
- package/_bmad/_config/files-manifest.csv +281 -0
- package/_bmad/_config/manifest.yaml +21 -0
- package/_bmad/_config/task-manifest.csv +9 -0
- package/_bmad/_config/tool-manifest.csv +1 -0
- package/_bmad/_config/workflow-manifest.csv +32 -0
- package/_bmad/bmm/agents/analyst.md +76 -0
- package/_bmad/bmm/agents/architect.md +58 -0
- package/_bmad/bmm/agents/dev.md +69 -0
- package/_bmad/bmm/agents/pm.md +72 -0
- package/_bmad/bmm/agents/quick-flow-solo-dev.md +69 -0
- package/_bmad/bmm/agents/sm.md +70 -0
- package/_bmad/bmm/agents/tea.md +70 -0
- package/_bmad/bmm/agents/tech-writer/tech-writer.md +70 -0
- package/_bmad/bmm/agents/ux-designer.md +57 -0
- package/_bmad/bmm/config.yaml +16 -0
- package/_bmad/bmm/data/project-context-template.md +26 -0
- package/_bmad/bmm/module-help.csv +32 -0
- package/_bmad/bmm/teams/default-party.csv +21 -0
- package/_bmad/bmm/teams/team-fullstack.yaml +12 -0
- package/_bmad/bmm/testarch/knowledge/adr-quality-readiness-checklist.md +350 -0
- package/_bmad/bmm/testarch/knowledge/api-request.md +442 -0
- package/_bmad/bmm/testarch/knowledge/api-testing-patterns.md +843 -0
- package/_bmad/bmm/testarch/knowledge/auth-session.md +552 -0
- package/_bmad/bmm/testarch/knowledge/burn-in.md +273 -0
- package/_bmad/bmm/testarch/knowledge/ci-burn-in.md +675 -0
- package/_bmad/bmm/testarch/knowledge/component-tdd.md +486 -0
- package/_bmad/bmm/testarch/knowledge/contract-testing.md +957 -0
- package/_bmad/bmm/testarch/knowledge/data-factories.md +500 -0
- package/_bmad/bmm/testarch/knowledge/email-auth.md +721 -0
- package/_bmad/bmm/testarch/knowledge/error-handling.md +725 -0
- package/_bmad/bmm/testarch/knowledge/feature-flags.md +750 -0
- package/_bmad/bmm/testarch/knowledge/file-utils.md +463 -0
- package/_bmad/bmm/testarch/knowledge/fixture-architecture.md +401 -0
- package/_bmad/bmm/testarch/knowledge/fixtures-composition.md +382 -0
- package/_bmad/bmm/testarch/knowledge/intercept-network-call.md +430 -0
- package/_bmad/bmm/testarch/knowledge/log.md +429 -0
- package/_bmad/bmm/testarch/knowledge/network-error-monitor.md +405 -0
- package/_bmad/bmm/testarch/knowledge/network-first.md +486 -0
- package/_bmad/bmm/testarch/knowledge/network-recorder.md +527 -0
- package/_bmad/bmm/testarch/knowledge/nfr-criteria.md +670 -0
- package/_bmad/bmm/testarch/knowledge/overview.md +286 -0
- package/_bmad/bmm/testarch/knowledge/playwright-config.md +730 -0
- package/_bmad/bmm/testarch/knowledge/probability-impact.md +601 -0
- package/_bmad/bmm/testarch/knowledge/recurse.md +421 -0
- package/_bmad/bmm/testarch/knowledge/risk-governance.md +615 -0
- package/_bmad/bmm/testarch/knowledge/selective-testing.md +732 -0
- package/_bmad/bmm/testarch/knowledge/selector-resilience.md +527 -0
- package/_bmad/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
- package/_bmad/bmm/testarch/knowledge/test-levels-framework.md +473 -0
- package/_bmad/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
- package/_bmad/bmm/testarch/knowledge/test-quality.md +664 -0
- package/_bmad/bmm/testarch/knowledge/timing-debugging.md +372 -0
- package/_bmad/bmm/testarch/knowledge/visual-debugging.md +524 -0
- package/_bmad/bmm/testarch/tea-index.csv +35 -0
- package/_bmad/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
- package/_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
- package/_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
- package/_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
- package/_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
- package/_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
- package/_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
- package/_bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
- package/_bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -0
- package/_bmad/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
- package/_bmad/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
- package/_bmad/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/_bmad/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/_bmad/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
- package/_bmad/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
- package/_bmad/bmm/workflows/1-analysis/research/research.template.md +29 -0
- package/_bmad/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
- package/_bmad/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
- package/_bmad/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
- package/_bmad/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/_bmad/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -0
- package/_bmad/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
- package/_bmad/bmm/workflows/1-analysis/research/workflow.md +173 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +13 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +191 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +153 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +224 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +226 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +213 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +207 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +226 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +237 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +228 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +231 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +242 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +217 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +124 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +247 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +249 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +253 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +168 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +218 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +231 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/validation-report-prd-workflow.md +433 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md +150 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -0
- package/_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -0
- package/_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -0
- package/_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
- package/_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -0
- package/_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
- package/_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +135 -0
- package/_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +11 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
- package/_bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md +50 -0
- package/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
- package/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
- package/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
- package/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
- package/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
- package/_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -0
- package/_bmad/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
- package/_bmad/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
- package/_bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +50 -0
- package/_bmad/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
- package/_bmad/bmm/workflows/4-implementation/correct-course/instructions.md +206 -0
- package/_bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +58 -0
- package/_bmad/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
- package/_bmad/bmm/workflows/4-implementation/create-story/instructions.xml +345 -0
- package/_bmad/bmm/workflows/4-implementation/create-story/template.md +49 -0
- package/_bmad/bmm/workflows/4-implementation/create-story/workflow.yaml +59 -0
- package/_bmad/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
- package/_bmad/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
- package/_bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +25 -0
- package/_bmad/bmm/workflows/4-implementation/retrospective/instructions.md +1443 -0
- package/_bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +57 -0
- package/_bmad/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
- package/_bmad/bmm/workflows/4-implementation/sprint-planning/instructions.md +225 -0
- package/_bmad/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
- package/_bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +52 -0
- package/_bmad/bmm/workflows/4-implementation/sprint-status/instructions.md +229 -0
- package/_bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +35 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +176 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +120 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +113 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +113 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +106 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +149 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +192 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +145 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +128 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +201 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
- package/_bmad/bmm/workflows/document-project/checklist.md +245 -0
- package/_bmad/bmm/workflows/document-project/documentation-requirements.csv +12 -0
- package/_bmad/bmm/workflows/document-project/instructions.md +221 -0
- package/_bmad/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
- package/_bmad/bmm/workflows/document-project/templates/index-template.md +169 -0
- package/_bmad/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
- package/_bmad/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/_bmad/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
- package/_bmad/bmm/workflows/document-project/workflow.yaml +28 -0
- package/_bmad/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
- package/_bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/_bmad/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
- package/_bmad/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +90 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +127 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +39 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +130 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +26 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +43 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +141 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +26 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +49 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +241 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +26 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +38 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +133 -0
- package/_bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +26 -0
- package/_bmad/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
- package/_bmad/bmm/workflows/testarch/atdd/checklist.md +374 -0
- package/_bmad/bmm/workflows/testarch/atdd/instructions.md +806 -0
- package/_bmad/bmm/workflows/testarch/atdd/workflow.yaml +45 -0
- package/_bmad/bmm/workflows/testarch/automate/checklist.md +582 -0
- package/_bmad/bmm/workflows/testarch/automate/instructions.md +1324 -0
- package/_bmad/bmm/workflows/testarch/automate/workflow.yaml +52 -0
- package/_bmad/bmm/workflows/testarch/ci/checklist.md +247 -0
- package/_bmad/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -0
- package/_bmad/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -0
- package/_bmad/bmm/workflows/testarch/ci/instructions.md +536 -0
- package/_bmad/bmm/workflows/testarch/ci/workflow.yaml +45 -0
- package/_bmad/bmm/workflows/testarch/framework/checklist.md +320 -0
- package/_bmad/bmm/workflows/testarch/framework/instructions.md +481 -0
- package/_bmad/bmm/workflows/testarch/framework/workflow.yaml +47 -0
- package/_bmad/bmm/workflows/testarch/nfr-assess/checklist.md +407 -0
- package/_bmad/bmm/workflows/testarch/nfr-assess/instructions.md +726 -0
- package/_bmad/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +461 -0
- package/_bmad/bmm/workflows/testarch/nfr-assess/workflow.yaml +47 -0
- package/_bmad/bmm/workflows/testarch/test-design/checklist.md +407 -0
- package/_bmad/bmm/workflows/testarch/test-design/instructions.md +1158 -0
- package/_bmad/bmm/workflows/testarch/test-design/test-design-architecture-template.md +213 -0
- package/_bmad/bmm/workflows/testarch/test-design/test-design-qa-template.md +286 -0
- package/_bmad/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
- package/_bmad/bmm/workflows/testarch/test-design/workflow.yaml +69 -0
- package/_bmad/bmm/workflows/testarch/test-review/checklist.md +472 -0
- package/_bmad/bmm/workflows/testarch/test-review/instructions.md +628 -0
- package/_bmad/bmm/workflows/testarch/test-review/test-review-template.md +390 -0
- package/_bmad/bmm/workflows/testarch/test-review/workflow.yaml +46 -0
- package/_bmad/bmm/workflows/testarch/trace/checklist.md +642 -0
- package/_bmad/bmm/workflows/testarch/trace/instructions.md +1030 -0
- package/_bmad/bmm/workflows/testarch/trace/trace-template.md +675 -0
- package/_bmad/bmm/workflows/testarch/trace/workflow.yaml +55 -0
- package/_bmad/core/agents/bmad-master.md +56 -0
- package/_bmad/core/config.yaml +9 -0
- package/_bmad/core/module-help.csv +9 -0
- package/_bmad/core/resources/excalidraw/README.md +160 -0
- package/_bmad/core/resources/excalidraw/excalidraw-helpers.md +127 -0
- package/_bmad/core/resources/excalidraw/library-loader.md +50 -0
- package/_bmad/core/resources/excalidraw/validate-json-instructions.md +79 -0
- package/_bmad/core/tasks/editorial-review-prose.xml +100 -0
- package/_bmad/core/tasks/editorial-review-structure.xml +209 -0
- package/_bmad/core/tasks/help.md +62 -0
- package/_bmad/core/tasks/index-docs.xml +65 -0
- package/_bmad/core/tasks/review-adversarial-general.xml +48 -0
- package/_bmad/core/tasks/shard-doc.xml +109 -0
- package/_bmad/core/tasks/workflow.xml +235 -0
- package/_bmad/core/workflows/advanced-elicitation/methods.csv +51 -0
- package/_bmad/core/workflows/advanced-elicitation/workflow.xml +117 -0
- package/_bmad/core/workflows/brainstorming/brain-methods.csv +62 -0
- package/_bmad/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
- package/_bmad/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
- package/_bmad/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
- package/_bmad/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
- package/_bmad/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
- package/_bmad/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
- package/_bmad/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
- package/_bmad/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
- package/_bmad/core/workflows/brainstorming/template.md +15 -0
- package/_bmad/core/workflows/brainstorming/workflow.md +58 -0
- package/_bmad/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
- package/_bmad/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/_bmad/core/workflows/party-mode/steps/step-03-graceful-exit.md +157 -0
- package/_bmad/core/workflows/party-mode/workflow.md +194 -0
- package/dist/api/client.d.ts +16 -1
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +91 -5
- package/dist/api/client.js.map +1 -1
- package/dist/api/projects.d.ts +23 -2
- package/dist/api/projects.d.ts.map +1 -1
- package/dist/api/projects.js +32 -0
- package/dist/api/projects.js.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/projects/delete-attachment-from-task.d.ts.map +1 -0
- package/dist/tools/projects/delete-attachment-from-task.js.map +1 -0
- package/dist/tools/projects/delete-attachment.d.ts +55 -0
- package/dist/tools/projects/delete-attachment.d.ts.map +1 -0
- package/dist/tools/projects/delete-attachment.js +115 -0
- package/dist/tools/projects/delete-attachment.js.map +1 -0
- package/dist/tools/projects/download-attachment.d.ts +55 -0
- package/dist/tools/projects/download-attachment.d.ts.map +1 -0
- package/dist/tools/projects/download-attachment.js +153 -0
- package/dist/tools/projects/download-attachment.js.map +1 -0
- package/dist/tools/projects/get-attachment-list.d.ts +48 -0
- package/dist/tools/projects/get-attachment-list.d.ts.map +1 -0
- package/dist/tools/projects/get-attachment-list.js +118 -0
- package/dist/tools/projects/get-attachment-list.js.map +1 -0
- package/dist/tools/projects/get-attachment-metadata.d.ts +55 -0
- package/dist/tools/projects/get-attachment-metadata.d.ts.map +1 -0
- package/dist/tools/projects/get-attachment-metadata.js +120 -0
- package/dist/tools/projects/get-attachment-metadata.js.map +1 -0
- package/dist/tools/projects/register-attachment-to-task.d.ts.map +1 -0
- package/dist/tools/projects/register-attachment-to-task.js.map +1 -0
- package/dist/tools/projects/update-task.d.ts +4 -4
- package/dist/tools/projects/update-task.js +12 -12
- package/dist/tools/projects/update-task.js.map +1 -1
- package/dist/tools/projects/upload-attachment.d.ts +69 -0
- package/dist/tools/projects/upload-attachment.d.ts.map +1 -0
- package/dist/tools/projects/upload-attachment.js +109 -0
- package/dist/tools/projects/upload-attachment.js.map +1 -0
- package/dist/types/dooray-api.d.ts +15 -0
- package/dist/types/dooray-api.d.ts.map +1 -1
- package/docs/architecture.md +227 -0
- package/docs/development-guide.md +336 -0
- package/docs/index.md +115 -0
- package/docs/project-overview.md +105 -0
- package/docs/project-scan-report.json +120 -0
- package/docs/source-tree-analysis.md +240 -0
- package/package.json +1 -1
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
# File Utilities
|
|
2
|
+
|
|
3
|
+
## Principle
|
|
4
|
+
|
|
5
|
+
Read and validate files (CSV, XLSX, PDF, ZIP) with automatic parsing, type-safe results, and download handling. Simplify file operations in Playwright tests with built-in format support and validation helpers.
|
|
6
|
+
|
|
7
|
+
## Rationale
|
|
8
|
+
|
|
9
|
+
Testing file operations in Playwright requires boilerplate:
|
|
10
|
+
|
|
11
|
+
- Manual download handling
|
|
12
|
+
- External parsing libraries for each format
|
|
13
|
+
- No validation helpers
|
|
14
|
+
- Type-unsafe results
|
|
15
|
+
- Repetitive path handling
|
|
16
|
+
|
|
17
|
+
The `file-utils` module provides:
|
|
18
|
+
|
|
19
|
+
- **Auto-parsing**: CSV, XLSX, PDF, ZIP automatically parsed
|
|
20
|
+
- **Download handling**: Single function for UI or API-triggered downloads
|
|
21
|
+
- **Type-safe**: TypeScript interfaces for parsed results
|
|
22
|
+
- **Validation helpers**: Row count, header checks, content validation
|
|
23
|
+
- **Format support**: Multiple sheet support (XLSX), text extraction (PDF), archive extraction (ZIP)
|
|
24
|
+
|
|
25
|
+
## Why Use This Instead of Vanilla Playwright?
|
|
26
|
+
|
|
27
|
+
| Vanilla Playwright | File Utils |
|
|
28
|
+
| ------------------------------------------- | ------------------------------------------------ |
|
|
29
|
+
| ~80 lines per CSV flow (download + parse) | ~10 lines end-to-end |
|
|
30
|
+
| Manual event orchestration for downloads | Encapsulated in `handleDownload()` |
|
|
31
|
+
| Manual path handling and `saveAs` | Returns a ready-to-use file path |
|
|
32
|
+
| Manual existence checks and error handling | Centralized in one place via utility patterns |
|
|
33
|
+
| Manual CSV parsing config (headers, typing) | `readCSV()` returns `{ data, headers }` directly |
|
|
34
|
+
|
|
35
|
+
## Pattern Examples
|
|
36
|
+
|
|
37
|
+
### Example 1: UI-Triggered CSV Download
|
|
38
|
+
|
|
39
|
+
**Context**: User clicks button, CSV downloads, validate contents.
|
|
40
|
+
|
|
41
|
+
**Implementation**:
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
import { handleDownload, readCSV } from '@seontechnologies/playwright-utils/file-utils';
|
|
45
|
+
import path from 'node:path';
|
|
46
|
+
|
|
47
|
+
const DOWNLOAD_DIR = path.join(__dirname, '../downloads');
|
|
48
|
+
|
|
49
|
+
test('should download and validate CSV', async ({ page }) => {
|
|
50
|
+
const downloadPath = await handleDownload({
|
|
51
|
+
page,
|
|
52
|
+
downloadDir: DOWNLOAD_DIR,
|
|
53
|
+
trigger: () => page.getByTestId('download-button-text/csv').click(),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const csvResult = await readCSV({ filePath: downloadPath });
|
|
57
|
+
|
|
58
|
+
// Access parsed data and headers
|
|
59
|
+
const { data, headers } = csvResult.content;
|
|
60
|
+
expect(headers).toEqual(['ID', 'Name', 'Email']);
|
|
61
|
+
expect(data[0]).toMatchObject({
|
|
62
|
+
ID: expect.any(String),
|
|
63
|
+
Name: expect.any(String),
|
|
64
|
+
Email: expect.any(String),
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Key Points**:
|
|
70
|
+
|
|
71
|
+
- `handleDownload` waits for download, returns file path
|
|
72
|
+
- `readCSV` auto-parses to `{ headers, data }`
|
|
73
|
+
- Type-safe access to parsed content
|
|
74
|
+
- Clean up downloads in `afterEach`
|
|
75
|
+
|
|
76
|
+
### Example 2: XLSX with Multiple Sheets
|
|
77
|
+
|
|
78
|
+
**Context**: Excel file with multiple sheets (e.g., Summary, Details, Errors).
|
|
79
|
+
|
|
80
|
+
**Implementation**:
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { readXLSX } from '@seontechnologies/playwright-utils/file-utils';
|
|
84
|
+
|
|
85
|
+
test('should read multi-sheet XLSX', async () => {
|
|
86
|
+
const downloadPath = await handleDownload({
|
|
87
|
+
page,
|
|
88
|
+
downloadDir: DOWNLOAD_DIR,
|
|
89
|
+
trigger: () => page.click('[data-testid="export-xlsx"]'),
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const xlsxResult = await readXLSX({ filePath: downloadPath });
|
|
93
|
+
|
|
94
|
+
// Verify worksheet structure
|
|
95
|
+
expect(xlsxResult.content.worksheets.length).toBeGreaterThan(0);
|
|
96
|
+
const worksheet = xlsxResult.content.worksheets[0];
|
|
97
|
+
expect(worksheet).toBeDefined();
|
|
98
|
+
expect(worksheet).toHaveProperty('name');
|
|
99
|
+
|
|
100
|
+
// Access sheet data
|
|
101
|
+
const sheetData = worksheet?.data;
|
|
102
|
+
expect(Array.isArray(sheetData)).toBe(true);
|
|
103
|
+
|
|
104
|
+
// Use type assertion for type safety
|
|
105
|
+
const firstRow = sheetData![0] as Record<string, unknown>;
|
|
106
|
+
expect(firstRow).toHaveProperty('id');
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Key Points**:
|
|
111
|
+
|
|
112
|
+
- `worksheets` array with `name` and `data` properties
|
|
113
|
+
- Access sheets by name
|
|
114
|
+
- Each sheet has its own headers and data
|
|
115
|
+
- Type-safe sheet iteration
|
|
116
|
+
|
|
117
|
+
### Example 3: PDF Text Extraction
|
|
118
|
+
|
|
119
|
+
**Context**: Validate PDF report contains expected content.
|
|
120
|
+
|
|
121
|
+
**Implementation**:
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
import { readPDF } from '@seontechnologies/playwright-utils/file-utils';
|
|
125
|
+
|
|
126
|
+
test('should validate PDF report', async () => {
|
|
127
|
+
const downloadPath = await handleDownload({
|
|
128
|
+
page,
|
|
129
|
+
downloadDir: DOWNLOAD_DIR,
|
|
130
|
+
trigger: () => page.getByTestId('download-button-Text-based PDF Document').click(),
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const pdfResult = await readPDF({ filePath: downloadPath });
|
|
134
|
+
|
|
135
|
+
// content is extracted text from all pages
|
|
136
|
+
expect(pdfResult.pagesCount).toBe(1);
|
|
137
|
+
expect(pdfResult.fileName).toContain('.pdf');
|
|
138
|
+
expect(pdfResult.content).toContain('All you need is the free Adobe Acrobat Reader');
|
|
139
|
+
});
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**PDF Reader Options:**
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
const result = await readPDF({
|
|
146
|
+
filePath: '/path/to/document.pdf',
|
|
147
|
+
mergePages: false, // Keep pages separate (default: true)
|
|
148
|
+
debug: true, // Enable debug logging
|
|
149
|
+
maxPages: 10, // Limit processing to first 10 pages
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Important Limitation - Vector-based PDFs:**
|
|
154
|
+
|
|
155
|
+
Text extraction may fail for PDFs that store text as vector graphics (e.g., those generated by jsPDF):
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
// Vector-based PDF example (extraction fails gracefully)
|
|
159
|
+
const pdfResult = await readPDF({ filePath: downloadPath });
|
|
160
|
+
|
|
161
|
+
expect(pdfResult.pagesCount).toBe(1);
|
|
162
|
+
expect(pdfResult.info.extractionNotes).toContain(
|
|
163
|
+
'Text extraction from vector-based PDFs is not supported.'
|
|
164
|
+
);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Such PDFs will have:
|
|
168
|
+
|
|
169
|
+
- `textExtractionSuccess: false`
|
|
170
|
+
- `isVectorBased: true`
|
|
171
|
+
- Explanatory message in `extractionNotes`
|
|
172
|
+
|
|
173
|
+
### Example 4: ZIP Archive Validation
|
|
174
|
+
|
|
175
|
+
**Context**: Validate ZIP contains expected files and extract specific file.
|
|
176
|
+
|
|
177
|
+
**Implementation**:
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
import { readZIP } from '@seontechnologies/playwright-utils/file-utils';
|
|
181
|
+
|
|
182
|
+
test('should validate ZIP archive', async () => {
|
|
183
|
+
const downloadPath = await handleDownload({
|
|
184
|
+
page,
|
|
185
|
+
downloadDir: DOWNLOAD_DIR,
|
|
186
|
+
trigger: () => page.click('[data-testid="download-backup"]'),
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const zipResult = await readZIP({ filePath: downloadPath });
|
|
190
|
+
|
|
191
|
+
// Check file list
|
|
192
|
+
expect(Array.isArray(zipResult.content.entries)).toBe(true);
|
|
193
|
+
expect(zipResult.content.entries).toContain(
|
|
194
|
+
'Case_53125_10-19-22_AM/Case_53125_10-19-22_AM_case_data.csv'
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
// Extract specific file
|
|
198
|
+
const targetFile = 'Case_53125_10-19-22_AM/Case_53125_10-19-22_AM_case_data.csv';
|
|
199
|
+
const zipWithExtraction = await readZIP({
|
|
200
|
+
filePath: downloadPath,
|
|
201
|
+
fileToExtract: targetFile,
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// Access extracted file buffer
|
|
205
|
+
const extractedFiles = zipWithExtraction.content.extractedFiles || {};
|
|
206
|
+
const fileBuffer = extractedFiles[targetFile];
|
|
207
|
+
expect(fileBuffer).toBeInstanceOf(Buffer);
|
|
208
|
+
expect(fileBuffer?.length).toBeGreaterThan(0);
|
|
209
|
+
});
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Key Points**:
|
|
213
|
+
|
|
214
|
+
- `content.entries` lists all files in archive
|
|
215
|
+
- `fileToExtract` extracts specific files to Buffer
|
|
216
|
+
- Validate archive structure
|
|
217
|
+
- Read and parse individual files from ZIP
|
|
218
|
+
|
|
219
|
+
### Example 5: API-Triggered Download
|
|
220
|
+
|
|
221
|
+
**Context**: API endpoint returns file download (not UI click).
|
|
222
|
+
|
|
223
|
+
**Implementation**:
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
test('should download via API', async ({ page, request }) => {
|
|
227
|
+
const downloadPath = await handleDownload({
|
|
228
|
+
page, // Still need page for download events
|
|
229
|
+
downloadDir: DOWNLOAD_DIR,
|
|
230
|
+
trigger: async () => {
|
|
231
|
+
const response = await request.get('/api/export/csv', {
|
|
232
|
+
headers: { Authorization: 'Bearer token' },
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
if (!response.ok()) {
|
|
236
|
+
throw new Error(`Export failed: ${response.status()}`);
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
const { content } = await readCSV({ filePath: downloadPath });
|
|
242
|
+
|
|
243
|
+
expect(content.data).toHaveLength(100);
|
|
244
|
+
});
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Key Points**:
|
|
248
|
+
|
|
249
|
+
- `trigger` can be async API call
|
|
250
|
+
- API must return `Content-Disposition` header
|
|
251
|
+
- Still need `page` for download events
|
|
252
|
+
- Works with authenticated endpoints
|
|
253
|
+
|
|
254
|
+
### Example 6: Reading CSV from Buffer (ZIP extraction)
|
|
255
|
+
|
|
256
|
+
**Context**: Read CSV content directly from a Buffer (e.g., extracted from ZIP).
|
|
257
|
+
|
|
258
|
+
**Implementation**:
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// Read from a Buffer (e.g., extracted from a ZIP)
|
|
262
|
+
const zipResult = await readZIP({
|
|
263
|
+
filePath: 'archive.zip',
|
|
264
|
+
fileToExtract: 'data.csv',
|
|
265
|
+
});
|
|
266
|
+
const fileBuffer = zipResult.content.extractedFiles?.['data.csv'];
|
|
267
|
+
const csvFromBuffer = await readCSV({ content: fileBuffer });
|
|
268
|
+
|
|
269
|
+
// Read from a string
|
|
270
|
+
const csvString = 'name,age\nJohn,30\nJane,25';
|
|
271
|
+
const csvFromString = await readCSV({ content: csvString });
|
|
272
|
+
|
|
273
|
+
const { data, headers } = csvFromString.content;
|
|
274
|
+
expect(headers).toContain('name');
|
|
275
|
+
expect(headers).toContain('age');
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## API Reference
|
|
279
|
+
|
|
280
|
+
### CSV Reader Options
|
|
281
|
+
|
|
282
|
+
| Option | Type | Default | Description |
|
|
283
|
+
| -------------- | ------------------ | -------- | -------------------------------------- |
|
|
284
|
+
| `filePath` | `string` | - | Path to CSV file (mutually exclusive) |
|
|
285
|
+
| `content` | `string \| Buffer` | - | Direct content (mutually exclusive) |
|
|
286
|
+
| `delimiter` | `string \| 'auto'` | `','` | Value separator, auto-detect if 'auto' |
|
|
287
|
+
| `encoding` | `string` | `'utf8'` | File encoding |
|
|
288
|
+
| `parseHeaders` | `boolean` | `true` | Use first row as headers |
|
|
289
|
+
| `trim` | `boolean` | `true` | Trim whitespace from values |
|
|
290
|
+
|
|
291
|
+
### XLSX Reader Options
|
|
292
|
+
|
|
293
|
+
| Option | Type | Description |
|
|
294
|
+
| ----------- | -------- | ------------------------------ |
|
|
295
|
+
| `filePath` | `string` | Path to XLSX file |
|
|
296
|
+
| `sheetName` | `string` | Name of sheet to set as active |
|
|
297
|
+
|
|
298
|
+
### PDF Reader Options
|
|
299
|
+
|
|
300
|
+
| Option | Type | Default | Description |
|
|
301
|
+
| ------------ | --------- | ------- | --------------------------- |
|
|
302
|
+
| `filePath` | `string` | - | Path to PDF file (required) |
|
|
303
|
+
| `mergePages` | `boolean` | `true` | Merge text from all pages |
|
|
304
|
+
| `maxPages` | `number` | - | Maximum pages to extract |
|
|
305
|
+
| `debug` | `boolean` | `false` | Enable debug logging |
|
|
306
|
+
|
|
307
|
+
### ZIP Reader Options
|
|
308
|
+
|
|
309
|
+
| Option | Type | Description |
|
|
310
|
+
| --------------- | -------- | ---------------------------------- |
|
|
311
|
+
| `filePath` | `string` | Path to ZIP file |
|
|
312
|
+
| `fileToExtract` | `string` | Specific file to extract to Buffer |
|
|
313
|
+
|
|
314
|
+
### Return Values
|
|
315
|
+
|
|
316
|
+
#### CSV Reader Return Value
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
{
|
|
320
|
+
content: {
|
|
321
|
+
data: Array<Array<string | number>>, // Parsed rows (excludes header row if parseHeaders: true)
|
|
322
|
+
headers: string[] | null // Column headers (null if parseHeaders: false)
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
#### XLSX Reader Return Value
|
|
328
|
+
|
|
329
|
+
```typescript
|
|
330
|
+
{
|
|
331
|
+
content: {
|
|
332
|
+
worksheets: Array<{
|
|
333
|
+
name: string, // Sheet name
|
|
334
|
+
rows: Array<Array<any>>, // All rows including headers
|
|
335
|
+
headers?: string[] // First row as headers (if present)
|
|
336
|
+
}>
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
#### PDF Reader Return Value
|
|
342
|
+
|
|
343
|
+
```typescript
|
|
344
|
+
{
|
|
345
|
+
content: string, // Extracted text (merged or per-page based on mergePages)
|
|
346
|
+
pagesCount: number, // Total pages in PDF
|
|
347
|
+
fileName?: string, // Original filename if available
|
|
348
|
+
info?: Record<string, any> // PDF metadata (author, title, etc.)
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
> **Note**: When `mergePages: false`, `content` is an array of strings (one per page). When `maxPages` is set, only that many pages are extracted.
|
|
353
|
+
|
|
354
|
+
#### ZIP Reader Return Value
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
{
|
|
358
|
+
content: {
|
|
359
|
+
entries: Array<{
|
|
360
|
+
name: string, // File/directory path within ZIP
|
|
361
|
+
size: number, // Uncompressed size in bytes
|
|
362
|
+
isDirectory: boolean // True for directories
|
|
363
|
+
}>,
|
|
364
|
+
extractedFiles: Record<string, Buffer | string> // Extracted file contents by path
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
> **Note**: When `fileToExtract` is specified, only that file appears in `extractedFiles`.
|
|
370
|
+
|
|
371
|
+
## Download Cleanup Pattern
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
test.afterEach(async () => {
|
|
375
|
+
// Clean up downloaded files
|
|
376
|
+
await fs.remove(DOWNLOAD_DIR);
|
|
377
|
+
});
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
## Comparison with Vanilla Playwright
|
|
381
|
+
|
|
382
|
+
Vanilla Playwright (real test) snippet:
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
// ~80 lines of boilerplate!
|
|
386
|
+
const [download] = await Promise.all([
|
|
387
|
+
page.waitForEvent('download'),
|
|
388
|
+
page.getByTestId('download-button-CSV Export').click(),
|
|
389
|
+
]);
|
|
390
|
+
|
|
391
|
+
const failure = await download.failure();
|
|
392
|
+
expect(failure).toBeNull();
|
|
393
|
+
|
|
394
|
+
const filePath = testInfo.outputPath(download.suggestedFilename());
|
|
395
|
+
await download.saveAs(filePath);
|
|
396
|
+
|
|
397
|
+
await expect
|
|
398
|
+
.poll(
|
|
399
|
+
async () => {
|
|
400
|
+
try {
|
|
401
|
+
await fs.access(filePath);
|
|
402
|
+
return true;
|
|
403
|
+
} catch {
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
{ timeout: 5000, intervals: [100, 200, 500] }
|
|
408
|
+
)
|
|
409
|
+
.toBe(true);
|
|
410
|
+
|
|
411
|
+
const csvContent = await fs.readFile(filePath, 'utf-8');
|
|
412
|
+
|
|
413
|
+
const parseResult = parse(csvContent, {
|
|
414
|
+
header: true,
|
|
415
|
+
skipEmptyLines: true,
|
|
416
|
+
dynamicTyping: true,
|
|
417
|
+
transformHeader: (header: string) => header.trim(),
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
if (parseResult.errors.length > 0) {
|
|
421
|
+
throw new Error(`CSV parsing errors: ${JSON.stringify(parseResult.errors)}`);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const data = parseResult.data as Array<Record<string, unknown>>;
|
|
425
|
+
const headers = parseResult.meta.fields || [];
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
With File Utils, the same flow becomes:
|
|
429
|
+
|
|
430
|
+
```typescript
|
|
431
|
+
const downloadPath = await handleDownload({
|
|
432
|
+
page,
|
|
433
|
+
downloadDir: DOWNLOAD_DIR,
|
|
434
|
+
trigger: () => page.getByTestId('download-button-text/csv').click(),
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
const { data, headers } = (await readCSV({ filePath: downloadPath })).content;
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
## Related Fragments
|
|
441
|
+
|
|
442
|
+
- `overview.md` - Installation and imports
|
|
443
|
+
- `api-request.md` - API-triggered downloads
|
|
444
|
+
- `recurse.md` - Poll for file generation completion
|
|
445
|
+
|
|
446
|
+
## Anti-Patterns
|
|
447
|
+
|
|
448
|
+
**DON'T leave downloads in place:**
|
|
449
|
+
|
|
450
|
+
```typescript
|
|
451
|
+
test('creates file', async () => {
|
|
452
|
+
await handleDownload({ ... })
|
|
453
|
+
// File left in downloads folder
|
|
454
|
+
})
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
**DO clean up after tests:**
|
|
458
|
+
|
|
459
|
+
```typescript
|
|
460
|
+
test.afterEach(async () => {
|
|
461
|
+
await fs.remove(DOWNLOAD_DIR);
|
|
462
|
+
});
|
|
463
|
+
```
|