From 2e16650067f0a12751a95ff22a4277f74b0c4f10 Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Tue, 6 Jan 2026 22:42:15 -0800 Subject: [PATCH] feat(docs): Diataxis restructure + Astro/Starlight migration (#1263) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(docs): add Diataxis folder structure and update sidebar styling - Create tutorials, how-to, explanation, reference directories with subdirectories - Add index.md files for each main Diataxis section - Update homepage with Diataxis card navigation layout - Implement clean React Native-inspired sidebar styling - Convert sidebar to autogenerated for both Diataxis and legacy sections - Update docusaurus config with dark mode default and navbar changes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(docs): migrate Phase 1 files to Diataxis structure Move 21 files to new locations: - Tutorials: quick-start guides, agent creation guide - How-To: installation, customization, workflows - Explanation: core concepts, features, game-dev, builder - Reference: merged glossary from BMM and BMGD Also: - Copy images to new locations - Update internal links via migration script (73 links updated) - Build verified successfully 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(docs): add category labels for sidebar folders Add _category_.json files to control display labels and position for autogenerated sidebar categories. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * style(docs): improve welcome page and visual styling - Rewrite index.md with React Native-inspired welcoming layout - Add Diataxis section cards with descriptions - Remove sidebar separator, add spacing instead - Increase navbar padding with responsive breakpoints - Add rounded admonitions without left border bar - Use system font stack for better readability - Add lighter chevron styling in sidebar - Constrain max-width to 1600px for wide viewports 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix: use baseUrl in meta tag paths for correct deployment URLs * feat(docs): complete Phase 2 - split files and fix broken links Phase 2 of Diataxis migration: - Split 16 large legacy files into 42+ focused documents - Created FAQ section with 7 topic-specific files - Created brownfield how-to guides (3 files) - Created workflow how-to guides (15+ files) - Created architecture explanation files (3 files) - Created TEA/testing explanation files - Moved remaining legacy module files to proper Diataxis locations Link fixes: - Fixed ~50 broken internal links across documentation - Updated relative paths for new file locations - Created missing index files for installation, advanced tutorials - Simplified TOC anchors to fix Docusaurus warnings Cleanup: - Removed legacy sidebar entries for deleted folders - Deleted duplicate and empty placeholder files - Moved workflow diagram assets to tutorials/images 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(build): use file glob instead of sidebar parsing for llms-full.txt Replace brittle sidebar.js regex parsing with recursive file glob. The old approach captured non-file strings like 'autogenerated' and category labels, resulting in only 5 files being processed. Now correctly processes all 86+ markdown files (~95k tokens). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(seo): use absolute URLs in AI meta tags for agent discoverability AI web-browsing agents couldn't follow relative paths in meta tags due to URL security restrictions. Changed llms-full.txt and llms.txt meta tag URLs from relative (baseUrl) to absolute (urlParts.origin + baseUrl). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * refactor(docs): recategorize misplaced files per Diataxis analysis Phase 2.5 categorization fixes based on post-migration analysis: Moved to correct Diataxis categories: - tutorials/installation.md → deleted (duplicate of how-to/install-bmad.md) - tutorials/brownfield-onboarding.md → how-to/brownfield/index.md - reference/faq/* (8 files) → explanation/faq/ - reference/agents/barry-quick-flow.md → explanation/agents/ - reference/agents/bmgd-agents.md → explanation/game-dev/agents.md Created: - explanation/agents/index.md Fixed all broken internal links (14 total) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(docs): add Getting Started tutorial and simplify build script - Add comprehensive Getting Started tutorial with installation as Step 1 - Simplify build-docs.js to read directly from docs/ (no consolidation) - Remove backup/restore dance that could corrupt docs folder on build failure - Remove ~150 lines of unused consolidation code 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(css): use fixed width layout to prevent content shifting Apply React Native docs approach: set both width and max-width at largest breakpoint (1400px) so content area maintains consistent size regardless of content length. Switches to fluid 100% below 1416px breakpoint. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * refactor(docs): restructure tutorials with renamed entry point - Rename index.md to bmad-tutorial.md for clearer navigation - Remove redundant tutorials/index.md - Update sidebar and config references 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(docs): add tutorial style guide and AI agent announcement bar - Add docs/_contributing/ with tutorial style guide - Reformat quick-start-bmm.md and bmad-tutorial.md per style guide - Remove horizontal separators, add strategic admonitions - Add persistent announcement bar for AI agents directing to llms-full.txt - Fix footer broken link to tutorials 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(docs): add markdown demo page and UI refinements - Add comprehensive markdown-demo.md for style testing - Remove doc category links from navbar (use sidebar instead) - Remove card buttons from welcome page - Add dark mode styling for announcement bar - Clean up index.md card layout 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(docs): apply unified tutorial style and update references - Reformat create-custom-agent.md to follow tutorial style guide - Update tutorial-style.md with complete unified structure - Update all internal references to renamed tutorial files - Remove obsolete advanced/index.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * refactor(docs): migrate from Docusaurus to Astro+Starlight Replace Docusaurus with Astro and the Starlight documentation theme for improved performance, better customization, and modern tooling. Build pipeline changes: - New build-docs.js orchestrates link checking, artifact generation, and Astro build in sequence - Add check-doc-links.js for validating internal links and anchors - Generate llms.txt and llms-full.txt for LLM-friendly documentation - Create downloadable source bundles (bmad-sources.zip, bmad-prompts.zip) - Suppress MODULE_TYPELESS_PACKAGE_JSON warning in Astro build - Output directly to build/site for cleaner deployment Website architecture: - Add rehype-markdown-links.js plugin to transform .md links to routes - Add site-url.js helper for GitHub Pages URL resolution with strict validation (throws on invalid GITHUB_REPOSITORY format) - Custom Astro components: Banner, Header, MobileMenuFooter - Symlink docs/ into website/src/content/docs for Starlight Documentation cleanup: - Remove Docusaurus _category_.json files (Starlight uses frontmatter) - Convert all docs to use YAML frontmatter with title field - Move downloads.md from website/src/pages to docs/ - Consolidate style guide and workflow diagram docs - Add 404.md and tutorials/index.md --------- Co-authored-by: forcetrainer Co-authored-by: Claude Opus 4.5 --- .github/workflows/docs.yaml | 15 +- .gitignore | 5 +- docs/404.md | 9 + ...README.md => _README_WORKFLOW_DIAGRAMS.md} | 5 +- docs/_STYLE_GUIDE.md | 309 + docs/bmad-core-concepts/index.md | 37 - docs/bmad-core-concepts/installing/index.md | 77 - {website/src/pages => docs}/downloads.md | 22 +- .../agents/barry-quick-flow.md} | 15 +- docs/explanation/agents/index.md | 28 + docs/explanation/architecture/four-phases.md | 126 + .../preventing-agent-conflicts.md | 138 + .../architecture/why-solutioning-matters.md | 91 + .../bmad-builder/custom-content-types.md} | 31 +- docs/explanation/bmad-builder/index.md | 66 + .../bmm}/index.md | 47 +- docs/explanation/core-concepts/agent-roles.md | 204 + docs/explanation/core-concepts/index.md | 40 + .../core-concepts/what-are-agents.md} | 11 +- .../core-concepts/what-are-modules.md} | 9 +- .../core-concepts/what-are-workflows.md} | 5 +- docs/explanation/core/index.md | 18 + .../creative-intelligence}/index.md | 80 +- docs/explanation/faq/brownfield-faq.md | 80 + docs/explanation/faq/getting-started-faq.md | 66 + docs/explanation/faq/implementation-faq.md | 56 + docs/explanation/faq/index.md | 17 + docs/explanation/faq/levels-and-tracks-faq.md | 58 + docs/explanation/faq/planning-faq.md | 47 + docs/explanation/faq/tools-faq.md | 248 + docs/explanation/faq/workflows-faq.md | 68 + .../features}/advanced-elicitation.md | 5 +- .../features/brainstorming-techniques.md} | 5 +- .../features}/party-mode.md | 16 +- docs/explanation/features/quick-flow.md | 169 + docs/explanation/features/tea-overview.md | 218 + .../features/web-bundles.md} | 5 +- .../game-dev/agents.md} | 11 +- docs/explanation/game-dev/bmgd-vs-bmm.md | 150 + .../game-dev/game-types.md} | 11 +- docs/explanation/game-dev/index.md | 85 + docs/explanation/index.md | 35 + .../facilitation-over-generation.md | 121 + .../brownfield/add-feature-to-existing.md | 91 + .../brownfield/document-existing-project.md | 84 + .../brownfield/index.md} | 52 +- .../brownfield/quick-fix-in-brownfield.md | 94 + .../customization/customize-agents.md} | 16 +- .../customization/customize-workflows.md} | 9 +- .../customization}/index.md | 11 +- .../customization/shard-large-documents.md} | 26 +- .../customization/vendor-workflows.md} | 5 +- docs/how-to/index.md | 34 + docs/how-to/installation/index.md | 15 + docs/how-to/installation/install-bmad.md | 138 + .../installation/install-custom-modules.md} | 9 +- .../installation/upgrade-to-v6.md} | 7 +- .../troubleshooting/bmgd-troubleshooting.md} | 12 +- .../workflows/bmgd-quick-flow.md} | 11 +- docs/how-to/workflows/conduct-research.md | 130 + docs/how-to/workflows/create-architecture.md | 147 + .../workflows/create-epics-and-stories.md | 136 + docs/how-to/workflows/create-prd.md | 130 + docs/how-to/workflows/create-product-brief.md | 117 + docs/how-to/workflows/create-story.md | 119 + docs/how-to/workflows/create-tech-spec.md | 159 + docs/how-to/workflows/create-ux-design.md | 117 + docs/how-to/workflows/implement-story.md | 127 + .../workflows/run-brainstorming-session.md | 94 + docs/how-to/workflows/run-code-review.md | 141 + .../workflows/run-implementation-readiness.md | 162 + docs/how-to/workflows/run-sprint-planning.md | 111 + docs/how-to/workflows/run-test-design.md | 128 + docs/how-to/workflows/setup-party-mode.md | 117 + docs/how-to/workflows/setup-test-framework.md | 113 + docs/index.md | 120 +- .../bmb-bmad-builder/agent-creation-guide.md | 159 - docs/modules/bmb-bmad-builder/index.md | 60 - docs/modules/bmgd-bmad-game-dev/glossary.md | 293 - docs/modules/bmgd-bmad-game-dev/index.md | 175 - .../modules/bmgd-bmad-game-dev/quick-start.md | 250 - .../bmm-bmad-method/bmad-quick-flow.md | 506 - docs/modules/bmm-bmad-method/faq.md | 540 - .../bmm-bmad-method/quick-spec-flow.md | 622 - docs/modules/bmm-bmad-method/quick-start.md | 381 - .../bmm-bmad-method/test-architecture.md | 486 - .../bmm-bmad-method/troubleshooting.md | 3 - .../bmm-bmad-method/workflows-analysis.md | 199 - .../workflows-implementation.md | 211 - .../bmm-bmad-method/workflows-planning.md | 89 - .../bmm-bmad-method/workflows-solutioning.md | 509 - docs/modules/core/index.md | 15 - docs/modules/core/party-mode.md | 50 - .../agents/index.md} | 73 +- .../configuration}/core-tasks.md | 5 +- .../configuration/global-config.md} | 5 +- .../glossary/index.md} | 110 +- docs/reference/index.md | 26 + .../workflows/bmgd-workflows.md} | 17 +- .../workflows}/core-workflows.md | 11 +- .../workflows/document-project.md} | 9 +- docs/reference/workflows/index.md | 16 + .../tutorials/advanced/create-custom-agent.md | 171 + .../getting-started/getting-started-bmadv4.md | 247 + .../getting-started/getting-started-bmadv6.md | 247 + .../workflow-method-greenfield.excalidraw | 0 .../images/workflow-method-greenfield.svg | 0 .../images}/workflow-overview.jpg | Bin .../getting-started/quick-start-bmgd.md | 260 + .../getting-started/workflow-overview.jpg | Bin 0 -> 205271 bytes docs/tutorials/index.md | 21 + eslint.config.mjs | 4 +- package-lock.json | 19408 ++++------------ package.json | 17 +- src/modules/cis/module.yaml | 1 + tools/build-docs.js | 470 +- tools/check-doc-links.js | 282 + website/README.md | 76 + website/astro.config.mjs | 125 + website/css/custom.css | 52 - website/docusaurus.config.js | 179 - website/{static => public}/favicon.ico | Bin website/{static => public}/img/logo.svg | 0 website/{static => public}/robots.txt | 0 website/sidebars.js | 134 - website/src/components/Banner.astro | 59 + website/src/components/Header.astro | 121 + website/src/components/MobileMenuFooter.astro | 53 + website/src/content/config.ts | 6 + website/src/content/docs | 1 + website/src/lib/site-url.js | 25 + website/src/pages/index.js | 50 - website/src/rehype-markdown-links.js | 88 + website/src/styles/custom.css | 483 + 134 files changed, 12848 insertions(+), 20193 deletions(-) create mode 100644 docs/404.md rename docs/{modules/bmm-bmad-method/images/README.md => _README_WORKFLOW_DIAGRAMS.md} (95%) create mode 100644 docs/_STYLE_GUIDE.md delete mode 100644 docs/bmad-core-concepts/index.md delete mode 100644 docs/bmad-core-concepts/installing/index.md rename {website/src/pages => docs}/downloads.md (75%) rename docs/{modules/bmm-bmad-method/quick-flow-solo-dev.md => explanation/agents/barry-quick-flow.md} (95%) create mode 100644 docs/explanation/agents/index.md create mode 100644 docs/explanation/architecture/four-phases.md create mode 100644 docs/explanation/architecture/preventing-agent-conflicts.md create mode 100644 docs/explanation/architecture/why-solutioning-matters.md rename docs/{modules/bmb-bmad-builder/custom-content.md => explanation/bmad-builder/custom-content-types.md} (86%) create mode 100644 docs/explanation/bmad-builder/index.md rename docs/{modules/bmm-bmad-method => explanation/bmm}/index.md (64%) create mode 100644 docs/explanation/core-concepts/agent-roles.md create mode 100644 docs/explanation/core-concepts/index.md rename docs/{bmad-core-concepts/agents.md => explanation/core-concepts/what-are-agents.md} (83%) rename docs/{bmad-core-concepts/modules.md => explanation/core-concepts/what-are-modules.md} (89%) rename docs/{bmad-core-concepts/workflows.md => explanation/core-concepts/what-are-workflows.md} (99%) create mode 100644 docs/explanation/core/index.md rename docs/{modules/cis-creative-intelligence-suite => explanation/creative-intelligence}/index.md (61%) create mode 100644 docs/explanation/faq/brownfield-faq.md create mode 100644 docs/explanation/faq/getting-started-faq.md create mode 100644 docs/explanation/faq/implementation-faq.md create mode 100644 docs/explanation/faq/index.md create mode 100644 docs/explanation/faq/levels-and-tracks-faq.md create mode 100644 docs/explanation/faq/planning-faq.md create mode 100644 docs/explanation/faq/tools-faq.md create mode 100644 docs/explanation/faq/workflows-faq.md rename docs/{modules/core => explanation/features}/advanced-elicitation.md (99%) rename docs/{modules/core/brainstorming.md => explanation/features/brainstorming-techniques.md} (99%) rename docs/{modules/bmm-bmad-method => explanation/features}/party-mode.md (92%) create mode 100644 docs/explanation/features/quick-flow.md create mode 100644 docs/explanation/features/tea-overview.md rename docs/{bmad-core-concepts/web-bundles/index.md => explanation/features/web-bundles.md} (97%) rename docs/{modules/bmgd-bmad-game-dev/agents-guide.md => explanation/game-dev/agents.md} (97%) create mode 100644 docs/explanation/game-dev/bmgd-vs-bmm.md rename docs/{modules/bmgd-bmad-game-dev/game-types-guide.md => explanation/game-dev/game-types.md} (96%) create mode 100644 docs/explanation/game-dev/index.md create mode 100644 docs/explanation/index.md create mode 100644 docs/explanation/philosophy/facilitation-over-generation.md create mode 100644 docs/how-to/brownfield/add-feature-to-existing.md create mode 100644 docs/how-to/brownfield/document-existing-project.md rename docs/{modules/bmm-bmad-method/brownfield-guide.md => how-to/brownfield/index.md} (61%) create mode 100644 docs/how-to/brownfield/quick-fix-in-brownfield.md rename docs/{bmad-core-concepts/bmad-customization/agents.md => how-to/customization/customize-agents.md} (90%) rename docs/{bmad-core-concepts/bmad-customization/workflows.md => how-to/customization/customize-workflows.md} (88%) rename docs/{bmad-core-concepts/bmad-customization => how-to/customization}/index.md (60%) rename docs/{modules/core/document-sharding-guide.md => how-to/customization/shard-large-documents.md} (81%) rename docs/{modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance.md => how-to/customization/vendor-workflows.md} (97%) create mode 100644 docs/how-to/index.md create mode 100644 docs/how-to/installation/index.md create mode 100644 docs/how-to/installation/install-bmad.md rename docs/{modules/bmb-bmad-builder/custom-content-installation.md => how-to/installation/install-custom-modules.md} (95%) rename docs/{bmad-core-concepts/installing/upgrading.md => how-to/installation/upgrade-to-v6.md} (98%) rename docs/{modules/bmgd-bmad-game-dev/troubleshooting.md => how-to/troubleshooting/bmgd-troubleshooting.md} (95%) rename docs/{modules/bmgd-bmad-game-dev/quick-flow-guide.md => how-to/workflows/bmgd-quick-flow.md} (95%) create mode 100644 docs/how-to/workflows/conduct-research.md create mode 100644 docs/how-to/workflows/create-architecture.md create mode 100644 docs/how-to/workflows/create-epics-and-stories.md create mode 100644 docs/how-to/workflows/create-prd.md create mode 100644 docs/how-to/workflows/create-product-brief.md create mode 100644 docs/how-to/workflows/create-story.md create mode 100644 docs/how-to/workflows/create-tech-spec.md create mode 100644 docs/how-to/workflows/create-ux-design.md create mode 100644 docs/how-to/workflows/implement-story.md create mode 100644 docs/how-to/workflows/run-brainstorming-session.md create mode 100644 docs/how-to/workflows/run-code-review.md create mode 100644 docs/how-to/workflows/run-implementation-readiness.md create mode 100644 docs/how-to/workflows/run-sprint-planning.md create mode 100644 docs/how-to/workflows/run-test-design.md create mode 100644 docs/how-to/workflows/setup-party-mode.md create mode 100644 docs/how-to/workflows/setup-test-framework.md delete mode 100644 docs/modules/bmb-bmad-builder/agent-creation-guide.md delete mode 100644 docs/modules/bmb-bmad-builder/index.md delete mode 100644 docs/modules/bmgd-bmad-game-dev/glossary.md delete mode 100644 docs/modules/bmgd-bmad-game-dev/index.md delete mode 100644 docs/modules/bmgd-bmad-game-dev/quick-start.md delete mode 100644 docs/modules/bmm-bmad-method/bmad-quick-flow.md delete mode 100644 docs/modules/bmm-bmad-method/faq.md delete mode 100644 docs/modules/bmm-bmad-method/quick-spec-flow.md delete mode 100644 docs/modules/bmm-bmad-method/quick-start.md delete mode 100644 docs/modules/bmm-bmad-method/test-architecture.md delete mode 100644 docs/modules/bmm-bmad-method/troubleshooting.md delete mode 100644 docs/modules/bmm-bmad-method/workflows-analysis.md delete mode 100644 docs/modules/bmm-bmad-method/workflows-implementation.md delete mode 100644 docs/modules/bmm-bmad-method/workflows-planning.md delete mode 100644 docs/modules/bmm-bmad-method/workflows-solutioning.md delete mode 100644 docs/modules/core/index.md delete mode 100644 docs/modules/core/party-mode.md rename docs/{modules/bmm-bmad-method/agents-guide.md => reference/agents/index.md} (71%) rename docs/{modules/core => reference/configuration}/core-tasks.md (99%) rename docs/{modules/core/global-core-config.md => reference/configuration/global-config.md} (95%) rename docs/{modules/bmm-bmad-method/glossary.md => reference/glossary/index.md} (81%) create mode 100644 docs/reference/index.md rename docs/{modules/bmgd-bmad-game-dev/workflows-guide.md => reference/workflows/bmgd-workflows.md} (94%) rename docs/{modules/core => reference/workflows}/core-workflows.md (86%) rename docs/{modules/bmm-bmad-method/workflow-document-project-reference.md => reference/workflows/document-project.md} (90%) create mode 100644 docs/reference/workflows/index.md create mode 100644 docs/tutorials/advanced/create-custom-agent.md create mode 100644 docs/tutorials/getting-started/getting-started-bmadv4.md create mode 100644 docs/tutorials/getting-started/getting-started-bmadv6.md rename docs/{modules/bmm-bmad-method => tutorials/getting-started}/images/workflow-method-greenfield.excalidraw (100%) rename docs/{modules/bmm-bmad-method => tutorials/getting-started}/images/workflow-method-greenfield.svg (100%) rename docs/{modules/bmgd-bmad-game-dev => tutorials/getting-started/images}/workflow-overview.jpg (100%) create mode 100644 docs/tutorials/getting-started/quick-start-bmgd.md create mode 100644 docs/tutorials/getting-started/workflow-overview.jpg create mode 100644 docs/tutorials/index.md create mode 100644 tools/check-doc-links.js create mode 100644 website/README.md create mode 100644 website/astro.config.mjs delete mode 100644 website/css/custom.css delete mode 100644 website/docusaurus.config.js rename website/{static => public}/favicon.ico (100%) rename website/{static => public}/img/logo.svg (100%) rename website/{static => public}/robots.txt (100%) delete mode 100644 website/sidebars.js create mode 100644 website/src/components/Banner.astro create mode 100644 website/src/components/Header.astro create mode 100644 website/src/components/MobileMenuFooter.astro create mode 100644 website/src/content/config.ts create mode 120000 website/src/content/docs create mode 100644 website/src/lib/site-url.js delete mode 100644 website/src/pages/index.js create mode 100644 website/src/rehype-markdown-links.js create mode 100644 website/src/styles/custom.css diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 741fc9ca..7e5de881 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -39,20 +39,11 @@ jobs: - name: Install dependencies run: npm ci - - name: Determine site URL - id: site-url - run: | - if [ "${{ github.repository }}" = "bmad-code-org/BMAD-METHOD" ]; then - echo "url=https://bmad-code-org.github.io/BMAD-METHOD" >> $GITHUB_OUTPUT - else - OWNER="${{ github.repository_owner }}" - REPO="${{ github.event.repository.name }}" - echo "url=https://${OWNER}.github.io/${REPO}" >> $GITHUB_OUTPUT - fi - - name: Build documentation env: - SITE_URL: ${{ steps.site-url.outputs.url }} + # Override site URL from GitHub repo variable if set + # Otherwise, astro.config.mjs will compute from GITHUB_REPOSITORY + SITE_URL: ${{ vars.SITE_URL }} run: npm run docs:build - name: Upload artifact diff --git a/.gitignore b/.gitignore index a25ea7ec..c644f148 100644 --- a/.gitignore +++ b/.gitignore @@ -75,6 +75,7 @@ _bmad-output bmad-custom-src/ -# Docusaurus / Documentation Build -.docusaurus/ +# Astro / Documentation Build +website/.astro/ +website/dist/ build/ diff --git a/docs/404.md b/docs/404.md new file mode 100644 index 00000000..11b7c223 --- /dev/null +++ b/docs/404.md @@ -0,0 +1,9 @@ +--- +title: Page Not Found +template: splash +--- + + +The page you're looking for doesn't exist or has been moved. + +[Return to Home](/) diff --git a/docs/modules/bmm-bmad-method/images/README.md b/docs/_README_WORKFLOW_DIAGRAMS.md similarity index 95% rename from docs/modules/bmm-bmad-method/images/README.md rename to docs/_README_WORKFLOW_DIAGRAMS.md index 8e34ebbd..8e61bc94 100644 --- a/docs/modules/bmm-bmad-method/images/README.md +++ b/docs/_README_WORKFLOW_DIAGRAMS.md @@ -1,4 +1,7 @@ -# Workflow Diagram Maintenance +--- +title: "Workflow Diagram Maintenance" +--- + ## Regenerating SVG from Excalidraw diff --git a/docs/_STYLE_GUIDE.md b/docs/_STYLE_GUIDE.md new file mode 100644 index 00000000..85f46fe5 --- /dev/null +++ b/docs/_STYLE_GUIDE.md @@ -0,0 +1,309 @@ +# Documentation Style Guide + +Internal guidelines for maintaining consistent, high-quality documentation across the BMAD Method project. This document is not included in the Starlight sidebar — it's for contributors and maintainers, not end users. + +## Quick Principles + +1. **Clarity over brevity** — Be concise, but never at the cost of understanding +2. **Consistent structure** — Follow established patterns so readers know what to expect +3. **Strategic visuals** — Use admonitions, tables, and diagrams purposefully +4. **Scannable content** — Headers, lists, and callouts help readers find what they need + +## Tutorial Structure + +Every tutorial should follow this structure: + +``` +1. Title + Hook (1-2 sentences describing the outcome) +2. Version/Module Notice (info or warning admonition as appropriate) +3. What You'll Learn (bullet list of outcomes) +4. Prerequisites (info admonition) +5. Quick Path (tip admonition - TL;DR summary) +6. Understanding [Topic] (context before steps - tables for phases/agents) +7. Installation (if applicable) +8. Step 1: [First Major Task] +9. Step 2: [Second Major Task] +10. Step 3: [Third Major Task] +11. What You've Accomplished (summary + folder structure if applicable) +12. Quick Reference (commands table) +13. Common Questions (FAQ format) +14. Getting Help (community links) +15. Key Takeaways (tip admonition - memorable points) +``` + +Not all sections are required for every tutorial, but this is the standard flow. + +## Visual Hierarchy + +### Avoid + +| Pattern | Problem | +|---------|---------| +| `---` horizontal rules | Fragment the reading flow | +| `####` deep headers | Create visual noise | +| **Important:** bold paragraphs | Blend into body text | +| Deeply nested lists | Hard to scan | +| Code blocks for non-code | Confusing semantics | + +### Use Instead + +| Pattern | When to Use | +|---------|-------------| +| White space + section headers | Natural content separation | +| Bold text within paragraphs | Inline emphasis | +| Admonitions | Callouts that need attention | +| Tables | Structured comparisons | +| Flat lists | Scannable options | + +## Admonitions + +Use Starlight admonitions strategically: + +```md +:::tip[Title] +Shortcuts, best practices, "pro tips" +::: + +:::note[Title] +Context, definitions, examples, prerequisites +::: + +:::caution[Title] +Caveats, potential issues, things to watch out for +::: + +:::danger[Title] +Critical warnings only — data loss, security issues +::: +``` + +### Standard Admonition Uses + +| Admonition | Standard Use in Tutorials | +|------------|---------------------------| +| `:::note[Prerequisites]` | What users need before starting | +| `:::tip[Quick Path]` | TL;DR summary at top of tutorial | +| `:::caution[Fresh Chats]` | Context limitation reminders | +| `:::note[Example]` | Command/response examples | +| `:::tip[Check Your Status]` | How to verify progress | +| `:::tip[Remember These]` | Key takeaways at end | + +### Admonition Guidelines + +- **Always include a title** for tip, info, and warning +- **Keep content brief** — 1-3 sentences ideal +- **Don't overuse** — More than 3-4 per major section feels noisy +- **Don't nest** — Admonitions inside admonitions are hard to read + +## Headers + +### Budget + +- **8-12 `##` sections** for full tutorials following standard structure +- **2-3 `###` subsections** per `##` section maximum +- **Avoid `####` entirely** — use bold text or admonitions instead + +### Naming + +- Use action verbs for steps: "Install BMad", "Create Your Plan" +- Use nouns for reference sections: "Common Questions", "Quick Reference" +- Keep headers short and scannable + +## Code Blocks + +### Do + +```md +```bash +npx bmad-method install +``` +``` + +### Don't + +````md +``` +You: Do something +Agent: [Response here] +``` +```` + +For command/response examples, use an admonition instead: + +```md +:::note[Example] +Run `workflow-status` and the agent will tell you the next recommended workflow. +::: +``` + +## Tables + +Use tables for: +- Phases and what happens in each +- Agent roles and when to use them +- Command references +- Comparing options +- Step sequences with multiple attributes + +Keep tables simple: +- 2-4 columns maximum +- Short cell content +- Left-align text, right-align numbers + +### Standard Tables + +**Phases Table:** +```md +| Phase | Name | What Happens | +|-------|------|--------------| +| 1 | Analysis | Brainstorm, research *(optional)* | +| 2 | Planning | Requirements — PRD or tech-spec *(required)* | +``` + +**Quick Reference Table:** +```md +| Command | Agent | Purpose | +|---------|-------|---------| +| `*workflow-init` | Analyst | Initialize a new project | +| `*prd` | PM | Create Product Requirements Document | +``` + +**Build Cycle Table:** +```md +| Step | Agent | Workflow | Purpose | +|------|-------|----------|---------| +| 1 | SM | `create-story` | Create story file from epic | +| 2 | DEV | `dev-story` | Implement the story | +``` + +## Lists + +### Flat Lists (Preferred) + +```md +- **Option A** — Description of option A +- **Option B** — Description of option B +- **Option C** — Description of option C +``` + +### Numbered Steps + +```md +1. Load the **PM agent** in a new chat +2. Run the PRD workflow: `*prd` +3. Output: `PRD.md` +``` + +### Avoid Deep Nesting + +```md + +1. First step + - Sub-step A + - Detail 1 + - Detail 2 + - Sub-step B +2. Second step +``` + +Instead, break into separate sections or use an admonition for context. + +## Links + +- Use descriptive link text: `[Tutorial Style Guide](./tutorial-style.md)` +- Avoid "click here" or bare URLs +- Prefer relative paths within docs + +## Images + +- Always include alt text +- Add a caption in italics below: `*Description of the image.*` +- Use SVG for diagrams when possible +- Store in `./images/` relative to the document + +## FAQ Sections + +Format as bold question followed by answer paragraph: + +```md +**Do I always need architecture?** +Only for BMad Method and Enterprise tracks. Quick Flow skips to implementation. + +**Can I change my plan later?** +Yes. The SM agent has a `correct-course` workflow for handling scope changes. +``` + +## Folder Structure Blocks + +Show project structure in "What You've Accomplished": + +````md +Your project now has: + +``` +your-project/ +├── _bmad/ # BMad configuration +├── _bmad-output/ +│ ├── PRD.md # Your requirements document +│ └── bmm-workflow-status.yaml # Progress tracking +└── ... +``` +```` + +## Example: Before and After + +### Before (Noisy) + +```md +--- + +## Getting Started + +### Step 1: Initialize + +#### What happens during init? + +**Important:** You need to describe your project. + +1. Your project goals + - What you want to build + - Why you're building it +2. The complexity + - Small, medium, or large + +--- +``` + +### After (Clean) + +```md +## Step 1: Initialize Your Project + +Load the **Analyst agent** in your IDE, wait for the menu, then run `workflow-init`. + +:::note[What Happens] +You'll describe your project goals and complexity. The workflow then recommends a planning track. +::: +``` + +## Checklist + +Before submitting a tutorial: + +- [ ] Follows the standard structure +- [ ] Has version/module notice if applicable +- [ ] Has "What You'll Learn" section +- [ ] Has Prerequisites admonition +- [ ] Has Quick Path TL;DR admonition +- [ ] No horizontal rules (`---`) +- [ ] No `####` headers +- [ ] Admonitions used for callouts (not bold paragraphs) +- [ ] Tables used for structured data (phases, commands, agents) +- [ ] Lists are flat (no deep nesting) +- [ ] Has "What You've Accomplished" section +- [ ] Has Quick Reference table +- [ ] Has Common Questions section +- [ ] Has Getting Help section +- [ ] Has Key Takeaways admonition +- [ ] All links use descriptive text +- [ ] Images have alt text and captions diff --git a/docs/bmad-core-concepts/index.md b/docs/bmad-core-concepts/index.md deleted file mode 100644 index e34ad4dd..00000000 --- a/docs/bmad-core-concepts/index.md +++ /dev/null @@ -1,37 +0,0 @@ -# BMAD Core Concepts - -Understanding the fundamental building blocks of the BMAD Method. - -## The Essentials - -| Concept | Description | Guide | -|---------|-------------|-------| -| **Agents** | AI assistants with personas, capabilities, and menus | [Agents Guide](./agents.md) | -| **Workflows** | Structured processes for achieving specific outcomes | [Workflows Guide](./workflows.md) | -| **Modules** | Packaged collections of agents and workflows | [Modules Guide](./modules.md) | - -## Getting Started - -### New to BMAD? -Start here to understand what BMAD is and how it works: - -1. **[Agents Guide](./agents.md)** - Learn about Simple and Expert agents -2. **[Workflows Guide](./workflows.md)** - Understand how workflows orchestrate tasks -3. **[Modules Guide](./modules.md)** - See how modules organize functionality - -### Installing BMAD - -- **[Installation Guide](./installing/)** - Set up BMAD in your project -- **[Upgrading from v4](./installing/upgrading.md)** - Migrate from earlier versions - -### Configuration - -- **[BMAD Customization](./bmad-customization/)** - Personalize agents and workflows - -### Advanced - -- **[Web Bundles](./web-bundles/)** - Use BMAD in Gemini Gems and Custom GPTs - ---- - -**Next:** Read the [Agents Guide](./agents.md) to understand the core building block of BMAD. diff --git a/docs/bmad-core-concepts/installing/index.md b/docs/bmad-core-concepts/installing/index.md deleted file mode 100644 index d1835e16..00000000 --- a/docs/bmad-core-concepts/installing/index.md +++ /dev/null @@ -1,77 +0,0 @@ -# Installation - -Get BMAD up and running in your project. - -## Upgrading? - -If you're upgrading from v4, see the [Upgrade Guide](./upgrading.md). - ---- - -## Quick Install - -```bash -npx bmad-method install -``` - -This interactive installer will: - -1. Let you choose a location to install to -2. Let you choose which Agentic LLM Tools you would like to use (Such as Claude Code, Cursor, Windsurf, etc...) -3. Let you choose which official modules to install (BMad Method, Creative Intelligence suite, BMad Builder) -4. Let you choose any custom local modules, workflows or agents to install -5. Let you configure each module or quickly accept the default recommended settings for each selected model - -## Requirements - -- **Node.js** 20+ (for the installer) -- **Git** (recommended for version control) -- An **AI-powered Agent and/or IDE** or access to Claude/ChatGPT/Gemini - -## Module Options - -During installation, you'll choose which modules to install: - -| Module | Description | Best For | -| -------- | -------------------- | ----------------------------------------------------- | -| **BMM** | BMAD Method Core | Software development projects | -| **BMGD** | Game Development | Game projects with specialized workflows | -| **CIS** | Creative Intel Suite | Creativity Unlocking Suite, not software dev specific | -| **BMB** | Builder | Creating custom agents and workflows | - -You will also be asked if you would like to install custom content (agents, workflows or modules) you have created with the BMB, or shared from others in the community. - - -## Post-Installation - -After installation, your project will have: - -``` -your-project/ -├── _bmad/ # BMAD configuration and agents -│ ├── bmm/ # Method module (if installed) -│ ├── bmgd/ # Game dev module (if installed) -│ ├── core/ # Always installed, includes party mode, advanced elicitation, and other core generic utils -│ ├── {others}/ # etc... -├── _bmad-output/ # BMAD default output folder - configurable during install -├── .claude/ # IDE-specific setup (varies by IDE) -└── ... your code # maybe nothing else yet if a fresh new folder -``` - -## Next Steps - -1. **Read the [Quick Start Guide](../../modules/bmm-bmad-method/quick-start)** to build your first feature -2. **Explore [Workflows](../../modules/bmm-bmad-method/index#-workflow-guides)** to understand the methodology -3. **Learn about [Agents](../agents.md)** to understand BMAD's core building blocks - -## Troubleshooting - -### Common Issues - -**"Command not found: npx"** -: Install Node.js 20+ from [nodejs.org](https://nodejs.org) - -**"Permission denied"** -: Run with appropriate permissions or check your npm configuration - -For more help, join our [Discord](https://discord.gg/bmad). diff --git a/website/src/pages/downloads.md b/docs/downloads.md similarity index 75% rename from website/src/pages/downloads.md rename to docs/downloads.md index d7e134d2..fc3c1709 100644 --- a/website/src/pages/downloads.md +++ b/docs/downloads.md @@ -1,32 +1,38 @@ -# Downloads +--- +title: Downloads +--- Download BMAD Method resources for offline use, AI training, or integration. +## Source Bundles + +| File | Description | +|------|-------------| +| **[bmad-sources.zip](/downloads/bmad-sources.zip)** | Complete BMAD source files | +| **[bmad-prompts.zip](/downloads/bmad-prompts.zip)** | Agent and workflow prompts only | + ## LLM-Optimized Files These files are designed for AI consumption - perfect for loading into Claude, ChatGPT, or any LLM context window. -| File | Description | Use Case | -| ----------------------------------- | ----------------------------------- | -------------------------- | -| **[llms.txt](/llms.txt)** | Documentation index with summaries | Quick overview, navigation | -| **[llms-full.txt](/llms-full.txt)** | Complete documentation concatenated | Full context loading | +| File | Description | Use Case | +|------|-------------|----------| +| **[llms.txt](/llms.txt)** | Documentation index with summaries | Quick overview, navigation | +| **[llms-full.txt](/llms-full.txt)** | Complete documentation concatenated | Full context loading | ### Using with LLMs **Claude Projects:** - ``` Upload llms-full.txt as project knowledge ``` **ChatGPT:** - ``` Paste llms.txt for navigation, or sections from llms-full.txt as needed ``` **API Usage:** - ```python import requests docs = requests.get("https://bmad-code-org.github.io/BMAD-METHOD/llms-full.txt").text diff --git a/docs/modules/bmm-bmad-method/quick-flow-solo-dev.md b/docs/explanation/agents/barry-quick-flow.md similarity index 95% rename from docs/modules/bmm-bmad-method/quick-flow-solo-dev.md rename to docs/explanation/agents/barry-quick-flow.md index 8ca538d0..b4c1dee8 100644 --- a/docs/modules/bmm-bmad-method/quick-flow-solo-dev.md +++ b/docs/explanation/agents/barry-quick-flow.md @@ -1,4 +1,7 @@ -# Quick Flow Solo Dev Agent (Barry) +--- +title: "Quick Flow Solo Dev Agent (Barry)" +--- + **Agent ID:** `_bmad/bmm/agents/quick-flow-solo-dev.md` **Icon:** 🚀 @@ -307,11 +310,11 @@ Implement OAuth 2.0 authentication with JWT tokens and role-based access control ## Related Documentation -- **[Quick Start Guide](./quick-start.md)** - Getting started with BMM -- **[Agents Guide](./agents-guide.md)** - Complete agent reference -- **[Scale Adaptive System](./scale-adaptive-system.md)** - Understanding development tracks -- **[Workflow Implementation](./workflows-implementation.md)** - Implementation workflows -- **[Party Mode](./party-mode.md)** - Multi-agent collaboration +- **[Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md)** - Getting started with BMM +- **[Agents Guide](../../explanation/core-concepts/agent-roles.md)** - Complete agent reference +- **[Four Phases](../../explanation/architecture/four-phases.md)** - Understanding development tracks +- **[Workflow Implementation](../../how-to/workflows/run-sprint-planning.md)** - Implementation workflows +- **[Party Mode](../../explanation/features/party-mode.md)** - Multi-agent collaboration --- diff --git a/docs/explanation/agents/index.md b/docs/explanation/agents/index.md new file mode 100644 index 00000000..50f19155 --- /dev/null +++ b/docs/explanation/agents/index.md @@ -0,0 +1,28 @@ +--- +title: "Understanding Agents" +description: Understanding BMAD agents and their roles +--- + + +Comprehensive guides to BMAD's AI agents - their roles, capabilities, and how to work with them effectively. + +--- + +## Agent Guides + +### BMM Agents + +- **[Agent Roles](../core-concepts/agent-roles.md)** - Overview of all BMM agent roles and responsibilities +- **[Quick Flow Solo Dev (Barry)](./barry-quick-flow.md)** - The dedicated agent for rapid development + +### BMGD Agents + +- **[Game Development Agents](../game-dev/agents.md)** - Complete guide to BMGD's specialized game dev agents + +--- + +## Related + +- **[What Are Agents?](../core-concepts/what-are-agents.md)** - Core concept explanation +- **[Party Mode](../features/party-mode.md)** - Multi-agent collaboration +- **[Customize Agents](../../how-to/customization/customize-agents.md)** - How to customize agent behavior diff --git a/docs/explanation/architecture/four-phases.md b/docs/explanation/architecture/four-phases.md new file mode 100644 index 00000000..e9ace69c --- /dev/null +++ b/docs/explanation/architecture/four-phases.md @@ -0,0 +1,126 @@ +--- +title: "The Four Phases of BMad Method" +description: Understanding the four phases of the BMad Method +--- + + +BMad Method uses a four-phase approach that adapts to project complexity while ensuring consistent quality. + +--- + +## Phase Overview + +| Phase | Name | Purpose | Required? | +|-------|------|---------|-----------| +| **Phase 1** | Analysis | Exploration and discovery | Optional | +| **Phase 2** | Planning | Requirements definition | Required | +| **Phase 3** | Solutioning | Technical design | Track-dependent | +| **Phase 4** | Implementation | Building the software | Required | + +--- + +## Phase 1: Analysis (Optional) + +Exploration and discovery workflows that help validate ideas and understand markets before planning. + +**Workflows:** +- `brainstorm-project` - Solution exploration +- `research` - Market/technical/competitive research +- `product-brief` - Strategic vision capture + +**When to use:** +- Starting new projects +- Exploring opportunities +- Validating market fit + +**When to skip:** +- Clear requirements +- Well-defined features +- Continuing existing work + +--- + +## Phase 2: Planning (Required) + +Requirements definition using the scale-adaptive system to match planning depth to project complexity. + +**Workflows:** +- `prd` - Product Requirements Document (BMad Method/Enterprise) +- `tech-spec` - Technical specification (Quick Flow) +- `create-ux-design` - Optional UX specification + +**Key principle:** +Define **what** to build and **why**. Leave **how** to Phase 3. + +--- + +## Phase 3: Solutioning (Track-Dependent) + +Technical architecture and design decisions that prevent agent conflicts during implementation. + +**Workflows:** +- `architecture` - System design with ADRs +- `create-epics-and-stories` - Work breakdown (after architecture) +- `implementation-readiness` - Gate check + +**Required for:** +- BMad Method (complex projects) +- Enterprise Method + +**Skip for:** +- Quick Flow (simple changes) + +**Key principle:** +Make technical decisions explicit so all agents implement consistently. + +--- + +## Phase 4: Implementation (Required) + +Iterative sprint-based development with story-centric workflow. + +**Workflows:** +- `sprint-planning` - Initialize tracking +- `create-story` - Prepare stories +- `dev-story` - Implement with tests +- `code-review` - Quality assurance +- `retrospective` - Continuous improvement + +**Key principle:** +One story at a time, complete each story's full lifecycle before starting the next. + +--- + +## Phase Flow by Track + +### Quick Flow + +``` +Phase 2 (tech-spec) → Phase 4 (implement) +``` + +Skip Phases 1 and 3 for simple changes. + +### BMad Method + +``` +Phase 1 (optional) → Phase 2 (PRD) → Phase 3 (architecture) → Phase 4 (implement) +``` + +Full methodology for complex projects. + +### Enterprise + +``` +Phase 1 → Phase 2 (PRD) → Phase 3 (architecture + extended) → Phase 4 (implement) +``` + +Same as BMad Method with optional extended workflows. + +--- + +## Related + +- [Why Solutioning Matters](./why-solutioning-matters.md) +- [Preventing Agent Conflicts](./preventing-agent-conflicts.md) +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) diff --git a/docs/explanation/architecture/preventing-agent-conflicts.md b/docs/explanation/architecture/preventing-agent-conflicts.md new file mode 100644 index 00000000..9c6aaf87 --- /dev/null +++ b/docs/explanation/architecture/preventing-agent-conflicts.md @@ -0,0 +1,138 @@ +--- +title: "Preventing Agent Conflicts" +description: How architecture prevents conflicts when multiple agents implement a system +--- + + +When multiple AI agents implement different parts of a system, they can make conflicting technical decisions. Architecture documentation prevents this by establishing shared standards. + +--- + +## Common Conflict Types + +### API Style Conflicts + +Without architecture: +- Agent A uses REST with `/users/{id}` +- Agent B uses GraphQL mutations +- Result: Inconsistent API patterns, confused consumers + +With architecture: +- ADR specifies: "Use GraphQL for all client-server communication" +- All agents follow the same pattern + +### Database Design Conflicts + +Without architecture: +- Agent A uses snake_case column names +- Agent B uses camelCase column names +- Result: Inconsistent schema, confusing queries + +With architecture: +- Standards document specifies naming conventions +- All agents follow the same patterns + +### State Management Conflicts + +Without architecture: +- Agent A uses Redux for global state +- Agent B uses React Context +- Result: Multiple state management approaches, complexity + +With architecture: +- ADR specifies state management approach +- All agents implement consistently + +--- + +## How Architecture Prevents Conflicts + +### 1. Explicit Decisions via ADRs + +Every significant technology choice is documented with: +- Context (why this decision matters) +- Options considered (what alternatives exist) +- Decision (what we chose) +- Rationale (why we chose it) +- Consequences (trade-offs accepted) + +### 2. FR/NFR-Specific Guidance + +Architecture maps each functional requirement to technical approach: +- FR-001: User Management → GraphQL mutations +- FR-002: Mobile App → Optimized queries + +### 3. Standards and Conventions + +Explicit documentation of: +- Directory structure +- Naming conventions +- Code organization +- Testing patterns + +--- + +## Architecture as Shared Context + +Think of architecture as the shared context that all agents read before implementing: + +``` +PRD: "What to build" + ↓ +Architecture: "How to build it" + ↓ +Agent A reads architecture → implements Epic 1 +Agent B reads architecture → implements Epic 2 +Agent C reads architecture → implements Epic 3 + ↓ +Result: Consistent implementation +``` + +--- + +## Key ADR Topics + +Common decisions that prevent conflicts: + +| Topic | Example Decision | +|-------|-----------------| +| API Style | GraphQL vs REST vs gRPC | +| Database | PostgreSQL vs MongoDB | +| Auth | JWT vs Sessions | +| State Management | Redux vs Context vs Zustand | +| Styling | CSS Modules vs Tailwind vs Styled Components | +| Testing | Jest + Playwright vs Vitest + Cypress | + +--- + +## Anti-Patterns + +### ❌ Implicit Decisions + +"We'll figure out the API style as we go" +→ Leads to inconsistency + +### ❌ Over-Documentation + +Every minor choice documented +→ Analysis paralysis, wasted time + +### ❌ Stale Architecture + +Document written once, never updated +→ Agents follow outdated patterns + +### ✅ Correct Approach + +- Document decisions that cross epic boundaries +- Focus on conflict-prone areas +- Update architecture as you learn +- Use `correct-course` for significant changes + +--- + +## Related + +- [Why Solutioning Matters](./why-solutioning-matters.md) +- [Four Phases](./four-phases.md) +- [Create Architecture](../../how-to/workflows/create-architecture.md) diff --git a/docs/explanation/architecture/why-solutioning-matters.md b/docs/explanation/architecture/why-solutioning-matters.md new file mode 100644 index 00000000..b9e2aa93 --- /dev/null +++ b/docs/explanation/architecture/why-solutioning-matters.md @@ -0,0 +1,91 @@ +--- +title: "Why Solutioning Matters" +description: Understanding why the solutioning phase is critical for multi-epic projects +--- + + +Phase 3 (Solutioning) translates **what** to build (from Planning) into **how** to build it (technical design). This phase prevents agent conflicts in multi-epic projects by documenting architectural decisions before implementation begins. + +--- + +## The Problem Without Solutioning + +``` +Agent 1 implements Epic 1 using REST API +Agent 2 implements Epic 2 using GraphQL +Result: Inconsistent API design, integration nightmare +``` + +When multiple agents implement different parts of a system without shared architectural guidance, they make independent technical decisions that may conflict. + +--- + +## The Solution With Solutioning + +``` +architecture workflow decides: "Use GraphQL for all APIs" +All agents follow architecture decisions +Result: Consistent implementation, no conflicts +``` + +By documenting technical decisions explicitly, all agents implement consistently and integration becomes straightforward. + +--- + +## Solutioning vs Planning + +| Aspect | Planning (Phase 2) | Solutioning (Phase 3) | +| -------- | ----------------------- | --------------------------------- | +| Question | What and Why? | How? Then What units of work? | +| Output | FRs/NFRs (Requirements) | Architecture + Epics/Stories | +| Agent | PM | Architect → PM | +| Audience | Stakeholders | Developers | +| Document | PRD (FRs/NFRs) | Architecture + Epic Files | +| Level | Business logic | Technical design + Work breakdown | + +--- + +## Key Principle + +**Make technical decisions explicit and documented** so all agents implement consistently. + +This prevents: +- API style conflicts (REST vs GraphQL) +- Database design inconsistencies +- State management disagreements +- Naming convention mismatches +- Security approach variations + +--- + +## When Solutioning is Required + +| Track | Solutioning Required? | +|-------|----------------------| +| Quick Flow | No - skip entirely | +| BMad Method Simple | Optional | +| BMad Method Complex | Yes | +| Enterprise | Yes | + +**Rule of thumb:** If you have multiple epics that could be implemented by different agents, you need solutioning. + +--- + +## The Cost of Skipping + +Skipping solutioning on complex projects leads to: + +- **Integration issues** discovered mid-sprint +- **Rework** due to conflicting implementations +- **Longer development time** overall +- **Technical debt** from inconsistent patterns + +Catching alignment issues in solutioning is 10× faster than discovering them during implementation. + +--- + +## Related + +- [Four Phases](./four-phases.md) - Overview of all phases +- [Preventing Agent Conflicts](./preventing-agent-conflicts.md) - Detailed conflict prevention +- [Create Architecture](../../how-to/workflows/create-architecture.md) - How to do it diff --git a/docs/modules/bmb-bmad-builder/custom-content.md b/docs/explanation/bmad-builder/custom-content-types.md similarity index 86% rename from docs/modules/bmb-bmad-builder/custom-content.md rename to docs/explanation/bmad-builder/custom-content-types.md index b54e8572..6b117475 100644 --- a/docs/modules/bmb-bmad-builder/custom-content.md +++ b/docs/explanation/bmad-builder/custom-content-types.md @@ -1,4 +1,7 @@ -# Custom Content +--- +title: "Custom Content" +--- + BMAD supports several categories of officially supported custom content that extend the platform's capabilities. Custom content can be created manually or with the recommended assistance of the BMad Builder (BoMB) Module. The BoMB Agents provides workflows and expertise to plan and build any custom content you can imagine. @@ -14,30 +17,26 @@ This flexibility transforms the platform beyond its current capabilities, enabli ## Categories -- [Custom Content](#custom-content) - - [Categories](#categories) - - [Custom Stand Alone Modules](#custom-stand-alone-modules) - - [Custom Add On Modules](#custom-add-on-modules) - - [Custom Global Modules](#custom-global-modules) - - [Custom Agents](#custom-agents) - - [BMad Tiny Agents](#bmad-tiny-agents) - - [Simple and Expert Agents](#simple-and-expert-agents) - - [Custom Workflows](#custom-workflows) +- [Custom Stand-Alone Modules](#custom-stand-alone-modules) +- [Custom Add-On Modules](#custom-add-on-modules) +- [Custom Global Modules](#custom-global-modules) +- [Custom Agents](#custom-agents) +- [Custom Workflows](#custom-workflows) -## Custom Stand Alone Modules +## Custom Stand-Alone Modules Custom modules range from simple collections of related agents, workflows, and tools designed to work independently, to complex, expansive systems like the BMad Method or even larger applications. -Custom modules are [installable](./custom-content-installation.md) using the standard BMAD method and support advanced features: +Custom modules are [installable](../../how-to/installation/install-custom-modules.md) using the standard BMAD method and support advanced features: - Optional user information collection during installation/updates - Versioning and upgrade paths - Custom installer functions with IDE-specific post-installation handling (custom hooks, subagents, or vendor-specific tools) - Ability to bundle specific tools such as MCP, skills, execution libraries, and code -## Custom Add On Modules +## Custom Add-On Modules -Custom Add On Modules contain specific agents, tools, or workflows that expand, modify, or customize another module but cannot exist or install independently. These add-ons provide enhanced functionality while leveraging the base module's existing capabilities. +Custom Add-On Modules contain specific agents, tools, or workflows that expand, modify, or customize another module but cannot exist or install independently. These add-ons provide enhanced functionality while leveraging the base module's existing capabilities. Examples include: @@ -45,7 +44,7 @@ Examples include: - Framework-specific support for particular use cases - Game development expansions that add new genre-specific capabilities without reinventing existing functionality -Add on modules can include: +Add-on modules can include: - Custom agents with awareness of the target module - Access to existing module workflows @@ -53,7 +52,7 @@ Add on modules can include: ## Custom Global Modules -Similar to Custom Stand Alone Modules, but designed to add functionality that applies across all installed content. These modules provide cross-cutting capabilities that enhance the entire BMAD ecosystem. +Similar to Custom Stand-Alone Modules, but designed to add functionality that applies across all installed content. These modules provide cross-cutting capabilities that enhance the entire BMAD ecosystem. Examples include: diff --git a/docs/explanation/bmad-builder/index.md b/docs/explanation/bmad-builder/index.md new file mode 100644 index 00000000..c2c05547 --- /dev/null +++ b/docs/explanation/bmad-builder/index.md @@ -0,0 +1,66 @@ +--- +title: "BMad Builder (BMB)" +description: Create custom agents, workflows, and modules for BMAD +--- + + +Create custom agents, workflows, and modules for BMAD. + +--- + +## Quick Start + +- **[Agent Creation Guide](../../tutorials/advanced/create-custom-agent.md)** - Step-by-step guide to building your first agent + +--- + +## Agent Architecture + +Comprehensive guides for each agent type: + +- **Simple Agent Architecture** - Self-contained, optimized, personality-driven +- **Expert Agent Architecture** - Memory, sidecar files, domain restrictions +- **Module Agent Architecture** - Workflow integration, professional tools + +--- + +## Key Concepts + +### YAML to XML Compilation + +Agents are authored in YAML with Handlebars templating. The compiler auto-injects: + +1. **Frontmatter** - Name and description from metadata +2. **Activation Block** - Steps, menu handlers, rules +3. **Menu Enhancement** - `*help` and `*exit` commands added automatically +4. **Trigger Prefixing** - Your triggers auto-prefixed with `*` + +--- + +## Reference Examples + +Production-ready examples available in the BMB reference folder: + +### Simple Agents +- **commit-poet** - Commit message artisan with style customization + +### Expert Agents +- **journal-keeper** - Personal journal companion with memory and pattern recognition + +### Module Agents +- **security-engineer** - BMM security specialist with threat modeling +- **trend-analyst** - CIS trend intelligence expert + +--- + +## Installation Guide + +For installing standalone simple and expert agents, see: +- [Install Custom Modules](../../how-to/installation/install-custom-modules.md) + +--- + +## Related + +- [Custom Content Types](./custom-content-types.md) - Understanding content types +- [Create Custom Agent](../../tutorials/advanced/create-custom-agent.md) - Tutorial diff --git a/docs/modules/bmm-bmad-method/index.md b/docs/explanation/bmm/index.md similarity index 64% rename from docs/modules/bmm-bmad-method/index.md rename to docs/explanation/bmm/index.md index c01f8978..f6438397 100644 --- a/docs/modules/bmm-bmad-method/index.md +++ b/docs/explanation/bmm/index.md @@ -1,4 +1,7 @@ -# BMM Documentation +--- +title: "BMM Documentation" +--- + Complete guides for the BMad Method Module (BMM) - AI-powered agile development workflows that adapt to your project's complexity. @@ -8,7 +11,7 @@ Complete guides for the BMad Method Module (BMM) - AI-powered agile development **New to BMM?** Start here: -- **[Quick Start Guide](./quick-start.md)** - Step-by-step guide to building your first project +- **[Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md)** - Step-by-step guide to building your first project - Installation and setup - Understanding the four phases - Running your first workflows @@ -18,7 +21,7 @@ Complete guides for the BMad Method Module (BMM) - AI-powered agile development ### 📊 Visual Overview -**[Complete Workflow Diagram](./images/workflow-method-greenfield.svg)** - Visual flowchart showing all phases, agents (color-coded), and decision points for the BMad Method standard greenfield track. +**[Complete Workflow Diagram](../../tutorials/getting-started/images/workflow-method-greenfield.svg)** - Visual flowchart showing all phases, agents (color-coded), and decision points for the BMad Method standard greenfield track. ## 📖 Core Concepts @@ -26,33 +29,33 @@ The BMad Method is meant to be adapted and customized to your specific needs. In First know there is the full BMad Method Process and then there is a Quick Flow for those quicker smaller efforts. -- **[Full Adaptive BMad Method](#-workflow-guides)** - Full planning and scope support through extensive development and testing. +- **[Full Adaptive BMad Method](#workflow-guides)** - Full planning and scope support through extensive development and testing. - Broken down into 4 phases, all of which are comprised of both required and optional phases - Phases 1-3 are all about progressive idea development through planning and preparations to build your project. - - Phase 4 is the implementation cycle where you will Just In Time (JIT) produce the contextual stories needed for the dev agent based on the extensive planing completed + - Phase 4 is the implementation cycle where you will Just In Time (JIT) produce the contextual stories needed for the dev agent based on the extensive planning completed - All 4 phases have optional steps in them, depending on how rigorous you want to go with planning, research ideation, validation, testing and traceability. - While there is a lot here, know that even this can be distilled down to a simple PRD, Epic and Story list and then jump into the dev cycle. But if that is all you want, you might be better off with the BMad Quick Flow described next -- **[BMAD Quick Flow](./bmad-quick-flow.md)** - Fast-track development workflow +- **[BMAD Quick Flow](../../explanation/features/quick-flow.md)** - Fast-track development workflow - 3-step process: spec → dev → optional review - Perfect for bug fixes and small features - Rapid prototyping with production quality - Implementation in minutes, not days - - Has a specialized single agent that does all of this: **[Quick Flow Solo Dev Agent](./quick-flow-solo-dev.md)** + - Has a specialized single agent that does all of this: **[Quick Flow Solo Dev Agent](../agents/barry-quick-flow.md)** -- **TEA engagement (optional)** - Choose TEA engagement: none, TEA-only (standalone), or integrated by track. See **[Test Architect Guide](./test-architecture.md)**. +- **TEA engagement (optional)** - Choose TEA engagement: none, TEA-only (standalone), or integrated by track. See **[Test Architect Guide](../../explanation/features/tea-overview.md)**. ## 🤖 Agents and Collaboration Complete guide to BMM's AI agent team: -- **[Agents Guide](./agents-guide.md)** - Comprehensive agent reference +- **[Agents Guide](../../explanation/core-concepts/agent-roles.md)** - Comprehensive agent reference - 12 specialized BMM agents + BMad Master - Agent roles, workflows, and when to use them - Agent customization system - Best practices and common patterns -- **[Party Mode Guide](./party-mode.md)** - Multi-agent collaboration +- **[Party Mode Guide](../../explanation/features/party-mode.md)** - Multi-agent collaboration - How party mode works (19+ agents collaborate in real-time) - When to use it (strategic, creative, cross-functional, complex) - Example party compositions @@ -64,7 +67,7 @@ Complete guide to BMM's AI agent team: Comprehensive guide for brownfield development: -- **[Brownfield Development Guide](./brownfield-guide.md)** - Complete guide for existing codebases +- **[Brownfield Development Guide](../../how-to/brownfield/index.md)** - Complete guide for existing codebases - Documentation phase strategies - Track selection for brownfield - Integration with existing patterns @@ -75,49 +78,49 @@ Comprehensive guide for brownfield development: Essential reference materials: -- **[Glossary](./glossary.md)** - Key terminology and concepts -- **[FAQ](./faq.md)** - Frequently asked questions across all topics +- **[Glossary](../../reference/glossary/index.md)** - Key terminology and concepts +- **[FAQ](../faq/index.md)** - Frequently asked questions across all topics ## 🎯 Choose Your Path ### I need to... **Build something new (greenfield)** -→ Start with [Quick Start Guide](./quick-start.md) +→ Start with [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) **Fix a bug or add small feature** -→ User the [Quick Flow Solo Dev](./quick-flow-solo-dev.md) directly with its dedicated stand alone [Quick Bmad Spec Flow](./quick-spec-flow.md) process +→ Use the [Quick Flow Solo Dev](../agents/barry-quick-flow.md) directly with its dedicated stand alone [Quick Bmad Spec Flow](../features/quick-flow.md) process **Work with existing codebase (brownfield)** -→ Read [Brownfield Development Guide](./brownfield-guide.md) +→ Read [Brownfield Development Guide](../../how-to/brownfield/index.md) → Pay special attention to documentation requirements for brownfield projects ## 📋 Workflow Guides Comprehensive documentation for all BMM workflows organized by phase: -- **[Phase 1: Analysis Workflows](./workflows-analysis.md)** - Optional exploration and research workflows (595 lines) +- **[Phase 1: Analysis Workflows](../../how-to/workflows/run-brainstorming-session.md)** - Optional exploration and research workflows (595 lines) - brainstorm-project, product-brief, research, and more - When to use analysis workflows - Creative and strategic tools -- **[Phase 2: Planning Workflows](./workflows-planning.md)** - Scale-adaptive planning (967 lines) +- **[Phase 2: Planning Workflows](../../how-to/workflows/create-prd.md)** - Scale-adaptive planning (967 lines) - prd, tech-spec, gdd, narrative, ux - Track-based planning approach (Quick Flow, BMad Method, Enterprise Method) - Which planning workflow to use -- **[Phase 3: Solutioning Workflows](./workflows-solutioning.md)** - Architecture and validation (638 lines) +- **[Phase 3: Solutioning Workflows](../../how-to/workflows/create-architecture.md)** - Architecture and validation (638 lines) - architecture, create-epics-and-stories, implementation-readiness - V6: Epics created AFTER architecture for better quality - Required for BMad Method and Enterprise Method tracks - Preventing agent conflicts -- **[Phase 4: Implementation Workflows](./workflows-implementation.md)** - Sprint-based development (1,634 lines) +- **[Phase 4: Implementation Workflows](../../how-to/workflows/run-sprint-planning.md)** - Sprint-based development (1,634 lines) - sprint-planning, create-story, dev-story, code-review - Complete story lifecycle - One-story-at-a-time discipline -- **[Testing & QA Workflows](./test-architecture.md)** - Comprehensive quality assurance (1,420 lines) +- **[Testing & QA Workflows](../../explanation/features/tea-overview.md)** - Comprehensive quality assurance (1,420 lines) - Test strategy, automation, quality gates - TEA agent and test healing @@ -129,4 +132,4 @@ Comprehensive documentation for all BMM workflows organized by phase: - **[GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues)** - Report bugs or request features - **[YouTube Channel](https://www.youtube.com/@BMadCode)** - Video tutorials and walkthroughs -**Ready to begin?** → [Start with the Quick Start Guide](./quick-start.md) +**Ready to begin?** → [Start with the Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) diff --git a/docs/explanation/core-concepts/agent-roles.md b/docs/explanation/core-concepts/agent-roles.md new file mode 100644 index 00000000..1317ba24 --- /dev/null +++ b/docs/explanation/core-concepts/agent-roles.md @@ -0,0 +1,204 @@ +--- +title: "Agent Roles in BMad Method" +description: Understanding the different agent roles in BMad Method +--- + + +BMad Method uses specialized AI agents, each with a distinct role, expertise, and personality. Understanding these roles helps you know which agent to use for each task. + +--- + +## Core Agents Overview + +| Agent | Role | Primary Phase | +|-------|------|---------------| +| **Analyst** | Research and discovery | Phase 1 (Analysis) | +| **PM** | Requirements and planning | Phase 2 (Planning) | +| **Architect** | Technical design | Phase 3 (Solutioning) | +| **SM** | Sprint orchestration | Phase 4 (Implementation) | +| **DEV** | Code implementation | Phase 4 (Implementation) | +| **TEA** | Test architecture | Phases 3-4 (Cross-phase) | +| **UX Designer** | User experience | Phase 2-3 | +| **Quick Flow Solo Dev** | Fast solo development | All phases (Quick Flow) | + +--- + +## Phase 1: Analysis + +### Analyst (Mary) + +Business analysis and research specialist. + +**Responsibilities:** +- Brainstorming and ideation +- Market, domain, and competitive research +- Product brief creation +- Brownfield project documentation + +**Key Workflows:** +- `*brainstorm-project` +- `*research` +- `*product-brief` +- `*document-project` + +**When to use:** Starting new projects, exploring ideas, validating market fit, documenting existing codebases. + +--- + +## Phase 2: Planning + +### PM (John) + +Product requirements and planning expert. + +**Responsibilities:** +- Creating Product Requirements Documents +- Defining functional and non-functional requirements +- Breaking requirements into epics and stories +- Validating implementation readiness + +**Key Workflows:** +- `*create-prd` +- `*create-epics-and-stories` +- `*implementation-readiness` + +**When to use:** Defining what to build, creating PRDs, organizing work into stories. + +### UX Designer (Sally) + +User experience and UI design specialist. + +**Responsibilities:** +- UX specification creation +- User journey mapping +- Wireframe and mockup design +- Design system documentation + +**Key Workflows:** +- `*create-ux-design` +- `*validate-design` + +**When to use:** When UX is a primary differentiator, complex user workflows, design system creation. + +--- + +## Phase 3: Solutioning + +### Architect (Winston) + +System architecture and technical design expert. + +**Responsibilities:** +- System architecture design +- Architecture Decision Records (ADRs) +- Technical standards definition +- Implementation readiness validation + +**Key Workflows:** +- `*create-architecture` +- `*implementation-readiness` + +**When to use:** Multi-epic projects, cross-cutting technical decisions, preventing agent conflicts. + +--- + +## Phase 4: Implementation + +### SM (Bob) + +Sprint planning and story preparation orchestrator. + +**Responsibilities:** +- Sprint planning and tracking +- Story preparation for development +- Course correction handling +- Epic retrospectives + +**Key Workflows:** +- `*sprint-planning` +- `*create-story` +- `*correct-course` +- `*epic-retrospective` + +**When to use:** Organizing work, preparing stories, tracking progress. + +### DEV (Amelia) + +Story implementation and code review specialist. + +**Responsibilities:** +- Story implementation with tests +- Code review +- Following architecture patterns +- Quality assurance + +**Key Workflows:** +- `*dev-story` +- `*code-review` + +**When to use:** Writing code, implementing stories, reviewing quality. + +--- + +## Cross-Phase Agents + +### TEA (Murat) + +Test architecture and quality strategy expert. + +**Responsibilities:** +- Test framework setup +- Test design and planning +- ATDD and automation +- Quality gate decisions + +**Key Workflows:** +- `*framework`, `*ci` +- `*test-design`, `*atdd`, `*automate` +- `*test-review`, `*trace`, `*nfr-assess` + +**When to use:** Setting up testing, creating test plans, quality gates. + +--- + +## Quick Flow + +### Quick Flow Solo Dev (Barry) + +Fast solo development without handoffs. + +**Responsibilities:** +- Technical specification +- End-to-end implementation +- Code review + +**Key Workflows:** +- `*create-tech-spec` +- `*quick-dev` +- `*code-review` + +**When to use:** Bug fixes, small features, rapid prototyping. + +--- + +## Choosing the Right Agent + +| Task | Agent | +|------|-------| +| Brainstorming ideas | Analyst | +| Market research | Analyst | +| Creating PRD | PM | +| Designing UX | UX Designer | +| System architecture | Architect | +| Preparing stories | SM | +| Writing code | DEV | +| Setting up tests | TEA | +| Quick bug fix | Quick Flow Solo Dev | + +--- + +## Related + +- [What Are Agents](./what-are-agents.md) - Foundational concepts +- [Agent Reference](../../reference/agents/index.md) - Complete command reference +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) diff --git a/docs/explanation/core-concepts/index.md b/docs/explanation/core-concepts/index.md new file mode 100644 index 00000000..713a5e47 --- /dev/null +++ b/docs/explanation/core-concepts/index.md @@ -0,0 +1,40 @@ +--- +title: "BMAD Core Concepts" +--- + + +Understanding the fundamental building blocks of the BMAD Method. + +## The Essentials + +| Concept | Description | Guide | +|---------|-------------|-------| +| **Agents** | AI assistants with personas, capabilities, and menus | [Agents Guide](./what-are-agents.md) | +| **Workflows** | Structured processes for achieving specific outcomes | [Workflows Guide](./what-are-workflows.md) | +| **Modules** | Packaged collections of agents and workflows | [Modules Guide](./what-are-modules.md) | + +## Getting Started + +### New to BMAD? +Start here to understand what BMAD is and how it works: + +1. **[Agents Guide](./what-are-agents.md)** - Learn about Simple and Expert agents +2. **[Workflows Guide](./what-are-workflows.md)** - Understand how workflows orchestrate tasks +3. **[Modules Guide](./what-are-modules.md)** - See how modules organize functionality + +### Installing BMAD + +- **[Installation Guide](../../how-to/installation/index.md)** - Set up BMAD in your project +- **[Upgrading from v4](../../how-to/installation/upgrade-to-v6.md)** - Migrate from earlier versions + +### Configuration + +- **[BMAD Customization](../../how-to/customization/index.md)** - Personalize agents and workflows + +### Advanced + +- **[Web Bundles](../features/web-bundles.md)** - Use BMAD in Gemini Gems and Custom GPTs + +--- + +**Next:** Read the [Agents Guide](./what-are-agents.md) to understand the core building block of BMAD. diff --git a/docs/bmad-core-concepts/agents.md b/docs/explanation/core-concepts/what-are-agents.md similarity index 83% rename from docs/bmad-core-concepts/agents.md rename to docs/explanation/core-concepts/what-are-agents.md index 465bf749..e089fde3 100644 --- a/docs/bmad-core-concepts/agents.md +++ b/docs/explanation/core-concepts/what-are-agents.md @@ -1,4 +1,7 @@ -# Agents +--- +title: "Agents" +--- + Agents are AI assistants that help you accomplish tasks. Each agent has a unique personality, specialized capabilities, and an interactive menu. @@ -82,12 +85,12 @@ All agents share these building blocks: ## Creating Custom Agents -BMAD provides the **BMAD Builder (BMB)** module for creating your own agents. See the [Agent Creation Guide](../modules/bmb-bmad-builder/agent-creation-guide.md) for step-by-step instructions. +BMAD provides the **BMAD Builder (BMB)** module for creating your own agents. See the [Agent Creation Guide](../../tutorials/advanced/create-custom-agent.md) for step-by-step instructions. ## Customizing Existing Agents -You can modify any agent's behavior without editing core files. See [BMAD Customization](./bmad-customization/) for details. It is critical to never modify an installed agents .md file directly and follow the customization process, this way future updates to the agent or module its part of will continue to be updated and recompiled with the installer tool, and your customizations will still be retained. +You can modify any agent's behavior without editing core files. See [BMAD Customization](../../how-to/customization/index.md) for details. It is critical to never modify an installed agents .md file directly and follow the customization process, this way future updates to the agent or module its part of will continue to be updated and recompiled with the installer tool, and your customizations will still be retained. --- -**Next:** Learn about [Workflows](./workflows.md) to see how agents accomplish complex tasks. +**Next:** Learn about [Workflows](./what-are-workflows.md) to see how agents accomplish complex tasks. diff --git a/docs/bmad-core-concepts/modules.md b/docs/explanation/core-concepts/what-are-modules.md similarity index 89% rename from docs/bmad-core-concepts/modules.md rename to docs/explanation/core-concepts/what-are-modules.md index e7a30a16..85bfe865 100644 --- a/docs/bmad-core-concepts/modules.md +++ b/docs/explanation/core-concepts/what-are-modules.md @@ -1,4 +1,7 @@ -# Modules +--- +title: "Modules" +--- + Modules are organized collections of agents and workflows that solve specific problems or address particular domains. @@ -69,8 +72,8 @@ Custom modules are installed the same way as official modules. During BMAD installation, you choose which modules to install. You can also add or remove modules later by re-running the installer. -See [Installation Guide](./installing/) for details. +See [Installation Guide](../../how-to/installation/index.md) for details. --- -**Next:** Read the [Installation Guide](./installing/) to set up BMAD with the modules you need. +**Next:** Read the [Installation Guide](../../how-to/installation/index.md) to set up BMAD with the modules you need. diff --git a/docs/bmad-core-concepts/workflows.md b/docs/explanation/core-concepts/what-are-workflows.md similarity index 99% rename from docs/bmad-core-concepts/workflows.md rename to docs/explanation/core-concepts/what-are-workflows.md index 3bffa3f3..077ba371 100644 --- a/docs/bmad-core-concepts/workflows.md +++ b/docs/explanation/core-concepts/what-are-workflows.md @@ -1,4 +1,7 @@ -# Workflows +--- +title: "Workflows" +--- + Workflows are like prompts on steroids. They harness the untapped power and control of LLMs through progressive disclosure—breaking complex tasks into focused steps that execute sequentially. Instead of random AI slop where you hope for the best, workflows give you repeatable, reliable, high-quality outputs. diff --git a/docs/explanation/core/index.md b/docs/explanation/core/index.md new file mode 100644 index 00000000..4dc10550 --- /dev/null +++ b/docs/explanation/core/index.md @@ -0,0 +1,18 @@ +--- +title: "Core Module" +--- + + +The Core Module is installed with all installations of BMAD modules and provides common functionality that any module, workflow, or agent can take advantage of. + +## Core Module Components + +- **[Global Core Config](../../reference/configuration/global-config.md)** — Inheritable configuration that impacts all modules and custom content +- **[Core Workflows](../../reference/workflows/core-workflows.md)** — Domain-agnostic workflows usable by any module + - [Party Mode](../../explanation/features/party-mode.md) — Multi-agent conversation orchestration + - [Brainstorming](../../explanation/features/brainstorming-techniques.md) — Structured creative sessions with 60+ techniques + - [Advanced Elicitation](../../explanation/features/advanced-elicitation.md) — LLM rethinking with 50+ reasoning methods +- **[Core Tasks](../../reference/configuration/core-tasks.md)** — Common tasks available across modules + - [Index Docs](../../reference/configuration/core-tasks.md#index-docs) — Generate directory index files + - [Adversarial Review](../../reference/configuration/core-tasks.md#adversarial-review-general) — Critical content review + - [Shard Document](../../reference/configuration/core-tasks.md#shard-document) — Split large documents into sections diff --git a/docs/modules/cis-creative-intelligence-suite/index.md b/docs/explanation/creative-intelligence/index.md similarity index 61% rename from docs/modules/cis-creative-intelligence-suite/index.md rename to docs/explanation/creative-intelligence/index.md index 05b567f3..6101fa11 100644 --- a/docs/modules/cis-creative-intelligence-suite/index.md +++ b/docs/explanation/creative-intelligence/index.md @@ -1,20 +1,19 @@ -# CIS - Creative Intelligence Suite +--- +title: "Creative Intelligence Suite (CIS)" +description: AI-powered creative facilitation with the Creative Intelligence Suite +--- + AI-powered creative facilitation transforming strategic thinking through expert coaching across five specialized domains. -## Table of Contents - -- [Core Capabilities](#core-capabilities) -- [Specialized Agents](#specialized-agents) -- [Interactive Workflows](#interactive-workflows) -- [Quick Start](#quick-start) -- [Key Differentiators](#key-differentiators) -- [Configuration](#configuration) +--- ## Core Capabilities CIS provides structured creative methodologies through distinctive agent personas who act as master facilitators, drawing out insights through strategic questioning rather than generating solutions directly. +--- + ## Specialized Agents - **Carson** - Brainstorming Specialist (energetic facilitator) @@ -23,74 +22,69 @@ CIS provides structured creative methodologies through distinctive agent persona - **Victor** - Innovation Oracle (bold strategic precision) - **Sophia** - Master Storyteller (whimsical narrator) -## Interactive Workflows +--- -[View all workflows →](../workflows/README.md) +## Interactive Workflows **5 Workflows** with **150+ Creative Techniques:** ### Brainstorming -36 techniques across 7 categories for ideation - +36 techniques across 7 categories for ideation: - Divergent/convergent thinking - Lateral connections - Forced associations ### Design Thinking -Complete 5-phase human-centered process - +Complete 5-phase human-centered process: - Empathize → Define → Ideate → Prototype → Test - User journey mapping - Rapid iteration ### Problem Solving -Systematic root cause analysis - +Systematic root cause analysis: - 5 Whys, Fishbone diagrams - Solution generation - Impact assessment ### Innovation Strategy -Business model disruption - +Business model disruption: - Blue Ocean Strategy - Jobs-to-be-Done - Disruptive innovation patterns ### Storytelling -25 narrative frameworks - +25 narrative frameworks: - Hero's Journey - Story circles - Compelling pitch structures +--- + ## Quick Start ### Direct Workflow ```bash -# Start interactive session workflow brainstorming -# With context document workflow design-thinking --data /path/to/context.md ``` ### Agent-Facilitated ```bash -# Load agent agent cis/brainstorming-coach -# Start workflow > *brainstorm ``` +--- + ## Key Differentiators - **Facilitation Over Generation** - Guides discovery through questions @@ -99,30 +93,7 @@ agent cis/brainstorming-coach - **Persona-Driven** - Unique communication styles - **Rich Method Libraries** - 150+ proven techniques -## Configuration - -Edit `/_bmad/cis/config.yaml`: - -```yaml -output_folder: ./creative-outputs -user_name: Your Name -communication_language: english -``` - -## Module Structure - -``` -cis/ -├── agents/ # 5 specialized facilitators -├── workflows/ # 5 interactive processes -│ ├── brainstorming/ -│ ├── design-thinking/ -│ ├── innovation-strategy/ -│ ├── problem-solving/ -│ └── storytelling/ -├── tasks/ # Supporting operations -└── teams/ # Agent collaborations -``` +--- ## Integration Points @@ -132,6 +103,8 @@ CIS workflows integrate with: - **BMB** - Creative module design - **Custom Modules** - Shared creative resource +--- + ## Best Practices 1. **Set clear objectives** before starting sessions @@ -140,10 +113,9 @@ CIS workflows integrate with: 4. **Take breaks** when energy flags 5. **Document insights** as they emerge -## Related Documentation - -- **[BMM Documentation](../bmm/index.md)** - Core BMad Method documentation - --- -Part of BMad Method v6.0 - Transform creative potential through expert AI facilitation. +## Related + +- [Facilitation Over Generation](../philosophy/facilitation-over-generation.md) - Core philosophy +- [Brainstorming Techniques](../features/brainstorming-techniques.md) - Technique reference diff --git a/docs/explanation/faq/brownfield-faq.md b/docs/explanation/faq/brownfield-faq.md new file mode 100644 index 00000000..8aeec2aa --- /dev/null +++ b/docs/explanation/faq/brownfield-faq.md @@ -0,0 +1,80 @@ +--- +title: "Brownfield Development FAQ" +description: Common questions about brownfield development in the BMad Method +--- + + +Quick answers to common questions about brownfield (existing codebase) development in the BMad Method. + +--- + +## Q: What is brownfield vs greenfield? + +**A:** + +- **Greenfield:** New project, starting from scratch, clean slate +- **Brownfield:** Existing project, working with established codebase and patterns + +## Q: Do I have to run document-project for brownfield? + +**A:** Highly recommended, especially if: + +- No existing documentation +- Documentation is outdated +- AI agents need context about existing code +- Level 2-4 complexity + +You can skip it if you have comprehensive, up-to-date documentation including `docs/index.md`. + +## Q: What if I forget to run document-project on brownfield? + +**A:** Workflows will lack context about existing code. You may get: + +- Suggestions that don't match existing patterns +- Integration approaches that miss existing APIs +- Architecture that conflicts with current structure + +Run document-project and restart planning with proper context. + +## Q: Can I use Quick Spec Flow for brownfield projects? + +**A:** Yes! Quick Spec Flow works great for brownfield. It will: + +- Auto-detect your existing stack +- Analyze brownfield code patterns +- Detect conventions and ask for confirmation +- Generate context-rich tech-spec that respects existing code + +Perfect for bug fixes and small features in existing codebases. + +## Q: How does workflow-init handle brownfield with old planning docs? + +**A:** workflow-init asks about YOUR current work first, then uses old artifacts as context: + +1. Shows what it found (old PRD, epics, etc.) +2. Asks: "Is this work in progress, previous effort, or proposed work?" +3. If previous effort: Asks you to describe your NEW work +4. Determines level based on YOUR work, not old artifacts + +This prevents old Level 3 PRDs from forcing Level 3 workflow for new Level 0 bug fix. + +## Q: What if my existing code doesn't follow best practices? + +**A:** Quick Spec Flow detects your conventions and asks: "Should I follow these existing conventions?" You decide: + +- **Yes** → Maintain consistency with current codebase +- **No** → Establish new standards (document why in tech-spec) + +BMM respects your choice - it won't force modernization, but it will offer it. + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Brownfield Guide](../../how-to/brownfield/index.md) - Existing codebase workflows +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/getting-started-faq.md b/docs/explanation/faq/getting-started-faq.md new file mode 100644 index 00000000..b7f7facb --- /dev/null +++ b/docs/explanation/faq/getting-started-faq.md @@ -0,0 +1,66 @@ +--- +title: "Getting Started FAQ" +description: Common questions about getting started with the BMad Method +--- + + +Quick answers to common questions about getting started with the BMad Method. + +--- + +## Q: Do I always need to run workflow-init? + +**A:** No, once you learn the flow you can go directly to workflows. However, workflow-init is helpful because it: + +- Determines your project's appropriate level automatically +- Creates the tracking status file +- Routes you to the correct starting workflow + +For experienced users: use the [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) to go directly to the right agent/workflow. + +## Q: Why do I need fresh chats for each workflow? + +**A:** Context-intensive workflows (like brainstorming, PRD creation, architecture design) can cause AI hallucinations if run in sequence within the same chat. Starting fresh ensures the agent has maximum context capacity for each workflow. This is particularly important for: + +- Planning workflows (PRD, architecture) +- Analysis workflows (brainstorming, research) +- Complex story implementation + +Quick workflows like status checks can reuse chats safely. + +## Q: Can I skip workflow-status and just start working? + +**A:** Yes, if you already know your project level and which workflow comes next. workflow-status is mainly useful for: + +- New projects (guides initial setup) +- When you're unsure what to do next +- After breaks in work (reminds you where you left off) +- Checking overall progress + +## Q: What's the minimum I need to get started? + +**A:** For the fastest path: + +1. Install BMad Method: `npx bmad-method@alpha install` +2. For small changes: Load PM agent → run tech-spec → implement +3. For larger projects: Load PM agent → run prd → architect → implement + +## Q: How do I know if I'm in Phase 1, 2, 3, or 4? + +**A:** Check your `bmm-workflow-status.md` file (created by workflow-init). It shows your current phase and progress. If you don't have this file, you can also tell by what you're working on: + +- **Phase 1** - Brainstorming, research, product brief (optional) +- **Phase 2** - Creating either a PRD or tech-spec (always required) +- **Phase 3** - Architecture design (Level 2-4 only) +- **Phase 4** - Actually writing code, implementing stories + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/implementation-faq.md b/docs/explanation/faq/implementation-faq.md new file mode 100644 index 00000000..bbc35273 --- /dev/null +++ b/docs/explanation/faq/implementation-faq.md @@ -0,0 +1,56 @@ +--- +title: "Implementation FAQ" +description: Common questions about implementation in the BMad Method +--- + + +Quick answers to common questions about implementation in the BMad Method. + +--- + +## Q: Does create-story include implementation context? + +**A:** Yes! The create-story workflow generates story files that include implementation-specific guidance, references existing patterns from your documentation, and provides technical context. The workflow loads your architecture, PRD, and existing project documentation to create comprehensive stories. For Quick Flow projects using tech-spec, the tech-spec itself is already comprehensive, so stories can be simpler. + +## Q: How do I mark a story as done? + +**A:** After dev-story completes and code-review passes: + +1. Open `sprint-status.yaml` (created by sprint-planning) +2. Change the story status from `review` to `done` +3. Save the file + +## Q: Can I work on multiple stories at once? + +**A:** Yes, if you have capacity! Stories within different epics can be worked in parallel. However, stories within the same epic are usually sequential because they build on each other. + +## Q: What if my story takes longer than estimated? + +**A:** That's normal! Stories are estimates. If implementation reveals more complexity: + +1. Continue working until DoD is met +2. Consider if story should be split +3. Document learnings in retrospective +4. Adjust future estimates based on this learning + +## Q: When should I run retrospective? + +**A:** After completing all stories in an epic (when epic is done). Retrospectives capture: + +- What went well +- What could improve +- Technical insights +- Learnings for future epics + +Don't wait until project end - run after each epic for continuous improvement. + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/index.md b/docs/explanation/faq/index.md new file mode 100644 index 00000000..bd92c7a6 --- /dev/null +++ b/docs/explanation/faq/index.md @@ -0,0 +1,17 @@ +--- +title: "Frequently Asked Questions" +description: Frequently asked questions about the BMad Method +--- + + +Quick answers to common questions about the BMad Method, organized by topic. + +## Topics + +- [Getting Started](./getting-started-faq.md) - Questions about starting with BMM +- [Levels & Tracks](./levels-and-tracks-faq.md) - Choosing the right level +- [Workflows](./workflows-faq.md) - Workflow and phase questions +- [Planning](./planning-faq.md) - Planning document questions +- [Implementation](./implementation-faq.md) - Implementation questions +- [Brownfield](./brownfield-faq.md) - Existing codebase questions +- [Tools & Advanced](./tools-faq.md) - Tools, IDEs, and advanced topics diff --git a/docs/explanation/faq/levels-and-tracks-faq.md b/docs/explanation/faq/levels-and-tracks-faq.md new file mode 100644 index 00000000..154b3ae3 --- /dev/null +++ b/docs/explanation/faq/levels-and-tracks-faq.md @@ -0,0 +1,58 @@ +--- +title: "Levels and Tracks FAQ" +description: Common questions about choosing the right level for your project +--- + + +Quick answers to common questions about choosing the right level for your BMad Method project. + +--- + +## Q: How do I know which level my project is? + +**A:** Use workflow-init for automatic detection, or self-assess using these keywords: + +- **Level 0:** "fix", "bug", "typo", "small change", "patch" → 1 story +- **Level 1:** "simple", "basic", "small feature", "add" → 1-10 stories +- **Level 2:** "dashboard", "several features", "admin panel" → 5-15 stories +- **Level 3:** "platform", "integration", "complex", "system" → 12-40 stories +- **Level 4:** "enterprise", "multi-tenant", "multiple products" → 40+ stories + +When in doubt, start smaller. You can always run create-prd later if needed. + +## Q: Can I change levels mid-project? + +**A:** Yes! If you started at Level 1 but realize it's Level 2, you can run create-prd to add proper planning docs. The system is flexible - your initial level choice isn't permanent. + +## Q: What if workflow-init suggests the wrong level? + +**A:** You can override it! workflow-init suggests a level but always asks for confirmation. If you disagree, just say so and choose the level you think is appropriate. Trust your judgment. + +## Q: Do I always need architecture for Level 2? + +**A:** No, architecture is **optional** for Level 2. Only create architecture if you need system-level design. Many Level 2 projects work fine with just PRD created during planning. + +## Q: What's the difference between Level 1 and Level 2? + +**A:** + +- **Level 1:** 1-10 stories, uses tech-spec (simpler, faster), no architecture +- **Level 2:** 5-15 stories, uses PRD (product-focused), optional architecture + +The overlap (5-10 stories) is intentional. Choose based on: + +- Need product-level planning? → Level 2 +- Just need technical plan? → Level 1 +- Multiple epics? → Level 2 +- Single epic? → Level 1 + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/planning-faq.md b/docs/explanation/faq/planning-faq.md new file mode 100644 index 00000000..35de44d4 --- /dev/null +++ b/docs/explanation/faq/planning-faq.md @@ -0,0 +1,47 @@ +--- +title: "Planning Documents FAQ" +description: Common questions about planning documents in the BMad Method +--- + + +Quick answers to common questions about planning documents in the BMad Method. + +--- + +## Q: Why no tech-spec at Level 2+? + +**A:** Level 2+ projects need product-level planning (PRD) and system-level design (Architecture), which tech-spec doesn't provide. Tech-spec is too narrow for coordinating multiple features. Instead, Level 2-4 uses: + +- PRD (product vision, functional requirements, non-functional requirements) +- Architecture (system design) +- Epics+Stories (created AFTER architecture is complete) + +## Q: Do I need a PRD for a bug fix? + +**A:** No! Bug fixes are typically Level 0 (single atomic change). Use Quick Spec Flow: + +- Load PM agent +- Run tech-spec workflow +- Implement immediately + +PRDs are for Level 2-4 projects with multiple features requiring product-level coordination. + +## Q: Can I skip the product brief? + +**A:** Yes, product brief is always optional. It's most valuable for: + +- Level 3-4 projects needing strategic direction +- Projects with stakeholders requiring alignment +- Novel products needing market research +- When you want to explore solution space before committing + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/tools-faq.md b/docs/explanation/faq/tools-faq.md new file mode 100644 index 00000000..682eedd2 --- /dev/null +++ b/docs/explanation/faq/tools-faq.md @@ -0,0 +1,248 @@ +--- +title: "Tools and Advanced FAQ" +description: Common questions about tools, IDEs, and advanced topics in the BMad Method +--- + + +Quick answers to common questions about tools, IDEs, and advanced topics in the BMad Method. + +--- + +## Tools and Technical + +### Q: Why are my Mermaid diagrams not rendering? + +**A:** Common issues: + +1. Missing language tag: Use ` ```mermaid` not just ` ``` ` +2. Syntax errors in diagram (validate at mermaid.live) +3. Tool doesn't support Mermaid (check your Markdown renderer) + +All BMM docs use valid Mermaid syntax that should render in GitHub, VS Code, and most IDEs. + +### Q: Can I use BMM with GitHub Copilot / Cursor / other AI tools? + +**A:** Yes! BMM is complementary. BMM handles: + +- Project planning and structure +- Workflow orchestration +- Agent Personas and expertise +- Documentation generation +- Quality gates + +Your AI coding assistant handles: + +- Line-by-line code completion +- Quick refactoring +- Test generation + +Use them together for best results. + +### Q: What IDEs/tools support BMM? + +**A:** BMM requires tools with **agent mode** and access to **high-quality LLM models** that can load and follow complex workflows, then properly implement code changes. + +**Recommended Tools:** + +- **Claude Code** - Best choice + - Sonnet 4.5 (excellent workflow following, coding, reasoning) + - Opus (maximum context, complex planning) + - Native agent mode designed for BMM workflows + +- **Cursor** + - Supports Anthropic (Claude) and OpenAI models + - Agent mode with composer + - Good for developers who prefer Cursor's UX + +- **Windsurf** + - Multi-model support + - Agent capabilities + - Suitable for BMM workflows + +**What Matters:** + +1. **Agent mode** - Can load long workflow instructions and maintain context +2. **High-quality LLM** - Models ranked high on SWE-bench (coding benchmarks) +3. **Model selection** - Access to Claude Sonnet 4.5, Opus, or GPT-4o class models +4. **Context capacity** - Can handle large planning documents and codebases + +**Why model quality matters:** BMM workflows require LLMs that can follow multi-step processes, maintain context across phases, and implement code that adheres to specifications. Tools with weaker models will struggle with workflow adherence and code quality. + +### Q: Can I customize agents? + +**A:** Yes! Agents are installed as markdown files with XML-style content (optimized for LLMs, readable by any model). Create customization files in `_bmad/_config/agents/[agent-name].customize.yaml` to override default behaviors while keeping core functionality intact. See agent documentation for customization options. + +**Note:** While source agents in this repo are YAML, they install as `.md` files with XML-style tags - a format any LLM can read and follow. + +### Q: What happens to my planning docs after implementation? + +**A:** Keep them! They serve as: + +- Historical record of decisions +- Onboarding material for new team members +- Reference for future enhancements +- Audit trail for compliance + +For enterprise projects (Level 4), consider archiving completed planning artifacts to keep workspace clean. + +### Q: Can I use BMM for non-software projects? + +**A:** BMM is optimized for software development, but the methodology principles (scale-adaptive planning, just-in-time design, context injection) can apply to other complex project types. You'd need to adapt workflows and agents for your domain. + +--- + +## Advanced Questions + +### Q: What if my project grows from Level 1 to Level 3? + +**A:** Totally fine! When you realize scope has grown: + +1. Run create-prd to add product-level planning +2. Run create-architecture for system design +3. Use existing tech-spec as input for PRD +4. Continue with updated level + +The system is flexible - growth is expected. + +### Q: Can I mix greenfield and brownfield approaches? + +**A:** Yes! Common scenario: adding new greenfield feature to brownfield codebase. Approach: + +1. Run document-project for brownfield context +2. Use greenfield workflows for new feature planning +3. Explicitly document integration points between new and existing +4. Test integration thoroughly + +### Q: How do I handle urgent hotfixes during a sprint? + +**A:** Use correct-course workflow or just: + +1. Save your current work state +2. Load PM agent → quick tech-spec for hotfix +3. Implement hotfix (Level 0 flow) +4. Deploy hotfix +5. Return to original sprint work + +Level 0 Quick Spec Flow is perfect for urgent fixes. + +### Q: What if I disagree with the workflow's recommendations? + +**A:** Workflows are guidance, not enforcement. If a workflow recommends something that doesn't make sense for your context: + +- Explain your reasoning to the agent +- Ask for alternative approaches +- Skip the recommendation if you're confident +- Document why you deviated (for future reference) + +Trust your expertise - BMM supports your decisions. + +### Q: Can multiple developers work on the same BMM project? + +**A:** Yes! But the paradigm is fundamentally different from traditional agile teams. + +**Key Difference:** + +- **Traditional:** Multiple devs work on stories within one epic (months) +- **Agentic:** Each dev owns complete epics (days) + +**In traditional agile:** A team of 5 devs might spend 2-3 months on a single epic, with each dev owning different stories. + +**With BMM + AI agents:** A single dev can complete an entire epic in 1-3 days. What used to take months now takes days. + +**Team Work Distribution:** + +- **Recommended:** Split work by **epic** (not story) +- Each developer owns complete epics end-to-end +- Parallel work happens at epic level +- Minimal coordination needed + +**For full-stack apps:** + +- Frontend and backend can be separate epics (unusual in traditional agile) +- Frontend dev owns all frontend epics +- Backend dev owns all backend epics +- Works because delivery is so fast + +**Enterprise Considerations:** + +- Use **git submodules** for BMM installation (not .gitignore) +- Allows personal configurations without polluting main repo +- Teams may use different AI tools (Claude Code, Cursor, etc.) +- Developers may follow different methods or create custom agents/workflows + +**Quick Tips:** + +- Share `sprint-status.yaml` (single source of truth) +- Assign entire epics to developers (not individual stories) +- Coordinate at epic boundaries, not story level +- Use git submodules for BMM in enterprise settings + +### Q: What is party mode and when should I use it? + +**A:** Party mode is a unique multi-agent collaboration feature where ALL your installed agents (19+ from BMM, CIS, BMB, custom modules) discuss your challenges together in real-time. + +**How it works:** + +1. Run `/bmad:core:workflows:party-mode` (or `*party-mode` from any agent) +2. Introduce your topic +3. BMad Master selects 2-3 most relevant agents per message +4. Agents cross-talk, debate, and build on each other's ideas + +**Best for:** + +- Strategic decisions with trade-offs (architecture choices, tech stack, scope) +- Creative brainstorming (game design, product innovation, UX ideation) +- Cross-functional alignment (epic kickoffs, retrospectives, phase transitions) +- Complex problem-solving (multi-faceted challenges, risk assessment) + +**Example parties:** + +- **Product Strategy:** PM + Innovation Strategist (CIS) + Analyst +- **Technical Design:** Architect + Creative Problem Solver (CIS) + Game Architect +- **User Experience:** UX Designer + Design Thinking Coach (CIS) + Storyteller (CIS) + +**Why it's powerful:** + +- Diverse perspectives (technical, creative, strategic) +- Healthy debate reveals blind spots +- Emergent insights from agent interaction +- Natural collaboration across modules + +**For complete documentation:** + +👉 **[Party Mode Guide](../../explanation/features/party-mode.md)** - How it works, when to use it, example compositions, best practices + +--- + +## Getting Help + +### Q: Where do I get help if my question isn't answered here? + +**A:** + +1. Search [Complete Documentation](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/README.md) for related topics +2. Ask in [Discord Community](https://discord.gg/gk8jAdXWmj) (#general-dev) +3. Open a [GitHub Issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) +4. Watch [YouTube Tutorials](https://www.youtube.com/@BMadCode) + +### Q: How do I report a bug or request a feature? + +**A:** Open a GitHub issue at: + +Please include: + +- BMM version (check your installed version) +- Steps to reproduce (for bugs) +- Expected vs actual behavior +- Relevant workflow or agent involved + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/workflows-faq.md b/docs/explanation/faq/workflows-faq.md new file mode 100644 index 00000000..fbd245f2 --- /dev/null +++ b/docs/explanation/faq/workflows-faq.md @@ -0,0 +1,68 @@ +--- +title: "Workflows FAQ" +description: Common questions about BMad Method workflows and phases +--- + + +Quick answers to common questions about BMad Method workflows and phases. + +--- + +## Q: What's the difference between workflow-status and workflow-init? + +**A:** + +- **workflow-status:** Checks existing status and tells you what's next (use when continuing work) +- **workflow-init:** Creates new status file and sets up project (use when starting new project) + +If status file exists, use workflow-status. If not, use workflow-init. + +## Q: Can I skip Phase 1 (Analysis)? + +**A:** Yes! Phase 1 is optional for all levels, though recommended for complex projects. Skip if: + +- Requirements are clear +- No research needed +- Time-sensitive work +- Small changes (Level 0-1) + +## Q: When is Phase 3 (Architecture) required? + +**A:** + +- **Level 0-1:** Never (skip entirely) +- **Level 2:** Optional (only if system design needed) +- **Level 3-4:** Required (comprehensive architecture mandatory) + +## Q: What happens if I skip a recommended workflow? + +**A:** Nothing breaks! Workflows are guidance, not enforcement. However, skipping recommended workflows (like architecture for Level 3) may cause: + +- Integration issues during implementation +- Rework due to poor planning +- Conflicting design decisions +- Longer development time overall + +## Q: How do I know when Phase 3 is complete and I can start Phase 4? + +**A:** For Level 3-4, run the implementation-readiness workflow. It validates PRD + Architecture + Epics + UX (optional) are aligned before implementation. Pass the gate check = ready for Phase 4. + +## Q: Can I run workflows in parallel or do they have to be sequential? + +**A:** Most workflows must be sequential within a phase: + +- Phase 1: brainstorm → research → product-brief (optional order) +- Phase 2: PRD must complete before moving forward +- Phase 3: architecture → epics+stories → implementation-readiness (sequential) +- Phase 4: Stories within an epic should generally be sequential, but stories in different epics can be parallel if you have capacity + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/modules/core/advanced-elicitation.md b/docs/explanation/features/advanced-elicitation.md similarity index 99% rename from docs/modules/core/advanced-elicitation.md rename to docs/explanation/features/advanced-elicitation.md index 92754b20..af08f02e 100644 --- a/docs/modules/core/advanced-elicitation.md +++ b/docs/explanation/features/advanced-elicitation.md @@ -1,4 +1,7 @@ -# Advanced Elicitation +--- +title: "Advanced Elicitation" +--- + **Push the LLM to rethink its work through 50+ reasoning methods—essentially, LLM brainstorming.** diff --git a/docs/modules/core/brainstorming.md b/docs/explanation/features/brainstorming-techniques.md similarity index 99% rename from docs/modules/core/brainstorming.md rename to docs/explanation/features/brainstorming-techniques.md index 4a01b600..23cc6a0b 100644 --- a/docs/modules/core/brainstorming.md +++ b/docs/explanation/features/brainstorming-techniques.md @@ -1,4 +1,7 @@ -# Brainstorming +--- +title: "Brainstorming" +--- + **Facilitate structured creative sessions using 60+ proven ideation techniques.** diff --git a/docs/modules/bmm-bmad-method/party-mode.md b/docs/explanation/features/party-mode.md similarity index 92% rename from docs/modules/bmm-bmad-method/party-mode.md rename to docs/explanation/features/party-mode.md index 801decd9..660ed6ea 100644 --- a/docs/modules/bmm-bmad-method/party-mode.md +++ b/docs/explanation/features/party-mode.md @@ -1,4 +1,7 @@ -# Party Mode: Multi-Agent Collaboration +--- +title: "Party Mode: Multi-Agent Collaboration" +--- + **Get all your AI agents in one conversation** @@ -36,20 +39,15 @@ Type `/bmad:core:workflows:party-mode` (or `*party-mode` from any agent or at ke ## Quick Start ```bash -# Trigger party mode /bmad:core:workflows:party-mode -# OR from any agent context *party-mode -# Super Hack /bmad:core:workflows:party-mode and include also in the party Santa Clause and Einstein -# During party Ask questions, respond to agents, direct the conversation -# Exit Type: exit ``` @@ -105,9 +103,9 @@ _(Multiple perspectives reveal the right answer)_ ## Related Documentation -- [Agents Guide](./agents-guide.md) - Complete agent reference -- [Quick Start Guide](./quick-start.md) - Getting started with BMM -- [FAQ](./faq.md) - Common questions +- [Agents Reference](../../reference/agents/index.md) - Complete agent reference +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Getting started with BMM +- [Setup Party Mode](../../how-to/workflows/setup-party-mode.md) - How to use it --- diff --git a/docs/explanation/features/quick-flow.md b/docs/explanation/features/quick-flow.md new file mode 100644 index 00000000..fe2723c7 --- /dev/null +++ b/docs/explanation/features/quick-flow.md @@ -0,0 +1,169 @@ +--- +title: "Quick Spec Flow" +description: Understanding Quick Spec Flow for rapid development in BMad Method +--- + + +Quick Spec Flow is a streamlined alternative to the full BMad Method for Quick Flow track projects. Instead of going through Product Brief → PRD → Architecture, you go straight to a context-aware technical specification and start coding. + +**Perfect for:** Bug fixes, small features, rapid prototyping, and quick enhancements + +**Time to implementation:** Minutes, not hours + +--- + +## When to Use Quick Flow + +### ✅ Use Quick Flow when: + +- Single bug fix or small enhancement +- Small feature with clear scope (typically 1-15 stories) +- Rapid prototyping or experimentation +- Adding to existing brownfield codebase +- You know exactly what you want to build + +### ❌ Use BMad Method or Enterprise when: + +- Building new products or major features +- Need stakeholder alignment +- Complex multi-team coordination +- Requires extensive planning and architecture + +💡 **Not sure?** Run `workflow-init` to get a recommendation based on your project's needs! + +--- + +## Quick Flow Overview + +```mermaid +flowchart TD + START[Step 1: Run Tech-Spec Workflow] + DETECT[Detects project stack] + ANALYZE[Analyzes brownfield codebase] + TEST[Detects test frameworks] + CONFIRM[Confirms conventions] + GENERATE[Generates context-rich tech-spec] + STORIES[Creates ready-to-implement stories] + IMPL[Step 2: Implement with DEV Agent] + DONE[DONE!] + + START --> DETECT + DETECT --> ANALYZE + ANALYZE --> TEST + TEST --> CONFIRM + CONFIRM --> GENERATE + GENERATE --> STORIES + STORIES --> IMPL + IMPL --> DONE + + style START fill:#bfb,stroke:#333,stroke-width:2px + style IMPL fill:#bbf,stroke:#333,stroke-width:2px + style DONE fill:#f9f,stroke:#333,stroke-width:3px +``` + +--- + +## What Makes It Quick + +- ✅ No Product Brief needed +- ✅ No PRD needed +- ✅ No Architecture doc needed +- ✅ Auto-detects your stack +- ✅ Auto-analyzes brownfield code +- ✅ Auto-validates quality +- ✅ Story context optional (tech-spec is comprehensive!) + +--- + +## Smart Context Discovery + +Quick Spec Flow automatically discovers and uses: + +### Existing Documentation +- Product briefs (if they exist) +- Research documents +- `document-project` output (brownfield codebase map) + +### Project Stack +- **Node.js:** package.json → frameworks, dependencies, scripts +- **Python:** requirements.txt, pyproject.toml → packages, tools +- **Ruby:** Gemfile → gems and versions +- **Java:** pom.xml, build.gradle → Maven/Gradle dependencies +- **Go:** go.mod → modules +- **Rust:** Cargo.toml → crates + +### Brownfield Code Patterns +- Directory structure and organization +- Existing code patterns (class-based, functional, MVC) +- Naming conventions +- Test frameworks and patterns +- Code style configurations + +### Convention Confirmation + +Quick Spec Flow detects your conventions and **asks for confirmation**: + +``` +I've detected these conventions in your codebase: + +Code Style: +- ESLint with Airbnb config +- Prettier with single quotes + +Test Patterns: +- Jest test framework +- .test.js file naming + +Should I follow these existing conventions? (yes/no) +``` + +**You decide:** Conform to existing patterns or establish new standards! + +--- + +## Auto-Validation + +Quick Spec Flow **automatically validates** everything: + +- ✅ Context gathering completeness +- ✅ Definitiveness (no "use X or Y" statements) +- ✅ Brownfield integration quality +- ✅ Stack alignment +- ✅ Implementation readiness + +--- + +## Comparison: Quick Flow vs Full BMM + +| Aspect | Quick Flow Track | BMad Method/Enterprise Tracks | +| --------------------- | ---------------------------- | ---------------------------------- | +| **Setup** | None (standalone) | workflow-init recommended | +| **Planning Docs** | tech-spec.md only | Product Brief → PRD → Architecture | +| **Time to Code** | Minutes | Hours to days | +| **Best For** | Bug fixes, small features | New products, major features | +| **Context Discovery** | Automatic | Manual + guided | +| **Validation** | Auto-validates everything | Manual validation steps | +| **Brownfield** | Auto-analyzes and conforms | Manual documentation required | + +--- + +## When to Graduate to BMad Method + +Start with Quick Flow, but switch to BMad Method when: + +- ❌ Project grows beyond initial scope +- ❌ Multiple teams need coordination +- ❌ Stakeholders need formal documentation +- ❌ Product vision is unclear +- ❌ Architectural decisions need deep analysis +- ❌ Compliance/regulatory requirements exist + +💡 **Tip:** You can always run `workflow-init` later to transition from Quick Flow to BMad Method! + +--- + +## Related + +- [Create Tech Spec](../../how-to/workflows/create-tech-spec.md) - How to use Quick Flow +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Getting started +- [Four Phases](../architecture/four-phases.md) - Understanding the full methodology diff --git a/docs/explanation/features/tea-overview.md b/docs/explanation/features/tea-overview.md new file mode 100644 index 00000000..b8666cb8 --- /dev/null +++ b/docs/explanation/features/tea-overview.md @@ -0,0 +1,218 @@ +--- +title: "Test Architect (TEA) Overview" +description: Understanding the Test Architect (TEA) agent and its role in BMad Method +--- + + +The Test Architect (TEA) is a specialized agent focused on quality strategy, test automation, and release gates in BMad Method projects. + +## Overview + +- **Persona:** Murat, Master Test Architect and Quality Advisor focused on risk-based testing, fixture architecture, ATDD, and CI/CD governance. +- **Mission:** Deliver actionable quality strategies, automation coverage, and gate decisions that scale with project complexity and compliance demands. +- **Use When:** BMad Method or Enterprise track projects, integration risk is non-trivial, brownfield regression risk exists, or compliance/NFR evidence is required. (Quick Flow projects typically don't require TEA) + +--- + +## Choose Your TEA Engagement Model + +BMad does not mandate TEA. There are five valid ways to use it (or skip it). Pick one intentionally. + +1. **No TEA** + - Skip all TEA workflows. Use your existing team testing approach. + +2. **TEA-only (Standalone)** + - Use TEA on a non-BMad project. Bring your own requirements, acceptance criteria, and environments. + - Typical sequence: `*test-design` (system or epic) -> `*atdd` and/or `*automate` -> optional `*test-review` -> `*trace` for coverage and gate decisions. + - Run `*framework` or `*ci` only if you want TEA to scaffold the harness or pipeline. + +3. **Integrated: Greenfield - BMad Method (Simple/Standard Work)** + - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. + - Phase 4: per-epic `*test-design`, optional `*atdd`, then `*automate` and optional `*test-review`. + - Gate (Phase 2): `*trace`. + +4. **Integrated: Brownfield - BMad Method or Enterprise (Simple or Complex)** + - Phase 2: baseline `*trace`. + - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. + - Phase 4: per-epic `*test-design` focused on regression and integration risks. + - Gate (Phase 2): `*trace`; `*nfr-assess` (if not done earlier). + - For brownfield BMad Method, follow the same flow with `*nfr-assess` optional. + +5. **Integrated: Greenfield - Enterprise Method (Enterprise/Compliance Work)** + - Phase 2: `*nfr-assess`. + - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. + - Phase 4: per-epic `*test-design`, plus `*atdd`/`*automate`/`*test-review`. + - Gate (Phase 2): `*trace`; archive artifacts as needed. + +If you are unsure, default to the integrated path for your track and adjust later. + +--- + +## TEA Workflow Lifecycle + +TEA integrates into the BMad development lifecycle during Solutioning (Phase 3) and Implementation (Phase 4): + +```mermaid +%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','fontSize':'16px','fontFamily':'arial'}}}%% +graph TB + subgraph Phase2["Phase 2: PLANNING"] + PM["PM: *prd (creates PRD with FRs/NFRs)"] + PlanNote["Business requirements phase"] + NFR2["TEA: *nfr-assess (optional, enterprise)"] + PM -.-> NFR2 + NFR2 -.-> PlanNote + PM -.-> PlanNote + end + + subgraph Phase3["Phase 3: SOLUTIONING"] + Architecture["Architect: *architecture"] + EpicsStories["PM/Architect: *create-epics-and-stories"] + TestDesignSys["TEA: *test-design (system-level)"] + Framework["TEA: *framework (optional if needed)"] + CI["TEA: *ci (optional if needed)"] + GateCheck["Architect: *implementation-readiness"] + Architecture --> EpicsStories + Architecture --> TestDesignSys + TestDesignSys --> Framework + EpicsStories --> Framework + Framework --> CI + CI --> GateCheck + Phase3Note["Epics created AFTER architecture,
then system-level test design and test infrastructure setup"] + EpicsStories -.-> Phase3Note + end + + subgraph Phase4["Phase 4: IMPLEMENTATION - Per Epic Cycle"] + SprintPlan["SM: *sprint-planning"] + TestDesign["TEA: *test-design (per epic)"] + CreateStory["SM: *create-story"] + ATDD["TEA: *atdd (optional, before dev)"] + DevImpl["DEV: implements story"] + Automate["TEA: *automate"] + TestReview1["TEA: *test-review (optional)"] + Trace1["TEA: *trace (refresh coverage)"] + + SprintPlan --> TestDesign + TestDesign --> CreateStory + CreateStory --> ATDD + ATDD --> DevImpl + DevImpl --> Automate + Automate --> TestReview1 + TestReview1 --> Trace1 + Trace1 -.->|next story| CreateStory + TestDesignNote["Test design: 'How do I test THIS epic?'
Creates test-design-epic-N.md per epic"] + TestDesign -.-> TestDesignNote + end + + subgraph Gate["EPIC/RELEASE GATE"] + NFR["TEA: *nfr-assess (if not done earlier)"] + TestReview2["TEA: *test-review (final audit, optional)"] + TraceGate["TEA: *trace - Phase 2: Gate"] + GateDecision{"Gate Decision"} + + NFR --> TestReview2 + TestReview2 --> TraceGate + TraceGate --> GateDecision + GateDecision -->|PASS| Pass["PASS ✅"] + GateDecision -->|CONCERNS| Concerns["CONCERNS ⚠️"] + GateDecision -->|FAIL| Fail["FAIL ❌"] + GateDecision -->|WAIVED| Waived["WAIVED ⏭️"] + end + + Phase2 --> Phase3 + Phase3 --> Phase4 + Phase4 --> Gate + + style Phase2 fill:#bbdefb,stroke:#0d47a1,stroke-width:3px,color:#000 + style Phase3 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px,color:#000 + style Phase4 fill:#e1bee7,stroke:#4a148c,stroke-width:3px,color:#000 + style Gate fill:#ffe082,stroke:#f57c00,stroke-width:3px,color:#000 + style Pass fill:#4caf50,stroke:#1b5e20,stroke-width:3px,color:#000 + style Concerns fill:#ffc107,stroke:#f57f17,stroke-width:3px,color:#000 + style Fail fill:#f44336,stroke:#b71c1c,stroke-width:3px,color:#000 + style Waived fill:#9c27b0,stroke:#4a148c,stroke-width:3px,color:#000 +``` + +**Phase Numbering Note:** BMad uses a 4-phase methodology with optional Phase 1 and documentation prerequisite: + +- **Documentation** (Optional for brownfield): Prerequisite using `*document-project` +- **Phase 1** (Optional): Discovery/Analysis (`*brainstorm`, `*research`, `*product-brief`) +- **Phase 2** (Required): Planning (`*prd` creates PRD with FRs/NFRs) +- **Phase 3** (Track-dependent): Solutioning (`*architecture` → `*test-design` (system-level) → `*create-epics-and-stories` → TEA: `*framework`, `*ci` → `*implementation-readiness`) +- **Phase 4** (Required): Implementation (`*sprint-planning` → per-epic: `*test-design` → per-story: dev workflows) + +**TEA workflows:** `*framework` and `*ci` run once in Phase 3 after architecture. `*test-design` is **dual-mode**: + +- **System-level (Phase 3):** Run immediately after architecture/ADR drafting to produce `test-design-system.md` (testability review, ADR → test mapping, Architecturally Significant Requirements (ASRs), environment needs). Feeds the implementation-readiness gate. +- **Epic-level (Phase 4):** Run per-epic to produce `test-design-epic-N.md` (risk, priorities, coverage plan). + +Quick Flow track skips Phases 1 and 3. +BMad Method and Enterprise use all phases based on project needs. +When an ADR or architecture draft is produced, run `*test-design` in **system-level** mode before the implementation-readiness gate. This ensures the ADR has an attached testability review and ADR → test mapping. Keep the test-design updated if ADRs change. + +--- + +## Why TEA is Different from Other BMM Agents + +TEA is the only BMM agent that operates in **multiple phases** (Phase 3 and Phase 4) and has its own **knowledge base architecture**. + +### Phase-Specific Agents (Standard Pattern) + +Most BMM agents work in a single phase: + +- **Phase 1 (Analysis)**: Analyst agent +- **Phase 2 (Planning)**: PM agent +- **Phase 3 (Solutioning)**: Architect agent +- **Phase 4 (Implementation)**: SM, DEV agents + +### TEA: Multi-Phase Quality Agent (Unique Pattern) + +TEA is **the only agent that operates in multiple phases**: + +``` +Phase 1 (Analysis) → [TEA not typically used] + ↓ +Phase 2 (Planning) → [PM defines requirements - TEA not active] + ↓ +Phase 3 (Solutioning) → TEA: *framework, *ci (test infrastructure AFTER architecture) + ↓ +Phase 4 (Implementation) → TEA: *test-design (per epic: "how do I test THIS feature?") + → TEA: *atdd, *automate, *test-review, *trace (per story) + ↓ +Epic/Release Gate → TEA: *nfr-assess, *trace Phase 2 (release decision) +``` + +### TEA's 8 Workflows Across Phases + +**Standard agents**: 1-3 workflows per phase +**TEA**: 8 workflows across Phase 3, Phase 4, and Release Gate + +| Phase | TEA Workflows | Frequency | Purpose | +| ----------- | --------------------------------------------------------- | ---------------- | ---------------------------------------------- | +| **Phase 2** | (none) | - | Planning phase - PM defines requirements | +| **Phase 3** | \*framework, \*ci | Once per project | Setup test infrastructure AFTER architecture | +| **Phase 4** | \*test-design, \*atdd, \*automate, \*test-review, \*trace | Per epic/story | Test planning per epic, then per-story testing | +| **Release** | \*nfr-assess, \*trace (Phase 2: gate) | Per epic/release | Go/no-go decision | + +**Note**: `*trace` is a two-phase workflow: Phase 1 (traceability) + Phase 2 (gate decision). This reduces cognitive load while maintaining natural workflow. + +--- + +## TEA Command Catalog + +| Command | Primary Outputs | Notes | +| -------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------- | +| `*framework` | Playwright/Cypress scaffold, `.env.example`, `.nvmrc`, sample specs | Use when no production-ready harness exists | +| `*ci` | CI workflow, selective test scripts, secrets checklist | Platform-aware (GitHub Actions default) | +| `*test-design` | Combined risk assessment, mitigation plan, and coverage strategy | Risk scoring + optional exploratory mode | +| `*atdd` | Failing acceptance tests + implementation checklist | TDD red phase + optional recording mode | +| `*automate` | Prioritized specs, fixtures, README/script updates, DoD summary | Optional healing/recording, avoid duplicate coverage | +| `*test-review` | Test quality review report with 0-100 score, violations, fixes | Reviews tests against knowledge base patterns | +| `*nfr-assess` | NFR assessment report with actions | Focus on security/performance/reliability | +| `*trace` | Phase 1: Coverage matrix, recommendations. Phase 2: Gate decision (PASS/CONCERNS/FAIL/WAIVED) | Two-phase workflow: traceability + gate decision | + +--- + +## Related Documentation + +- [Setup Test Framework](../../how-to/workflows/setup-test-framework.md) - How to set up testing infrastructure +- [Run Test Design](../../how-to/workflows/run-test-design.md) - Creating test plans diff --git a/docs/bmad-core-concepts/web-bundles/index.md b/docs/explanation/features/web-bundles.md similarity index 97% rename from docs/bmad-core-concepts/web-bundles/index.md rename to docs/explanation/features/web-bundles.md index c1353098..aeef17e1 100644 --- a/docs/bmad-core-concepts/web-bundles/index.md +++ b/docs/explanation/features/web-bundles.md @@ -1,4 +1,7 @@ -# Web Bundles +--- +title: "Web Bundles" +--- + Use BMAD agents in Gemini Gems and Custom GPTs. diff --git a/docs/modules/bmgd-bmad-game-dev/agents-guide.md b/docs/explanation/game-dev/agents.md similarity index 97% rename from docs/modules/bmgd-bmad-game-dev/agents-guide.md rename to docs/explanation/game-dev/agents.md index 40311984..8d07d7af 100644 --- a/docs/modules/bmgd-bmad-game-dev/agents-guide.md +++ b/docs/explanation/game-dev/agents.md @@ -1,4 +1,7 @@ -# BMGD Agents Guide +--- +title: "BMGD Agents Guide" +--- + Complete reference for BMGD's six specialized game development agents. @@ -402,6 +405,6 @@ The `project-context.md` file (if present) serves as the authoritative source fo ## Next Steps -- **[Quick Start Guide](./quick-start.md)** - Get started with BMGD -- **[Workflows Guide](./workflows-guide.md)** - Detailed workflow reference -- **[Game Types Guide](./game-types-guide.md)** - Game type templates +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Get started with BMGD +- **[Workflows Guide](../../reference/workflows/index.md)** - Detailed workflow reference +- **[Game Types Guide](../../explanation/game-dev/game-types.md)** - Game type templates diff --git a/docs/explanation/game-dev/bmgd-vs-bmm.md b/docs/explanation/game-dev/bmgd-vs-bmm.md new file mode 100644 index 00000000..a5f5588a --- /dev/null +++ b/docs/explanation/game-dev/bmgd-vs-bmm.md @@ -0,0 +1,150 @@ +--- +title: "BMGD vs BMM" +description: Understanding the differences between BMGD and BMM +--- + + +BMGD (BMad Game Development) extends BMM (BMad Method) with game-specific capabilities. This page explains the key differences. + +--- + +## Quick Comparison + +| Aspect | BMM | BMGD | +| -------------- | ------------------------------------- | ------------------------------------------------------------------------ | +| **Focus** | General software | Game development | +| **Agents** | PM, Architect, Dev, SM, TEA, Solo Dev | Game Designer, Game Dev, Game Architect, Game SM, Game QA, Game Solo Dev | +| **Planning** | PRD, Tech Spec | Game Brief, GDD | +| **Types** | N/A | 24 game type templates | +| **Narrative** | N/A | Full narrative workflow | +| **Testing** | Web-focused | Engine-specific (Unity, Unreal, Godot) | +| **Production** | BMM workflows | BMM workflows with game overrides | + +--- + +## Agent Differences + +### BMM Agents +- PM (Product Manager) +- Architect +- DEV (Developer) +- SM (Scrum Master) +- TEA (Test Architect) +- Quick Flow Solo Dev + +### BMGD Agents +- Game Designer +- Game Developer +- Game Architect +- Game Scrum Master +- Game QA +- Game Solo Dev + +BMGD agents understand game-specific concepts like: +- Game mechanics and balance +- Player psychology +- Engine-specific patterns +- Playtesting and QA + +--- + +## Planning Documents + +### BMM Planning +- **Product Brief** → **PRD** → **Architecture** +- Focus: Software requirements, user stories, system design + +### BMGD Planning +- **Game Brief** → **GDD** → **Architecture** +- Focus: Game vision, mechanics, narrative, player experience + +The GDD (Game Design Document) includes: +- Core gameplay loop +- Mechanics and systems +- Progression and balance +- Art and audio direction +- Genre-specific sections + +--- + +## Game Type Templates + +BMGD includes 24 game type templates that auto-configure GDD sections: + +- Action, Adventure, Puzzle +- RPG, Strategy, Simulation +- Sports, Racing, Fighting +- Horror, Platformer, Shooter +- And more... + +Each template provides: +- Genre-specific GDD sections +- Relevant mechanics patterns +- Testing considerations +- Common pitfalls to avoid + +--- + +## Narrative Support + +BMGD includes full narrative workflow for story-driven games: + +- **Narrative Design** workflow +- Story structure templates +- Character development +- World-building guidelines +- Dialogue systems + +BMM has no equivalent for narrative design. + +--- + +## Testing Differences + +### BMM Testing (TEA) +- Web-focused (Playwright, Cypress) +- API testing +- E2E for web applications + +### BMGD Testing (Game QA) +- Engine-specific frameworks (Unity, Unreal, Godot) +- Gameplay testing +- Performance profiling +- Playtest planning +- Balance validation + +--- + +## Production Workflow + +BMGD production workflows **inherit from BMM** and add game-specific: +- Checklists +- Templates +- Quality gates +- Engine-specific considerations + +This means you get all of BMM's implementation structure plus game-specific enhancements. + +--- + +## When to Use Each + +### Use BMM when: +- Building web applications +- Creating APIs and services +- Developing mobile apps (non-game) +- Any general software project + +### Use BMGD when: +- Building video games +- Creating interactive experiences +- Game prototyping +- Game jams + +--- + +## Related + +- [BMGD Overview](./index.md) - Getting started with BMGD +- [Game Types Guide](./game-types.md) - Understanding game templates +- [Quick Start BMGD](../../tutorials/getting-started/quick-start-bmgd.md) - Tutorial diff --git a/docs/modules/bmgd-bmad-game-dev/game-types-guide.md b/docs/explanation/game-dev/game-types.md similarity index 96% rename from docs/modules/bmgd-bmad-game-dev/game-types-guide.md rename to docs/explanation/game-dev/game-types.md index f66bb538..9de71c96 100644 --- a/docs/modules/bmgd-bmad-game-dev/game-types-guide.md +++ b/docs/explanation/game-dev/game-types.md @@ -1,4 +1,7 @@ -# BMGD Game Types Guide +--- +title: "BMGD Game Types Guide" +--- + Reference for selecting and using BMGD's 24 supported game type templates. @@ -498,6 +501,6 @@ When you select a game type, BMGD adds these GDD sections: ## Next Steps -- **[Quick Start Guide](./quick-start.md)** - Get started with BMGD -- **[Workflows Guide](./workflows-guide.md)** - GDD workflow details -- **[Glossary](./glossary.md)** - Game development terminology +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Get started with BMGD +- **[Workflows Guide](../../reference/workflows/bmgd-workflows.md)** - GDD workflow details +- **[Glossary](../../reference/glossary/index.md)** - Game development terminology diff --git a/docs/explanation/game-dev/index.md b/docs/explanation/game-dev/index.md new file mode 100644 index 00000000..a85c6bac --- /dev/null +++ b/docs/explanation/game-dev/index.md @@ -0,0 +1,85 @@ +--- +title: "BMGD - Game Development Module" +description: AI-powered workflows for game design and development with BMGD +--- + + +Complete guides for the BMad Game Development Module (BMGD) - AI-powered workflows for game design and development that adapt to your project's needs. + +--- + +## Getting Started + +**New to BMGD?** Start here: + +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Get started building your first game + - Installation and setup + - Understanding the game development phases + - Running your first workflows + - Agent-based development flow + +**Quick Path:** Install BMGD module → Game Brief → GDD → Architecture → Build + +--- + +## Core Documentation + +- **[Game Types Guide](./game-types.md)** - Selecting and using game type templates (24 supported types) +- **[BMGD vs BMM](./bmgd-vs-bmm.md)** - Understanding the differences + +--- + +## Game Development Phases + +BMGD follows four phases aligned with game development: + +### Phase 1: Preproduction +- **Brainstorm Game** - Ideation with game-specific techniques +- **Game Brief** - Capture vision, market, and fundamentals + +### Phase 2: Design +- **GDD (Game Design Document)** - Comprehensive game design +- **Narrative Design** - Story, characters, world (for story-driven games) + +### Phase 3: Technical +- **Game Architecture** - Engine, systems, patterns, structure + +### Phase 4: Production +- **Sprint Planning** - Epic and story management +- **Story Development** - Implementation workflow +- **Code Review** - Quality assurance +- **Testing** - Automated tests, playtesting, performance +- **Retrospective** - Continuous improvement + +--- + +## Choose Your Path + +### I need to... + +**Start a new game project** +→ Start with [Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md) +→ Run `brainstorm-game` for ideation +→ Create a Game Brief with `create-brief` + +**Design my game** +→ Create a GDD with `create-gdd` +→ If story-heavy, add Narrative Design with `create-narrative` + +**Plan the technical architecture** +→ Run `create-architecture` with the Game Architect + +**Build my game** +→ Use Phase 4 production workflows +→ Follow the sprint-based development cycle + +**Quickly test an idea** +→ Use [Quick-Flow](../../how-to/workflows/bmgd-quick-flow.md) for rapid prototyping + +--- + +## Related + +- [Game Types Guide](./game-types.md) - Understanding game type templates +- [BMGD vs BMM](./bmgd-vs-bmm.md) - Comparison with core method +- [Glossary](../../reference/glossary/index.md) - Terminology reference diff --git a/docs/explanation/index.md b/docs/explanation/index.md new file mode 100644 index 00000000..cbcd9f83 --- /dev/null +++ b/docs/explanation/index.md @@ -0,0 +1,35 @@ +--- +title: "Explanation" +--- + + +Understanding-oriented content that explains concepts, architecture, and the reasoning behind BMAD's design. + +## Core Concepts + +Foundational concepts you need to understand BMAD. + +- [What are Agents?](./core-concepts/what-are-agents.md) +- [What are Workflows?](./core-concepts/what-are-workflows.md) +- [What are Modules?](./core-concepts/what-are-modules.md) + +## Architecture + +How BMAD is designed and why. + +## Philosophy + +The thinking behind BMAD's approach. + +## Features + +Deep dives into specific BMAD features. + +- [Party Mode](./features/party-mode.md) +- [Brainstorming Techniques](./features/brainstorming-techniques.md) +- [Advanced Elicitation](./features/advanced-elicitation.md) +- [Web Bundles](./features/web-bundles.md) + +## Modules + +Explanations of BMAD's module ecosystem. diff --git a/docs/explanation/philosophy/facilitation-over-generation.md b/docs/explanation/philosophy/facilitation-over-generation.md new file mode 100644 index 00000000..09c6e6bb --- /dev/null +++ b/docs/explanation/philosophy/facilitation-over-generation.md @@ -0,0 +1,121 @@ +--- +title: "Facilitation Over Generation" +description: Understanding CIS's facilitation-first approach to creative work +--- + + +The Creative Intelligence Suite (CIS) takes a fundamentally different approach from typical AI tools. Instead of generating solutions directly, CIS agents act as master facilitators who guide you to discover insights yourself. + +--- + +## The Problem with Generation + +Traditional AI approaches to creative work: + +``` +User: "Give me marketing ideas" +AI: "Here are 10 marketing ideas..." +``` + +This approach: +- Produces generic, predictable outputs +- Removes human ownership of ideas +- Misses context and nuance +- Limits creative exploration + +--- + +## The Facilitation Approach + +CIS agents use strategic questioning: + +``` +User: "I need marketing ideas" +CIS: "What makes your customers choose you over alternatives? + What's the one thing they always mention?" +User: "They say our support is exceptional" +CIS: "Interesting! How might you make that exceptional + support visible before they become customers?" +``` + +This approach: +- Draws out insights already within you +- Maintains human ownership of ideas +- Captures context and nuance +- Enables deeper creative exploration + +--- + +## Key Principles + +### 1. Questions Over Answers + +CIS agents ask strategic questions rather than providing direct answers. This: +- Activates your own creative thinking +- Uncovers assumptions +- Reveals blind spots +- Builds on your domain knowledge + +### 2. Energy-Aware Sessions + +CIS monitors engagement and adapts: +- Adjusts pace when energy flags +- Suggests breaks when needed +- Changes techniques to maintain momentum +- Recognizes productive vs. unproductive struggle + +### 3. Process Trust + +CIS uses proven methodologies: +- Design Thinking's 5 phases +- Structured brainstorming techniques +- Root cause analysis frameworks +- Innovation strategy patterns + +You're not just having a conversation—you're following time-tested creative processes. + +### 4. Persona-Driven Engagement + +Each CIS agent has a distinct personality: +- **Carson** - Energetic, encouraging +- **Maya** - Jazz-like, improvisational +- **Dr. Quinn** - Analytical, methodical +- **Victor** - Bold, strategic +- **Sophia** - Narrative, imaginative + +These personas create engaging experiences that maintain creative flow. + +--- + +## When Generation is Appropriate + +CIS does generate when appropriate: +- Synthesizing session outputs +- Documenting decisions +- Creating structured artifacts +- Providing technique examples + +But the core creative work happens through facilitated discovery. + +--- + +## Benefits + +### For Individuals +- Deeper insights than pure generation +- Ownership of creative outputs +- Skill development in creative thinking +- More memorable and actionable ideas + +### For Teams +- Shared creative experience +- Aligned understanding +- Documented rationale +- Stronger buy-in to outcomes + +--- + +## Related + +- [Creative Intelligence Suite](../creative-intelligence/index.md) - CIS overview +- [Brainstorming Techniques](../features/brainstorming-techniques.md) - Available techniques diff --git a/docs/how-to/brownfield/add-feature-to-existing.md b/docs/how-to/brownfield/add-feature-to-existing.md new file mode 100644 index 00000000..d189a316 --- /dev/null +++ b/docs/how-to/brownfield/add-feature-to-existing.md @@ -0,0 +1,91 @@ +--- +title: "How to Add a Feature to an Existing Project" +description: How to add new features to an existing brownfield project +--- + + +Add new functionality to your brownfield codebase while respecting existing patterns and architecture. + +--- + +## When to Use This + +- Adding a new feature to an existing codebase +- Major enhancements that need proper planning +- Features that touch multiple parts of the system + +--- + +## Prerequisites + +- BMad Method installed +- Existing project documentation (run `document-project` first if needed) +- Clear understanding of what you want to build + +--- + +## Steps + +### 1. Run workflow-init + +``` +Run workflow-init +``` + +The workflow should recognize you're in an existing project. If not, explicitly clarify that this is brownfield development. + +### 2. Choose Your Approach + +| Feature Scope | Recommended Approach | +|---------------|---------------------| +| Small (1-5 stories) | Quick Flow with tech-spec | +| Medium (5-15 stories) | BMad Method with PRD | +| Large (15+ stories) | Full BMad Method with architecture | + +### 3. Create Planning Documents + +**For Quick Flow:** +- Load PM agent +- Run tech-spec workflow +- The agent will analyze your existing codebase and create a context-aware spec + +**For BMad Method:** +- Load PM agent +- Run PRD workflow +- Ensure the agent reads your existing documentation +- Review that integration points are clearly identified + +### 4. Consider Architecture Impact + +If your feature affects system architecture: + +- Load Architect agent +- Run architecture workflow +- Ensure alignment with existing patterns +- Document any new ADRs (Architecture Decision Records) + +### 5. Implement + +Follow the standard Phase 4 implementation workflows: + +1. `sprint-planning` - Organize your work +2. `create-story` - Prepare each story +3. `dev-story` - Implement with tests +4. `code-review` - Quality assurance + +--- + +## Tips + +- Always ensure agents read your existing documentation +- Pay attention to integration points with existing code +- Follow existing conventions unless deliberately changing them +- Document why you're adding new patterns (if any) + +--- + +## Related + +- [Brownfield Development Guide](./index.md) +- [Document Existing Project](./document-existing-project.md) +- [Quick Fix in Brownfield](./quick-fix-in-brownfield.md) diff --git a/docs/how-to/brownfield/document-existing-project.md b/docs/how-to/brownfield/document-existing-project.md new file mode 100644 index 00000000..08e1f370 --- /dev/null +++ b/docs/how-to/brownfield/document-existing-project.md @@ -0,0 +1,84 @@ +--- +title: "How to Document an Existing Project" +description: How to document an existing brownfield codebase using BMad Method +--- + + +Use the `document-project` workflow to scan your entire codebase and generate comprehensive documentation about its current state. + +--- + +## When to Use This + +- Starting work on an undocumented legacy project +- Documentation is outdated and needs refresh +- AI agents need context about existing code patterns +- Onboarding new team members + +--- + +## Prerequisites + +- BMad Method installed in your project +- Access to the codebase you want to document + +--- + +## Steps + +### 1. Load the Analyst Agent + +Start a fresh chat and load the Analyst agent. + +### 2. Run the document-project Workflow + +Tell the agent: + +``` +Run the document-project workflow +``` + +### 3. Let the Agent Scan Your Codebase + +The workflow will: + +- Scan your codebase structure +- Identify architecture patterns +- Document the technology stack +- Create reference documentation +- Generate a PRD-like document from existing code + +### 4. Review the Generated Documentation + +The output will be saved to `project-documentation-{date}.md` in your output folder. + +Review the documentation for: + +- Accuracy of detected patterns +- Completeness of architecture description +- Any missing business rules or intent + +--- + +## What You Get + +- **Project overview** - High-level description of what the project does +- **Technology stack** - Detected frameworks, libraries, and tools +- **Architecture patterns** - Code organization and design patterns found +- **Business rules** - Logic extracted from the codebase +- **Integration points** - External APIs and services + +--- + +## Tips + +- Run this before any major brownfield work +- Keep the documentation updated as the project evolves +- Use it as input for future PRD creation + +--- + +## Related + +- [Brownfield Development Guide](./index.md) +- [Add Feature to Existing Project](./add-feature-to-existing.md) diff --git a/docs/modules/bmm-bmad-method/brownfield-guide.md b/docs/how-to/brownfield/index.md similarity index 61% rename from docs/modules/bmm-bmad-method/brownfield-guide.md rename to docs/how-to/brownfield/index.md index 076303ae..54555771 100644 --- a/docs/modules/bmm-bmad-method/brownfield-guide.md +++ b/docs/how-to/brownfield/index.md @@ -1,23 +1,41 @@ -# BMad Method Brownfield Development Guide +--- +title: "Brownfield Development" +description: How to use BMad Method on existing codebases +--- -## Working on Existing Projects -If you have completed your initial PRD on a new project and want to add new features, or if you have a legacy project you are maintaining, you will want to follow the brownfield process. +How to effectively use BMad Method when working on existing projects and legacy codebases. -This document is intentionally brief, focusing only on what differs from the standard greenfield flow. +## What is Brownfield Development? + +**Brownfield** refers to working on existing projects with established codebases and patterns, as opposed to **greenfield** which means starting from scratch with a clean slate. + +This tutorial covers the essential workflow for onboarding to brownfield projects with BMad Method. --- -## 1. Clean Up Completed Planning Artifacts +## Prerequisites + +- BMad Method installed (`npx bmad-method install`) +- An existing codebase you want to work on +- Access to an AI-powered IDE (Claude Code, Cursor, or Windsurf) + +--- + +## Step 1: Clean Up Completed Planning Artifacts If you have completed all PRD epics and stories through the BMad process, clean up those files. Archive them, delete them, or rely on version history if needed. Do not keep these files in: + - `docs/` - `_bmad-output/planning-artifacts/` - `_bmad-output/implementation-artifacts/` -## 2. Maintain Quality Project Documentation +--- + +## Step 2: Maintain Quality Project Documentation Your `docs/` folder should contain succinct, well-organized documentation that accurately represents your project: + - Intent and business rationale - Business rules - Architecture @@ -25,7 +43,9 @@ Your `docs/` folder should contain succinct, well-organized documentation that a For complex projects, consider using the `document-project` workflow. It offers runtime variants that will scan your entire project and document its actual current state. -## 3. Initialize for Brownfield Work +--- + +## Step 3: Initialize for Brownfield Work Run `workflow-init`. It should recognize you are in an existing project. If not, explicitly clarify that this is brownfield development for a new feature. @@ -41,6 +61,7 @@ You have two primary options depending on the scope of changes: ### During PRD Creation When creating a brief or jumping directly into the PRD, ensure the agent: + - Finds and analyzes your existing project documentation - Reads the proper context about your current system @@ -49,6 +70,7 @@ You can guide the agent explicitly, but the goal is to ensure the new feature in ### UX Considerations UX work is optional. The decision depends not on whether your project has a UX, but on: + - Whether you will be working on UX changes - Whether significant new UX designs or patterns are needed @@ -57,6 +79,7 @@ If your changes amount to simple updates to existing screens you are happy with, ### Architecture Considerations When doing architecture, ensure the architect: + - Uses the proper documented files - Scans the existing codebase @@ -64,15 +87,16 @@ Pay close attention here to prevent reinventing the wheel or making decisions th --- -## 4. Ad-Hoc Changes +## Next Steps -Not everything requires the full BMad method or even quick-flow. For bug fixes, refactorings, or small targeted changes, simply talk to the agent and have it make the changes directly. This is also a good way to learn about your codebase and understand the modifications being made. +- **[Document Existing Project](../../how-to/brownfield/document-existing-project.md)** - How to document your brownfield codebase +- **[Add Feature to Existing Project](../../how-to/brownfield/add-feature-to-existing.md)** - Adding new functionality +- **[Quick Fix in Brownfield](../../how-to/brownfield/quick-fix-in-brownfield.md)** - Bug fixes and ad-hoc changes +- **[Brownfield FAQ](../../explanation/faq/brownfield-faq.md)** - Common questions about brownfield development --- -## 5. Learn and Explore +## Related Documentation -Remember, LLMs are excellent at interpreting and analyzing code—whether it was AI-generated or not. Use the agent to: -- Learn about your project -- Understand how things are built -- Explore unfamiliar parts of the codebase \ No newline at end of file +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Getting started with BMM +- [Quick Spec Flow](../../explanation/features/quick-flow.md) - Fast path for small changes diff --git a/docs/how-to/brownfield/quick-fix-in-brownfield.md b/docs/how-to/brownfield/quick-fix-in-brownfield.md new file mode 100644 index 00000000..2cc2dc30 --- /dev/null +++ b/docs/how-to/brownfield/quick-fix-in-brownfield.md @@ -0,0 +1,94 @@ +--- +title: "How to Make Quick Fixes in Brownfield Projects" +description: How to make quick fixes and ad-hoc changes in brownfield projects +--- + + +Not everything requires the full BMad method or even Quick Flow. For bug fixes, refactorings, or small targeted changes, you can work directly with the agent. + +--- + +## When to Use This + +- Bug fixes +- Small refactorings +- Targeted code improvements +- Learning about your codebase +- One-off changes that don't need planning + +--- + +## Steps + +### 1. Load an Agent + +For quick fixes, you can use: + +- **DEV agent** - For implementation-focused work +- **Quick Flow Solo Dev** - For slightly larger changes that still need a tech-spec + +### 2. Describe the Change + +Simply tell the agent what you need: + +``` +Fix the login validation bug that allows empty passwords +``` + +or + +``` +Refactor the UserService to use async/await instead of callbacks +``` + +### 3. Let the Agent Work + +The agent will: + +- Analyze the relevant code +- Propose a solution +- Implement the change +- Run tests (if available) + +### 4. Review and Commit + +Review the changes made and commit when satisfied. + +--- + +## Learning Your Codebase + +This approach is also excellent for exploring unfamiliar code: + +``` +Explain how the authentication system works in this codebase +``` + +``` +Show me where error handling happens in the API layer +``` + +LLMs are excellent at interpreting and analyzing code—whether it was AI-generated or not. Use the agent to: + +- Learn about your project +- Understand how things are built +- Explore unfamiliar parts of the codebase + +--- + +## When to Upgrade to Formal Planning + +Consider using Quick Flow or full BMad Method when: + +- The change affects multiple files or systems +- You're unsure about the scope +- The fix keeps growing in complexity +- You need documentation for the change + +--- + +## Related + +- [Brownfield Development Guide](./index.md) +- [Add Feature to Existing Project](./add-feature-to-existing.md) +- [Quick Spec Flow](../../explanation/features/quick-flow.md) diff --git a/docs/bmad-core-concepts/bmad-customization/agents.md b/docs/how-to/customization/customize-agents.md similarity index 90% rename from docs/bmad-core-concepts/bmad-customization/agents.md rename to docs/how-to/customization/customize-agents.md index a1997459..88577dbd 100644 --- a/docs/bmad-core-concepts/bmad-customization/agents.md +++ b/docs/how-to/customization/customize-agents.md @@ -1,4 +1,7 @@ -# Agent Customization Guide +--- +title: "Agent Customization Guide" +--- + Customize BMad agents without modifying core files. All customizations persist through updates. @@ -26,10 +29,8 @@ After editing, IT IS CRITICAL to rebuild the agent to apply changes: ```bash npx bmad-method@alpha install # and then select option to compile all agents -# OR for individual agent only npx bmad-method@alpha build -# Examples: npx bmad-method@alpha build bmm-dev npx bmad-method@alpha build core-bmad-master npx bmad-method@alpha build bmm-pm @@ -119,7 +120,6 @@ prompts: **Example 1: Customize Developer Agent for TDD** ```yaml -# _bmad/_config/agents/bmm-dev.customize.yaml agent: metadata: name: 'TDD Developer' @@ -135,7 +135,6 @@ critical_actions: **Example 2: Add Custom Deployment Workflow** ```yaml -# _bmad/_config/agents/bmm-dev.customize.yaml menu: - trigger: deploy-staging workflow: '{project-root}/_bmad/deploy-staging.yaml' @@ -148,7 +147,6 @@ menu: **Example 3: Multilingual Product Manager** ```yaml -# _bmad/_config/agents/bmm-pm.customize.yaml persona: role: 'Bilingual Product Manager' identity: 'Expert in US and LATAM markets' @@ -203,8 +201,8 @@ memories: ## Next Steps -- **[Learn about Agents](../agents.md)** - Understand Simple vs Expert agents -- **[Agent Creation Guide](../../modules/bmb-bmad-builder/agent-creation-guide.md)** - Build completely custom agents -- **[BMM Complete Documentation](../../modules/bmm-bmad-method/index)** - Full BMad Method reference +- **[Learn about Agents](../../explanation/core-concepts/what-are-agents.md)** - Understand Simple vs Expert agents +- **[Agent Creation Guide](../../tutorials/advanced/create-custom-agent.md)** - Build completely custom agents +- **[BMM Complete Documentation](../../explanation/bmm/index.md)** - Full BMad Method reference [← Back to Customization](./index.md) diff --git a/docs/bmad-core-concepts/bmad-customization/workflows.md b/docs/how-to/customization/customize-workflows.md similarity index 88% rename from docs/bmad-core-concepts/bmad-customization/workflows.md rename to docs/how-to/customization/customize-workflows.md index e5db06ba..22d3998f 100644 --- a/docs/bmad-core-concepts/bmad-customization/workflows.md +++ b/docs/how-to/customization/customize-workflows.md @@ -1,4 +1,7 @@ -# Workflow Customization Guide +--- +title: "Workflow Customization Guide" +--- + Customize and optimize workflows with step replacement and hooks. @@ -20,11 +23,11 @@ Workflow customization will allow you to: While workflow customization is in development, you can: - **Create Custom Workflows** - Use the BMAD Builder to create entirely new workflows -- **Customize Agents** - Modify agent behavior using [Agent Customization](./agents.md) +- **Customize Agents** - Modify agent behavior using [Agent Customization](./customize-agents.md) - **Provide Feedback** - Share your workflow customization needs with the community --- -**In the meantime:** Learn how to [create custom workflows](../../modules/bmb-bmad-builder/index) from scratch. +**In the meantime:** Learn how to [create custom workflows](../../explanation/bmad-builder/index.md) from scratch. [← Back to Customization](./index.md) diff --git a/docs/bmad-core-concepts/bmad-customization/index.md b/docs/how-to/customization/index.md similarity index 60% rename from docs/bmad-core-concepts/bmad-customization/index.md rename to docs/how-to/customization/index.md index ae4b33bb..12c3eca1 100644 --- a/docs/bmad-core-concepts/bmad-customization/index.md +++ b/docs/how-to/customization/index.md @@ -1,4 +1,7 @@ -# BMAD Customization +--- +title: "BMAD Customization" +--- + Personalize agents and workflows to match your needs. @@ -6,8 +9,8 @@ Personalize agents and workflows to match your needs. | Guide | Description | |-------|-------------| -| **[Agent Customization](./agents.md)** | Modify agent behavior without editing core files | -| **[Workflow Customization](./workflows.md)** | Customize and optimize workflows | +| **[Agent Customization](./customize-agents.md)** | Modify agent behavior without editing core files | +| **[Workflow Customization](./customize-workflows.md)** | Customize and optimize workflows | ## Overview @@ -21,6 +24,6 @@ Replace or extend workflow steps to create tailored processes. (Coming soon) --- -**Next:** Read the [Agent Customization Guide](./agents.md) to start personalizing your agents. +**Next:** Read the [Agent Customization Guide](./customize-agents.md) to start personalizing your agents. [← Back to Core Concepts](../index.md) diff --git a/docs/modules/core/document-sharding-guide.md b/docs/how-to/customization/shard-large-documents.md similarity index 81% rename from docs/modules/core/document-sharding-guide.md rename to docs/how-to/customization/shard-large-documents.md index 4480042a..ea1c51f0 100644 --- a/docs/modules/core/document-sharding-guide.md +++ b/docs/how-to/customization/shard-large-documents.md @@ -1,24 +1,17 @@ -# Document Sharding Guide +--- +title: "Document Sharding Guide" +--- + Comprehensive guide to BMad Method's document sharding system for managing large planning and architecture documents. ## Table of Contents -- [Document Sharding Guide](#document-sharding-guide) - - [Table of Contents](#table-of-contents) - - [What is Document Sharding?](#what-is-document-sharding) - - [Architecture](#architecture) - - [When to Use Sharding](#when-to-use-sharding) - - [Ideal Candidates](#ideal-candidates) - - [How Sharding Works](#how-sharding-works) - - [Sharding Process](#sharding-process) - - [Workflow Discovery](#workflow-discovery) - - [Using the Shard-Doc Tool](#using-the-shard-doc-tool) - - [CLI Command](#cli-command) - - [Interactive Process](#interactive-process) - - [What Gets Created](#what-gets-created) - - [Workflow Support](#workflow-support) - - [Universal Support](#universal-support) +- [What is Document Sharding?](#what-is-document-sharding) +- [When to Use Sharding](#when-to-use-sharding) +- [How Sharding Works](#how-sharding-works) +- [Using the Shard-Doc Tool](#using-the-shard-doc-tool) +- [Workflow Support](#workflow-support) ## What is Document Sharding? @@ -103,7 +96,6 @@ Agent: Sharding PRD.md... **index.md structure:** ```markdown -# PRD - Index ## Sections diff --git a/docs/modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance.md b/docs/how-to/customization/vendor-workflows.md similarity index 97% rename from docs/modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance.md rename to docs/how-to/customization/vendor-workflows.md index c661b2a4..3dfec9b1 100644 --- a/docs/modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance.md +++ b/docs/how-to/customization/vendor-workflows.md @@ -1,4 +1,7 @@ -# Workflow Vendoring, Customization, and Inheritance (Official Support Consing Soon) +--- +title: "Workflow Vendoring, Customization, and Inheritance (Official Support Coming Soon)" +--- + Vendoring and Inheritance of workflows are 2 ways of sharing or reutilizing workflows - but with some key distinctions and use cases. diff --git a/docs/how-to/index.md b/docs/how-to/index.md new file mode 100644 index 00000000..3319781c --- /dev/null +++ b/docs/how-to/index.md @@ -0,0 +1,34 @@ +--- +title: "How-To Guides" +--- + + +Task-oriented guides that show you how to accomplish specific goals. Each guide assumes you already understand the basics. + +## Installation + +- [Upgrade to V6](./installation/upgrade-to-v6.md) +- [Install Custom Modules](./installation/install-custom-modules.md) + +## IDE Setup + +*Coming soon* + +## Customization + +- [Customize Agents](./customization/customize-agents.md) +- [Customize Workflows](./customization/customize-workflows.md) +- [Vendor Workflows](./customization/vendor-workflows.md) +- [Shard Large Documents](./customization/shard-large-documents.md) + +## Workflows + +Guides for running specific BMAD workflows. + +## Brownfield Projects + +Working with existing codebases. + +## Troubleshooting + +Solutions to common problems. diff --git a/docs/how-to/installation/index.md b/docs/how-to/installation/index.md new file mode 100644 index 00000000..f8a28f3d --- /dev/null +++ b/docs/how-to/installation/index.md @@ -0,0 +1,15 @@ +--- +title: "Installation Guides" +description: How to install and upgrade BMad Method +--- + + +How-to guides for installing and configuring the BMad Method. + +## Available Guides + +| Guide | Description | +|-------|-------------| +| **[Install BMad](./install-bmad.md)** | Step-by-step installation instructions | +| **[Install Custom Modules](./install-custom-modules.md)** | Add custom agents, workflows, and modules | +| **[Upgrade to v6](./upgrade-to-v6.md)** | Migrate from BMad v4 to v6 | diff --git a/docs/how-to/installation/install-bmad.md b/docs/how-to/installation/install-bmad.md new file mode 100644 index 00000000..50bc8ccb --- /dev/null +++ b/docs/how-to/installation/install-bmad.md @@ -0,0 +1,138 @@ +--- +title: "How to Install BMAD" +description: Step-by-step guide to installing BMAD in your project +--- + + +Complete guide to installing BMAD in your project. + +--- + +## Prerequisites + +- **Node.js** 20+ (required for the installer) +- **Git** (recommended) +- **AI-powered IDE** (Claude Code, Cursor, Windsurf, or similar) + +--- + +## Steps + +### 1. Run the Installer + +```bash +npx bmad-method install +``` + +### 2. Choose Installation Location + +The installer will ask where to install BMAD files. Options: +- Current directory (recommended for new projects) +- Subdirectory +- Custom path + +### 3. Select Your AI Tools + +Choose which AI tools you'll be using: +- Claude Code +- Cursor +- Windsurf +- Other + +The installer configures BMAD for your selected tools. + +### 4. Choose Modules + +Select which modules to install: + +| Module | Purpose | +|--------|---------| +| **BMM** | Core methodology for software development | +| **BMGD** | Game development workflows | +| **CIS** | Creative intelligence and facilitation | +| **BMB** | Building custom agents and workflows | + +### 5. Add Custom Content (Optional) + +If you have custom agents, workflows, or modules: +- Point to their location +- The installer will integrate them + +### 6. Configure Settings + +For each module, either: +- Accept recommended defaults (faster) +- Customize settings (more control) + +--- + +## Verify Installation + +After installation, verify by: + +1. Checking the `_bmad/` directory exists +2. Loading an agent in your AI tool +3. Running `*menu` to see available commands + +--- + +## Directory Structure + +``` +your-project/ +├── _bmad/ +│ ├── bmm/ # Method module +│ │ ├── agents/ # Agent files +│ │ ├── workflows/ # Workflow files +│ │ └── config.yaml # Module config +│ ├── core/ # Core utilities +│ └── ... +├── _bmad-output/ # Generated artifacts +└── .claude/ # IDE configuration +``` + +--- + +## Configuration + +Edit `_bmad/[module]/config.yaml` to customize: + +```yaml +output_folder: ./_bmad-output +user_name: Your Name +communication_language: english +``` + +--- + +## Troubleshooting + +### "Command not found: npx" + +Install Node.js 20+: +```bash +brew install node + +``` + +### "Permission denied" + +Check npm permissions: +```bash +npm config set prefix ~/.npm-global +``` + +### Installer hangs + +Try running with verbose output: +```bash +npx bmad-method install --verbose +``` + +--- + +## Related + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Getting started with BMM +- [Upgrade to V6](./upgrade-to-v6.md) - Upgrading from previous versions +- [Install Custom Modules](./install-custom-modules.md) - Adding custom content diff --git a/docs/modules/bmb-bmad-builder/custom-content-installation.md b/docs/how-to/installation/install-custom-modules.md similarity index 95% rename from docs/modules/bmb-bmad-builder/custom-content-installation.md rename to docs/how-to/installation/install-custom-modules.md index 015e71e2..4aebad85 100644 --- a/docs/modules/bmb-bmad-builder/custom-content-installation.md +++ b/docs/how-to/installation/install-custom-modules.md @@ -1,8 +1,11 @@ -# Custom Content Installation +--- +title: "Custom Content Installation" +--- + This guide explains how to create and install custom BMAD content including agents, workflows, and modules. Custom content extends BMAD's functionality with specialized tools and workflows that can be shared across projects or teams. -For detailed information about the different types of custom content available, see [Custom Content](modules/bmb-bmad-builder/custom-content.md). +For detailed information about the different types of custom content available, see [Custom Content Types](../../explanation/bmad-builder/custom-content-types.md). You can find example custom modules in the `samples/sample-custom-modules/` folder of the repository. Download either of the sample folders to try them out. @@ -57,7 +60,7 @@ For standalone content that isn't part of a cohesive module collection, follow t - Add the property `unitary: true` in the module.yaml - The `unitary: true` property indicates this is a collection of potentially unrelated items that don't depend on each other - Any content you add to this folder should still be nested under workflows and agents - but the key with stand alone content is they do not rely on each other. - - Agents do not reference other workflows even if stored in a unitary:true module. But unitary Agents can have their own workflows in their sidecar, or reference workflows as requirements from other modules - with a process known as workflow vendoring. Keep in mind, this will require that the workflow referenced from the other module would need to be available for the end user to install, so its recommended to only vendor workflows from the core module, or official bmm modules (See [Workflow Vendoring, Customization, and Inheritance](workflow-vendoring-customization-inheritance.md)). + - Agents do not reference other workflows even if stored in a unitary:true module. But unitary Agents can have their own workflows in their sidecar, or reference workflows as requirements from other modules - with a process known as workflow vendoring. Keep in mind, this will require that the workflow referenced from the other module would need to be available for the end user to install, so its recommended to only vendor workflows from the core module, or official bmm modules. 2. **Folder Structure** Organize content in specific named folders: diff --git a/docs/bmad-core-concepts/installing/upgrading.md b/docs/how-to/installation/upgrade-to-v6.md similarity index 98% rename from docs/bmad-core-concepts/installing/upgrading.md rename to docs/how-to/installation/upgrade-to-v6.md index 29384f2d..b5c37dbe 100644 --- a/docs/bmad-core-concepts/installing/upgrading.md +++ b/docs/how-to/installation/upgrade-to-v6.md @@ -1,4 +1,7 @@ -# BMad v4 to v6 Upgrade Guide +--- +title: "BMad v4 to v6 Upgrade Guide" +--- + ## Overview @@ -120,7 +123,7 @@ persona: - Always upbeat and adventurous ``` -There is a lot more that is possible with agent customization, which is covered in detail in the [Agent Customization Guide](../bmad-customization/agents.md) +There is a lot more that is possible with agent customization, which is covered in detail in the [Agent Customization Guide](../customization/customize-agents.md) CRITICAL NOTE: After you modify the customization file, you need to run the npx installer against your installed location, and choose the option to rebuild all agents, or just do a quick update again. This always builds agents fresh and applies customizations. diff --git a/docs/modules/bmgd-bmad-game-dev/troubleshooting.md b/docs/how-to/troubleshooting/bmgd-troubleshooting.md similarity index 95% rename from docs/modules/bmgd-bmad-game-dev/troubleshooting.md rename to docs/how-to/troubleshooting/bmgd-troubleshooting.md index dd7f31a7..e6901e51 100644 --- a/docs/modules/bmgd-bmad-game-dev/troubleshooting.md +++ b/docs/how-to/troubleshooting/bmgd-troubleshooting.md @@ -1,4 +1,7 @@ -# BMGD Troubleshooting +--- +title: "BMGD Troubleshooting" +--- + Common issues and solutions when using BMGD workflows. @@ -26,7 +29,6 @@ Common issues and solutions when using BMGD workflows. Check for `_bmad/bmgd/config.yaml` in your project. If missing, create it: ```yaml -# BMGD Configuration output_folder: '{project-root}/docs/game-design' user_name: 'Your Name' communication_language: 'English' @@ -254,6 +256,6 @@ When reporting issues, include: ## Next Steps -- **[Quick Start Guide](./quick-start.md)** - Getting started -- **[Workflows Guide](./workflows-guide.md)** - Workflow reference -- **[Glossary](./glossary.md)** - Terminology +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Getting started +- **[Workflows Guide](../../reference/workflows/index.md)** - Workflow reference +- **[Glossary](../../reference/glossary/index.md)** - Terminology diff --git a/docs/modules/bmgd-bmad-game-dev/quick-flow-guide.md b/docs/how-to/workflows/bmgd-quick-flow.md similarity index 95% rename from docs/modules/bmgd-bmad-game-dev/quick-flow-guide.md rename to docs/how-to/workflows/bmgd-quick-flow.md index 9dfc504d..9b7fa7db 100644 --- a/docs/modules/bmgd-bmad-game-dev/quick-flow-guide.md +++ b/docs/how-to/workflows/bmgd-quick-flow.md @@ -1,4 +1,7 @@ -# BMGD Quick-Flow Guide +--- +title: "BMGD Quick-Flow Guide" +--- + Fast-track workflows for rapid game prototyping and flexible development. @@ -283,6 +286,6 @@ If quick-dev keeps expanding scope, stop and create proper stories. ## Next Steps -- **[Workflows Guide](./workflows-guide.md)** - Full workflow reference -- **[Agents Guide](./agents-guide.md)** - Agent capabilities -- **[Quick Start Guide](./quick-start.md)** - Getting started with BMGD +- **[Workflows Guide](../../reference/workflows/bmgd-workflows.md)** - Full workflow reference +- **[Agents Guide](../../explanation/game-dev/agents.md)** - Agent capabilities +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Getting started with BMGD diff --git a/docs/how-to/workflows/conduct-research.md b/docs/how-to/workflows/conduct-research.md new file mode 100644 index 00000000..16174c74 --- /dev/null +++ b/docs/how-to/workflows/conduct-research.md @@ -0,0 +1,130 @@ +--- +title: "How to Conduct Research" +description: How to conduct market, technical, and competitive research using BMad Method +--- + + +Use the `research` workflow to perform comprehensive multi-type research for validating ideas, understanding markets, and making informed decisions. + +--- + +## When to Use This + +- Need market viability validation +- Choosing frameworks or platforms +- Understanding competitive landscape +- Need user understanding +- Understanding domain or industry +- Need deeper AI-assisted research + +--- + +## Prerequisites + +- BMad Method installed +- Analyst agent available + +--- + +## Steps + +### 1. Load the Analyst Agent + +Start a fresh chat and load the Analyst agent. + +### 2. Run the Research Workflow + +``` +*research +``` + +### 3. Choose Research Type + +Select the type of research you need: + +| Type | Purpose | Use When | +| --------------- | ------------------------------------------------------ | ----------------------------------- | +| **market** | TAM/SAM/SOM, competitive analysis | Need market viability validation | +| **technical** | Technology evaluation, ADRs | Choosing frameworks/platforms | +| **competitive** | Deep competitor analysis | Understanding competitive landscape | +| **user** | Customer insights, personas, JTBD | Need user understanding | +| **domain** | Industry deep dives, trends | Understanding domain/industry | +| **deep_prompt** | Generate AI research prompts (ChatGPT, Claude, Gemini) | Need deeper AI-assisted research | + +### 4. Provide Context + +Give the agent details about what you're researching: + +- "SaaS project management tool" +- "React vs Vue for our dashboard" +- "Fintech compliance requirements" + +### 5. Set Research Depth + +Choose your depth level: + +- **Quick** - Fast overview +- **Standard** - Balanced depth +- **Comprehensive** - Deep analysis + +--- + +## What You Get + +### Market Research Example + +``` +TAM: $50B +SAM: $5B +SOM: $50M + +Top Competitors: +- Asana +- Monday +- etc. + +Positioning Recommendation: ... +``` + +### Technical Research Example + +Technology evaluation with: +- Comparison matrix +- Trade-off analysis +- Recommendations with rationale + +--- + +## Key Features + +- Real-time web research +- Multiple analytical frameworks (Porter's Five Forces, SWOT, Technology Adoption Lifecycle) +- Platform-specific optimization for deep_prompt type +- Configurable research depth + +--- + +## Next Steps + +After research: + +1. **Product Brief** - Capture strategic vision informed by research +2. **PRD** - Use findings as context for requirements +3. **Architecture** - Use technical research in ADRs + +--- + +## Tips + +- Use market research early for new products +- Technical research helps with architecture decisions +- Competitive research informs positioning +- Domain research is valuable for specialized industries + +--- + +## Related + +- [Run Brainstorming Session](./run-brainstorming-session.md) - Explore ideas before research +- [Create Product Brief](./create-product-brief.md) - Capture strategic vision +- [Create PRD](./create-prd.md) - Move to formal planning diff --git a/docs/how-to/workflows/create-architecture.md b/docs/how-to/workflows/create-architecture.md new file mode 100644 index 00000000..7b84548f --- /dev/null +++ b/docs/how-to/workflows/create-architecture.md @@ -0,0 +1,147 @@ +--- +title: "How to Create Architecture" +description: How to create system architecture using the BMad Method +--- + + +Use the `architecture` workflow to make technical decisions explicit and prevent agent conflicts during implementation. + +--- + +## When to Use This + +- Multi-epic projects (BMad Method, Enterprise) +- Cross-cutting technical concerns +- Multiple agents implementing different parts +- Integration complexity exists +- Technology choices need alignment + +--- + +## When to Skip This + +- Quick Flow (simple changes) +- BMad Method Simple with straightforward tech stack +- Single epic with clear technical approach + +--- + +## Prerequisites + +- BMad Method installed +- Architect agent available +- PRD completed + +--- + +## Steps + +### 1. Load the Architect Agent + +Start a fresh chat and load the Architect agent. + +### 2. Run the Architecture Workflow + +``` +*create-architecture +``` + +### 3. Engage in Discovery + +This is NOT a template filler. The architecture workflow: + +1. **Discovers** technical needs through conversation +2. **Proposes** architectural options with trade-offs +3. **Documents** decisions that prevent agent conflicts +4. **Focuses** on decision points, not exhaustive documentation + +### 4. Document Key Decisions + +Work with the agent to create Architecture Decision Records (ADRs) for significant choices. + +### 5. Review the Architecture + +The agent produces a decision-focused architecture document. + +--- + +## What You Get + +An `architecture.md` document containing: + +1. **Architecture Overview** - System context, principles, style +2. **System Architecture** - High-level diagram, component interactions +3. **Data Architecture** - Database design, state management, caching +4. **API Architecture** - API style (REST/GraphQL/gRPC), auth, versioning +5. **Frontend Architecture** - Framework, state management, components +6. **Integration Architecture** - Third-party integrations, messaging +7. **Security Architecture** - Auth/authorization, data protection +8. **Deployment Architecture** - CI/CD, environments, monitoring +9. **ADRs** - Key decisions with context, options, rationale +10. **FR/NFR-Specific Guidance** - Technical approach per requirement +11. **Standards and Conventions** - Directory structure, naming, testing + +--- + +## ADR Format + +```markdown +## ADR-001: Use GraphQL for All APIs + +**Status:** Accepted | **Date:** 2025-11-02 + +**Context:** PRD requires flexible querying across multiple epics + +**Decision:** Use GraphQL for all client-server communication + +**Options Considered:** +1. REST - Familiar but requires multiple endpoints +2. GraphQL - Flexible querying, learning curve +3. gRPC - High performance, poor browser support + +**Rationale:** +- PRD requires flexible data fetching (Epic 1, 3) +- Mobile app needs bandwidth optimization (Epic 2) +- Team has GraphQL experience + +**Consequences:** +- Positive: Flexible querying, reduced versioning +- Negative: Caching complexity, N+1 query risk +- Mitigation: Use DataLoader for batching +``` + +--- + +## Example + +E-commerce platform produces: +- Monolith + PostgreSQL + Redis + Next.js + GraphQL +- ADRs explaining each choice +- FR/NFR-specific implementation guidance + +--- + +## Tips + +- Focus on decisions that prevent agent conflicts +- Use ADRs for every significant technology choice +- Keep it practical - don't over-architect +- Architecture is living - update as you learn + +--- + +## Next Steps + +After architecture: + +1. **Create Epics and Stories** - Work breakdown informed by architecture +2. **Implementation Readiness** - Gate check before Phase 4 + +--- + +## Related + +- [Create PRD](./create-prd.md) - Requirements before architecture +- [Create Epics and Stories](./create-epics-and-stories.md) - Next step +- [Run Implementation Readiness](./run-implementation-readiness.md) - Gate check +- [Why Solutioning Matters](../../explanation/architecture/why-solutioning-matters.md) diff --git a/docs/how-to/workflows/create-epics-and-stories.md b/docs/how-to/workflows/create-epics-and-stories.md new file mode 100644 index 00000000..4fde46a2 --- /dev/null +++ b/docs/how-to/workflows/create-epics-and-stories.md @@ -0,0 +1,136 @@ +--- +title: "How to Create Epics and Stories" +description: How to break PRD requirements into epics and stories using BMad Method +--- + + +Use the `create-epics-and-stories` workflow to transform PRD requirements into bite-sized stories organized into deliverable epics. + +--- + +## When to Use This + +- After architecture workflow completes +- When PRD contains FRs/NFRs ready for implementation breakdown +- Before implementation-readiness gate check + +--- + +## Prerequisites + +- BMad Method installed +- PM agent available +- PRD completed +- Architecture completed + +--- + +## Why After Architecture? + +This workflow runs AFTER architecture because: + +1. **Informed Story Sizing** - Architecture decisions affect story complexity +2. **Dependency Awareness** - Architecture reveals technical dependencies +3. **Technical Feasibility** - Stories can be properly scoped knowing the tech stack +4. **Consistency** - All stories align with documented architectural patterns + +--- + +## Steps + +### 1. Load the PM Agent + +Start a fresh chat and load the PM agent. + +### 2. Run the Workflow + +``` +*create-epics-and-stories +``` + +### 3. Provide Context + +Point the agent to: +- Your PRD (FRs/NFRs) +- Your architecture document +- Optional: UX design artifacts + +### 4. Review Epic Breakdown + +The agent organizes requirements into logical epics with user stories. + +### 5. Validate Story Quality + +Ensure each story has: +- Clear acceptance criteria +- Appropriate priority +- Identified dependencies +- Technical notes from architecture + +--- + +## What You Get + +Epic files (one per epic) containing: + +1. **Epic objective and scope** +2. **User stories with acceptance criteria** +3. **Story priorities** (P0/P1/P2/P3) +4. **Dependencies between stories** +5. **Technical notes** referencing architecture decisions + +--- + +## Example + +E-commerce PRD with FR-001 (User Registration), FR-002 (Product Catalog) produces: + +- **Epic 1: User Management** (3 stories) + - Story 1.1: User registration form + - Story 1.2: Email verification + - Story 1.3: Login/logout + +- **Epic 2: Product Display** (4 stories) + - Story 2.1: Product listing page + - Story 2.2: Product detail page + - Story 2.3: Search functionality + - Story 2.4: Category filtering + +Each story references relevant ADRs from architecture. + +--- + +## Story Priority Levels + +| Priority | Meaning | +|----------|---------| +| **P0** | Critical - Must have for MVP | +| **P1** | High - Important for release | +| **P2** | Medium - Nice to have | +| **P3** | Low - Future consideration | + +--- + +## Tips + +- Keep stories small enough to complete in a session +- Ensure acceptance criteria are testable +- Document dependencies clearly +- Reference architecture decisions in technical notes + +--- + +## Next Steps + +After creating epics and stories: + +1. **Implementation Readiness** - Validate alignment before Phase 4 +2. **Sprint Planning** - Organize work for implementation + +--- + +## Related + +- [Create Architecture](./create-architecture.md) - Do this first +- [Run Implementation Readiness](./run-implementation-readiness.md) - Gate check +- [Run Sprint Planning](./run-sprint-planning.md) - Start implementation diff --git a/docs/how-to/workflows/create-prd.md b/docs/how-to/workflows/create-prd.md new file mode 100644 index 00000000..2a0221f1 --- /dev/null +++ b/docs/how-to/workflows/create-prd.md @@ -0,0 +1,130 @@ +--- +title: "How to Create a PRD" +description: How to create a Product Requirements Document using the BMad Method +--- + + +Use the `prd` workflow to create a strategic Product Requirements Document with Functional Requirements (FRs) and Non-Functional Requirements (NFRs). + +--- + +## When to Use This + +- Medium to large feature sets +- Multi-screen user experiences +- Complex business logic +- Multiple system integrations +- Phased delivery required + +--- + +## Prerequisites + +- BMad Method installed +- PM agent available +- Optional: Product brief from Phase 1 + +--- + +## Steps + +### 1. Load the PM Agent + +Start a fresh chat and load the PM agent. + +### 2. Run the PRD Workflow + +``` +*create-prd +``` + +### 3. Provide Context + +The workflow will: +- Load any existing product brief +- Ask about your project scope +- Gather requirements through conversation + +### 4. Define Requirements + +Work with the agent to define: +- Functional Requirements (FRs) - What the system should do +- Non-Functional Requirements (NFRs) - How well it should do it + +### 5. Review the PRD + +The agent produces a comprehensive PRD scaled to your project. + +--- + +## What You Get + +A `PRD.md` document containing: + +- Executive summary +- Problem statement +- User personas +- Functional requirements (FRs) +- Non-functional requirements (NFRs) +- Success metrics +- Risks and assumptions + +--- + +## Scale-Adaptive Structure + +The PRD adapts to your project complexity: + +| Scale | Pages | Focus | +|-------|-------|-------| +| **Light** | 10-15 | Focused FRs/NFRs, simplified analysis | +| **Standard** | 20-30 | Comprehensive FRs/NFRs, thorough analysis | +| **Comprehensive** | 30-50+ | Extensive FRs/NFRs, multi-phase, stakeholder analysis | + +--- + +## V6 Improvement + +In V6, the PRD focuses on **WHAT** to build (requirements). Epic and Stories are created **AFTER** architecture via the `create-epics-and-stories` workflow for better quality. + +--- + +## Example + +E-commerce checkout → PRD with: +- 15 FRs (user account, cart management, payment flow) +- 8 NFRs (performance, security, scalability) + +--- + +## Best Practices + +### 1. Do Product Brief First + +Run product-brief from Phase 1 to kickstart the PRD for better results. + +### 2. Focus on "What" Not "How" + +Planning defines **what** to build and **why**. Leave **how** (technical design) to Phase 3 (Solutioning). + +### 3. Document-Project First for Brownfield + +Always run `document-project` before planning brownfield projects. AI agents need existing codebase context. + +--- + +## Next Steps + +After PRD: + +1. **Create UX Design** (optional) - If UX is critical +2. **Create Architecture** - Technical design +3. **Create Epics and Stories** - After architecture + +--- + +## Related + +- [Create Product Brief](./create-product-brief.md) - Input for PRD +- [Create UX Design](./create-ux-design.md) - Optional UX workflow +- [Create Architecture](./create-architecture.md) - Next step after PRD diff --git a/docs/how-to/workflows/create-product-brief.md b/docs/how-to/workflows/create-product-brief.md new file mode 100644 index 00000000..3b813f6c --- /dev/null +++ b/docs/how-to/workflows/create-product-brief.md @@ -0,0 +1,117 @@ +--- +title: "How to Create a Product Brief" +description: How to create a product brief using the BMad Method +--- + + +Use the `product-brief` workflow to define product vision and strategy through an interactive process. + +--- + +## When to Use This + +- Starting new product or major feature initiative +- Aligning stakeholders before detailed planning +- Transitioning from exploration to strategy +- Need executive-level product documentation + +--- + +## Prerequisites + +- BMad Method installed +- Analyst agent available +- Optional: Research documents from previous workflows + +--- + +## Steps + +### 1. Load the Analyst Agent + +Start a fresh chat and load the Analyst agent. + +### 2. Run the Product Brief Workflow + +``` +*product-brief +``` + +### 3. Answer the Interactive Questions + +The workflow guides you through strategic product vision definition: + +- What problem are you solving? +- Who are your target users? +- What makes this solution different? +- What's the MVP scope? + +### 4. Review and Refine + +The agent will draft sections and let you refine them interactively. + +--- + +## What You Get + +The `product-brief.md` document includes: + +- **Executive summary** - High-level overview +- **Problem statement** - With evidence +- **Proposed solution** - And differentiators +- **Target users** - Segmented +- **MVP scope** - Ruthlessly defined +- **Financial impact** - And ROI +- **Strategic alignment** - With business goals +- **Risks and open questions** - Documented upfront + +--- + +## Integration with Other Workflows + +The product brief feeds directly into the PRD workflow: + +| Analysis Output | Planning Input | +|-----------------|----------------| +| product-brief.md | **prd** workflow | +| market-research.md | **prd** context | +| technical-research.md | **architecture** (Phase 3) | + +Planning workflows automatically load the product brief if it exists. + +--- + +## Common Patterns + +### Greenfield Software (Full Analysis) + +``` +1. brainstorm-project - explore approaches +2. research (market/technical/domain) - validate viability +3. product-brief - capture strategic vision +4. → Phase 2: prd +``` + +### Skip Analysis (Clear Requirements) + +``` +→ Phase 2: prd or tech-spec directly +``` + +--- + +## Tips + +- Be specific about the problem you're solving +- Ruthlessly prioritize MVP scope +- Document assumptions and risks +- Use research findings as evidence +- This is recommended for greenfield projects + +--- + +## Related + +- [Run Brainstorming Session](./run-brainstorming-session.md) - Explore ideas first +- [Conduct Research](./conduct-research.md) - Validate ideas +- [Create PRD](./create-prd.md) - Next step after product brief diff --git a/docs/how-to/workflows/create-story.md b/docs/how-to/workflows/create-story.md new file mode 100644 index 00000000..9e75f920 --- /dev/null +++ b/docs/how-to/workflows/create-story.md @@ -0,0 +1,119 @@ +--- +title: "How to Create a Story" +description: How to create implementation-ready stories from epic backlog +--- + + +Use the `create-story` workflow to prepare the next story from the epic backlog for implementation. + +--- + +## When to Use This + +- Before implementing each story +- When moving to the next story in an epic +- After sprint-planning has been run + +--- + +## Prerequisites + +- BMad Method installed +- SM (Scrum Master) agent available +- Sprint-status.yaml created by sprint-planning +- Architecture and PRD available for context + +--- + +## Steps + +### 1. Load the SM Agent + +Start a fresh chat and load the SM (Scrum Master) agent. + +### 2. Run the Workflow + +``` +*create-story +``` + +### 3. Specify the Story + +The agent will: +- Read the sprint-status.yaml +- Identify the next story to work on +- Or let you specify a particular story + +### 4. Review the Story File + +The agent creates a comprehensive story file ready for development. + +--- + +## What You Get + +A `story-[slug].md` file containing: + +- Story objective and scope +- Acceptance criteria (specific, testable) +- Technical implementation notes +- References to architecture decisions +- Dependencies on other stories +- Definition of Done + +--- + +## Story Content Sources + +The create-story workflow pulls from: + +- **PRD** - Requirements and acceptance criteria +- **Architecture** - Technical approach and ADRs +- **Epic file** - Story context and dependencies +- **Existing code** - Patterns to follow (brownfield) + +--- + +## Example Output + +```markdown + +## Objective +Implement email verification flow for new user registrations. + +## Acceptance Criteria +- [ ] User receives verification email within 30 seconds +- [ ] Email contains unique verification link +- [ ] Link expires after 24 hours +- [ ] User can request new verification email + +## Technical Notes +- Use SendGrid API per ADR-003 +- Store verification tokens in Redis per architecture +- Follow existing email template patterns in /templates + +## Dependencies +- Story 1.1 (User Registration) - DONE ✅ + +## Definition of Done +- All acceptance criteria pass +- Tests written and passing +- Code review approved +``` + +--- + +## Tips + +- Complete one story before creating the next +- Ensure dependencies are marked DONE before starting +- Review technical notes for architecture alignment +- Use the story file as context for dev-story + +--- + +## Related + +- [Run Sprint Planning](./run-sprint-planning.md) - Initialize tracking +- [Implement Story](./implement-story.md) - Next step +- [Run Code Review](./run-code-review.md) - After implementation diff --git a/docs/how-to/workflows/create-tech-spec.md b/docs/how-to/workflows/create-tech-spec.md new file mode 100644 index 00000000..cbc4f1c0 --- /dev/null +++ b/docs/how-to/workflows/create-tech-spec.md @@ -0,0 +1,159 @@ +--- +title: "How to Create a Tech Spec" +description: How to create a technical specification using Quick Spec Flow +--- + + +Use the `tech-spec` workflow for Quick Flow projects to go directly from idea to implementation-ready specification. + +--- + +## When to Use This + +- Bug fixes and small enhancements +- Small features with clear scope (1-15 stories) +- Rapid prototyping +- Adding to existing brownfield codebase +- Quick Flow track projects + +--- + +## Prerequisites + +- BMad Method installed +- PM agent or Quick Flow Solo Dev agent available +- Project directory (can be empty for greenfield) + +--- + +## Steps + +### 1. Load the PM Agent + +Start a fresh chat and load the PM agent (or Quick Flow Solo Dev agent). + +### 2. Run the Tech Spec Workflow + +``` +*create-tech-spec +``` + +Or simply describe what you want to build: + +``` +I want to fix the login validation bug +``` + +### 3. Answer Discovery Questions + +The workflow will ask: +- What problem are you solving? +- What's the scope of the change? +- Any specific constraints? + +### 4. Review Detected Context + +For brownfield projects, the agent will: +- Detect your project stack +- Analyze existing code patterns +- Detect test frameworks +- Ask: "Should I follow these existing conventions?" + +### 5. Get Your Tech Spec + +The agent generates a comprehensive tech-spec with ready-to-implement stories. + +--- + +## What You Get + +### tech-spec.md + +- Problem statement and solution +- Detected framework versions and dependencies +- Brownfield code patterns (if applicable) +- Existing test patterns to follow +- Specific file paths to modify +- Complete implementation guidance + +### Story Files + +For single changes: +- `story-[slug].md` - Single user story ready for development + +For small features: +- `epics.md` - Epic organization +- `story-[epic-slug]-1.md`, `story-[epic-slug]-2.md`, etc. + +--- + +## Example: Bug Fix (Single Change) + +**You:** "I want to fix the login validation bug that allows empty passwords" + +**Agent:** +1. Asks clarifying questions about the issue +2. Detects your Node.js stack (Express 4.18.2, Jest for testing) +3. Analyzes existing UserService code patterns +4. Asks: "Should I follow your existing conventions?" → Yes +5. Generates tech-spec.md with specific file paths +6. Creates story-login-fix.md + +**Total time:** 15-30 minutes (mostly implementation) + +--- + +## Example: Small Feature (Multi-Story) + +**You:** "I want to add OAuth social login (Google, GitHub)" + +**Agent:** +1. Asks about feature scope +2. Detects your stack (Next.js 13.4, NextAuth.js already installed!) +3. Analyzes existing auth patterns +4. Confirms conventions +5. Generates: + - tech-spec.md (comprehensive implementation guide) + - epics.md (OAuth Integration epic) + - story-oauth-1.md (Backend OAuth setup) + - story-oauth-2.md (Frontend login buttons) + +**Total time:** 1-3 hours (mostly implementation) + +--- + +## Implementing After Tech Spec + +```bash +# Single change: +# Load DEV agent and run dev-story + +# Multi-story feature: +# Optional: Load SM agent and run sprint-planning +# Then: Load DEV agent and run dev-story for each story +``` + +--- + +## Tips + +### Be Specific in Discovery + +- ✅ "Fix email validation in UserService to allow plus-addressing" +- ❌ "Fix validation bug" + +### Trust Convention Detection + +If it detects your patterns correctly, say yes! It's faster than establishing new conventions. + +### Keep Single Changes Atomic + +If your "single change" needs 3+ files, it might be a multi-story feature. Let the workflow guide you. + +--- + +## Related + +- [Quick Flow](../../explanation/features/quick-flow.md) - Understanding Quick Spec Flow +- [Implement Story](./implement-story.md) - After tech spec +- [Create PRD](./create-prd.md) - For larger projects needing full BMad Method diff --git a/docs/how-to/workflows/create-ux-design.md b/docs/how-to/workflows/create-ux-design.md new file mode 100644 index 00000000..a91e2195 --- /dev/null +++ b/docs/how-to/workflows/create-ux-design.md @@ -0,0 +1,117 @@ +--- +title: "How to Create a UX Design" +description: How to create UX specifications using the BMad Method +--- + + +Use the `create-ux-design` workflow to create UX specifications for projects where user experience is a primary differentiator. + +--- + +## When to Use This + +- UX is primary competitive advantage +- Complex user workflows needing design thinking +- Innovative interaction patterns +- Design system creation +- Accessibility-critical experiences + +--- + +## When to Skip This + +- Simple CRUD interfaces +- Internal tools with standard patterns +- Changes to existing screens you're happy with +- Quick Flow projects + +--- + +## Prerequisites + +- BMad Method installed +- UX Designer agent available +- PRD completed + +--- + +## Steps + +### 1. Load the UX Designer Agent + +Start a fresh chat and load the UX Designer agent. + +### 2. Run the UX Design Workflow + +``` +*create-ux-design +``` + +### 3. Provide Context + +Point the agent to your PRD and describe: +- Key user journeys +- UX priorities +- Any existing design patterns + +### 4. Collaborate on Design + +The workflow uses a collaborative approach: + +1. **Visual exploration** - Generate multiple options +2. **Informed decisions** - Evaluate with user needs +3. **Collaborative design** - Refine iteratively +4. **Living documentation** - Evolves with project + +### 5. Review the UX Spec + +The agent produces comprehensive UX documentation. + +--- + +## What You Get + +The `ux-spec.md` document includes: + +- User journeys +- Wireframes and mockups +- Interaction specifications +- Design system (components, patterns, tokens) +- Epic breakdown (UX stories) + +--- + +## Example + +Dashboard redesign produces: +- Card-based layout with split-pane toggle +- 5 card components +- 12 color tokens +- Responsive grid +- 3 epics (Layout, Visualization, Accessibility) + +--- + +## Integration + +The UX spec feeds into: +- PRD updates +- Epic and story creation +- Architecture decisions (Phase 3) + +--- + +## Tips + +- Focus on user problems, not solutions first +- Generate multiple options before deciding +- Consider accessibility from the start +- Document component reusability + +--- + +## Related + +- [Create PRD](./create-prd.md) - Create requirements first +- [Create Architecture](./create-architecture.md) - Technical design +- [Create Epics and Stories](./create-epics-and-stories.md) - Work breakdown diff --git a/docs/how-to/workflows/implement-story.md b/docs/how-to/workflows/implement-story.md new file mode 100644 index 00000000..a695a72c --- /dev/null +++ b/docs/how-to/workflows/implement-story.md @@ -0,0 +1,127 @@ +--- +title: "How to Implement a Story" +description: How to implement a story using the dev-story workflow +--- + + +Use the `dev-story` workflow to implement a story with tests following the architecture and conventions. + +--- + +## When to Use This + +- After create-story has prepared the story file +- When ready to write code for a story +- Story dependencies are marked DONE + +--- + +## Prerequisites + +- BMad Method installed +- DEV agent available +- Story file created by create-story +- Architecture and tech-spec available for context + +--- + +## Steps + +### 1. Load the DEV Agent + +Start a fresh chat and load the DEV agent. + +### 2. Run the Workflow + +``` +*dev-story +``` + +### 3. Provide Story Context + +Point the agent to the story file created by create-story. + +### 4. Implement with Guidance + +The DEV agent: +- Reads the story file and acceptance criteria +- References architecture decisions +- Follows existing code patterns +- Implements with tests + +### 5. Complete Implementation + +Work with the agent until all acceptance criteria are met. + +--- + +## What Happens + +The dev-story workflow: + +1. **Reads context** - Story file, architecture, existing patterns +2. **Plans implementation** - Identifies files to create/modify +3. **Writes code** - Following conventions and patterns +4. **Writes tests** - Unit, integration, or E2E as appropriate +5. **Validates** - Runs tests and checks acceptance criteria + +--- + +## Key Principles + +### One Story at a Time + +Complete each story's full lifecycle before starting the next. This prevents context switching and ensures quality. + +### Follow Architecture + +The DEV agent references: +- ADRs for technology decisions +- Standards for naming and structure +- Existing patterns in the codebase + +### Write Tests + +Every story includes appropriate tests: +- Unit tests for business logic +- Integration tests for API endpoints +- E2E tests for critical flows + +--- + +## After Implementation + +1. **Update sprint-status.yaml** - Mark story as READY FOR REVIEW +2. **Run code-review** - Quality assurance +3. **Address feedback** - If code review finds issues +4. **Mark DONE** - After code review passes + +--- + +## Tips + +- Keep the story file open for reference +- Ask the agent to explain decisions +- Run tests frequently during implementation +- Don't skip tests for "simple" changes + +--- + +## Troubleshooting + +**Q: Story needs significant changes mid-implementation?** +A: Run `correct-course` to analyze impact and route appropriately. + +**Q: Can I work on multiple stories in parallel?** +A: Not recommended. Complete one story's full lifecycle first. + +**Q: What if implementation reveals the story is too large?** +A: Split the story and document the change. + +--- + +## Related + +- [Create Story](./create-story.md) - Prepare the story first +- [Run Code Review](./run-code-review.md) - After implementation +- [Run Sprint Planning](./run-sprint-planning.md) - Sprint organization diff --git a/docs/how-to/workflows/run-brainstorming-session.md b/docs/how-to/workflows/run-brainstorming-session.md new file mode 100644 index 00000000..a914ce4f --- /dev/null +++ b/docs/how-to/workflows/run-brainstorming-session.md @@ -0,0 +1,94 @@ +--- +title: "How to Run a Brainstorming Session" +description: How to run a brainstorming session using the BMad Method +--- + + +Use the `brainstorm-project` workflow to explore solution approaches through parallel ideation tracks. + +--- + +## When to Use This + +- Very vague or seed kernel of an idea that needs exploration +- Consider alternatives or enhancements to an idea +- See your idea from different angles and viewpoints +- No idea what you want to build, but want to find some inspiration + +--- + +## Prerequisites + +- BMad Method installed +- Analyst agent available + +--- + +## Steps + +### 1. Load the Analyst Agent + +Start a fresh chat and load the Analyst agent. + +### 2. Run the Brainstorm Workflow + +``` +*brainstorm-project +``` + +### 3. Describe Your Idea + +Tell the agent about your project idea, even if it's vague: + +- "I want to build something that helps developers manage their context" +- "I have a game idea about resource management" +- "I need a tool for my team but I'm not sure what exactly" + +### 4. Explore the Tracks + +The workflow generates solution approaches through parallel ideation tracks: + +- **Architecture track** - Technical approaches and patterns +- **UX track** - User experience possibilities +- **Integration track** - How it connects with other systems +- **Value track** - Business value and differentiation + +### 5. Evaluate Options + +Review the generated options with rationale for each approach. + +--- + +## What You Get + +- Multiple solution approaches with trade-offs +- Different architectural options +- UX and integration considerations +- Clear rationale for each direction + +--- + +## Next Steps + +After brainstorming: + +1. **Research** - Validate ideas with market/technical research +2. **Product Brief** - Capture strategic vision +3. **PRD** - Move to formal planning + +--- + +## Tips + +- Don't worry about having a fully formed idea +- Let the agent guide the exploration +- Consider multiple tracks before deciding +- Use outputs as input for product-brief workflow + +--- + +## Related + +- [Conduct Research](./conduct-research.md) - Validate your ideas +- [Create Product Brief](./create-product-brief.md) - Capture strategic vision +- [Create PRD](./create-prd.md) - Move to formal planning diff --git a/docs/how-to/workflows/run-code-review.md b/docs/how-to/workflows/run-code-review.md new file mode 100644 index 00000000..db049331 --- /dev/null +++ b/docs/how-to/workflows/run-code-review.md @@ -0,0 +1,141 @@ +--- +title: "How to Run Code Review" +description: How to run code review for quality assurance +--- + + +Use the `code-review` workflow to perform a thorough quality review of implemented code. + +--- + +## When to Use This + +- After dev-story completes implementation +- Before marking a story as DONE +- Every story goes through code review - no exceptions + +--- + +## Prerequisites + +- BMad Method installed +- DEV agent available +- Story implementation complete +- Tests written and passing + +--- + +## Steps + +### 1. Load the DEV Agent + +Start a fresh chat (or continue from dev-story) and load the DEV agent. + +### 2. Run the Workflow + +``` +*code-review +``` + +### 3. Provide Context + +Point the agent to: +- The story file +- Files changed during implementation +- Test files + +### 4. Review Findings + +The agent performs a senior developer code review and reports findings. + +### 5. Address Issues + +If issues are found: +1. Fix issues using dev-story +2. Re-run tests +3. Run code-review again + +--- + +## What Gets Reviewed + +The code review checks: + +### Code Quality +- Clean, readable code +- Appropriate abstractions +- No code smells +- Proper error handling + +### Architecture Alignment +- Follows ADRs and architecture decisions +- Consistent with existing patterns +- Proper separation of concerns + +### Testing +- Adequate test coverage +- Tests are meaningful (not just for coverage) +- Edge cases handled +- Tests follow project patterns + +### Security +- No hardcoded secrets +- Input validation +- Authentication/authorization proper +- No common vulnerabilities + +### Performance +- No obvious performance issues +- Appropriate data structures +- Efficient queries + +--- + +## Review Outcomes + +### ✅ Approved + +- Code meets quality standards +- Tests pass +- **Action:** Mark story as DONE in sprint-status.yaml + +### 🔧 Changes Requested + +- Issues identified that need fixing +- **Action:** Fix issues in dev-story, then re-run code-review + +--- + +## Quality Gates + +Every story goes through code-review before being marked done. This ensures: + +- Consistent code quality +- Architecture adherence +- Test coverage +- Security review + +--- + +## Tips + +- Don't skip code review for "simple" changes +- Address all findings, not just critical ones +- Use findings as learning opportunities +- Re-run review after fixes + +--- + +## After Code Review + +1. **If approved:** Update sprint-status.yaml to mark story DONE +2. **If changes requested:** Fix issues and re-run review +3. **Move to next story:** Run create-story for the next item + +--- + +## Related + +- [Implement Story](./implement-story.md) - Before code review +- [Create Story](./create-story.md) - Move to next story +- [Run Sprint Planning](./run-sprint-planning.md) - Sprint organization diff --git a/docs/how-to/workflows/run-implementation-readiness.md b/docs/how-to/workflows/run-implementation-readiness.md new file mode 100644 index 00000000..d7904928 --- /dev/null +++ b/docs/how-to/workflows/run-implementation-readiness.md @@ -0,0 +1,162 @@ +--- +title: "How to Run Implementation Readiness" +description: How to validate planning and solutioning before implementation +--- + + +Use the `implementation-readiness` workflow to validate that planning and solutioning are complete and aligned before Phase 4 implementation. + +--- + +## When to Use This + +- **Always** before Phase 4 for BMad Method and Enterprise projects +- After create-epics-and-stories workflow completes +- Before sprint-planning workflow +- When stakeholders request readiness check + +--- + +## When to Skip This + +- Quick Flow (no solutioning phase) +- BMad Method Simple (no gate check required) + +--- + +## Prerequisites + +- BMad Method installed +- Architect agent available +- PRD, Architecture, and Epics completed + +--- + +## Steps + +### 1. Load the Architect Agent + +Start a fresh chat and load the Architect agent. + +### 2. Run the Workflow + +``` +*implementation-readiness +``` + +### 3. Let the Agent Validate + +The workflow systematically checks: +- PRD completeness +- Architecture completeness +- Epic/Story completeness +- Alignment between all documents + +### 4. Review the Gate Decision + +The agent produces a gate decision with rationale. + +--- + +## Gate Decision Outcomes + +### ✅ PASS + +- All critical criteria met +- Minor gaps acceptable with documented plan +- **Action:** Proceed to Phase 4 + +### ⚠️ CONCERNS + +- Some criteria not met but not blockers +- Gaps identified with clear resolution path +- **Action:** Proceed with caution, address gaps in parallel + +### ❌ FAIL + +- Critical gaps or contradictions +- Architecture missing key decisions +- Epics conflict with PRD/architecture +- **Action:** BLOCK Phase 4, resolve issues first + +--- + +## What Gets Checked + +### PRD/GDD Completeness +- Problem statement clear and evidence-based +- Success metrics defined +- User personas identified +- Functional requirements (FRs) complete +- Non-functional requirements (NFRs) specified +- Risks and assumptions documented + +### Architecture Completeness +- System architecture defined +- Data architecture specified +- API architecture decided +- Key ADRs documented +- Security architecture addressed +- FR/NFR-specific guidance provided +- Standards and conventions defined + +### Epic/Story Completeness +- All PRD features mapped to stories +- Stories have acceptance criteria +- Stories prioritized (P0/P1/P2/P3) +- Dependencies identified +- Story sequencing logical + +### Alignment Checks +- Architecture addresses all PRD FRs/NFRs +- Epics align with architecture decisions +- No contradictions between epics +- NFRs have technical approach +- Integration points clear + +--- + +## What You Get + +An `implementation-readiness.md` document containing: + +1. **Executive Summary** (PASS/CONCERNS/FAIL) +2. **Completeness Assessment** (scores for PRD, Architecture, Epics) +3. **Alignment Assessment** (PRD↔Architecture, Architecture↔Epics) +4. **Quality Assessment** (story quality, dependencies, risks) +5. **Gaps and Recommendations** (critical/minor gaps, remediation) +6. **Gate Decision** with rationale +7. **Next Steps** + +--- + +## Example + +E-commerce platform → CONCERNS ⚠️ + +**Gaps identified:** +- Missing security architecture section +- Undefined payment gateway + +**Recommendation:** +- Complete security section +- Add payment gateway ADR + +**Action:** Proceed with caution, address before payment epic. + +--- + +## Tips + +- Run this before every Phase 4 start +- Take FAIL decisions seriously - fix issues first +- Use CONCERNS as a checklist for parallel work +- Document why you proceed despite concerns + +--- + +## Related + +- [Create Architecture](./create-architecture.md) - Architecture workflow +- [Create Epics and Stories](./create-epics-and-stories.md) - Work breakdown +- [Run Sprint Planning](./run-sprint-planning.md) - Start implementation diff --git a/docs/how-to/workflows/run-sprint-planning.md b/docs/how-to/workflows/run-sprint-planning.md new file mode 100644 index 00000000..7f6c1224 --- /dev/null +++ b/docs/how-to/workflows/run-sprint-planning.md @@ -0,0 +1,111 @@ +--- +title: "How to Run Sprint Planning" +description: How to initialize sprint tracking for implementation +--- + + +Use the `sprint-planning` workflow to initialize the sprint tracking file and organize work for implementation. + +--- + +## When to Use This + +- Once at the start of Phase 4 (Implementation) +- After implementation-readiness gate passes +- When starting a new sprint cycle + +--- + +## Prerequisites + +- BMad Method installed +- SM (Scrum Master) agent available +- Epic files created from `create-epics-and-stories` +- Implementation-readiness passed (for BMad Method/Enterprise) + +--- + +## Steps + +### 1. Load the SM Agent + +Start a fresh chat and load the SM (Scrum Master) agent. + +### 2. Run the Workflow + +``` +*sprint-planning +``` + +### 3. Provide Context + +Point the agent to your epic files created during Phase 3. + +### 4. Review Sprint Organization + +The agent organizes stories into the sprint tracking file. + +--- + +## What You Get + +A `sprint-status.yaml` file containing: + +- All epics with their stories +- Story status tracking (TODO, IN PROGRESS, READY FOR REVIEW, DONE) +- Dependencies between stories +- Priority ordering + +--- + +## Story Lifecycle States + +Stories move through these states in the sprint status file: + +| State | Description | +|-------|-------------| +| **TODO** | Story identified but not started | +| **IN PROGRESS** | Story being implemented | +| **READY FOR REVIEW** | Implementation complete, awaiting code review | +| **DONE** | Accepted and complete | + +--- + +## Typical Sprint Flow + +### Sprint 0 (Planning Phase) +- Complete Phases 1-3 +- PRD/GDD + Architecture complete +- Epics+Stories created via create-epics-and-stories + +### Sprint 1+ (Implementation Phase) + +**Start of Phase 4:** +1. SM runs `sprint-planning` (once) + +**Per Story (repeat until epic complete):** +1. SM runs `create-story` +2. DEV runs `dev-story` +3. DEV runs `code-review` +4. Update sprint-status.yaml + +**After Epic Complete:** +- SM runs `retrospective` +- Move to next epic + +--- + +## Tips + +- Run sprint-planning only once at Phase 4 start +- Use `sprint-status` during Phase 4 to check current state +- Keep the sprint-status.yaml file as single source of truth +- Update story status after each stage + +--- + +## Related + +- [Create Story](./create-story.md) - Prepare stories for implementation +- [Implement Story](./implement-story.md) - Dev workflow +- [Run Code Review](./run-code-review.md) - Quality assurance diff --git a/docs/how-to/workflows/run-test-design.md b/docs/how-to/workflows/run-test-design.md new file mode 100644 index 00000000..db5303b1 --- /dev/null +++ b/docs/how-to/workflows/run-test-design.md @@ -0,0 +1,128 @@ +--- +title: "How to Run Test Design" +description: How to create comprehensive test plans using TEA's test-design workflow +--- + + +Use TEA's `*test-design` workflow to create comprehensive test plans with risk assessment and coverage strategies. + +--- + +## When to Use This + +**System-level (Phase 3):** +- After architecture is complete +- Before implementation-readiness gate +- To validate architecture testability + +**Epic-level (Phase 4):** +- At the start of each epic +- Before implementing stories in the epic +- To identify epic-specific testing needs + +--- + +## Prerequisites + +- BMad Method installed +- TEA agent available +- For system-level: Architecture document complete +- For epic-level: Epic defined with stories + +--- + +## Steps + +### 1. Load the TEA Agent + +Start a fresh chat and load the TEA (Test Architect) agent. + +### 2. Run the Test Design Workflow + +``` +*test-design +``` + +### 3. Specify the Mode + +TEA will ask if you want: + +- **System-level** - For architecture testability review (Phase 3) +- **Epic-level** - For epic-specific test planning (Phase 4) + +### 4. Provide Context + +For system-level: +- Point to your architecture document +- Reference any ADRs (Architecture Decision Records) + +For epic-level: +- Specify which epic you're planning +- Reference the epic file with stories + +### 5. Review the Output + +TEA generates a comprehensive test design document. + +--- + +## What You Get + +### System-Level Output (`test-design-system.md`) + +- Testability review of architecture +- ADR → test mapping +- Architecturally Significant Requirements (ASRs) +- Environment needs +- Test infrastructure recommendations + +### Epic-Level Output (`test-design-epic-N.md`) + +- Risk assessment for the epic +- Test priorities +- Coverage plan +- Regression hotspots (for brownfield) +- Integration risks +- Mitigation strategies + +--- + +## Test Design for Different Tracks + +### Greenfield - BMad Method + +| Stage | Test Design Focus | +|-------|-------------------| +| Phase 3 | System-level testability review | +| Phase 4 | Per-epic risk assessment and test plan | + +### Brownfield - BMad Method/Enterprise + +| Stage | Test Design Focus | +|-------|-------------------| +| Phase 3 | System-level + existing test baseline | +| Phase 4 | Regression hotspots, integration risks | + +### Enterprise + +| Stage | Test Design Focus | +|-------|-------------------| +| Phase 3 | Compliance-aware testability | +| Phase 4 | Security/performance/compliance focus | + +--- + +## Tips + +- Run system-level test-design right after architecture +- Run epic-level test-design at the start of each epic +- Update test design if ADRs change +- Use the output to guide `*atdd` and `*automate` workflows + +--- + +## Related + +- [TEA Overview](../../explanation/features/tea-overview.md) - Understanding the Test Architect +- [Setup Test Framework](./setup-test-framework.md) - Setting up testing infrastructure +- [Create Architecture](./create-architecture.md) - Architecture workflow diff --git a/docs/how-to/workflows/setup-party-mode.md b/docs/how-to/workflows/setup-party-mode.md new file mode 100644 index 00000000..adbc790d --- /dev/null +++ b/docs/how-to/workflows/setup-party-mode.md @@ -0,0 +1,117 @@ +--- +title: "How to Set Up Party Mode" +description: How to set up and use Party Mode for multi-agent collaboration +--- + + +Use Party Mode to orchestrate dynamic multi-agent conversations with your entire BMAD team. + +--- + +## When to Use This + +- Exploring complex topics that benefit from diverse expert perspectives +- Brainstorming with agents who can build on each other's ideas +- Getting comprehensive views across multiple domains +- Strategic decisions with trade-offs + +--- + +## Prerequisites + +- BMad Method installed with multiple agents +- Any agent loaded that supports party mode + +--- + +## Steps + +### 1. Load Any Agent + +Start with any agent that supports party mode (most do). + +### 2. Start Party Mode + +``` +*party-mode +``` + +Or use the full path: +``` +/bmad:core:workflows:party-mode +``` + +### 3. Introduce Your Topic + +Present a topic or question for the group to discuss: + +``` +I'm trying to decide between a monolithic architecture +and microservices for our new platform. +``` + +### 4. Engage with the Discussion + +The facilitator will: +- Select 2-3 most relevant agents based on expertise +- Let agents respond in character +- Enable natural cross-talk and debate +- Continue until you choose to exit + +### 5. Exit When Ready + +Type "exit" or "done" to conclude the session. Participating agents will say personalized farewells. + +--- + +## What Happens + +1. **Agent Roster** - Party Mode loads your complete agent roster +2. **Introduction** - Available team members are introduced +3. **Topic Analysis** - The facilitator analyzes your topic +4. **Agent Selection** - 2-3 most relevant agents are selected +5. **Discussion** - Agents respond, reference each other, engage in cross-talk +6. **Exit** - Session concludes with farewells + +--- + +## Example Party Compositions + +### Product Strategy +- PM + Innovation Strategist (CIS) + Analyst + +### Technical Design +- Architect + Creative Problem Solver (CIS) + Game Architect + +### User Experience +- UX Designer + Design Thinking Coach (CIS) + Storyteller (CIS) + +### Quality Assessment +- TEA + DEV + Architect + +--- + +## Key Features + +- **Intelligent agent selection** - Selects based on expertise needed +- **Authentic personalities** - Each agent maintains their unique voice +- **Natural cross-talk** - Agents reference and build on each other +- **Optional TTS** - Voice configurations for each agent +- **Graceful exit** - Personalized farewells + +--- + +## Tips + +- Be specific about your topic for better agent selection +- Let the conversation flow naturally +- Ask follow-up questions to go deeper +- Take notes on key insights +- Use for strategic decisions, not routine tasks + +--- + +## Related + +- [Party Mode](../../explanation/features/party-mode.md) - Understanding Party Mode +- [Agent Roles](../../explanation/core-concepts/agent-roles.md) - Available agents diff --git a/docs/how-to/workflows/setup-test-framework.md b/docs/how-to/workflows/setup-test-framework.md new file mode 100644 index 00000000..96ebf7a3 --- /dev/null +++ b/docs/how-to/workflows/setup-test-framework.md @@ -0,0 +1,113 @@ +--- +title: "How to Set Up a Test Framework" +description: How to set up a production-ready test framework using TEA +--- + + +Use TEA's `*framework` workflow to scaffold a production-ready test framework for your project. + +--- + +## When to Use This + +- No existing test framework in your project +- Current test setup isn't production-ready +- Starting a new project that needs testing infrastructure +- Phase 3 (Solutioning) after architecture is complete + +--- + +## Prerequisites + +- BMad Method installed +- Architecture completed (or at least tech stack decided) +- TEA agent available + +--- + +## Steps + +### 1. Load the TEA Agent + +Start a fresh chat and load the TEA (Test Architect) agent. + +### 2. Run the Framework Workflow + +``` +*framework +``` + +### 3. Answer TEA's Questions + +TEA will ask about: + +- Your tech stack (React, Node, etc.) +- Preferred test framework (Playwright, Cypress, Jest) +- Testing scope (E2E, integration, unit) +- CI/CD platform (GitHub Actions, etc.) + +### 4. Review Generated Output + +TEA generates: + +- **Test scaffold** - Directory structure and config files +- **Sample specs** - Example tests following best practices +- **`.env.example`** - Environment variable template +- **`.nvmrc`** - Node version specification +- **README updates** - Testing documentation + +--- + +## What You Get + +``` +tests/ +├── e2e/ +│ ├── example.spec.ts +│ └── fixtures/ +├── integration/ +├── unit/ +├── playwright.config.ts # or cypress.config.ts +└── README.md +``` + +--- + +## Optional: Playwright Utils Integration + +TEA can integrate with `@seontechnologies/playwright-utils` for advanced fixtures: + +```bash +npm install -D @seontechnologies/playwright-utils +``` + +Enable during BMad installation or set `tea_use_playwright_utils: true` in config. + +**Utilities available:** api-request, network-recorder, auth-session, intercept-network-call, recurse, log, file-utils, burn-in, network-error-monitor + +--- + +## Optional: MCP Enhancements + +TEA can use Playwright MCP servers for enhanced capabilities: + +- `playwright` - Browser automation +- `playwright-test` - Test runner with failure analysis + +Configure in your IDE's MCP settings. + +--- + +## Tips + +- Run `*framework` only once per repository +- Run after architecture is complete so framework aligns with tech stack +- Follow up with `*ci` to set up CI/CD pipeline + +--- + +## Related + +- [TEA Overview](../../explanation/features/tea-overview.md) - Understanding the Test Architect +- [Run Test Design](./run-test-design.md) - Creating test plans +- [Create Architecture](./create-architecture.md) - Architecture workflow diff --git a/docs/index.md b/docs/index.md index d9b22a2f..a43bddda 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,111 +1,65 @@ -# BMAD Documentation +--- +title: Welcome to BMad +--- -Complete documentation for the BMAD Method. +BMad (**B**uild **M**ore, **A**rchitect **D**reams) is an AI-driven development framework that helps you build software faster and smarter. It provides specialized AI agents, guided workflows, and intelligent planning that adapts to your project's complexity—whether you're fixing a bug or building an enterprise platform. -## Getting Started - -### New to BMAD? -Start with the core concepts to understand how BMAD works: - -- **[Core Concepts](./bmad-core-concepts/)** - Agents, workflows, and modules explained -- **[Installation Guide](./bmad-core-concepts/installing/)** - Set up BMAD in your project -- **[Quick Start Guide](./modules/bmm-bmad-method/quick-start)** - Build your first feature - -### Upgrading from v4? -- **[v4 to v6 Upgrade Guide](./bmad-core-concepts/installing/upgrading.md)** - Migration path for v4 users +If you're comfortable working with AI coding assistants like Claude, Cursor, or GitHub Copilot, you're ready to get started. --- -## Module Documentation +## New Here? Start with a Tutorial -### BMAD Method (BMM) - Software & Game Development +The fastest way to understand BMad is to try it. Choose a tutorial to walk through your first project in about 10 minutes. -The flagship module for agile AI-driven development. +- **[Get Started with v4 (Stable)](./tutorials/getting-started/getting-started-bmadv4.md)** — Production-ready version with battle-tested workflows +- **[Try v6 (Alpha)](./tutorials/getting-started/getting-started-bmadv6.md)** — Latest features, still in active development -- **[BMM Module Index](./modules/bmm-bmad-method/index)** - Module overview, agents, and documentation - - [Quick Start Guide](./modules/bmm-bmad-method/quick-start) - Step-by-step guide - - [Quick Spec Flow](./modules/bmm-bmad-method/quick-spec-flow) - Rapid Level 0-1 development - - [Brownfield Guide](./modules/bmm-bmad-method/brownfield-guide) - Working with existing codebases -- **[BMM Workflows Guide](./modules/bmm-bmad-method/index#-workflow-guides)** - Essential reading - -### BMAD Builder (BMB) - Create Custom Solutions - -Build your own agents, workflows, and modules. - -- **[BMB Module Overview](./modules/bmb-bmad-builder/index)** - Module overview and capabilities -- **[Agent Creation Guide](./modules/bmb-bmad-builder/agent-creation-guide.md)** - Create custom agents -- **[Custom Content Installation](./modules/bmb-bmad-builder/custom-content-installation.md)** - Share and install custom creations - -### Creative Intelligence Suite (CIS) - Innovation & Creativity - -- **[CIS Documentation](./modules/cis-creative-intelligence-suite/index)** - -### BMAD Game Dev (BMGD) - -- **[BMGD Documentation](./modules/bmgd-bmad-game-dev/index)** - Game development workflows +:::tip[Already familiar with AI-assisted development?] +Feel free to skip around. Use the sidebar to jump to any topic, or check out [What Are Agents?](./explanation/core-concepts/what-are-agents.md) to understand how BMad organizes its AI personas. +::: --- -## Core Module +## How to Use These Docs -### Global Core Entities +These docs are organized into four sections based on what you're trying to do: -- **[Core Module Index](./modules/core/index)** - Shared functionality available to all modules - - [Global Core Config](./modules/core/global-core-config.md) - Inheritable configuration - - [Core Workflows](./modules/core/core-workflows.md) - Domain-agnostic workflows - - [Party Mode](./modules/core/party-mode.md) - Multi-agent conversations - - [Brainstorming](./modules/core/brainstorming.md) - Structured creative sessions - - [Advanced Elicitation](./modules/core/advanced-elicitation.md) - LLM reasoning techniques - - [Core Tasks](./modules/core/core-tasks.md) - Common tasks across modules +| Section | Purpose | +|---------|---------| +| **[Tutorials](./tutorials/index.md)** | Learning-oriented. Step-by-step guides that walk you through building something. Start here if you're new. | +| **[How-To Guides](./how-to/index.md)** | Task-oriented. Practical guides for solving specific problems. "How do I customize an agent?" lives here. | +| **[Explanation](./explanation/index.md)** | Understanding-oriented. Deep dives into concepts and architecture. Read when you want to know *why*. | +| **[Reference](./reference/index.md)** | Information-oriented. Technical specifications for agents, workflows, and configuration. | --- -## Advanced Topics +## What You'll Need -### Customization +BMad works with any AI coding assistant that supports custom system prompts or project context. Popular options include: -- **[BMAD Customization](./bmad-core-concepts/bmad-customization/)** - Modify agents and workflows +- **[Claude Code](https://code.claude.com)** — Anthropic's CLI tool (recommended) +- **[Cursor](https://cursor.sh)** — AI-first code editor +- **[Windsurf](https://codeium.com/windsurf)** — Codeium's AI IDE +- **[Roo Code](https://roocode.com)** — VS Code extension -### Platform Guides - -- **[Web Bundles](./bmad-core-concepts/web-bundles/)** - Use BMAD in Gemini Gems and Custom GPTs +You should be comfortable with basic software development concepts like version control, project structure, and agile workflows. No prior experience with BMad-style agent systems is required—that's what these docs are for. --- -## Recommended Reading Paths +## Join the Community -### Path 1: Brand New to BMAD (Software Project) +Get help, share what you're building, or contribute to BMad: -1. [Core Concepts](./bmad-core-concepts/) - Understand agents and workflows -2. [Installation Guide](./bmad-core-concepts/installing/) - Set up BMAD -3. [Quick Start Guide](./modules/bmm-bmad-method/quick-start) - Get hands-on -4. [BMM Workflows Guide](./modules/bmm-bmad-method/index#-workflow-guides) - Master the methodology +- **[Discord](https://discord.gg/gk8jAdXWmj)** — Chat with other BMad users, ask questions, share ideas +- **[GitHub](https://github.com/bmad-code-org/BMAD-METHOD)** — Source code, issues, and contributions +- **[YouTube](https://www.youtube.com/@BMadCode)** — Video tutorials and walkthroughs -### Path 2: Game Development Project +--- -1. [Core Concepts](./bmad-core-concepts/) - Understand agents and workflows -2. [Installation Guide](./bmad-core-concepts/installing/) - Set up BMAD -3. [BMGD Workflows Guide](./modules/bmgd-bmad-game-dev/workflows-guide) - Game-specific workflows +## Next Step -### Path 3: Upgrading from v4 +Ready to dive in? Pick a tutorial and start building. -1. [v4 to v6 Upgrade Guide](./bmad-core-concepts/installing/upgrading.md) - Understand what changed -2. [Quick Start Guide](./modules/bmm-bmad-method/quick-start) - Reorient yourself -3. [BMM Workflows Guide](./modules/bmm-bmad-method/index#-workflow-guides) - Learn new v6 workflows - -### Path 4: Working with Existing Codebase (Brownfield) - -1. [Brownfield Guide](./modules/bmm-bmad-method/brownfield-guide) - Approach for legacy code -2. [Quick Start Guide](./modules/bmm-bmad-method/quick-start) - Follow the process -3. [BMM Workflows Guide](./modules/bmm-bmad-method/index#-workflow-guides) - Master the methodology - -### Path 5: Building Custom Agents - -1. [Core Concepts: Agents](./bmad-core-concepts/agents.md) - Understand Simple vs Expert -2. [Agent Creation Guide](./modules/bmb-bmad-builder/agent-creation-guide.md) - Build your first agent -3. [Agent Architecture](./modules/bmb-bmad-builder/index) - Deep technical details - -### Path 6: Contributing to BMAD - -1. [CONTRIBUTING.md](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/CONTRIBUTING.md) - Contribution guidelines -2. Relevant module README - Understand the area you're contributing to +- **[Get Started with v4 (Stable)](./tutorials/getting-started/getting-started-bmadv4.md)** — Recommended for production projects +- **[Try v6 (Alpha)](./tutorials/getting-started/getting-started-bmadv6.md)** — Explore the latest features diff --git a/docs/modules/bmb-bmad-builder/agent-creation-guide.md b/docs/modules/bmb-bmad-builder/agent-creation-guide.md deleted file mode 100644 index cd661f22..00000000 --- a/docs/modules/bmb-bmad-builder/agent-creation-guide.md +++ /dev/null @@ -1,159 +0,0 @@ -# Agent Creation Guide - -Create your own custom agents using the BMAD Builder workflow. - -## Overview - -The BMAD Builder (BMB) module provides an interactive workflow that guides you through creating a custom agent from concept to completion. You define the agent's purpose, personality, capabilities, and menu - then the workflow generates a complete, ready-to-use agent file. - -## Before You Start - -**Prerequisites:** -- BMAD installed with the BMB module -- An idea for what you want your agent to do - -**Know Before You Go:** -- What problem should your agent solve? -- Who will use this agent? -- What should the agent be able to do? - -## Quick Start - -### 1. Start the Workflow - -In your IDE (Claude Code, Cursor, etc.), invoke the create-agent workflow with the agent-builder agent. - -### 2. Follow the Steps - -The workflow guides you through: - -| Step | What You'll Do | -| ------------------------- | -------------------------------------------- | -| **Brainstorm** (optional) | Explore ideas with creative techniques | -| **Discovery** | Define the agent's purpose and goals | -| **Type & Metadata** | Choose Simple or Expert, name your agent | -| **Persona** | Craft the agent's personality and principles | -| **Commands** | Define what the agent can do | -| **Activation** | Set up autonomous behaviors (optional) | -| **Build** | Generate the agent file | -| **Validation** | Review and verify everything works | - -### 3. Install Your Agent - -Once created, package your agent for installation: - -``` -my-custom-stuff/ -├── module.yaml # Contains: unitary: true -├── agents/ -│ └── {agent-name}/ -│ ├── {agent-name}.agent.yaml -│ └── _memory/ # Expert agents only -│ └── {sidecar-folder}/ -└── workflows/ # Optional: custom workflows -``` - -See [Custom Content Installation](./custom-content-installation.md) for details. - -## Choosing Your Agent Type - -The workflow will help you decide, but here's the quick reference: - -### Choose Simple Agent When: - -- Task is well-defined and focused -- Don't need persistent memory -- Want fast setup and deployment -- Single-purpose assistant (e.g., commit messages, code review) - -**Example:** A "Code Commenter" that reads files and adds helpful comments. - -### Choose Expert Agent When: - -- Domain requires specialized knowledge -- Need persistent memory across sessions -- Agent coordinates complex workflows -- Building ongoing project infrastructure - -**Example:** A "Security Architect" that remembers your design decisions and maintains security standards across the project. - -### Choose Module Agent When: - -- Agent builds other agents or workflows -- Need integration with module system -- Creating professional tooling - -**Example:** A "Team Builder" that helps set up agents for new team members. - -## The Persona System - -Your agent's personality is defined by four fields: - -| Field | Purpose | Example | -| ----------------------- | -------------- | ----------------------------------------------------------------- | -| **Role** | What they do | "Senior code reviewer who catches bugs and suggests improvements" | -| **Identity** | Who they are | "Friendly but exacting, believes clean code is a craft" | -| **Communication Style** | How they speak | "Direct, constructive, explains the 'why' behind suggestions" | -| **Principles** | Why they act | "Security first, clarity over cleverness, test what you fix" | - -**Key:** Keep each field focused on its purpose. The role isn't personality; the identity isn't job description. - -## Tips for Success - -### Start Small - -Your first agent should solve **one problem well**. You can always add more capabilities later. - -### Learn by Example - -Study the reference agents in `src/modules/bmb/reference/agents/`: -- **Simple:** [commit-poet](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/simple-examples/commit-poet.agent.yaml) -- **Expert:** [journal-keeper](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/expert-examples/journal-keeper) - -### Write Great Principles - -The first principle should "activate" the agent's expertise: - -❌ **Weak:** "Be helpful and accurate" -✅ **Strong:** "Channel decades of security expertise: threat modeling begins with trust boundaries, never trust client input, defense in depth is non-negotiable" - -### Use the Menu System - -The workflow provides options at each step: -- **[A] Advanced** - Get deeper insights and reasoning -- **[P] Party** - Get multiple agent perspectives -- **[C] Continue** - Move to the next step - -Use these when you need extra input or creative options. - -## After Creation - -### Test Your Agent - -1. Install your custom module using the BMAD installer -2. Invoke your new agent in your IDE -3. Try each menu command -4. Verify the personality feels right - -### Iterate - -If something isn't right: -1. Edit the agent YAML directly, or -2. Edit the customization file in `_bmad/_config/agents/` -3. Rebuild using `npx bmad-method build ` - -### Share - -Package your agent as a standalone module (see [Installation Guide](../../bmad-core-concepts/installing/)) and share it with your team or the community. - -## Further Reading - -- **[Agent Architecture](./index.md)** - Deep technical details on agent types -- **[Agent Customization](../../bmad-core-concepts/agent-customization/)** - Modify agents without editing core files -- **[Custom Content Installation](./custom-content-installation.md)** - Package and distribute your agents - ---- - -**Ready?** Start the workflow and create your first agent! - -[← Back to BMB Documentation](./index.md) diff --git a/docs/modules/bmb-bmad-builder/index.md b/docs/modules/bmb-bmad-builder/index.md deleted file mode 100644 index 13ea51cd..00000000 --- a/docs/modules/bmb-bmad-builder/index.md +++ /dev/null @@ -1,60 +0,0 @@ -# BMB Module Documentation - -Create custom agents, workflows, and modules for BMAD. - -## Quick Start - -- **[Agent Creation Guide](./agent-creation-guide.md)** - Step-by-step guide to building your first agent -- **[Understanding Agent Types](./understanding-agent-types.md)** - Learn the differences between Simple and Expert agents - -## Agent Architecture - -Comprehensive guides for each agent type (choose based on use case): - -- [Understanding Agent Types](./understanding-agent-types.md) - **START HERE** - Architecture vs capability, "The Same Agent, Three Ways" -- [Simple Agent Architecture](./simple-agent-architecture.md) - Self-contained, optimized, personality-driven -- [Expert Agent Architecture](./expert-agent-architecture.md) - Memory, sidecar files, domain restrictions -- Module Agent Architecture _(TODO)_ - Workflow integration, professional tools - -## Agent Design Patterns - -- [Agent Menu Patterns](./agent-menu-patterns.md) - Menu handlers, triggers, prompts, organization -- [Agent Compilation](./agent-compilation.md) - What compiler auto-injects (AVOID DUPLICATION) - -## Reference Examples - -Production-ready examples in [bmb/reference/agents/](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents): - -**Simple Agents** ([simple-examples/](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/simple-examples)) - -- [commit-poet.agent.yaml](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/src/modules/bmb/reference/agents/simple-examples/commit-poet.agent.yaml) - Commit message artisan with style customization - -**Expert Agents** ([expert-examples/](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/expert-examples)) - -- [journal-keeper/](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/expert-examples/journal-keeper) - Personal journal companion with memory and pattern recognition - -**Module Agents** ([module-examples/](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/module-examples)) - -- [security-engineer.agent.yaml](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml) - BMM security specialist with threat modeling -- [trend-analyst.agent.yaml](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml) - CIS trend intelligence expert - -## Installation Guide - -For installing standalone simple and expert agents, see: - -- [Custom Agent Installation](/docs/modules/bmb-bmad-builder/custom-content-installation.md) - -## Key Concepts - -### YAML to XML Compilation - -Agents are authored in YAML with Handlebars templating. The compiler auto-injects: - -1. **Frontmatter** - Name and description from metadata -2. **Activation Block** - Steps, menu handlers, rules (YOU don't write this) -3. **Menu Enhancement** - `*help` and `*exit` commands added automatically -4. **Trigger Prefixing** - Your triggers auto-prefixed with `*` - -**Critical:** See [Agent Compilation](./agent-compilation.md) to avoid duplicating auto-injected content. - -Source: `tools/cli/lib/agent/compiler.js` diff --git a/docs/modules/bmgd-bmad-game-dev/glossary.md b/docs/modules/bmgd-bmad-game-dev/glossary.md deleted file mode 100644 index 92de3676..00000000 --- a/docs/modules/bmgd-bmad-game-dev/glossary.md +++ /dev/null @@ -1,293 +0,0 @@ -# BMGD Glossary - -Key game development terminology used in BMGD workflows. - ---- - -## A - -### Acceptance Criteria - -Specific conditions that must be met for a story to be considered complete. Defines "done" for implementation. - -### Act Structure - -Story organization into major sections (typically 3 acts: Setup, Confrontation, Resolution). - ---- - -## B - -### Backlog - -List of pending work items (epics, stories) waiting to be scheduled and implemented. - -### Boss Design - -Design of significant enemy encounters, typically featuring unique mechanics and increased challenge. - ---- - -## C - -### Character Arc - -The transformation a character undergoes through the story, from initial state to final state. - -### Core Fantasy - -The emotional experience players seek from your game. What they want to FEEL. - -### Core Loop - -The fundamental cycle of actions players repeat throughout gameplay. The heart of your game. - ---- - -## D - -### Definition of Done (DoD) - -Checklist of requirements that must be satisfied before work is considered complete. - -### Design Pillar - -Core principle that guides all design decisions. Typically 3-5 pillars define a game's identity. - ---- - -## E - -### Environmental Storytelling - -Narrative communicated through the game world itself—visual details, audio, found documents—rather than explicit dialogue. - -### Epic - -Large body of work that can be broken down into smaller stories. Represents a major feature or system. - ---- - -## F - -### Frame Data - -In fighting games, the precise timing information for moves (startup, active, recovery frames). - -### Frontmatter - -YAML metadata at the beginning of markdown files, used for workflow state tracking. - ---- - -## G - -### Game Brief - -Document capturing the game's core vision, pillars, target audience, and scope. Foundation for the GDD. - -### Game Design Document (GDD) - -Comprehensive document detailing all aspects of game design: mechanics, systems, content, and more. - -### Game Type - -Genre classification that determines which specialized GDD sections are included. - ---- - -## H - -### Hot Path - -Code that executes frequently (every frame). Must be optimized for performance. - ---- - -## I - -### Idle Progression - -Game mechanics where progress continues even when the player isn't actively playing. - ---- - -## K - -### Kishotenketsu - -Four-act story structure from East Asian narrative tradition (Introduction, Development, Twist, Conclusion). - ---- - -## L - -### Localization - -Adapting game content for different languages and cultures. - ---- - -## M - -### MDA Framework - -Mechanics → Dynamics → Aesthetics. Framework for analyzing and designing games. - -### Meta-Progression - -Persistent progression that carries between individual runs or sessions. - -### Metroidvania - -Genre featuring interconnected world exploration with ability-gated progression. - ---- - -## N - -### Narrative Complexity - -How central story is to the game experience (Critical, Heavy, Moderate, Light). - -### Netcode - -Networking code handling multiplayer communication and synchronization. - ---- - -## P - -### Permadeath - -Game mechanic where character death is permanent, typically requiring a new run. - -### Player Agency - -The degree to which players can make meaningful choices that affect outcomes. - -### Procedural Generation - -Algorithmic creation of game content (levels, items, characters) rather than hand-crafted. - ---- - -## R - -### Retrospective - -Team meeting after completing work to reflect on what went well and what to improve. - -### Roguelike - -Genre featuring procedural generation, permadeath, and run-based progression. - -### Run - -A single playthrough in a roguelike or run-based game, from start to death/completion. - ---- - -## S - -### Sprint - -Time-boxed period of development work, typically 1-2 weeks. - -### Sprint Status - -Tracking document showing current sprint progress, story states, and blockers. - -### Story - -Smallest unit of implementable work with clear acceptance criteria. Part of an epic. - -### Story Context - -Assembled documentation and code context needed to implement a specific story. - -### Story Gates - -Points where story progression is blocked until certain gameplay conditions are met. - ---- - -## T - -### Tech Spec - -Technical specification document detailing how a feature will be implemented. - -### TDD (Test-Driven Development) - -Development approach: write tests first, then implement code to pass them. - ---- - -## U - -### UI/UX - -User Interface / User Experience. How players interact with and experience the game. - ---- - -## V - -### Visual Novel - -Genre focused on narrative with static images, dialogue, and player choices. - -### Voice Acting - -Recorded spoken dialogue for game characters. - ---- - -## W - -### Workflow - -Structured process for completing a specific type of work (e.g., GDD creation, story implementation). - -### Workflow Status - -Current state of project workflows, tracking which phases and documents are complete. - -### World Building - -Creation of the game's setting, including history, culture, geography, and lore. - ---- - -## BMGD-Specific Terms - -### A/P/C Menu - -Options presented after content generation: - -- **A** - Advanced Elicitation (explore deeper) -- **P** - Party Mode (multi-agent discussion) -- **C** - Continue (save and proceed) - -### Narrative Complexity Levels - -- **Critical** - Story IS the game (visual novels) -- **Heavy** - Deep narrative with gameplay (RPGs) -- **Moderate** - Meaningful story supporting gameplay -- **Light** - Minimal story, gameplay-focused - -### Step-File Architecture - -BMGD workflow pattern using separate markdown files for each workflow step. - -### Workflow-Install Pattern - -Phase 4 workflows inherit from BMM base and add BMGD-specific overrides. - ---- - -## Next Steps - -- **[Quick Start Guide](./quick-start.md)** - Get started with BMGD -- **[Game Types Guide](./game-types-guide.md)** - Game genre reference diff --git a/docs/modules/bmgd-bmad-game-dev/index.md b/docs/modules/bmgd-bmad-game-dev/index.md deleted file mode 100644 index 9d53e295..00000000 --- a/docs/modules/bmgd-bmad-game-dev/index.md +++ /dev/null @@ -1,175 +0,0 @@ -# BMGD Documentation - -Complete guides for the BMad Game Development Module (BMGD) - AI-powered workflows for game design and development that adapt to your project's needs. - ---- - -## Getting Started - -**New to BMGD?** Start here: - -- **[Quick Start Guide](./quick-start.md)** - Get started building your first game - - Installation and setup - - Understanding the game development phases - - Running your first workflows - - Agent-based development flow - -**Quick Path:** Install BMGD module → Game Brief → GDD → Architecture → Build - ---- - -## Core Concepts - -Understanding how BMGD works: - -- **[Agents Guide](./agents-guide.md)** - Complete reference for game development agents - - Game Designer, Game Developer, Game Architect, Game Scrum Master, Game QA, Game Solo Dev - - Agent roles and when to use them - - Agent workflows and menus - -- **[Workflows Guide](./workflows-guide.md)** - Complete workflow reference - - Phase 1: Preproduction (Brainstorm, Game Brief) - - Phase 2: Design (GDD, Narrative) - - Phase 3: Technical (Architecture) - - Phase 4: Production (Sprint-based development) - -- **[Game Types Guide](./game-types-guide.md)** - Selecting and using game type templates - - 24 supported game types - - Genre-specific GDD sections - - Hybrid game type handling - -- **[Quick-Flow Guide](./quick-flow-guide.md)** - Fast-track workflows for rapid development - - Quick-Prototype for testing ideas - - Quick-Dev for flexible implementation - - When to use quick-flow vs full BMGD - ---- - -## Quick References - -Essential reference materials: - -- **[Glossary](./glossary.md)** - Key game development terminology - ---- - -## Choose Your Path - -### I need to... - -**Start a new game project** -→ Start with [Quick Start Guide](./quick-start.md) -→ Run `brainstorm-game` for ideation -→ Create a Game Brief with `create-brief` - -**Design my game** -→ Create a GDD with `create-gdd` -→ If story-heavy, add Narrative Design with `create-narrative` - -**Plan the technical architecture** -→ Run `create-architecture` with the Game Architect - -**Build my game** -→ Use Phase 4 production workflows -→ Follow the sprint-based development cycle - -**Quickly test an idea or implement a feature** -→ Use [Quick-Flow](./quick-flow-guide.md) for rapid prototyping and development -→ `quick-prototype` to test mechanics, `quick-dev` to implement - -**Set up testing and QA** -→ Use Game QA agent for test framework setup -→ Run `test-framework` to initialize testing for Unity/Unreal/Godot -→ Use `test-design` to create test scenarios -→ Plan playtests with `playtest-plan` - -**Understand game type templates** -→ See [Game Types Guide](./game-types-guide.md) - ---- - -## Game Development Phases - -BMGD follows four phases aligned with game development: - -![BMGD Workflow Overview](./workflow-overview.jpg) - -### Phase 1: Preproduction - -- **Brainstorm Game** - Ideation with game-specific techniques -- **Game Brief** - Capture vision, market, and fundamentals - -### Phase 2: Design - -- **GDD (Game Design Document)** - Comprehensive game design -- **Narrative Design** - Story, characters, world (for story-driven games) - -### Phase 3: Technical - -- **Game Architecture** - Engine, systems, patterns, structure - -### Phase 4: Production - -- **Sprint Planning** - Epic and story management -- **Story Development** - Implementation workflow -- **Code Review** - Quality assurance -- **Testing** - Automated tests, playtesting, performance -- **Retrospective** - Continuous improvement - ---- - -## BMGD vs BMM - -BMGD extends BMM with game-specific capabilities: - -| Aspect | BMM | BMGD | -| -------------- | ------------------------------------- | ------------------------------------------------------------------------ | -| **Focus** | General software | Game development | -| **Agents** | PM, Architect, Dev, SM, TEA, Solo Dev | Game Designer, Game Dev, Game Architect, Game SM, Game QA, Game Solo Dev | -| **Planning** | PRD, Tech Spec | Game Brief, GDD | -| **Types** | N/A | 24 game type templates | -| **Narrative** | N/A | Full narrative workflow | -| **Testing** | Web-focused testarch | Engine-specific (Unity, Unreal, Godot) | -| **Production** | Inherited from BMM | BMM workflows with game overrides | - -BMGD production workflows inherit from BMM and add game-specific checklists and templates. - ---- - -## Documentation Map - -``` -BMGD Documentation -├── README.md (this file) -├── quick-start.md # Getting started -├── agents-guide.md # Agent reference -├── workflows-guide.md # Workflow reference -├── quick-flow-guide.md # Rapid prototyping and development -├── game-types-guide.md # Game type templates -├── glossary.md # Terminology -``` - ---- - -## External Resources - -### Community and Support - -- **[Discord Community](https://discord.gg/gk8jAdXWmj)** - Get help from the community -- **[GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues)** - Report bugs or request features -- **[YouTube Channel](https://www.youtube.com/@BMadCode)** - Video tutorials - -### Related Documentation - -- **[BMM Documentation](../bmm/index.md)** - Core BMad Method documentation - -## Tips for Using This Documentation - -1. **Start with Quick Start** if you're new to BMGD -2. **Check Game Types Guide** when creating your GDD -3. **Reference Glossary** for game development terminology -4. **Use Troubleshooting** when you encounter issues - ---- - -**Ready to make games?** → [Start with the Quick Start Guide](./quick-start.md) diff --git a/docs/modules/bmgd-bmad-game-dev/quick-start.md b/docs/modules/bmgd-bmad-game-dev/quick-start.md deleted file mode 100644 index 6e625d44..00000000 --- a/docs/modules/bmgd-bmad-game-dev/quick-start.md +++ /dev/null @@ -1,250 +0,0 @@ -# BMGD Quick Start Guide - -Get started building games with the BMad Game Development Module. - ---- - -## Prerequisites - -Before starting with BMGD, ensure you have: - -1. **BMAD-METHOD installed** - Follow the main installation guide -2. **A game idea** - Even a rough concept is enough to start -3. **Your preferred AI tool** - Claude Code, Cursor, or web-based chat - ---- - -## Installation - -BMGD is a custom module that extends BMM. Install it using the BMAD installer: - -```bash -# During installation, select BMGD when prompted for custom modules -npx bmad-cli install -``` - -Or add to an existing installation: - -```bash -npx bmad-cli install --add-module bmgd -``` - ---- - -## Understanding the Phases - -BMGD follows four game development phases: - -![BMGD Workflow Overview](./workflow-overview.jpg) - -### Phase 1: Preproduction - -**What happens:** Capture your game vision and core concept. - -**Workflows:** - -- `brainstorm-game` - Guided ideation with game-specific techniques -- `create-game-brief` - Document vision, market, pillars, and fundamentals - -**Output:** Game Brief document - -### Phase 2: Design - -**What happens:** Detail your game's mechanics, systems, and (optionally) narrative. - -**Workflows:** - -- `create-gdd` - Create comprehensive Game Design Document -- `narrative` - Create Narrative Design Document (for story-driven games) - -**Output:** GDD (and Narrative Design document if applicable) - -### Phase 3: Technical - -**What happens:** Plan how you'll build the game. - -**Workflows:** - -- `create-architecture` - Define engine, systems, patterns, and structure - -**Output:** Game Architecture document - -### Phase 4: Production - -**What happens:** Build your game in sprints. - -**Workflows:** - -- `sprint-planning` - Plan and track sprints -- `sprint-status` - View progress and get recommendations -- `create-story` - Create implementable stories -- `dev-story` - Implement stories -- `code-review` - Quality assurance -- `retrospective` - Learn and improve after epics - -**Output:** Working game code - ---- - -## Your First Game Project - -### Step 1: Start with Brainstorming (Optional) - -If you have a vague idea and want help developing it: - -``` -You: brainstorm-game -Agent: [Guides you through game-specific ideation techniques] -``` - -### Step 2: Create Your Game Brief - -Capture your game's core vision: - -``` -You: create-game-brief -Agent: [Walks you through game concept, pillars, market, and fundamentals] -``` - -**Output:** `{output_folder}/game-brief.md` - -### Step 3: Create Your GDD - -Detail your game's design: - -``` -You: create-gdd -Agent: [Guides you through mechanics, systems, and game-type-specific sections] -``` - -**Output:** `{output_folder}/gdd.md` (or sharded into `{output_folder}/gdd/`) - -### Step 4: Add Narrative Design (If Story-Driven) - -For games with significant story: - -``` -You: narrative -Agent: [Facilitates story, characters, world, and dialogue design] -``` - -**Output:** `{output_folder}/narrative-design.md` - -### Step 5: Create Architecture - -Plan your technical implementation: - -``` -You: create-architecture -Agent: [Guides engine selection, system design, and technical decisions] -``` - -**Output:** `{output_folder}/game-architecture.md` - -### Step 6: Start Building - -Begin sprint-based development: - -``` -You: sprint-planning -Agent: [Sets up sprint tracking and epic management] -``` - ---- - -## Choosing Your Agent - -BMGD provides six specialized agents: - -| Agent | Icon | When to Use | -| --------------------- | ---- | ----------------------------------------- | -| **Game Designer** | 🎲 | Brainstorming, Game Brief, GDD, Narrative | -| **Game Architect** | 🏛️ | Architecture, technical decisions | -| **Game Developer** | 🕹️ | Implementation, code reviews | -| **Game Scrum Master** | 🎯 | Sprint planning, story management | -| **Game QA** | 🧪 | Test framework, test design, automation | -| **Game Solo Dev** | 🎮 | Quick prototyping, indie development | - -### Typical Flow - -1. **Game Designer** (Phases 1-2): Brainstorm → Brief → GDD → Narrative -2. **Game Architect** (Phase 3): Architecture -3. **Game Scrum Master** (Phase 4): Sprint planning, story creation -4. **Game Developer** (Phase 4): Implementation, code reviews - ---- - -## Quick Command Reference - -### Phase 1: Preproduction - -- `brainstorm-game` - Ideation session -- `create-game-brief` - Create Game Brief - -### Phase 2: Design - -- `create-gdd` - Create GDD -- `narrative` - Create Narrative Design - -### Phase 3: Technical - -- `create-architecture` - Create Architecture - -### Phase 4: Production - -- `sprint-planning` - Plan sprints -- `sprint-status` - View progress and recommendations -- `create-story` - Create story -- `dev-story` - Implement story -- `code-review` - Review code -- `retrospective` - Team retrospective -- `correct-course` - Handle sprint changes - -### Quick-Flow (Fast-Track) - -- `quick-prototype` - Rapid prototyping (IDE only) -- `quick-dev` - Flexible development (IDE only) - -### Utility - -- `workflow-status` - Check project status -- `party-mode` - Multi-agent collaboration -- `advanced-elicitation` - Deep exploration - ---- - -## Tips for Success - -### 1. Start Small - -Begin with a simple game concept. You can always expand later. - -### 2. Use Game Type Templates - -When creating your GDD, BMGD offers 24 game type templates that provide genre-specific sections. - -### 3. Iterate - -Documents are living artifacts. Return to update them as your vision evolves. - -### 4. Trust the Process - -Each workflow builds on previous outputs. The Game Brief informs the GDD, which informs the Architecture, which informs implementation. - -### 5. Collaborate with Agents - -Use `party-mode` to get perspectives from multiple agents when facing complex decisions. - ---- - -## Next Steps - -- **[Agents Guide](./agents-guide.md)** - Learn about each agent's capabilities -- **[Workflows Guide](./workflows-guide.md)** - Detailed workflow reference -- **[Quick-Flow Guide](./quick-flow-guide.md)** - Rapid prototyping and development -- **[Game Types Guide](./game-types-guide.md)** - Understand game type templates -- **[Glossary](./glossary.md)** - Game development terminology - ---- - -**Ready to start?** Chat with the **Game Designer** agent and say `brainstorm-game` or `create-game-brief`! diff --git a/docs/modules/bmm-bmad-method/bmad-quick-flow.md b/docs/modules/bmm-bmad-method/bmad-quick-flow.md deleted file mode 100644 index 803f7de9..00000000 --- a/docs/modules/bmm-bmad-method/bmad-quick-flow.md +++ /dev/null @@ -1,506 +0,0 @@ -# BMAD Quick Flow - -**Track:** Quick Flow -**Primary Agent:** Quick Flow Solo Dev (Barry) -**Ideal For:** Bug fixes, small features, rapid prototyping - ---- - -## Overview - -BMAD Quick Flow is the fastest path from idea to production in the BMAD Method ecosystem. It's a streamlined 3-step process designed for rapid spec driven development without sacrificing quality. Perfect for experienced teams who need to move fast or for smaller features or 1 off efforts that don't require extensive planning. - -### When to Use Quick Flow - -**Perfect For:** - -- Bug fixes and patches -- Small feature additions -- Proof of concepts and prototypes -- Mid course corrections or additions of something missed in BMM full planning -- Performance optimizations -- API endpoint additions -- UI component enhancements -- Configuration changes -- Internal tools - -**Not Recommended For:** - -- Large-scale system redesigns -- Complex multi-team projects -- New product launches -- Projects requiring extensive UX design -- Enterprise-wide initiatives -- Mission-critical systems with compliance requirements -- Ideas with many 'moving pieces' - ---- - -## The Quick Flow Process - -Utilizing the Quick Flow Solo Dev, this one agent can do it all! - -1. Create an (option) Technical Specification -2. Develop with Tests -3. AI Driven Code Review - -That's it! Lets look at each step in more detail though. - -### Step 1: Optional Technical Specification - -The `create-tech-spec` workflow transforms requirements into implementation-ready specifications. - -**Key Features:** - -- Conversational spec engineering -- Automatic codebase pattern detection -- Context gathering from existing code -- Implementation-ready task breakdown -- Acceptance criteria definition - -**Process Flow:** - -1. **Problem Understanding** - - Greet user and gather requirements - - Ask clarifying questions about scope and constraints - - Check for existing project context - -2. **Code Investigation (Brownfield)** - - Analyze existing codebase patterns - - Document tech stack and conventions - - Identify files to modify and dependencies - -3. **Specification Generation** - - Create structured tech specification - - Define clear tasks and acceptance criteria - - Document technical decisions - - Include development context - -4. **Review and Finalize** - - Present spec for validation - - Make adjustments as needed - - Save to sprint artifacts - -**Output:** `{implementation_artifacts}/tech-spec-{slug}.md` - -### Step 2: Development - -The `quick-dev` workflow executes implementation with flexibility and speed. - -**Two Execution Modes:** - -**Mode A: Tech-Spec Driven** - -```bash -# Execute from tech spec -quick-dev tech-spec-feature-x.md -``` - -- Loads and parses technical specification -- Extracts tasks, context, and acceptance criteria -- Executes all tasks in sequence -- Updates spec status on completion - -**Mode B: Direct Instructions** - -```bash -# Direct development commands -quick-dev "Add password reset to auth service" -quick-dev "Fix the memory leak in image processing" -``` - -- Accepts direct development instructions -- Offers optional planning step -- Executes immediately with minimal friction - -**Development Process:** - -1. **Context Loading** - - Load project context if available - - Understand patterns and conventions - - Identify relevant files and dependencies - -2. **Implementation Loop** - For each task: - - Load relevant files and context - - Implement following established patterns - - Write appropriate tests - - Run and verify tests pass - - Mark task complete and continue - -3. **Continuous Execution** - - Works through all tasks without stopping - - Handles failures by requesting guidance - - Ensures tests pass before continuing - -4. **Verification** - - Confirms all tasks complete - - Validates acceptance criteria - - Updates tech spec status if used - -### Step 3: Optional Code Review - -The `code-review` workflow provides senior developer review of implemented code. - -**When to Use:** - -- Production-critical features -- Security-sensitive implementations -- Performance optimizations -- Team development scenarios -- Learning and knowledge transfer - -**Review Process:** - -1. Load story context and acceptance criteria -2. Analyze code implementation -3. Check against project patterns -4. Validate test coverage -5. Provide structured review notes -6. Suggest improvements if needed - ---- - -## Quick Flow vs Other Tracks - -| Aspect | Quick Flow | BMad Method | Enterprise Method | -| ----------------- | ---------------- | --------------- | ------------------ | -| **Planning** | Minimal/Optional | Structured | Comprehensive | -| **Documentation** | Essential only | Moderate | Extensive | -| **Team Size** | 1-2 developers | 3-7 specialists | 8+ enterprise team | -| **Timeline** | Hours to days | Weeks to months | Months to quarters | -| **Ceremony** | Minimal | Balanced | Full governance | -| **Flexibility** | High | Moderate | Structured | -| **Risk Profile** | Medium | Low | Very Low | - ---- - -## Best Practices - -### Before Starting Quick Flow - -1. **Validate Track Selection** - - Is the feature small enough? - - Do you have clear requirements? - - Is the team comfortable with rapid development? - -2. **Prepare Context** - - Have project documentation ready - - Know your codebase patterns - - Identify affected components upfront - -3. **Set Clear Boundaries** - - Define in-scope and out-of-scope items - - Establish acceptance criteria - - Identify dependencies - -### During Development - -1. **Maintain Velocity** - - Don't over-engineer solutions - - Follow existing patterns - - Keep tests proportional to risk - -2. **Stay Focused** - - Resist scope creep - - Handle edge cases later if possible - - Document decisions briefly - -3. **Communicate Progress** - - Update task status regularly - - Flag blockers immediately - - Share learning with team - -### After Completion - -1. **Quality Gates** - - Ensure tests pass - - Verify acceptance criteria - - Consider optional code review - -2. **Knowledge Transfer** - - Update relevant documentation - - Share key decisions - - Note any discovered patterns - -3. **Production Readiness** - - Verify deployment requirements - - Check monitoring needs - - Plan rollback strategy - ---- - -## Quick Flow Templates - -### Tech Spec Template - -```markdown -# Tech-Spec: {Feature Title} - -**Created:** {date} -**Status:** Ready for Development -**Estimated Effort:** Small (1-2 days) - -## Overview - -### Problem Statement - -{Clear description of what needs to be solved} - -### Solution - -{High-level approach to solving the problem} - -### Scope (In/Out) - -**In:** {What will be implemented} -**Out:** {Explicitly excluded items} - -## Context for Development - -### Codebase Patterns - -{Key patterns to follow, conventions} - -### Files to Reference - -{List of relevant files and their purpose} - -### Technical Decisions - -{Important technical choices and rationale} - -## Implementation Plan - -### Tasks - -- [ ] Task 1: {Specific implementation task} -- [ ] Task 2: {Specific implementation task} -- [ ] Task 3: {Testing and validation} - -### Acceptance Criteria - -- [ ] AC 1: {Given/When/Then format} -- [ ] AC 2: {Given/When/Then format} - -## Additional Context - -### Dependencies - -{External dependencies or prerequisites} - -### Testing Strategy - -{How the feature will be tested} - -### Notes - -{Additional considerations} -``` - -### Quick Dev Commands - -```bash -# From tech spec -quick-dev sprint-artifacts/tech-spec-user-auth.md - -# Direct development -quick-dev "Add CORS middleware to API endpoints" -quick-dev "Fix null pointer exception in user service" -quick-dev "Optimize database query for user list" - -# With optional planning -quick-dev "Implement file upload feature" --plan -``` - ---- - -## Integration with Other Workflows - -### Upgrading Tracks - -If a Quick Flow feature grows in complexity: - -```mermaid -flowchart LR - QF[Quick Flow] --> CHECK{Complexity Increases?} - CHECK -->|Yes| UPGRADE[Upgrade to BMad Method] - CHECK -->|No| CONTINUE[Continue Quick Flow] - - UPGRADE --> PRD[Create PRD] - PRD --> ARCH[Architecture Design] - ARCH --> STORIES[Create Epics/Stories] - STORIES --> SPRINT[Sprint Planning] - - style QF fill:#e1f5fe - style UPGRADE fill:#fff3e0 - style PRD fill:#f3e5f5 - style ARCH fill:#e8f5e9 - style STORIES fill:#f1f8e9 - style SPRINT fill:#e0f2f1 -``` - -### Using Party Mode - -For complex Quick Flow challenges: - -```bash -# Start Barry -/bmad:bmm:agents:quick-flow-solo-dev - -# Begin party mode for collaborative problem-solving -party-mode -``` - -Party mode brings in relevant experts: - -- **Architect** - For design decisions -- **Dev** - For implementation pairing -- **QA** - For test strategy -- **UX Designer** - For user experience -- **Analyst** - For requirements clarity - -### Quality Assurance Integration - -Quick Flow can integrate with TEA agent for automated testing: - -- Test case generation -- Automated test execution -- Coverage analysis -- Test healing - ---- - -## Common Quick Flow Scenarios - -### Scenario 1: Bug Fix - -``` -Requirement: "Users can't reset passwords" -Process: Direct development (no spec needed) -Steps: Investigate → Fix → Test → Deploy -Time: 2-4 hours -``` - -### Scenario 2: Small Feature - -``` -Requirement: "Add export to CSV functionality" -Process: Tech spec → Development → Code review -Steps: Spec → Implement → Test → Review → Deploy -Time: 1-2 days -``` - -### Scenario 3: Performance Fix - -``` -Requirement: "Optimize slow product search query" -Process: Tech spec → Development → Review -Steps: Analysis → Optimize → Benchmark → Deploy -Time: 1 day -``` - -### Scenario 4: API Addition - -``` -Requirement: "Add webhook endpoints for integrations" -Process: Tech spec → Development → Review -Steps: Design → Implement → Document → Deploy -Time: 2-3 days -``` - ---- - -## Metrics and KPIs - -Track these metrics to ensure Quick Flow effectiveness: - -**Velocity Metrics:** - -- Features completed per week -- Average cycle time (hours) -- Bug fix resolution time -- Code review turnaround - -**Quality Metrics:** - -- Defect escape rate -- Test coverage percentage -- Production incident rate -- Code review findings - -**Team Metrics:** - -- Developer satisfaction -- Knowledge sharing frequency -- Process adherence -- Autonomy index - ---- - -## Troubleshooting Quick Flow - -### Common Issues - -**Issue: Scope creep during development** -**Solution:** Refer back to tech spec, explicitly document new requirements - -**Issue: Unknown patterns or conventions** -**Solution:** Use party-mode to bring in architect or senior dev - -**Issue: Testing bottleneck** -**Solution:** Leverage TEA agent for automated test generation - -**Issue: Integration conflicts** -**Solution:** Document dependencies, coordinate with affected teams - -### Emergency Procedures - -**Production Hotfix:** - -1. Create branch from production -2. Quick dev with minimal changes -3. Deploy to staging -4. Quick regression test -5. Deploy to production -6. Merge to main - -**Critical Bug:** - -1. Immediate investigation -2. Party-mode if unclear -3. Quick fix with rollback plan -4. Post-mortem documentation - ---- - -## Related Documentation - -- **[Quick Flow Solo Dev Agent](./quick-flow-solo-dev.md)** - Primary agent for Quick Flow -- **[Agents Guide](./agents-guide.md)** - Complete agent reference -- **[Scale Adaptive System](./scale-adaptive-system.md)** - Track selection guidance -- **[Party Mode](./party-mode.md)** - Multi-agent collaboration -- **[Workflow Implementation](./workflows-implementation.md)** - Implementation details - ---- - -## FAQ - -**Q: How do I know if my feature is too big for Quick Flow?** -A: If it requires more than 3-5 days of work, affects multiple systems significantly, or needs extensive UX design, consider the BMad Method track. - -**Q: Can I switch from Quick Flow to BMad Method mid-development?** -A: Yes, you can upgrade. Create the missing artifacts (PRD, architecture) and transition to sprint-based development. - -**Q: Is Quick Flow suitable for production-critical features?** -A: Yes, with code review. Quick Flow doesn't sacrifice quality, just ceremony. - -**Q: How do I handle dependencies between Quick Flow features?** -A: Document dependencies clearly, consider batching related features, or upgrade to BMad Method for complex interdependencies. - -**Q: Can junior developers use Quick Flow?** -A: Yes, but they may benefit from the structure of BMad Method. Quick Flow assumes familiarity with patterns and autonomy. - ---- - -**Ready to ship fast?** → Start with `/bmad:bmm:agents:quick-flow-solo-dev` diff --git a/docs/modules/bmm-bmad-method/faq.md b/docs/modules/bmm-bmad-method/faq.md deleted file mode 100644 index 1849f6b9..00000000 --- a/docs/modules/bmm-bmad-method/faq.md +++ /dev/null @@ -1,540 +0,0 @@ -# BMM Frequently Asked Questions - -Quick answers to common questions about the BMad Method Module. - ---- - -## Table of Contents - -- [Getting Started](#getting-started) -- [Choosing the Right Level](#choosing-the-right-level) -- [Workflows and Phases](#workflows-and-phases) -- [Planning Documents](#planning-documents) -- [Implementation](#implementation) -- [Brownfield Development](#brownfield-development) -- [Tools and Technical](#tools-and-technical) - ---- - -## Getting Started - -### Q: Do I always need to run workflow-init? - -**A:** No, once you learn the flow you can go directly to workflows. However, workflow-init is helpful because it: - -- Determines your project's appropriate level automatically -- Creates the tracking status file -- Routes you to the correct starting workflow - -For experienced users: use the [Quick Reference](./quick-start.md#quick-reference-agent-document-mapping) to go directly to the right agent/workflow. - -### Q: Why do I need fresh chats for each workflow? - -**A:** Context-intensive workflows (like brainstorming, PRD creation, architecture design) can cause AI hallucinations if run in sequence within the same chat. Starting fresh ensures the agent has maximum context capacity for each workflow. This is particularly important for: - -- Planning workflows (PRD, architecture) -- Analysis workflows (brainstorming, research) -- Complex story implementation - -Quick workflows like status checks can reuse chats safely. - -### Q: Can I skip workflow-status and just start working? - -**A:** Yes, if you already know your project level and which workflow comes next. workflow-status is mainly useful for: - -- New projects (guides initial setup) -- When you're unsure what to do next -- After breaks in work (reminds you where you left off) -- Checking overall progress - -### Q: What's the minimum I need to get started? - -**A:** For the fastest path: - -1. Install BMad Method: `npx bmad-method@alpha install` -2. For small changes: Load PM agent → run tech-spec → implement -3. For larger projects: Load PM agent → run prd → architect → implement - -### Q: How do I know if I'm in Phase 1, 2, 3, or 4? - -**A:** Check your `bmm-workflow-status.md` file (created by workflow-init). It shows your current phase and progress. If you don't have this file, you can also tell by what you're working on: - -- **Phase 1** - Brainstorming, research, product brief (optional) -- **Phase 2** - Creating either a PRD or tech-spec (always required) -- **Phase 3** - Architecture design (Level 2-4 only) -- **Phase 4** - Actually writing code, implementing stories - ---- - -## Choosing the Right Level - -### Q: How do I know which level my project is? - -**A:** Use workflow-init for automatic detection, or self-assess using these keywords: - -- **Level 0:** "fix", "bug", "typo", "small change", "patch" → 1 story -- **Level 1:** "simple", "basic", "small feature", "add" → 2-10 stories -- **Level 2:** "dashboard", "several features", "admin panel" → 5-15 stories -- **Level 3:** "platform", "integration", "complex", "system" → 12-40 stories -- **Level 4:** "enterprise", "multi-tenant", "multiple products" → 40+ stories - -When in doubt, start smaller. You can always run create-prd later if needed. - -### Q: Can I change levels mid-project? - -**A:** Yes! If you started at Level 1 but realize it's Level 2, you can run create-prd to add proper planning docs. The system is flexible - your initial level choice isn't permanent. - -### Q: What if workflow-init suggests the wrong level? - -**A:** You can override it! workflow-init suggests a level but always asks for confirmation. If you disagree, just say so and choose the level you think is appropriate. Trust your judgment. - -### Q: Do I always need architecture for Level 2? - -**A:** No, architecture is **optional** for Level 2. Only create architecture if you need system-level design. Many Level 2 projects work fine with just PRD created during planning. - -### Q: What's the difference between Level 1 and Level 2? - -**A:** - -- **Level 1:** 1-10 stories, uses tech-spec (simpler, faster), no architecture -- **Level 2:** 5-15 stories, uses PRD (product-focused), optional architecture - -The overlap (5-10 stories) is intentional. Choose based on: - -- Need product-level planning? → Level 2 -- Just need technical plan? → Level 1 -- Multiple epics? → Level 2 -- Single epic? → Level 1 - ---- - -## Workflows and Phases - -### Q: What's the difference between workflow-status and workflow-init? - -**A:** - -- **workflow-status:** Checks existing status and tells you what's next (use when continuing work) -- **workflow-init:** Creates new status file and sets up project (use when starting new project) - -If status file exists, use workflow-status. If not, use workflow-init. - -### Q: Can I skip Phase 1 (Analysis)? - -**A:** Yes! Phase 1 is optional for all levels, though recommended for complex projects. Skip if: - -- Requirements are clear -- No research needed -- Time-sensitive work -- Small changes (Level 0-1) - -### Q: When is Phase 3 (Architecture) required? - -**A:** - -- **Level 0-1:** Never (skip entirely) -- **Level 2:** Optional (only if system design needed) -- **Level 3-4:** Required (comprehensive architecture mandatory) - -### Q: What happens if I skip a recommended workflow? - -**A:** Nothing breaks! Workflows are guidance, not enforcement. However, skipping recommended workflows (like architecture for Level 3) may cause: - -- Integration issues during implementation -- Rework due to poor planning -- Conflicting design decisions -- Longer development time overall - -### Q: How do I know when Phase 3 is complete and I can start Phase 4? - -**A:** For Level 3-4, run the implementation-readiness workflow. It validates PRD + Architecture + Epics + UX (optional) are aligned before implementation. Pass the gate check = ready for Phase 4. - -### Q: Can I run workflows in parallel or do they have to be sequential? - -**A:** Most workflows must be sequential within a phase: - -- Phase 1: brainstorm → research → product-brief (optional order) -- Phase 2: PRD must complete before moving forward -- Phase 3: architecture → epics+stories → implementation-readiness (sequential) -- Phase 4: Stories within an epic should generally be sequential, but stories in different epics can be parallel if you have capacity - ---- - -## Planning Documents - -### Q: Why no tech-spec at Level 2+? - -**A:** Level 2+ projects need product-level planning (PRD) and system-level design (Architecture), which tech-spec doesn't provide. Tech-spec is too narrow for coordinating multiple features. Instead, Level 2-4 uses: - -- PRD (product vision, functional requirements, non-functional requirements) -- Architecture (system design) -- Epics+Stories (created AFTER architecture is complete) - -### Q: Do I need a PRD for a bug fix? - -**A:** No! Bug fixes are typically Level 0 (single atomic change). Use Quick Spec Flow: - -- Load PM agent -- Run tech-spec workflow -- Implement immediately - -PRDs are for Level 2-4 projects with multiple features requiring product-level coordination. - -### Q: Can I skip the product brief? - -**A:** Yes, product brief is always optional. It's most valuable for: - -- Level 3-4 projects needing strategic direction -- Projects with stakeholders requiring alignment -- Novel products needing market research -- When you want to explore solution space before committing - ---- - -## Implementation - -### Q: Does create-story include implementation context? - -**A:** Yes! The create-story workflow generates story files that include implementation-specific guidance, references existing patterns from your documentation, and provides technical context. The workflow loads your architecture, PRD, and existing project documentation to create comprehensive stories. For Quick Flow projects using tech-spec, the tech-spec itself is already comprehensive, so stories can be simpler. - -### Q: How do I mark a story as done? - -**A:** After dev-story completes and code-review passes: - -1. Open `sprint-status.yaml` (created by sprint-planning) -2. Change the story status from `review` to `done` -3. Save the file - -### Q: Can I work on multiple stories at once? - -**A:** Yes, if you have capacity! Stories within different epics can be worked in parallel. However, stories within the same epic are usually sequential because they build on each other. - -### Q: What if my story takes longer than estimated? - -**A:** That's normal! Stories are estimates. If implementation reveals more complexity: - -1. Continue working until DoD is met -2. Consider if story should be split -3. Document learnings in retrospective -4. Adjust future estimates based on this learning - -### Q: When should I run retrospective? - -**A:** After completing all stories in an epic (when epic is done). Retrospectives capture: - -- What went well -- What could improve -- Technical insights -- Learnings for future epics - -Don't wait until project end - run after each epic for continuous improvement. - ---- - -## Brownfield Development - -### Q: What is brownfield vs greenfield? - -**A:** - -- **Greenfield:** New project, starting from scratch, clean slate -- **Brownfield:** Existing project, working with established codebase and patterns - -### Q: Do I have to run document-project for brownfield? - -**A:** Highly recommended, especially if: - -- No existing documentation -- Documentation is outdated -- AI agents need context about existing code -- Level 2-4 complexity - -You can skip it if you have comprehensive, up-to-date documentation including `docs/index.md`. - -### Q: What if I forget to run document-project on brownfield? - -**A:** Workflows will lack context about existing code. You may get: - -- Suggestions that don't match existing patterns -- Integration approaches that miss existing APIs -- Architecture that conflicts with current structure - -Run document-project and restart planning with proper context. - -### Q: Can I use Quick Spec Flow for brownfield projects? - -**A:** Yes! Quick Spec Flow works great for brownfield. It will: - -- Auto-detect your existing stack -- Analyze brownfield code patterns -- Detect conventions and ask for confirmation -- Generate context-rich tech-spec that respects existing code - -Perfect for bug fixes and small features in existing codebases. - -### Q: How does workflow-init handle brownfield with old planning docs? - -**A:** workflow-init asks about YOUR current work first, then uses old artifacts as context: - -1. Shows what it found (old PRD, epics, etc.) -2. Asks: "Is this work in progress, previous effort, or proposed work?" -3. If previous effort: Asks you to describe your NEW work -4. Determines level based on YOUR work, not old artifacts - -This prevents old Level 3 PRDs from forcing Level 3 workflow for new Level 0 bug fix. - -### Q: What if my existing code doesn't follow best practices? - -**A:** Quick Spec Flow detects your conventions and asks: "Should I follow these existing conventions?" You decide: - -- **Yes** → Maintain consistency with current codebase -- **No** → Establish new standards (document why in tech-spec) - -BMM respects your choice - it won't force modernization, but it will offer it. - ---- - -## Tools and Technical - -### Q: Why are my Mermaid diagrams not rendering? - -**A:** Common issues: - -1. Missing language tag: Use ` ```mermaid` not just ` ``` ` -2. Syntax errors in diagram (validate at mermaid.live) -3. Tool doesn't support Mermaid (check your Markdown renderer) - -All BMM docs use valid Mermaid syntax that should render in GitHub, VS Code, and most IDEs. - -### Q: Can I use BMM with GitHub Copilot / Cursor / other AI tools? - -**A:** Yes! BMM is complementary. BMM handles: - -- Project planning and structure -- Workflow orchestration -- Agent Personas and expertise -- Documentation generation -- Quality gates - -Your AI coding assistant handles: - -- Line-by-line code completion -- Quick refactoring -- Test generation - -Use them together for best results. - -### Q: What IDEs/tools support BMM? - -**A:** BMM requires tools with **agent mode** and access to **high-quality LLM models** that can load and follow complex workflows, then properly implement code changes. - -**Recommended Tools:** - -- **Claude Code** ⭐ **Best choice** - - Sonnet 4.5 (excellent workflow following, coding, reasoning) - - Opus (maximum context, complex planning) - - Native agent mode designed for BMM workflows - -- **Cursor** - - Supports Anthropic (Claude) and OpenAI models - - Agent mode with composer - - Good for developers who prefer Cursor's UX - -- **Windsurf** - - Multi-model support - - Agent capabilities - - Suitable for BMM workflows - -**What Matters:** - -1. **Agent mode** - Can load long workflow instructions and maintain context -2. **High-quality LLM** - Models ranked high on SWE-bench (coding benchmarks) -3. **Model selection** - Access to Claude Sonnet 4.5, Opus, or GPT-4o class models -4. **Context capacity** - Can handle large planning documents and codebases - -**Why model quality matters:** BMM workflows require LLMs that can follow multi-step processes, maintain context across phases, and implement code that adheres to specifications. Tools with weaker models will struggle with workflow adherence and code quality. - -### Q: Can I customize agents? - -**A:** Yes! Agents are installed as markdown files with XML-style content (optimized for LLMs, readable by any model). Create customization files in `_bmad/_config/agents/[agent-name].customize.yaml` to override default behaviors while keeping core functionality intact. See agent documentation for customization options. - -**Note:** While source agents in this repo are YAML, they install as `.md` files with XML-style tags - a format any LLM can read and follow. - -### Q: What happens to my planning docs after implementation? - -**A:** Keep them! They serve as: - -- Historical record of decisions -- Onboarding material for new team members -- Reference for future enhancements -- Audit trail for compliance - -For enterprise projects (Level 4), consider archiving completed planning artifacts to keep workspace clean. - -### Q: Can I use BMM for non-software projects? - -**A:** BMM is optimized for software development, but the methodology principles (scale-adaptive planning, just-in-time design, context injection) can apply to other complex project types. You'd need to adapt workflows and agents for your domain. - ---- - -## Advanced Questions - -### Q: What if my project grows from Level 1 to Level 3? - -**A:** Totally fine! When you realize scope has grown: - -1. Run create-prd to add product-level planning -2. Run create-architecture for system design -3. Use existing tech-spec as input for PRD -4. Continue with updated level - -The system is flexible - growth is expected. - -### Q: Can I mix greenfield and brownfield approaches? - -**A:** Yes! Common scenario: adding new greenfield feature to brownfield codebase. Approach: - -1. Run document-project for brownfield context -2. Use greenfield workflows for new feature planning -3. Explicitly document integration points between new and existing -4. Test integration thoroughly - -### Q: How do I handle urgent hotfixes during a sprint? - -**A:** Use correct-course workflow or just: - -1. Save your current work state -2. Load PM agent → quick tech-spec for hotfix -3. Implement hotfix (Level 0 flow) -4. Deploy hotfix -5. Return to original sprint work - -Level 0 Quick Spec Flow is perfect for urgent fixes. - -### Q: What if I disagree with the workflow's recommendations? - -**A:** Workflows are guidance, not enforcement. If a workflow recommends something that doesn't make sense for your context: - -- Explain your reasoning to the agent -- Ask for alternative approaches -- Skip the recommendation if you're confident -- Document why you deviated (for future reference) - -Trust your expertise - BMM supports your decisions. - -### Q: Can multiple developers work on the same BMM project? - -**A:** Yes! But the paradigm is fundamentally different from traditional agile teams. - -**Key Difference:** - -- **Traditional:** Multiple devs work on stories within one epic (months) -- **Agentic:** Each dev owns complete epics (days) - -**In traditional agile:** A team of 5 devs might spend 2-3 months on a single epic, with each dev owning different stories. - -**With BMM + AI agents:** A single dev can complete an entire epic in 1-3 days. What used to take months now takes days. - -**Team Work Distribution:** - -- **Recommended:** Split work by **epic** (not story) -- Each developer owns complete epics end-to-end -- Parallel work happens at epic level -- Minimal coordination needed - -**For full-stack apps:** - -- Frontend and backend can be separate epics (unusual in traditional agile) -- Frontend dev owns all frontend epics -- Backend dev owns all backend epics -- Works because delivery is so fast - -**Enterprise Considerations:** - -- Use **git submodules** for BMM installation (not .gitignore) -- Allows personal configurations without polluting main repo -- Teams may use different AI tools (Claude Code, Cursor, etc.) -- Developers may follow different methods or create custom agents/workflows - -**Quick Tips:** - -- Share `sprint-status.yaml` (single source of truth) -- Assign entire epics to developers (not individual stories) -- Coordinate at epic boundaries, not story level -- Use git submodules for BMM in enterprise settings - -**For comprehensive coverage of enterprise team collaboration, work distribution strategies, git submodule setup, and velocity expectations, see:** - -👉 **[Enterprise Agentic Development Guide](./enterprise-agentic-development.md)** - -### Q: What is party mode and when should I use it? - -**A:** Party mode is a unique multi-agent collaboration feature where ALL your installed agents (19+ from BMM, CIS, BMB, custom modules) discuss your challenges together in real-time. - -**How it works:** - -1. Run `/bmad:core:workflows:party-mode` (or `*party-mode` from any agent) -2. Introduce your topic -3. BMad Master selects 2-3 most relevant agents per message -4. Agents cross-talk, debate, and build on each other's ideas - -**Best for:** - -- Strategic decisions with trade-offs (architecture choices, tech stack, scope) -- Creative brainstorming (game design, product innovation, UX ideation) -- Cross-functional alignment (epic kickoffs, retrospectives, phase transitions) -- Complex problem-solving (multi-faceted challenges, risk assessment) - -**Example parties:** - -- **Product Strategy:** PM + Innovation Strategist (CIS) + Analyst -- **Technical Design:** Architect + Creative Problem Solver (CIS) + Game Architect -- **User Experience:** UX Designer + Design Thinking Coach (CIS) + Storyteller (CIS) - -**Why it's powerful:** - -- Diverse perspectives (technical, creative, strategic) -- Healthy debate reveals blind spots -- Emergent insights from agent interaction -- Natural collaboration across modules - -**For complete documentation:** - -👉 **[Party Mode Guide](./party-mode.md)** - How it works, when to use it, example compositions, best practices - ---- - -## Getting Help - -### Q: Where do I get help if my question isn't answered here? - -**A:** - -1. Search [Complete Documentation](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/README.md) for related topics -2. Ask in [Discord Community](https://discord.gg/gk8jAdXWmj) (#general-dev) -3. Open a [GitHub Issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) -4. Watch [YouTube Tutorials](https://www.youtube.com/@BMadCode) - -### Q: How do I report a bug or request a feature? - -**A:** Open a GitHub issue at: - -Please include: - -- BMM version (check your installed version) -- Steps to reproduce (for bugs) -- Expected vs actual behavior -- Relevant workflow or agent involved - ---- - -## Related Documentation - -- [Quick Start Guide](./quick-start.md) - Get started with BMM -- [Glossary](./glossary.md) - Terminology reference -- [Scale Adaptive System](./scale-adaptive-system.md) - Understanding levels -- [Brownfield Guide](./brownfield-guide.md) - Existing codebase workflows - ---- - -**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/modules/bmm-bmad-method/quick-spec-flow.md b/docs/modules/bmm-bmad-method/quick-spec-flow.md deleted file mode 100644 index fb1d3f73..00000000 --- a/docs/modules/bmm-bmad-method/quick-spec-flow.md +++ /dev/null @@ -1,622 +0,0 @@ -# BMad Quick Spec Flow - -**Perfect for:** Bug fixes, small features, rapid prototyping, and quick enhancements - -**Time to implementation:** Minutes, not hours - ---- - -## What is Quick Spec Flow? - -Quick Spec Flow is a **streamlined alternative** to the full BMad Method for Quick Flow track projects. Instead of going through Product Brief → PRD → Architecture, you go **straight to a context-aware technical specification** and start coding. - -### When to Use Quick Spec Flow - -✅ **Use Quick Flow track when:** - -- Single bug fix or small enhancement -- Small feature with clear scope (typically 1-15 stories) -- Rapid prototyping or experimentation -- Adding to existing brownfield codebase -- You know exactly what you want to build - -❌ **Use BMad Method or Enterprise tracks when:** - -- Building new products or major features -- Need stakeholder alignment -- Complex multi-team coordination -- Requires extensive planning and architecture - -💡 **Not sure?** Run `workflow-init` to get a recommendation based on your project's needs! - ---- - -## Quick Spec Flow Overview - -```mermaid -flowchart TD - START[Step 1: Run Tech-Spec Workflow] - DETECT[Detects project stack
package.json, requirements.txt, etc.] - ANALYZE[Analyzes brownfield codebase
if exists] - TEST[Detects test frameworks
and conventions] - CONFIRM[Confirms conventions
with you] - GENERATE[Generates context-rich
tech-spec] - STORIES[Creates ready-to-implement
stories] - - OPTIONAL[Step 2: Optional
Generate Story Context
SM Agent
For complex scenarios only] - - IMPL[Step 3: Implement
DEV Agent
Code, test, commit] - - DONE[DONE! 🚀] - - START --> DETECT - DETECT --> ANALYZE - ANALYZE --> TEST - TEST --> CONFIRM - CONFIRM --> GENERATE - GENERATE --> STORIES - STORIES --> OPTIONAL - OPTIONAL -.->|Optional| IMPL - STORIES --> IMPL - IMPL --> DONE - - style START fill:#bfb,stroke:#333,stroke-width:2px - style OPTIONAL fill:#ffb,stroke:#333,stroke-width:2px,stroke-dasharray: 5 5 - style IMPL fill:#bbf,stroke:#333,stroke-width:2px - style DONE fill:#f9f,stroke:#333,stroke-width:3px -``` - ---- - -## Single Atomic Change - -**Best for:** Bug fixes, single file changes, isolated improvements - -### What You Get - -1. **tech-spec.md** - Comprehensive technical specification with: - - Problem statement and solution - - Detected framework versions and dependencies - - Brownfield code patterns (if applicable) - - Existing test patterns to follow - - Specific file paths to modify - - Complete implementation guidance - -2. **story-[slug].md** - Single user story ready for development - -### Quick Spec Flow Commands - -```bash -# Start Quick Spec Flow (no workflow-init needed!) -# Load PM agent and run tech-spec - -# When complete, implement directly: -# Load DEV agent and run dev-story -``` - -### What Makes It Quick - -- ✅ No Product Brief needed -- ✅ No PRD needed -- ✅ No Architecture doc needed -- ✅ Auto-detects your stack -- ✅ Auto-analyzes brownfield code -- ✅ Auto-validates quality -- ✅ Story context optional (tech-spec is comprehensive!) - -### Example Single Change Scenarios - -- "Fix the login validation bug" -- "Add email field to user registration form" -- "Update API endpoint to return additional field" -- "Improve error handling in payment processing" - ---- - -## Coherent Small Feature - -**Best for:** Small features with 2-3 related user stories - -### What You Get - -1. **tech-spec.md** - Same comprehensive spec as single change projects -2. **epics.md** - Epic organization with story breakdown -3. **story-[epic-slug]-1.md** - First story -4. **story-[epic-slug]-2.md** - Second story -5. **story-[epic-slug]-3.md** - Third story (if needed) - -### Quick Spec Flow Commands - -```bash -# Start Quick Spec Flow -# Load PM agent and run tech-spec - -# Optional: Organize stories as a sprint -# Load SM agent and run sprint-planning - -# Implement story-by-story: -# Load DEV agent and run dev-story for each story -``` - -### Story Sequencing - -Stories are **automatically validated** to ensure proper sequence: - -- ✅ No forward dependencies (Story 2 can't depend on Story 3) -- ✅ Clear dependency documentation -- ✅ Infrastructure → Features → Polish order -- ✅ Backend → Frontend flow - -### Example Small Feature Scenarios - -- "Add OAuth social login (Google, GitHub, Twitter)" -- "Build user profile page with avatar upload" -- "Implement basic search with filters" -- "Add dark mode toggle to application" - ---- - -## Smart Context Discovery - -Quick Spec Flow automatically discovers and uses: - -### 1. Existing Documentation - -- Product briefs (if they exist) -- Research documents -- `document-project` output (brownfield codebase map) - -### 2. Project Stack - -- **Node.js:** package.json → frameworks, dependencies, scripts, test framework -- **Python:** requirements.txt, pyproject.toml → packages, tools -- **Ruby:** Gemfile → gems and versions -- **Java:** pom.xml, build.gradle → Maven/Gradle dependencies -- **Go:** go.mod → modules -- **Rust:** Cargo.toml → crates -- **PHP:** composer.json → packages - -### 3. Brownfield Code Patterns - -- Directory structure and organization -- Existing code patterns (class-based, functional, MVC) -- Naming conventions (camelCase, snake_case, PascalCase) -- Test frameworks and patterns -- Code style (semicolons, quotes, indentation) -- Linter/formatter configs -- Error handling patterns -- Logging conventions -- Documentation style - -### 4. Convention Confirmation - -**IMPORTANT:** Quick Spec Flow detects your conventions and **asks for confirmation**: - -``` -I've detected these conventions in your codebase: - -Code Style: -- ESLint with Airbnb config -- Prettier with single quotes, 2-space indent -- No semicolons - -Test Patterns: -- Jest test framework -- .test.js file naming -- expect() assertion style - -Should I follow these existing conventions? (yes/no) -``` - -**You decide:** Conform to existing patterns or establish new standards! - ---- - -## Modern Best Practices via WebSearch - -Quick Spec Flow stays current by using WebSearch when appropriate: - -### For Greenfield Projects - -- Searches for latest framework versions -- Recommends official starter templates -- Suggests modern best practices - -### For Outdated Dependencies - -- Detects if your dependencies are >2 years old -- Searches for migration guides -- Notes upgrade complexity - -### Starter Template Recommendations - -For greenfield projects, Quick Spec Flow recommends: - -**React:** - -- Vite (modern, fast) -- Next.js (full-stack) - -**Python:** - -- cookiecutter templates -- FastAPI starter - -**Node.js:** - -- NestJS CLI -- express-generator - -**Benefits:** - -- ✅ Modern best practices baked in -- ✅ Proper project structure -- ✅ Build tooling configured -- ✅ Testing framework set up -- ✅ Faster time to first feature - ---- - -## UX/UI Considerations - -For user-facing changes, Quick Spec Flow captures: - -- UI components affected (create vs modify) -- UX flow changes (current vs new) -- Responsive design needs (mobile, tablet, desktop) -- Accessibility requirements: - - Keyboard navigation - - Screen reader compatibility - - ARIA labels - - Color contrast standards -- User feedback patterns: - - Loading states - - Error messages - - Success confirmations - - Progress indicators - ---- - -## Auto-Validation and Quality Assurance - -Quick Spec Flow **automatically validates** everything: - -### Tech-Spec Validation (Always Runs) - -Checks: - -- ✅ Context gathering completeness -- ✅ Definitiveness (no "use X or Y" statements) -- ✅ Brownfield integration quality -- ✅ Stack alignment -- ✅ Implementation readiness - -Generates scores: - -``` -✅ Validation Passed! -- Context Gathering: Comprehensive -- Definitiveness: All definitive -- Brownfield Integration: Excellent -- Stack Alignment: Perfect -- Implementation Readiness: ✅ Ready -``` - -### Story Validation (Multi-Story Features) - -Checks: - -- ✅ Story sequence (no forward dependencies!) -- ✅ Acceptance criteria quality (specific, testable) -- ✅ Completeness (all tech spec tasks covered) -- ✅ Clear dependency documentation - -**Auto-fixes issues if found!** - ---- - -## Complete User Journey - -### Scenario 1: Bug Fix (Single Change) - -**Goal:** Fix login validation bug - -**Steps:** - -1. **Start:** Load PM agent, say "I want to fix the login validation bug" -2. **PM runs tech-spec workflow:** - - Asks: "What problem are you solving?" - - You explain the validation issue - - Detects your Node.js stack (Express 4.18.2, Jest for testing) - - Analyzes existing UserService code patterns - - Asks: "Should I follow your existing conventions?" → You say yes - - Generates tech-spec.md with specific file paths and patterns - - Creates story-login-fix.md -3. **Implement:** Load DEV agent, run `dev-story` - - DEV reads tech-spec (has all context!) - - Implements fix following existing patterns - - Runs tests (following existing Jest patterns) - - Done! - -**Total time:** 15-30 minutes (mostly implementation) - ---- - -### Scenario 2: Small Feature (Multi-Story) - -**Goal:** Add OAuth social login (Google, GitHub) - -**Steps:** - -1. **Start:** Load PM agent, say "I want to add OAuth social login" -2. **PM runs tech-spec workflow:** - - Asks about the feature scope - - You specify: Google and GitHub OAuth - - Detects your stack (Next.js 13.4, NextAuth.js already installed!) - - Analyzes existing auth patterns - - Confirms conventions with you - - Generates: - - tech-spec.md (comprehensive implementation guide) - - epics.md (OAuth Integration epic) - - story-oauth-1.md (Backend OAuth setup) - - story-oauth-2.md (Frontend login buttons) -3. **Optional Sprint Planning:** Load SM agent, run `sprint-planning` -4. **Implement Story 1:** - - Load DEV agent, run `dev-story` for story 1 - - DEV implements backend OAuth -5. **Implement Story 2:** - - DEV agent, run `dev-story` for story 2 - - DEV implements frontend - - Done! - -**Total time:** 1-3 hours (mostly implementation) - -## Integration with Phase 4 Workflows - -Quick Spec Flow works seamlessly with all Phase 4 implementation workflows: - -### create-story (SM Agent) - -- ✅ Can work with tech-spec.md instead of PRD -- ✅ Uses epics.md from tech-spec workflow -- ✅ Creates additional stories if needed - -### sprint-planning (SM Agent) - -- ✅ Works with epics.md from tech-spec -- ✅ Organizes multi-story features for coordinated implementation -- ✅ Tracks progress through sprint-status.yaml - -### dev-story (DEV Agent) - -- ✅ Reads stories generated by tech-spec -- ✅ Uses tech-spec.md as comprehensive context -- ✅ Implements following detected conventions - -## Comparison: Quick Spec vs Full BMM - -| Aspect | Quick Flow Track | BMad Method/Enterprise Tracks | -| --------------------- | ---------------------------- | ---------------------------------- | -| **Setup** | None (standalone) | workflow-init recommended | -| **Planning Docs** | tech-spec.md only | Product Brief → PRD → Architecture | -| **Time to Code** | Minutes | Hours to days | -| **Best For** | Bug fixes, small features | New products, major features | -| **Context Discovery** | Automatic | Manual + guided | -| **Story Context** | Optional (tech-spec is rich) | Required (generated from PRD) | -| **Validation** | Auto-validates everything | Manual validation steps | -| **Brownfield** | Auto-analyzes and conforms | Manual documentation required | -| **Conventions** | Auto-detects and confirms | Document in PRD/Architecture | - - -## When to Graduate from Quick Flow to BMad Method - -Start with Quick Flow, but switch to BMad Method when: - -- ❌ Project grows beyond initial scope -- ❌ Multiple teams need coordination -- ❌ Stakeholders need formal documentation -- ❌ Product vision is unclear -- ❌ Architectural decisions need deep analysis -- ❌ Compliance/regulatory requirements exist - -💡 **Tip:** You can always run `workflow-init` later to transition from Quick Flow to BMad Method! - -## Quick Spec Flow - Key Benefits - -### 🚀 **Speed** - -- No Product Brief -- No PRD -- No Architecture doc -- Straight to implementation - -### 🧠 **Intelligence** - -- Auto-detects stack -- Auto-analyzes brownfield -- Auto-validates quality -- WebSearch for current info - -### 📐 **Respect for Existing Code** - -- Detects conventions -- Asks for confirmation -- Follows patterns -- Adapts vs. changes - -### ✅ **Quality** - -- Auto-validation -- Definitive decisions (no "or" statements) -- Comprehensive context -- Clear acceptance criteria - -### 🎯 **Focus** - -- Single atomic changes -- Coherent small features -- No scope creep -- Fast iteration - -## Getting Started - -### Prerequisites - -- BMad Method installed (`npx bmad-method install`) -- Project directory with code (or empty for greenfield) - -### Quick Start Commands - -```bash -# For a quick bug fix or small change: -# 1. Load Quick Dev Solo agent -# 2. Say: "I want to [describe your change]" -# 3. Agent will ask if you want to run tech-spec -# 4. Answer questions about your change -# 5. Get tech-spec + story -# 6. Reload a fresh context with the solo agent and implement! - -# For a small feature with multiple stories: -# Same as above, but get epic + 2-3 stories -# Optionally use SM sprint-planning to organize -``` - -### No workflow-init Required! - -Quick Spec Flow is **fully standalone** - -## FAQ - -### Q: Can I use Quick Spec Flow on an existing project? - -**A:** Yes! It's perfect for brownfield projects. It will analyze your existing code, detect patterns, and ask if you want to follow them. - -### Q: What if I don't have a package.json or requirements.txt? - -**A:** Quick Spec Flow will work in greenfield mode, recommend starter templates, and use WebSearch for modern best practices. - -### Q: Do I need to run workflow-init first? - -**A:** No! Quick Spec Flow is standalone. But if you want guidance on which flow to use, workflow-init can help. - -### Q: Can I use this for frontend changes? - -**A:** Absolutely! Quick Spec Flow captures UX/UI considerations, component changes, and accessibility requirements. - -### Q: What if my Quick Flow project grows? - -**A:** No problem! You can always transition to BMad Method by running workflow-init and create-prd. Your tech-spec becomes input for the PRD. - -### Q: Can I skip validation? - -**A:** No, validation always runs automatically. But it's fast and catches issues early! - -### Q: Will it work with my team's code style? - -**A:** Yes! It detects your conventions and asks for confirmation. You control whether to follow existing patterns or establish new ones. - ---- - -## Tips and Best Practices - -### 1. **Be Specific in Discovery** - -When describing your change, provide specifics: - -- ✅ "Fix email validation in UserService to allow plus-addressing" -- ❌ "Fix validation bug" - -### 2. **Trust the Convention Detection** - -If it detects your patterns correctly, say yes! It's faster than establishing new conventions. - -### 3. **Use WebSearch Recommendations for Greenfield** - -Starter templates save hours of setup time. Let Quick Spec Flow find the best ones. - -### 4. **Review the Auto-Validation** - -When validation runs, read the scores. They tell you if your spec is production-ready. - -### 5. **Keep Single Changes Truly Atomic** - -If your "single change" needs 3+ files, it might be a multi-story feature. Let the workflow guide you. - -### 6. **Validate Story Sequence for Multi-Story Features** - -When you get multiple stories, check the dependency validation output. Proper sequence matters! - ---- - -## Real-World Examples - -### Example 1: Adding Logging (Single Change) - -**Input:** "Add structured logging to payment processing" - -**Tech-Spec Output:** - -- Detected: winston 3.8.2 already in package.json -- Analyzed: Existing services use winston with JSON format -- Confirmed: Follow existing logging patterns -- Generated: Specific file paths, log levels, format example -- Story: Ready to implement in 1-2 hours - -**Result:** Consistent logging added, following team patterns, no research needed. - ---- - -### Example 2: Search Feature (Multi-Story) - -**Input:** "Add search to product catalog with filters" - -**Tech-Spec Output:** - -- Detected: React 18.2.0, MUI component library, Express backend -- Analyzed: Existing ProductList component patterns -- Confirmed: Follow existing API and component structure -- Generated: - - Epic: Product Search Functionality - - Story 1: Backend search API with filters - - Story 2: Frontend search UI component -- Auto-validated: Story 1 → Story 2 sequence correct - -**Result:** Search feature implemented in 4-6 hours with proper architecture. - ---- - -## Summary - -Quick Spec Flow is your **fast path from idea to implementation** for: - -- 🐛 Bug fixes -- ✨ Small features -- 🚀 Rapid prototyping -- 🔧 Quick enhancements - -**Key Features:** - -- Auto-detects your stack -- Auto-analyzes brownfield code -- Auto-validates quality -- Respects existing conventions -- Uses WebSearch for modern practices -- Generates comprehensive tech-specs -- Creates implementation-ready stories - -**Time to code:** Minutes, not hours. - -**Ready to try it?** Load the PM agent and say what you want to build! 🚀 - ---- - -## Next Steps - -- **Try it now:** Load PM agent and describe a small change -- **Learn more:** See the [BMM Workflow Guides](./index.md#-workflow-guides) for comprehensive workflow documentation -- **Need help deciding?** Run `workflow-init` to get a recommendation -- **Have questions?** Join us on Discord: - ---- - -_Quick Spec Flow - Because not every change needs a Product Brief._ diff --git a/docs/modules/bmm-bmad-method/quick-start.md b/docs/modules/bmm-bmad-method/quick-start.md deleted file mode 100644 index 9358ba15..00000000 --- a/docs/modules/bmm-bmad-method/quick-start.md +++ /dev/null @@ -1,381 +0,0 @@ -# BMad Method V6 Quick Start Guide - -Get started with BMad Method v6 for your new greenfield project. This guide walks you through building software from scratch using AI-powered workflows. - -## TL;DR - The Quick Path - -1. **Install**: `npx bmad-method@alpha install` -2. **Initialize**: Load Analyst agent → Run "workflow-init" -3. **Plan**: Load PM agent to create a PRD -4. **Plan UX**: Load UX Expert to create a UX-Design if your application will have a UX/UI element -5. **Architect**: Load Architect agent → Run "create-architecture" -6. **Epic Plan**: The PM steps back in to help run the create-epics-and-stories -7. **Build**: Load SM agent → Run workflows for each story → Load DEV agent → Implement -8. **Always use fresh chats** for each workflow to avoid context issues - -## What is BMad Method? - -BMad Method (BMM) helps you build software through guided workflows with specialized AI agents. The process follows four phases: - -1. **Phase 1: Analysis** (Optional) - Brainstorming, Research, Product Brief -2. **Phase 2: Planning** (Required) - Create your requirements (tech-spec or PRD) -3. **Phase 3: Solutioning** (Track-dependent) - Design the architecture for BMad Method and Enterprise tracks -4. **Phase 4: Implementation** (Required) - Build your software Epic by Epic, Story by Story - -### Complete Workflow Visualization - -![BMad Method Workflow - Standard Greenfield](./images/workflow-method-greenfield.svg) - -_Complete visual flowchart showing all phases, workflows, agents (color-coded), and decision points for the BMad Method standard greenfield track. Each box is color-coded by the agent responsible for that workflow._ - -## Installation - -```bash -# Install v6 Alpha to your project -npx bmad-method@alpha install -``` - -The interactive installer will guide you through setup and create a `_bmad/` folder with all agents and workflows. - ---- - -## Getting Started - -### Step 1: Initialize Your Workflow - -1. **Load the Analyst agent** in your IDE - Generally this is done by typing `/` - if you are unsure, you can just start with /bmad and see all that is available, sorted by agents and workflows. -2. **Wait for the agent's menu** to appear -3. **Tell the agent**: "Run workflow-init" or type "\*workflow-init" or select the menu item number - -#### What happens during workflow-init? - -Workflows are interactive processes in V6 that replaced tasks and templates from prior versions. There are many types of workflows, and you can even create your own with the BMad Builder module. For the BMad Method, you'll be interacting with expert-designed workflows crafted to work with you to get the best out of both you and the LLM. - -During workflow-init, you'll describe: - -- Your project and its goals -- Whether there's an existing codebase or this is a new project -- The general size and complexity (you can adjust this later) - -#### Planning Tracks - -Based on your description, the workflow will suggest a track and let you choose from: - -**Three Planning Tracks:** - -- **Quick Flow** - Fast implementation (tech-spec only) - bug fixes, simple features, clear scope (typically 1-15 stories) -- **BMad Method** - Full planning (PRD + Architecture + UX) - products, platforms, complex features (typically 10-50+ stories) -- **Enterprise Method** - Extended planning (BMad Method + Security/DevOps/Test) - enterprise requirements, compliance, multi-tenant (typically 30+ stories) - -**Note**: Story counts are guidance, not definitions. Tracks are chosen based on planning needs, not story math. - -#### What gets created? - -Once you confirm your track, the `bmm-workflow-status.yaml` file will be created in your project's docs folder (assuming default install location). This file tracks your progress through all phases. - -**Important notes:** - -- Every track has different paths through the phases -- Story counts can still change based on overall complexity as you work -- For this guide, we'll assume a BMad Method track project -- This workflow will guide you through Phase 1 (optional), Phase 2 (required), and Phase 3 (required for BMad Method and Enterprise tracks) - -### Step 2: Work Through Phases 1-3 - -After workflow-init completes, you'll work through the planning phases. **Important: Use fresh chats for each workflow to avoid context limitations.** - -#### Checking Your Status - -If you're unsure what to do next: - -1. Load any agent in a new chat -2. Ask for "workflow-status" -3. The agent will tell you the next recommended or required workflow - -**Example response:** - -``` -Phase 1 (Analysis) is entirely optional. All workflows are optional or recommended: - - brainstorm-project - optional - - research - optional - - product-brief - RECOMMENDED (but not required) - -The next TRULY REQUIRED step is: - - PRD (Product Requirements Document) in Phase 2 - Planning - - Agent: pm - - Command: prd -``` - -#### How to Run Workflows in Phases 1-3 - -When an agent tells you to run a workflow (like `prd`): - -1. **Start a new chat** with the specified agent -2. **Wait for the menu** to appear -3. **Tell the agent** to run it using any of these formats: - - Type the shorthand: `*prd` - - Say it naturally: "Let's create a new PRD" - - Select the menu number for "create-prd" - -The agents in V6 are very good with fuzzy menu matching! - -#### Quick Reference: Agent → Document Mapping - -For v4 users or those who prefer to skip workflow-status guidance: - -- **Analyst** → Brainstorming, Product Brief -- **PM** → PRD (BMad Method/Enterprise tracks) OR tech-spec (Quick Flow track) -- **UX-Designer** → UX Design Document (if UI part of the project) -- **Architect** → Architecture (BMad Method/Enterprise tracks) - -#### Phase 2: Planning - Creating the PRD - -**For BMad Method and Enterprise tracks:** - -1. Load the **PM agent** in a new chat -2. Tell it to run the PRD workflow -3. Once complete, you'll have: - - **PRD.md** - Your Product Requirements Document - -**For Quick Flow track:** - -- Use **tech-spec** instead of PRD (no architecture needed) - -#### Phase 2 (Optional): UX Design - -If your project has a user interface: - -1. Load the **UX-Designer agent** in a new chat -2. Tell it to run the UX design workflow -3. After completion, you'll have your UX specification document - -#### Phase 3: Architecture - -**For BMad Method and Enterprise tracks:** - -1. Load the **Architect agent** in a new chat -2. Tell it to run the create-architecture workflow -3. After completion, you'll have your architecture document with technical decisions - -#### Phase 3: Create Epics and Stories (REQUIRED after Architecture) - -**V6 Improvement:** Epics and stories are now created AFTER architecture for better quality! - -1. Load the **PM agent** in a new chat -2. Tell it to run "create-epics-and-stories" -3. This breaks down your PRD's FRs/NFRs into implementable epics and stories -4. The workflow uses both PRD and Architecture to create technically-informed stories - -**Why after architecture?** Architecture decisions (database, API patterns, tech stack) directly affect how stories should be broken down and sequenced. - -#### Phase 3: Implementation Readiness Check (Highly Recommended) - -Once epics and stories are created: - -1. Load the **Architect agent** in a new chat -2. Tell it to run "implementation-readiness" -3. This validates cohesion across all your planning documents (PRD, UX, Architecture, Epics) -4. This was called the "PO Master Checklist" in v4 - -**Why run this?** It ensures all your planning assets align properly before you start building. - -#### Optional: TEA Engagement - -Testing is not mandated by BMad. Decide how you want to engage TEA: - -- **No TEA** - Use your existing team testing approach -- **TEA-only (Standalone)** - Use TEA workflows with your own requirements and environment -- **TEA-integrated** - Use TEA as part of the BMad Method or Enterprise flow - -See the [Test Architect Guide](./test-architecture.md) for the five TEA engagement models and recommended sequences. - -#### Context Management Tips - -- **Use 200k+ context models** for best results (Claude Sonnet 4.5, GPT-4, etc.) -- **Fresh chat for each workflow** - Brainstorming, Briefs, Research, and PRD generation are all context-intensive -- **No document sharding needed** - Unlike v4, you don't need to split documents -- **Web Bundles coming soon** - Will help save LLM tokens for users with limited plans - -### Step 3: Start Building (Phase 4 - Implementation) - -Once planning and architecture are complete, you'll move to Phase 4. **Important: Each workflow below should be run in a fresh chat to avoid context limitations and hallucinations.** - -#### 3.1 Initialize Sprint Planning - -1. **Start a new chat** with the **SM (Scrum Master) agent** -2. Wait for the menu to appear -3. Tell the agent: "Run sprint-planning" -4. This creates your `sprint-status.yaml` file that tracks all epics and stories - -#### 3.2 Create Your First Story - -1. **Start a new chat** with the **SM agent** -2. Wait for the menu -3. Tell the agent: "Run create-story" -4. This creates the story file from the epic - -#### 3.3 Implement the Story - -1. **Start a new chat** with the **DEV agent** -2. Wait for the menu -3. Tell the agent: "Run dev-story" -4. The DEV agent will implement the story and update the sprint status - -#### 3.4 Generate Guardrail Tests (Optional) - -1. **Start a new chat** with the **TEA agent** -2. Wait for the menu -3. Tell the agent: "Run automate" -4. The TEA agent generates or expands tests to act as guardrails - -#### 3.5 Review the Code (Optional but Recommended) - -1. **Start a new chat** with the **DEV agent** -2. Wait for the menu -3. Tell the agent: "Run code-review" -4. The DEV agent performs quality validation (this was called QA in v4) - -### Step 4: Keep Going - -For each subsequent story, repeat the cycle using **fresh chats** for each workflow: - -1. **New chat** → SM agent → "Run create-story" -2. **New chat** → DEV agent → "Run dev-story" -3. **New chat** → TEA agent → "Run automate" (optional) -4. **New chat** → DEV agent → "Run code-review" (optional but recommended) - -After completing all stories in an epic: - -1. **Start a new chat** with the **SM agent** -2. Tell the agent: "Run retrospective" - -**Why fresh chats?** Context-intensive workflows can cause hallucinations if you keep issuing commands in the same chat. Starting fresh ensures the agent has maximum context capacity for each workflow. - ---- - -## Understanding the Agents - -Each agent is a specialized AI persona: - -- **Analyst** - Initializes workflows and tracks progress -- **PM** - Creates requirements and specifications -- **UX-Designer** - If your project has a front end - this designer will help produce artifacts, come up with mock updates, and design a great look and feel with you giving it guidance. -- **Architect** - Designs system architecture -- **SM (Scrum Master)** - Manages sprints and creates stories -- **DEV** - Implements code and reviews work - -## How Workflows Work - -1. **Load an agent** - Open the agent file in your IDE to activate it -2. **Wait for the menu** - The agent will present its available workflows -3. **Tell the agent what to run** - Say "Run [workflow-name]" -4. **Follow the prompts** - The agent guides you through each step - -The agent creates documents, asks questions, and helps you make decisions throughout the process. - -## Project Tracking Files - -BMad creates two files to track your progress: - -**1. bmm-workflow-status.yaml** - -- Shows which phase you're in and what's next -- Created by workflow-init -- Updated automatically as you progress through phases - -**2. sprint-status.yaml** (Phase 4 only) - -- Tracks all your epics and stories during implementation -- Critical for SM and DEV agents to know what to work on next -- Created by sprint-planning workflow -- Updated automatically as stories progress - -**You don't need to edit these manually** - agents update them as you work. - ---- - -## The Complete Flow Visualized - -```mermaid -flowchart LR - subgraph P1["Phase 1 (Optional)
Analysis"] - direction TB - A1[Brainstorm] - A2[Research] - A3[Brief] - A4[Analyst] - A1 ~~~ A2 ~~~ A3 ~~~ A4 - end - - subgraph P2["Phase 2 (Required)
Planning"] - direction TB - B1[Quick Flow:
tech-spec] - B2[Method/Enterprise:
PRD] - B3[UX opt] - B4[PM, UX] - B1 ~~~ B2 ~~~ B3 ~~~ B4 - end - - subgraph P3["Phase 3 (Track-dependent)
Solutioning"] - direction TB - C1[Method/Enterprise:
architecture] - C2[gate-check] - C3[Architect] - C1 ~~~ C2 ~~~ C3 - end - - subgraph P4["Phase 4 (Required)
Implementation"] - direction TB - D1[Per Epic:
epic context] - D2[Per Story:
create-story] - D3[dev-story] - D4[code-review] - D5[SM, DEV] - D1 ~~~ D2 ~~~ D3 ~~~ D4 ~~~ D5 - end - - P1 --> P2 - P2 --> P3 - P3 --> P4 - - style P1 fill:#bbf,stroke:#333,stroke-width:2px,color:#000 - style P2 fill:#bfb,stroke:#333,stroke-width:2px,color:#000 - style P3 fill:#ffb,stroke:#333,stroke-width:2px,color:#000 - style P4 fill:#fbf,stroke:#333,stroke-width:2px,color:#000 -``` - -## Common Questions - -**Q: Do I always need architecture?** -A: Only for BMad Method and Enterprise tracks. Quick Flow projects skip straight from tech-spec to implementation. - -**Q: Can I change my plan later?** -A: Yes! The SM agent has a "correct-course" workflow for handling scope changes. - -**Q: What if I want to brainstorm first?** -A: Load the Analyst agent and tell it to "Run brainstorm-project" before running workflow-init. - -**Q: Why do I need fresh chats for each workflow?** -A: Context-intensive workflows can cause hallucinations if run in sequence. Fresh chats ensure maximum context capacity. - -**Q: Can I skip workflow-init and workflow-status?** -A: Yes, once you learn the flow. Use the Quick Reference in Step 2 to go directly to the workflows you need. - -## Getting Help - -- **During workflows**: Agents guide you with questions and explanations -- **Community**: [Discord](https://discord.gg/gk8jAdXWmj) - #general-dev, #bugs-issues -- **Complete guide**: [BMM Workflow Documentation](./index.md#-workflow-guides) -- **YouTube tutorials**: [BMad Code Channel](https://www.youtube.com/@BMadCode) - ---- - -## Key Takeaways - -✅ **Always use fresh chats** - Load agents in new chats for each workflow to avoid context issues -✅ **Let workflow-status guide you** - Load any agent and ask for status when unsure what's next -✅ **Track matters** - Quick Flow uses tech-spec, BMad Method/Enterprise need PRD and architecture -✅ **Tracking is automatic** - The status files update themselves, no manual editing needed -✅ **Agents are flexible** - Use menu numbers, shortcuts (\*prd), or natural language - -**Ready to start building?** Install BMad, load the Analyst, run workflow-init, and let the agents guide you! diff --git a/docs/modules/bmm-bmad-method/test-architecture.md b/docs/modules/bmm-bmad-method/test-architecture.md deleted file mode 100644 index 9d417a7a..00000000 --- a/docs/modules/bmm-bmad-method/test-architecture.md +++ /dev/null @@ -1,486 +0,0 @@ -# Test Architect (TEA) Agent Guide - -## Overview - -- **Persona:** Murat, Master Test Architect and Quality Advisor focused on risk-based testing, fixture architecture, ATDD, and CI/CD governance. -- **Mission:** Deliver actionable quality strategies, automation coverage, and gate decisions that scale with project complexity and compliance demands. -- **Use When:** BMad Method or Enterprise track projects, integration risk is non-trivial, brownfield regression risk exists, or compliance/NFR evidence is required. (Quick Flow projects typically don't require TEA) - -## Choose Your TEA Engagement Model - -BMad does not mandate TEA. There are five valid ways to use it (or skip it). Pick one intentionally. - -1. **No TEA** - - Skip all TEA workflows. Use your existing team testing approach. - -2. **TEA-only (Standalone)** - - Use TEA on a non-BMad project. Bring your own requirements, acceptance criteria, and environments. - - Typical sequence: `*test-design` (system or epic) -> `*atdd` and/or `*automate` -> optional `*test-review` -> `*trace` for coverage and gate decisions. - - Run `*framework` or `*ci` only if you want TEA to scaffold the harness or pipeline. - -3. **Integrated: Greenfield - BMad Method (Simple/Standard Work)** - - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. - - Phase 4: per-epic `*test-design`, optional `*atdd`, then `*automate` and optional `*test-review`. - - Gate (Phase 2): `*trace`. - -4. **Integrated: Brownfield - BMad Method or Enterprise (Simple or Complex)** - - Phase 2: baseline `*trace`. - - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. - - Phase 4: per-epic `*test-design` focused on regression and integration risks. - - Gate (Phase 2): `*trace`; `*nfr-assess` (if not done earlier). - - For brownfield BMad Method, follow the same flow with `*nfr-assess` optional. - -5. **Integrated: Greenfield - Enterprise Method (Enterprise/Compliance Work)** - - Phase 2: `*nfr-assess`. - - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. - - Phase 4: per-epic `*test-design`, plus `*atdd`/`*automate`/`*test-review`. - - Gate (Phase 2): `*trace`; archive artifacts as needed. - -If you are unsure, default to the integrated path for your track and adjust later. - -## TEA Workflow Lifecycle - -TEA integrates into the BMad development lifecycle during Solutioning (Phase 3) and Implementation (Phase 4): - -```mermaid -%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','fontSize':'16px','fontFamily':'arial'}}}%% -graph TB - subgraph Phase2["Phase 2: PLANNING"] - PM["PM: *prd (creates PRD with FRs/NFRs)"] - PlanNote["Business requirements phase"] - NFR2["TEA: *nfr-assess (optional, enterprise)"] - PM -.-> NFR2 - NFR2 -.-> PlanNote - PM -.-> PlanNote - end - - subgraph Phase3["Phase 3: SOLUTIONING"] - Architecture["Architect: *architecture"] - EpicsStories["PM/Architect: *create-epics-and-stories"] - TestDesignSys["TEA: *test-design (system-level)"] - Framework["TEA: *framework (optional if needed)"] - CI["TEA: *ci (optional if needed)"] - GateCheck["Architect: *implementation-readiness"] - Architecture --> EpicsStories - Architecture --> TestDesignSys - TestDesignSys --> Framework - EpicsStories --> Framework - Framework --> CI - CI --> GateCheck - Phase3Note["Epics created AFTER architecture,
then system-level test design and test infrastructure setup"] - EpicsStories -.-> Phase3Note - end - - subgraph Phase4["Phase 4: IMPLEMENTATION - Per Epic Cycle"] - SprintPlan["SM: *sprint-planning"] - TestDesign["TEA: *test-design (per epic)"] - CreateStory["SM: *create-story"] - ATDD["TEA: *atdd (optional, before dev)"] - DevImpl["DEV: implements story"] - Automate["TEA: *automate"] - TestReview1["TEA: *test-review (optional)"] - Trace1["TEA: *trace (refresh coverage)"] - - SprintPlan --> TestDesign - TestDesign --> CreateStory - CreateStory --> ATDD - ATDD --> DevImpl - DevImpl --> Automate - Automate --> TestReview1 - TestReview1 --> Trace1 - Trace1 -.->|next story| CreateStory - TestDesignNote["Test design: 'How do I test THIS epic?'
Creates test-design-epic-N.md per epic"] - TestDesign -.-> TestDesignNote - end - - subgraph Gate["EPIC/RELEASE GATE"] - NFR["TEA: *nfr-assess (if not done earlier)"] - TestReview2["TEA: *test-review (final audit, optional)"] - TraceGate["TEA: *trace - Phase 2: Gate"] - GateDecision{"Gate Decision"} - - NFR --> TestReview2 - TestReview2 --> TraceGate - TraceGate --> GateDecision - GateDecision -->|PASS| Pass["PASS ✅"] - GateDecision -->|CONCERNS| Concerns["CONCERNS ⚠️"] - GateDecision -->|FAIL| Fail["FAIL ❌"] - GateDecision -->|WAIVED| Waived["WAIVED ⏭️"] - end - - Phase2 --> Phase3 - Phase3 --> Phase4 - Phase4 --> Gate - - style Phase2 fill:#bbdefb,stroke:#0d47a1,stroke-width:3px,color:#000 - style Phase3 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px,color:#000 - style Phase4 fill:#e1bee7,stroke:#4a148c,stroke-width:3px,color:#000 - style Gate fill:#ffe082,stroke:#f57c00,stroke-width:3px,color:#000 - style Pass fill:#4caf50,stroke:#1b5e20,stroke-width:3px,color:#000 - style Concerns fill:#ffc107,stroke:#f57f17,stroke-width:3px,color:#000 - style Fail fill:#f44336,stroke:#b71c1c,stroke-width:3px,color:#000 - style Waived fill:#9c27b0,stroke:#4a148c,stroke-width:3px,color:#000 -``` - -**Phase Numbering Note:** BMad uses a 4-phase methodology with optional Phase 1 and documentation prerequisite: - -- **Documentation** (Optional for brownfield): Prerequisite using `*document-project` -- **Phase 1** (Optional): Discovery/Analysis (`*brainstorm`, `*research`, `*product-brief`) -- **Phase 2** (Required): Planning (`*prd` creates PRD with FRs/NFRs) -- **Phase 3** (Track-dependent): Solutioning (`*architecture` → `*test-design` (system-level) → `*create-epics-and-stories` → TEA: `*framework`, `*ci` → `*implementation-readiness`) -- **Phase 4** (Required): Implementation (`*sprint-planning` → per-epic: `*test-design` → per-story: dev workflows) - -**TEA workflows:** `*framework` and `*ci` run once in Phase 3 after architecture. `*test-design` is **dual-mode**: - -- **System-level (Phase 3):** Run immediately after architecture/ADR drafting to produce `test-design-system.md` (testability review, ADR → test mapping, Architecturally Significant Requirements (ASRs), environment needs). Feeds the implementation-readiness gate. -- **Epic-level (Phase 4):** Run per-epic to produce `test-design-epic-N.md` (risk, priorities, coverage plan). - -Quick Flow track skips Phases 1 and 3. -BMad Method and Enterprise use all phases based on project needs. -When an ADR or architecture draft is produced, run `*test-design` in **system-level** mode before the implementation-readiness gate. This ensures the ADR has an attached testability review and ADR → test mapping. Keep the test-design updated if ADRs change. - -### Why TEA is Different from Other BMM Agents - -TEA is the only BMM agent that operates in **multiple phases** (Phase 3 and Phase 4) and has its own **knowledge base architecture**. - -
-Cross-Phase Operation & Unique Architecture - -### Phase-Specific Agents (Standard Pattern) - -Most BMM agents work in a single phase: - -- **Phase 1 (Analysis)**: Analyst agent -- **Phase 2 (Planning)**: PM agent -- **Phase 3 (Solutioning)**: Architect agent -- **Phase 4 (Implementation)**: SM, DEV agents - -### TEA: Multi-Phase Quality Agent (Unique Pattern) - -TEA is **the only agent that operates in multiple phases**: - -``` -Phase 1 (Analysis) → [TEA not typically used] - ↓ -Phase 2 (Planning) → [PM defines requirements - TEA not active] - ↓ -Phase 3 (Solutioning) → TEA: *framework, *ci (test infrastructure AFTER architecture) - ↓ -Phase 4 (Implementation) → TEA: *test-design (per epic: "how do I test THIS feature?") - → TEA: *atdd, *automate, *test-review, *trace (per story) - ↓ -Epic/Release Gate → TEA: *nfr-assess, *trace Phase 2 (release decision) -``` - -### TEA's 8 Workflows Across Phases - -**Standard agents**: 1-3 workflows per phase -**TEA**: 8 workflows across Phase 3, Phase 4, and Release Gate - -| Phase | TEA Workflows | Frequency | Purpose | -| ----------- | --------------------------------------------------------- | ---------------- | ---------------------------------------------- | -| **Phase 2** | (none) | - | Planning phase - PM defines requirements | -| **Phase 3** | \*framework, \*ci | Once per project | Setup test infrastructure AFTER architecture | -| **Phase 4** | \*test-design, \*atdd, \*automate, \*test-review, \*trace | Per epic/story | Test planning per epic, then per-story testing | -| **Release** | \*nfr-assess, \*trace (Phase 2: gate) | Per epic/release | Go/no-go decision | - -**Note**: `*trace` is a two-phase workflow: Phase 1 (traceability) + Phase 2 (gate decision). This reduces cognitive load while maintaining natural workflow. - -### Why TEA Gets Special Treatment - -TEA uniquely requires: - -- **Extensive domain knowledge**: 32 fragments covering test patterns, CI/CD, fixtures, quality practices, healing strategies, and optional playwright-utils integration -- **Centralized reference system**: `tea-index.csv` for on-demand fragment loading during workflow execution -- **Cross-cutting concerns**: Domain-specific testing patterns (vs project-specific artifacts like PRDs/stories) -- **Optional integrations**: MCP capabilities (healing, exploratory, verification) and playwright-utils support - -This architecture enables TEA to maintain consistent, production-ready testing patterns across all BMad projects while operating across multiple development phases. - -### Playwright Utils Integration - -TEA optionally integrates with `@seontechnologies/playwright-utils`, an open-source library providing fixture-based utilities for Playwright tests. - -**Installation:** - -```bash -npm install -D @seontechnologies/playwright-utils -``` - -**Enable during BMAD installation** by answering "Yes" when prompted. - -**Supported utilities (10 total):** - -- api-request, network-recorder, auth-session, intercept-network-call, recurse -- log, file-utils, burn-in, network-error-monitor -- fixtures-composition (integration patterns) - -**Workflows adapt:** automate, framework, test-review, ci, atdd (+ light mention in test-design). - -**Knowledge base:** 32 total fragments (21 core patterns + 11 playwright-utils) - -
- -## High-Level Cheat Sheets - -These cheat sheets map TEA workflows to the **BMad Method and Enterprise tracks** across the **4-Phase Methodology** (Phase 1: Analysis, Phase 2: Planning, Phase 3: Solutioning, Phase 4: Implementation). - -**Note:** Quick Flow projects typically don't require TEA (covered in Overview). These cheat sheets focus on BMad Method and Enterprise tracks where TEA adds value. - -**Legend for Track Deltas:** - -- ➕ = New workflow or phase added (doesn't exist in baseline) -- 🔄 = Modified focus (same workflow, different emphasis or purpose) -- 📦 = Additional output or archival requirement - -### Greenfield - BMad Method (Simple/Standard Work) - -**Planning Track:** BMad Method (PRD + Architecture) -**Use Case:** New projects with standard complexity - -| Workflow Stage | Test Architect | Dev / Team | Outputs | -| -------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------- | -| **Phase 1**: Discovery | - | Analyst `*product-brief` (optional) | `product-brief.md` | -| **Phase 2**: Planning | - | PM `*prd` (creates PRD with FRs/NFRs) | PRD with functional/non-functional requirements | -| **Phase 3**: Solutioning | Run `*framework`, `*ci` AFTER architecture and epic creation | Architect `*architecture`, `*create-epics-and-stories`, `*implementation-readiness` | Architecture, epics/stories, test scaffold, CI pipeline | -| **Phase 4**: Sprint Start | - | SM `*sprint-planning` | Sprint status file with all epics and stories | -| **Phase 4**: Epic Planning | Run `*test-design` for THIS epic (per-epic test plan) | Review epic scope | `test-design-epic-N.md` with risk assessment and test plan | -| **Phase 4**: Story Dev | (Optional) `*atdd` before dev, then `*automate` after | SM `*create-story`, DEV implements | Tests, story implementation | -| **Phase 4**: Story Review | Execute `*test-review` (optional), re-run `*trace` | Address recommendations, update code/tests | Quality report, refreshed coverage matrix | -| **Phase 4**: Release Gate | (Optional) `*test-review` for final audit, Run `*trace` (Phase 2) | Confirm Definition of Done, share release notes | Quality audit, Gate YAML + release summary | - -
-Execution Notes - -- Run `*framework` only once per repo or when modern harness support is missing. -- **Phase 3 (Solutioning)**: After architecture is complete, run `*framework` and `*ci` to setup test infrastructure based on architectural decisions. -- **Phase 4 starts**: After solutioning is complete, sprint planning loads all epics. -- **`*test-design` runs per-epic**: At the beginning of working on each epic, run `*test-design` to create a test plan for THAT specific epic/feature. Output: `test-design-epic-N.md`. -- Use `*atdd` before coding when the team can adopt ATDD; share its checklist with the dev agent. -- Post-implementation, keep `*trace` current, expand coverage with `*automate`, optionally review test quality with `*test-review`. For release gate, run `*trace` with Phase 2 enabled to get deployment decision. -- Use `*test-review` after `*atdd` to validate generated tests, after `*automate` to ensure regression quality, or before gate for final audit. -- Clarification: `*test-review` is optional and only audits existing tests; run it after `*atdd` or `*automate` when you want a quality review, not as a required step. -- Clarification: `*atdd` outputs are not auto-consumed; share the ATDD doc/tests with the dev workflow. `*trace` does not run `*atdd`—it evaluates existing artifacts for coverage and gate readiness. -- Clarification: `*ci` is a one-time setup; recommended early (Phase 3 or before feature work), but it can be done later if it was skipped. - -
- -
-Worked Example – “Nova CRM” Greenfield Feature - -1. **Planning (Phase 2):** Analyst runs `*product-brief`; PM executes `*prd` to produce PRD with FRs/NFRs. -2. **Solutioning (Phase 3):** Architect completes `*architecture` for the new module; `*create-epics-and-stories` generates epics/stories based on architecture; TEA sets up test infrastructure via `*framework` and `*ci` based on architectural decisions; gate check validates planning completeness. -3. **Sprint Start (Phase 4):** Scrum Master runs `*sprint-planning` to load all epics into sprint status. -4. **Epic 1 Planning (Phase 4):** TEA runs `*test-design` to create test plan for Epic 1, producing `test-design-epic-1.md` with risk assessment. -5. **Story Implementation (Phase 4):** For each story in Epic 1, SM generates story via `*create-story`; TEA optionally runs `*atdd`; Dev implements with guidance from failing tests. -6. **Post-Dev (Phase 4):** TEA runs `*automate`, optionally `*test-review` to audit test quality, re-runs `*trace` to refresh coverage. -7. **Release Gate:** TEA runs `*trace` with Phase 2 enabled to generate gate decision. - -
- -### Brownfield - BMad Method or Enterprise (Simple or Complex) - -**Planning Tracks:** BMad Method or Enterprise Method -**Use Case:** Existing codebases - simple additions (BMad Method) or complex enterprise requirements (Enterprise Method) - -**🔄 Brownfield Deltas from Greenfield:** - -- ➕ Documentation (Prerequisite) - Document existing codebase if undocumented -- ➕ Phase 2: `*trace` - Baseline existing test coverage before planning -- 🔄 Phase 4: `*test-design` - Focus on regression hotspots and brownfield risks -- 🔄 Phase 4: Story Review - May include `*nfr-assess` if not done earlier - -| Workflow Stage | Test Architect | Dev / Team | Outputs | -| --------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | -| **Documentation**: Prerequisite ➕ | - | Analyst `*document-project` (if undocumented) | Comprehensive project documentation | -| **Phase 1**: Discovery | - | Analyst/PM/Architect rerun planning workflows | Updated planning artifacts in `{output_folder}` | -| **Phase 2**: Planning | Run ➕ `*trace` (baseline coverage) | PM `*prd` (creates PRD with FRs/NFRs) | PRD with FRs/NFRs, ➕ coverage baseline | -| **Phase 3**: Solutioning | Run `*framework`, `*ci` AFTER architecture and epic creation | Architect `*architecture`, `*create-epics-and-stories`, `*implementation-readiness` | Architecture, epics/stories, test framework, CI pipeline | -| **Phase 4**: Sprint Start | - | SM `*sprint-planning` | Sprint status file with all epics and stories | -| **Phase 4**: Epic Planning | Run `*test-design` for THIS epic 🔄 (regression hotspots) | Review epic scope and brownfield risks | `test-design-epic-N.md` with brownfield risk assessment and mitigation | -| **Phase 4**: Story Dev | (Optional) `*atdd` before dev, then `*automate` after | SM `*create-story`, DEV implements | Tests, story implementation | -| **Phase 4**: Story Review | Apply `*test-review` (optional), re-run `*trace`, ➕ `*nfr-assess` if needed | Resolve gaps, update docs/tests | Quality report, refreshed coverage matrix, NFR report | -| **Phase 4**: Release Gate | (Optional) `*test-review` for final audit, Run `*trace` (Phase 2) | Capture sign-offs, share release notes | Quality audit, Gate YAML + release summary | - -
-Execution Notes - -- Lead with `*trace` during Planning (Phase 2) to baseline existing test coverage before architecture work begins. -- **Phase 3 (Solutioning)**: After architecture is complete, run `*framework` and `*ci` to modernize test infrastructure. For brownfield, framework may need to integrate with or replace existing test setup. -- **Phase 4 starts**: After solutioning is complete and sprint planning loads all epics. -- **`*test-design` runs per-epic**: At the beginning of working on each epic, run `*test-design` to identify regression hotspots, integration risks, and mitigation strategies for THAT specific epic/feature. Output: `test-design-epic-N.md`. -- Use `*atdd` when stories benefit from ATDD; otherwise proceed to implementation and rely on post-dev automation. -- After development, expand coverage with `*automate`, optionally review test quality with `*test-review`, re-run `*trace` (Phase 2 for gate decision). Run `*nfr-assess` now if non-functional risks weren't addressed earlier. -- Use `*test-review` to validate existing brownfield tests or audit new tests before gate. - -
- -
-Worked Example – “Atlas Payments” Brownfield Story - -1. **Planning (Phase 2):** PM executes `*prd` to create PRD with FRs/NFRs; TEA runs `*trace` to baseline existing coverage. -2. **Solutioning (Phase 3):** Architect triggers `*architecture` capturing legacy payment flows and integration architecture; `*create-epics-and-stories` generates Epic 1 (Payment Processing) based on architecture; TEA sets up `*framework` and `*ci` based on architectural decisions; gate check validates planning. -3. **Sprint Start (Phase 4):** Scrum Master runs `*sprint-planning` to load Epic 1 into sprint status. -4. **Epic 1 Planning (Phase 4):** TEA runs `*test-design` for Epic 1 (Payment Processing), producing `test-design-epic-1.md` that flags settlement edge cases, regression hotspots, and mitigation plans. -5. **Story Implementation (Phase 4):** For each story in Epic 1, SM generates story via `*create-story`; TEA runs `*atdd` producing failing Playwright specs; Dev implements with guidance from tests and checklist. -6. **Post-Dev (Phase 4):** TEA applies `*automate`, optionally `*test-review` to audit test quality, re-runs `*trace` to refresh coverage. -7. **Release Gate:** TEA performs `*nfr-assess` to validate SLAs, runs `*trace` with Phase 2 enabled to generate gate decision (PASS/CONCERNS/FAIL). - -
- -### Greenfield - Enterprise Method (Enterprise/Compliance Work) - -**Planning Track:** Enterprise Method (BMad Method + extended security/devops/test strategies) -**Use Case:** New enterprise projects with compliance, security, or complex regulatory requirements - -**🏢 Enterprise Deltas from BMad Method:** - -- ➕ Phase 1: `*research` - Domain and compliance research (recommended) -- ➕ Phase 2: `*nfr-assess` - Capture NFR requirements early (security/performance/reliability) -- 🔄 Phase 4: `*test-design` - Enterprise focus (compliance, security architecture alignment) -- 📦 Release Gate - Archive artifacts and compliance evidence for audits - -| Workflow Stage | Test Architect | Dev / Team | Outputs | -| -------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------ | -| **Phase 1**: Discovery | - | Analyst ➕ `*research`, `*product-brief` | Domain research, compliance analysis, product brief | -| **Phase 2**: Planning | Run ➕ `*nfr-assess` | PM `*prd` (creates PRD with FRs/NFRs), UX `*create-ux-design` | Enterprise PRD with FRs/NFRs, UX design, ➕ NFR documentation | -| **Phase 3**: Solutioning | Run `*framework`, `*ci` AFTER architecture and epic creation | Architect `*architecture`, `*create-epics-and-stories`, `*implementation-readiness` | Architecture, epics/stories, test framework, CI pipeline | -| **Phase 4**: Sprint Start | - | SM `*sprint-planning` | Sprint plan with all epics | -| **Phase 4**: Epic Planning | Run `*test-design` for THIS epic 🔄 (compliance focus) | Review epic scope and compliance requirements | `test-design-epic-N.md` with security/performance/compliance focus | -| **Phase 4**: Story Dev | (Optional) `*atdd`, `*automate`, `*test-review`, `*trace` per story | SM `*create-story`, DEV implements | Tests, fixtures, quality reports, coverage matrices | -| **Phase 4**: Release Gate | Final `*test-review` audit, Run `*trace` (Phase 2), 📦 archive artifacts | Capture sign-offs, 📦 compliance evidence | Quality audit, updated assessments, gate YAML, 📦 audit trail | - -
-Execution Notes - -- `*nfr-assess` runs early in Planning (Phase 2) to capture compliance, security, and performance requirements upfront. -- **Phase 3 (Solutioning)**: After architecture is complete, run `*framework` and `*ci` with enterprise-grade configurations (selective testing, burn-in jobs, caching, notifications). -- **Phase 4 starts**: After solutioning is complete and sprint planning loads all epics. -- **`*test-design` runs per-epic**: At the beginning of working on each epic, run `*test-design` to create an enterprise-focused test plan for THAT specific epic, ensuring alignment with security architecture, performance targets, and compliance requirements. Output: `test-design-epic-N.md`. -- Use `*atdd` for stories when feasible so acceptance tests can lead implementation. -- Use `*test-review` per story or sprint to maintain quality standards and ensure compliance with testing best practices. -- Prior to release, rerun coverage (`*trace`, `*automate`), perform final quality audit with `*test-review`, and formalize the decision with `*trace` Phase 2 (gate decision); archive artifacts for compliance audits. - -
- -
-Worked Example – “Helios Ledger” Enterprise Release - -1. **Planning (Phase 2):** Analyst runs `*research` and `*product-brief`; PM completes `*prd` creating PRD with FRs/NFRs; TEA runs `*nfr-assess` to establish NFR targets. -2. **Solutioning (Phase 3):** Architect completes `*architecture` with enterprise considerations; `*create-epics-and-stories` generates epics/stories based on architecture; TEA sets up `*framework` and `*ci` with enterprise-grade configurations based on architectural decisions; gate check validates planning completeness. -3. **Sprint Start (Phase 4):** Scrum Master runs `*sprint-planning` to load all epics into sprint status. -4. **Per-Epic (Phase 4):** For each epic, TEA runs `*test-design` to create epic-specific test plan (e.g., `test-design-epic-1.md`, `test-design-epic-2.md`) with compliance-focused risk assessment. -5. **Per-Story (Phase 4):** For each story, TEA uses `*atdd`, `*automate`, `*test-review`, and `*trace`; Dev teams iterate on the findings. -6. **Release Gate:** TEA re-checks coverage, performs final quality audit with `*test-review`, and logs the final gate decision via `*trace` Phase 2, archiving artifacts for compliance. - -
- -## Command Catalog - -
-Optional Playwright MCP Enhancements - -**Two Playwright MCP servers** (actively maintained, continuously updated): - -- `playwright` - Browser automation (`npx @playwright/mcp@latest`) -- `playwright-test` - Test runner with failure analysis (`npx playwright run-test-mcp-server`) - -**How MCP Enhances TEA Workflows**: - -MCP provides additional capabilities on top of TEA's default AI-based approach: - -1. `*test-design`: - - Default: Analysis + documentation - - **+ MCP**: Interactive UI discovery with `browser_navigate`, `browser_click`, `browser_snapshot`, behavior observation - - Benefit: Discover actual functionality, edge cases, undocumented features - -2. `*atdd`, `*automate`: - - Default: Infers selectors and interactions from requirements and knowledge fragments - - **+ MCP**: Generates tests **then** verifies with `generator_setup_page`, `browser_*` tools, validates against live app - - Benefit: Accurate selectors from real DOM, verified behavior, refined test code - -3. `*automate`: - - Default: Pattern-based fixes from error messages + knowledge fragments - - **+ MCP**: Pattern fixes **enhanced with** `browser_snapshot`, `browser_console_messages`, `browser_network_requests`, `browser_generate_locator` - - Benefit: Visual failure context, live DOM inspection, root cause discovery - -**Config example**: - -```json -{ - "mcpServers": { - "playwright": { - "command": "npx", - "args": ["@playwright/mcp@latest"] - }, - "playwright-test": { - "command": "npx", - "args": ["playwright", "run-test-mcp-server"] - } - } -} -``` - -**To disable**: Set `tea_use_mcp_enhancements: false` in `_bmad/bmm/config.yaml` OR remove MCPs from IDE config. - -
- -
-Optional Playwright Utils Integration - -**Open-source Playwright utilities** from SEON Technologies (production-tested, npm published): - -- **Package**: `@seontechnologies/playwright-utils` ([npm](https://www.npmjs.com/package/@seontechnologies/playwright-utils) | [GitHub](https://github.com/seontechnologies/playwright-utils)) -- **Install**: `npm install -D @seontechnologies/playwright-utils` - -**How Playwright Utils Enhances TEA Workflows**: - -Provides fixture-based utilities that integrate into TEA's test generation and review workflows: - -1. `*framework`: - - Default: Basic Playwright scaffold - - **+ playwright-utils**: Scaffold with api-request, network-recorder, auth-session, burn-in, network-error-monitor fixtures pre-configured - - Benefit: Production-ready patterns from day one - -2. `*automate`, `*atdd`: - - Default: Standard test patterns - - **+ playwright-utils**: Tests using api-request (schema validation), intercept-network-call (mocking), recurse (polling), log (structured logging), file-utils (CSV/PDF) - - Benefit: Advanced patterns without boilerplate - -3. `*test-review`: - - Default: Reviews against core knowledge base (21 fragments) - - **+ playwright-utils**: Reviews against expanded knowledge base (32 fragments: 21 core + 11 playwright-utils) - - Benefit: Reviews include fixture composition, auth patterns, network recording best practices - -4. `*ci`: - - Default: Standard CI workflow - - **+ playwright-utils**: CI workflow with burn-in script (smart test selection) and network-error-monitor integration - - Benefit: Faster CI feedback, HTTP error detection - -**Utilities available** (10 total): api-request, network-recorder, auth-session, intercept-network-call, recurse, log, file-utils, burn-in, network-error-monitor, fixtures-composition - -**Enable during BMAD installation** by answering "Yes" when prompted, or manually set `tea_use_playwright_utils: true` in `_bmad/bmm/config.yaml`. - -**To disable**: Set `tea_use_playwright_utils: false` in `_bmad/bmm/config.yaml`. - -
- -

- -| Command | Primary Outputs | Notes | With Playwright MCP Enhancements | -| -------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | -| `*framework` | Playwright/Cypress scaffold, `.env.example`, `.nvmrc`, sample specs | Use when no production-ready harness exists | - | -| `*ci` | CI workflow, selective test scripts, secrets checklist | Platform-aware (GitHub Actions default) | - | -| `*test-design` | Combined risk assessment, mitigation plan, and coverage strategy | Risk scoring + optional exploratory mode | **+ Exploratory**: Interactive UI discovery with browser automation (uncover actual functionality) | -| `*atdd` | Failing acceptance tests + implementation checklist | TDD red phase + optional recording mode | **+ Recording**: AI generation verified with live browser (accurate selectors from real DOM) | -| `*automate` | Prioritized specs, fixtures, README/script updates, DoD summary | Optional healing/recording, avoid duplicate coverage | **+ Healing**: Pattern fixes enhanced with visual debugging + **+ Recording**: AI verified with live browser | -| `*test-review` | Test quality review report with 0-100 score, violations, fixes | Reviews tests against knowledge base patterns | - | -| `*nfr-assess` | NFR assessment report with actions | Focus on security/performance/reliability | - | -| `*trace` | Phase 1: Coverage matrix, recommendations. Phase 2: Gate decision (PASS/CONCERNS/FAIL/WAIVED) | Two-phase workflow: traceability + gate decision | - | diff --git a/docs/modules/bmm-bmad-method/troubleshooting.md b/docs/modules/bmm-bmad-method/troubleshooting.md deleted file mode 100644 index 99ce15a8..00000000 --- a/docs/modules/bmm-bmad-method/troubleshooting.md +++ /dev/null @@ -1,3 +0,0 @@ -# BMM Troubleshooting Guide - -Common issues and solutions for the BMad Method Module will be listed here as needed. \ No newline at end of file diff --git a/docs/modules/bmm-bmad-method/workflows-analysis.md b/docs/modules/bmm-bmad-method/workflows-analysis.md deleted file mode 100644 index 89736808..00000000 --- a/docs/modules/bmm-bmad-method/workflows-analysis.md +++ /dev/null @@ -1,199 +0,0 @@ -# BMM Analysis Workflows (Phase 1) - -## Overview - -Phase 1 (Analysis) workflows are **optional** exploration and discovery tools that help validate ideas, understand markets, and generate strategic context before planning begins. - -**Key principle:** Analysis workflows help you think strategically before committing to implementation. Skip them if your requirements are already clear. - -**When to use:** Starting new projects, exploring opportunities, validating market fit, generating ideas, understanding problem spaces. - -**When to skip:** Continuing existing projects with clear requirements, well-defined features with known solutions, strict constraints where discovery is complete. - ---- - -## Phase 1 Analysis Workflow Overview - -Phase 1 Analysis consists of three categories of optional workflows: - -### Discovery & Ideation (Optional) - -- **brainstorm-project** - Multi-track solution exploration for software projects - -### Research & Validation (Optional) - -- **research** - Market, technical, competitive, user, domain, and AI research -- **domain-research** - Industry-specific deep dive research - -### Strategic Capture (Recommended for Greenfield) - -- **product-brief** - Product vision and strategy definition - -These workflows feed into Phase 2 (Planning) workflows, particularly the `prd` workflow. - ---- - -## Quick Reference - -| Workflow | Agent | Required | Purpose | Output | -| ---------------------- | ------- | ----------- | -------------------------------------------------------------- | ---------------------------- | -| **brainstorm-project** | Analyst | No | Explore solution approaches and architectures | Solution options + rationale | -| **research** | Analyst | No | Multi-type research (market/technical/competitive/user/domain) | Research reports | -| **product-brief** | Analyst | Recommended | Define product vision and strategy (interactive) | Product Brief document | - ---- - -## Workflow Descriptions - -### brainstorm-project - -**Purpose:** Generate multiple solution approaches through parallel ideation tracks (architecture, UX, integration, value). - -**Agent:** Analyst - -**When to Use:** - -- Very vague or seed kernal of an idea that needs exploration -- Consider alternatives or enhancements to an idea -- See your idea from different angles and viewpoints -- No idea what you want to build, but want to find some inspiration - ---- - -### research - -**Purpose:** Comprehensive multi-type research system consolidating market, technical, competitive, user, and domain analysis. - -**Agent:** Analyst - -**Research Types:** - -| Type | Purpose | Use When | -| --------------- | ------------------------------------------------------ | ----------------------------------- | -| **market** | TAM/SAM/SOM, competitive analysis | Need market viability validation | -| **technical** | Technology evaluation, ADRs | Choosing frameworks/platforms | -| **competitive** | Deep competitor analysis | Understanding competitive landscape | -| **user** | Customer insights, personas, JTBD | Need user understanding | -| **domain** | Industry deep dives, trends | Understanding domain/industry | -| **deep_prompt** | Generate AI research prompts (ChatGPT, Claude, Gemini) | Need deeper AI-assisted research | - -**Key Features:** - -- Real-time web research -- Multiple analytical frameworks (Porter's Five Forces, SWOT, Technology Adoption Lifecycle) -- Platform-specific optimization for deep_prompt type -- Configurable research depth (quick/standard/comprehensive) - -**Example (market):** "SaaS project management tool" → TAM $50B, SAM $5B, SOM $50M, top competitors (Asana, Monday), positioning recommendation. - ---- - -### product-brief - -**Purpose:** Interactive product brief creation that guides strategic product vision definition. - -**Agent:** Analyst - -**When to Use:** - -- Starting new product/major feature initiative -- Aligning stakeholders before detailed planning -- Transitioning from exploration to strategy -- Need executive-level product documentation - -**Key Outputs:** - -- Executive summary -- Problem statement with evidence -- Proposed solution and differentiators -- Target users (segmented) -- MVP scope (ruthlessly defined) -- Financial impact and ROI -- Strategic alignment -- Risks and open questions - -**Integration:** Feeds directly into PRD workflow (Phase 2). - ---- - -## Decision Guide - -### Starting a Software Project - -``` -brainstorm-project (if unclear) → research (market/technical) → product-brief → Phase 2 (prd) -``` - -### Validating an Idea - -``` -research (market type) → product-brief → Phase 2 -``` - -### Technical Decision Only - -``` -research (technical type) → Use findings in Phase 3 (architecture) -``` - -### Understanding Market - -``` -research (market/competitive type) → product-brief → Phase 2 -``` - -### Domain Research for Complex Industries - -``` -domain-research → research (compliance/regulatory) → product-brief → Phase 2 -``` - ---- - -## Integration with Phase 2 (Planning) - -Analysis outputs feed directly into Planning: - -| Analysis Output | Planning Input | -| --------------------------- | -------------------------- | -| product-brief.md | **prd** workflow | -| market-research.md | **prd** context | -| domain-research.md | **prd** context | -| technical-research.md | **architecture** (Phase 3) | -| competitive-intelligence.md | **prd** positioning | - -Planning workflows automatically load these documents if they exist in the output folder. - -## Common Patterns - -### Greenfield Software (Full Analysis) - -``` -1. brainstorm-project - explore approaches -2. research (market/technical/domain) - validate viability -3. product-brief - capture strategic vision -4. → Phase 2: prd -``` - -### Skip Analysis (Clear Requirements) - -``` -→ Phase 2: prd or tech-spec directly -``` - -### Technical Research Only - -``` -1. research (technical) - evaluate technologies -2. → Phase 3: architecture (use findings in ADRs) -``` - ---- - -## Related Documentation - -- [Phase 2: Planning Workflows](../../../../docs/modules/bmm-bmad-method/workflows-planning.md) - Next phase -- [Phase 3: Solutioning Workflows](../../../../docs/modules/bmm-bmad-method/workflows-solutioning.md) -- [Phase 4: Implementation Workflows](../../../../docs/modules/bmm-bmad-method/workflows-implementation.md) -- [Scale Adaptive System](./scale-adaptive-system.md) - Understanding project complexity -- [Agents Guide](../../../../docs/modules/bmm-bmad-method/agents-guide.md) - Complete agent reference diff --git a/docs/modules/bmm-bmad-method/workflows-implementation.md b/docs/modules/bmm-bmad-method/workflows-implementation.md deleted file mode 100644 index 02d9c471..00000000 --- a/docs/modules/bmm-bmad-method/workflows-implementation.md +++ /dev/null @@ -1,211 +0,0 @@ -# BMM Implementation Workflows (Phase 4) - -## Overview - -Phase 4 (Implementation) workflows manage the iterative sprint-based development cycle using a **story-centric workflow** where each story moves through a defined lifecycle from creation to completion. - -**Key principle:** One story at a time, move it through the entire lifecycle before starting the next. - ---- - -## Complete Workflow Context - -Phase 4 is the final phase of the BMad Method workflow. To see how implementation fits into the complete methodology: - -The BMad Method consists of four phases working in sequence: - -1. **Phase 1 (Analysis)** - Optional exploration and discovery workflows -2. **Phase 2 (Planning)** - Required requirements definition using scale-adaptive system -3. **Phase 3 (Solutioning)** - Technical architecture and design decisions -4. **Phase 4 (Implementation)** - Iterative sprint-based development with story-centric workflow - -Phase 4 focuses on the iterative epic and story cycles where stories are implemented, reviewed, and completed one at a time. - -For a visual representation of the complete workflow, see: [workflow-method-greenfield.excalidraw](./images/workflow-method-greenfield.excalidraw) - ---- - -## Quick Reference - -| Workflow | Agent | When | Purpose | -| ------------------- | ----- | --------------------- | ------------------------------------- | -| **sprint-planning** | SM | Once at Phase 4 start | Initialize sprint tracking file | -| **create-story** | SM | Per story | Create next story from epic backlog | -| **dev-story** | DEV | Per story | Implement story with tests | -| **code-review** | DEV | Per story | Senior dev quality review | -| **retrospective** | SM | After epic complete | Review lessons and extract insights | -| **correct-course** | SM | When issues arise | Handle significant mid-sprint changes | - ---- - -## Agent Roles - -### SM (Scrum Master) - Primary Implementation Orchestrator - -**Workflows:** sprint-planning, create-story, retrospective, correct-course - -**Responsibilities:** - -- Initialize and maintain sprint tracking -- Create stories from epic backlog -- Handle course corrections when issues arise -- Facilitate retrospectives after epic completion -- Orchestrate overall implementation flow - -### DEV (Developer) - Implementation and Quality - -**Workflows:** dev-story, code-review - -**Responsibilities:** - -- Implement stories with tests -- Perform senior developer code reviews -- Ensure quality and adherence to standards -- Complete story implementation lifecycle - ---- - -## Story Lifecycle States - -Stories move through these states in the sprint status file: - -1. **TODO** - Story identified but not started -2. **IN PROGRESS** - Story being implemented (create-story → dev-story) -3. **READY FOR REVIEW** - Implementation complete, awaiting code review -4. **DONE** - Accepted and complete - ---- - -## Typical Sprint Flow - -### Sprint 0 (Planning Phase) - -- Complete Phases 1-3 (Analysis, Planning, Solutioning) -- PRD/GDD + Architecture complete -- **V6: Epics+Stories created via create-epics-and-stories workflow (runs AFTER architecture)** - -### Sprint 1+ (Implementation Phase) - -**Start of Phase 4:** - -1. SM runs `sprint-planning` (once) - -**Per Epic:** - -- Epic context and stories are already prepared from Phase 3 - -**Per Story (repeat until epic complete):** - -1. SM runs `create-story` -2. DEV runs `dev-story` -3. (Optional) TEA runs `*automate` to generate or expand guardrail tests -4. DEV runs `code-review` -5. If code review fails: DEV fixes issues in `dev-story`, then re-runs `code-review` - -**After Epic Complete:** - -- SM runs `retrospective` -- Move to next epic - -**As Needed:** - -- Run `sprint-status` anytime in Phase 4 to inspect sprint-status.yaml and get the next implementation command -- Run `workflow-status` for cross-phase routing and project-level paths -- Run `correct-course` if significant changes needed - ---- - -## Key Principles - -### One Story at a Time - -Complete each story's full lifecycle before starting the next. This prevents context switching and ensures quality. - -### Quality Gates - -Every story goes through `code-review` before being marked done. No exceptions. - -### Continuous Tracking - -The `sprint-status.yaml` file is the single source of truth for all implementation progress. - ---- - -### (BMad Method / Enterprise) - -``` -PRD (PM) → Architecture (Architect) - → create-epics-and-stories (PM) ← V6: After architecture! - → implementation-readiness (Architect) - → sprint-planning (SM, once) - → [Per Epic]: - → story loop (SM/DEV) - → retrospective (SM) - → [Next Epic] -Current Phase: 4 (Implementation) -Current Epic: Epic 1 (Authentication) -Current Sprint: Sprint 1 - -Next Story: Story 1.3 (Email Verification) -Status: TODO -Dependencies: Story 1.2 (DONE) ✅ - -**Recommendation:** Run `create-story` to generate Story 1.3 - -After create-story: -1. Run dev-story -2. Run code-review -3. Update sprint-status.yaml to mark story done -``` - -See: [workflow-status instructions](../workflows/workflow-status/instructions.md) - ---- - -### document-project - -**Purpose:** Analyze and document brownfield projects by scanning codebase, architecture, and patterns. - -**Agent:** Analyst -**Duration:** 1-3 hours -**When to Use:** Brownfield projects without documentation - -**How It Works:** - -1. Scans codebase structure -2. Identifies architecture patterns -3. Documents technology stack -4. Creates reference documentation -5. Generates PRD-like document from existing code - -**Output:** `project-documentation-{date}.md` - -**When to Run:** - -- Before starting work on legacy project -- When inheriting undocumented codebase -- Creating onboarding documentation - -See: [document-project reference](./workflow-document-project-reference.md) - -## Related Documentation - -- [Phase 1: Analysis Workflows](./workflows-analysis.md) -- [Phase 2: Planning Workflows](./workflows-planning.md) -- [Phase 3: Solutioning Workflows](./workflows-solutioning.md) - -## Troubleshooting - -**Q: Which workflow should I run next?** -A: Run `workflow-status` - it reads the sprint status file and tells you exactly what to do. During implementation (Phase 4) run `sprint-status` (fast check against sprint-status.yaml). - -**Q: Story needs significant changes mid-implementation?** -A: Run `correct-course` to analyze impact and route appropriately. - -**Q: Can I work on multiple stories in parallel?** -A: Not recommended. Complete one story's full lifecycle before starting the next. Prevents context switching and ensures quality. - -**Q: What if code review finds issues?** -A: DEV runs `dev-story` to make fixes, re-runs tests, then runs `code-review` again until it passes. - -_Phase 4 Implementation - One story at a time, done right._ diff --git a/docs/modules/bmm-bmad-method/workflows-planning.md b/docs/modules/bmm-bmad-method/workflows-planning.md deleted file mode 100644 index b826ae44..00000000 --- a/docs/modules/bmm-bmad-method/workflows-planning.md +++ /dev/null @@ -1,89 +0,0 @@ -# BMM Planning Workflows (Phase 2) - -## Phase 2 Planning Workflow Overview - - -## Quick Reference - -| Workflow | Agent | Track | Purpose | -| -------------------- | ----------- | ----------------------- | ------------------------------------- | -| **prd** | PM | BMad Method, Enterprise | Strategic PRD with FRs/NFRs | -| **create-ux-design** | UX Designer | BMad Method, Enterprise | Optional UX specification (after PRD) | - -### prd (Product Requirements Document) - -**Purpose:** Strategic PRD with Functional Requirements (FRs) and Non-Functional Requirements (NFRs) for software products (BMad Method track). - -**Agent:** PM (with Architect and Analyst support) - -**When to Use:** - -- Medium to large feature sets -- Multi-screen user experiences -- Complex business logic -- Multiple system integrations -- Phased delivery required - -**Scale-Adaptive Structure:** - -- **Light:** Focused FRs/NFRs, simplified analysis (10-15 pages) -- **Standard:** Comprehensive FRs/NFRs, thorough analysis (20-30 pages) -- **Comprehensive:** Extensive FRs/NFRs, multi-phase, stakeholder analysis (30-50+ pages) - -**Key Outputs:** - -- PRD.md (complete requirements with FRs and NFRs) - -**Note:** V6 improvement - PRD focuses on WHAT to build (requirements). Epic+Stories are created AFTER architecture via `create-epics-and-stories` workflow for better quality. - -**Integration:** Feeds into Architecture (Phase 3) - -**Example:** E-commerce checkout → PRD with 15 FRs (user account, cart management, payment flow) and 8 NFRs (performance, security, scalability). - ---- - -### create-ux-design (UX Design) - -**Purpose:** UX specification for projects where user experience is the primary differentiator (BMad Method track). - -**Agent:** UX Designer - -**When to Use:** - -- UX is primary competitive advantage -- Complex user workflows needing design thinking -- Innovative interaction patterns -- Design system creation -- Accessibility-critical experiences - -**Collaborative Approach:** - -1. Visual exploration (generate multiple options) -2. Informed decisions (evaluate with user needs) -3. Collaborative design (refine iteratively) -4. Living documentation (evolves with project) - -**Key Outputs:** - -- ux-spec.md (complete UX specification) -- User journeys -- Wireframes and mockups -- Interaction specifications -- Design system (components, patterns, tokens) -- Epic breakdown (UX stories) - -**Integration:** Feeds PRD or updates epics, then Architecture (Phase 3) - -**Example:** Dashboard redesign → Card-based layout with split-pane toggle, 5 card components, 12 color tokens, responsive grid, 3 epics (Layout, Visualization, Accessibility). - -## Best Practices - -### 1. Do Product Brief from Phase 1 to kickstart the PRD for better results - -### 2. Focus on "What" Not "How" - -Planning defines **what** to build and **why**. Leave **how** (technical design) to Phase 3 (Solutioning). - -### 3. Document-Project First for Brownfield - -Always run `document-project` before planning brownfield projects. AI agents need existing codebase context and will make a large quality difference. If you are adding a small addition to an existing project, you might want to consider instead after using document-project to use the quick flow solo dev process instead. diff --git a/docs/modules/bmm-bmad-method/workflows-solutioning.md b/docs/modules/bmm-bmad-method/workflows-solutioning.md deleted file mode 100644 index 8cd61852..00000000 --- a/docs/modules/bmm-bmad-method/workflows-solutioning.md +++ /dev/null @@ -1,509 +0,0 @@ -# BMM Solutioning Workflows (Phase 3) - -## Overview - -Phase 3 (Solutioning) workflows translate **what** to build (from Planning) into **how** to build it (technical design). This phase prevents agent conflicts in multi-epic projects by documenting architectural decisions before implementation begins. - -**Key principle:** Make technical decisions explicit and documented so all agents implement consistently. Prevent one agent choosing REST while another chooses GraphQL. - -**Required for:** BMad Method (complex projects), Enterprise Method - -**Optional for:** BMad Method (simple projects), Quick Flow (skip entirely) - ---- - -## Phase 3 Solutioning Workflow Overview - -Phase 3 Solutioning has different paths based on the planning track selected: - -### Quick Flow Path - -- From Planning: tech-spec complete -- Action: Skip Phase 3 entirely -- Next: Phase 4 (Implementation) - -### BMad Method & Enterprise Path - -- From Planning: PRD with FRs/NFRs complete -- Optional: create-ux-design (if UX is critical) -- Required: architecture - System design with ADRs -- Required: create-epics-and-stories - Break requirements into implementable stories -- Required: implementation-readiness - Gate check validation -- Enterprise additions: Optional security-architecture and devops-strategy (future workflows) - -### Gate Check Results - -- **PASS** - All criteria met, proceed to Phase 4 -- **CONCERNS** - Minor gaps identified, proceed with caution -- **FAIL** - Critical issues, must resolve before Phase 4 - ---- - -## Quick Reference - -| Workflow | Agent | Track | Purpose | -| ---------------------------- | ----------- | ------------------------ | -------------------------------------------- | -| **create-ux-design** | UX Designer | BMad Method, Enterprise | Optional UX design (after PRD, before arch) | -| **architecture** | Architect | BMad Method, Enterprise | Technical architecture and design decisions | -| **create-epics-and-stories** | PM | BMad Method, Enterprise | Break FRs/NFRs into epics after architecture | -| **implementation-readiness** | Architect | BMad Complex, Enterprise | Validate planning/solutioning completeness | - -**When to Skip Solutioning:** - -- **Quick Flow:** Simple changes don't need architecture → Skip to Phase 4 - -**When Solutioning is Required:** - -- **BMad Method:** Multi-epic projects need architecture to prevent conflicts -- **Enterprise:** Same as BMad Method, plus optional extended workflows (test architecture, security architecture, devops strategy) added AFTER architecture but BEFORE gate check - ---- - -## Why Solutioning Matters - -### The Problem Without Solutioning - -``` -Agent 1 implements Epic 1 using REST API -Agent 2 implements Epic 2 using GraphQL -Result: Inconsistent API design, integration nightmare -``` - -### The Solution With Solutioning - -``` -architecture workflow decides: "Use GraphQL for all APIs" -All agents follow architecture decisions -Result: Consistent implementation, no conflicts -``` - -### Solutioning vs Planning - -| Aspect | Planning (Phase 2) | Solutioning (Phase 3) | -| -------- | ----------------------- | --------------------------------- | -| Question | What and Why? | How? Then What units of work? | -| Output | FRs/NFRs (Requirements) | Architecture + Epics/Stories | -| Agent | PM | Architect → PM | -| Audience | Stakeholders | Developers | -| Document | PRD (FRs/NFRs) | Architecture + Epic Files | -| Level | Business logic | Technical design + Work breakdown | - ---- - -## Workflow Descriptions - -### architecture - -**Purpose:** Make technical decisions explicit to prevent agent conflicts. Produces decision-focused architecture document optimized for AI consistency. - -**Agent:** Architect - -**When to Use:** - -- Multi-epic projects (BMad Complex, Enterprise) -- Cross-cutting technical concerns -- Multiple agents implementing different parts -- Integration complexity exists -- Technology choices need alignment - -**When to Skip:** - -- Quick Flow (simple changes) -- BMad Method Simple with straightforward tech stack -- Single epic with clear technical approach - -**Adaptive Conversation Approach:** - -This is NOT a template filler. The architecture workflow: - -1. **Discovers** technical needs through conversation -2. **Proposes** architectural options with trade-offs -3. **Documents** decisions that prevent agent conflicts -4. **Focuses** on decision points, not exhaustive documentation - -**Key Outputs:** - -**architecture.md** containing: - -1. **Architecture Overview** - System context, principles, style -2. **System Architecture** - High-level diagram, component interactions, communication patterns -3. **Data Architecture** - Database design, state management, caching, data flow -4. **API Architecture** - API style (REST/GraphQL/gRPC), auth, versioning, error handling -5. **Frontend Architecture** (if applicable) - Framework, state management, component architecture, routing -6. **Integration Architecture** - Third-party integrations, message queuing, event-driven patterns -7. **Security Architecture** - Auth/authorization, data protection, security boundaries -8. **Deployment Architecture** - Deployment model, CI/CD, environment strategy, monitoring -9. **Architecture Decision Records (ADRs)** - Key decisions with context, options, trade-offs, rationale -10. **FR/NFR-Specific Guidance** - Technical approach per functional requirement, implementation priorities, dependencies -11. **Standards and Conventions** - Directory structure, naming conventions, code organization, testing - -**ADR Format (Brief):** - -```markdown -## ADR-001: Use GraphQL for All APIs - -**Status:** Accepted | **Date:** 2025-11-02 - -**Context:** PRD requires flexible querying across multiple epics - -**Decision:** Use GraphQL for all client-server communication - -**Options Considered:** - -1. REST - Familiar but requires multiple endpoints -2. GraphQL - Flexible querying, learning curve -3. gRPC - High performance, poor browser support - -**Rationale:** - -- PRD requires flexible data fetching (Epic 1, 3) -- Mobile app needs bandwidth optimization (Epic 2) -- Team has GraphQL experience - -**Consequences:** - -- Positive: Flexible querying, reduced versioning -- Negative: Caching complexity, N+1 query risk -- Mitigation: Use DataLoader for batching - -**Implications for FRs:** - -- FR-001: User Management → GraphQL mutations -- FR-002: Mobile App → Optimized queries -``` - -**Example:** E-commerce platform → Monolith + PostgreSQL + Redis + Next.js + GraphQL, with ADRs explaining each choice and FR/NFR-specific guidance. - -**Integration:** Feeds into create-epics-and-stories workflow. Architecture provides the technical context needed for breaking FRs/NFRs into implementable epics and stories. All dev agents reference architecture during Phase 4 implementation. - ---- - -### create-epics-and-stories - -**Purpose:** Transform PRD's functional and non-functional requirements into bite-sized stories organized into deliverable functional epics. This workflow runs AFTER architecture so epics/stories are informed by technical decisions. - -**Agent:** PM (Product Manager) - -**When to Use:** - -- After architecture workflow completes -- When PRD contains FRs/NFRs ready for implementation breakdown -- Before implementation-readiness gate check - -**Key Inputs:** - -- PRD (FRs/NFRs) from Phase 2 Planning -- architecture.md with ADRs and technical decisions -- Optional: UX design artifacts - -**Why After Architecture:** - -The create-epics-and-stories workflow runs AFTER architecture because: - -1. **Informed Story Sizing:** Architecture decisions (database choice, API style, etc.) affect story complexity -2. **Dependency Awareness:** Architecture reveals technical dependencies between stories -3. **Technical Feasibility:** Stories can be properly scoped knowing the tech stack -4. **Consistency:** All stories align with documented architectural patterns - -**Key Outputs:** - -Epic files (one per epic) containing: - -1. Epic objective and scope -2. User stories with acceptance criteria -3. Story priorities (P0/P1/P2/P3) -4. Dependencies between stories -5. Technical notes referencing architecture decisions - -**Example:** E-commerce PRD with FR-001 (User Registration), FR-002 (Product Catalog) → Epic 1: User Management (3 stories), Epic 2: Product Display (4 stories), each story referencing relevant ADRs. - ---- - -### implementation-readiness - -**Purpose:** Systematically validate that planning and solutioning are complete and aligned before Phase 4 implementation. Ensures PRD, architecture, and epics are cohesive with no gaps. - -**Agent:** Architect - -**When to Use:** - -- **Always** before Phase 4 for BMad Complex and Enterprise projects -- After create-epics-and-stories workflow completes -- Before sprint-planning workflow -- When stakeholders request readiness check - -**When to Skip:** - -- Quick Flow (no solutioning) -- BMad Simple (no gate check required) - -**Purpose of Gate Check:** - -**Prevents:** - -- ❌ Architecture doesn't address all FRs/NFRs -- ❌ Epics conflict with architecture decisions -- ❌ Requirements ambiguous or contradictory -- ❌ Missing critical dependencies - -**Ensures:** - -- ✅ PRD → Architecture → Epics alignment -- ✅ All epics have clear technical approach -- ✅ No contradictions or gaps -- ✅ Team ready to implement - -**Check Criteria:** - -**PRD/GDD Completeness:** - -- Problem statement clear and evidence-based -- Success metrics defined -- User personas identified -- Functional requirements (FRs) complete -- Non-functional requirements (NFRs) specified -- Risks and assumptions documented - -**Architecture Completeness:** - -- System architecture defined -- Data architecture specified -- API architecture decided -- Key ADRs documented -- Security architecture addressed -- FR/NFR-specific guidance provided -- Standards and conventions defined - -**Epic/Story Completeness:** - -- All PRD features mapped to stories -- Stories have acceptance criteria -- Stories prioritized (P0/P1/P2/P3) -- Dependencies identified -- Story sequencing logical - -**Alignment Checks:** - -- Architecture addresses all PRD FRs/NFRs -- Epics align with architecture decisions -- No contradictions between epics -- NFRs have technical approach -- Integration points clear - -**Gate Decision Logic:** - -**✅ PASS** - -- All critical criteria met -- Minor gaps acceptable with documented plan -- **Action:** Proceed to Phase 4 - -**⚠️ CONCERNS** - -- Some criteria not met but not blockers -- Gaps identified with clear resolution path -- **Action:** Proceed with caution, address gaps in parallel - -**❌ FAIL** - -- Critical gaps or contradictions -- Architecture missing key decisions -- Epics conflict with PRD/architecture -- **Action:** BLOCK Phase 4, resolve issues first - -**Key Outputs:** - -**implementation-readiness.md** containing: - -1. Executive Summary (PASS/CONCERNS/FAIL) -2. Completeness Assessment (scores for PRD, Architecture, Epics) -3. Alignment Assessment (PRD↔Architecture, Architecture↔Epics/Stories, cross-epic consistency) -4. Quality Assessment (story quality, dependencies, risks) -5. Gaps and Recommendations (critical/minor gaps, remediation) -6. Gate Decision with rationale -7. Next Steps - -**Example:** E-commerce platform → CONCERNS ⚠️ due to missing security architecture and undefined payment gateway. Recommendation: Complete security section and add payment gateway ADR before proceeding. - ---- - -## Integration with Planning and Implementation - -### Planning → Solutioning Flow - -**Quick Flow:** - -``` -Planning (tech-spec by PM) - → Skip Solutioning - → Phase 4 (Implementation) -``` - -**BMad Method:** - -``` -Planning (prd by PM - FRs/NFRs only) - → Optional: create-ux-design (UX Designer) - → architecture (Architect) - → create-epics-and-stories (PM) - → implementation-readiness (Architect) - → Phase 4 (Implementation) -``` - -**Enterprise:** - -``` -Planning (prd by PM - FRs/NFRs only) - → Optional: create-ux-design (UX Designer) - → architecture (Architect) - → Optional: security-architecture (Architect, future) - → Optional: devops-strategy (Architect, future) - → create-epics-and-stories (PM) - → implementation-readiness (Architect) - → Phase 4 (Implementation) -``` - -**Note on TEA (Test Architect):** TEA is fully operational with 8 workflows across all phases. TEA validates architecture testability during Phase 3 reviews but does not have a dedicated solutioning workflow. TEA's primary setup occurs after architecture in Phase 3 (`*framework`, `*ci`, system-level `*test-design`), with optional Phase 2 baseline `*trace`. Testing execution happens in Phase 4 (`*atdd`, `*automate`, `*test-review`, `*trace`, `*nfr-assess`). - -**Note:** Enterprise uses the same planning and architecture as BMad Method. The only difference is optional extended workflows added AFTER architecture but BEFORE create-epics-and-stories. - -### Solutioning → Implementation Handoff - -**Documents Produced:** - -1. **architecture.md** → Guides all dev agents during implementation -2. **ADRs** (in architecture) → Referenced by agents for technical decisions -3. **Epic files** (from create-epics-and-stories) → Work breakdown into implementable units -4. **implementation-readiness.md** → Confirms readiness for Phase 4 - -**How Implementation Uses Solutioning:** - -- **sprint-planning** - Loads architecture and epic files for sprint organization -- **dev-story** - References architecture decisions and ADRs -- **code-review** - Validates code follows architectural standards - ---- - -## Best Practices - -### 1. Make Decisions Explicit - -Don't leave technology choices implicit. Document decisions with rationale in ADRs so agents understand context. - -### 2. Focus on Agent Conflicts - -Architecture's primary job is preventing conflicting implementations. Focus on cross-cutting concerns. - -### 3. Use ADRs for Key Decisions - -Every significant technology choice should have an ADR explaining "why", not just "what". - -### 4. Keep It Practical - -Don't over-architect simple projects. BMad Simple projects need simple architecture. - -### 5. Run Gate Check Before Implementation - -Catching alignment issues in solutioning is 10× faster than discovering them mid-implementation. - -### 6. Iterate Architecture - -Architecture documents are living. Update them as you learn during implementation. - ---- - -## Decision Guide - -### Quick Flow - -- **Planning:** tech-spec (PM) -- **Solutioning:** Skip entirely -- **Implementation:** sprint-planning → dev-story - -### BMad Method - -- **Planning:** prd (PM) - creates FRs/NFRs only, NOT epics -- **Solutioning:** Optional UX → architecture (Architect) → create-epics-and-stories (PM) → implementation-readiness (Architect) -- **Implementation:** sprint-planning → create-story → dev-story - -### Enterprise - -- **Planning:** prd (PM) - creates FRs/NFRs only (same as BMad Method) -- **Solutioning:** Optional UX → architecture (Architect) → Optional extended workflows (security-architecture, devops-strategy) → create-epics-and-stories (PM) → implementation-readiness (Architect) -- **Implementation:** sprint-planning → create-story → dev-story - -**Key Difference:** Enterprise adds optional extended workflows AFTER architecture but BEFORE create-epics-and-stories. Everything else is identical to BMad Method. - -**Note:** TEA (Test Architect) operates across all phases and validates architecture testability but is not a Phase 3-specific workflow. See [Test Architecture Guide](./test-architecture.md) for TEA's full lifecycle integration. - ---- - -## Common Anti-Patterns - -### ❌ Skipping Architecture for Complex Projects - -"Architecture slows us down, let's just start coding." -**Result:** Agent conflicts, inconsistent design, massive rework - -### ❌ Over-Engineering Simple Projects - -"Let me design this simple feature like a distributed system." -**Result:** Wasted time, over-engineering, analysis paralysis - -### ❌ Template-Driven Architecture - -"Fill out every section of this architecture template." -**Result:** Documentation theater, no real decisions made - -### ❌ Skipping Gate Check - -"PRD and architecture look good enough, let's start." -**Result:** Gaps discovered mid-sprint, wasted implementation time - -### ✅ Correct Approach - -- Use architecture for BMad Method and Enterprise (both required) -- Focus on decisions, not documentation volume -- Enterprise: Add optional extended workflows (test/security/devops) after architecture -- Always run gate check before implementation - ---- - -## Related Documentation - -- [Phase 2: Planning Workflows](../../../../docs/modules/bmm-bmad-method/workflows-planning.md) - Previous phase -- [Phase 4: Implementation Workflows](../../../../docs/modules/bmm-bmad-method/workflows-implementation.md) - Next phase -- [Scale Adaptive System](./scale-adaptive-system.md) - Understanding tracks -- [Agents Guide](../../../../docs/modules/bmm-bmad-method/agents-guide.md) - Complete agent reference - ---- - -## Troubleshooting - -**Q: Do I always need architecture?** -A: No. Quick Flow skips it. BMad Method and Enterprise both require it. - -**Q: How do I know if I need architecture?** -A: If you chose BMad Method or Enterprise track in planning (workflow-init), you need architecture to prevent agent conflicts. - -**Q: What's the difference between architecture and tech-spec?** -A: Tech-spec is implementation-focused for simple changes. Architecture is system design for complex multi-epic projects. - -**Q: Can I skip gate check?** -A: Only for Quick Flow. BMad Method and Enterprise both require gate check before Phase 4. - -**Q: What if gate check fails?** -A: Resolve the identified gaps (missing architecture sections, conflicting requirements) and re-run gate check. - -**Q: How long should architecture take?** -A: BMad Method: 1-2 days for architecture. Enterprise: 2-3 days total (1-2 days architecture + 0.5-1 day optional extended workflows). If taking longer, you may be over-documenting. - -**Q: Do ADRs need to be perfect?** -A: No. ADRs capture key decisions with rationale. They should be concise (1 page max per ADR). - -**Q: Can I update architecture during implementation?** -A: Yes! Architecture is living. Update it as you learn. Use `correct-course` workflow for significant changes. - ---- - -_Phase 3 Solutioning - Technical decisions before implementation._ diff --git a/docs/modules/core/index.md b/docs/modules/core/index.md deleted file mode 100644 index 07d0b9fd..00000000 --- a/docs/modules/core/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Core Module - -The Core Module is installed with all installations of BMAD modules and provides common functionality that any module, workflow, or agent can take advantage of. - -## Core Module Components - -- **[Global Core Config](global-core-config.md)** — Inheritable configuration that impacts all modules and custom content -- **[Core Workflows](core-workflows.md)** — Domain-agnostic workflows usable by any module - - [Party Mode](party-mode.md) — Multi-agent conversation orchestration - - [Brainstorming](brainstorming.md) — Structured creative sessions with 60+ techniques - - [Advanced Elicitation](advanced-elicitation.md) — LLM rethinking with 50+ reasoning methods -- **[Core Tasks](core-tasks.md)** — Common tasks available across modules - - [Index Docs](core-tasks.md#index-docs) — Generate directory index files - - [Adversarial Review](core-tasks.md#adversarial-review-general) — Critical content review - - [Shard Document](core-tasks.md#shard-document) — Split large documents into sections diff --git a/docs/modules/core/party-mode.md b/docs/modules/core/party-mode.md deleted file mode 100644 index b9ba929b..00000000 --- a/docs/modules/core/party-mode.md +++ /dev/null @@ -1,50 +0,0 @@ -# Party Mode - -**Orchestrate dynamic multi-agent conversations with your entire BMAD team.** - -Party Mode brings together all your installed BMAD agents for collaborative discussions. Instead of working with a single agent, you can engage with multiple specialized perspectives simultaneously—each agent maintaining their unique personality, expertise, and communication style. - ---- - -## When to Use It - -- Exploring complex topics that would benefit from diverse expert perspectives -- Brainstorming with agents who can build on each other's ideas -- Getting a comprehensive view across multiple domains (technical, business, creative, strategic) -- Enjoying dynamic, agent-to-agent conversations where experts challenge and complement each other - ---- - -## How It Works - -1. Party Mode loads your complete agent roster and introduces the available team members -2. You present a topic or question -3. The facilitator intelligently selects 2-3 most relevant agents based on expertise needed -4. Agents respond in character, can reference each other, and engage in natural cross-talk -5. The conversation continues until you choose to exit - ---- - -## Key Features - -- **Intelligent agent selection** — The system analyzes your topic and selects the most relevant agents based on their expertise, capabilities, and principles -- **Authentic personalities** — Each agent maintains their unique voice, communication style, and domain knowledge throughout the conversation -- **Natural cross-talk** — Agents can reference each other, build on previous points, ask questions, and even respectfully disagree -- **Optional TTS integration** — Each agent response can be read aloud with voice configurations matching their personalities -- **Graceful exit** — Sessions conclude with personalized farewells from participating agents - ---- - -## Workflow Integration - -Party Mode is a core workflow designed to be invoked and configured by other modules. When called from another workflow, it accepts contextual parameters: - -| Parameter | Description | -|-----------|-------------| -| **Topic focus** | Prebias the discussion toward a specific domain or question | -| **Additional personas** | Inject expert agents into the roster at runtime for specialized perspectives | -| **Participation constraints** | Limit which agents can contribute based on relevance | - -### Example - -A medical module workflow could invoke Party Mode with expert doctor personas added to the roster, and the conversation pre-focused on a specific diagnosis or treatment decision. The agents would then discuss the medical case with appropriate domain expertise while maintaining their distinct personalities and perspectives. diff --git a/docs/modules/bmm-bmad-method/agents-guide.md b/docs/reference/agents/index.md similarity index 71% rename from docs/modules/bmm-bmad-method/agents-guide.md rename to docs/reference/agents/index.md index 53a7db2d..1348c7a3 100644 --- a/docs/modules/bmm-bmad-method/agents-guide.md +++ b/docs/reference/agents/index.md @@ -1,98 +1,91 @@ -# BMM Agents Reference +--- +title: "Agents Reference" +description: Complete reference for BMad Method agents and their commands +--- -Quick reference of what each agent can do based on their available commands. + +Quick reference of all BMad Method agents and their available commands. --- -## Analyst (Mary) | `/bmad:bmm:agents:analyst` +## Analyst (Mary) Business analysis and research. -**Capabilities:** - +**Commands:** - `*workflow-status` - Get workflow status or initialize tracking - `*brainstorm-project` - Guided brainstorming session - `*research` - Market, domain, competitive, or technical research - `*product-brief` - Create a product brief (input for PRD) - `*document-project` - Document existing brownfield projects -- Party mode and advanced elicitation --- -## PM (John) | `/bmad:bmm:agents:pm` +## PM (John) Product requirements and planning. -**Capabilities:** - +**Commands:** - `*workflow-status` - Get workflow status or initialize tracking - `*create-prd` - Create Product Requirements Document - `*create-epics-and-stories` - Break PRD into epics and user stories (after Architecture) - `*implementation-readiness` - Validate PRD, UX, Architecture, Epics alignment - `*correct-course` - Course correction during implementation -- Party mode and advanced elicitation --- -## Architect (Winston) | `/bmad:bmm:agents:architect` +## Architect (Winston) System architecture and technical design. -**Capabilities:** - +**Commands:** - `*workflow-status` - Get workflow status or initialize tracking - `*create-architecture` - Create architecture document to guide development - `*implementation-readiness` - Validate PRD, UX, Architecture, Epics alignment - `*create-excalidraw-diagram` - System architecture or technical diagrams - `*create-excalidraw-dataflow` - Data flow diagrams -- Party mode and advanced elicitation --- -## SM (Bob) | `/bmad:bmm:agents:sm` +## SM (Bob) Sprint planning and story preparation. -**Capabilities:** - +**Commands:** - `*sprint-planning` - Generate sprint-status.yaml from epic files - `*create-story` - Create story from epic (prep for development) - `*validate-create-story` - Validate story quality - `*epic-retrospective` - Team retrospective after epic completion - `*correct-course` - Course correction during implementation -- Party mode and advanced elicitation --- -## DEV (Amelia) | `/bmad:bmm:agents:dev` +## DEV (Amelia) Story implementation and code review. -**Capabilities:** - +**Commands:** - `*dev-story` - Execute story workflow (implementation with tests) - `*code-review` - Thorough code review --- -## Quick Flow Solo Dev (Barry) | `/bmad:bmm:agents:quick-flow-solo-dev` +## Quick Flow Solo Dev (Barry) Fast solo development without handoffs. -**Capabilities:** - +**Commands:** - `*create-tech-spec` - Architect technical spec with implementation-ready stories - `*quick-dev` - Implement tech spec end-to-end solo - `*code-review` - Review and improve code --- -## TEA (Murat) | `/bmad:bmm:agents:tea` +## TEA (Murat) Test architecture and quality strategy. -**Capabilities:** - +**Commands:** - `*framework` - Initialize production-ready test framework - `*atdd` - Generate E2E tests first (before implementation) - `*automate` - Comprehensive test automation @@ -104,33 +97,31 @@ Test architecture and quality strategy. --- -## UX Designer (Sally) | `/bmad:bmm:agents:ux-designer` +## UX Designer (Sally) User experience and UI design. -**Capabilities:** - +**Commands:** - `*create-ux-design` - Generate UX design and UI plan from PRD - `*validate-design` - Validate UX specification and design artifacts - `*create-excalidraw-wireframe` - Create website or app wireframe --- -## Technical Writer (Paige) | `/bmad:bmm:agents:tech-writer` +## Technical Writer (Paige) Technical documentation and diagrams. -**Capabilities:** - -- `*document-project` - Comprehensive project documentation (brownfield analysis) -- `*generate-mermaid` - Generate Mermaid diagrams (architecture, sequence, flow, ER, class, state) +**Commands:** +- `*document-project` - Comprehensive project documentation +- `*generate-mermaid` - Generate Mermaid diagrams - `*create-excalidraw-flowchart` - Process and logic flow visualizations - `*create-excalidraw-diagram` - System architecture or technical diagrams - `*create-excalidraw-dataflow` - Data flow visualizations - `*validate-doc` - Review documentation against standards - `*improve-readme` - Review and improve README files -- `*explain-concept` - Create clear technical explanations with examples -- `*standards-guide` - Show BMAD documentation standards reference +- `*explain-concept` - Create clear technical explanations +- `*standards-guide` - Show BMAD documentation standards --- @@ -140,5 +131,11 @@ Available to all agents: - `*menu` - Redisplay menu options - `*dismiss` - Dismiss agent +- `*party-mode` - Multi-agent collaboration (most agents) -Party mode is available to most agents for multi-agent collaboration. +--- + +## Related + +- [Agent Roles](../../explanation/core-concepts/agent-roles.md) - Understanding agent responsibilities +- [What Are Agents](../../explanation/core-concepts/what-are-agents.md) - Foundational concepts diff --git a/docs/modules/core/core-tasks.md b/docs/reference/configuration/core-tasks.md similarity index 99% rename from docs/modules/core/core-tasks.md rename to docs/reference/configuration/core-tasks.md index 1d72d3a5..a5963369 100644 --- a/docs/modules/core/core-tasks.md +++ b/docs/reference/configuration/core-tasks.md @@ -1,4 +1,7 @@ -# Core Tasks +--- +title: "Core Tasks" +--- + Core Tasks are reusable task definitions that can be invoked by any BMAD module, workflow, or agent. These tasks provide standardized functionality for common operations. diff --git a/docs/modules/core/global-core-config.md b/docs/reference/configuration/global-config.md similarity index 95% rename from docs/modules/core/global-core-config.md rename to docs/reference/configuration/global-config.md index 0fc27c2e..31e3ddeb 100644 --- a/docs/modules/core/global-core-config.md +++ b/docs/reference/configuration/global-config.md @@ -1,4 +1,7 @@ -# Core Module Global Inheritable Config +--- +title: "Core Module Global Inheritable Config" +--- + The Core Modules module.yaml file defines configuration values that are useful and unique for all other modules to utilize, and by default all other modules installed will clone the values defined in the core module yaml.config into their own. It is possible for other modules to override these values, but the general intent it to accept the core module values and define their own values as needed, or extend the core values. diff --git a/docs/modules/bmm-bmad-method/glossary.md b/docs/reference/glossary/index.md similarity index 81% rename from docs/modules/bmm-bmad-method/glossary.md rename to docs/reference/glossary/index.md index d611b96c..3a36b4cd 100644 --- a/docs/modules/bmm-bmad-method/glossary.md +++ b/docs/reference/glossary/index.md @@ -1,6 +1,9 @@ -# BMM Glossary +--- +title: "BMAD Glossary" +--- -Comprehensive terminology reference for the BMad Method Module. + +Comprehensive terminology reference for the BMAD Method. --- @@ -14,11 +17,16 @@ Comprehensive terminology reference for the BMad Method Module. - [Status and Tracking](#status-and-tracking) - [Project Types](#project-types) - [Implementation Terms](#implementation-terms) +- [Game Development Terms](#game-development-terms) --- ## Core Concepts +### BMAD (Build More, Architect Dreams) + +AI-driven agile development framework with specialized agents, guided workflows, and scale-adaptive intelligence. + ### BMM (BMad Method Module) Core orchestration system for AI-driven agile development, providing comprehensive lifecycle management through specialized agents and workflows. @@ -89,7 +97,11 @@ Optional strategic planning document created in Phase 1 (Analysis) that captures ### GDD (Game Design Document) -Game development equivalent of PRD, created by Game Designer agent for game projects. +Game development equivalent of PRD, created by Game Designer agent for game projects. Comprehensive document detailing all aspects of game design: mechanics, systems, content, and more. + +### Game Brief + +Document capturing the game's core vision, pillars, target audience, and scope. Foundation for the GDD. --- @@ -115,10 +127,6 @@ Architecture design phase. Required for BMad Method and Enterprise Method tracks Sprint-based development through story-by-story iteration. Uses sprint-planning, create-story, dev-story, code-review, and retrospective workflows. -### Documentation (Prerequisite for Brownfield) - -**Conditional prerequisite for brownfield projects.** Creates comprehensive codebase documentation before planning. Only required if existing documentation is insufficient for AI agents. Uses the `document-project` workflow. - ### Quick Spec Flow Fast-track workflow system for Quick Flow track projects that goes straight from idea to tech-spec to implementation, bypassing heavy planning. Designed for bug fixes, small features, and rapid prototyping. @@ -153,7 +161,7 @@ Agent responsible for test strategy, quality gates, NFR assessment, and comprehe ### Technical Writer -Agent specialized in creating and maintaining high-quality technical documentation. Expert in documentation standards, information architecture, and professional technical writing. The agent's internal name is "paige" but is presented as "Technical Writer" to users. +Agent specialized in creating and maintaining high-quality technical documentation. Expert in documentation standards, information architecture, and professional technical writing. ### UX Designer @@ -163,13 +171,17 @@ Agent that creates UX design documents, interaction patterns, and visual specifi Specialized agent for game development projects. Creates game design documents (GDD) and game-specific workflows. +### Game Architect + +Agent that designs game system architecture, creates technical architecture for games, and validates game-specific designs. + ### BMad Master Meta-level orchestrator agent from BMad Core. Facilitates party mode, lists available tasks and workflows, and provides high-level guidance across all modules. ### Party Mode -Multi-agent collaboration feature where all installed agents (19+ from BMM, CIS, BMB, custom modules) discuss challenges together in real-time. BMad Master orchestrates, selecting 2-3 relevant agents per message for natural cross-talk and debate. Best for strategic decisions, creative brainstorming, cross-functional alignment, and complex problem-solving. See [Party Mode Guide](./party-mode.md). +Multi-agent collaboration feature where all installed agents discuss challenges together in real-time. BMad Master orchestrates, selecting 2-3 relevant agents per message for natural cross-talk and debate. Best for strategic decisions, creative brainstorming, cross-functional alignment, and complex problem-solving. --- @@ -190,7 +202,7 @@ backlog → ready-for-dev → in-progress → review → done ``` - **backlog** - Story exists in epic but not yet created -- **ready-for-dev** - Story file created via create-story; validation is optional (run `validate-create-story` for quality check before dev picks it up) +- **ready-for-dev** - Story file created via create-story; validation is optional - **in-progress** - DEV is implementing via dev-story - **review** - Implementation complete, awaiting code-review - **done** - Completed with DoD met @@ -247,6 +259,10 @@ Implementation guidance embedded within story files during the create-story work Workflow that initializes Phase 4 implementation by creating sprint-status.yaml, extracting all epics/stories from planning docs, and setting up tracking infrastructure. +### Sprint + +Time-boxed period of development work, typically 1-2 weeks. + ### Gate Check Validation workflow (implementation-readiness) run before Phase 4 to ensure PRD + Architecture + Epics + UX (optional) are aligned with no gaps or contradictions. Required for BMad Method and Enterprise Method tracks. @@ -261,6 +277,66 @@ Criteria that must be met before marking a story as done. Typically includes: im --- +## Game Development Terms + +### Core Fantasy + +The emotional experience players seek from your game. What they want to FEEL. + +### Core Loop + +The fundamental cycle of actions players repeat throughout gameplay. The heart of your game. + +### Design Pillar + +Core principle that guides all design decisions. Typically 3-5 pillars define a game's identity. + +### Game Type + +Genre classification that determines which specialized GDD sections are included. + +### Narrative Complexity + +How central story is to the game experience: +- **Critical** - Story IS the game (visual novels) +- **Heavy** - Deep narrative with gameplay (RPGs) +- **Moderate** - Meaningful story supporting gameplay +- **Light** - Minimal story, gameplay-focused + +### Environmental Storytelling + +Narrative communicated through the game world itself—visual details, audio, found documents—rather than explicit dialogue. + +### MDA Framework + +Mechanics → Dynamics → Aesthetics. Framework for analyzing and designing games. + +### Procedural Generation + +Algorithmic creation of game content (levels, items, characters) rather than hand-crafted. + +### Roguelike + +Genre featuring procedural generation, permadeath, and run-based progression. + +### Metroidvania + +Genre featuring interconnected world exploration with ability-gated progression. + +### Meta-Progression + +Persistent progression that carries between individual runs or sessions. + +### Permadeath + +Game mechanic where character death is permanent, typically requiring a new run. + +### Player Agency + +The degree to which players can make meaningful choices that affect outcomes. + +--- + ## Additional Terms ### Workflow Status @@ -279,10 +355,6 @@ Automatic analysis by workflow-init that uses keyword analysis, complexity indic Workflow run during Phase 4 when significant changes or issues arise. Analyzes impact, proposes solutions, and routes to appropriate remediation workflows. -### Migration Strategy - -Plan for handling changes to existing data, schemas, APIs, or patterns during brownfield development. Critical for ensuring backward compatibility and smooth rollout. - ### Feature Flags Implementation technique for brownfield projects that allows gradual rollout of new functionality, easy rollback, and A/B testing. Recommended for BMad Method and Enterprise brownfield changes. @@ -294,13 +366,3 @@ Specific locations where new code connects with existing systems. Must be docume ### Convention Detection Quick Spec Flow feature that automatically detects existing code style, naming conventions, patterns, and frameworks from brownfield codebases, then asks user to confirm before proceeding. - ---- - -## Related Documentation - -- [Quick Start Guide](./quick-start.md) - Learn BMM basics -- [Scale Adaptive System](./scale-adaptive-system.md) - Deep dive on tracks and complexity -- [Brownfield Guide](./brownfield-guide.md) - Working with existing codebases -- [Quick Spec Flow](./quick-spec-flow.md) - Fast-track for Quick Flow track -- [FAQ](./faq.md) - Common questions diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 00000000..d1b3c449 --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,26 @@ +--- +title: "Reference" +--- + + +Information-oriented documentation for looking up facts, specifications, and details. + +## Agents + +Technical reference for all BMAD agents. + +## Workflows + +Technical reference for all BMAD workflows. + +## Configuration + +Configuration options and settings. + +## Glossary + +Definitions of BMAD terminology. + +## FAQ + +Frequently asked questions organized by topic. diff --git a/docs/modules/bmgd-bmad-game-dev/workflows-guide.md b/docs/reference/workflows/bmgd-workflows.md similarity index 94% rename from docs/modules/bmgd-bmad-game-dev/workflows-guide.md rename to docs/reference/workflows/bmgd-workflows.md index d649bc09..bd96d03e 100644 --- a/docs/modules/bmgd-bmad-game-dev/workflows-guide.md +++ b/docs/reference/workflows/bmgd-workflows.md @@ -1,4 +1,7 @@ -# BMGD Workflows Guide +--- +title: "BMGD Workflows Guide" +--- + Complete reference for all BMGD workflows organized by development phase. @@ -8,7 +11,7 @@ Complete reference for all BMGD workflows organized by development phase. BMGD workflows are organized into four phases: -![BMGD Workflow Overview](./workflow-overview.jpg) +![BMGD Workflow Overview](../../tutorials/getting-started/images/workflow-overview.jpg) --- @@ -259,7 +262,7 @@ Checks current project status across all phases. Shows completed documents, curr ## Quick-Flow Workflows -Fast-track workflows that skip full planning phases. See **[Quick-Flow Guide](../../../../docs/modules/bmgd-bmad-game-dev/quick-flow-guide.md)** for detailed usage. +Fast-track workflows that skip full planning phases. See **[Quick-Flow Guide](../../how-to/workflows/bmgd-quick-flow.md)** for detailed usage. ### Quick-Prototype @@ -457,7 +460,7 @@ This means: ## Next Steps -- **[Quick Start Guide](../../../../docs/modules/bmgd-bmad-game-dev/quick-start.md)** - Get started with BMGD -- **[Quick-Flow Guide](../../../../docs/modules/bmgd-bmad-game-dev/quick-flow-guide.md)** - Rapid prototyping and development -- **[Agents Guide](../../../../docs/modules/bmgd-bmad-game-dev/agents-guide.md)** - Agent reference -- **[Game Types Guide](../../../../docs/modules/bmgd-bmad-game-dev/game-types-guide.md)** - Game type templates +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Get started with BMGD +- **[Quick-Flow Guide](../../how-to/workflows/bmgd-quick-flow.md)** - Rapid prototyping and development +- **[Agents Guide](../../explanation/game-dev/agents.md)** - Agent reference +- **[Game Types Guide](../../explanation/game-dev/game-types.md)** - Game type templates diff --git a/docs/modules/core/core-workflows.md b/docs/reference/workflows/core-workflows.md similarity index 86% rename from docs/modules/core/core-workflows.md rename to docs/reference/workflows/core-workflows.md index a0e5d42d..46852179 100644 --- a/docs/modules/core/core-workflows.md +++ b/docs/reference/workflows/core-workflows.md @@ -1,18 +1,21 @@ -# Core Workflows +--- +title: "Core Workflows" +--- + Core Workflows are domain-agnostic workflows that can be utilized by any BMAD-compliant module, workflow, or agent. These workflows are installed by default and available at any time. ## Available Core Workflows -### [Party Mode](party-mode.md) +### [Party Mode](../../explanation/features/party-mode.md) Orchestrate dynamic multi-agent conversations with your entire BMAD team. Engage with multiple specialized perspectives simultaneously—each agent maintaining their unique personality, expertise, and communication style. -### [Brainstorming](brainstorming.md) +### [Brainstorming](../../explanation/features/brainstorming-techniques.md) Facilitate structured creative sessions using 60+ proven ideation techniques. The AI acts as coach and guide, using proven creativity methods to draw out ideas and insights that are already within you. -### [Advanced Elicitation](advanced-elicitation.md) +### [Advanced Elicitation](../../explanation/features/advanced-elicitation.md) Push the LLM to rethink its work through 50+ reasoning methods—the inverse of brainstorming. The LLM applies sophisticated techniques to re-examine and enhance content it has just generated, essentially "LLM brainstorming" to find better approaches and uncover improvements. diff --git a/docs/modules/bmm-bmad-method/workflow-document-project-reference.md b/docs/reference/workflows/document-project.md similarity index 90% rename from docs/modules/bmm-bmad-method/workflow-document-project-reference.md rename to docs/reference/workflows/document-project.md index c835607f..de803f75 100644 --- a/docs/modules/bmm-bmad-method/workflow-document-project-reference.md +++ b/docs/reference/workflows/document-project.md @@ -1,4 +1,7 @@ -# Document Project Workflow - Technical Reference +--- +title: "Document Project Workflow - Technical Reference" +--- + **Module:** BMM (BMAD Method Module) @@ -67,5 +70,5 @@ The workflow can be interrupted and resumed without losing progress: **Related Documentation:** -- [Brownfield Development Guide](./brownfield-guide.md) -- [Implementation Workflows](./workflows-implementation.md) +- [Brownfield Development Guide](../../how-to/brownfield/index.md) +- [Implementation Workflows](../../how-to/workflows/run-sprint-planning.md) diff --git a/docs/reference/workflows/index.md b/docs/reference/workflows/index.md new file mode 100644 index 00000000..bebce541 --- /dev/null +++ b/docs/reference/workflows/index.md @@ -0,0 +1,16 @@ +--- +title: "Workflows Reference" +description: Reference documentation for BMad Method workflows +--- + + +Complete reference documentation for all BMad Method workflows. + +## Core Workflows + +- [Core Workflows](./core-workflows.md) - Domain-agnostic workflows available to all modules +- [Document Project](./document-project.md) - Brownfield project documentation workflow + +## Module-Specific Workflows + +- [BMGD Workflows](./bmgd-workflows.md) - Game development workflows diff --git a/docs/tutorials/advanced/create-custom-agent.md b/docs/tutorials/advanced/create-custom-agent.md new file mode 100644 index 00000000..d68e22dc --- /dev/null +++ b/docs/tutorials/advanced/create-custom-agent.md @@ -0,0 +1,171 @@ +--- +title: "Create a Custom Agent" +--- + + +Build your own AI agent with a unique personality, specialized commands, and optional persistent memory using the BMad Builder workflow. + +:::note[BMB Module] +This tutorial uses the **BMad Builder (BMB)** module. Make sure you have BMAD installed with the BMB module enabled. +::: + +## What You'll Learn + +- How to run the `create-agent` workflow +- Choose between Simple, Expert, and Module agent types +- Define your agent's persona (role, identity, communication style, principles) +- Package and install your custom agent +- Test and iterate on your agent's behavior + +:::note[Prerequisites] +- BMAD installed with the BMB module +- An idea for what you want your agent to do +- About 15-30 minutes for your first agent +::: + +:::tip[Quick Path] +Run `create-agent` workflow → Follow the guided steps → Install your agent module → Test and iterate. +::: + +## Understanding Agent Types + +Before creating your agent, understand the three types available: + +| Type | Best For | Memory | Complexity | +| ---------- | ------------------------------------- | ---------- | ---------- | +| **Simple** | Focused tasks, quick setup | None | Low | +| **Expert** | Specialized domains, ongoing projects | Persistent | Medium | +| **Module** | Building other agents/workflows | Persistent | High | + +**Simple Agent** - Use when your task is well-defined and focused. Perfect for single-purpose assistants like commit message generators or code reviewers. + +**Expert Agent** - Use when your domain requires specialized knowledge or you need memory across sessions. Great for roles like Security Architect or Documentation Lead. + +**Module Agent** - Use when your agent builds other agents or needs deep integration with the module system. + +## Step 1: Start the Workflow + +In your IDE (Claude Code, Cursor, etc.), invoke the create-agent workflow with the agent-builder agent. + +The workflow guides you through eight steps: + +| Step | What You'll Do | +| --------------------------- | -------------------------------------------- | +| **Brainstorm** *(optional)* | Explore ideas with creative techniques | +| **Discovery** | Define the agent's purpose and goals | +| **Type & Metadata** | Choose Simple or Expert, name your agent | +| **Persona** | Craft the agent's personality and principles | +| **Commands** | Define what the agent can do | +| **Activation** | Set up autonomous behaviors *(optional)* | +| **Build** | Generate the agent file | +| **Validation** | Review and verify everything works | + +:::tip[Workflow Options] +At each step, the workflow provides options: +- **[A] Advanced** - Get deeper insights and reasoning +- **[P] Party** - Get multiple agent perspectives +- **[C] Continue** - Move to the next step +::: + +## Step 2: Define the Persona + +Your agent's personality is defined by four fields: + +| Field | Purpose | Example | +| ----------------------- | -------------- | ----------------------------------------------------------------- | +| **Role** | What they do | "Senior code reviewer who catches bugs and suggests improvements" | +| **Identity** | Who they are | "Friendly but exacting, believes clean code is a craft" | +| **Communication Style** | How they speak | "Direct, constructive, explains the 'why' behind suggestions" | +| **Principles** | Why they act | "Security first, clarity over cleverness, test what you fix" | + +Keep each field focused on its purpose. The role isn't personality; the identity isn't job description. + +:::note[Writing Great Principles] +The first principle should "activate" the agent's expertise: + +- **Weak:** "Be helpful and accurate" +- **Strong:** "Channel decades of security expertise: threat modeling begins with trust boundaries, never trust client input, defense in depth is non-negotiable" +::: + +## Step 3: Install Your Agent + +Once created, package your agent for installation: + +``` +my-custom-stuff/ +├── module.yaml # Contains: unitary: true +├── agents/ +│ └── {agent-name}/ +│ ├── {agent-name}.agent.yaml +│ └── _memory/ # Expert agents only +│ └── {sidecar-folder}/ +└── workflows/ # Optional: custom workflows +``` + +Install using the BMAD installer, then invoke your new agent in your IDE. + +## What You've Accomplished + +You've created a custom AI agent with: + +- A defined purpose and role in your workflow +- A unique persona with communication style and principles +- Custom menu commands for your specific tasks +- Optional persistent memory for ongoing context + +Your project now includes: + +``` +_bmad/ +├── _config/ +│ └── agents/ +│ └── {your-agent}/ # Your agent customizations +└── {module}/ + └── agents/ + └── {your-agent}/ + └── {your-agent}.agent.yaml +``` + +## Quick Reference + +| Action | How | +| ------------------- | ---------------------------------------------- | +| Start workflow | `"Run the BMAD Builder create-agent workflow"` | +| Edit agent directly | Modify `{agent-name}.agent.yaml` | +| Edit customization | Modify `_bmad/_config/agents/{agent-name}` | +| Rebuild agent | `npx bmad-method build ` | +| Study examples | Check `src/modules/bmb/reference/agents/` | + +## Common Questions + +**Should I start with Simple or Expert?** +Start with Simple for your first agent. You can always upgrade to Expert later if you need persistent memory. + +**How do I add more commands later?** +Edit the agent YAML directly or use the customization file in `_bmad/_config/agents/`. Then rebuild. + +**Can I share my agent with others?** +Yes. Package your agent as a standalone module and share it with your team or the community. + +**Where can I see example agents?** +Study the reference agents in `src/modules/bmb/reference/agents/`: +- [commit-poet](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/simple-examples/commit-poet.agent.yaml) (Simple) +- [journal-keeper](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/expert-examples/journal-keeper) (Expert) + +## Getting Help + +- **[Discord Community](https://discord.gg/gk8jAdXWmj)** - Ask in #general-dev or #bugs-issues +- **[GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues)** - Report bugs or request features + +## Further Reading + +- **[What Are Agents](../../explanation/core-concepts/what-are-agents.md)** - Deep technical details on agent types +- **[Agent Customization](../../how-to/customization/customize-agents.md)** - Modify agents without editing core files +- **[Custom Content Installation](../../how-to/installation/install-custom-modules.md)** - Package and distribute your agents + +:::tip[Key Takeaways] +- **Start small** - Your first agent should solve one problem well +- **Persona matters** - Strong principles activate the agent's expertise +- **Iterate often** - Test your agent and refine based on behavior +- **Learn from examples** - Study reference agents before building your own +::: diff --git a/docs/tutorials/getting-started/getting-started-bmadv4.md b/docs/tutorials/getting-started/getting-started-bmadv4.md new file mode 100644 index 00000000..40bb9cb4 --- /dev/null +++ b/docs/tutorials/getting-started/getting-started-bmadv4.md @@ -0,0 +1,247 @@ +--- +title: "Getting Started with BMad v4" +description: Install BMad and create your first planning document +--- + + +Build software faster using AI-powered workflows with specialized agents that guide you through planning, architecture, and implementation. + +:::note[Stable Release] +This tutorial covers BMad v4, the current stable release. For the latest features (with potential breaking changes), see the [BMad v6 Alpha tutorial](./getting-started-bmadv6.md). +::: + +## What You'll Learn + +- Install and configure BMad for your IDE +- Understand how BMad organizes work into phases and agents +- Initialize a project and choose a planning track +- Create your first requirements document + +:::note[Prerequisites] +- **Node.js 20+** — Required for the installer +- **Git** — Recommended for version control +- **AI-powered IDE** — Claude Code, Cursor, Windsurf, or similar +- **A project idea** — Even a simple one works for learning +::: + +:::tip[Quick Path] +**Install** → `npx bmad-method install` +**Initialize** → Load Analyst agent, run `workflow-init` +**Plan** → PM creates PRD, Architect creates architecture +**Build** → SM manages sprints, DEV implements stories +**Always use fresh chats** for each workflow to avoid context issues. +::: + +## Understanding BMad + +BMad helps you build software through guided workflows with specialized AI agents. The process follows four phases: + +| Phase | Name | What Happens | +|-------|------|--------------| +| 1 | Analysis | Brainstorm, research *(optional)* | +| 2 | Planning | Requirements — PRD or tech-spec *(required)* | +| 3 | Solutioning | Architecture, design decisions *(varies by track)* | +| 4 | Implementation | Build code story by story *(required)* | + +Based on your project's complexity, BMad offers three planning tracks: + +| Track | Best For | Documents Created | +|-------|----------|-------------------| +| **Quick Flow** | Bug fixes, simple features, clear scope | Tech-spec only | +| **BMad Method** | Products, platforms, complex features | PRD + Architecture + UX | +| **Enterprise** | Compliance, multi-tenant, enterprise needs | PRD + Architecture + Security + DevOps | + +## Installation + +Open a terminal in your project directory and run: + +```bash +npx bmad-method install +``` + +The interactive installer guides you through setup: + +- **Choose Installation Location** — Select current directory (recommended), subdirectory, or custom path +- **Select Your AI Tool** — Claude Code, Cursor, Windsurf, or other +- **Choose Modules** — Select **BMM** (BMad Method) for this tutorial +- **Accept Defaults** — Customize later in `_bmad/[module]/config.yaml` + +Verify your installation: + +``` +your-project/ +├── _bmad/ +│ ├── bmm/ # Method module +│ │ ├── agents/ # Agent files +│ │ ├── workflows/ # Workflow files +│ │ └── config.yaml # Module config +│ └── core/ # Core utilities +├── _bmad-output/ # Generated artifacts (created later) +└── .claude/ # IDE configuration (if using Claude Code) +``` + +:::tip[Troubleshooting] +Having issues? See [Install BMad](../../how-to/installation/install-bmad.md) for common solutions. +::: + +## Step 1: Initialize Your Project + +Load the **Analyst agent** in your IDE: +- **Claude Code**: Type `/analyst` or load the agent file directly +- **Cursor/Windsurf**: Open the agent file from `_bmad/bmm/agents/` + +Wait for the agent's menu to appear, then run: + +``` +Run workflow-init +``` + +Or use the shorthand: `*workflow-init` + +The workflow asks you to describe: +- **Your project and goals** — What are you building? What problem does it solve? +- **Existing codebase** — Is this new (greenfield) or existing code (brownfield)? +- **Size and complexity** — Roughly how big is this? (adjustable later) + +Based on your description, the workflow suggests a planning track. For this tutorial, choose **BMad Method**. + +Once you confirm, the workflow creates `bmm-workflow-status.yaml` to track your progress. + +:::caution[Fresh Chats] +Always start a fresh chat for each workflow. This prevents context limitations from causing issues. +::: + +## Step 2: Create Your Plan + +With your project initialized, work through the planning phases. + +### Phase 1: Analysis (Optional) + +If you want to brainstorm or research first: +- **brainstorm-project** — Guided ideation with the Analyst +- **research** — Market and technical research +- **product-brief** — Recommended foundation document + +### Phase 2: Planning (Required) + +**Start a fresh chat** and load the **PM agent**. + +``` +Run prd +``` + +Or use shortcuts: `*prd`, select "create-prd" from the menu, or say "Let's create a PRD". + +The PM agent guides you through: +1. **Project overview** — Refine your project description +2. **Goals and success metrics** — What does success look like? +3. **User personas** — Who uses this product? +4. **Functional requirements** — What must the system do? +5. **Non-functional requirements** — Performance, security, scalability needs + +When complete, you'll have `PRD.md` in your `_bmad-output/` folder. + +:::note[UX Design (Optional)] +If your project has a user interface, load the **UX-Designer agent** and run the UX design workflow after creating your PRD. +::: + +### Phase 3: Solutioning (Required for BMad Method) + +**Start a fresh chat** and load the **Architect agent**. + +``` +Run create-architecture +``` + +The architect guides you through technical decisions: tech stack, database design, API patterns, and system structure. + +:::tip[Check Your Status] +Unsure what's next? Load any agent and run `workflow-status`. It tells you the next recommended or required workflow. +::: + +## Step 3: Build Your Project + +Once planning is complete, move to implementation. + +### Initialize Sprint Planning + +Load the **SM agent** and run `sprint-planning`. This creates `sprint-status.yaml` to track all epics and stories. + +### The Build Cycle + +For each story, repeat this cycle with fresh chats: + +| Step | Agent | Workflow | Purpose | +|------|-------|----------|---------| +| 1 | SM | `create-story` | Create story file from epic | +| 2 | DEV | `dev-story` | Implement the story | +| 3 | DEV | `code-review` | Quality validation *(recommended)* | + +After completing all stories in an epic, load the **SM agent** and run `retrospective`. + +## What You've Accomplished + +You've learned the foundation of building with BMad: + +- Installed BMad and configured it for your IDE +- Initialized a project with your chosen planning track +- Created planning documents (PRD, Architecture) +- Understood the build cycle for implementation + +Your project now has: + +``` +your-project/ +├── _bmad/ # BMad configuration +├── _bmad-output/ +│ ├── PRD.md # Your requirements document +│ ├── architecture.md # Technical decisions +│ └── bmm-workflow-status.yaml # Progress tracking +└── ... +``` + +## Quick Reference + +| Command | Agent | Purpose | +|---------|-------|---------| +| `*workflow-init` | Analyst | Initialize a new project | +| `*workflow-status` | Any | Check progress and next steps | +| `*prd` | PM | Create Product Requirements Document | +| `*create-architecture` | Architect | Create architecture document | +| `*sprint-planning` | SM | Initialize sprint tracking | +| `*create-story` | SM | Create a story file | +| `*dev-story` | DEV | Implement a story | +| `*code-review` | DEV | Review implemented code | + +## Common Questions + +**Do I need to create a PRD for every project?** +Only for BMad Method and Enterprise tracks. Quick Flow projects use a simpler tech-spec instead. + +**Can I skip Phase 1 (Analysis)?** +Yes, Phase 1 is optional. If you already know what you're building, start with Phase 2 (Planning). + +**What if I want to brainstorm first?** +Load the Analyst agent and run `*brainstorm-project` before `workflow-init`. + +**Why start fresh chats for each workflow?** +Workflows are context-intensive. Reusing chats can cause the AI to hallucinate or lose track of details. Fresh chats ensure maximum context capacity. + +## Getting Help + +- **During workflows** — Agents guide you with questions and explanations +- **Check status** — Run `workflow-status` with any agent +- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#general-dev, #bugs-issues) +- **Video tutorials** — [BMad Code YouTube](https://www.youtube.com/@BMadCode) + +## Key Takeaways + +:::tip[Remember These] +- **Always use fresh chats** — Load agents in new chats for each workflow +- **Let workflow-status guide you** — Ask any agent for status when unsure +- **Track matters** — Quick Flow uses tech-spec; Method/Enterprise need PRD and architecture +- **Tracking is automatic** — Status files update themselves +- **Agents are flexible** — Use menu numbers, shortcuts (`*prd`), or natural language +::: + +Ready to start? Install BMad, load the Analyst, run `workflow-init`, and let the agents guide you. diff --git a/docs/tutorials/getting-started/getting-started-bmadv6.md b/docs/tutorials/getting-started/getting-started-bmadv6.md new file mode 100644 index 00000000..4679f893 --- /dev/null +++ b/docs/tutorials/getting-started/getting-started-bmadv6.md @@ -0,0 +1,247 @@ +--- +title: "Getting Started with BMad v6 Alpha" +description: Install BMad v6 Alpha and build your first project +--- + + +Build software faster using AI-powered workflows with specialized agents that guide you through planning, architecture, and implementation. + +:::caution[Alpha Software] +BMad v6 is currently in **alpha**. Expect breaking changes, incomplete features, and evolving documentation. For a stable experience, use the [BMad v4 tutorial](./getting-started-bmadv4.md) instead. +::: + +## What You'll Learn + +- Install and initialize BMad Method for a new project +- Choose the right planning track for your project size +- Progress through phases from requirements to working code +- Use agents and workflows effectively + +:::note[Prerequisites] +- **Node.js 20+** — Required for the installer +- **Git** — Recommended for version control +- **AI-powered IDE** — Claude Code, Cursor, Windsurf, or similar +- **A project idea** — Even a simple one works for learning +::: + +:::tip[Quick Path] +**Install** → `npx bmad-method@alpha install` +**Initialize** → Load Analyst agent, run `workflow-init` +**Plan** → PM creates PRD, Architect creates architecture +**Build** → SM manages sprints, DEV implements stories +**Always use fresh chats** for each workflow to avoid context issues. +::: + +## Understanding BMad + +BMad helps you build software through guided workflows with specialized AI agents. The process follows four phases: + +| Phase | Name | What Happens | +|-------|------|--------------| +| 1 | Analysis | Brainstorming, research, product brief *(optional)* | +| 2 | Planning | Create requirements (PRD or tech-spec) | +| 3 | Solutioning | Design architecture *(BMad Method/Enterprise only)* | +| 4 | Implementation | Build epic by epic, story by story | + +![BMad Method Workflow - Standard Greenfield](./images/workflow-method-greenfield.svg) + +*Complete visual flowchart showing all phases, workflows, and agents for the standard greenfield track.* + +Based on your project's complexity, BMad offers three planning tracks: + +| Track | Best For | Documents Created | +|-------|----------|-------------------| +| **Quick Flow** | Bug fixes, simple features, clear scope (1-15 stories) | Tech-spec only | +| **BMad Method** | Products, platforms, complex features (10-50+ stories) | PRD + Architecture + UX | +| **Enterprise** | Compliance, multi-tenant systems (30+ stories) | PRD + Architecture + Security + DevOps | + +:::note +Story counts are guidance, not definitions. Choose your track based on planning needs, not story math. +::: + +## Installation + +Open a terminal in your project directory and run: + +```bash +npx bmad-method@alpha install +``` + +The interactive installer guides you through setup and creates a `_bmad/` folder with all agents and workflows. + +Verify your installation: + +``` +your-project/ +├── _bmad/ +│ ├── bmm/ # Method module +│ │ ├── agents/ # Agent files +│ │ ├── workflows/ # Workflow files +│ │ └── config.yaml # Module config +│ └── core/ # Core utilities +├── _bmad-output/ # Generated artifacts (created later) +└── .claude/ # IDE configuration (if using Claude Code) +``` + +:::tip[Troubleshooting] +Having issues? See [Install BMad](../../how-to/installation/install-bmad.md) for common solutions. +::: + +## Step 1: Initialize Your Project + +Load the **Analyst agent** in your IDE, wait for the menu, then run `workflow-init`. + +:::note[How to Load Agents] +Type `/` in your IDE and use autocomplete. Not sure what's available? Start with `/bmad` to see all agents and workflows. +::: + +The workflow asks you to describe your project, whether it's new or existing, and the general complexity. Based on your description, it recommends a planning track. + +Once you confirm, the workflow creates `bmm-workflow-status.yaml` to track your progress through all phases. + +:::caution[Fresh Chats] +Always start a fresh chat for each workflow. This prevents context limitations from causing issues. +::: + +## Step 2: Create Your Plan + +After initialization, work through phases 1-3. **Use fresh chats for each workflow.** + +:::tip[Check Your Status] +Unsure what's next? Load any agent and ask for `workflow-status`. It tells you the next recommended or required workflow. +::: + +### Phase 1: Analysis (Optional) + +All workflows in this phase are optional: +- **brainstorm-project** — Guided ideation +- **research** — Market and technical research +- **product-brief** — Recommended foundation document + +### Phase 2: Planning (Required) + +**For BMad Method and Enterprise tracks:** +1. Load the **PM agent** in a new chat +2. Run the PRD workflow: `*prd` +3. Output: `PRD.md` + +**For Quick Flow track:** +- Use `tech-spec` instead of PRD, then skip to implementation + +:::note[UX Design (Optional)] +If your project has a user interface, load the **UX-Designer agent** and run the UX design workflow after creating your PRD. +::: + +### Phase 3: Solutioning (BMad Method/Enterprise) + +**Create Architecture** +1. Load the **Architect agent** in a new chat +2. Run `create-architecture` +3. Output: Architecture document with technical decisions + +**Create Epics and Stories** + +:::tip[V6 Improvement] +Epics and stories are now created *after* architecture. This produces better quality stories because architecture decisions (database, API patterns, tech stack) directly affect how work should be broken down. +::: + +1. Load the **PM agent** in a new chat +2. Run `create-epics-and-stories` +3. The workflow uses both PRD and Architecture to create technically-informed stories + +**Implementation Readiness Check** *(Highly Recommended)* +1. Load the **Architect agent** in a new chat +2. Run `implementation-readiness` +3. Validates cohesion across all planning documents + +## Step 3: Build Your Project + +Once planning is complete, move to implementation. **Each workflow should run in a fresh chat.** + +### Initialize Sprint Planning + +Load the **SM agent** and run `sprint-planning`. This creates `sprint-status.yaml` to track all epics and stories. + +### The Build Cycle + +For each story, repeat this cycle with fresh chats: + +| Step | Agent | Workflow | Purpose | +|------|-------|----------|---------| +| 1 | SM | `create-story` | Create story file from epic | +| 2 | DEV | `dev-story` | Implement the story | +| 3 | TEA | `automate` | Generate guardrail tests *(optional)* | +| 4 | DEV | `code-review` | Quality validation *(recommended)* | + +After completing all stories in an epic, load the **SM agent** and run `retrospective`. + +## What You've Accomplished + +You've learned the foundation of building with BMad: + +- Installed BMad and configured it for your IDE +- Initialized a project with your chosen planning track +- Created planning documents (PRD, Architecture, Epics & Stories) +- Understood the build cycle for implementation + +Your project now has: + +``` +your-project/ +├── _bmad/ # BMad configuration +├── _bmad-output/ +│ ├── PRD.md # Your requirements document +│ ├── architecture.md # Technical decisions +│ ├── epics/ # Epic and story files +│ ├── bmm-workflow-status.yaml # Phase progress tracking +│ └── sprint-status.yaml # Sprint tracking +└── ... +``` + +## Quick Reference + +| Command | Agent | Purpose | +|---------|-------|---------| +| `*workflow-init` | Analyst | Initialize a new project | +| `*workflow-status` | Any | Check progress and next steps | +| `*prd` | PM | Create Product Requirements Document | +| `*create-architecture` | Architect | Create architecture document | +| `*create-epics-and-stories` | PM | Break down PRD into epics | +| `*implementation-readiness` | Architect | Validate planning cohesion | +| `*sprint-planning` | SM | Initialize sprint tracking | +| `*create-story` | SM | Create a story file | +| `*dev-story` | DEV | Implement a story | +| `*code-review` | DEV | Review implemented code | + +## Common Questions + +**Do I always need architecture?** +Only for BMad Method and Enterprise tracks. Quick Flow skips from tech-spec to implementation. + +**Can I change my plan later?** +Yes. The SM agent has a `correct-course` workflow for handling scope changes. + +**What if I want to brainstorm first?** +Load the Analyst agent and run `brainstorm-project` before `workflow-init`. + +**Can I skip workflow-init and workflow-status?** +Yes, once you learn the flow. Use the Quick Reference to go directly to needed workflows. + +## Getting Help + +- **During workflows** — Agents guide you with questions and explanations +- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#general-dev, #bugs-issues) +- **Documentation** — [BMM Workflow Reference](../../reference/workflows/index.md) +- **Video tutorials** — [BMad Code YouTube](https://www.youtube.com/@BMadCode) + +## Key Takeaways + +:::tip[Remember These] +- **Always use fresh chats** — Load agents in new chats for each workflow +- **Let workflow-status guide you** — Ask any agent for status when unsure +- **Track matters** — Quick Flow uses tech-spec; Method/Enterprise need PRD and architecture +- **Tracking is automatic** — Status files update themselves +- **Agents are flexible** — Use menu numbers, shortcuts (`*prd`), or natural language +::: + +Ready to start? Install BMad, load the Analyst, run `workflow-init`, and let the agents guide you. diff --git a/docs/modules/bmm-bmad-method/images/workflow-method-greenfield.excalidraw b/docs/tutorials/getting-started/images/workflow-method-greenfield.excalidraw similarity index 100% rename from docs/modules/bmm-bmad-method/images/workflow-method-greenfield.excalidraw rename to docs/tutorials/getting-started/images/workflow-method-greenfield.excalidraw diff --git a/docs/modules/bmm-bmad-method/images/workflow-method-greenfield.svg b/docs/tutorials/getting-started/images/workflow-method-greenfield.svg similarity index 100% rename from docs/modules/bmm-bmad-method/images/workflow-method-greenfield.svg rename to docs/tutorials/getting-started/images/workflow-method-greenfield.svg diff --git a/docs/modules/bmgd-bmad-game-dev/workflow-overview.jpg b/docs/tutorials/getting-started/images/workflow-overview.jpg similarity index 100% rename from docs/modules/bmgd-bmad-game-dev/workflow-overview.jpg rename to docs/tutorials/getting-started/images/workflow-overview.jpg diff --git a/docs/tutorials/getting-started/quick-start-bmgd.md b/docs/tutorials/getting-started/quick-start-bmgd.md new file mode 100644 index 00000000..a67c7d78 --- /dev/null +++ b/docs/tutorials/getting-started/quick-start-bmgd.md @@ -0,0 +1,260 @@ +--- +title: "Getting Started with BMad Game Development" +description: Build games with BMad's Game Development Module +--- + + +Build games faster using AI-powered workflows with specialized game development agents that guide you through preproduction, design, architecture, and implementation. + +:::note[Module Extension] +BMGD (BMad Game Development) is a module that extends BMad Method. You'll need BMad installed first—see the [BMad v4 tutorial](./getting-started-bmadv4.md) or [BMad v6 tutorial](./getting-started-bmadv6.md) if you haven't installed it yet. +::: + +## What You'll Learn + +- Install and configure the BMGD module +- Understand game development phases and specialized agents +- Create a Game Brief and Game Design Document (GDD) +- Progress from concept to working game code + +:::note[Prerequisites] +- **BMad Method installed** — Follow the main installation guide first +- **A game idea** — Even a rough concept is enough to start +- **AI-powered IDE** — Claude Code, Cursor, Windsurf, or similar +::: + +:::tip[Quick Path] +**Install** → `npx bmad-method install` (select BMGD module) +**Preproduction** → Game Designer creates Game Brief +**Design** → Game Designer creates GDD (and Narrative if story-driven) +**Technical** → Game Architect creates Architecture +**Production** → Game SM manages sprints, Game Dev implements +**Always use fresh chats** for each workflow to avoid context issues. +::: + +## Understanding BMGD + +BMGD follows four game development phases with specialized agents for each: + +| Phase | Name | What Happens | +|-------|------|--------------| +| 1 | Preproduction | Capture game vision, create Game Brief *(optional brainstorming)* | +| 2 | Design | Detail mechanics, systems, narrative in GDD | +| 3 | Technical | Plan engine, architecture, technical decisions | +| 4 | Production | Build game in sprints, story by story | + +![BMGD Workflow Overview](./images/workflow-overview.jpg) + +*Complete visual flowchart showing all phases, workflows, and agents for game development.* + +### Game Development Agents + +| Agent | When to Use | +|-------|-------------| +| **Game Designer** | Brainstorming, Game Brief, GDD, Narrative | +| **Game Architect** | Architecture, technical decisions | +| **Game Developer** | Implementation, code reviews | +| **Game Scrum Master** | Sprint planning, story management | +| **Game QA** | Test framework, test design, automation | +| **Game Solo Dev** | Quick prototyping, indie development | + +## Installation + +If you haven't installed BMad yet: + +```bash +npx bmad-method install +``` + +Or add BMGD to an existing installation: + +```bash +npx bmad-method install --add-module bmgd +``` + +Verify your installation: + +``` +your-project/ +├── _bmad/ +│ ├── bmgd/ # Game development module +│ │ ├── agents/ # Game-specific agents +│ │ ├── workflows/ # Game-specific workflows +│ │ └── config.yaml # Module config +│ ├── bmm/ # Core method module +│ └── core/ # Core utilities +├── _bmad-output/ # Generated artifacts (created later) +└── .claude/ # IDE configuration (if using Claude Code) +``` + +## Step 1: Create Your Game Brief (Preproduction) + +Load the **Game Designer** agent in your IDE, wait for the menu, then start with your game concept. + +### Optional: Brainstorm First + +If you have a vague idea and want help developing it: + +``` +Run brainstorm-game +``` + +The agent guides you through game-specific ideation techniques to refine your concept. + +### Create the Game Brief + +``` +Run create-game-brief +``` + +The Game Designer walks you through: +- **Game concept** — Core idea and unique selling points +- **Design pillars** — The 3-5 principles that guide all decisions +- **Target market** — Who plays this game? +- **Fundamentals** — Platform, genre, scope, team size + +When complete, you'll have `game-brief.md` in your `_bmad-output/` folder. + +:::caution[Fresh Chats] +Always start a fresh chat for each workflow. This prevents context limitations from causing issues. +::: + +## Step 2: Design Your Game + +With your Game Brief complete, detail your game's design. + +### Create the GDD + +**Start a fresh chat** with the **Game Designer** agent. + +``` +Run create-gdd +``` + +The agent guides you through mechanics, systems, and game-type-specific sections. BMGD offers 24 game type templates that provide genre-specific structure. + +When complete, you'll have `gdd.md` (or sharded into `gdd/` for large documents). + +:::note[Narrative Design (Optional)] +For story-driven games, start a fresh chat and run `narrative` to create a Narrative Design Document covering story, characters, world, and dialogue. +::: + +:::tip[Check Your Status] +Unsure what's next? Load any agent and run `workflow-status`. It tells you the next recommended workflow. +::: + +## Step 3: Plan Your Architecture + +**Start a fresh chat** with the **Game Architect** agent. + +``` +Run create-architecture +``` + +The architect guides you through: +- **Engine selection** — Unity, Unreal, Godot, custom, etc. +- **System design** — Core game systems and how they interact +- **Technical patterns** — Architecture patterns suited to your game +- **Structure** — Project organization and conventions + +When complete, you'll have `game-architecture.md`. + +## Step 4: Build Your Game + +Once planning is complete, move to production. **Each workflow should run in a fresh chat.** + +### Initialize Sprint Planning + +Load the **Game Scrum Master** agent and run `sprint-planning`. This creates `sprint-status.yaml` to track all epics and stories. + +### The Build Cycle + +For each story, repeat this cycle with fresh chats: + +| Step | Agent | Workflow | Purpose | +|------|-------|----------|---------| +| 1 | Game SM | `create-story` | Create story file from epic | +| 2 | Game Dev | `dev-story` | Implement the story | +| 3 | Game QA | `automate` | Generate tests *(optional)* | +| 4 | Game Dev | `code-review` | Quality validation *(recommended)* | + +After completing all stories in an epic, load the **Game SM** and run `retrospective`. + +### Quick Prototyping Alternative + +For rapid iteration or indie development, load the **Game Solo Dev** agent: +- `quick-prototype` — Rapid prototyping +- `quick-dev` — Flexible development without full sprint structure + +## What You've Accomplished + +You've learned the foundation of building games with BMad: + +- Installed the BMGD module +- Created a Game Brief capturing your vision +- Detailed your design in a GDD +- Planned your technical architecture +- Understood the build cycle for implementation + +Your project now has: + +``` +your-project/ +├── _bmad/ # BMad configuration +├── _bmad-output/ +│ ├── game-brief.md # Your game vision +│ ├── gdd.md # Game Design Document +│ ├── narrative-design.md # Story design (if applicable) +│ ├── game-architecture.md # Technical decisions +│ ├── epics/ # Epic and story files +│ └── sprint-status.yaml # Sprint tracking +└── ... +``` + +## Quick Reference + +| Command | Agent | Purpose | +|---------|-------|---------| +| `*brainstorm-game` | Game Designer | Guided game ideation | +| `*create-game-brief` | Game Designer | Create Game Brief | +| `*create-gdd` | Game Designer | Create Game Design Document | +| `*narrative` | Game Designer | Create Narrative Design | +| `*create-architecture` | Game Architect | Create game architecture | +| `*sprint-planning` | Game SM | Initialize sprint tracking | +| `*create-story` | Game SM | Create a story file | +| `*dev-story` | Game Dev | Implement a story | +| `*code-review` | Game Dev | Review implemented code | +| `*workflow-status` | Any | Check progress and next steps | + +## Common Questions + +**Do I need to create all documents?** +At minimum, create a Game Brief and GDD. Architecture is highly recommended. Narrative Design is only needed for story-driven games. + +**Can I use the Game Solo Dev for everything?** +Yes, for smaller projects or rapid prototyping. For larger games, the specialized agents provide more thorough guidance. + +**What game types are supported?** +BMGD includes 24 game type templates (RPG, platformer, puzzle, strategy, etc.) that provide genre-specific GDD sections. + +**Can I change my design later?** +Yes. Documents are living artifacts—return to update them as your vision evolves. The SM agent has `correct-course` for scope changes. + +## Getting Help + +- **During workflows** — Agents guide you with questions and explanations +- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#general-dev, #bugs-issues) +- **Documentation** — [BMGD Workflow Reference](../../reference/workflows/bmgd-workflows.md) +- **Video tutorials** — [BMad Code YouTube](https://www.youtube.com/@BMadCode) + +## Key Takeaways + +:::tip[Remember These] +- **Always use fresh chats** — Load agents in new chats for each workflow +- **Game Brief first** — It informs everything that follows +- **Use game type templates** — 24 templates provide genre-specific GDD structure +- **Documents evolve** — Return to update them as your vision grows +- **Solo Dev for speed** — Use Game Solo Dev for rapid prototyping +::: + +Ready to start? Load the **Game Designer** agent and run `create-game-brief` to capture your game vision. diff --git a/docs/tutorials/getting-started/workflow-overview.jpg b/docs/tutorials/getting-started/workflow-overview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f61b3c57ead3dd17c698955f2823805d59f9fcf GIT binary patch literal 205271 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

ryZpMA!sIiG603WN2Dho5s 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

&OSN@%DuBx2phZcfV=F00{ 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md new file mode 100644 index 00000000..bd24d5a6 --- /dev/null +++ b/docs/tutorials/index.md @@ -0,0 +1,21 @@ +--- +title: "Tutorials" +--- + + +Learning-oriented guides that walk you through building something real with BMad. Perfect for getting hands-on experience. + +## Getting Started + +Start your journey with BMad by choosing a version that fits your needs: + +- [Get Started with v4 (Stable)](./getting-started/getting-started-bmadv4.md) — Production-ready version with battle-tested workflows +- [Try v6 (Alpha)](./getting-started/getting-started-bmadv6.md) — Latest features, still in active development + +## First Project + +Your first end-to-end project with BMad. + +## Advanced + +More complex scenarios and advanced patterns. diff --git a/eslint.config.mjs b/eslint.config.mjs index 0fbaa510..e361b1cd 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -18,9 +18,9 @@ export default [ 'test/fixtures/**/*.yaml', '_bmad/**', '_bmad*/**', - // Docusaurus build artifacts - '.docusaurus/**', + // Build output 'build/**', + // Website uses ESM/Astro - separate linting ecosystem 'website/**', // Gitignored patterns 'z*/**', // z-samples, z1, z2, etc. diff --git a/package-lock.json b/package-lock.json index c2bb1e40..d6ea4f26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,10 +32,11 @@ "bmad-method": "tools/bmad-npx-wrapper.js" }, "devDependencies": { - "@docusaurus/core": "^3.6.0", - "@docusaurus/preset-classic": "^3.6.0", + "@astrojs/sitemap": "^3.6.0", + "@astrojs/starlight": "^0.37.0", "@eslint/js": "^9.33.0", "archiver": "^7.0.1", + "astro": "^5.16.0", "c8": "^10.1.3", "eslint": "^9.33.0", "eslint-config-prettier": "^10.1.8", @@ -48,355 +49,168 @@ "markdownlint-cli2": "^0.19.1", "prettier": "^3.5.3", "prettier-plugin-packagejson": "^2.5.19", - "prism-react-renderer": "^2.4.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "sharp": "^0.33.5", "yaml-eslint-parser": "^1.2.3", - "yaml-lint": "^1.7.0", - "zod": "^4.1.12" + "yaml-lint": "^1.7.0" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@ai-sdk/gateway": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.22.tgz", - "integrity": "sha512-6fHjDfCbjfj4vyMExuLei7ir2///E5sNwNZaobdJsJIxJjDSsjzSLGO/aUI7p9eOnB8XctDrDSF5ilwDGpi6eg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.19", - "@vercel/oidc": "3.0.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", - "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ai-sdk/provider-utils": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.19.tgz", - "integrity": "sha512-W41Wc9/jbUVXVwCN/7bWa4IKe8MtxO3EyA0Hfhx6grnmiYlCvpI8neSYWFE0zScXJkgA/YK3BRybzgyiXuu6JA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@standard-schema/spec": "^1.0.0", - "eventsource-parser": "^3.0.6" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/react": { - "version": "2.0.117", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.117.tgz", - "integrity": "sha512-qfwz4p1ev+i/M9rsOUEe53UgzxMUz7e4wrImWdkuFrpD78MBIj53eE/LtyCeAYSCFVSz3JfIDvtdk5MjTrNcbA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider-utils": "3.0.19", - "ai": "5.0.115", - "swr": "^2.2.5", - "throttleit": "2.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1", - "zod": "^3.25.76 || ^4.1.8" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/@algolia/abtesting": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.1.tgz", - "integrity": "sha512-Y+7e2uPe376OH5O73OB1+vR40ZhbV2kzGh/AR/dPCWguoBOp1IK0o+uZQLX+7i32RMMBEKl3pj6KVEav100Kvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", - "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", - "@algolia/autocomplete-shared": "1.19.2" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", - "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.19.2" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", - "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.1.tgz", - "integrity": "sha512-5SWfl0UGuKxMBYlU2Y9BnlIKKEyhFU5jHE9F9jAd8nbhxZNLk0y7fXE+AZeFtyK1lkVw6O4B/e6c3XIVVCkmqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.1.tgz", - "integrity": "sha512-496K6B1l/0Jvyp3MbW/YIgmm1a6nkTrKXBM7DoEy9YAOJ8GywGpa2UYjNCW1UrOTt+em1ECzDjRx7PIzTR9YvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.1.tgz", - "integrity": "sha512-3u6AuZ1Kiss6V5JPuZfVIUYfPi8im06QBCgKqLg82GUBJ3SwhiTdSZFIEgz2mzFuitFdW1PQi3c/65zE/3FgIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.1.tgz", - "integrity": "sha512-LwuWjdO35HHl1rxtdn48t920Xl26Dl0SMxjxjFeAK/OwK/pIVfYjOZl/f3Pnm7Kixze+6HjpByVxEaqhTuAFaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.1.tgz", - "integrity": "sha512-6LvJAlfEsn9SVq63MYAFX2iUxztUK2Q7BVZtI1vN87lDiJ/tSVFKgKS/jBVO03A39ePxJQiFv6EKv7lmoGlWtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.1.tgz", - "integrity": "sha512-9GLUCyGGo7YOXHcNqbzca82XYHJTbuiI6iT0FTGc0BrnV2N4OcrznUuVKic/duiLSun5gcy/G2Bciw5Sav9f9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.1.tgz", - "integrity": "sha512-NL76o/BoEgU4ObY5oBEC3o6KSPpuXsnSta00tAxTm1iKUWOGR34DQEKhUt8xMHhMKleUNPM/rLPFiIVtfsGU8w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "node_modules/@astrojs/compiler": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", + "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", "dev": true, "license": "MIT" }, - "node_modules/@algolia/ingestion": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.1.tgz", - "integrity": "sha512-52Nc8WKC1FFXsdlXlTMl1Re/pTAbd2DiJiNdYmgHiikZcfF96G+Opx4qKiLUG1q7zp9e+ahNwXF6ED0XChMywg==", + "node_modules/@astrojs/internal-helpers": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz", + "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", + "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.19.0", + "smol-toml": "^1.5.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" } }, - "node_modules/@algolia/monitoring": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.1.tgz", - "integrity": "sha512-1x2/2Y/eqz6l3QcEZ8u/zMhSCpjlhePyizJd3sXrmg031HjayYT5+IxikjpqkdF7TU/deCTd/TFUcxLJ2ZHXiQ==", + "node_modules/@astrojs/mdx": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.13.tgz", + "integrity": "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" + "@astrojs/markdown-remark": "6.3.10", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" }, "engines": { - "node": ">= 14.0.0" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" } }, - "node_modules/@algolia/recommend": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.1.tgz", - "integrity": "sha512-SSd3KlQuplxV3aRs5+Z09XilFesgpPjtCG7BGRxLTVje5hn9BLmhjO4W3gKw01INUt44Z1r0Fwx5uqnhAouunA==", + "node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" + "prismjs": "^1.30.0" }, "engines": { - "node": ">= 14.0.0" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.1.tgz", - "integrity": "sha512-3GfCwudeW6/3caKSdmOP6RXZEL4F3GiemCaXEStkTt2Re8f7NcGYAAZnGlHsCzvhlNEuDzPYdYxh4UweY8l/2w==", + "node_modules/@astrojs/sitemap": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.6.0.tgz", + "integrity": "sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" + "sitemap": "^8.0.0", + "stream-replace-string": "^2.0.0", + "zod": "^3.25.76" } }, - "node_modules/@algolia/requester-fetch": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.1.tgz", - "integrity": "sha512-JUAxYfmnLYTVtAOFxVvXJ4GDHIhMuaP7JGyZXa/nCk3P8RrN5FCNTdRyftSnxyzwSIAd8qH3CjdBS9WwxxqcHQ==", + "node_modules/@astrojs/starlight": { + "version": "0.37.2", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.2.tgz", + "integrity": "sha512-DGeaaKizwxHDsz72FdxyIBZ32eY8OdUoH6b757BGZlLEDq82O4uipFWoh+kz7+aKg1QoFu/rDq6fqtw+58tpRQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1" + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" }, - "engines": { - "node": ">= 14.0.0" + "peerDependencies": { + "astro": "^5.5.0" } }, - "node_modules/@algolia/requester-node-http": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.1.tgz", - "integrity": "sha512-VwbhV1xvTGiek3d2pOS6vNBC4dtbNadyRT+i1niZpGhOJWz1XnfhxNboVbXPGAyMJYz7kDrolbDvEzIDT93uUA==", + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1" + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" }, "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, "node_modules/@babel/code-frame": { @@ -425,23 +239,23 @@ } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -483,19 +297,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", @@ -523,83 +324,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", - "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -610,20 +334,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", @@ -656,19 +366,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", @@ -679,56 +376,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -759,30 +406,15 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -804,103 +436,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -956,35 +491,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", @@ -1169,1166 +675,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", - "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", - "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", - "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", - "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", - "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.4", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.27.1", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.28.5", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.28.5", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.4", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.4", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "core-js-compat": "^3.43.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", - "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.28.0", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", @@ -2339,19 +685,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", - "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.43.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -2401,11 +734,27 @@ } }, "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@capsizecss/unpack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-3.0.1.tgz", + "integrity": "sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fontkit": "^2.0.2" + }, + "engines": { + "node": ">=18" + } }, "node_modules/@colors/colors": { "version": "1.5.0", @@ -2417,2320 +766,32 @@ "node": ">=0.1.90" } }, - "node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", - "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/postcss-alpha-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", - "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", - "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-function-display-p3-linear": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", - "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", - "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", - "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", - "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-contrast-color-function": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", - "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", - "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", - "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", - "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", - "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", - "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", - "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-initial": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", - "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", - "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", - "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", - "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overflow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", - "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overscroll-behavior": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", - "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-resize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", - "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", - "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", - "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", - "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", - "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", - "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", - "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-position-area-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", - "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-random-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", - "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", - "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", - "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", - "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", - "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-system-ui-font-family": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", - "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", - "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", - "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", - "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/utilities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", - "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", "dev": true, "license": "MIT", "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.3.1.tgz", - "integrity": "sha512-ktVbkePE+2h9RwqCUMbWXOoebFyDOxHqImAqfs+lC8yOU+XwEW4jgvHGJK079deTeHtdhUNj0PXHSnhJINvHzQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@docsearch/css": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.3.2.tgz", - "integrity": "sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docsearch/react": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.3.2.tgz", - "integrity": "sha512-74SFD6WluwvgsOPqifYOviEEVwDxslxfhakTlra+JviaNcs7KK/rjsPj89kVEoQc9FUxRkAofaJnHIR7pb4TSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ai-sdk/react": "^2.0.30", - "@algolia/autocomplete-core": "1.19.2", - "@docsearch/core": "4.3.1", - "@docsearch/css": "4.3.2", - "ai": "^5.0.30", - "algoliasearch": "^5.28.0", - "marked": "^16.3.0", - "zod": "^4.1.8" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@docusaurus/babel": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", - "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.25.9", - "@babel/preset-env": "^7.25.9", - "@babel/preset-react": "^7.25.9", - "@babel/preset-typescript": "^7.25.9", - "@babel/runtime": "^7.25.9", - "@babel/runtime-corejs3": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "babel-plugin-dynamic-import-node": "^2.3.3", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/bundler": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", - "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.9.2", - "@docusaurus/cssnano-preset": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "babel-loader": "^9.2.1", - "clean-css": "^5.3.3", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.11.0", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "file-loader": "^6.2.0", - "html-minifier-terser": "^7.2.0", - "mini-css-extract-plugin": "^2.9.2", - "null-loader": "^4.0.1", - "postcss": "^8.5.4", - "postcss-loader": "^7.3.4", - "postcss-preset-env": "^10.2.1", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "webpack": "^5.95.0", - "webpackbar": "^6.0.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/faster": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/faster": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", - "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/babel": "3.9.2", - "@docusaurus/bundler": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "core-js": "^3.31.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "execa": "5.1.1", - "fs-extra": "^11.1.1", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.6.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "open": "^8.4.0", - "p-map": "^4.0.0", - "prompts": "^2.4.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.6", - "tinypool": "^1.0.2", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "webpack": "^5.95.0", - "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-server": "^5.2.2", - "webpack-merge": "^6.0.1" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@mdx-js/react": "^3.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@docusaurus/core/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docusaurus/core/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", - "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.5.4", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/logger": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", - "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", - "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", - "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.9.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", - "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "cheerio": "1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", - "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", - "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", - "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", - "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^2.3.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", - "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", - "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", - "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", - "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-svgr": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", - "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@svgr/core": "8.1.0", - "@svgr/webpack": "^8.1.0", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", - "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/plugin-content-blog": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/plugin-content-pages": "3.9.2", - "@docusaurus/plugin-css-cascade-layers": "3.9.2", - "@docusaurus/plugin-debug": "3.9.2", - "@docusaurus/plugin-google-analytics": "3.9.2", - "@docusaurus/plugin-google-gtag": "3.9.2", - "@docusaurus/plugin-google-tag-manager": "3.9.2", - "@docusaurus/plugin-sitemap": "3.9.2", - "@docusaurus/plugin-svgr": "3.9.2", - "@docusaurus/theme-classic": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-search-algolia": "3.9.2", - "@docusaurus/types": "3.9.2" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", - "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/plugin-content-blog": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/plugin-content-pages": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "infima": "0.2.0-alpha.45", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.5.4", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", - "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", - "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docsearch/react": "^3.9.0 || ^4.1.0", - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "algoliasearch": "^5.37.0", - "algoliasearch-helper": "^3.26.0", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", - "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/types": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", - "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/types/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@docusaurus/types/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", - "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "escape-string-regexp": "^4.0.0", - "execa": "5.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "p-queue": "^6.6.2", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", - "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", - "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" + "node": ">=14" } }, "node_modules/@emnapi/core": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", - "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.4", + "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "dev": true, "license": "MIT", "optional": true, @@ -4739,9 +800,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", - "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, "license": "MIT", "optional": true, @@ -4749,10 +810,452 @@ "tslib": "^2.4.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4782,9 +1285,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -4792,13 +1295,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -4807,19 +1310,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4830,9 +1336,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4842,7 +1348,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, @@ -4864,9 +1370,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -4877,9 +1383,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4887,34 +1393,66 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "node_modules/@expressive-code/core": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.5.tgz", + "integrity": "sha512-II5TEy5eOoXiqPwqtpSqwamUd7lZS3YH3ofxR1ZyQMmygqORZn8/7SzgfF8G0kB7uKCBzFZT6RgKgCuHcJuPpA==", "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.5.tgz", + "integrity": "sha512-qU0cvAQGfRLX7XwGf3/+hqIVmAc/mNNTlqVLR0iBfJF6EKvtP3R7/uAlPrAxnxQxn0meTazCz8D+PsPyOpHKrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.5" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.5.tgz", + "integrity": "sha512-gw6OWvnmDmvcKJ5AZSzl2VkuixJMQ/zWSwPLFNzitqCa8aPfIFunb0K8IIOsE43LELgOWkie9lRFspOxwDVwrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.5", + "shiki": "^3.2.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.5.tgz", + "integrity": "sha512-0DSiTsjWFEz6/iuLOGNNy2GaeCW41OwnVJMKx1tS+XKeQxAL89UkZP3egWNzxjWNHNMzEv3ZWWWYqbonEQlv/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.5" } }, "node_modules/@humanfs/core": { @@ -4928,33 +1466,19 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -4983,6 +1507,497 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@inquirer/external-editor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", @@ -5052,9 +2067,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -5064,9 +2079,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -5099,9 +2114,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -5157,6 +2172,16 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -5248,17 +2273,17 @@ } }, "node_modules/@jest/console": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.0.5.tgz", - "integrity": "sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -5266,39 +2291,39 @@ } }, "node_modules/@jest/core": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.0.5.tgz", - "integrity": "sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", + "@jest/console": "30.2.0", "@jest/pattern": "30.0.1", - "@jest/reporters": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.0.5", - "jest-config": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-resolve-dependencies": "30.0.5", - "jest-runner": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "jest-watcher": "30.0.5", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -5324,70 +2349,70 @@ } }, "node_modules/@jest/environment": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.0.5.tgz", - "integrity": "sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "30.0.5" + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.0.5", - "jest-snapshot": "30.0.5" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.0.5.tgz", - "integrity": "sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1" + "@jest/get-type": "30.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.0.5.tgz", - "integrity": "sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/get-type": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", - "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, "license": "MIT", "engines": { @@ -5395,16 +2420,16 @@ } }, "node_modules/@jest/globals": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.0.5.tgz", - "integrity": "sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/types": "30.0.5", - "jest-mock": "30.0.5" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -5425,17 +2450,17 @@ } }, "node_modules/@jest/reporters": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.0.5.tgz", - "integrity": "sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", "chalk": "^4.1.2", @@ -5448,9 +2473,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" @@ -5467,6 +2492,13 @@ } } }, + "node_modules/@jest/reporters/node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, "node_modules/@jest/reporters/node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -5568,13 +2600,13 @@ } }, "node_modules/@jest/snapshot-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.0.5.tgz", - "integrity": "sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" @@ -5599,14 +2631,14 @@ } }, "node_modules/@jest/test-result": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.0.5.tgz", - "integrity": "sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" }, @@ -5615,15 +2647,15 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.0.5.tgz", - "integrity": "sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.0.5", + "@jest/test-result": "30.2.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -5631,23 +2663,23 @@ } }, "node_modules/@jest/transform": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.0.5.tgz", - "integrity": "sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.0", + "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", @@ -5658,9 +2690,9 @@ } }, "node_modules/@jest/types": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", - "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", "dependencies": { @@ -5687,6 +2719,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -5697,17 +2740,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -5716,9 +2748,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -5726,126 +2758,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/@kayvan/markdown-tree-parser": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@kayvan/markdown-tree-parser/-/markdown-tree-parser-1.6.1.tgz", @@ -5870,13 +2782,6 @@ "url": "https://github.com/sponsors/ksylvan" } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true, - "license": "MIT" - }, "node_modules/@mdx-js/mdx": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", @@ -5915,35 +2820,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/@mdx-js/react": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", - "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -5995,15 +2871,103 @@ "node": ">= 8" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } + "license": "MIT" + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.4.0.tgz", + "integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.4.0.tgz", + "integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.4.0.tgz", + "integrity": "sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.4.0.tgz", + "integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.4.0.tgz", + "integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.4.0.tgz", + "integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.4.0.tgz", + "integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", @@ -6029,102 +2993,425 @@ "url": "https://opencollective.com/pkgr" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "4.2.10" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "node": ">=14.0.0" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz", + "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==", + "cpu": [ + "arm" + ], "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz", + "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz", + "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz", + "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz", + "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz", + "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz", + "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz", + "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz", + "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz", + "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz", + "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz", + "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz", + "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz", + "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz", + "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz", + "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz", + "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz", + "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz", + "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz", + "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz", + "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz", + "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.20.0.tgz", + "integrity": "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==", + "dev": true, + "license": "MIT", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@shikijs/types": "3.20.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "node_modules/@shikijs/engine-javascript": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.20.0.tgz", + "integrity": "sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.20.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.20.0.tgz", + "integrity": "sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.20.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.20.0.tgz", + "integrity": "sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.20.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.20.0.tgz", + "integrity": "sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.20.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.20.0.tgz", + "integrity": "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" }, "node_modules/@sinclair/typebox": { - "version": "0.34.40", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.40.tgz", - "integrity": "sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==", + "version": "0.34.46", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.46.tgz", + "integrity": "sha512-kiW7CtS/NkdvTUjkjUJo7d5JsFfbJ14YjdhDk9KoEgK6nFjKNXZPrX0jfLA8ZlET4cFLHxOZ/0vFKOP+bOxIOQ==", "dev": true, "license": "MIT" }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", @@ -6158,413 +3445,20 @@ "@sinonjs/commons": "^3.0.1" } }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "node_modules/@swc/helpers": { + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10.13.0" + "tslib": "^2.8.0" } }, "node_modules/@tybys/wasm-util": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", - "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", "optional": true, @@ -6617,48 +3511,6 @@ "@babel/types": "^7.28.2" } }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -6668,28 +3520,6 @@ "@types/ms": "*" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -6707,39 +3537,16 @@ "@types/estree": "*" } }, - "node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "node_modules/@types/fontkit": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/fontkit/-/fontkit-2.0.8.tgz", + "integrity": "sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==", "dev": true, "license": "MIT", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" + "@types/node": "*" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", - "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -6750,44 +3557,6 @@ "@types/unist": "*" } }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -6815,6 +3584,13 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -6845,114 +3621,33 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", "devOptional": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.16.0" } }, - "node_modules/@types/node-forge": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", @@ -6963,59 +3658,6 @@ "@types/node": "*" } }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -7029,20 +3671,10 @@ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -7332,191 +3964,6 @@ "win32" ] }, - "node_modules/@vercel/oidc": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", - "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -7530,53 +3977,6 @@ "node": ">=6.5" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -7591,19 +3991,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -7614,79 +4001,12 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aggregate-error/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ai": { - "version": "5.0.115", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.115.tgz", - "integrity": "sha512-aVuHx0orGxXvhyL7oXUyW8TnWQE6Al8f3Bl6VZjz0WHMV+WaACHPkSyvQ3wje2QCUGzdl5DBF5d+OaXyghPQyg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/gateway": "2.0.22", - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.19", - "@opentelemetry/api": "1.9.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7698,98 +4018,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/algoliasearch": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.1.tgz", - "integrity": "sha512-39ol8Ulqb3MntofkXHlrcXKyU8BU0PXvQrXPBIX6eXj/EO4VT7651mhGVORI2oF8ydya9nFzT3fYDoqme/KL6w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/abtesting": "1.12.1", - "@algolia/client-abtesting": "5.46.1", - "@algolia/client-analytics": "5.46.1", - "@algolia/client-common": "5.46.1", - "@algolia/client-insights": "5.46.1", - "@algolia/client-personalization": "5.46.1", - "@algolia/client-query-suggestions": "5.46.1", - "@algolia/client-search": "5.46.1", - "@algolia/ingestion": "1.46.1", - "@algolia/monitoring": "1.46.1", - "@algolia/recommend": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.1.tgz", - "integrity": "sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -7814,17 +4042,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { @@ -7865,6 +4092,19 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/archiver": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", @@ -7913,31 +4153,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/archiver-utils/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/archiver-utils/node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -8015,65 +4230,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/archiver/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/archiver/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -8087,12 +4243,26 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, "node_modules/array-union": { "version": "2.1.0", @@ -8114,6 +4284,709 @@ "astring": "bin/astring" } }, + "node_modules/astro": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.6.tgz", + "integrity": "sha512-6mF/YrvwwRxLTu+aMEa5pwzKUNl5ZetWbTyZCs9Um0F12HUmxUiF5UHiZPy4rifzU3gtpM3xP2DfdmkNX9eZRg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/markdown-remark": "6.3.10", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^3.0.1", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.3.1", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.0.2", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.5.0", + "diff": "^5.2.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.25.0", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.3.1", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.1", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", + "package-manager-detector": "^1.5.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.15.0", + "smol-toml": "^1.5.2", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.6.0", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.3", + "vfile": "^6.0.3", + "vite": "^6.4.1", + "vitefu": "^1.1.1", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.0", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + } + }, + "node_modules/astro-expressive-code": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.5.tgz", + "integrity": "sha512-6jfABbPO0fkRD1ROAPBQtJR2p7gjbmk/GjfblOpo5Z7F+gwhL7+s8bEhLz9GdW10yfbn+gJvwEf7f9Lu2clh2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.41.5" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0" + } + }, + "node_modules/astro/node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/astro/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/astro/node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/astro/node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/astro/node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/astro/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/astro/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -8121,54 +4994,42 @@ "dev": true, "license": "MIT" }, - "node_modules/autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, + "license": "Apache-2.0", "engines": { - "node": "^10 || ^12 || >=14" - }, + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "dev": true, + "license": "Apache-2.0", "peerDependencies": { - "postcss": "^8.1.0" + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } } }, "node_modules/babel-jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.5.tgz", - "integrity": "sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "30.0.5", + "@jest/transform": "30.2.0", "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.0", - "babel-preset-jest": "30.0.1", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" @@ -8177,43 +5038,18 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" - } - }, - "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.0" + "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "node_modules/babel-plugin-istanbul": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz", - "integrity": "sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", "dev": true, "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -8225,73 +5061,56 @@ "node": ">=12" } }, + "node_modules/babel-plugin-istanbul/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", - "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", "@types/babel__core": "^7.20.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/babel-preset-current-node-syntax": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", @@ -8320,20 +5139,20 @@ } }, "node_modules/babel-preset-jest": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", - "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "30.0.1", - "babel-preset-current-node-syntax": "^1.1.0" + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "node_modules/bail": { @@ -8368,6 +5187,13 @@ } } }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "dev": true, + "license": "MIT" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -8389,43 +5215,40 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.10", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.10.tgz", - "integrity": "sha512-2VIKvDx8Z1a9rTB2eCkdPE5nSe28XnA+qivGnWHoB40hMMt/h1hSz0960Zqsn6ZyxWXUie0EBdElKv8may20AA==", + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", "dev": true, "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/bl": { @@ -8439,80 +5262,18 @@ "readable-stream": "^3.4.0" } }, - "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "dev": true, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "node": ">= 6" } }, "node_modules/boolbase": { @@ -8543,30 +5304,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -8591,6 +5328,16 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, "node_modules/browserslist": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", @@ -8690,32 +5437,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/c8": { "version": "10.1.3", "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz", @@ -8750,197 +5471,6 @@ } } }, - "node_modules/c8/node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/c8/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/c8/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/c8/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/c8/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/c8/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/c8/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/c8/node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -8951,44 +5481,22 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "license": "MIT", "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { @@ -9099,98 +5607,26 @@ "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "license": "MIT" }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" } }, "node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -9204,25 +5640,12 @@ } }, "node_modules/cjs-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.0.tgz", - "integrity": "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", "dev": true, "license": "MIT" }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, "node_modules/clean-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", @@ -9246,16 +5669,6 @@ "node": ">=0.8.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", @@ -9269,15 +5682,19 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { @@ -9308,26 +5725,26 @@ } }, "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "dev": true, "license": "MIT", "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -9337,35 +5754,27 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", + "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -9403,29 +5812,15 @@ } }, "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -9459,12 +5854,26 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9483,12 +5892,16 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "node_modules/colorette": { "version": "2.0.20", @@ -9497,16 +5910,6 @@ "dev": true, "license": "MIT" }, - "node_modules/combine-promises": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -9519,18 +5922,18 @@ } }, "node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", "license": "MIT", "engines": { "node": ">=20" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "dev": true, "license": "ISC" }, @@ -9551,117 +5954,6 @@ "node": ">= 14" } }, - "node_modules/compress-commons/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/compress-commons/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compressible/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -9669,74 +5961,6 @@ "dev": true, "license": "MIT" }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/configstore/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", @@ -9744,26 +5968,6 @@ "dev": true, "license": "MIT" }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -9772,128 +5976,40 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", "dev": true, "license": "MIT" }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", - "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.28.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-pure": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", - "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -9901,33 +6017,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -9955,48 +6044,6 @@ "node": ">= 14" } }, - "node_modules/crc32-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -10011,360 +6058,14 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-blank-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", - "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", - "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", - "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", - "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "uncrypto": "^0.1.3" } }, "node_modules/css-select": { @@ -10385,9 +6086,9 @@ } }, "node_modules/css-selector-parser": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.1.3.tgz", - "integrity": "sha512-gJMigczVZqYAk0hPVzx/M4Hm1D9QOtqkdQk9005TNzDIUGzo5cnHEDiKUT7jGPximL/oYb+LIitcHFQ4aKupxg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", "funding": [ { "type": "github", @@ -10401,13 +6102,13 @@ "license": "MIT" }, "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", + "mdn-data": "2.12.2", "source-map-js": "^1.0.1" }, "engines": { @@ -10427,23 +6128,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cssdb": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.5.2.tgz", - "integrity": "sha512-Pmoj9RmD8RIoIzA2EQWO4D4RMeDts0tgAH0VXdlNdxjuBGI3a9wMOIcUwaPNmD4r2qtIa06gqkIf7sECl+cBCg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "MIT-0" - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -10457,107 +6141,6 @@ "node": ">=4" } }, - "node_modules/cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, "node_modules/csso": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", @@ -10594,30 +6177,16 @@ "dev": true, "license": "CC0-1.0" }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, "node_modules/csv-parse": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-6.1.0.tgz", "integrity": "sha512-CEE+jwpgLn+MmtCpVcPtiCZpVtB6Z2OKPTr34pycYYoL7sxdOkXDdQ4lRiw6ioC0q6BLqhc6cKweCVvral8yhw==", "license": "MIT" }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true, - "license": "MIT" - }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -10644,39 +6213,10 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10688,16 +6228,6 @@ } } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -10715,36 +6245,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-browser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", - "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -10757,71 +6257,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.8" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, "node_modules/dequal": { "version": "2.0.3", @@ -10832,25 +6282,34 @@ "node": ">=6" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } + "license": "MIT" }, "node_modules/detect-indent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", - "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", "dev": true, "license": "MIT", "engines": { "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" } }, "node_modules/detect-newline": { @@ -10863,31 +6322,26 @@ "node": ">=8" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", "dev": true, "license": "MIT", "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" + "base-64": "^1.0.0" }, "engines": { - "node": ">= 4.0.0" + "node": ">=18" } }, + "node_modules/devalue": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", + "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "dev": true, + "license": "MIT" + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -10901,6 +6355,33 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -10914,29 +6395,37 @@ "node": ">=8" } }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", "dev": true, "license": "MIT", - "dependencies": { - "utila": "~0.4" + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -10996,78 +6485,22 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.5.267", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", @@ -11094,48 +6527,10 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11173,55 +6568,22 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", @@ -11256,6 +6618,48 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -11266,26 +6670,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -11300,26 +6684,25 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -11416,9 +6799,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "17.21.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.21.3.tgz", - "integrity": "sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw==", + "version": "17.23.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz", + "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==", "dev": true, "license": "MIT", "dependencies": { @@ -11501,10 +6884,37 @@ "eslint": ">=9.29.0" } }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { @@ -11515,13 +6925,14 @@ } }, "node_modules/eslint-plugin-yml": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.18.0.tgz", - "integrity": "sha512-9NtbhHRN2NJa/s3uHchO3qVVZw0vyOIvWlXWGaKCr/6l3Go62wsvJK5byiI6ZoYztDsow4GnS69BZD3GnqH3hA==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.1.tgz", + "integrity": "sha512-bYkOxyEiXh9WxUhVYPELdSHxGG5pOjCSeJOVkfdIyj6tuiHDxrES2WAW1dBxn3iaZQey57XflwLtCYRcNPOiOg==", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.3.2", + "diff-sequences": "^27.5.1", "escape-string-regexp": "4.0.0", "eslint-compat-utils": "^0.6.0", "natural-compare": "^1.4.0", @@ -11626,9 +7037,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -11734,29 +7145,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/estree-util-to-js/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/estree-util-value-to-estree": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", - "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, "node_modules/estree-util-visit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", @@ -11792,42 +7180,6 @@ "node": ">=0.10.0" } }, - "node_modules/eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -11865,16 +7217,6 @@ "bare-events": "^2.7.0" } }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -11917,115 +7259,34 @@ } }, "node_modules/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "node_modules/expressive-code": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.5.tgz", + "integrity": "sha512-iXl9BgDogQgzgE/WRSrcyU8upOcRZrXPMiu6tegEHML57YLQ65S0E3/sjAXmMZy0GXoPs60s9jbwoMo/mdEQOg==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "@expressive-code/core": "^0.41.5", + "@expressive-code/plugin-frames": "^0.41.5", + "@expressive-code/plugin-shiki": "^0.41.5", + "@expressive-code/plugin-text-markers": "^0.41.5" } }, "node_modules/extend": { @@ -12034,19 +7295,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -12105,60 +7353,16 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -12169,55 +7373,37 @@ "bser": "2.1.1" } }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", - "dependencies": { - "xml-js": "^1.6.11" - }, "engines": { - "node": ">=0.4.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, "node_modules/figlet": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.8.0.tgz", - "integrity": "sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.9.4.tgz", + "integrity": "sha512-uN6QE+TrzTAHC1IWTyrc4FfGo2KH/82J8Jl1tyKB7+z5DBit/m3D++Iu5lg91qJMnQQ3vpJrj5gxcK/pk4R9tQ==", "license": "MIT", + "dependencies": { + "commander": "^14.0.0" + }, "bin": { "figlet": "bin/index.js" }, "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" + "node": ">= 17.0.0" } }, "node_modules/file-entry-cache": { @@ -12233,46 +7419,6 @@ "node": ">=16.0.0" } }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -12286,163 +7432,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -12473,16 +7462,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -12504,25 +7483,43 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], "license": "MIT", "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.3.1.tgz", + "integrity": "sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fontkit": "^2.0.8", + "fontkit": "^2.0.4" + } + }, + "node_modules/fontkit": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.12", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "dfa": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "restructure": "^3.0.0", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.4.0", + "unicode-trie": "^2.0.0" } }, "node_modules/foreground-child": { @@ -12541,63 +7538,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fs-extra": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", - "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -12630,16 +7574,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -12661,9 +7595,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, "license": "MIT", "engines": { @@ -12673,38 +7607,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true, - "license": "ISC" - }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -12715,20 +7617,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -12743,9 +7631,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12766,9 +7654,9 @@ } }, "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "dev": true, "license": "ISC" }, @@ -12808,30 +7696,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/glob/node_modules/minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", @@ -12847,22 +7711,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -12877,34 +7725,37 @@ } }, "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-15.0.0.tgz", + "integrity": "sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==", "dev": true, "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/globby/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globrex": { @@ -12914,127 +7765,30 @@ "dev": true, "license": "MIT" }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "node_modules/h3": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", + "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", "dev": true, "license": "MIT", "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.2", + "radix3": "^1.1.2", + "ufo": "^1.6.1", + "uncrypto": "^0.1.3" } }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true, - "license": "MIT" - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13044,56 +7798,58 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { + "node_modules/hast-util-embedded": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-from-parse5": { @@ -13117,6 +7873,66 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", @@ -13131,6 +7947,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-raw": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", @@ -13157,6 +7991,34 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-estree": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", @@ -13186,6 +8048,30 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", @@ -13234,6 +8120,37 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", @@ -13266,153 +8183,13 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", "dev": true, "license": "MIT" }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", @@ -13424,89 +8201,15 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/html-webpack-plugin": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.5.tgz", - "integrity": "sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g==", + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "url": "https://opencollective.com/unified" } }, "node_modules/http-cache-semantics": { @@ -13516,115 +8219,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-proxy/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -13651,14 +8245,28 @@ "url": "https://github.com/sponsors/typicode" } }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], "license": "MIT", - "engines": { - "node": ">=10.18" + "dependencies": { + "@babel/runtime": "^7.23.2" } }, "node_modules/iconv-lite": { @@ -13677,19 +8285,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -13719,19 +8314,6 @@ "node": ">= 4" } }, - "node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "dev": true, - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -13749,16 +8331,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -13779,6 +8351,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -13802,16 +8385,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/infima": { - "version": "0.2.0-alpha.45", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", - "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -13884,24 +8457,14 @@ "node": ">=8" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", "dev": true, "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" + "funding": { + "url": "https://github.com/sponsors/brc-dd" } }, "node_modules/is-alphabetical": { @@ -13937,19 +8500,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-builtin-module": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", @@ -13966,51 +8516,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -14023,31 +8528,21 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -14059,13 +8554,16 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14124,39 +8622,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -14166,32 +8631,6 @@ "node": ">=8" } }, - "node_modules/is-network-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", - "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", - "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -14202,26 +8641,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -14234,29 +8653,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -14270,13 +8666,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -14290,32 +8679,25 @@ } }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, @@ -14325,16 +8707,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -14406,6 +8778,13 @@ "node": ">=8" } }, + "node_modules/istanbul-reports/node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/jackspeak": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", @@ -14422,16 +8801,16 @@ } }, "node_modules/jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.0.5.tgz", - "integrity": "sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.0.5", - "@jest/types": "30.0.5", + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", "import-local": "^3.2.0", - "jest-cli": "30.0.5" + "jest-cli": "30.2.0" }, "bin": { "jest": "bin/jest.js" @@ -14449,44 +8828,73 @@ } }, "node_modules/jest-changed-files": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.0.5.tgz", - "integrity": "sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.1.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "p-limit": "^3.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-circus": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.0.5.tgz", - "integrity": "sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==", + "node_modules/jest-changed-files/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-circus": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", - "jest-each": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "p-limit": "^3.1.0", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" @@ -14495,22 +8903,51 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-cli": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.0.5.tgz", - "integrity": "sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==", + "node_modules/jest-circus/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-circus/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-cli": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", - "jest-config": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "yargs": "^17.7.2" }, "bin": { @@ -14529,34 +8966,34 @@ } }, "node_modules/jest-config": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.0.5.tgz", - "integrity": "sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.0.5", - "@jest/types": "30.0.5", - "babel-jest": "30.0.5", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^10.3.10", "graceful-fs": "^4.2.11", - "jest-circus": "30.0.5", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-runner": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "micromatch": "^4.0.8", "parse-json": "^5.2.0", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -14668,25 +9105,25 @@ } }, "node_modules/jest-diff": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.5.tgz", - "integrity": "sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", "dependencies": { "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-docblock": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.0.1.tgz", - "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, "license": "MIT", "dependencies": { @@ -14697,56 +9134,56 @@ } }, "node_modules/jest-each": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.0.5.tgz", - "integrity": "sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", "chalk": "^4.1.2", - "jest-util": "30.0.5", - "pretty-format": "30.0.5" + "jest-util": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-environment-node": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.0.5.tgz", - "integrity": "sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5" + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-haste-map": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.0.5.tgz", - "integrity": "sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, @@ -14758,49 +9195,49 @@ } }, "node_modules/jest-leak-detector": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.0.5.tgz", - "integrity": "sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "pretty-format": "30.0.5" + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.0.5.tgz", - "integrity": "sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.0.5", - "pretty-format": "30.0.5" + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.0.5.tgz", - "integrity": "sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -14809,15 +9246,15 @@ } }, "node_modules/jest-mock": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", - "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-util": "30.0.5" + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -14852,18 +9289,18 @@ } }, "node_modules/jest-resolve": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.0.5.tgz", - "integrity": "sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" }, @@ -14872,46 +9309,46 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.0.5.tgz", - "integrity": "sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "30.0.1", - "jest-snapshot": "30.0.5" + "jest-snapshot": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.0.5.tgz", - "integrity": "sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", - "@jest/environment": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-leak-detector": "30.0.5", - "jest-message-util": "30.0.5", - "jest-resolve": "30.0.5", - "jest-runtime": "30.0.5", - "jest-util": "30.0.5", - "jest-watcher": "30.0.5", - "jest-worker": "30.0.5", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -14919,33 +9356,62 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-runtime": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.0.5.tgz", - "integrity": "sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==", + "node_modules/jest-runner/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/globals": "30.0.5", + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runner/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", "@jest/source-map": "30.0.1", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", "glob": "^10.3.10", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -15041,9 +9507,9 @@ } }, "node_modules/jest-snapshot": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.0.5.tgz", - "integrity": "sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", "dependencies": { @@ -15052,20 +9518,20 @@ "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "@jest/snapshot-utils": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "babel-preset-current-node-syntax": "^1.1.0", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", - "expect": "30.0.5", + "expect": "30.2.0", "graceful-fs": "^4.2.11", - "jest-diff": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "pretty-format": "30.0.5", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", "semver": "^7.7.2", "synckit": "^0.11.8" }, @@ -15074,13 +9540,13 @@ } }, "node_modules/jest-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", - "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -15091,64 +9557,38 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/jest-validate": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.0.5.tgz", - "integrity": "sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/jest-watcher": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.0.5.tgz", - "integrity": "sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "string-length": "^4.0.2" }, "engines": { @@ -15156,15 +9596,15 @@ } }, "node_modules/jest-worker": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.0.5.tgz", - "integrity": "sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -15188,30 +9628,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -15258,13 +9674,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -15312,9 +9721,9 @@ } }, "node_modules/katex": { - "version": "0.16.25", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.25.tgz", - "integrity": "sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==", + "version": "0.16.27", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.27.tgz", + "integrity": "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==", "dev": true, "funding": [ "https://opencollective.com/katex", @@ -15348,16 +9757,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -15368,31 +9767,14 @@ "node": ">=6" } }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, "license": "MIT", - "dependencies": { - "package-json": "^8.1.0" - }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/launch-editor": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", - "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" + "node": ">= 8" } }, "node_modules/lazystream": { @@ -15408,13 +9790,6 @@ "node": ">= 0.6.3" } }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -15472,19 +9847,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -15503,19 +9865,16 @@ } }, "node_modules/lint-staged": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.5.tgz", - "integrity": "sha512-uAeQQwByI6dfV7wpt/gVqg+jAPaSp8WwOA8kKC/dv1qw14oGpnpAisY65ibGHUGDUv0rYaZ8CAJZ/1U8hUvC2A==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", + "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^5.5.0", - "commander": "^14.0.0", - "debug": "^4.4.1", - "lilconfig": "^3.1.3", - "listr2": "^9.0.1", + "commander": "^14.0.2", + "listr2": "^9.0.5", "micromatch": "^4.0.8", - "nano-spawn": "^1.0.2", + "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" @@ -15530,27 +9889,14 @@ "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", - "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/listr2": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.2.tgz", - "integrity": "sha512-VVd7cS6W+vLJu2wmq4QmfVj14Iep7cz4r/OWNk36Aq5ZOY7G8/BfCrQFexcwB1OIxB3yERiePfE/REBjEFulag==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { - "cli-truncate": "^4.0.0", + "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", @@ -15562,9 +9908,9 @@ } }, "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -15575,9 +9921,9 @@ } }, "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -15588,9 +9934,9 @@ } }, "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -15613,9 +9959,9 @@ } }, "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -15629,9 +9975,9 @@ } }, "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -15646,35 +9992,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -15698,26 +10015,12 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.iteratee": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.iteratee/-/lodash.iteratee-4.7.0.tgz", "integrity": "sha512-yv3cSQZmfpbIKo4Yo45B1taEvxjNvcpF1CEOc0Y6dEyvhPIfEJE3twDwPgWTPQubcSgXyBwBKG6wpQvWMDOf6Q==", "license": "MIT" }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -15725,13 +10028,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true, - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -15769,9 +10065,9 @@ } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -15785,9 +10081,9 @@ } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -15798,9 +10094,9 @@ } }, "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -15810,95 +10106,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -15918,9 +10132,9 @@ } }, "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -15934,9 +10148,9 @@ } }, "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -15961,42 +10175,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -16007,6 +10185,28 @@ "yallist": "^3.0.2" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -16104,6 +10304,7 @@ "integrity": "sha512-p3JTemJJbkiMjXEMiFwgm0v6ym5g8K+b2oDny+6xdl300tUKySxvilJQLSea48C6OaYNmO30kH9KxpiAg5bWJw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "globby": "15.0.0", "js-yaml": "4.1.1", @@ -16136,74 +10337,20 @@ "markdownlint-cli2": ">=0.0.4" } }, - "node_modules/markdownlint-cli2/node_modules/globby": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-15.0.0.tgz", - "integrity": "sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==", + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.5", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=20" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdownlint-cli2/node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdownlint-cli2/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-directive": { @@ -16282,38 +10429,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mdast-util-gfm": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", @@ -16573,9 +10688,9 @@ } }, "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", "dev": true, "license": "CC0-1.0" }, @@ -16586,45 +10701,6 @@ "dev": true, "license": "MIT" }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.51.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.1.tgz", - "integrity": "sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -16642,16 +10718,6 @@ "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -16741,23 +10807,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", @@ -17454,40 +11503,17 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "engines": { + "node": ">=8.6" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/mimic-fn": { @@ -17512,57 +11538,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", - "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "license": "ISC" - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -17576,16 +11551,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -17611,20 +11576,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "node_modules/mute-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", @@ -17635,9 +11586,9 @@ } }, "node_modules/nano-spawn": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.2.tgz", - "integrity": "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", "dev": true, "license": "MIT", "engines": { @@ -17667,9 +11618,9 @@ } }, "node_modules/napi-postinstall": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", - "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", "bin": { @@ -17746,60 +11697,37 @@ "node": ">=10" } }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", "dev": true, "license": "MIT" }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -17807,6 +11735,13 @@ "dev": true, "license": "MIT" }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", @@ -17824,19 +11759,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", - "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -17850,13 +11772,6 @@ "node": ">=8" } }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "dev": true, - "license": "MIT" - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -17869,130 +11784,25 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", "dev": true, "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" } }, - "node_modules/null-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "dev": true, "license": "MIT" }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -18018,32 +11828,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" } }, "node_modules/optionator": { @@ -18087,37 +11888,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, "engines": { - "node": ">=12.20" + "node": ">=8" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "yocto-queue": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -18139,14 +11951,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/p-locate/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" @@ -18155,59 +11967,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "node_modules/p-locate/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" }, "engines": { - "node": ">=16.17" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "dev": true, "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -18220,42 +12020,44 @@ "node": ">=6" } }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "dev": true, - "license": "MIT", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.4.0.tgz", + "integrity": "sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==", "dev": true, "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.4.0", + "@pagefind/darwin-x64": "1.4.0", + "@pagefind/freebsd-x64": "1.4.0", + "@pagefind/linux-arm64": "1.4.0", + "@pagefind/linux-x64": "1.4.0", + "@pagefind/windows-x64": "1.4.0" } }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true, + "license": "MIT" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -18315,12 +12117,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, "node_modules/parse5": { "version": "7.3.0", @@ -18335,20 +12149,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -18362,27 +12162,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -18403,13 +12182,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true, - "license": "(WTFPL OR MIT)" - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -18419,17 +12191,10 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", @@ -18443,34 +12208,34 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", - "license": "ISC", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, - "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "dev": true, + "license": "ISC" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -18479,13 +12244,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -18623,1432 +12388,30 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", - "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, { "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", - "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", - "dev": true, - "funding": [ + "url": "https://opencollective.com/postcss/" + }, { "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", - "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^6.1.1" }, "engines": { - "node": ">=18" + "node": ">=12.0" }, "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", - "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-custom-media": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-properties": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", - "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", - "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", - "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-discard-comments": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-unused": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", - "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", - "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-focus-within": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", - "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", - "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", - "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-lab-function": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", - "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-logical": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", - "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-merge-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nesting": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-resolve-nested": "^3.1.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", - "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", - "dev": true, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", - "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", - "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-preset-env": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.5.0.tgz", - "integrity": "sha512-xgxFQPAPxeWmsgy8cR7GM1PGAL/smA5E9qU7K//D4vucS01es3M0fDujhDJn3kY8Ip7/vVYcecbe1yY+vBo3qQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-alpha-function": "^1.0.1", - "@csstools/postcss-cascade-layers": "^5.0.2", - "@csstools/postcss-color-function": "^4.0.12", - "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", - "@csstools/postcss-color-mix-function": "^3.0.12", - "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", - "@csstools/postcss-content-alt-text": "^2.0.8", - "@csstools/postcss-contrast-color-function": "^2.0.12", - "@csstools/postcss-exponential-functions": "^2.0.9", - "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.11", - "@csstools/postcss-gradients-interpolation-method": "^5.0.12", - "@csstools/postcss-hwb-function": "^4.0.12", - "@csstools/postcss-ic-unit": "^4.0.4", - "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.3", - "@csstools/postcss-light-dark-function": "^2.0.11", - "@csstools/postcss-logical-float-and-clear": "^3.0.0", - "@csstools/postcss-logical-overflow": "^2.0.0", - "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", - "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.4", - "@csstools/postcss-media-minmax": "^2.0.9", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", - "@csstools/postcss-nested-calc": "^4.0.0", - "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.12", - "@csstools/postcss-position-area-property": "^1.0.0", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/postcss-random-function": "^2.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.12", - "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.4", - "@csstools/postcss-stepped-value-functions": "^4.0.9", - "@csstools/postcss-system-ui-font-family": "^1.0.0", - "@csstools/postcss-text-decoration-shorthand": "^4.0.3", - "@csstools/postcss-trigonometric-functions": "^4.0.9", - "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.22", - "browserslist": "^4.28.0", - "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.3", - "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.5.2", - "postcss-attribute-case-insensitive": "^7.0.1", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.12", - "postcss-color-hex-alpha": "^10.0.0", - "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.6", - "postcss-custom-properties": "^14.0.6", - "postcss-custom-selectors": "^8.0.5", - "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.4", - "postcss-focus-visible": "^10.0.1", - "postcss-focus-within": "^9.0.1", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^6.0.0", - "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.12", - "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.2", - "postcss-opacity-percentage": "^3.0.0", - "postcss-overflow-shorthand": "^6.0.0", - "postcss-page-break": "^3.0.4", - "postcss-place": "^10.0.0", - "postcss-pseudo-class-any-link": "^10.0.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^8.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", - "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", - "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "postcss": "^8.2.14" } }, "node_modules/postcss-selector-parser": { @@ -20065,75 +12428,6 @@ "node": ">=4" } }, - "node_modules/postcss-sort-media-queries": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sort-css-media-queries": "2.2.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.23" - } - }, - "node_modules/postcss-svgo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" - }, - "engines": { - "node": "^14 || ^16 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/postcss-zindex": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -20145,9 +12439,9 @@ } }, "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", "peer": true, @@ -20162,13 +12456,13 @@ } }, "node_modules/prettier-plugin-packagejson": { - "version": "2.5.19", - "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.19.tgz", - "integrity": "sha512-Qsqp4+jsZbKMpEGZB1UP1pxeAT8sCzne2IwnKkr+QhUe665EXUo3BAvTf1kAPCqyMv9kg3ZmO0+7eOni/C6Uag==", + "version": "2.5.20", + "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.20.tgz", + "integrity": "sha512-G8cowPh+QmJJECTZlrPDKWkVVcwrFjF2rGcw546w3N8blLoc4szSs8UUPfFVxHUNLUjiru71Ah83g1lZkeK9Bw==", "dev": true, "license": "MIT", "dependencies": { - "sort-package-json": "3.4.0", + "sort-package-json": "3.5.0", "synckit": "0.11.11" }, "peerDependencies": { @@ -20180,21 +12474,10 @@ } } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "node_modules/pretty-format": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", - "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", "dependencies": { @@ -20219,30 +12502,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", - "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -20284,25 +12543,6 @@ "node": ">= 6" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, "node_modules/property-information": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", @@ -20314,37 +12554,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "license": "ISC" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -20365,22 +12574,6 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", - "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pure-rand": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", @@ -20398,22 +12591,6 @@ ], "license": "MIT" }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -20435,166 +12612,13 @@ ], "license": "MIT" }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "dev": true, "license": "MIT" }, - "node_modules/react-helmet-async": { - "name": "@slorber/react-helmet-async", - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -20602,125 +12626,46 @@ "dev": true, "license": "MIT" }, - "node_modules/react-json-view-lite": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", - "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/react": "*" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/readdir-glob": { @@ -20757,16 +12702,17 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/recma-build-jsx": { @@ -20840,26 +12786,33 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" + "regex-utilities": "^2.3.0" } }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, "node_modules/regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", @@ -20870,73 +12823,6 @@ "regexp-tree": "bin/regexp-tree" } }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexpu-core/node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/registry-auth-token": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", - "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, "node_modules/regjsparser": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", @@ -20963,6 +12849,64 @@ "node": ">=6" } }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.5.tgz", + "integrity": "sha512-SzKJyu7heDpkt+XE/AqeWsYMSMocE/5mpJXD6CMgstqJHSE9bxGNcLp3zL9Wne3M5iBsS4GJyOD2syV77kRveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expressive-code": "^0.41.5" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", @@ -20995,14 +12939,20 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.10" + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/remark-directive": { @@ -21042,40 +12992,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/remark-frontmatter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -21144,6 +13060,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/remark-stringify": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", @@ -21159,123 +13091,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -21286,60 +13101,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -21373,13 +13134,6 @@ "node": ">=4" } }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "dev": true, - "license": "MIT" - }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -21390,49 +13144,109 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { - "lowercase-keys": "^3.0.0" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, "engines": { - "node": ">= 4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restructure": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/reusify": { @@ -21453,36 +13267,47 @@ "dev": true, "license": "MIT" }, - "node_modules/rtlcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", - "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "node_modules/rollup": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", + "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0", - "postcss": "^8.4.21", - "strip-json-comments": "^3.1.1" + "@types/estree": "1.0.8" }, "bin": { - "rtlcss": "bin/rtlcss.js" + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.54.0", + "@rollup/rollup-android-arm64": "4.54.0", + "@rollup/rollup-darwin-arm64": "4.54.0", + "@rollup/rollup-darwin-x64": "4.54.0", + "@rollup/rollup-freebsd-arm64": "4.54.0", + "@rollup/rollup-freebsd-x64": "4.54.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", + "@rollup/rollup-linux-arm-musleabihf": "4.54.0", + "@rollup/rollup-linux-arm64-gnu": "4.54.0", + "@rollup/rollup-linux-arm64-musl": "4.54.0", + "@rollup/rollup-linux-loong64-gnu": "4.54.0", + "@rollup/rollup-linux-ppc64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-musl": "4.54.0", + "@rollup/rollup-linux-s390x-gnu": "4.54.0", + "@rollup/rollup-linux-x64-gnu": "4.54.0", + "@rollup/rollup-linux-x64-musl": "4.54.0", + "@rollup/rollup-openharmony-arm64": "4.54.0", + "@rollup/rollup-win32-arm64-msvc": "4.54.0", + "@rollup/rollup-win32-ia32-msvc": "4.54.0", + "@rollup/rollup-win32-x64-gnu": "4.54.0", + "@rollup/rollup-win32-x64-msvc": "4.54.0", + "fsevents": "~2.3.2" } }, "node_modules/run-async": { @@ -21554,107 +13379,10 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-dts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "license": "BlueOak-1.0.0" }, "node_modules/secure-keys": { "version": "1.0.0", @@ -21663,31 +13391,10 @@ "dev": true, "license": "MIT" }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true, - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -21696,254 +13403,46 @@ "node": ">=10" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", "dev": true, - "license": "MIT", + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "semver": "^7.3.5" + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" }, "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" + "url": "https://opencollective.com/libvips" }, - "engines": { - "node": ">= 0.8.0" + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true, - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -21965,93 +13464,21 @@ "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "node_modules/shiki": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.20.0.tgz", + "integrity": "sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@shikijs/core": "3.20.0", + "@shikijs/engine-javascript": "3.20.0", + "@shikijs/engine-oniguruma": "3.20.0", + "@shikijs/langs": "3.20.0", + "@shikijs/themes": "3.20.0", + "@shikijs/types": "3.20.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" } }, "node_modules/signal-exit": { @@ -22066,21 +13493,23 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", "dev": true, "license": "MIT", "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" + "is-arrayish": "^0.3.1" } }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "dev": true, + "license": "MIT" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -22089,23 +13518,23 @@ "license": "MIT" }, "node_modules/sitemap": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", - "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.2.tgz", + "integrity": "sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", "arg": "^5.0.0", - "sax": "^1.2.4" + "sax": "^1.4.1" }, "bin": { "sitemap": "dist/cli.js" }, "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" + "node": ">=14.0.0", + "npm": ">=6.0.0" } }, "node_modules/sitemap/node_modules/@types/node": { @@ -22115,19 +13544,6 @@ "dev": true, "license": "MIT" }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -22139,26 +13555,26 @@ } }, "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -22168,50 +13584,30 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sort-css-media-queries": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", - "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">= 6.3.0" + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" } }, "node_modules/sort-object-keys": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", - "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-2.0.1.tgz", + "integrity": "sha512-R89fO+z3x7hiKPXX5P0qim+ge6Y60AjtlW+QQpRozrrNcR1lw9Pkpm5MLB56HoNvdcLHL4wbpq16OcvGpEDJIg==", "dev": true, "license": "MIT" }, "node_modules/sort-package-json": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.4.0.tgz", - "integrity": "sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.5.0.tgz", + "integrity": "sha512-moY4UtptUuP5sPuu9H9dp8xHNel7eP5/Kz/7+90jTvC0IOiPH2LigtRM/aSFSxreaWoToHUVUpEV4a2tAs2oKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22220,7 +13616,7 @@ "git-hooks-list": "^4.0.0", "is-plain-obj": "^4.1.0", "semver": "^7.7.1", - "sort-object-keys": "^1.1.3", + "sort-object-keys": "^2.0.0", "tinyglobby": "^0.2.12" }, "bin": { @@ -22244,13 +13640,13 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, "node_modules/source-map-js": { @@ -22274,6 +13670,16 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", @@ -22285,38 +13691,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -22324,19 +13698,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/srcset": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -22360,20 +13721,10 @@ "node": ">=8" } }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", "dev": true, "license": "MIT" }, @@ -22484,21 +13835,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -22534,16 +13870,6 @@ "node": ">=8" } }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -22555,14 +13881,11 @@ } }, "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", - "dependencies": { - "min-indent": "^1.0.1" - }, "engines": { "node": ">=12" }, @@ -22603,23 +13926,6 @@ "inline-style-parser": "0.2.7" } }, - "node_modules/stylehacks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22632,46 +13938,26 @@ "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true, - "license": "MIT" - }, "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", "dev": true, "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", + "commander": "^11.1.0", "css-select": "^5.1.0", - "css-tree": "^2.3.1", + "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1", + "sax": "^1.4.1" }, "bin": { - "svgo": "bin/svgo" + "svgo": "bin/svgo.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=16" }, "funding": { "type": "opencollective", @@ -22679,27 +13965,13 @@ } }, "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 10" - } - }, - "node_modules/swr": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.8.tgz", - "integrity": "sha512-gaCPRVoMq8WGDcWj9p4YWzCMPHzE0WNl6W8ADIx9c3JBEIdMkJGMzW+uzXvxHMltwcYACr9jP+32H8/hgwMR7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.6.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node": ">=16" } }, "node_modules/synckit": { @@ -22744,156 +14016,103 @@ "streamx": "^2.15.0" } }, - "node_modules/tar-stream/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/terser": { - "version": "5.44.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", - "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/test-exclude/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -22909,81 +14128,32 @@ "b4a": "^1.6.4" } }, - "node_modules/text-decoder/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/thingies": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", - "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/throttleit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "dev": true, "license": "MIT", "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "dev": true, - "license": "MIT" - }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -22992,48 +14162,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -23054,43 +14182,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tree-dump": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -23135,25 +14226,32 @@ "typescript": ">=4.0.0" } }, - "node_modules/ts-declaration-location/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "bin": { + "tsconfck": "bin/tsconfck.js" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -23179,9 +14277,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -23190,57 +14288,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -23259,65 +14310,54 @@ "dev": true, "license": "MIT" }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "dev": true, + "license": "MIT" + }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "devOptional": true, "license": "MIT" }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", "dev": true, "license": "MIT", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" } }, "node_modules/unicorn-magic": { @@ -23352,20 +14392,16 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "node_modules/unifont": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.6.0.tgz", + "integrity": "sha512-5Fx50fFQMQL5aeHyWnZX9122sSLckcDvcfFiBf3QYeHa7a1MKJooUy52b67moi2MJYkrfo/TWY+CoLdr/w0tTA==", "dev": true, "license": "MIT", "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "css-tree": "^3.0.0", + "ofetch": "^1.4.1", + "ohash": "^2.0.0" } }, "node_modules/unist-util-find": { @@ -23383,10 +14419,25 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -23396,6 +14447,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-position": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", @@ -23424,6 +14490,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-5.1.0.tgz", @@ -23469,10 +14550,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -23492,16 +14587,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -23537,6 +14622,110 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, + "node_modules/unstorage": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.3.tgz", + "integrity": "sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.4", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -23568,211 +14757,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/update-notifier/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -23783,129 +14767,12 @@ "punycode": "^2.1.0" } }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -23921,23 +14788,6 @@ "node": ">=10.12.0" } }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -23981,6 +14831,102 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -23991,30 +14937,6 @@ "makeerror": "1.0.12" } }, - "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -24035,416 +14957,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/webpack": { - "version": "5.104.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", - "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.4", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.4.4", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", - "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/express-serve-static-core": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.9", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpackbar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", - "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "consola": "^3.2.3", - "figures": "^3.2.0", - "markdown-table": "^2.0.0", - "pretty-time": "^1.1.0", - "std-env": "^3.7.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/webpackbar/node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/webpackbar/node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -24460,6 +14972,16 @@ "node": ">= 8" } }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -24472,13 +14994,6 @@ "node": ">=8" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -24545,86 +15060,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, "node_modules/xml2js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", @@ -24647,6 +15082,13 @@ "node": ">=4.0" } }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "dev": true, + "license": "MIT" + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -24665,21 +15107,25 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yaml-eslint-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz", - "integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz", + "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==", "dev": true, "license": "MIT", "dependencies": { @@ -24722,6 +15168,37 @@ "yamllint": "dist/cli.js" } }, + "node_modules/yaml-lint/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yaml-lint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -24752,13 +15229,42 @@ } }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz", + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -24791,52 +15297,10 @@ "node": ">= 14" } }, - "node_modules/zip-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/zip-stream/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/zod": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", "peer": true, @@ -24844,6 +15308,26 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "dev": true, + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index c7bab7f1..a7eb150f 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,9 @@ "bmad:install": "node tools/cli/bmad-cli.js install", "bundle": "node tools/cli/bundlers/bundle-web.js all", "docs:build": "node tools/build-docs.js", - "docs:dev": "npm run docs:build && npm run docs:serve", - "docs:serve": "docusaurus start --config website/docusaurus.config.js --host localhost", + "docs:check-links": "node tools/check-doc-links.js", + "docs:dev": "astro dev --root website", + "docs:preview": "astro preview --root website", "flatten": "node tools/flattener/main.js", "format:check": "prettier --check \"**/*.{js,cjs,mjs,json,yaml}\"", "format:fix": "prettier --write \"**/*.{js,cjs,mjs,json,yaml}\"", @@ -84,10 +85,11 @@ "yaml": "^2.7.0" }, "devDependencies": { - "@docusaurus/core": "^3.6.0", - "@docusaurus/preset-classic": "^3.6.0", + "@astrojs/sitemap": "^3.6.0", + "@astrojs/starlight": "^0.37.0", "@eslint/js": "^9.33.0", "archiver": "^7.0.1", + "astro": "^5.16.0", "c8": "^10.1.3", "eslint": "^9.33.0", "eslint-config-prettier": "^10.1.8", @@ -100,12 +102,9 @@ "markdownlint-cli2": "^0.19.1", "prettier": "^3.5.3", "prettier-plugin-packagejson": "^2.5.19", - "prism-react-renderer": "^2.4.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "sharp": "^0.33.5", "yaml-eslint-parser": "^1.2.3", - "yaml-lint": "^1.7.0", - "zod": "^4.1.12" + "yaml-lint": "^1.7.0" }, "engines": { "node": ">=20.0.0" diff --git a/src/modules/cis/module.yaml b/src/modules/cis/module.yaml index f03960d0..02ce7ca9 100644 --- a/src/modules/cis/module.yaml +++ b/src/modules/cis/module.yaml @@ -4,6 +4,7 @@ header: "Creative Innovation Suite (CIS) Module" subheader: "No custom configuration required - uses Core settings only" default_selected: false # This module will not be selected by default for new installations + # Variables from Core Config inserted: ## user_name ## communication_language diff --git a/tools/build-docs.js b/tools/build-docs.js index bfeda390..a5080a76 100644 --- a/tools/build-docs.js +++ b/tools/build-docs.js @@ -2,12 +2,11 @@ * BMAD Documentation Build Pipeline * * Consolidates docs from multiple sources, generates LLM-friendly files, - * creates downloadable bundles, and builds the Docusaurus site. + * creates downloadable bundles, and builds the Astro+Starlight site. * * Build outputs: - * build/consolidated/ - Merged docs from all sources * build/artifacts/ - With llms.txt, llms-full.txt, ZIPs - * build/site/ - Final Docusaurus output (deployable) + * build/site/ - Final Astro output (deployable) */ const { execSync } = require('node:child_process'); @@ -28,17 +27,17 @@ const REPO_URL = 'https://github.com/bmad-code-org/BMAD-METHOD'; const LLM_MAX_CHARS = 600_000; const LLM_WARN_CHARS = 500_000; -const MODULES = ['bmm', 'bmb', 'bmgd', 'cis']; - -// No root docs copied - only docs/ folder content goes to site -// README.md, CHANGELOG.md etc. link to GitHub -const ROOT_DOCS = []; - const LLM_EXCLUDE_PATTERNS = ['changelog', 'ide-info/', 'v4-to-v6-upgrade', 'downloads/', 'faq']; // ============================================================================= // Main Entry Point -// ============================================================================= +/** + * Orchestrates the full BMAD documentation build pipeline. + * + * Executes the high-level build steps in sequence: prints headers and paths, validates internal + * documentation links, cleans the build directory, generates artifacts from the `docs/` folder, + * builds the Astro site, and prints a final build summary. + */ async function main() { console.log(); @@ -48,13 +47,16 @@ async function main() { console.log(`Build directory: ${BUILD_DIR}`); console.log(); + // Check for broken internal links before building + checkDocLinks(); + cleanBuildDirectory(); - const consolidatedDir = consolidateDocs(); - const artifactsDir = await generateArtifacts(consolidatedDir); - const siteDir = buildDocusaurusSite(artifactsDir); + const docsDir = path.join(PROJECT_ROOT, 'docs'); + const artifactsDir = await generateArtifacts(docsDir); + const siteDir = buildAstroSite(); - printBuildSummary(consolidatedDir, artifactsDir, siteDir); + printBuildSummary(docsDir, artifactsDir, siteDir); } main().catch((error) => { @@ -64,33 +66,25 @@ main().catch((error) => { // ============================================================================= // Pipeline Stages -// ============================================================================= +/** + * Generate LLM files and downloadable bundles for the documentation pipeline. + * + * Creates the build/artifacts directory, writes `llms.txt` and `llms-full.txt` (sourced from the provided docs directory), + * and produces download ZIP bundles. + * + * @param {string} docsDir - Path to the source docs directory containing Markdown files. + * @returns {string} Path to the created artifacts directory. + */ -function consolidateDocs() { - printHeader('Consolidating documentation sources'); - - const outputDir = path.join(BUILD_DIR, 'consolidated'); - fs.mkdirSync(outputDir, { recursive: true }); - - copyMainDocs(outputDir); - copyRootDocs(outputDir); - copyModuleDocs(outputDir); - - const mdCount = countMarkdownFiles(outputDir); - console.log(); - console.log(` \u001B[32m✓\u001B[0m Consolidation complete: ${mdCount} markdown files`); - - return outputDir; -} - -async function generateArtifacts(consolidatedDir) { +async function generateArtifacts(docsDir) { printHeader('Generating LLM files and download bundles'); const outputDir = path.join(BUILD_DIR, 'artifacts'); - copyDirectory(consolidatedDir, outputDir); + fs.mkdirSync(outputDir, { recursive: true }); + // Generate LLM files reading from docs/, output to artifacts/ generateLlmsTxt(outputDir); - generateLlmsFullTxt(outputDir); + generateLlmsFullTxt(docsDir, outputDir); await generateDownloadBundles(outputDir); console.log(); @@ -99,82 +93,39 @@ async function generateArtifacts(consolidatedDir) { return outputDir; } -function buildDocusaurusSite(artifactsDir) { - printHeader('Building Docusaurus site'); +/** + * Builds the Astro + Starlight site and copies generated artifacts into the site output directory. + * + * @returns {string} The filesystem path to the built site directory (e.g., build/site). + */ +function buildAstroSite() { + printHeader('Building Astro + Starlight site'); const siteDir = path.join(BUILD_DIR, 'site'); - const mainDocs = path.join(PROJECT_ROOT, 'docs'); - const docsBackup = path.join(BUILD_DIR, 'docs-backup'); - - backupAndReplaceDocs(mainDocs, docsBackup, artifactsDir); - - try { - runDocusaurusBuild(siteDir); - } finally { - restoreDocs(mainDocs, docsBackup); - } + const artifactsDir = path.join(BUILD_DIR, 'artifacts'); + // Build Astro site (outputs to build/site via astro.config.mjs) + runAstroBuild(); copyArtifactsToSite(artifactsDir, siteDir); + // No longer needed: Inject AI agents banner into every HTML page + // injectAgentBanner(siteDir); + console.log(); - console.log(` \u001B[32m✓\u001B[0m Docusaurus build complete`); + console.log(` \u001B[32m✓\u001B[0m Astro build complete`); return siteDir; } -// ============================================================================= -// Documentation Consolidation -// ============================================================================= - -function copyMainDocs(destDir) { - console.log(' → Copying main docs...'); - const docsDir = path.join(PROJECT_ROOT, 'docs'); - // Include modules folder - docs now live in docs/modules/ instead of src/modules/*/docs/ - copyDirectory(docsDir, destDir, ['llms.txt', 'llms-full.txt'], true); -} - -function copyRootDocs(destDir) { - console.log(' → Copying root documentation files...'); - - for (const doc of ROOT_DOCS) { - const srcPath = path.join(PROJECT_ROOT, doc.src); - const destPath = path.join(destDir, doc.dest); - - if (fs.existsSync(srcPath)) { - let content = fs.readFileSync(srcPath, 'utf-8'); - - if (!content.startsWith('---')) { - content = `---\ntitle: "${doc.title}"\n---\n\n${content}`; - } - - content = transformMarkdownLinks(content); - fs.writeFileSync(destPath, content); - console.log(` ${doc.src} → ${doc.dest}`); - } - } -} - -function copyModuleDocs(destDir) { - fs.mkdirSync(path.join(destDir, 'modules'), { recursive: true }); - - for (const moduleName of MODULES) { - const srcPath = path.join(PROJECT_ROOT, 'src', 'modules', moduleName, 'docs'); - const moduleDest = path.join(destDir, 'modules', moduleName); - - if (fs.existsSync(srcPath)) { - console.log(` → Copying ${moduleName} docs...`); - copyDirectory(srcPath, moduleDest, [], false, moduleName); - const count = countMarkdownFiles(moduleDest); - console.log(` ${count} markdown files`); - } else { - console.log(` ⚠ WARNING: ${moduleName} docs not found`); - } - } -} - // ============================================================================= // LLM File Generation -// ============================================================================= +/** + * Create a concise llms.txt summary file containing project metadata, core links, and quick navigation entries for LLM consumption. + * + * Writes the file to `${outputDir}/llms.txt`. + * + * @param {string} outputDir - Destination directory where `llms.txt` will be written. + */ function generateLlmsTxt(outputDir) { console.log(' → Generating llms.txt...'); @@ -220,11 +171,18 @@ function generateLlmsTxt(outputDir) { console.log(` Generated llms.txt (${content.length.toLocaleString()} chars)`); } -function generateLlmsFullTxt(outputDir) { +/** + * Builds a consolidated llms-full.txt containing all Markdown files under docsDir wrapped in tags for LLM consumption. + * + * Writes the generated file to outputDir/llms-full.txt. Files matching LLM_EXCLUDE_PATTERNS are skipped; read errors for individual files are logged. The combined content is validated against configured size thresholds (will exit on overflow and warn if near limit). + * @param {string} docsDir - Root directory containing source Markdown files; paths in the output are relative to this directory. + * @param {string} outputDir - Directory where llms-full.txt will be written. + */ +function generateLlmsFullTxt(docsDir, outputDir) { console.log(' → Generating llms-full.txt...'); const date = new Date().toISOString().split('T')[0]; - const files = getDocsFromSidebar(); + const files = getAllMarkdownFiles(docsDir); const output = [ '# BMAD Method Documentation (Full)', @@ -244,7 +202,7 @@ function generateLlmsFullTxt(outputDir) { continue; } - const fullPath = path.join(outputDir, mdPath); + const fullPath = path.join(docsDir, mdPath); try { const content = readMarkdownContent(fullPath); output.push(``, content, '', ''); @@ -266,34 +224,35 @@ function generateLlmsFullTxt(outputDir) { ); } -function getDocsFromSidebar() { - const sidebarsPath = path.join(PROJECT_ROOT, 'website', 'sidebars.js'); +/** + * Collects all Markdown (.md) files under a directory and returns their paths relative to a base directory. + * @param {string} dir - Directory to search for Markdown files. + * @param {string} [baseDir=dir] - Base directory used to compute returned relative paths. + * @returns {string[]} An array of file paths (relative to `baseDir`) for every `.md` file found under `dir`. + */ +function getAllMarkdownFiles(dir, baseDir = dir) { + const files = []; - try { - const sidebarContent = fs.readFileSync(sidebarsPath, 'utf-8'); - const matches = sidebarContent.matchAll(/'([a-zA-Z0-9\-_/]+)'/g); - const files = []; + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const fullPath = path.join(dir, entry.name); - for (const match of matches) { - const docId = match[1]; - // Skip Docusaurus keywords - if (docId.includes('Sidebar') || docId === 'doc' || docId === 'category') { - continue; - } - // Skip category labels (Title Case words without slashes like 'Workflows', 'Reference') - if (!docId.includes('/') && /^[A-Z][a-z]/.test(docId)) { - continue; - } - files.push(docId + '.md'); + if (entry.isDirectory()) { + files.push(...getAllMarkdownFiles(fullPath, baseDir)); + } else if (entry.name.endsWith('.md')) { + // Return relative path from baseDir + const relativePath = path.relative(baseDir, fullPath); + files.push(relativePath); } - - return files; - } catch { - console.log(' Warning: Could not parse sidebars'); - return []; } + + return files; } +/** + * Determine whether a file path matches any configured LLM exclusion pattern. + * @param {string} filePath - The file path to test. + * @returns {boolean} `true` if the path contains any pattern from LLM_EXCLUDE_PATTERNS, `false` otherwise. + */ function shouldExcludeFromLlm(filePath) { return LLM_EXCLUDE_PATTERNS.some((pattern) => filePath.includes(pattern)); } @@ -347,6 +306,12 @@ async function generateSourcesBundle(downloadsDir) { console.log(` bmad-sources.zip (${size}M)`); } +/** + * Create a zip archive of the project's prompts modules and place it in the downloads directory. + * + * Creates bmad-prompts.zip from src/modules, excluding common unwanted paths, writes it to the provided downloads directory, and logs the resulting file size. If the modules directory does not exist, the function returns without creating a bundle. + * @param {string} downloadsDir - Destination directory where bmad-prompts.zip will be written. + */ async function generatePromptsBundle(downloadsDir) { const modulesDir = path.join(PROJECT_ROOT, 'src', 'modules'); if (!fs.existsSync(modulesDir)) return; @@ -359,39 +324,31 @@ async function generatePromptsBundle(downloadsDir) { } // ============================================================================= -// Docusaurus Build -// ============================================================================= - -function backupAndReplaceDocs(mainDocs, backupDir, artifactsDir) { - console.log(' → Preparing docs for Docusaurus...'); - - if (fs.existsSync(mainDocs)) { - copyDirectory(mainDocs, backupDir); - fs.rmSync(mainDocs, { recursive: true }); - } - - copyDirectory(artifactsDir, mainDocs, ['llms.txt', 'llms-full.txt']); - removeZipFiles(path.join(mainDocs, 'downloads')); -} - -function runDocusaurusBuild(siteDir) { - console.log(' → Running docusaurus build...'); - execSync('npx docusaurus build --config website/docusaurus.config.js --out-dir ' + siteDir, { +// Astro Build +/** + * Builds the Astro site to build/site (configured in astro.config.mjs). + */ +function runAstroBuild() { + console.log(' → Running astro build...'); + execSync('npx astro build --root website', { cwd: PROJECT_ROOT, stdio: 'inherit', + env: { + ...process.env, + NODE_OPTIONS: `${process.env.NODE_OPTIONS || ''} --disable-warning=MODULE_TYPELESS_PACKAGE_JSON`.trim(), + }, }); } -function restoreDocs(mainDocs, backupDir) { - console.log(' → Restoring original docs...'); - fs.rmSync(mainDocs, { recursive: true }); - - if (fs.existsSync(backupDir)) { - copyDirectory(backupDir, mainDocs); - fs.rmSync(backupDir, { recursive: true }); - } -} - +/** + * Copy generated artifact files into the built site directory. + * + * Copies llms.txt and llms-full.txt from the artifacts directory into the site directory. + * If a downloads subdirectory exists under artifacts, copies it into siteDir/downloads. + * + * @param {string} artifactsDir - Path to the build artifacts directory containing generated files. + * @param {string} siteDir - Path to the target site directory where artifacts should be placed. + */ function copyArtifactsToSite(artifactsDir, siteDir) { console.log(' → Copying artifacts to site...'); @@ -404,28 +361,24 @@ function copyArtifactsToSite(artifactsDir, siteDir) { } } -function removeZipFiles(dir) { - if (!fs.existsSync(dir)) return; - - for (const file of fs.readdirSync(dir)) { - if (file.endsWith('.zip')) { - fs.unlinkSync(path.join(dir, file)); - } - } -} - // ============================================================================= // Build Summary -// ============================================================================= +/** + * Prints a concise end-of-build summary and displays a sample listing of the final site directory. + * + * @param {string} docsDir - Path to the source documentation directory used for the build. + * @param {string} artifactsDir - Path to the directory containing generated artifacts (e.g., llms.txt, downloads). + * @param {string} siteDir - Path to the final built site directory whose contents will be listed. + */ -function printBuildSummary(consolidatedDir, artifactsDir, siteDir) { +function printBuildSummary(docsDir, artifactsDir, siteDir) { console.log(); printBanner('Build Complete!'); console.log(); console.log('Build artifacts:'); - console.log(` Consolidated docs: ${consolidatedDir}`); - console.log(` Generated files: ${artifactsDir}`); - console.log(` Final site: ${siteDir}`); + console.log(` Source docs: ${docsDir}`); + console.log(` Generated files: ${artifactsDir}`); + console.log(` Final site: ${siteDir}`); console.log(); console.log(`Deployable output: ${siteDir}/`); console.log(); @@ -449,6 +402,11 @@ function listDirectoryContents(dir) { } } +/** + * Format a byte count into a compact human-readable string using B, K, or M units. + * @param {number} bytes - The number of bytes to format. + * @returns {string} The formatted size: bytes as `N B` (e.g. `512B`), kilobytes truncated to an integer with `K` (e.g. `2K`), or megabytes with one decimal and `M` (e.g. `1.2M`). + */ function formatFileSize(bytes) { if (bytes > 1024 * 1024) { return `${(bytes / 1024 / 1024).toFixed(1)}M`; @@ -459,8 +417,38 @@ function formatFileSize(bytes) { } // ============================================================================= -// File System Utilities +// Post-build Injection +/** + * Recursively collects all files with the given extension under a directory. + * + * @param {string} dir - Root directory to search. + * @param {string} ext - File extension to match (include the leading dot, e.g. ".md"). + * @returns {string[]} An array of file paths for files ending with `ext` found under `dir`. + */ + +function getAllFilesByExtension(dir, ext) { + const result = []; + const entries = fs.readdirSync(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + result.push(...getAllFilesByExtension(fullPath, ext)); + } else if (entry.name.endsWith(ext)) { + result.push(fullPath); + } + } + + return result; +} + // ============================================================================= +// File System Utilities +/** + * Remove any existing build output and recreate the build directory. + * + * Ensures the configured BUILD_DIR is empty by deleting it if present and then creating a fresh directory. + */ function cleanBuildDirectory() { console.log('Cleaning previous build...'); @@ -471,7 +459,15 @@ function cleanBuildDirectory() { fs.mkdirSync(BUILD_DIR, { recursive: true }); } -function copyDirectory(src, dest, exclude = [], transformMd = false, moduleName = null) { +/** + * Recursively copies all files and subdirectories from one directory to another, creating the destination if needed. + * + * @param {string} src - Path to the source directory to copy from. + * @param {string} dest - Path to the destination directory to copy to. + * @param {string[]} [exclude=[]] - List of file or directory names (not paths) to skip while copying. + * @returns {boolean} `true` if the source existed and copying proceeded, `false` if the source did not exist. + */ +function copyDirectory(src, dest, exclude = []) { if (!fs.existsSync(src)) return false; fs.mkdirSync(dest, { recursive: true }); @@ -482,12 +478,7 @@ function copyDirectory(src, dest, exclude = [], transformMd = false, moduleName const destPath = path.join(dest, entry.name); if (entry.isDirectory()) { - copyDirectory(srcPath, destPath, exclude, transformMd, moduleName); - } else if (entry.name.endsWith('.md')) { - // Always transform markdown links, use module context if provided - let content = fs.readFileSync(srcPath, 'utf-8'); - content = transformMarkdownLinks(content, moduleName); - fs.writeFileSync(destPath, content); + copyDirectory(srcPath, destPath, exclude); } else { fs.copyFileSync(srcPath, destPath); } @@ -495,102 +486,13 @@ function copyDirectory(src, dest, exclude = [], transformMd = false, moduleName return true; } -function transformMarkdownLinks(content, moduleName = null) { - // Transform HTML img src attributes for module docs images - content = content.replaceAll(/src="\.\/src\/modules\/([^/]+)\/docs\/images\/([^"]+)"/g, (match, mod, file) => { - return `src="./modules/${mod}/images/${file}"`; - }); - - return content.replaceAll(/\]\(([^)]+)\)/g, (match, url) => { - // src/modules/{mod}/docs/{path}.md → ./modules/{mod}/{path}.md - // Keeps .md - Docusaurus handles .md → page conversion - const docsMatch = url.match(/^\.\.?\/src\/modules\/([^/]+)\/docs\/(.+\.md)$/); - if (docsMatch) return `](./modules/${docsMatch[1]}/${docsMatch[2]})`; - - // src/modules/{mod}/docs/ → ./modules/{mod}/ - const docsDirMatch = url.match(/^\.\.?\/src\/modules\/([^/]+)\/docs\/$/); - if (docsDirMatch) return `](./modules/${docsDirMatch[1]}/)`; - - // src/modules/{mod}/docs/images/{file} → ./modules/{mod}/images/{file} - const docsImageMatch = url.match(/^\.\.?\/src\/modules\/([^/]+)\/docs\/images\/(.+)$/); - if (docsImageMatch) return `](./modules/${docsImageMatch[1]}/images/${docsImageMatch[2]})`; - - // src/modules/{mod}/README.md → GitHub (not in docs folder) - const readmeMatch = url.match(/^\.\.?\/src\/modules\/([^/]+)\/README\.md$/i); - if (readmeMatch) return `](${REPO_URL}/blob/main/src/modules/${readmeMatch[1]}/README.md)`; - - // src/modules/* (non-docs) → GitHub - const srcMatch = url.match(/^\.\.?\/src\/modules\/(.+)$/); - if (srcMatch) return `](${REPO_URL}/tree/main/src/modules/${srcMatch[1]})`; - - // Relative paths escaping docs/ folder → GitHub (when module context is known) - // e.g., ../workflows/foo/bar.md from within docs/ → src/modules/{mod}/workflows/foo/bar.md - if (moduleName) { - const relativeEscapeMatch = url.match(/^\.\.\/([^.][^)]+)$/); - if (relativeEscapeMatch && !relativeEscapeMatch[1].startsWith('src/')) { - const relativePath = relativeEscapeMatch[1]; - return `](${REPO_URL}/blob/main/src/modules/${moduleName}/${relativePath})`; - } - } - - // ./docs/{path}.md → ./{path}.md (docs folder contents are at root in build) - // Keeps .md - Docusaurus handles .md → page conversion - const rootDocsMatch = url.match(/^\.\/docs\/(.+\.md)$/); - if (rootDocsMatch) return `](./${rootDocsMatch[1]})`; - - // Root docs → GitHub (not part of docs site) - if (url === '../README.md' || url === './README.md' || url === './project-readme') { - return `](${REPO_URL}/blob/main/README.md)`; - } - if (url === '../CHANGELOG.md' || url === './CHANGELOG.md' || url === './changelog') { - return `](${REPO_URL}/blob/main/CHANGELOG.md)`; - } - - // Root files → GitHub (CONTRIBUTING, LICENSE, CODE_OF_CONDUCT, etc.) - const contributingMatch = url.match(/^(\.\.\/)?CONTRIBUTING\.md(#.*)?$/); - if (contributingMatch) { - const anchor = contributingMatch[2] || ''; - return `](${REPO_URL}/blob/main/CONTRIBUTING.md${anchor})`; - } - if (url === 'LICENSE' || url === '../LICENSE') { - return `](${REPO_URL}/blob/main/LICENSE)`; - } - if (url === '.github/CODE_OF_CONDUCT.md' || url === '../.github/CODE_OF_CONDUCT.md') { - return `](${REPO_URL}/blob/main/.github/CODE_OF_CONDUCT.md)`; - } - - // Other root .md files → GitHub - const rootFileMatch = url.match(/^\.\.\/([A-Z][^/]+\.md)$/); - if (rootFileMatch) return `](${REPO_URL}/blob/main/${rootFileMatch[1]})`; - - // Cross-module doc links: ../../{mod}/docs/{path}.md → ../{mod}/{path}.md - // Fixes path structure but keeps .md (Docusaurus handles .md → page conversion) - const crossModuleDocsMatch = url.match(/^\.\.\/\.\.\/([^/]+)\/docs\/(.+\.md)$/); - if (crossModuleDocsMatch) return `](../${crossModuleDocsMatch[1]}/${crossModuleDocsMatch[2]})`; - - // Root-level folders (samples/) → GitHub - const rootFolderMatch = url.match(/^\.\.\/((samples)\/.*)/); - if (rootFolderMatch) return `](${REPO_URL}/blob/main/${rootFolderMatch[1]})`; - - return match; - }); -} - -function countMarkdownFiles(dir) { - let count = 0; - if (!fs.existsSync(dir)) return 0; - - for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { - const fullPath = path.join(dir, entry.name); - if (entry.isDirectory()) { - count += countMarkdownFiles(fullPath); - } else if (entry.name.endsWith('.md')) { - count++; - } - } - return count; -} - +/** + * Create a ZIP archive of a directory, optionally excluding entries that match given substrings. + * @param {string} sourceDir - Path to the source directory to archive. + * @param {string} outputPath - Path to write the resulting ZIP file. + * @param {string[]} [exclude=[]] - Array of substrings; any entry whose path includes one of these substrings will be omitted. + * @returns {Promise} Resolves when the archive has been fully written and closed, rejects on error. + */ function createZipArchive(sourceDir, outputPath, exclude = []) { return new Promise((resolve, reject) => { const output = fs.createWriteStream(outputPath); @@ -624,8 +526,34 @@ function printHeader(title) { console.log('└' + '─'.repeat(62) + '┘'); } +/** + * Prints a centered decorative ASCII banner to the console using the provided title. + * @param {string} title - Text to display centered inside the banner. */ function printBanner(title) { console.log('╔' + '═'.repeat(62) + '╗'); console.log(`║${title.padStart(31 + title.length / 2).padEnd(62)}║`); console.log('╚' + '═'.repeat(62) + '╝'); } + +// ============================================================================= +// Link Checking +/** + * Verify internal documentation links by running the link-checking script. + * + * Executes the Node script tools/check-doc-links.js from the project root and + * exits the process with code 1 if the check fails. + */ + +function checkDocLinks() { + printHeader('Checking documentation links'); + + try { + execSync('node tools/check-doc-links.js', { + cwd: PROJECT_ROOT, + stdio: 'inherit', + }); + } catch { + console.error('\n \u001B[31m✗\u001B[0m Link check failed - fix broken links before building\n'); + process.exit(1); + } +} diff --git a/tools/check-doc-links.js b/tools/check-doc-links.js new file mode 100644 index 00000000..d89d6605 --- /dev/null +++ b/tools/check-doc-links.js @@ -0,0 +1,282 @@ +/** + * Internal documentation link checker + * Scans markdown files in docs/ and verifies: + * - All relative links point to existing files + * - All anchor links (#section) point to valid headings + * - No duplicate/conflicting paths + * + * Exits with code 1 if broken links are found (fails the build). + */ + +const { readFileSync, existsSync } = require('node:fs'); +const { resolve, dirname, join, normalize, relative } = require('node:path'); +const { glob } = require('glob'); + +const DOCS_DIR = resolve(process.cwd(), 'docs'); + +// Regex to match markdown links: [text](path) and reference-style [text]: path +const LINK_PATTERNS = [ + /\[([^\]]*)\]\(([^)]+)\)/g, // [text](path) + /\[([^\]]+)\]:\s*(\S+)/g, // [text]: path +]; + +// Regex to extract headings for anchor validation +const HEADING_PATTERN = /^#{1,6}\s+(.+)$/gm; + +/** + * Determines whether a link should be ignored during validation. + * @param {string} link - The link URL or path to test. + * @returns {boolean} `true` if the link is external, uses a special protocol (`http://`, `https://`, `mailto:`, `tel:`), or is an absolute path starting with `/`, `false` otherwise. + */ +function shouldIgnore(link) { + return ( + link.startsWith('http://') || + link.startsWith('https://') || + link.startsWith('mailto:') || + link.startsWith('tel:') || + link.startsWith('/') // Absolute paths handled by Astro routing + ); +} + +/** + * Convert a markdown heading into the anchor slug used by common Markdown processors. + * + * Produces a lowercase slug with emojis and most punctuation removed, whitespace collapsed to single + * hyphens, consecutive hyphens collapsed, and leading/trailing hyphens trimmed. + * @param {string} heading - The heading text to convert. + * @returns {string} The resulting anchor slug. + */ +function headingToAnchor(heading) { + return heading + .toLowerCase() + .replaceAll(/[\u{1F300}-\u{1F9FF}]/gu, '') // Remove emojis + .replaceAll(/[^\w\s-]/g, '') // Remove special chars except hyphens + .replaceAll(/\s+/g, '-') // Spaces to hyphens + .replaceAll(/-+/g, '-') // Collapse multiple hyphens + .replaceAll(/^-+|-+$/g, ''); // Trim leading/trailing hyphens +} + +/** + * Extracts anchor slugs from Markdown content by converting headings to their anchor form. + * + * Strips inline formatting (code spans, emphasis, bold, and inline links), processes + * Markdown headings (levels 1–6), and returns the resulting anchor slugs. + * + * @param {string} content - The Markdown text to scan for headings. + * @returns {Set} A set of anchor slugs derived from the headings in `content`. + */ +function extractAnchors(content) { + const anchors = new Set(); + let match; + + HEADING_PATTERN.lastIndex = 0; + while ((match = HEADING_PATTERN.exec(content)) !== null) { + const headingText = match[1].trim(); + // Remove inline code, bold, italic, links from heading + const cleanHeading = headingText + .replaceAll(/`[^`]+`/g, '') + .replaceAll(/\*\*([^*]+)\*\*/g, '$1') + .replaceAll(/\*([^*]+)\*/g, '$1') + .replaceAll(/\[([^\]]+)\]\([^)]+\)/g, '$1') + .trim(); + anchors.add(headingToAnchor(cleanHeading)); + } + + return anchors; +} + +/** + * Remove fenced and inline code segments from Markdown content. + * + * @param {string} content - Markdown text to sanitize. + * @returns {string} The input content with fenced code blocks (```...``` and ~~~...~~~) and inline code (backtick-enclosed) removed. + */ +function stripCodeBlocks(content) { + // Remove fenced code blocks (``` or ~~~) + return content + .replaceAll(/```[\s\S]*?```/g, '') + .replaceAll(/~~~[\s\S]*?~~~/g, '') + .replaceAll(/`[^`\n]+`/g, ''); // Also remove inline code +} + +/** + * Extracts all non-external link targets from markdown content, ignoring links inside code blocks. + * @param {string} content - Markdown source to scan for link targets. + * @returns {string[]} Array of raw link strings (paths and optional anchors) found in the content; external or protocol-based links are excluded. + */ +function extractLinks(content) { + const strippedContent = stripCodeBlocks(content); + const links = []; + for (const pattern of LINK_PATTERNS) { + let match; + pattern.lastIndex = 0; + while ((match = pattern.exec(strippedContent)) !== null) { + const rawLink = match[2]; + if (!shouldIgnore(rawLink)) { + links.push(rawLink); + } + } + } + return links; +} + +/** + * Split a link into its path and anchor components. + * @param {string} link - The link string to parse; may include a `#` followed by an anchor. + * @returns {{path: string|null, anchor: string|null}} An object where `path` is the portion before `#` (or `null` when empty, indicating a same-file anchor), and `anchor` is the portion after `#` (or `null` when no `#` is present). Note: `anchor` may be an empty string if the link ends with `#`. + */ +function parseLink(link) { + const hashIndex = link.indexOf('#'); + if (hashIndex === -1) { + return { path: link, anchor: null }; + } + return { + path: link.slice(0, hashIndex) || null, // Empty path means same file + anchor: link.slice(hashIndex + 1), + }; +} + +/** + * Resolve a relative markdown link path from a source file to a concrete absolute file path. + * @param {string} fromFile - Absolute path of the file containing the link. + * @param {string|null} linkPath - Link target as written in markdown; may be `null` or empty for same-file anchors. + * @returns {string} The resolved absolute path. If `linkPath` is null/empty returns `fromFile`. If the resolved path has no extension, an existing `.md` file or an `index.md` inside a matching directory is preferred; otherwise the normalized resolved path is returned. + */ +function resolveLink(fromFile, linkPath) { + if (!linkPath) return fromFile; // Same file anchor + + const fromDir = dirname(fromFile); + let resolved = normalize(resolve(fromDir, linkPath)); + + // If link doesn't have extension, try .md + if (!resolved.endsWith('.md') && !existsSync(resolved)) { + const withMd = resolved + '.md'; + if (existsSync(withMd)) { + return withMd; + } + // Try as directory with index.md + const asIndex = join(resolved, 'index.md'); + if (existsSync(asIndex)) { + return asIndex; + } + } + + return resolved; +} + +// Cache for file anchors to avoid re-reading files +const anchorCache = new Map(); + +/** + * Retrieve and cache the set of markdown anchor slugs for a given file. + * + * Reads the file at the provided path, extracts heading-based anchor slugs, stores them in an internal cache, and returns them. + * @param {string} filePath - Absolute or relative path to the markdown file. + * @returns {Set} The set of anchor slugs present in the file. + */ +function getAnchorsForFile(filePath) { + if (anchorCache.has(filePath)) { + return anchorCache.get(filePath); + } + + const content = readFileSync(filePath, 'utf-8'); + const anchors = extractAnchors(content); + anchorCache.set(filePath, anchors); + return anchors; +} + +/** + * Validate Markdown files in docs/ for broken relative links and anchor targets. + * + * Scans all `.md` and `.mdx` files under DOCS_DIR, checks that relative links resolve to existing + * files and that any `#anchor` references point to existing headings. Prints a grouped, + * colored report of issues to stdout and terminates the process with exit code `0` if no issues + * were found or `1` if any broken links or anchors are detected. + */ +async function main() { + console.log(' → Scanning for broken links and anchors...'); + + const files = await glob('**/*.{md,mdx}', { cwd: DOCS_DIR, absolute: true }); + const errors = []; + + // Track all resolved paths for duplicate detection + const pathRegistry = new Map(); // normalized path -> [source files] + + for (const file of files) { + const content = readFileSync(file, 'utf-8'); + const links = extractLinks(content); + const relativePath = relative(DOCS_DIR, file); + + for (const rawLink of links) { + const { path: linkPath, anchor } = parseLink(rawLink); + + // Resolve target file + const targetFile = resolveLink(file, linkPath); + const normalizedTarget = normalize(targetFile); + + // Check if file exists (skip for same-file anchors) + if (linkPath && !existsSync(targetFile)) { + errors.push({ + type: 'broken-link', + file: relativePath, + link: rawLink, + message: `File not found: ${linkPath}`, + }); + continue; + } + + // Check anchor if present + if (anchor) { + const anchors = getAnchorsForFile(targetFile); + if (!anchors.has(anchor)) { + errors.push({ + type: 'broken-anchor', + file: relativePath, + link: rawLink, + message: `Anchor "#${anchor}" not found in ${linkPath || 'same file'}`, + }); + } + } + + // Track paths for duplicate detection + if (linkPath) { + if (!pathRegistry.has(normalizedTarget)) { + pathRegistry.set(normalizedTarget, []); + } + pathRegistry.get(normalizedTarget).push({ from: relativePath, link: rawLink }); + } + } + } + + // Report results + if (errors.length === 0) { + console.log(` \u001B[32m✓\u001B[0m Checked ${files.length} files - no broken links found.`); + process.exit(0); + } + + console.log(`\n \u001B[31m✗\u001B[0m Found ${errors.length} issue(s):\n`); + + // Group by file + const byFile = {}; + for (const error of errors) { + if (!byFile[error.file]) byFile[error.file] = []; + byFile[error.file].push(error); + } + + for (const [file, fileErrors] of Object.entries(byFile)) { + console.log(` \u001B[36m${file}\u001B[0m`); + for (const error of fileErrors) { + const icon = error.type === 'broken-link' ? '🔗' : '⚓'; + console.log(` ${icon} ${error.link}`); + console.log(` └─ ${error.message}`); + } + console.log(); + } + + process.exit(1); +} + +main().catch((error) => { + console.error('Error:', error.message); + process.exit(1); +}); diff --git a/website/README.md b/website/README.md new file mode 100644 index 00000000..0545d295 --- /dev/null +++ b/website/README.md @@ -0,0 +1,76 @@ +# BMAD Method Documentation Site + +This directory contains the Astro + Starlight configuration for the BMAD Method documentation site. + +## Architecture + +The documentation uses a symlink architecture to keep content in `docs/` at the repo root while serving it through Astro: + +``` +bmad2/ +├── docs/ # Content lives here (repo root) +│ ├── index.md +│ ├── tutorials/ +│ ├── how-to/ +│ ├── explanation/ +│ └── reference/ +└── website/ + ├── astro.config.mjs # Astro + Starlight config + ├── src/ + │ ├── content/ + │ │ └── docs -> ../../docs # Symlink to content + │ └── styles/ + │ └── custom.css # Custom styling + └── public/ # Static assets +``` + +## Development + +```bash +# From repo root +npm run docs:dev # Start dev server +npm run docs:build # Build for production +npm run docs:preview # Preview production build +``` + +## Platform Notes + +### Windows Symlink Support + +The `website/src/content/docs` symlink may not work correctly on Windows without Developer Mode enabled or administrator privileges. + +**To enable symlinks on Windows:** + +1. **Enable Developer Mode** (recommended): + - Settings → Update & Security → For developers → Developer Mode: On + - This allows creating symlinks without admin rights + +2. **Or use Git's symlink support**: + ```bash + git config core.symlinks true + ``` + Then re-clone the repository. + +3. **Or create a junction** (alternative): + ```cmd + # Run as Administrator + mklink /J website\src\content\docs ..\..\docs + ``` + +**If symlinks don't work**, you can copy the docs folder instead: +```bash +# Remove the symlink +rm website/src/content/docs + +# Copy the docs folder +cp -r docs website/src/content/docs +``` + +Note: If copying, remember to keep the copy in sync with changes to `docs/`. + +## Build Output + +The build pipeline (`npm run docs:build`) produces: +- Static HTML site in `build/site/` +- LLM-friendly files: `llms.txt`, `llms-full.txt` +- Downloadable ZIP bundles in `downloads/` diff --git a/website/astro.config.mjs b/website/astro.config.mjs new file mode 100644 index 00000000..e3d96fd3 --- /dev/null +++ b/website/astro.config.mjs @@ -0,0 +1,125 @@ +// @ts-check +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; +import sitemap from '@astrojs/sitemap'; +import rehypeMarkdownLinks from './src/rehype-markdown-links.js'; +import { getSiteUrl } from './src/lib/site-url.js'; + +const siteUrl = getSiteUrl(); +const urlParts = new URL(siteUrl); +// Normalize basePath: ensure trailing slash so links can use `${BASE_URL}path` +const basePath = urlParts.pathname === '/' ? '/' : urlParts.pathname.endsWith('/') ? urlParts.pathname : urlParts.pathname + '/'; + +export default defineConfig({ + site: `${urlParts.origin}${basePath}`, + base: basePath, + outDir: '../build/site', + + // Disable aggressive caching in dev mode + vite: { + optimizeDeps: { + force: true, // Always re-bundle dependencies + }, + server: { + watch: { + usePolling: false, // Set to true if file changes aren't detected + }, + }, + }, + + markdown: { + rehypePlugins: [rehypeMarkdownLinks], + }, + + integrations: [ + sitemap(), + starlight({ + title: 'BMAD Method', + tagline: 'AI-driven agile development with specialized agents and workflows that scale from bug fixes to enterprise platforms.', + + logo: { + src: './public/img/logo.svg', + alt: 'BMAD Logo', + }, + favicon: '/favicon.ico', + + // Social links + social: [ + { icon: 'discord', label: 'Discord', href: 'https://discord.gg/gk8jAdXWmj' }, + { icon: 'github', label: 'GitHub', href: 'https://github.com/bmad-code-org/BMAD-METHOD' }, + { icon: 'youtube', label: 'YouTube', href: 'https://www.youtube.com/@BMadCode' }, + ], + + // Show last updated timestamps + lastUpdated: true, + + // Custom head tags for LLM discovery + head: [ + { + tag: 'meta', + attrs: { + name: 'ai-terms', + content: `AI-optimized documentation: ${siteUrl}/llms-full.txt (plain text, ~100k tokens, complete BMAD reference). Index: ${siteUrl}/llms.txt`, + }, + }, + { + tag: 'meta', + attrs: { + name: 'llms-full', + content: `${siteUrl}/llms-full.txt`, + }, + }, + { + tag: 'meta', + attrs: { + name: 'llms', + content: `${siteUrl}/llms.txt`, + }, + }, + ], + + // Custom CSS + customCss: ['./src/styles/custom.css'], + + // Sidebar configuration (Diataxis structure) + sidebar: [ + { label: 'Welcome', slug: 'index' }, + { + label: 'Tutorials', + collapsed: false, + autogenerate: { directory: 'tutorials' }, + }, + { + label: 'How-To Guides', + collapsed: true, + autogenerate: { directory: 'how-to' }, + }, + { + label: 'Explanation', + collapsed: true, + autogenerate: { directory: 'explanation' }, + }, + { + label: 'Reference', + collapsed: true, + autogenerate: { directory: 'reference' }, + }, + ], + + // Credits in footer + credits: false, + + // Pagination + pagination: true, + + // Custom components + components: { + Header: './src/components/Header.astro', + MobileMenuFooter: './src/components/MobileMenuFooter.astro', + }, + + // Table of contents + tableOfContents: { minHeadingLevel: 2, maxHeadingLevel: 3 }, + }), + ], +}); diff --git a/website/css/custom.css b/website/css/custom.css deleted file mode 100644 index 793bfae4..00000000 --- a/website/css/custom.css +++ /dev/null @@ -1,52 +0,0 @@ -/** - * BMAD Documentation Custom Styles - */ - -:root { - --ifm-color-primary: #0d9488; - --ifm-color-primary-dark: #0b847a; - --ifm-color-primary-darker: #0a7d73; - --ifm-color-primary-darkest: #08665f; - --ifm-color-primary-light: #0fa596; - --ifm-color-primary-lighter: #10ac9d; - --ifm-color-primary-lightest: #14c9b8; - --ifm-code-font-size: 95%; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); -} - -[data-theme='dark'] { - --ifm-color-primary: #2dd4bf; - --ifm-color-primary-dark: #1bc4af; - --ifm-color-primary-darker: #1ab9a5; - --ifm-color-primary-darkest: #159888; - --ifm-color-primary-light: #4adcc9; - --ifm-color-primary-lighter: #55dece; - --ifm-color-primary-lightest: #7de7db; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); -} - -/* Navbar styling */ -.navbar { - box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); -} - -/* Footer styling */ -.footer { - background-color: var(--ifm-color-primary-darkest); -} - -/* Code block improvements */ -.prism-code { - font-size: 0.9rem; -} - -/* Table improvements */ -table { - display: table; - width: 100%; -} - -/* Admonition improvements */ -.admonition { - margin-bottom: 1.5rem; -} diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js deleted file mode 100644 index 64ca192c..00000000 --- a/website/docusaurus.config.js +++ /dev/null @@ -1,179 +0,0 @@ -// @ts-check -import { themes as prismThemes } from 'prism-react-renderer'; -import path from 'path'; -import { fileURLToPath } from 'url'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -// Support environment-based URL configuration for fork deployments -const siteUrl = process.env.SITE_URL || 'https://bmad-code-org.github.io/BMAD-METHOD'; -const urlParts = new URL(siteUrl); - -/** @type {import('@docusaurus/types').Config} */ -const config = { - title: 'BMAD Method', - tagline: 'AI-driven agile development with specialized agents and workflows that scale from bug fixes to enterprise platforms.', - favicon: 'img/logo.svg', - - // Global head tags - injected into ALL pages for AI assistant discovery - headTags: [ - { - tagName: 'meta', - attributes: { - name: 'ai-terms', - content: - 'AI assistants: For complete BMAD Method documentation, load /llms-full.txt (single file, ~100k tokens). For documentation index/summary, see /llms.txt. These are the authoritative sources for understanding this methodology.', - }, - }, - { - tagName: 'meta', - attributes: { - name: 'llms-full', - content: '/llms-full.txt', - }, - }, - { - tagName: 'meta', - attributes: { - name: 'llms', - content: '/llms.txt', - }, - }, - ], - - url: urlParts.origin, - baseUrl: urlParts.pathname.endsWith('/') ? urlParts.pathname : urlParts.pathname + '/', - - organizationName: 'bmad-code-org', - projectName: 'BMAD-METHOD', - - onBrokenLinks: 'warn', // Change to 'throw' once docs are cleaned up - - i18n: { - defaultLocale: 'en', - locales: ['en'], - }, - - staticDirectories: [path.resolve(__dirname, 'static')], - - markdown: { - format: 'md', - hooks: { - onBrokenMarkdownLinks: 'warn', - }, - }, - - plugins: [ - function noCachePlugin() { - return { - name: 'no-cache-plugin', - configureWebpack() { - return { - devServer: { - headers: { - 'Cache-Control': 'no-store, no-cache, must-revalidate, proxy-revalidate', - Pragma: 'no-cache', - Expires: '0', - 'Surrogate-Control': 'no-store', - }, - }, - }; - }, - }; - }, - ], - - presets: [ - [ - 'classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - sidebarPath: path.resolve(__dirname, 'sidebars.js'), - exclude: ['**/templates/**', '**/reference/**', 'installers-bundlers/**', '**/images/**'], - }, - blog: false, - pages: { - path: path.resolve(__dirname, 'src/pages'), - }, - theme: { - customCss: path.resolve(__dirname, 'css/custom.css'), - }, - }), - ], - ], - - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - navbar: { - title: 'BMAD Method', - logo: { - alt: 'BMAD Logo', - src: 'img/logo.svg', - }, - items: [ - { - type: 'docSidebar', - sidebarId: 'mainSidebar', - position: 'left', - label: 'Docs', - }, - { - to: '/downloads', - label: 'Downloads', - position: 'right', - }, - { - href: 'pathname:///llms.txt', - label: 'llms.txt', - position: 'right', - }, - { - href: 'https://github.com/bmad-code-org/BMAD-METHOD', - label: 'GitHub', - position: 'right', - }, - ], - }, - footer: { - style: 'dark', - links: [ - { - title: 'Docs', - items: [ - { label: 'Quick Start', to: '/docs/modules/bmm/quick-start' }, - { label: 'Installation', to: '/docs/getting-started/installation' }, - ], - }, - { - title: 'Community', - items: [{ label: 'Discord', href: 'https://discord.gg/bmad' }], - }, - { - title: 'More', - items: [ - { - label: 'GitHub', - href: 'https://github.com/bmad-code-org/BMAD-METHOD', - }, - { label: 'llms.txt', href: 'pathname:///llms.txt' }, - { label: 'llms-full.txt', href: 'pathname:///llms-full.txt' }, - ], - }, - ], - copyright: `Copyright © ${new Date().getFullYear()} BMAD Code Organization.`, - }, - prism: { - theme: prismThemes.github, - darkTheme: prismThemes.dracula, - }, - colorMode: { - defaultMode: 'light', - disableSwitch: false, - respectPrefersColorScheme: true, - }, - }), -}; - -export default config; diff --git a/website/static/favicon.ico b/website/public/favicon.ico similarity index 100% rename from website/static/favicon.ico rename to website/public/favicon.ico diff --git a/website/static/img/logo.svg b/website/public/img/logo.svg similarity index 100% rename from website/static/img/logo.svg rename to website/public/img/logo.svg diff --git a/website/static/robots.txt b/website/public/robots.txt similarity index 100% rename from website/static/robots.txt rename to website/public/robots.txt diff --git a/website/sidebars.js b/website/sidebars.js deleted file mode 100644 index aa6b183a..00000000 --- a/website/sidebars.js +++ /dev/null @@ -1,134 +0,0 @@ -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - mainSidebar: [ - 'index', - { - type: 'category', - label: 'Core Concepts', - items: [ - 'bmad-core-concepts/index', - 'bmad-core-concepts/agents', - 'bmad-core-concepts/workflows', - 'bmad-core-concepts/modules', - { - type: 'category', - label: 'Installing', - collapsed: true, - items: ['bmad-core-concepts/installing/index', 'bmad-core-concepts/installing/upgrading'], - }, - { - type: 'category', - label: 'Customization', - collapsed: true, - items: [ - 'bmad-core-concepts/bmad-customization/index', - 'bmad-core-concepts/bmad-customization/agents', - 'bmad-core-concepts/bmad-customization/workflows', - ], - }, - 'bmad-core-concepts/web-bundles/index', - ], - }, - { - type: 'category', - label: 'BMM - Method', - items: [ - 'modules/bmm-bmad-method/index', - 'modules/bmm-bmad-method/quick-start', - { - type: 'category', - label: 'Quick Flows', - collapsed: true, - items: [ - 'modules/bmm-bmad-method/bmad-quick-flow', - 'modules/bmm-bmad-method/quick-flow-solo-dev', - 'modules/bmm-bmad-method/quick-spec-flow', - ], - }, - { - type: 'category', - label: 'Workflows', - collapsed: true, - items: [ - 'modules/bmm-bmad-method/workflows-planning', - 'modules/bmm-bmad-method/workflows-solutioning', - 'modules/bmm-bmad-method/workflows-analysis', - 'modules/bmm-bmad-method/workflows-implementation', - ], - }, - { - type: 'category', - label: 'Advanced Topics', - collapsed: true, - items: [ - 'modules/bmm-bmad-method/party-mode', - 'modules/bmm-bmad-method/agents-guide', - 'modules/bmm-bmad-method/brownfield-guide', - 'modules/bmm-bmad-method/test-architecture', - ], - }, - { - type: 'category', - label: 'Reference', - collapsed: true, - items: [ - 'modules/bmm-bmad-method/workflow-document-project-reference', - 'modules/bmm-bmad-method/troubleshooting', - 'modules/bmm-bmad-method/faq', - 'modules/bmm-bmad-method/glossary', - ], - }, - ], - }, - { - type: 'category', - label: 'BMB - Builder', - collapsed: true, - items: [ - 'modules/bmb-bmad-builder/index', - 'modules/bmb-bmad-builder/agent-creation-guide', - 'modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance', - 'modules/bmb-bmad-builder/custom-content', - 'modules/bmb-bmad-builder/custom-content-installation', - ], - }, - { - type: 'category', - label: 'BMGD - Game Dev', - collapsed: true, - items: [ - 'modules/bmgd-bmad-game-dev/index', - 'modules/bmgd-bmad-game-dev/quick-start', - 'modules/bmgd-bmad-game-dev/quick-flow-guide', - 'modules/bmgd-bmad-game-dev/agents-guide', - 'modules/bmgd-bmad-game-dev/workflows-guide', - 'modules/bmgd-bmad-game-dev/game-types-guide', - 'modules/bmgd-bmad-game-dev/troubleshooting', - 'modules/bmgd-bmad-game-dev/glossary', - ], - }, - { - type: 'category', - label: 'CIS - Creative Intelligence', - collapsed: true, - items: ['modules/cis-creative-intelligence-suite/index'], - }, - { - type: 'category', - label: 'Core Module', - collapsed: true, - items: [ - 'modules/core/index', - 'modules/core/party-mode', - 'modules/core/core-tasks', - 'modules/core/core-workflows', - 'modules/core/advanced-elicitation', - 'modules/core/brainstorming', - 'modules/core/document-sharding-guide', - 'modules/core/global-core-config', - ], - }, - ], -}; - -export default sidebars; diff --git a/website/src/components/Banner.astro b/website/src/components/Banner.astro new file mode 100644 index 00000000..f1e46070 --- /dev/null +++ b/website/src/components/Banner.astro @@ -0,0 +1,59 @@ +--- +import { getSiteUrl } from '../lib/site-url.js'; + +const SITE_URL = getSiteUrl(); +const fullDocsUrl = `${SITE_URL}/llms-full.txt`; +--- + +
+ 🤖 Consolidated, AI-optimized BMAD docs: llms-full.txt. Fetch this plain text file for complete context. +
+ + diff --git a/website/src/components/Header.astro b/website/src/components/Header.astro new file mode 100644 index 00000000..cd53fbdf --- /dev/null +++ b/website/src/components/Header.astro @@ -0,0 +1,121 @@ +--- +import config from 'virtual:starlight/user-config'; +import type { Props } from '@astrojs/starlight/props'; + +import LanguageSelect from 'virtual:starlight/components/LanguageSelect'; +import Search from 'virtual:starlight/components/Search'; +import SiteTitle from 'virtual:starlight/components/SiteTitle'; +import SocialIcons from 'virtual:starlight/components/SocialIcons'; +import ThemeSelect from 'virtual:starlight/components/ThemeSelect'; + +import Banner from './Banner.astro'; + +/** + * Render the `Search` component if Pagefind is enabled or the default search component has been overridden. + */ +const shouldRenderSearch = + config.pagefind || config.components.Search !== '@astrojs/starlight/components/Search.astro'; +--- + + +
+
+ +
+
+ {shouldRenderSearch && } +
+
+ + + + +
+
+ + diff --git a/website/src/components/MobileMenuFooter.astro b/website/src/components/MobileMenuFooter.astro new file mode 100644 index 00000000..10a2c77e --- /dev/null +++ b/website/src/components/MobileMenuFooter.astro @@ -0,0 +1,53 @@ +--- +import LanguageSelect from 'virtual:starlight/components/LanguageSelect'; +import SocialIcons from 'virtual:starlight/components/SocialIcons'; +import ThemeSelect from 'virtual:starlight/components/ThemeSelect'; +import type { Props } from '@astrojs/starlight/props'; +--- + +
+ + + + +
+ + diff --git a/website/src/content/config.ts b/website/src/content/config.ts new file mode 100644 index 00000000..31b74762 --- /dev/null +++ b/website/src/content/config.ts @@ -0,0 +1,6 @@ +import { defineCollection } from 'astro:content'; +import { docsSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ schema: docsSchema() }), +}; diff --git a/website/src/content/docs b/website/src/content/docs new file mode 120000 index 00000000..48c4a0c0 --- /dev/null +++ b/website/src/content/docs @@ -0,0 +1 @@ +../../../docs \ No newline at end of file diff --git a/website/src/lib/site-url.js b/website/src/lib/site-url.js new file mode 100644 index 00000000..62df2bf3 --- /dev/null +++ b/website/src/lib/site-url.js @@ -0,0 +1,25 @@ +/** + * Resolve the site's base URL using cascading environment defaults. + * + * Preference order: use SITE_URL if set; otherwise derive a GitHub Pages URL from GITHUB_REPOSITORY; otherwise use the local development URL. + * @returns {string} The resolved site URL (SITE_URL override, or `https://{owner}.github.io/{repo}`, or `http://localhost:3000`). + */ +export function getSiteUrl() { + // Explicit override (works in both local and GitHub Actions) + if (process.env.SITE_URL) { + return process.env.SITE_URL; + } + + // GitHub Actions: compute from repository context + if (process.env.GITHUB_REPOSITORY) { + const parts = process.env.GITHUB_REPOSITORY.split('/'); + if (parts.length !== 2 || !parts[0] || !parts[1]) { + throw new Error(`Invalid GITHUB_REPOSITORY format: "${process.env.GITHUB_REPOSITORY}". Expected "owner/repo".`); + } + const [owner, repo] = parts; + return `https://${owner}.github.io/${repo}`; + } + + // Local development: use dev server + return 'http://localhost:3000'; +} diff --git a/website/src/pages/index.js b/website/src/pages/index.js deleted file mode 100644 index cab2c5d1..00000000 --- a/website/src/pages/index.js +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react'; -import Layout from '@theme/Layout'; -import Link from '@docusaurus/Link'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -export default function Home() { - const llmsFullUrl = useBaseUrl('/llms-full.txt'); - - return ( - -
-

BMAD Method

-

- Under Construction -

- - - View Documentation - - - - 🤖 AI Context: llms-full.txt - -
-
- ); -} diff --git a/website/src/rehype-markdown-links.js b/website/src/rehype-markdown-links.js new file mode 100644 index 00000000..ff66c67e --- /dev/null +++ b/website/src/rehype-markdown-links.js @@ -0,0 +1,88 @@ +/** + * Rehype plugin to transform relative markdown file links (.md) to page routes + * + * Transforms: + * ./path/to/file.md → ./path/to/file/ + * ./path/index.md → ./path/ (index.md becomes directory root) + * ../path/file.md#anchor → ../path/file/#anchor + * ./file.md?query=param → ./file/?query=param + * + * Only affects relative links (./, ../) - absolute and external links are unchanged + */ + +import { visit } from 'unist-util-visit'; + +/** + * Convert relative Markdown file links (./ or ../) into equivalent page route-style links. + * + * The returned transformer walks the HTML tree and rewrites anchor `href` values that are relative paths pointing to `.md` files. It preserves query strings and hash anchors, rewrites `.../index.md` to the directory root path (`.../`), and rewrites other `.md` file paths by removing the `.md` extension and ensuring a trailing slash. Absolute, external, non-relative, non-string, or links without `.md` are left unchanged. + * + * @returns {function} A HAST tree transformer that mutates `a` element `href` properties as described. + */ +export default function rehypeMarkdownLinks() { + return (tree) => { + visit(tree, 'element', (node) => { + // Only process anchor tags with href + if (node.tagName !== 'a' || !node.properties?.href) { + return; + } + + const href = node.properties.href; + + // Skip if not a string (shouldn't happen, but be safe) + if (typeof href !== 'string') { + return; + } + + // Only transform relative paths starting with ./ or ../ + if (!href.startsWith('./') && !href.startsWith('../')) { + return; + } + + // Extract path portion (before ? and #) to check if it's a .md file + const firstDelimiter = Math.min( + href.indexOf('?') === -1 ? Infinity : href.indexOf('?'), + href.indexOf('#') === -1 ? Infinity : href.indexOf('#'), + ); + const pathPortion = firstDelimiter === Infinity ? href : href.substring(0, firstDelimiter); + + // Don't transform if path doesn't end with .md + if (!pathPortion.endsWith('.md')) { + return; + } + + // Split the URL into parts: path, anchor, and query + let urlPath = pathPortion; + let anchor = ''; + let query = ''; + + // Extract query string and anchor from original href + if (firstDelimiter !== Infinity) { + const suffix = href.substring(firstDelimiter); + const anchorInSuffix = suffix.indexOf('#'); + if (suffix.startsWith('?')) { + if (anchorInSuffix !== -1) { + query = suffix.substring(0, anchorInSuffix); + anchor = suffix.substring(anchorInSuffix); + } else { + query = suffix; + } + } else { + // starts with # + anchor = suffix; + } + } + + // Transform .md to / + // Special case: index.md → directory root (e.g., ./tutorials/index.md → ./tutorials/) + if (urlPath.endsWith('/index.md')) { + urlPath = urlPath.replace(/\/index\.md$/, '/'); + } else { + urlPath = urlPath.replace(/\.md$/, '/'); + } + + // Reconstruct the href + node.properties.href = urlPath + query + anchor; + }); + }; +} diff --git a/website/src/styles/custom.css b/website/src/styles/custom.css new file mode 100644 index 00000000..a232f5ec --- /dev/null +++ b/website/src/styles/custom.css @@ -0,0 +1,483 @@ +/** + * BMAD Method Documentation - Custom Styles for Starlight + * Electric Blue theme optimized for dark mode + * + * CSS Variable Mapping: + * Docusaurus → Starlight + * --ifm-color-primary → --sl-color-accent + * --ifm-background-color → --sl-color-bg + * --ifm-font-color-base → --sl-color-text + */ + +/* ============================================ + COLOR PALETTE - Light Mode + ============================================ */ +:root { + --ai-banner-height: 2.75rem; + --sl-nav-height: 6.25rem; /* Base nav height (~3.5rem) + banner height (2.75rem) */ + + /* Primary accent colors - purple to match Docusaurus */ + --sl-color-accent-low: #e0e0ff; + --sl-color-accent: #8C8CFF; + --sl-color-accent-high: #4141FF; + + /* Text colors */ + --sl-color-white: #1e293b; + --sl-color-gray-1: #334155; + --sl-color-gray-2: #475569; + --sl-color-gray-3: #64748b; + --sl-color-gray-4: #94a3b8; + --sl-color-gray-5: #cbd5e1; + --sl-color-gray-6: #e2e8f0; + --sl-color-black: #f8fafc; + + /* Font settings */ + --sl-font: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', + Arial, sans-serif; + --sl-text-base: 1rem; + --sl-line-height: 1.7; + + /* Code highlighting */ + --sl-color-bg-inline-code: rgba(140, 140, 255, 0.1); +} + +/* ============================================ + COLOR PALETTE - Dark Mode (Primary Focus) + ============================================ */ +:root[data-theme='dark'] { + /* Primary accent colors - purple to match Docusaurus */ + --sl-color-accent-low: #2a2a5a; + --sl-color-accent: #8C8CFF; + --sl-color-accent-high: #B9B9FF; + + /* Background colors */ + --sl-color-bg: #1b1b1d; + --sl-color-bg-nav: #1b1b1d; + --sl-color-bg-sidebar: #1b1b1d; + --sl-color-hairline-light: rgba(140, 140, 255, 0.1); + --sl-color-hairline: rgba(140, 140, 255, 0.15); + + /* Text colors */ + --sl-color-white: #f8fafc; + --sl-color-gray-1: #e2e8f0; + --sl-color-gray-2: #cbd5e1; + --sl-color-gray-3: #94a3b8; + --sl-color-gray-4: #64748b; + --sl-color-gray-5: #475569; + --sl-color-gray-6: #334155; + --sl-color-black: #1b1b1d; + + /* Code highlighting */ + --sl-color-bg-inline-code: rgba(140, 140, 255, 0.15); +} + +/* ============================================ + TYPOGRAPHY + ============================================ */ +.sl-markdown-content h1 { + margin-bottom: 1.5rem; +} + +.sl-markdown-content h2 { + margin-top: 2.5rem; + margin-bottom: 1rem; +} + +.sl-markdown-content h3 { + margin-top: 2rem; + margin-bottom: 0.75rem; +} + +.sl-markdown-content p { + margin-bottom: 1.25rem; +} + +/* ============================================ + SIDEBAR & NAVIGATION + Clean styling inspired by React Native docs + ============================================ */ + +/* Base transition for all sidebar links */ +.sidebar-content a { + transition: + background-color 0.15s ease, + color 0.15s ease, + border-color 0.15s ease; + border-radius: 4px; +} + +/* Top-level sidebar items (Diataxis categories) */ +.sidebar-content > ul > li > details > summary, +.sidebar-content > ul > li > a { + font-weight: 700; + font-size: 0.9375rem; + padding: 0.5rem 0.75rem; +} + +/* Nested sidebar items */ +.sidebar-content ul ul a { + font-weight: 500; + font-size: 0.875rem; + padding: 0.375rem 0.75rem; + padding-left: 1.5rem; + border-left: 3px solid transparent; +} + +/* Deep nested items */ +.sidebar-content ul ul ul a { + font-weight: 400; + font-size: 0.8125rem; + padding-left: 2.25rem; +} + +/* Active state - thin left accent bar */ +.sidebar-content a[aria-current='page'] { + background-color: rgba(140, 140, 255, 0.08); + color: var(--sl-color-accent); + border-left-color: var(--sl-color-accent); + font-weight: 600; +} + +:root[data-theme='dark'] .sidebar-content a[aria-current='page'] { + background-color: rgba(140, 140, 255, 0.1); + color: var(--sl-color-accent-high); + border-left-color: var(--sl-color-accent); +} + +/* Hover states */ +.sidebar-content a:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +:root[data-theme='dark'] .sidebar-content a:hover { + background-color: rgba(255, 255, 255, 0.05); +} + +/* Section spacing */ +.sidebar-content > ul > li { + margin-top: 0.75rem; +} + +.sidebar-content > ul > li:first-child { + margin-top: 0; +} + +/* Lighter chevrons/carets */ +.sidebar-content summary::marker, +.sidebar-content details > summary::after { + opacity: 0.4; +} + +.sidebar-content summary:hover::marker, +.sidebar-content details > summary:hover::after { + opacity: 0.6; +} + +/* ============================================ + LAYOUT - Fixed width at large viewport + ============================================ */ +.content-panel { + max-width: 1400px; + margin: 0 auto; +} + +/* Main content area */ +main { + min-width: 0; +} + +.sl-markdown-content { + min-width: 0; + overflow-wrap: break-word; + word-wrap: break-word; +} + +/* Hide breadcrumbs if desired */ +/* Uncomment to hide: +nav[aria-label="Breadcrumb"] { + display: none; +} +*/ + +/* ============================================ + NAVBAR + ============================================ */ +header.header { + padding: 0 !important; /* Remove all padding for full-width banner */ + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + height: var(--sl-nav-height) !important; + display: flex; + flex-direction: column; +} + +header.header .header.sl-flex { + padding: 0 1.5rem; + height: calc(var(--sl-nav-height) - var(--ai-banner-height)); + width: 100%; +} + +:root[data-theme='dark'] header.header { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +} + +.site-title { + font-weight: 700; +} + +/* Logo sizing - constrain to reasonable size */ +.site-title img { + height: 2.5rem; + width: auto; +} + +/* Social links styling */ +.social-icons a { + padding: 0.5rem; + transition: + background-color 0.15s ease, + color 0.15s ease; + border-radius: 6px; +} + +.social-icons a:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +:root[data-theme='dark'] .social-icons a:hover { + background-color: rgba(255, 255, 255, 0.05); +} + +/* ============================================ + CARDS + ============================================ */ +.card { + border-radius: 12px; + border: 2px solid var(--sl-color-gray-5); + background-color: var(--sl-color-bg); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + transition: + transform 0.2s ease, + box-shadow 0.2s ease, + border-color 0.2s ease; +} + +.card:hover { + transform: translateY(-3px); + border-color: var(--sl-color-accent); + box-shadow: 0 8px 24px rgba(140, 140, 255, 0.15); +} + +:root[data-theme='dark'] .card { + background: linear-gradient(145deg, rgba(30, 41, 59, 0.6), rgba(15, 23, 42, 0.8)); + border-color: rgba(140, 140, 255, 0.2); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); +} + +:root[data-theme='dark'] .card:hover { + border-color: rgba(140, 140, 255, 0.5); + box-shadow: + 0 8px 32px rgba(140, 140, 255, 0.2), + 0 0 0 1px rgba(140, 140, 255, 0.1); +} + +/* Starlight card grid */ +.sl-link-card { + border-radius: 12px; + border: 2px solid var(--sl-color-gray-5); + transition: + transform 0.2s ease, + box-shadow 0.2s ease, + border-color 0.2s ease; +} + +.sl-link-card:hover { + transform: translateY(-3px); + border-color: var(--sl-color-accent); +} + +:root[data-theme='dark'] .sl-link-card { + border-color: rgba(140, 140, 255, 0.2); +} + +:root[data-theme='dark'] .sl-link-card:hover { + border-color: rgba(140, 140, 255, 0.5); +} + +/* ============================================ + BUTTONS + ============================================ */ +.sl-flex a[href], +button { + transition: + background-color 0.2s ease, + transform 0.1s ease; +} + +.sl-flex a[href]:hover, +button:hover { + transform: translateY(-1px); +} + +/* ============================================ + MISC ENHANCEMENTS + ============================================ */ + +/* Smooth scrolling */ +html { + scroll-behavior: smooth; +} + +/* Better link underlines */ +.sl-markdown-content a:not(.sl-link-card) { + text-decoration-thickness: 1px; + text-underline-offset: 2px; +} + +/* Table styling */ +table { + display: table; + width: 100%; +} + +:root[data-theme='dark'] table { + border-color: rgba(140, 140, 255, 0.1); +} + +:root[data-theme='dark'] table th { + background-color: rgba(140, 140, 255, 0.05); +} + +:root[data-theme='dark'] table tr:nth-child(2n) { + background-color: rgba(140, 140, 255, 0.02); +} + +/* Blockquotes */ +blockquote { + border-left-color: var(--sl-color-accent); + background-color: rgba(140, 140, 255, 0.05); + border-radius: 0 8px 8px 0; + padding: 1rem 1.25rem; +} + +/* ============================================ + ADMONITIONS (Starlight Asides) + Rounded, no left border bar + ============================================ */ +.starlight-aside { + margin-bottom: 1.5rem; + padding: 1.25rem 1.5rem; + border-radius: 12px; + border: none; + border-left: 0; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); +} + +/* Tip aside */ +.starlight-aside--tip { + background-color: rgba(16, 185, 129, 0.08); +} + +.starlight-aside--tip .starlight-aside__title { + color: #059669; +} + +:root[data-theme='dark'] .starlight-aside--tip { + background-color: rgba(16, 185, 129, 0.12); +} + +:root[data-theme='dark'] .starlight-aside--tip .starlight-aside__title { + color: #34d399; +} + +/* Note aside */ +.starlight-aside--note { + background-color: rgba(140, 140, 255, 0.08); +} + +.starlight-aside--note .starlight-aside__title { + color: #8C8CFF; +} + +:root[data-theme='dark'] .starlight-aside--note { + background-color: rgba(140, 140, 255, 0.12); +} + +:root[data-theme='dark'] .starlight-aside--note .starlight-aside__title { + color: #8C8CFF; +} + +/* Caution aside */ +.starlight-aside--caution { + background-color: rgba(245, 158, 11, 0.1); +} + +.starlight-aside--caution .starlight-aside__title { + color: #d97706; +} + +:root[data-theme='dark'] .starlight-aside--caution { + background-color: rgba(245, 158, 11, 0.15); +} + +:root[data-theme='dark'] .starlight-aside--caution .starlight-aside__title { + color: #fbbf24; +} + +/* Danger aside */ +.starlight-aside--danger { + background-color: rgba(239, 68, 68, 0.1); +} + +.starlight-aside--danger .starlight-aside__title { + color: #dc2626; +} + +:root[data-theme='dark'] .starlight-aside--danger { + background-color: rgba(239, 68, 68, 0.15); +} + +:root[data-theme='dark'] .starlight-aside--danger .starlight-aside__title { + color: #f87171; +} + +/* Aside icon styling */ +.starlight-aside__icon svg { + width: 1.25rem; + height: 1.25rem; +} + +/* ============================================ + FOOTER - Minimal styling + ============================================ */ +footer { + background-color: var(--sl-color-black); + border-top: 1px solid var(--sl-color-hairline); +} + +:root[data-theme='dark'] footer { + background-color: #020617; +} + +/* ============================================ + RESPONSIVE ADJUSTMENTS + ============================================ */ +@media (max-width: 72rem) { + .content-panel { + max-width: 100%; + } +} + +/* Responsive padding on navbar row only - banner stays full-width */ +@media (min-width: 50rem) { + header.header .header.sl-flex { + padding-left: 2.5rem; + padding-right: 2.5rem; + } +} + +@media (min-width: 72rem) { + header.header .header.sl-flex { + padding-left: 3rem; + padding-right: 3rem; + } +}