From 3be7c5837171cfce2c563a3df74acd4cd0363c4d Mon Sep 17 00:00:00 2001 From: danielmeppiel Date: Wed, 11 Mar 2026 07:08:44 +0100 Subject: [PATCH 1/3] docs: migrate to Astro Starlight documentation site - Migrate all 23 markdown docs to Astro 5 + Starlight 0.37 - Add Pagefind search, structured sidebar, GitHub Pages workflow - Rewrite landing page with product narrative and manifest example - Split authentication into dedicated page (no auth wall on install) - Custom CSS: refined nav title, hero styling, card grid spacing - Plugins: starlight-links-validator, starlight-llms-txt, astro-mermaid Closes #236 --- .github/instructions/doc-sync.instructions.md | 2 +- .github/workflows/docs.yml | 61 + docs/.gitignore | 3 + docs/README.md | 28 - docs/astro.config.mjs | 88 + docs/index.md | 55 - docs/package-lock.json | 8672 +++++++++++++++++ docs/package.json | 23 + docs/public/favicon.svg | 3 + docs/src/content.config.ts | 10 + docs/src/content/docs/404.md | 8 + .../content/docs/contributing/changelog.md | 15 + .../docs/contributing/development-guide.md | 126 + .../docs/contributing}/integration-testing.md | 6 +- .../docs/getting-started/authentication.md | 164 + .../docs/getting-started/first-package.md | 120 + .../docs/getting-started/installation.md} | 208 +- .../content/docs/guides}/compilation.md | 12 +- .../content/docs/guides}/dependencies.md | 18 +- docs/{ => src/content/docs/guides}/plugins.md | 12 +- docs/{ => src/content/docs/guides}/prompts.md | 14 +- docs/{ => src/content/docs/guides}/skills.md | 14 +- docs/src/content/docs/index.mdx | 95 + docs/src/content/docs/integrations/ci-cd.md | 91 + docs/src/content/docs/integrations/gh-aw.md | 63 + .../integrations/ide-tool-integration.md} | 14 +- .../integrations/runtime-compatibility.md} | 10 +- .../docs/introduction/how-it-works.md} | 8 +- .../docs/introduction/key-concepts.md} | 26 +- docs/src/content/docs/introduction/why-apm.md | 62 + .../content/docs/reference/cli-commands.md} | 6 +- .../content/docs/reference}/examples.md | 28 +- .../docs/reference}/manifest-schema.md | 6 +- .../docs/reference/primitive-types.md} | 6 +- docs/src/styles/custom.css | 15 + docs/tsconfig.json | 5 + 36 files changed, 9757 insertions(+), 340 deletions(-) create mode 100644 .github/workflows/docs.yml create mode 100644 docs/.gitignore delete mode 100644 docs/README.md create mode 100644 docs/astro.config.mjs delete mode 100644 docs/index.md create mode 100644 docs/package-lock.json create mode 100644 docs/package.json create mode 100644 docs/public/favicon.svg create mode 100644 docs/src/content.config.ts create mode 100644 docs/src/content/docs/404.md create mode 100644 docs/src/content/docs/contributing/changelog.md create mode 100644 docs/src/content/docs/contributing/development-guide.md rename docs/{ => src/content/docs/contributing}/integration-testing.md (99%) create mode 100644 docs/src/content/docs/getting-started/authentication.md create mode 100644 docs/src/content/docs/getting-started/first-package.md rename docs/{getting-started.md => src/content/docs/getting-started/installation.md} (65%) rename docs/{ => src/content/docs/guides}/compilation.md (97%) rename docs/{ => src/content/docs/guides}/dependencies.md (97%) rename docs/{ => src/content/docs/guides}/plugins.md (96%) rename docs/{ => src/content/docs/guides}/prompts.md (95%) rename docs/{ => src/content/docs/guides}/skills.md (96%) create mode 100644 docs/src/content/docs/index.mdx create mode 100644 docs/src/content/docs/integrations/ci-cd.md create mode 100644 docs/src/content/docs/integrations/gh-aw.md rename docs/{integrations.md => src/content/docs/integrations/ide-tool-integration.md} (98%) rename docs/{runtime-integration.md => src/content/docs/integrations/runtime-compatibility.md} (97%) rename docs/{concepts.md => src/content/docs/introduction/how-it-works.md} (99%) rename docs/{primitives.md => src/content/docs/introduction/key-concepts.md} (95%) create mode 100644 docs/src/content/docs/introduction/why-apm.md rename docs/{cli-reference.md => src/content/docs/reference/cli-commands.md} (99%) rename docs/{ => src/content/docs/reference}/examples.md (94%) rename docs/{ => src/content/docs/reference}/manifest-schema.md (99%) rename docs/{enhanced-primitive-discovery.md => src/content/docs/reference/primitive-types.md} (99%) create mode 100644 docs/src/styles/custom.css create mode 100644 docs/tsconfig.json diff --git a/.github/instructions/doc-sync.instructions.md b/.github/instructions/doc-sync.instructions.md index 0864029c..1d79c67f 100644 --- a/.github/instructions/doc-sync.instructions.md +++ b/.github/instructions/doc-sync.instructions.md @@ -5,7 +5,7 @@ description: "Rules to keep documentation synchronized with code changes" # Rules to keep documentation up-to-date -- Rule 1: Whenever changes are made to the codebase, it's important to also update the documentation to reflect those changes. You must ensure that the following documentation is updated: [.md files in the docs directory](../../docs/). You can simply update the above markdown files to match the changes in the codebase. +- Rule 1: Whenever changes are made to the codebase, it's important to also update the documentation to reflect those changes. You must ensure that the following documentation is updated: [Starlight content pages in docs/src/content/docs/](../../docs/src/content/docs/). Each page uses Starlight frontmatter (title, sidebar order). Cross-page links use relative paths (e.g., `../../guides/compilation/`). - Rule 2: The main [README.md](../../README.md) file is a special case that requires user approval before changes, so, if there is a deviation in the code that affects what is stated in the main [README.md](../../README.md) file, you must warn the user and describe the drift and [README.md](../../README.md) update proposal, and wait for confirmation before updating it. diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..8d37ab72 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,61 @@ +name: Deploy Docs + +on: + push: + branches: [main] + paths: ['docs/**'] + pull_request: + paths: ['docs/**'] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages-${{ github.ref }}" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'npm' + cache-dependency-path: 'docs/package-lock.json' + + - name: Install dependencies + working-directory: ./docs + run: npm ci + + - name: Build documentation + working-directory: ./docs + run: npm run build + + - name: Upload build artifacts + if: github.ref == 'refs/heads/main' || github.event_name == 'workflow_dispatch' + uses: actions/upload-pages-artifact@v3 + with: + path: docs/dist + + deploy: + needs: build + if: github.ref == 'refs/heads/main' || github.event_name == 'workflow_dispatch' + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..ddce69b6 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +dist/ +.astro/ diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index a1c4cb6e..00000000 --- a/docs/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# APM Documentation - -Welcome to the Agent Package Manager documentation. Choose your path: - -## 🚀 **Getting Started** -- **[Quick Start Guide](../README.md#quick-start-2-minutes)** - 2-minute setup -- **[Getting Started](getting-started.md)** - Complete setup guide -- **[Core Concepts](concepts.md)** - Understanding AI-Native Development - -## 🧠 **Core Innovation** -- **[APM Compilation](compilation.md)** - Mathematical context optimization engine -- **[Context Guide](primitives.md)** - Creating effective AI primitives - -## 📖 **Reference** -- **[CLI Reference](cli-reference.md)** - Complete command documentation -- **[Examples & Use Cases](examples.md)** - Real-world patterns -- **[Integration Guide](integrations.md)** - VSCode, AI runtimes, tools - -## 🔧 **Advanced** -- **[Runtime Integration](runtime-integration.md)** - Codex and LLM setup -- **[Changelog](../CHANGELOG.md)** - Feature status and release history -- **[Contributing Guide](../CONTRIBUTING.md)** - Join the ecosystem - ---- - -**New to APM?** Start with the [Quick Start Guide](../README.md#quick-start-2-minutes) or explore [Core Concepts](concepts.md). - -**Technical Evaluation?** Check out [APM Compilation](compilation.md) to understand the mathematical innovation. \ No newline at end of file diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs new file mode 100644 index 00000000..f480456b --- /dev/null +++ b/docs/astro.config.mjs @@ -0,0 +1,88 @@ +// @ts-check +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; +import starlightLlmsTxt from 'starlight-llms-txt'; +import starlightLinksValidator from 'starlight-links-validator'; +import mermaid from 'astro-mermaid'; + +// https://astro.build/config +export default defineConfig({ + site: 'https://microsoft.github.io', + base: '/apm/', + integrations: [ + mermaid(), + starlight({ + title: 'Agent Package Manager', + description: 'An open-source, community-driven dependency manager for AI agents. Declare skills, prompts, instructions, and tools in apm.yml — install with one command.', + favicon: '/favicon.svg', + social: [ + { icon: 'github', label: 'GitHub', href: 'https://github.com/microsoft/apm' }, + ], + tableOfContents: { + minHeadingLevel: 2, + maxHeadingLevel: 4, + }, + pagination: true, + customCss: ['./src/styles/custom.css'], + expressiveCode: { + frames: { + showCopyToClipboardButton: true, + }, + }, + plugins: [ + starlightLinksValidator({ + errorOnRelativeLinks: false, + errorOnLocalLinks: true, + }), + starlightLlmsTxt({ + description: 'APM (Agent Package Manager) is an open-source dependency manager for AI agents. It lets you declare skills, prompts, instructions, agents, hooks, plugins, and MCP servers in a single apm.yml manifest, resolving transitive dependencies automatically.', + }), + ], + sidebar: [ + { + label: 'Introduction', + items: [ + { label: 'Why APM?', slug: 'introduction/why-apm' }, + { label: 'How It Works', slug: 'introduction/how-it-works' }, + { label: 'Key Concepts', slug: 'introduction/key-concepts' }, + ], + }, + { + label: 'Getting Started', + items: [ + { label: 'Installation', slug: 'getting-started/installation' }, + { label: 'Your First Package', slug: 'getting-started/first-package' }, + { label: 'Authentication', slug: 'getting-started/authentication' }, + ], + }, + { + label: 'Guides', + items: [ + { label: 'Compilation & Optimization', slug: 'guides/compilation' }, + { label: 'Skills', slug: 'guides/skills' }, + { label: 'Prompts', slug: 'guides/prompts' }, + { label: 'Plugins', slug: 'guides/plugins' }, + { label: 'Dependencies & Lockfile', slug: 'guides/dependencies' }, + ], + }, + { + label: 'Integrations', + items: [ + { label: 'GitHub Agentic Workflows', slug: 'integrations/gh-aw' }, + { label: 'APM in CI/CD', slug: 'integrations/ci-cd' }, + { label: 'AI Runtime Compatibility', slug: 'integrations/runtime-compatibility' }, + { label: 'IDE & Tool Integration', slug: 'integrations/ide-tool-integration' }, + ], + }, + { + label: 'Reference', + autogenerate: { directory: 'reference' }, + }, + { + label: 'Contributing', + autogenerate: { directory: 'contributing' }, + }, + ], + }), + ], +}); diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index f0702665..00000000 --- a/docs/index.md +++ /dev/null @@ -1,55 +0,0 @@ -# APM Documentation - -Welcome to the Agent Package Manager (APM) documentation. APM is the AI Package Manager that transforms any project into reliable AI-Native Development - build, package, share, and run agentic workflows across any LLM runtime. - -## Quick Start Guide - -New to APM? Follow this learning path for the fastest way to get productive: - -1. **[Getting Started](getting-started.md)** - Installation, setup, and your first project -2. **[Core Concepts](concepts.md)** - Understanding the AI-Native Development framework -3. **[Examples & Use Cases](examples.md)** - Real-world workflow patterns and enterprise examples -4. **[Context Guide](primitives.md)** - Build custom workflows and advanced patterns - -## Essential References - -### Core Innovation -- **[APM Compilation](compilation.md)** - Mathematical context optimization that solves AI agent scalability - -### Command Line Interface -- **[CLI Reference](cli-reference.md)** - Complete command documentation with examples -- **[Plugin System](plugins.md)** - Installing and using plugins with plugin.json format -- **[Manifest Schema](manifest-schema.md)** - Complete `apm.yml` schema reference for integrators -- **[Integration Guide](integrations.md)** - VSCode, Spec-kit, AI runtimes, and tool compatibility - -### Framework Implementation -- **[Context Guide](primitives.md)** - Creating and using the four primitive types -- **[Prompts Guide](prompts.md)** - Creating reusable AI instructions and workflows -- **[Runtime Integration](runtime-integration.md)** - Setup for Codex and LLM runtimes - -## Development & Contributing - -### Project Development -- **[Roadmap](https://github.com/microsoft/apm/discussions/116)** - Current roadmap and feature plans -- **[Integration Testing](integration-testing.md)** - Testing strategy and execution -- **[Contributing Guide](../CONTRIBUTING.md)** - How to contribute to the APM ecosystem - -### Community Resources -- **[APM Manifesto](../MANIFESTO.md)** - Our principles and philosophy for AI-Native Development -- **[GitHub Issues](https://github.com/microsoft/apm/issues)** - Bug reports and feature requests -- **[AI-Native Development Guide](https://danielmeppiel.github.io/awesome-ai-native/)** - Complete framework documentation - -## Architecture & Advanced Topics - -### Framework Context -APM implements the complete [AI-Native Development framework](https://danielmeppiel.github.io/awesome-ai-native/docs/concepts/) through: - -- **🔧 Layer 1: Markdown Prompt Engineering** - Structured, repeatable AI instructions -- **⚙️ Layer 2: Context** - Configurable tools that deploy prompt + context engineering -- **🎯 Layer 3: Context Engineering** - Strategic LLM memory management for reliability - -**Result**: Transform from supervising every AI interaction to architecting systems that delegate complete workflows to AI agents. - ---- - -**Ready to get started?** Jump to the [Getting Started Guide](getting-started.md) or explore [Core Concepts](concepts.md) to understand the framework. \ No newline at end of file diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 00000000..3cdc4ac1 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,8672 @@ +{ + "name": "apm-docs", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "apm-docs", + "version": "0.0.1", + "dependencies": { + "@astrojs/starlight": "0.37.6", + "astro": "5.18.0", + "astro-mermaid": "^1.3.1", + "sharp": "^0.34.5", + "starlight-links-validator": "^0.19.2", + "starlight-llms-txt": "^0.7.0" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz", + "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.6.tgz", + "integrity": "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==", + "license": "MIT" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.11", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.11.tgz", + "integrity": "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@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.21.0", + "smol-toml": "^1.6.0", + "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/@astrojs/mdx": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.14.tgz", + "integrity": "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.11", + "@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": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.0.tgz", + "integrity": "sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==", + "license": "MIT", + "dependencies": { + "sitemap": "^8.0.2", + "stream-replace-string": "^2.0.0", + "zod": "^3.25.76" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@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" + }, + "peerDependencies": { + "astro": "^5.5.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "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": "18.20.8 || ^20.3.0 || >=22.0.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", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT", + "peer": true + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.2.tgz", + "integrity": "sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@chevrotain/gast": "11.1.2", + "@chevrotain/types": "11.1.2", + "lodash-es": "4.17.23" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.2.tgz", + "integrity": "sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@chevrotain/types": "11.1.2", + "lodash-es": "4.17.23" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.2.tgz", + "integrity": "sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/@chevrotain/types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", + "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/@chevrotain/utils": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.2.tgz", + "integrity": "sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==", + "license": "Apache-2.0", + "peer": true + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@expressive-code/core": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.7.tgz", + "integrity": "sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg==", + "license": "MIT", + "dependencies": { + "@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.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.7.tgz", + "integrity": "sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.7.tgz", + "integrity": "sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7", + "shiki": "^3.2.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.7.tgz", + "integrity": "sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT", + "peer": true + }, + "node_modules/@iconify/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "mlly": "^1.8.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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" + ], + "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/@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" + ], + "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/@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" + ], + "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.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" + ], + "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.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" + ], + "libc": [ + "glibc" + ], + "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.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" + ], + "libc": [ + "glibc" + ], + "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" + ], + "libc": [ + "glibc" + ], + "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" + ], + "libc": [ + "glibc" + ], + "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.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" + ], + "libc": [ + "glibc" + ], + "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.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" + ], + "libc": [ + "glibc" + ], + "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.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" + ], + "libc": [ + "musl" + ], + "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.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" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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" + ], + "libc": [ + "glibc" + ], + "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/@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" + ], + "libc": [ + "glibc" + ], + "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/@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" + ], + "libc": [ + "glibc" + ], + "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" + ], + "libc": [ + "glibc" + ], + "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.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" + ], + "libc": [ + "glibc" + ], + "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/@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" + ], + "libc": [ + "glibc" + ], + "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/@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" + ], + "libc": [ + "musl" + ], + "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/@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" + ], + "libc": [ + "musl" + ], + "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/@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" + ], + "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/@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" + ], + "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.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" + ], + "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.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" + ], + "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/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.1.tgz", + "integrity": "sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "langium": "^4.0.0" + } + }, + "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==", + "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" + ], + "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" + ], + "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==", + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", + "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", + "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "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==", + "license": "MIT" + }, + "node_modules/@types/braces": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.5.tgz", + "integrity": "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==", + "license": "MIT" + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/micromatch": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.10.tgz", + "integrity": "sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ==", + "license": "MIT", + "dependencies": { + "@types/braces": "*" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.4.0.tgz", + "integrity": "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/picomatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-3.0.2.tgz", + "integrity": "sha512-n0i8TD3UDB7paoMMxA3Y65vUncFJXjcUf7lQY7YyKGl6031FNjfsLs6pdLFCy2GNFxItPJG8GvvpbZc2skH7WA==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "license": "MIT", + "peer": true, + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "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" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "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==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "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==", + "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==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.18.0.tgz", + "integrity": "sha512-CHiohwJIS4L0G6/IzE1Fx3dgWqXBCXus/od0eGUfxrZJD2um2pE7ehclMmgL/fXqbU7NfE1Ze2pq34h2QaA6iQ==", + "license": "MIT", + "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": "^4.0.0", + "@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.1.1", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.6.2", + "diff": "^8.0.3", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.27.3", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.4.0", + "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.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.3", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.4", + "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.1", + "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.7", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.7.tgz", + "integrity": "sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.41.7" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" + } + }, + "node_modules/astro-mermaid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/astro-mermaid/-/astro-mermaid-1.3.1.tgz", + "integrity": "sha512-1+FjwayMSZLtFd+ofdu1+v8a902nN5wmPmjY2qb8tLiO96YlL65LbskiuUcyH6q9h0CdZCrkc5FimlaHZsMJsg==", + "license": "MIT", + "dependencies": { + "import-meta-resolve": "^4.2.0", + "mdast-util-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "peerDependencies": { + "@mermaid-js/layout-elk": "^0.2.0", + "astro": "^4.0.0 || ^5.0.0", + "mermaid": "^10.0.0 || ^11.0.0" + }, + "peerDependenciesMeta": { + "@mermaid-js/layout-elk": { + "optional": true + } + } + }, + "node_modules/astro/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==", + "license": "MIT" + }, + "node_modules/astro/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==", + "license": "MIT", + "dependencies": { + "@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/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "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==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "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/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chevrotain": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.2.tgz", + "integrity": "sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@chevrotain/cst-dts-gen": "11.1.2", + "@chevrotain/gast": "11.1.2", + "@chevrotain/regexp-to-ast": "11.1.2", + "@chevrotain/types": "11.1.2", + "@chevrotain/utils": "11.1.2", + "lodash-es": "4.17.23" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT", + "peer": true + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "peer": true, + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "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", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "peer": true, + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT", + "peer": true + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "peer": true, + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "peer": true, + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC", + "peer": true + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", + "license": "MIT", + "peer": true, + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT", + "peer": true + }, + "node_modules/debug": { + "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" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "peer": true, + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz", + "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.2.tgz", + "integrity": "sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "peer": true, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-module-lexer": { + "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==", + "license": "MIT" + }, + "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", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.7.tgz", + "integrity": "sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7", + "@expressive-code/plugin-frames": "^0.41.7", + "@expressive-code/plugin-shiki": "^0.41.7", + "@expressive-code/plugin-text-markers": "^0.41.7" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz", + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.6.tgz", + "integrity": "sha512-oi15ESLW5LRthZ+qPCi5GNasY/gvynSKUQxgiovrY63bPAtG59wtM+LSrlcwvOHAXzGrXVLnI97brbkdPF9WoQ==", + "license": "MIT", + "dependencies": { + "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.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT", + "peer": true + }, + "node_modules/has-flag": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", + "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "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==", + "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==", + "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": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "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==", + "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==", + "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==", + "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==", + "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", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "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==", + "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", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "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==", + "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", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "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==", + "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", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-10.1.2.tgz", + "integrity": "sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "hast-util-to-text": "^4.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-minify-whitespace": "^6.0.0", + "trim-trailing-lines": "^2.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "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==", + "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==", + "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", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "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", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "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-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "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", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/katex": { + "version": "0.16.38", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.38.tgz", + "integrity": "sha512-cjHooZUmIAUmDsHBN+1n8LaZdpmbj03LtYeYPyuYB7OuloiaeaV6N4LcfjcnHVzGWjVQmKrxxTrpDcmSzEZQwQ==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "peer": true, + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", + "peer": true + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/langium": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.1.tgz", + "integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "chevrotain": "~11.1.1", + "chevrotain-allstar": "~0.3.1", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.1.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT", + "peer": true + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "node_modules/mermaid": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.13.0.tgz", + "integrity": "sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.0.1", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.33.1", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.19", + "dompurify": "^3.3.1", + "katex": "^0.16.25", + "khroma": "^2.1.0", + "lodash-es": "^4.17.23", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.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", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^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-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^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-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^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-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^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-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^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-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mlly": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "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==", + "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==", + "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==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "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==", + "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==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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==", + "license": "MIT", + "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/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT", + "peer": true + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT", + "peer": true + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT", + "peer": true + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "peer": true, + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "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==", + "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==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "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.7", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.7.tgz", + "integrity": "sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.41.7" + } + }, + "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==", + "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-minify-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.2.tgz", + "integrity": "sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-minify-whitespace": "^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==", + "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", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-remark": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-remark/-/rehype-remark-10.0.1.tgz", + "integrity": "sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "hast-util-to-mdast": "^10.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "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": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.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", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "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==", + "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", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "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==", + "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==", + "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==", + "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/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense", + "peer": true + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT", + "peer": true + }, + "node_modules/sax": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "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/shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz", + "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.23.0", + "@shikijs/engine-javascript": "3.23.0", + "@shikijs/engine-oniguruma": "3.23.0", + "@shikijs/langs": "3.23.0", + "@shikijs/themes": "3.23.0", + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.3.tgz", + "integrity": "sha512-9Ew1tR2WYw8RGE2XLy7GjkusvYXy8Rg6y8TYuBuQMfIEdGcWoJpY2Wr5DzsEiL/TKCw56+YKTCCUHglorEYK+A==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "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", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/starlight-links-validator": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/starlight-links-validator/-/starlight-links-validator-0.19.2.tgz", + "integrity": "sha512-IHeK3R78fsmv53VfRkGbXkwK1CQEUBHM9QPzBEyoAxjZ/ssi5gjV+F4oNNUppTR48iPp+lEY0MTAmvkX7yNnkw==", + "license": "MIT", + "dependencies": { + "@types/picomatch": "^3.0.1", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-has-property": "^3.0.0", + "is-absolute-url": "^4.0.1", + "kleur": "^4.1.5", + "mdast-util-mdx-jsx": "^3.1.3", + "mdast-util-to-string": "^4.0.0", + "picomatch": "^4.0.2", + "terminal-link": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=18.17.1" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.32.0", + "astro": ">=5.1.5" + } + }, + "node_modules/starlight-links-validator/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/starlight-llms-txt": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/starlight-llms-txt/-/starlight-llms-txt-0.7.0.tgz", + "integrity": "sha512-KAay6JLXqB0GiNQ481z3Z/h/y4xeAU55TUGLz+npjxcRvN3h/7rDxjmyLiphZF8xfoqqSTduQPanl5Ct4Je6kA==", + "license": "MIT", + "dependencies": { + "@astrojs/mdx": "^4.3.13", + "@types/hast": "^3.0.4", + "@types/micromatch": "^4.0.10", + "github-slugger": "^2.0.0", + "hast-util-select": "^6.0.4", + "micromatch": "^4.0.8", + "rehype-parse": "^9.0.1", + "rehype-remark": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-stringify": "^11.0.0", + "unified": "^11.0.5", + "unist-util-remove": "^4.0.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.31", + "astro": "^5.15.9" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "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/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT", + "peer": true + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-hyperlinks": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.4.0.tgz", + "integrity": "sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==", + "license": "MIT", + "dependencies": { + "has-flag": "^5.0.1", + "supports-color": "^10.2.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/terminal-link": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-5.0.0.tgz", + "integrity": "sha512-qFAy10MTMwjzjU8U16YS4YoZD+NQLHzLssFMNqgravjbvIPNiqkGFR4yjhJfmY9R5OFU7+yHxc6y+uGHkKwLRA==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "supports-hyperlinks": "^4.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-trailing-lines": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz", + "integrity": "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "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", + "optional": true + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "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==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "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==", + "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.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" + }, + "funding": { + "type": "opencollective", + "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==", + "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", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-4.0.0.tgz", + "integrity": "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "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==", + "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-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "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==", + "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.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", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "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 || ^7 || ^8", + "@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 || ^2 || ^3", + "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/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/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "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==", + "license": "MIT", + "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/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/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" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "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/vitefu": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz", + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", + "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 || ^8.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "peer": true, + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "peer": true, + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT", + "peer": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT", + "peer": true + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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/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==", + "license": "MIT" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "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==", + "license": "MIT", + "engines": { + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "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==", + "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==", + "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", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000..434b3bda --- /dev/null +++ b/docs/package.json @@ -0,0 +1,23 @@ +{ + "name": "apm-docs", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/starlight": "0.37.6", + "astro": "5.18.0", + "astro-mermaid": "^1.3.1", + "sharp": "^0.34.5", + "starlight-links-validator": "^0.19.2", + "starlight-llms-txt": "^0.7.0" + }, + "overrides": { + "@astrojs/sitemap": "3.7.0" + } +} diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg new file mode 100644 index 00000000..7e7f93ea --- /dev/null +++ b/docs/public/favicon.svg @@ -0,0 +1,3 @@ + + + A diff --git a/docs/src/content.config.ts b/docs/src/content.config.ts new file mode 100644 index 00000000..86a8a08a --- /dev/null +++ b/docs/src/content.config.ts @@ -0,0 +1,10 @@ +import { defineCollection } from 'astro:content'; +import { docsLoader } from '@astrojs/starlight/loaders'; +import { docsSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ + loader: docsLoader(), + schema: docsSchema(), + }), +}; diff --git a/docs/src/content/docs/404.md b/docs/src/content/docs/404.md new file mode 100644 index 00000000..cea317e7 --- /dev/null +++ b/docs/src/content/docs/404.md @@ -0,0 +1,8 @@ +--- +title: '404' +template: splash +editUrl: false +hero: + title: '404' + tagline: Page not found. Check the URL or use the navigation to find what you're looking for. +--- diff --git a/docs/src/content/docs/contributing/changelog.md b/docs/src/content/docs/contributing/changelog.md new file mode 100644 index 00000000..defd60a4 --- /dev/null +++ b/docs/src/content/docs/contributing/changelog.md @@ -0,0 +1,15 @@ +--- +title: "Changelog" +description: "All notable changes to APM, following Keep a Changelog format." +sidebar: + order: 2 +--- + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +:::note +For the latest changelog, see the [CHANGELOG.md on GitHub](https://github.com/microsoft/apm/blob/main/CHANGELOG.md). +::: diff --git a/docs/src/content/docs/contributing/development-guide.md b/docs/src/content/docs/contributing/development-guide.md new file mode 100644 index 00000000..edf534d8 --- /dev/null +++ b/docs/src/content/docs/contributing/development-guide.md @@ -0,0 +1,126 @@ +--- +title: "Development Guide" +description: "How to contribute to APM — setup, coding style, testing, and pull request process." +sidebar: + order: 1 +--- + +Thank you for considering contributing to APM! This document outlines the process for contributing to the project. + +## Code of Conduct + +By participating in this project, you agree to abide by our [Code of Conduct](https://github.com/microsoft/apm/blob/main/CODE_OF_CONDUCT.md). Please read it before contributing. + +## How to Contribute + +### Reporting Bugs + +Before submitting a bug report: + +1. Check the [GitHub Issues](https://github.com/microsoft/apm/issues) to see if the bug has already been reported. +2. Update your copy of the code to the latest version to ensure the issue hasn't been fixed. + +When submitting a bug report: + +1. Use our bug report template. +2. Include detailed steps to reproduce the bug. +3. Describe the expected behavior and what actually happened. +4. Include any relevant logs or error messages. + +### Suggesting Enhancements + +Enhancement suggestions are welcome! Please: + +1. Use our feature request template. +2. Clearly describe the enhancement and its benefits. +3. Provide examples of how the enhancement would work. + +### Development Process + +1. Fork the repository. +2. Create a new branch for your feature/fix: `git checkout -b feature/your-feature-name` or `git checkout -b fix/issue-description`. +3. Make your changes. +4. Run tests: `uv run pytest` +5. Ensure your code follows our coding style (we use Black and isort). +6. Commit your changes with a descriptive message. +7. Push to your fork. +8. Submit a pull request. + +### Pull Request Process + +1. Fill out the PR template — describe what changed, why, and link the issue. +2. Ensure your PR addresses only one concern (one feature, one bug fix). +3. Include tests for new functionality. +4. Update documentation if needed. +5. PRs must pass all CI checks before they can be merged. + +### Issue Triage + +Every new issue is automatically labeled `needs-triage`. Maintainers review incoming issues and: + +1. **Accept** — remove `needs-triage`, add `accepted`, and assign a milestone. +2. **Prioritize** — optionally add `priority/high` or `priority/low`. +3. **Close** — if it's a duplicate (`duplicate`) or out of scope, close with a comment explaining why. + +Labels used for triage: `needs-triage`, `accepted`, `needs-design`, `priority/high`, `priority/low`. + +## Development Environment + +This project uses uv to manage Python environments and dependencies: + +```bash +# Clone the repository +git clone https://github.com/microsoft/apm.git +cd apm + +# Install all dependencies (creates .venv automatically) +uv sync --extra dev +``` + +## Testing + +We use pytest for testing. After completing the setup above, run the test suite with: + +```bash +uv run pytest -q +``` + +If you don't have `uv` available, you can use a standard Python venv and pip: + +```bash +# create and activate a venv (POSIX / WSL) +python -m venv .venv +source .venv/bin/activate + +# install this package in editable mode and test deps +pip install -U pip +pip install -e .[dev] + +# run tests +pytest -q +``` + +## Coding Style + +This project follows: +- [PEP 8](https://pep8.org/) for Python style guidelines +- We use Black for code formatting and isort for import sorting + +You can run these tools with: + +```bash +uv run black . +uv run isort . +``` + +## Documentation + +If your changes affect how users interact with the project, update the documentation accordingly. + +## License + +By contributing to this project, you agree that your contributions will be licensed under the project's [MIT License](https://github.com/microsoft/apm/blob/main/LICENSE). + +## Questions? + +If you have any questions, feel free to open an issue or reach out to the maintainers. diff --git a/docs/integration-testing.md b/docs/src/content/docs/contributing/integration-testing.md similarity index 99% rename from docs/integration-testing.md rename to docs/src/content/docs/contributing/integration-testing.md index 57e0653b..755c833f 100644 --- a/docs/integration-testing.md +++ b/docs/src/content/docs/contributing/integration-testing.md @@ -1,4 +1,8 @@ -# Integration Testing +--- +title: "Integration Testing" +sidebar: + order: 3 +--- This document describes APM's integration testing strategy to ensure runtime setup scripts work correctly and the golden scenario from the README functions as expected. diff --git a/docs/src/content/docs/getting-started/authentication.md b/docs/src/content/docs/getting-started/authentication.md new file mode 100644 index 00000000..26a3e47e --- /dev/null +++ b/docs/src/content/docs/getting-started/authentication.md @@ -0,0 +1,164 @@ +--- +title: "Authentication" +sidebar: + order: 3 +--- + +APM works without any tokens for public packages. Authentication is only needed for private repositories and enterprise hosts. + +## Token Configuration + +| Variable | Purpose | When Needed | +|----------|---------|-------------| +| `GITHUB_APM_PAT` | Private GitHub/GHE repos | Private GitHub packages | +| `ADO_APM_PAT` | Private Azure DevOps repos | Private ADO packages | +| `GITHUB_COPILOT_PAT` | Copilot runtime | `apm run` with Copilot | +| `GITHUB_HOST` | Default host for bare package names | GitHub Enterprise setups | + +### GITHUB_APM_PAT + +```bash +export GITHUB_APM_PAT=ghp_finegrained_token_here +``` + +- **Purpose**: Access to private APM modules on GitHub/GitHub Enterprise +- **Type**: Fine-grained Personal Access Token (org or user-scoped) +- **Permissions**: Repository read access to repositories you want to install from + +### ADO_APM_PAT + +```bash +export ADO_APM_PAT=your_ado_pat +``` + +- **Purpose**: Access to private APM modules on Azure DevOps +- **Type**: Azure DevOps Personal Access Token +- **Permissions**: Code (Read) scope + +### GITHUB_COPILOT_PAT + +```bash +export GITHUB_COPILOT_PAT=ghp_copilot_token +``` + +- **Purpose**: Authentication for `apm run` with Copilot runtime +- **Type**: Personal Access Token with Copilot access +- **Fallback**: Falls back to `GITHUB_TOKEN` if not set + +### GITHUB_HOST + +```bash +export GITHUB_HOST=github.company.com +``` + +- **Purpose**: Set default host for bare package names (e.g., `owner/repo`) +- **Default**: `github.com` +- **Note**: Azure DevOps has no equivalent — always use FQDN syntax (e.g., `dev.azure.com/org/project/repo`) + +## Common Setup Scenarios + +#### Public Modules Only (Most Users) + +```bash +# No tokens needed — just works! +apm install microsoft/apm-sample-package +``` + +#### Private GitHub Modules + +```bash +export GITHUB_APM_PAT=ghp_org_token +``` + +#### Private Azure DevOps Modules + +```bash +export ADO_APM_PAT=your_ado_pat +# Always use FQDN syntax for ADO +apm install dev.azure.com/org/project/repo +``` + +#### GitHub Enterprise as Default + +```bash +export GITHUB_HOST=github.company.com +export GITHUB_APM_PAT=ghp_enterprise_token +# Now bare packages resolve to your enterprise +apm install team/package # → github.company.com/team/package +``` + +#### Running Prompts + +```bash +export GITHUB_COPILOT_PAT=ghp_copilot_token +``` + +## GitHub Enterprise Support + +APM supports all GitHub Enterprise deployment models via `GITHUB_HOST`. + +```bash +# GitHub Enterprise Server +export GITHUB_HOST=github.company.com +apm install team/package # → github.company.com/team/package + +# GitHub Enterprise Cloud with Data Residency +export GITHUB_HOST=myorg.ghe.com +apm install platform/standards # → myorg.ghe.com/platform/standards + +# Multiple instances: Use FQDN for explicit hosts +apm install partner.ghe.com/external/integration # FQDN always works +apm install github.com/public/open-source-package +``` + +> **Important:** When `GITHUB_HOST` is set, **all** bare package names (e.g., `owner/repo`) resolve against that host. To reference packages on a different server, use the full hostname (FQDN) in your `apm.yml`: +> ```yaml +> dependencies: +> apm: +> - team/internal-package # → goes to GITHUB_HOST +> - github.com/public/open-source-package # → goes to github.com +> ``` + +## Azure DevOps Support + +APM supports Azure DevOps Services (cloud) and Azure DevOps Server (self-hosted). There is no `ADO_HOST` equivalent — Azure DevOps always requires FQDN syntax. + +### URL Format + +Azure DevOps uses 3 segments vs GitHub's 2: +- **GitHub**: `owner/repo` +- **Azure DevOps**: `org/project/repo` + +```bash +# Both formats work (the _git segment is optional): +apm install dev.azure.com/myorg/myproject/myrepo +apm install dev.azure.com/myorg/myproject/_git/myrepo + +# With git reference +apm install dev.azure.com/myorg/myproject/myrepo#main + +# Legacy visualstudio.com URLs +apm install mycompany.visualstudio.com/myorg/myproject/myrepo + +# Self-hosted Azure DevOps Server +apm install ado.company.internal/myorg/myproject/myrepo + +# Virtual packages (individual files) +apm install dev.azure.com/myorg/myproject/myrepo/prompts/code-review.prompt.md +``` + +## Token Creation Guide + +1. **GITHUB_APM_PAT** (Private GitHub modules): + - Go to [github.com/settings/personal-access-tokens/new](https://github.com/settings/personal-access-tokens/new) + - Select "Fine-grained Personal Access Token" + - Scope: Organization or Personal account (as needed) + - Permissions: Repository read access + +2. **ADO_APM_PAT** (Private ADO modules): + - Go to `https://dev.azure.com/{org}/_usersSettings/tokens` + - Create PAT with **Code (Read)** scope + +3. **GITHUB_COPILOT_PAT** (Running prompts): + - Go to [github.com/settings/tokens](https://github.com/settings/tokens) + - Create token with Copilot access diff --git a/docs/src/content/docs/getting-started/first-package.md b/docs/src/content/docs/getting-started/first-package.md new file mode 100644 index 00000000..7e2e38ac --- /dev/null +++ b/docs/src/content/docs/getting-started/first-package.md @@ -0,0 +1,120 @@ +--- +title: "Your First Package" +description: "Create, publish, and install your first APM package in minutes." +sidebar: + order: 2 +--- + +This tutorial walks you through creating an APM package from scratch, publishing it, and installing it in another project. + +## Prerequisites + +- APM installed ([Installation guide](/apm/getting-started/installation/)) +- A GitHub account and a repository to publish to + +## 1. Scaffold the Package + +```bash +apm init my-coding-standards +cd my-coding-standards +``` + +This creates: + +``` +my-coding-standards/ +├── apm.yml # Package manifest +└── .apm/ + ├── instructions/ # Coding standards (.instructions.md) + ├── prompts/ # Slash commands (.prompt.md) + ├── skills/ # Agent skills (SKILL.md) + ├── agents/ # Personas (.agent.md) + └── hooks/ # Event handlers (.json) +``` + +## 2. Add an Instruction + +Create a coding standard that applies to all Python files: + +```bash +cat > .apm/instructions/python.instructions.md << 'EOF' +--- +applyTo: "**/*.py" +--- +# Python Standards +- Use type hints for all function parameters and return values +- Follow PEP 8 style guidelines +- Write docstrings for all public functions +- Prefer `pathlib.Path` over `os.path` +EOF +``` + +## 3. Add a Prompt + +Create a reusable slash command: + +```bash +cat > .apm/prompts/security-audit.prompt.md << 'EOF' +--- +description: Run a security audit on the current file +--- +Review this code for common security issues: +1. Input validation and sanitization +2. Authentication and authorization checks +3. Sensitive data exposure +4. SQL injection and XSS vulnerabilities +Provide specific line numbers and suggested fixes. +EOF +``` + +## 4. Update the Manifest + +Edit `apm.yml` to describe your package: + +```yaml +name: my-coding-standards +version: 1.0.0 +description: Team coding standards and security prompts +``` + +## 5. Publish + +Push to a git repository: + +```bash +git init +git add . +git commit -m "Initial APM package" +git remote add origin https://github.com/you/my-coding-standards.git +git push -u origin main +``` + +## 6. Install in Another Project + +In any project: + +```bash +apm install you/my-coding-standards +``` + +APM automatically: +- Downloads the package to `apm_modules/` +- Copies instructions to `.github/instructions/` +- Copies prompts to `.github/prompts/` +- Updates `apm.yml` with the dependency + +## 7. Compile + +Generate the compiled context files: + +```bash +apm compile +``` + +This produces `AGENTS.md` (for Copilot, Cursor, Codex) and `CLAUDE.md` (for Claude) with all your instructions optimized for each agent. + +## Next Steps + +- Add [skills](/apm/guides/skills/) to your package +- Set up [dependencies](/apm/guides/dependencies/) on other packages +- Explore the [CLI reference](/apm/reference/cli-commands/) for more commands diff --git a/docs/getting-started.md b/docs/src/content/docs/getting-started/installation.md similarity index 65% rename from docs/getting-started.md rename to docs/src/content/docs/getting-started/installation.md index de12561a..b3e4a208 100644 --- a/docs/getting-started.md +++ b/docs/src/content/docs/getting-started/installation.md @@ -1,192 +1,12 @@ -# Getting Started with APM +--- +title: "Installation" +sidebar: + order: 1 +--- -Welcome to APM - the AI Package Manager that transforms any project into reliable AI-Native Development. This guide will walk you through setup, installation, and creating your first AI-native project. +Get APM running in seconds. No tokens, no configuration — just install and go. -## Prerequisites - -### Token Configuration (All Optional) - -APM works without any tokens for public modules. Tokens unlock additional capabilities: - -#### For Private Module Access - -| Variable | Purpose | When Needed | -|----------|---------|-------------| -| `GITHUB_APM_PAT` | Private GitHub/GHE repos | Private GitHub packages | -| `ADO_APM_PAT` | Private Azure DevOps repos | Private ADO packages | - -##### GITHUB_APM_PAT -```bash -export GITHUB_APM_PAT=ghp_finegrained_token_here -``` -- **Purpose**: Access to private APM modules on GitHub/GitHub Enterprise -- **Type**: Fine-grained Personal Access Token (org or user-scoped) -- **Permissions**: Repository read access to repositories you want to install from - -##### ADO_APM_PAT -```bash -export ADO_APM_PAT=your_ado_pat -``` -- **Purpose**: Access to private APM modules on Azure DevOps -- **Type**: Azure DevOps Personal Access Token -- **Permissions**: Code (Read) scope - -#### For Running Prompts (`apm run`) - -| Variable | Purpose | When Needed | -|----------|---------|-------------| -| `GITHUB_COPILOT_PAT` | Copilot runtime | `apm run` with Copilot | - -##### GITHUB_COPILOT_PAT -```bash -export GITHUB_COPILOT_PAT=ghp_copilot_token -``` -- **Purpose**: Authentication for `apm run` with Copilot runtime -- **Type**: Personal Access Token with Copilot access -- **Fallback**: Falls back to `GITHUB_TOKEN` if not set - -#### Host Configuration - -| Variable | Purpose | Default | -|----------|---------|---------| -| `GITHUB_HOST` | Default host for bare package names | `github.com` | - -##### GITHUB_HOST -```bash -export GITHUB_HOST=github.company.com -``` -- **Purpose**: Set default host for bare package names (e.g., `owner/repo`) -- **Default**: `github.com` -- **Note**: Azure DevOps has no equivalent - always use FQDN syntax (e.g., `dev.azure.com/org/project/repo`) - -### Common Setup Scenarios - -#### Scenario 1: Public Modules Only (Most Users) -```bash -# No tokens needed - just works! -apm install microsoft/apm-sample-package -apm compile -``` - -#### Scenario 2: Private GitHub Modules -```bash -export GITHUB_APM_PAT=ghp_org_token # For GitHub/GHE -``` - -#### Scenario 3: Private Azure DevOps Modules -```bash -export ADO_APM_PAT=your_ado_pat -# Note: Always use FQDN syntax for ADO -apm install dev.azure.com/org/project/repo -``` - -#### Scenario 4: GitHub Enterprise as Default -```bash -export GITHUB_HOST=github.company.com -export GITHUB_APM_PAT=ghp_enterprise_token -# Now bare packages resolve to your enterprise -apm install team/package # → github.company.com/team/package -``` - -#### Scenario 5: Running Prompts -```bash -export GITHUB_COPILOT_PAT=ghp_copilot_token # For apm run -``` - -## Package Sources - -APM installs packages from multiple sources. Use the format that matches your repository host: - -| Source | Format | Example | -|--------|--------|---------| -| GitHub.com | `owner/repo` | `apm install microsoft/apm-sample-package` | -| GitHub Enterprise | `ghe.company.com/owner/repo` | `apm install ghe.myco.com/team/standards` | -| GitLab | `gitlab.com/group/subgroup/repo` | `apm install gitlab.com/acme/platform/rules` | -| GitLab (HTTPS) | `https://gitlab.com/group/repo.git` | `apm install https://gitlab.com/acme/rules.git` | -| Bitbucket | `https://bitbucket.org/owner/repo.git` | `apm install https://bitbucket.org/team/rules.git` | -| Any git host | `git@host:owner/repo.git` | `apm install git@git.company.com:team/rules.git` | -| Azure DevOps | `dev.azure.com/org/project/repo` | `apm install dev.azure.com/myorg/proj/rules` | -| Virtual Package | `owner/repo/path/to/skill` | `apm install github/awesome-copilot/skills/review-and-refactor` | - -### GitHub Enterprise Support - -APM supports all GitHub Enterprise deployment models via `GITHUB_HOST` (see [Host Configuration](#host-configuration)). - -#### Examples - -```bash -# GitHub Enterprise Server -export GITHUB_HOST=github.company.com -apm install team/package # → github.company.com/team/package - -# GitHub Enterprise Cloud with Data Residency -export GITHUB_HOST=myorg.ghe.com -apm install platform/standards # → myorg.ghe.com/platform/standards - -# Multiple instances: Use FQDN for explicit hosts -apm install partner.ghe.com/external/integration # FQDN always works -apm install github.com/public/open-source-package -``` - -> **Important:** When `GITHUB_HOST` is set, **all** bare package names (e.g., `owner/repo`) resolve against that host. To reference packages on a different server, use the full hostname (FQDN) in your `apm.yml`: -> ```yaml -> dependencies: -> apm: -> - team/internal-package # → goes to GITHUB_HOST -> - github.com/public/open-source-package # → goes to github.com -> ``` - -**Key Insight:** Use `GITHUB_HOST` to set your default for bare package names. Use FQDN syntax for any host (e.g., `github.com`, `gitlab.com`, `bitbucket.org`, `*.ghe.com`, Azure DevOps), or use full HTTPS/SSH git URLs. - -### Azure DevOps Support - -APM supports Azure DevOps Services (cloud) and Azure DevOps Server (self-hosted). **Note:** There is no `ADO_HOST` equivalent - Azure DevOps always requires FQDN syntax. - -#### URL Format - -Azure DevOps uses 3 segments vs GitHub's 2: -- **GitHub**: `owner/repo` -- **Azure DevOps**: `org/project/repo` - -```bash -# Both formats work (the _git segment is optional): -apm install dev.azure.com/myorg/myproject/myrepo -apm install dev.azure.com/myorg/myproject/_git/myrepo - -# With git reference -apm install dev.azure.com/myorg/myproject/myrepo#main - -# Legacy visualstudio.com URLs -apm install mycompany.visualstudio.com/myorg/myproject/myrepo - -# Self-hosted Azure DevOps Server -apm install ado.company.internal/myorg/myproject/myrepo - -# Virtual packages (individual files) -apm install dev.azure.com/myorg/myproject/myrepo/prompts/code-review.prompt.md -``` - -For authentication, see [Token Configuration](#token-configuration-all-optional). - -### Token Creation Guide - -1. **Create Fine-grained PAT** for `GITHUB_APM_PAT` (Private GitHub modules): - - Go to [github.com/settings/personal-access-tokens/new](https://github.com/settings/personal-access-tokens/new) - - Select "Fine-grained Personal Access Token" - - Scope: Organization or Personal account (as needed) - - Permissions: Repository read access - -2. **Create Azure DevOps PAT** for `ADO_APM_PAT` (Private ADO modules): - - Go to `https://dev.azure.com/{org}/_usersSettings/tokens` - - Create PAT with **Code (Read)** scope - -3. **Create Copilot PAT** for `GITHUB_COPILOT_PAT` (Running prompts): - - Go to [github.com/settings/tokens](https://github.com/settings/tokens) - - Create token with Copilot access - -## Installation - -### Quick Install (Recommended) +## Quick Install (Recommended) The fastest way to get APM running: @@ -582,7 +402,7 @@ apm run github/awesome-copilot/code-review apm run acme/standards/code-review ``` -See [Prompts Guide](prompts.md#running-prompts) for complete auto-discovery documentation. +See [Prompts Guide](../../guides/prompts/#running-prompts) for complete auto-discovery documentation. ### 5. Run Your First Workflow @@ -652,11 +472,11 @@ curl -H "Authorization: token $GITHUB_CLI_PAT" https://api.github.com/user Now that you have APM set up: -1. **Learn the concepts**: Read [Core Concepts](concepts.md) to understand the AI-Native Development framework -2. **Study examples**: Check [Examples & Use Cases](examples.md) for real-world patterns -3. **Build workflows**: See [Context Guide](primitives.md) to create advanced workflows -4. **Explore dependencies**: See [Dependency Management](dependencies.md) for sharing context across projects -5. **Explore integrations**: Review [Integrations Guide](integrations.md) for tool compatibility +1. **Learn the concepts**: Read [Core Concepts](../../introduction/how-it-works/) to understand the AI-Native Development framework +2. **Study examples**: Check [Examples & Use Cases](../../reference/examples/) for real-world patterns +3. **Build workflows**: See [Context Guide](../../introduction/key-concepts/) to create advanced workflows +4. **Explore dependencies**: See [Dependency Management](../../guides/dependencies/) for sharing context across projects +5. **Explore integrations**: Review [Integrations Guide](../../integrations/ide-tool-integration/) for tool compatibility ## Quick Reference @@ -682,4 +502,4 @@ apm deps list # 🔗 Show installed APM dependencies - `apm_modules/` - Installed APM dependencies - `*.prompt.md` - Executable agent workflows -Ready to build reliable AI workflows? Let's explore the [core concepts](concepts.md) next! \ No newline at end of file +Ready to build reliable AI workflows? Let's explore the [core concepts](../../introduction/how-it-works/) next! \ No newline at end of file diff --git a/docs/compilation.md b/docs/src/content/docs/guides/compilation.md similarity index 97% rename from docs/compilation.md rename to docs/src/content/docs/guides/compilation.md index 92902094..43ca7112 100644 --- a/docs/compilation.md +++ b/docs/src/content/docs/guides/compilation.md @@ -1,4 +1,8 @@ -# APM Compilation: Mathematical Context Optimization +--- +title: "Compilation" +sidebar: + order: 1 +--- **Solving the AI agent scalability problem through constraint satisfaction optimization** @@ -43,7 +47,7 @@ target: copilot # or vscode, claude, or all > **Aliases**: `vscode` and `agents` are accepted as aliases for `copilot`. -> **Note**: `AGENTS.md` and `CLAUDE.md` contain **only instructions** (grouped by `applyTo` patterns). Prompts, agents, commands, hooks, and skills are integrated by `apm install`, not `apm compile`. See the [Integrations Guide](integrations.md) for details on how `apm install` populates `.github/prompts/`, `.github/agents/`, `.github/skills/`, and `.claude/commands/`. +> **Note**: `AGENTS.md` and `CLAUDE.md` contain **only instructions** (grouped by `applyTo` patterns). Prompts, agents, commands, hooks, and skills are integrated by `apm install`, not `apm compile`. See the [Integrations Guide](../../integrations/ide-tool-integration/) for details on how `apm install` populates `.github/prompts/`, `.github/agents/`, `.github/skills/`, and `.claude/commands/`. ### How It Works @@ -495,5 +499,5 @@ apm compile --verbose apm init my-project && cd my-project && apm compile ``` -**Technical Implementation**: [`src/apm_cli/compilation/`](../src/apm_cli/compilation/) -**Mathematical Core**: [`context_optimizer.py`](../src/apm_cli/compilation/context_optimizer.py) \ No newline at end of file +**Technical Implementation**: ``src/apm_cli/compilation/`` +**Mathematical Core**: ``context_optimizer.py`` \ No newline at end of file diff --git a/docs/dependencies.md b/docs/src/content/docs/guides/dependencies.md similarity index 97% rename from docs/dependencies.md rename to docs/src/content/docs/guides/dependencies.md index c9815cfb..20cb7665 100644 --- a/docs/dependencies.md +++ b/docs/src/content/docs/guides/dependencies.md @@ -1,4 +1,8 @@ -# APM Package Dependencies Guide +--- +title: "Dependencies" +sidebar: + order: 5 +--- Complete guide to APM package dependency management - share and reuse context collections across projects for consistent, scalable AI-native development. @@ -61,7 +65,7 @@ Skill folders use the **source folder name directly** (not flattened paths): └── apm-sample-package/ # From microsoft/apm-sample-package ``` -→ See [Skills Guide](skills.md) for complete documentation. +→ See [Skills Guide](../skills/) for complete documentation. ## Quick Start @@ -719,9 +723,9 @@ apm run design-review --param component="login-form" ## Next Steps -- **[CLI Reference](cli-reference.md)** - Complete command documentation -- **[Getting Started](getting-started.md)** - Basic APM usage -- **[Context Guide](concepts.md)** - Understanding the AI-Native Development framework -- **[Creating Packages](primitives.md)** - Build your own APM packages +- **[CLI Reference](../../reference/cli-commands/)** - Complete command documentation +- **[Getting Started](../../getting-started/installation/)** - Basic APM usage +- **[Context Guide](../../introduction/how-it-works/)** - Understanding the AI-Native Development framework +- **[Creating Packages](../../introduction/key-concepts/)** - Build your own APM packages -Ready to create your own APM packages? See the [Context Guide](primitives.md) for detailed instructions on building reusable context collections and agent workflows. \ No newline at end of file +Ready to create your own APM packages? See the [Context Guide](../../introduction/key-concepts/) for detailed instructions on building reusable context collections and agent workflows. \ No newline at end of file diff --git a/docs/plugins.md b/docs/src/content/docs/guides/plugins.md similarity index 96% rename from docs/plugins.md rename to docs/src/content/docs/guides/plugins.md index 2e332e49..5e730f02 100644 --- a/docs/plugins.md +++ b/docs/src/content/docs/guides/plugins.md @@ -1,4 +1,8 @@ -# Plugins +--- +title: "Plugins" +sidebar: + order: 4 +--- APM supports plugins through the `plugin.json` format. Plugins are automatically detected and integrated into your project as standard APM dependencies. @@ -188,7 +192,7 @@ When `mcpServers` is absent, APM auto-discovers `.mcp.json` at the plugin root ( Servers with `command` are configured as `stdio` transport; servers with `url` use `http` (or the `type` field if it specifies `sse` or `streamable-http`). All plugin-defined MCP servers are treated as self-defined (`registry: false`). -**Trust model**: Self-defined MCP servers from direct dependencies (depth=1) are auto-trusted. Transitive dependencies require `--trust-transitive-mcp`. See [dependencies.md](./dependencies.md#self-defined-servers) for details. +**Trust model**: Self-defined MCP servers from direct dependencies (depth=1) are auto-trusted. Transitive dependencies require `--trust-transitive-mcp`. See [dependencies.md](../dependencies/#self-defined-servers) for details. ## Examples @@ -311,8 +315,8 @@ If APM doesn't recognize your plugin: ### Version Resolution Issues -See the [concepts.md](./concepts.md) guide on dependency resolution. +See the [concepts.md](../../introduction/how-it-works/) guide on dependency resolution. ### Custom Hosts / Private Repositories -See [integration-testing.md](./integration-testing.md) for enterprise setup. +See [integration-testing.md](../../contributing/integration-testing/) for enterprise setup. diff --git a/docs/prompts.md b/docs/src/content/docs/guides/prompts.md similarity index 95% rename from docs/prompts.md rename to docs/src/content/docs/guides/prompts.md index d6963270..212b0ada 100644 --- a/docs/prompts.md +++ b/docs/src/content/docs/guides/prompts.md @@ -1,4 +1,8 @@ -# Prompts Guide +--- +title: "Prompts" +sidebar: + order: 3 +--- Prompts are the building blocks of APM - focused, reusable AI instructions that accomplish specific tasks. They are executed through scripts defined in your `apm.yml` configuration. @@ -129,7 +133,7 @@ Please analyze the Kubernetes cluster by: [Include relevant data in the prompt or as context] ``` -See [MCP Integration](integrations.md#mcp-model-context-protocol-integration) for MCP server configuration and usage. +See [MCP Integration](../../integrations/ide-tool-integration/#mcp-model-context-protocol-integration) for MCP server configuration and usage. ## Writing Effective Prompts @@ -389,6 +393,6 @@ Keep prompts in version control alongside scripts. Use semantic versioning for b ## Next Steps -- Learn about [Runtime Integration](runtime-integration.md) to setup and use different AI runtimes -- See [CLI Reference](cli-reference.md) for complete script execution commands -- Check [Development Guide](development.md) for local development setup +- Learn about [Runtime Integration](../../integrations/runtime-compatibility/) to setup and use different AI runtimes +- See [CLI Reference](../../reference/cli-commands/) for complete script execution commands +- Check [Development Guide](../../contributing/development-guide/) for local development setup diff --git a/docs/skills.md b/docs/src/content/docs/guides/skills.md similarity index 96% rename from docs/skills.md rename to docs/src/content/docs/guides/skills.md index 93813573..e45323a6 100644 --- a/docs/skills.md +++ b/docs/src/content/docs/guides/skills.md @@ -1,4 +1,8 @@ -# Skills Guide +--- +title: "Skills" +sidebar: + order: 2 +--- Skills (`SKILL.md`) are package meta-guides that help AI agents quickly understand what an APM package does and how to leverage its content. They provide a concise summary optimized for AI consumption. @@ -385,7 +389,7 @@ If skill lacks APM metadata: ## Related Documentation -- [Core Concepts](concepts.md) - Understanding APM architecture -- [Primitives Guide](primitives.md) - All primitive types -- [CLI Reference](cli-reference.md) - Full command documentation -- [Dependencies](dependencies.md) - Package management +- [Core Concepts](../../introduction/how-it-works/) - Understanding APM architecture +- [Primitives Guide](../../introduction/key-concepts/) - All primitive types +- [CLI Reference](../../reference/cli-commands/) - Full command documentation +- [Dependencies](../dependencies/) - Package management diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx new file mode 100644 index 00000000..d7ef6605 --- /dev/null +++ b/docs/src/content/docs/index.mdx @@ -0,0 +1,95 @@ +--- +title: APM – Agent Package Manager +description: An open-source dependency manager for AI agents. Declare the skills, prompts, instructions, and tools your project needs in one manifest. +template: splash +hero: + title: Agent Package Manager + tagline: Same AI coding superpowers. Every developer. By default. + actions: + - text: Get Started + link: /apm/getting-started/installation/ + icon: right-arrow + variant: primary + - text: View on GitHub + link: https://github.com/microsoft/apm + icon: external + variant: minimal +--- + +import { Card, CardGrid } from '@astrojs/starlight/components'; + +**An open-source dependency manager for AI agents.** Think `package.json`, `requirements.txt`, or `Cargo.toml` — but for AI agent configuration. + +AI coding agents need context and capabilities to be useful — instructions, skills, prompts, plugins, MCP servers. But today, every developer configures theirs differently. Copying files, writing instructions from scratch, sharing knowledge in Slack threads. None of it is portable. None of it is versioned. + +APM fixes this. You declare your project's agent configuration once in `apm.yml` — skills, prompts, instructions, agents, hooks, plugins, MCP servers — and every developer who clones your repo gets a fully configured agent setup in seconds. New developer joins the team? `git clone`, `cd`, `apm install`. Done. + + + + `apm.yml` declares skills, instructions, prompts, agents, hooks, plugins, and MCP servers. Like `package.json` for agent configuration. + + + Packages depend on packages. APM resolves the full tree — transitive dependencies just work, like npm or pip. + + + Install from GitHub, GitLab, Bitbucket, Azure DevOps, GitHub Enterprise, or any self-hosted git server. + + + Works with GitHub Copilot and Claude today. The same manifest, the same setup, across agents. + + + +## Quick Start + +```bash +# Install APM +curl -sSL https://raw.githubusercontent.com/microsoft/apm/main/install.sh | sh + +# Add packages to your project +apm install microsoft/apm-sample-package +apm install anthropics/skills/skills/frontend-design +``` + +## Example: apm.yml + +```yaml +# apm.yml — ships with your project, like package.json +name: your project +version: 1.0.0 +dependencies: + apm: + # Skills from any GitHub repository + - anthropics/skills/skills/frontend-design + - microsoft/GitHub-Copilot-for-Azure/plugin/skills/azure-compliance + # A full package with rules, skills, prompts, hooks... + - microsoft/apm-sample-package + # Plugins + - github/awesome-copilot/plugins/context-engineering#v2.1 + # Agents + - github/awesome-copilot/agents/api-architect.agent.md + # GitLab, Azure DevOps, any git host — with version pinning + - git: https://gitlab.com/acme/coding-standards.git + path: instructions/security + ref: v2.0 + - git: dev.azure.com/org/project/repo + path: prompts/review.prompt.md +``` + +New developer joins the team: + +```bash +git clone && cd && apm install +``` + +**That's it.** Copilot, Claude — every harness is configured with the right context and capabilities. The manifest defines the project's custom and portable Agentic SDLC setup installable in a single command. + +## Open Source & Community + +APM is an open-source, MIT-licensed community project under the [`microsoft`](https://github.com/microsoft) org. It's early days — the tool is evolving fast, shaped by developers building real agent workflows. We ship frequently, welcome contributions, and value feedback over perfection. + +Built on the standards the community has already adopted: +[AGENTS.md](https://agents.md) · [Agent Skills](https://agentskills.io) · [MCP](https://modelcontextprotocol.io) + +--- + +*We've enforced dependency management on code for decades. It was only a matter of time before AI agents needed it too.* diff --git a/docs/src/content/docs/integrations/ci-cd.md b/docs/src/content/docs/integrations/ci-cd.md new file mode 100644 index 00000000..2912d78f --- /dev/null +++ b/docs/src/content/docs/integrations/ci-cd.md @@ -0,0 +1,91 @@ +--- +title: "APM in CI/CD" +description: "Automate APM install and compile in GitHub Actions, Azure Pipelines, and other CI systems." +sidebar: + order: 1 +--- + +APM integrates into your CI/CD pipeline to ensure agent context is always up to date and compiled correctly. + +## GitHub Actions + +Use the official [apm-action](https://github.com/microsoft/apm-action) to install APM and run commands in your workflows: + +```yaml +# .github/workflows/apm.yml +name: APM +on: + push: + branches: [main] + pull_request: + +jobs: + compile: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install APM & compile + uses: microsoft/apm-action@v1 + with: + commands: | + apm install + apm compile --verbose +``` + +### Private Dependencies + +For private repositories, pass a GitHub token: + +```yaml + - name: Install APM & compile + uses: microsoft/apm-action@v1 + with: + commands: | + apm install + apm compile + env: + GITHUB_APM_PAT: ${{ secrets.APM_PAT }} +``` + +### Verify Compiled Output + +Add a check to ensure `AGENTS.md` stays in sync with `apm.yml`: + +```yaml + - name: Check for drift + run: | + apm compile + git diff --exit-code AGENTS.md CLAUDE.md || \ + (echo "Compiled output is out of date. Run 'apm compile' locally." && exit 1) +``` + +## Azure Pipelines + +```yaml +steps: + - script: | + curl -sSL https://raw.githubusercontent.com/microsoft/apm/main/install.sh | sh + apm install + apm compile + displayName: 'APM Install & Compile' + env: + ADO_APM_PAT: $(ADO_PAT) +``` + +## General CI + +For any CI system with Python available: + +```bash +pip install apm-cli +apm install +apm compile --verbose +``` + +## Best Practices + +- **Pin APM version** in CI to avoid unexpected changes: `pip install apm-cli==0.7.7` +- **Commit `apm.lock`** so CI resolves the same dependency versions as local development +- **Run `apm compile` in CI** and fail the build if the output differs from what's committed — this catches drift early +- **Use `GITHUB_APM_PAT`** for private dependencies; never use the default `GITHUB_TOKEN` for cross-repo access diff --git a/docs/src/content/docs/integrations/gh-aw.md b/docs/src/content/docs/integrations/gh-aw.md new file mode 100644 index 00000000..d8604e36 --- /dev/null +++ b/docs/src/content/docs/integrations/gh-aw.md @@ -0,0 +1,63 @@ +--- +title: "GitHub Agentic Workflows" +description: "Use APM packages with GitHub Agentic Workflows (gh-aw) for automated repository maintenance." +sidebar: + order: 1 +--- + +[GitHub Agentic Workflows](https://github.github.com/gh-aw/) (gh-aw) lets you write repository automation in markdown and run it as GitHub Actions using AI agents. APM and gh-aw complement each other naturally. + +## How They Work Together + +| Tool | Role | +|------|------| +| **APM** | Manages the *context* your AI agents use — skills, instructions, prompts | +| **gh-aw** | Manages the *automation* that triggers AI agents — event-driven workflows | + +APM defines **what** agents know. gh-aw defines **when** and **how** they act. + +## Example: Automated Code Review + +1. **APM** installs your team's review standards: + +```yaml +# apm.yml +dependencies: + apm: + - your-org/code-review-standards + - github/awesome-copilot/agents/api-architect.agent.md +``` + +2. **gh-aw** triggers a review workflow on every PR: + +```markdown + +# Code Review Workflow + +When a pull request is opened, review the changed files against +the project's coding standards in AGENTS.md. + +Post review comments on any violations found. +``` + +3. The AI agent uses the context APM compiled into `AGENTS.md` to perform a standards-aware review automatically. + +## Setup + +1. Install both tools: + +```bash +# APM +curl -sSL https://raw.githubusercontent.com/microsoft/apm/main/install.sh | sh + +# gh-aw (GitHub CLI extension) +gh extension install github/gh-aw +``` + +2. Configure your project with APM packages, then add gh-aw workflows that reference the compiled context. + +## Learn More + +- [gh-aw Documentation](https://github.github.com/gh-aw/) +- [APM Compilation Guide](/apm/guides/compilation/) +- [APM CLI Reference](/apm/reference/cli-commands/) diff --git a/docs/integrations.md b/docs/src/content/docs/integrations/ide-tool-integration.md similarity index 98% rename from docs/integrations.md rename to docs/src/content/docs/integrations/ide-tool-integration.md index f2cdb67a..ae25a055 100644 --- a/docs/integrations.md +++ b/docs/src/content/docs/integrations/ide-tool-integration.md @@ -1,4 +1,8 @@ -# Integrations Guide +--- +title: "IDE & Tool Integration" +sidebar: + order: 3 +--- APM is designed to work seamlessly with your existing development tools and workflows. This guide covers integration patterns, supported AI runtimes, and compatibility with popular development tools. @@ -787,10 +791,10 @@ Generate clear, measurable sprint goal aligned with epic objectives. Ready to integrate APM with your existing tools? -- **[Getting Started](getting-started.md)** - Set up APM in your environment -- **[Context Guide](primitives.md)** - Build custom integration workflows -- **[Examples & Use Cases](examples.md)** - See integration patterns in action -- **[CLI Reference](cli-reference.md)** - Complete command documentation +- **[Getting Started](../../getting-started/installation/)** - Set up APM in your environment +- **[Context Guide](../../introduction/key-concepts/)** - Build custom integration workflows +- **[Examples & Use Cases](../../reference/examples/)** - See integration patterns in action +- **[CLI Reference](../../reference/cli-commands/)** - Complete command documentation Or explore specific integration patterns: - Review the [VSCode Copilot Customization Guide](https://code.visualstudio.com/docs/copilot/copilot-customization) for VSCode-specific features diff --git a/docs/runtime-integration.md b/docs/src/content/docs/integrations/runtime-compatibility.md similarity index 97% rename from docs/runtime-integration.md rename to docs/src/content/docs/integrations/runtime-compatibility.md index 9e4e061b..a71c7284 100644 --- a/docs/runtime-integration.md +++ b/docs/src/content/docs/integrations/runtime-compatibility.md @@ -1,4 +1,8 @@ -# Runtime Integration Guide +--- +title: "Runtime Compatibility" +sidebar: + order: 2 +--- APM manages LLM runtime installation and configuration automatically. This guide covers the supported runtimes, how to use them, and how to extend APM with additional runtimes. @@ -50,7 +54,7 @@ This automatically: ### Usage -APM executes scripts defined in your `apm.yml`. When scripts reference `.prompt.md` files, APM compiles them with parameter substitution. See [Prompts Guide](prompts.md) for details. +APM executes scripts defined in your `apm.yml`. When scripts reference `.prompt.md` files, APM compiles them with parameter substitution. See [Prompts Guide](../../guides/prompts/) for details. ```bash # Run scripts (from apm.yml) with parameters @@ -132,7 +136,7 @@ llm keys set anthropic # Anthropic API key ### Usage -APM executes scripts defined in your `apm.yml`. See [Prompts Guide](prompts.md) for details on prompt compilation. +APM executes scripts defined in your `apm.yml`. See [Prompts Guide](../../guides/prompts/) for details on prompt compilation. ```bash # Run scripts that use LLM runtime diff --git a/docs/concepts.md b/docs/src/content/docs/introduction/how-it-works.md similarity index 99% rename from docs/concepts.md rename to docs/src/content/docs/introduction/how-it-works.md index 86f17e8a..611778ed 100644 --- a/docs/concepts.md +++ b/docs/src/content/docs/introduction/how-it-works.md @@ -1,4 +1,8 @@ -# Core Concepts +--- +title: "How It Works" +sidebar: + order: 2 +--- APM implements the complete [AI-Native Development framework](https://danielmeppiel.github.io/awesome-ai-native/docs/concepts/) - a systematic approach to making AI coding assistants reliable, scalable, and team-friendly. @@ -274,4 +278,4 @@ APM implements concepts from the broader [AI-Native Development Guide](https://d - **Team Scaling Methods** - Organizational AI adoption - **Tool Integration** - Connecting AI with development workflows -Ready to see these concepts in action? Check out [Examples & Use Cases](examples.md) next! \ No newline at end of file +Ready to see these concepts in action? Check out [Examples & Use Cases](../../reference/examples/) next! \ No newline at end of file diff --git a/docs/primitives.md b/docs/src/content/docs/introduction/key-concepts.md similarity index 95% rename from docs/primitives.md rename to docs/src/content/docs/introduction/key-concepts.md index e6c8b885..6cc8f680 100644 --- a/docs/primitives.md +++ b/docs/src/content/docs/introduction/key-concepts.md @@ -1,4 +1,8 @@ -# Context Guide +--- +title: "Key Concepts" +sidebar: + order: 3 +--- Context components are the configurable tools that deploy proven prompt engineering and context engineering techniques. APM implements these as the core building blocks for reliable, reusable AI development workflows. @@ -41,7 +45,7 @@ apm compile # Generate optimized AGENTS.md files apm compile --verbose # See optimization decisions ``` -**[Learn more about the Context Optimization Engine →](compilation.md)** +**[Learn more about the Context Optimization Engine →](../../guides/compilation/)** ## Packaging & Distribution @@ -154,7 +158,7 @@ input: [auth_method, session_duration] --- # Secure Authentication Implementation Use ${input:auth_method} with ${input:session_duration} sessions -Review [security standards](../context/security.context.md) before implementation +Review `security standards` before implementation ``` ### Agents (.agent.md, legacy: .chatmode.md) @@ -193,7 +197,7 @@ When asked about branding, apply these standards... - Provides AI agents with quick understanding of package purpose - Resources (scripts, references) stay in `apm_modules/` -→ [Complete Skills Guide](skills.md) +→ [Complete Skills Guide](../../guides/skills/) ### Context (.context.md) **Knowledge Management Layer** - Optimized project information for AI consumption @@ -405,8 +409,8 @@ applyTo: "backend/**/*.py" description: API development guidelines --- -Follow [our API standards](../context/api-standards.context.md) and ensure -[GDPR compliance](../context/gdpr-compliance.context.md) for all endpoints. +Follow `our API standards` and ensure +`GDPR compliance` for all endpoints. ``` ### Linking from Agents @@ -417,7 +421,7 @@ Follow [our API standards](../context/api-standards.context.md) and ensure description: Backend development expert --- -You are a backend expert. Always reference [our architecture patterns](../context/architecture.context.md) +You are a backend expert. Always reference `our architecture patterns` when designing systems. ``` @@ -438,14 +442,14 @@ Links are rewritten to point to actual source locations: **From installed prompts/agents** (`.github/` directory): ```markdown -[API Standards](../context/api.context.md) -→ [API Standards](../../apm_modules/company/standards/.apm/context/api.context.md) +`API Standards` +→ `API Standards` ``` **From compiled AGENTS.md**: ```markdown -[Architecture](../context/architecture.context.md) -→ [Architecture](.apm/context/architecture.context.md) +`Architecture` +→ `Architecture` ``` ## Best Practices diff --git a/docs/src/content/docs/introduction/why-apm.md b/docs/src/content/docs/introduction/why-apm.md new file mode 100644 index 00000000..ed87875d --- /dev/null +++ b/docs/src/content/docs/introduction/why-apm.md @@ -0,0 +1,62 @@ +--- +title: "Why APM?" +description: "The problem APM solves — why AI agents need a dependency manager." +sidebar: + order: 1 +--- + +AI coding agents are powerful — but only when they have the right context. Today, setting up that context is entirely manual. + +## The Problem + +Every AI-assisted project faces the same setup friction: + +1. **Manual configuration** — developers copy instruction files, write prompts from scratch, configure MCP servers by hand. +2. **No portability** — when a new developer clones the repo, none of the AI setup comes with it. +3. **No dependency management** — if your coding standards depend on another team's standards, there's no way to declare or resolve that relationship. +4. **Drift** — without a single source of truth, agent configurations diverge across developers and environments. + +This is exactly the problem that package managers solved for application code decades ago. `npm`, `pip`, `cargo` — they all provide a manifest, a resolver, and a reproducible install. AI agent configuration deserves the same. + +## How APM Solves It + +APM introduces `apm.yml` — a declarative manifest for everything your AI agents need: + +```yaml +name: my-project +version: 1.0.0 +dependencies: + apm: + - anthropics/skills/skills/frontend-design + - microsoft/apm-sample-package + - github/awesome-copilot/agents/api-architect.agent.md +``` + +Run `apm install` and APM: + +- **Resolves transitive dependencies** — if package A depends on package B, both are installed automatically. +- **Integrates primitives** — instructions go to `.github/instructions/`, prompts to `.github/prompts/`, skills to `.github/skills/`. +- **Compiles context** — `apm compile` produces optimized `AGENTS.md` and `CLAUDE.md` files for every major AI coding agent. + +## What APM Manages + +APM handles seven types of agent primitives: + +| Primitive | Purpose | +|-----------|---------| +| **Instructions** | Coding standards and guardrails | +| **Skills** | Reusable AI capabilities | +| **Prompts** | Slash commands and workflows | +| **Agents** | Specialized personas | +| **Hooks** | Lifecycle event handlers | +| **Plugins** | Pre-packaged agent bundles | +| **MCP Servers** | Tool integrations | + +All declared in one manifest. All installed with one command. + +## Design Principles + +- **Familiar** — APM works like the package managers you already know. +- **Fast** — install, compile, and run in seconds. +- **Open** — built on [AGENTS.md](https://agents.md), [Agent Skills](https://agentskills.io), and [MCP](https://modelcontextprotocol.io). +- **Portable** — install from GitHub, GitLab, Bitbucket, Azure DevOps, or any git host. diff --git a/docs/cli-reference.md b/docs/src/content/docs/reference/cli-commands.md similarity index 99% rename from docs/cli-reference.md rename to docs/src/content/docs/reference/cli-commands.md index 60a96e85..eaf2f66a 100644 --- a/docs/cli-reference.md +++ b/docs/src/content/docs/reference/cli-commands.md @@ -1,4 +1,8 @@ -# APM CLI Reference +--- +title: "CLI Commands" +sidebar: + order: 1 +--- Complete command-line interface reference for Agent Package Manager (APM). diff --git a/docs/examples.md b/docs/src/content/docs/reference/examples.md similarity index 94% rename from docs/examples.md rename to docs/src/content/docs/reference/examples.md index d9801d19..5542fc72 100644 --- a/docs/examples.md +++ b/docs/src/content/docs/reference/examples.md @@ -1,4 +1,8 @@ -# Examples & Use Cases +--- +title: "Examples" +sidebar: + order: 4 +--- This guide showcases real-world APM workflows, from simple automation to enterprise-scale AI development patterns. Learn through practical examples that demonstrate the power of structured AI workflows. @@ -33,12 +37,12 @@ input: [auth_method, session_duration] # Secure Authentication Implementation ## Context Loading -Review [security standards](../context/security-standards.md) and [existing auth patterns](../context/auth-patterns.md). +Review `security standards` and `existing auth patterns`. ## Implementation Requirements - Use ${input:auth_method} authentication - Session duration: ${input:session_duration} -- Follow [security checklist](../specs/auth-security.spec.md) +- Follow `security checklist` ## Validation Gates 🚨 **STOP**: Confirm security review before implementation @@ -105,9 +109,9 @@ Generate a comprehensive technical specification for: ${input:feature} 8. **Deployment Plan** - Rollout strategy and monitoring ## Context Sources -- Review [existing architecture](../context/architecture.context.md) -- Follow [API design standards](../context/api-standards.context.md) -- Apply [security guidelines](../context/security.context.md) +- Review `existing architecture` +- Follow `API design standards` +- Apply `security guidelines` ## Output Format Create `specs/${input:feature}.spec.md` following our specification template. @@ -335,9 +339,9 @@ Let me guide you through setting up your development environment: ## Step 2: Codebase Tour I'll walk you through our architecture: -- [Company Standards](../context/company-standards.context.md) -- [API Patterns](../context/api-patterns.context.md) -- [Testing Guidelines](../context/testing-standards.context.md) +- `Company Standards` +- `API Patterns` +- `Testing Guidelines` ## Step 3: First Tasks Based on your experience level, here are your starter tasks: @@ -500,8 +504,8 @@ apm run quality-gate --param threshold="A" --param coverage_min="85%" --param se Ready to build your own workflows? Check out: -- **[Context Guide](primitives.md)** - Learn to build custom workflows -- **[Integrations Guide](integrations.md)** - Connect with your existing tools -- **[Getting Started](getting-started.md)** - Set up your first project +- **[Context Guide](../../introduction/key-concepts/)** - Learn to build custom workflows +- **[Integrations Guide](../../integrations/ide-tool-integration/)** - Connect with your existing tools +- **[Getting Started](../../getting-started/installation/)** - Set up your first project Or explore the complete framework at [AI-Native Development Guide](https://danielmeppiel.github.io/awesome-ai-native/)! \ No newline at end of file diff --git a/docs/manifest-schema.md b/docs/src/content/docs/reference/manifest-schema.md similarity index 99% rename from docs/manifest-schema.md rename to docs/src/content/docs/reference/manifest-schema.md index 22a9e91d..b4fb4a10 100644 --- a/docs/manifest-schema.md +++ b/docs/src/content/docs/reference/manifest-schema.md @@ -1,4 +1,8 @@ -# APM Manifest Format Specification +--- +title: "Manifest Schema" +sidebar: + order: 2 +---
Version
0.1 (Working Draft)
diff --git a/docs/enhanced-primitive-discovery.md b/docs/src/content/docs/reference/primitive-types.md similarity index 99% rename from docs/enhanced-primitive-discovery.md rename to docs/src/content/docs/reference/primitive-types.md index 692318a7..dad6b1a5 100644 --- a/docs/enhanced-primitive-discovery.md +++ b/docs/src/content/docs/reference/primitive-types.md @@ -1,4 +1,8 @@ -# Enhanced Primitive Discovery System +--- +title: "Primitive Types" +sidebar: + order: 3 +--- This document describes the enhanced primitive discovery system implemented for APM CLI, providing dependency support with source tracking and conflict detection. diff --git a/docs/src/styles/custom.css b/docs/src/styles/custom.css new file mode 100644 index 00000000..993ceba3 --- /dev/null +++ b/docs/src/styles/custom.css @@ -0,0 +1,15 @@ +.hero h1 { + white-space: nowrap; +} + +[data-site-title] { + font-size: 0.7rem !important; + letter-spacing: 0.04em; + text-transform: uppercase; + font-weight: 500; + opacity: 0.85; +} + +.sl-container .card-grid { + margin-top: 2.5rem; +} diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 00000000..8bf91d3b --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} From abe7a8662774e075c4328bc06bf90dd7d1b760bb Mon Sep 17 00:00:00 2001 From: danielmeppiel Date: Wed, 11 Mar 2026 18:37:48 +0100 Subject: [PATCH 2/3] docs: enhance IDE & Tool Integration page with substantive content - Fix Codex CLI section: correct setup command to 'apm runtime setup codex', document .github/ primitive discovery and MCP config at ~/.codex/config.toml - Add GitHub Copilot CLI section with setup, MCP config, and features - Add Skills to VSCode native primitives list (.github/skills/) - Add Compiled Context with AGENTS.md subsection to VSCode integration - Enhance Cursor section with AGENTS.md discovery, cursor rules reference, distributed compilation, and compile flags (--dry-run, --verbose, --watch) - Add MCP Auto-Discovery from Packages section (apm.yml, plugin.json, transitive) - Add MCP Trust Model section with direct/transitive trust table and --trust-transitive-mcp flag documentation - Add MCP Client Configuration section with per-client config locations and runtime targeting options (--runtime, --exclude, --only mcp) - Update MCP Supported Package Types table to include Codex CLI column - Enhance MCP Server Management with full dependency format examples (simple, overlay, self-defined) and apm mcp subcommands - Enhance Claude Desktop Integration with .github/skills/ primary location and .claude/skills/ compatibility copy detail - Add sub-skill promotion detail to skills integration - Fix broken markdown table separator in Claude output files table Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../docs/integrations/ide-tool-integration.md | 207 ++++++++++++++---- 1 file changed, 168 insertions(+), 39 deletions(-) diff --git a/docs/src/content/docs/integrations/ide-tool-integration.md b/docs/src/content/docs/integrations/ide-tool-integration.md index ae25a055..4414ebc7 100644 --- a/docs/src/content/docs/integrations/ide-tool-integration.md +++ b/docs/src/content/docs/integrations/ide-tool-integration.md @@ -51,36 +51,53 @@ apm run implement-feature --param spec="user-auth" --param approach="sdd" APM manages AI runtime installation and provides seamless integration with multiple coding agents: -### ⚡ OpenAI Codex CLI +### OpenAI Codex CLI -Direct integration with OpenAI's development-focused models: +Terminal-native coding agent with GitHub Models support: ```bash -# Install and configure -apm runtime setup copilot +# Install and configure +apm runtime setup codex +``` -# Features +Codex reads primitives from `.github/` (instructions, agents, prompts, skills) the same way GitHub Copilot does. APM also configures MCP servers for Codex at `~/.codex/config.toml`. + +**Features**: - GitHub Models API backend - Terminal-native workflow -- Customizable model parameters -- Advanced prompt engineering support -- Multi-model switching -``` +- Real-time streaming output +- Native MCP server support +- Automatic `.github/` primitive discovery **Best for**: Teams preferring terminal workflows, custom model configurations +### GitHub Copilot CLI + +GitHub's Copilot agent for the terminal: + +```bash +# Install and configure +apm runtime setup copilot +``` + +**Features**: +- Native MCP server integration via `~/.copilot/mcp-config.json` +- Multi-model switching +- Advanced prompt engineering support +- `--allow-all-tools` and `--add-dir` options + +**Best for**: Teams using GitHub Copilot across IDE and terminal + **Configuration**: ```yaml runtime: - codex: + copilot: model: "github/gpt-4o-mini" provider: "github-models" api_base: "https://models.github.ai" - temperature: 0.2 - max_tokens: 8000 ``` -### 🔧 LLM Library +### LLM Library Flexible runtime supporting multiple model providers: @@ -135,11 +152,12 @@ APM works natively with VSCode's GitHub Copilot implementation. ### Native VSCode Primitives -VSCode already implements core primitives for GitHub Copilot: +VSCode implements core primitives for GitHub Copilot that APM integrates with: - **Agents**: AI personas and workflows with `.agent.md` files in `.github/agents/` (legacy: `.chatmode.md` in `.github/chatmodes/`) - **Instructions Files**: Modular instructions with `copilot-instructions.md` and `.instructions.md` files - **Prompt Files**: Reusable task templates with `.prompt.md` files in `.github/prompts/` +- **Skills**: Structured capabilities with `SKILL.md` in `.github/skills/` > **Note**: APM supports both the new `.agent.md` format and legacy `.chatmode.md` format. VSCode provides Quick Fix actions to migrate from `.chatmode.md` to `.agent.md`. @@ -221,6 +239,21 @@ apm install microsoft/apm-sample-package - File-pattern based instruction application - Agent support for different personas and workflows +### Compiled Context with AGENTS.md + +In addition to file-level integration, `apm compile` produces an `AGENTS.md` file that provides comprehensive project context. This is useful for older Copilot versions or IDEs that do not support granular `.github/` primitive discovery. + +```bash +# Compile all local and dependency instructions into AGENTS.md +apm compile --target copilot + +# Default distributed compilation creates focused AGENTS.md files per directory +# Use --single-agents for a single monolithic file (legacy mode) +apm compile --single-agents +``` + +AGENTS.md aggregates instructions, context, and optionally the Spec-kit constitution into a single document that GitHub Copilot reads as project-level guidance. + ## Claude Integration APM provides first-class support for Claude Code and Claude Desktop through native format generation. @@ -232,7 +265,7 @@ APM provides first-class support for Claude Code and Claude Desktop through nati When you run `apm compile`, APM generates Claude-native files: | File | Purpose | -|------|---------|| +|------|---------| | `CLAUDE.md` | Project instructions for Claude (instructions only, using `@import` syntax) | When you run `apm install`, APM integrates package primitives into Claude's native structure: @@ -296,8 +329,10 @@ apm install ComposioHQ/awesome-claude-skills/mcp-builder **How skill integration works:** 1. `apm install` checks if the package contains a `SKILL.md` file -2. If `SKILL.md` exists: copies the entire skill folder to `.github/skills/{folder-name}/` -3. `apm uninstall` removes the skill folder +2. If `SKILL.md` exists: copies the entire skill folder to `.github/skills/{folder-name}/` (primary location) +3. If a `.claude/` directory exists: also copies to `.claude/skills/{folder-name}/` for Claude compatibility +4. Sub-skills inside `.apm/skills/` are promoted to top-level `.github/skills/` entries +5. `apm uninstall` removes the skill folder from both locations ### Automatic Hook Integration @@ -380,7 +415,9 @@ apm compile --target claude ### Claude Desktop Integration -Skills installed to `.claude/skills/` are automatically available for Claude Code. Each skill folder contains a `SKILL.md` that defines the skill's capabilities and any supporting files. +Skills installed to `.github/skills/` are the primary location; when a `.claude/` directory exists, APM also copies skills to `.claude/skills/` for compatibility. Each skill folder contains a `SKILL.md` that defines the skill's capabilities and any supporting files. + +Claude Desktop can use `CLAUDE.md` as its project instructions file. Run `apm compile --target claude` to generate `CLAUDE.md` with `@import` syntax for organized instruction loading. ### Cleanup and Sync @@ -502,22 +539,97 @@ apm install microsoft/apm-sample-package #### Cursor -Cursor does not follow the VSCode/GitHub Copilot `.github/` structure. Use APM's context compilation instead: +Cursor does not follow the VSCode/GitHub Copilot `.github/` primitive structure. APM supports Cursor through compiled context output: ```bash -# Compile APM context into AGENTS.md -apm compile +# Compile APM context into AGENTS.md (Cursor reads this format) +apm compile --target copilot +``` + +Cursor reads `AGENTS.md` as project-level context. The `copilot` compilation target (also aliased as `agents`) produces the format Cursor expects. + +**Setup options**: + +1. **AGENTS.md (recommended)**: Run `apm compile` to generate `AGENTS.md` at the project root. Cursor discovers it automatically as project instructions. -# Then use AGENTS.md with Cursor: -# 1. Open Cursor settings -# 2. Reference or copy AGENTS.md content into your cursor rules -# 3. AGENTS.md works with any agent supporting the AGENTS.md format +2. **Cursor Rules**: Reference APM-managed instructions from `.cursor-rules` if your project uses Cursor's native rules format. Point your rules at specific instruction files in `.apm/instructions/` or at the compiled `AGENTS.md`. + +3. **Distributed compilation**: APM's default distributed strategy places focused `AGENTS.md` files in subdirectories, giving Cursor scoped context per area of the codebase. + +```bash +# Preview what will be compiled +apm compile --dry-run + +# Compile with source attribution for traceability +apm compile --verbose + +# Watch mode: auto-recompile when primitives change +apm compile --watch ``` ## MCP (Model Context Protocol) Integration APM provides first-class support for MCP servers, including registry-based servers that publish stdio packages (npm, pypi, docker) or HTTP/SSE remote endpoints. +### Auto-Discovery from Packages + +APM auto-discovers MCP server declarations from packages during `apm install`: + +- **apm.yml dependencies**: MCP servers listed under `dependencies.mcp` in a package's `apm.yml` are collected automatically. +- **plugin.json**: Packages with a `plugin.json` (at the root, `.github/plugin/`, or `.claude-plugin/`) are recognized as marketplace plugins. APM synthesizes an `apm.yml` from `plugin.json` metadata when no `apm.yml` exists. +- **Transitive collection**: APM walks the dependency tree and collects MCP servers from all transitive packages. + +### Trust Model + +APM enforces a trust boundary for MCP servers to prevent packages from silently injecting arbitrary server processes: + +| Dependency Type | Registry Servers | Self-Defined Servers | +|----------------|-----------------|---------------------| +| Direct (depth 1) | Auto-trusted | Auto-trusted | +| Transitive (depth > 1) | Auto-trusted | Skipped with warning | + +**Self-defined servers** are those declared with `registry: false` in `apm.yml` -- they run arbitrary commands rather than resolving through the official MCP registry. + +To trust self-defined servers from transitive dependencies, either: +1. Re-declare the server in your root `apm.yml` (recommended), or +2. Use the `--trust-transitive-mcp` flag: + +```bash +# Trust self-defined MCP servers from transitive packages +apm install --trust-transitive-mcp +``` + +### Client Configuration + +APM configures MCP servers in the native config format for each supported client: + +| Client | Config Location | Format | +|--------|----------------|--------| +| VS Code | `.vscode/mcp.json` | JSON `servers` object | +| GitHub Copilot CLI | `~/.copilot/mcp-config.json` | JSON `mcpServers` object | +| Codex CLI | `~/.codex/config.toml` | TOML `mcp_servers` section | + +**Runtime targeting**: APM detects which runtimes are installed and configures MCP servers for all of them. Use `--runtime ` or `--exclude ` to control which clients receive configuration. + +```bash +# Install MCP dependencies for all detected runtimes +apm install + +# Target only VS Code +apm install --runtime vscode + +# Skip Codex configuration +apm install --exclude codex + +# Install only MCP dependencies (skip APM packages) +apm install --only mcp + +# Preview MCP configuration without writing +apm install --dry-run +``` + +APM also handles stale server cleanup: when a package is uninstalled or an MCP dependency is removed, APM removes the corresponding entries from all client configs. + ### Package Type Inference The MCP registry API may return empty `registry_name` fields for packages. APM infers the package type from: @@ -530,14 +642,14 @@ The MCP registry API may return empty `registry_name` fields for packages. APM i When installing registry MCP servers, APM selects the best available package for each runtime: -| Package Registry | VS Code | Copilot CLI | -|-----------------|---------|-------------| -| npm | Yes (npx) | Yes (npx) | -| pypi | Yes (uvx/python3) | Yes (uvx) | -| docker | Yes | Yes | -| homebrew | — | Yes | -| Other (with runtime_hint) | Yes (generic) | Yes (generic) | -| HTTP/SSE remotes | Yes | Yes | +| Package Registry | VS Code | Copilot CLI | Codex CLI | +|-----------------|---------|-------------|-----------| +| npm | Yes (npx) | Yes (npx) | Yes (npx) | +| pypi | Yes (uvx/python3) | Yes (uvx) | Yes (uvx) | +| docker | Yes | Yes | Yes | +| homebrew | -- | Yes | Yes | +| Other (with runtime_hint) | Yes (generic) | Yes (generic) | Yes (generic) | +| HTTP/SSE remotes | Yes | Yes | Yes | ### MCP Server Management @@ -545,21 +657,38 @@ When installing registry MCP servers, APM selects the best available package for # apm.yml - MCP dependencies dependencies: mcp: - # Registry references + # Simple registry references (resolved via MCP registry) - ghcr.io/github/github-mcp-server - ghcr.io/modelcontextprotocol/filesystem-server - - ghcr.io/modelcontextprotocol/postgres-server + + # Registry server with overlays + - name: ghcr.io/modelcontextprotocol/postgres-server + transport: stdio + package: npm + args: ["--connection-string", "postgresql://localhost/mydb"] + + # Self-defined server (not in registry) + - name: my-internal-server + registry: false + transport: stdio + command: python + args: ["-m", "my_server"] + env: + PORT: "3000" ``` ```bash # Install MCP dependencies apm install -# List available MCP tools -apm tools list +# Search the MCP registry +apm mcp search github + +# Show server details +apm mcp info ghcr.io/github/github-mcp-server -# Test MCP server connectivity -apm tools test github-mcp-server +# List available MCP servers +apm mcp list ``` ### MCP Tool Usage in Workflows From 45cdfd17dced0bd59a1d42dfabff3d02e00d9e4c Mon Sep 17 00:00:00 2001 From: danielmeppiel Date: Wed, 11 Mar 2026 18:47:29 +0100 Subject: [PATCH 3/3] docs: comprehensive documentation site overhaul - Add 12 new pages: what-is-apm, quick-start, migration, pack-distribute, org-packages, lockfile-spec, github-rulesets, and 5 enterprise pages (teams, governance, security, adoption-playbook, making-the-case) - Enhance 5 existing pages: why-apm, installation, ci-cd, gh-aw, ide-tool-integration - Restructure sidebar into 8 sections with progressive disclosure - Clean up ide-tool-integration (928->616 lines, remove template content) - Remove emojis from all doc headings per project policy - All 36 pages build clean, all internal links validated Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/astro.config.mjs | 22 +- .../docs/enterprise/adoption-playbook.md | 266 +++++++++++ .../src/content/docs/enterprise/governance.md | 348 ++++++++++++++ .../docs/enterprise/making-the-case.md | 200 ++++++++ docs/src/content/docs/enterprise/security.md | 212 +++++++++ docs/src/content/docs/enterprise/teams.md | 156 +++++++ .../docs/getting-started/authentication.md | 2 +- .../docs/getting-started/first-package.md | 2 +- .../docs/getting-started/installation.md | 22 + .../content/docs/getting-started/migration.md | 189 ++++++++ .../docs/getting-started/quick-start.md | 194 ++++++++ docs/src/content/docs/guides/org-packages.md | 283 ++++++++++++ .../content/docs/guides/pack-distribute.md | 319 +++++++++++++ docs/src/content/docs/integrations/ci-cd.md | 61 +++ docs/src/content/docs/integrations/gh-aw.md | 87 ++++ .../docs/integrations/github-rulesets.md | 165 +++++++ .../docs/integrations/ide-tool-integration.md | 436 +++--------------- .../content/docs/introduction/how-it-works.md | 2 +- .../content/docs/introduction/key-concepts.md | 2 +- .../content/docs/introduction/what-is-apm.md | 244 ++++++++++ docs/src/content/docs/introduction/why-apm.md | 69 ++- .../content/docs/reference/lockfile-spec.md | 275 +++++++++++ 22 files changed, 3173 insertions(+), 383 deletions(-) create mode 100644 docs/src/content/docs/enterprise/adoption-playbook.md create mode 100644 docs/src/content/docs/enterprise/governance.md create mode 100644 docs/src/content/docs/enterprise/making-the-case.md create mode 100644 docs/src/content/docs/enterprise/security.md create mode 100644 docs/src/content/docs/enterprise/teams.md create mode 100644 docs/src/content/docs/getting-started/migration.md create mode 100644 docs/src/content/docs/getting-started/quick-start.md create mode 100644 docs/src/content/docs/guides/org-packages.md create mode 100644 docs/src/content/docs/guides/pack-distribute.md create mode 100644 docs/src/content/docs/integrations/github-rulesets.md create mode 100644 docs/src/content/docs/introduction/what-is-apm.md create mode 100644 docs/src/content/docs/reference/lockfile-spec.md diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index f480456b..36ee8e10 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -40,8 +40,9 @@ export default defineConfig({ ], sidebar: [ { - label: 'Introduction', + label: 'Understanding APM', items: [ + { label: 'What is APM?', slug: 'introduction/what-is-apm' }, { label: 'Why APM?', slug: 'introduction/why-apm' }, { label: 'How It Works', slug: 'introduction/how-it-works' }, { label: 'Key Concepts', slug: 'introduction/key-concepts' }, @@ -51,8 +52,10 @@ export default defineConfig({ label: 'Getting Started', items: [ { label: 'Installation', slug: 'getting-started/installation' }, + { label: 'Quick Start', slug: 'getting-started/quick-start' }, { label: 'Your First Package', slug: 'getting-started/first-package' }, { label: 'Authentication', slug: 'getting-started/authentication' }, + { label: 'Migrating Projects', slug: 'getting-started/migration' }, ], }, { @@ -63,15 +66,28 @@ export default defineConfig({ { label: 'Prompts', slug: 'guides/prompts' }, { label: 'Plugins', slug: 'guides/plugins' }, { label: 'Dependencies & Lockfile', slug: 'guides/dependencies' }, + { label: 'Pack & Distribute', slug: 'guides/pack-distribute' }, + { label: 'Org-Wide Packages', slug: 'guides/org-packages' }, + ], + }, + { + label: 'Enterprise', + items: [ + { label: 'APM for Teams', slug: 'enterprise/teams' }, + { label: 'Governance & Compliance', slug: 'enterprise/governance' }, + { label: 'Security Model', slug: 'enterprise/security' }, + { label: 'Adoption Playbook', slug: 'enterprise/adoption-playbook' }, + { label: 'Making the Case', slug: 'enterprise/making-the-case' }, ], }, { label: 'Integrations', items: [ + { label: 'CI/CD Pipelines', slug: 'integrations/ci-cd' }, { label: 'GitHub Agentic Workflows', slug: 'integrations/gh-aw' }, - { label: 'APM in CI/CD', slug: 'integrations/ci-cd' }, - { label: 'AI Runtime Compatibility', slug: 'integrations/runtime-compatibility' }, { label: 'IDE & Tool Integration', slug: 'integrations/ide-tool-integration' }, + { label: 'AI Runtime Compatibility', slug: 'integrations/runtime-compatibility' }, + { label: 'GitHub Rulesets', slug: 'integrations/github-rulesets' }, ], }, { diff --git a/docs/src/content/docs/enterprise/adoption-playbook.md b/docs/src/content/docs/enterprise/adoption-playbook.md new file mode 100644 index 00000000..1cf91fcf --- /dev/null +++ b/docs/src/content/docs/enterprise/adoption-playbook.md @@ -0,0 +1,266 @@ +--- +title: "Adoption Playbook" +description: "A phased guide to rolling out APM from a pilot team to organization-wide adoption." +sidebar: + order: 4 +--- + +APM adoption follows a proven pattern: start small, prove value, expand. +This playbook walks platform teams through each phase with concrete +milestones, success metrics, and rollback options so you can move quickly +without betting the farm. + +## Before You Begin + +Confirm these prerequisites before kicking off Phase 1: + +- APM is [installed](../../getting-started/installation/) and available in + your terminal. +- You have identified a pilot team willing to try a new workflow for two + weeks. +- You have a Git-hosted repository where the pilot team can work. +- You have read access to at least one APM package registry (public or + private). + +## Phase 1 -- Pilot (Week 1-2) + +**Goal:** One team, one project, one command to a working environment. + +### Steps + +1. Choose a single project and a pilot team of 3-5 engineers. +2. Pick 2-3 APM packages that cover the team's most common configuration + (for example, a linter ruleset, a set of agent instructions, and a + shared prompt library). +3. Run `apm init` in the project root to scaffold `apm.yml`. +4. Add the selected packages as dependencies: + + ```bash + apm add org/lint-standards org/agent-instructions org/prompt-library + ``` + +5. Run `apm install` to deploy files. +6. Commit `apm.yml` and `apm.lock` to the repository. + +### Verification + +Every team member should be able to run: + +```bash +git clone && cd && apm install +``` + +and arrive at an identical, ready-to-work environment with no additional +manual steps. + +### Success Metric + +Onboarding time drops from "read the README and manually copy files" to a +single command. + +### What to Watch + +- Installation friction (missing runtimes, network issues). +- Unexpected file placement -- review `apm.lock` to confirm paths. +- Authentication errors when pulling private packages. + +--- + +## Phase 2 -- Shared Package (Week 3-4) + +**Goal:** Centralize standards in a reusable package that the pilot team +consumes. + +### Steps + +1. Create your first organization package (for example, + `myorg/apm-standards`). +2. Include baseline content: + - Coding standards instructions for agents. + - Security baseline configurations. + - Common prompts the team uses daily. +3. Publish the package to your registry. +4. Add it to the pilot project: + + ```bash + apm add myorg/apm-standards + apm install + ``` + +5. Verify that the pilot team receives the new files on their next + `apm install`. + +### Success Metric + +When you update the shared package and the pilot team runs +`apm deps update`, the latest standards land in their project +automatically. + +### What to Watch + +- Version pinning: confirm that `apm.lock` captures the exact version + installed. +- File collisions: if the shared package deploys a file that already exists, + decide whether to force-overwrite or skip. + +--- + +## Phase 3 -- CI Integration (Month 2) + +**Goal:** Enforce declared configuration in the pipeline so drift cannot +reach production. + +### Steps + +1. Add APM commands to your CI pipeline: + + ```yaml + # Example CI step + - name: Install APM packages + run: apm install + + - name: Compile configuration + run: apm compile + + - name: Audit for drift + run: apm audit --ci + ``` + +2. Make the audit step a **required status check** on pull requests. +3. Ensure `apm.lock` is committed. Any version drift will cause the audit + to fail, surfacing the problem before merge. + +### Success Metric + +Pull requests are blocked when agent configuration drifts from the +declared manifest. No undeclared changes slip through. + +### What to Watch + +- Build time impact. APM operations are fast, but confirm they add + acceptable overhead. +- Lock file conflicts when multiple PRs update dependencies concurrently. + Resolve the same way you handle lock file conflicts in npm or pip. + +--- + +## Phase 4 -- Second Team (Month 2-3) + +**Goal:** Validate that the pattern transfers to a different team and +project. + +### Steps + +1. Onboard a second team using the same shared package from Phase 2. +2. The second team runs `apm init`, adds the shared package, and runs + `apm install` -- the same workflow the pilot team followed. +3. Gather structured feedback: + - Did the shared package cover their needs, or are additions required? + - Were there file conflicts specific to their project layout? + - How long did onboarding take compared to their previous process? +4. Iterate on the shared package based on feedback. + +### Success Metric + +A different project, with a different codebase, arrives at the same +standards and the same workflow through the same shared package. + +### What to Watch + +- Edge cases in project structure that the shared package did not + anticipate. +- Requests for team-specific overrides. APM supports layered + configuration, so teams can extend the shared package without forking it. + +--- + +## Phase 5 -- Org-Wide Rollout (Month 3+) + +**Goal:** Establish APM as the standard mechanism for managing agent and +tool configuration across the organization. + +### Steps + +1. Document the pattern in an internal guide. Include: + - How to add APM to an existing project. + - How to create and publish shared packages. + - How to handle common issues (file conflicts, version pinning, + registry authentication). +2. Mandate `apm.yml` for new projects. For existing projects, adoption can + be voluntary initially. +3. Enable drift detection across repositories using CI audit steps. +4. Assign package ownership. Each shared package should have a + maintainer or a maintaining team. + +### Success Metric + +80% or more of active repositories contain an `apm.yml` and pass +`apm audit` in CI. + +### What to Watch + +- Stale packages. Set a review cadence for shared packages. +- Permission sprawl. Limit who can publish packages to the organization + registry. +- Adoption gaps. Track which teams have not yet onboarded and offer + hands-on support. + +--- + +## Common Objections + +Adoption conversations surface the same questions repeatedly. Here are +direct answers. + +### "We already have tool plugins configured." + +APM does not replace your existing configuration. It wraps and manages the +files your tools already read. You gain a lock file, version pinning, and +cross-project consistency on top of what you already have. + +### "This is another tool to maintain." + +APM has zero runtime footprint. It generates files and exits. There is no +daemon, no background process, and no runtime dependency in your +application. Maintenance cost is limited to updating package versions in +`apm.yml`. + +### "What if we stop using it?" + +Delete `apm.yml` and `apm.lock`. The native configuration files APM +deployed remain in place and continue to work exactly as they did before. +There is no lock-in. + +### "Our developers will not adopt this." + +One command replaces multiple manual setup steps. Teams that adopt APM +report that the workflow is self-reinforcing: once a developer sees +`apm install` reproduce a working environment in seconds, they do not +go back to manual configuration. + +--- + +## Rollback Plan + +At any phase, you can reverse course: + +1. Remove `apm.yml` and `apm.lock` from the repository. +2. The configuration files APM deployed remain on disk and continue to + function. Your tools read native files, not APM-specific formats. +3. Optionally, remove APM from CI steps. + +APM is designed for zero lock-in. Removing it leaves your project in a +working state with standard configuration files. + +--- + +## Related Resources + +- [Getting Started](../../getting-started/installation/) -- Install APM + and create your first project. +- [Org-Wide Packages](../../guides/org-packages/) -- Create and manage + shared packages for your organization. +- [CI/CD Pipelines](../../integrations/ci-cd/) -- Add APM + to your continuous integration pipeline. +- [Governance](../governance/) -- Enforce standards and + audit compliance across repositories. diff --git a/docs/src/content/docs/enterprise/governance.md b/docs/src/content/docs/enterprise/governance.md new file mode 100644 index 00000000..d503e249 --- /dev/null +++ b/docs/src/content/docs/enterprise/governance.md @@ -0,0 +1,348 @@ +--- +title: "Governance & Compliance" +description: "Enforce AI agent configuration policies with lock files, audit trails, and CI gates." +sidebar: + order: 2 +--- + +## The governance challenge + +As AI agents become integral to software development, organizations face questions that traditional tooling was never designed to answer: + +- **Incident response.** What agent instructions were active during a production incident? +- **Change management.** Who approved this agent configuration change, and when? +- **Policy enforcement.** Are all teams using approved plugins and instruction sources? +- **Audit readiness.** Can we produce evidence of agent configuration state at any point in time? + +APM addresses these by treating agent configuration as auditable infrastructure, managed through the same version control and CI/CD practices that govern application code. + +--- + +## APM's governance pipeline + +Agent governance in APM follows a four-stage pipeline: + +``` +apm.yml (declare) -> apm.lock (pin) -> apm audit (verify) -> CI gate (enforce) +``` + +| Stage | Purpose | Artifact | +|-------|---------|----------| +| **Declare** | Define dependencies and their sources | `apm.yml` | +| **Pin** | Resolve every dependency to an exact commit | `apm.lock` | +| **Verify** | Confirm on-disk state matches the lock file | `apm audit` output | +| **Enforce** | Block merges when verification fails | Required status check | + +Each stage builds on the previous one. The lock file provides the audit trail, the audit command detects drift, and the CI gate prevents unapproved changes from reaching protected branches. + +--- + +## Lock file as audit trail + +The `apm.lock` file is the single source of truth for what agent configuration is deployed. Every dependency is pinned to an exact commit SHA, making the lock file a complete, point-in-time record of agent state. + +### What the lock file captures + +```yaml +lockfile_version: '1' +generated_at: '2025-03-11T18:13:45.123456+00:00' +apm_version: 0.25.0 +dependencies: + - repo_url: https://github.com/contoso/agent-standards.git + resolved_commit: a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 + resolved_ref: main + version: 2.1.0 + depth: 1 + deployed_files: + - .github/agents/code-review.md + - .github/agents/security-scan.md + - repo_url: https://github.com/contoso/shared-skills.git + virtual_path: shared-skills/api-design + resolved_commit: f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e9 + resolved_ref: v1.4.0 + is_virtual: true + depth: 2 + resolved_by: contoso/agent-standards.git + deployed_files: + - .github/skills/api-design/ +``` + +Key fields for governance: + +- **`resolved_commit`**: Exact commit SHA. No ambiguity about what code was deployed. +- **`depth`**: `1` for direct dependencies, `2+` for transitive. Identifies supply chain depth. +- **`resolved_by`**: For transitive dependencies, traces which direct dependency introduced them. +- **`deployed_files`**: Explicit list of files placed in the repository. +- **`generated_at`** and **`apm_version`**: Metadata for forensic reconstruction. + +### Using git history for auditing + +Because `apm.lock` is a committed file, standard git operations answer governance questions directly: + +```bash +# Full history of every agent configuration change +git log --oneline apm.lock + +# Who changed agent config, and when +git log --format="%h %ai %an: %s" apm.lock + +# What was the exact agent configuration at release v4.2.1 +git show v4.2.1:apm.lock + +# Diff agent config between two releases +git diff v4.1.0..v4.2.1 -- apm.lock + +# Find the commit that introduced a specific dependency +git log -p --all -S 'contoso/agent-standards' -- apm.lock +``` + +No additional tooling is required. The lock file turns git into an agent configuration audit log. + +--- + +## CI enforcement with `apm audit --ci` + +The `apm audit --ci` command is designed to run as a required status check in your CI pipeline. It verifies that the lock file is in sync with the declared manifest and that deployed files match expectations. + +### What it catches + +- **Lock file out of sync.** A dependency was added to `apm.yml` but `apm install` was not re-run. +- **Unapproved manual changes.** Someone hand-edited an agent instruction file that APM manages. +- **Missing dependencies.** A declared package failed to resolve or deploy. + +### GitHub Actions workflow + +```yaml +name: APM Audit +on: + pull_request: + paths: + - 'apm.yml' + - 'apm.lock' + - '.github/agents/**' + - '.github/skills/**' + - '.copilot/agents/**' + +jobs: + audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install and audit APM + uses: microsoft/apm-action@v1 + with: + commands: | + apm audit --ci +``` + +### Configuring as a required check + +Once the workflow runs on PRs, configure it as a required status check: + +1. Navigate to your repository settings. +2. Under **Rules** (or **Branches** for legacy branch protection), select the target branch. +3. Add the `APM Audit` workflow job as a required status check. +4. PRs that fail the audit cannot be merged until the configuration is corrected. + +This ensures every merge to a protected branch has a verified, consistent agent configuration. + +--- + +## Drift detection with `apm audit --drift` + +Drift occurs when the on-disk state of agent configuration diverges from what the lock file declares. The `apm audit --drift` command detects this divergence. + +### What drift detection catches + +- **Manual plugin additions.** Files added to agent directories that are not tracked by APM. +- **Hand-edited instruction files.** Modifications to APM-managed files outside the `apm install` workflow. +- **Removed dependencies.** Files deleted from disk that the lock file expects to be present. +- **Stale files.** Files from previously uninstalled packages that were not cleaned up. + +### Usage + +```bash +# Check for drift (human-readable output) +apm audit --drift + +# Check for drift in CI (non-zero exit code on detection) +apm audit --drift --ci + +# Use as a pre-commit check +# .pre-commit-config.yaml +repos: + - repo: local + hooks: + - id: apm-drift + name: APM drift check + entry: apm audit --drift + language: system + pass_filenames: false +``` + +Drift detection complements lock file verification. The audit checks that the lock file matches the manifest; drift detection checks that the file system matches the lock file. + +--- + +## Policy enforcement patterns + +Beyond CI gates, APM provides mechanisms to enforce organizational policies on agent configuration. + +### Approved sources only + +Restrict dependencies to packages from specific organizations or repositories. Review PRs that modify `apm.yml` to ensure all `source` entries reference approved origins: + +```yaml +# apm.yml — all sources from approved org +packages: + - name: code-review-standards + source: https://github.com/contoso/agent-standards.git + ref: v2.1.0 + - name: security-policies + source: https://github.com/contoso/security-agents.git + ref: v1.3.0 +``` + +Combine with GitHub's CODEOWNERS to require security team approval for changes to `apm.yml`: + +``` +# CODEOWNERS +apm.yml @contoso/platform-engineering +apm.lock @contoso/platform-engineering +``` + +### Version pinning policy + +Require exact version references rather than floating branch refs. Pinned versions ensure reproducibility and prevent unreviewed upstream changes from propagating: + +```yaml +# Preferred: pinned to exact tag +ref: v2.1.0 + +# Acceptable: pinned to exact commit +ref: a1b2c3d4e5f6 + +# Discouraged: floating branch ref +ref: main +``` + +Enforce this policy through PR review or by scripting a check against `apm.yml` in CI. + +### Transitive MCP server trust + +When a dependency declares MCP server configurations, APM requires explicit opt-in before installing them transitively. The `--trust-transitive-mcp` flag on `apm install` controls this behavior: + +```bash +# Default: transitive MCP servers are NOT installed +apm install + +# Explicit opt-in: trust transitive MCP servers +apm install --trust-transitive-mcp +``` + +Without this flag, transitive MCP server declarations are skipped. This prevents a dependency from silently introducing tool access that the consuming repository did not explicitly approve. + +### Constitution injection + +A constitution is an organization-wide rules block applied to all compiled agent instructions. Define it in `memory/constitution.md` and APM injects it into every compilation output with hash verification: + +```markdown + +## Organization Standards + +- All code suggestions must include error handling. +- Never suggest credentials or secrets in code. +- Follow the organization's API design guidelines. +- Escalate security-sensitive operations to a human reviewer. +``` + +The constitution block is rendered into compiled output with a SHA-256 hash, enabling drift detection if the block is tampered with after compilation: + +```markdown + +hash: e3b0c44298fc1c14 path: memory/constitution.md +[Constitution content] + +``` + +This ensures that organizational rules are consistently applied across all teams and cannot be silently bypassed. + +--- + +## Integration with GitHub Rulesets + +GitHub Rulesets provide a scalable way to enforce APM governance across multiple repositories. + +### Level 1: Required status check (available now) + +Configure `apm audit --ci` as a required status check through Rulesets: + +1. Create a new Ruleset at the organization or repository level. +2. Target the branches you want to protect (e.g., `main`, `release/*`). +3. Add a **Require status checks to pass** rule. +4. Select the `APM Audit` workflow job as a required check. + +This blocks any PR that introduces agent configuration drift from merging into protected branches. + +For detailed setup instructions, see the [CI/CD integration guide](../../integrations/ci-cd/). + +--- + +## Compliance scenarios + +### SOC 2 evidence + +SOC 2 audits require evidence that configuration changes are authorized and traceable. APM's lock file provides this: + +- **Change authorization.** Every `apm.lock` change goes through a PR, requiring review and approval. +- **Change history.** `git log apm.lock` produces a complete, tamper-evident history of every agent configuration change with author, timestamp, and diff. +- **Point-in-time state.** `git show :apm.lock` reconstructs the exact agent configuration active at any release. + +Link auditors directly to the lock file history in your repository. No separate audit system is needed. + +### Security audit + +When a security review requires understanding what instructions agents were following: + +```bash +# What agent configuration was active at the time of the incident +git show :apm.lock + +# What files were deployed by a specific package +grep -A 10 'contoso/agent-standards' apm.lock + +# Full diff of agent config changes in the last 90 days +git log --since="90 days ago" -p -- apm.lock +``` + +The lock file answers "what was running" without requiring access to the original package repositories. The `resolved_commit` field points to the exact source code that was deployed. + +### Change management + +APM enforces change management by design: + +1. **Declaration.** Changes start in `apm.yml`, which is a committed, reviewable file. +2. **Resolution.** `apm install` resolves declarations to exact commits in `apm.lock`. +3. **Review.** Both files are included in the PR diff for peer review. +4. **Verification.** `apm audit --ci` confirms consistency before merge. +5. **Traceability.** Git history provides a permanent record of who changed what and when. + +No agent configuration change can reach a protected branch without passing through this pipeline. + +--- + +## Summary + +| Capability | Mechanism | Status | +|---|---|---| +| Dependency pinning | `apm.lock` with exact commit SHAs | Available | +| Audit trail | Git history of `apm.lock` | Available | +| Constitution injection | `memory/constitution.md` with hash verification | Available | +| Transitive MCP trust control | `--trust-transitive-mcp` flag | Available | +| CI enforcement | `apm audit --ci` as required status check | Planned | +| Drift detection | `apm audit --drift` | Planned | +| Approved source policies | CODEOWNERS + PR review | Available (manual) | +| GitHub Rulesets integration | Required status checks | Available | + +For CI/CD setup details, see the [CI/CD integration guide](../../integrations/ci-cd/). For lock file internals, see [Key Concepts](../../introduction/key-concepts/). diff --git a/docs/src/content/docs/enterprise/making-the-case.md b/docs/src/content/docs/enterprise/making-the-case.md new file mode 100644 index 00000000..70686f63 --- /dev/null +++ b/docs/src/content/docs/enterprise/making-the-case.md @@ -0,0 +1,200 @@ +--- +title: "Making the Case" +description: "Talking points, objection handling, and resources for advocating APM adoption within your organization." +sidebar: + order: 5 +--- + +An internal advocacy toolkit for APM. Each section is self-contained and designed to be copied into RFCs, Slack messages, and proposals. + +--- + +## TL;DR for Leadership + +- **APM is an open-source dependency manager for AI agent configuration** — like package.json but for AI tools. It declares what your agents need in one manifest and installs it with one command. +- **One manifest, one command, locked versions.** Every developer gets identical agent setup, every CI run is reproducible. No more configuration drift across teams. +- **Zero lock-in.** APM generates native config files (`.github/`, `.claude/`, `AGENTS.md`). Remove APM and everything still works. + +--- + +## Talking Points by Audience + +### For Engineering Management + +- **Developer productivity.** Eliminate manual setup of AI agent configurations. New developers run `apm install` and get a working environment in seconds instead of following multi-step setup guides. +- **Consistency across teams.** A single shared package ensures every team uses the same coding standards, prompts, and tool configurations. Updates propagate with a version bump, not a Slack message. +- **Audit trail for compliance.** Every change to agent configuration is tracked through `apm.lock` and git history. You can answer "what changed, when, and why" for any audit. + +### For Security and Compliance + +- **Lock file integrity.** `apm.lock` pins exact versions and commit SHAs for every dependency. No silent updates, no supply chain surprises. +- **Dependency provenance.** Every package resolves to a specific git repository and commit. The full dependency tree is inspectable before installation. +- **No code execution, no runtime.** APM is a dev-time tool only. It copies configuration files — it does not execute code, run background processes, or modify your application at runtime. +- **Full audit trail.** All configuration changes are committed to git. Compliance teams can review agent setup changes through standard code review processes. + +### For Platform Teams + +- **Standardize AI configuration across N repos.** Publish a shared APM package with your organization's coding standards, approved MCP servers, and prompt templates. Every repo that depends on it stays in sync. +- **Enforce standards via CI gates.** Add `apm install --check` to your CI pipeline. Builds fail if agent configuration has drifted from the declared manifest. +- **Version-controlled standards updates.** When standards change, update the shared package and bump the version. Teams adopt updates through normal dependency management, not ad-hoc communication. + +### For Individual Developers + +- **One command instead of N installs.** `apm install` sets up all your AI tools, plugins, MCP servers, and configuration in one step. +- **Reproducible setup.** Clone a repo, run `apm install`, and get the exact same agent environment as every other developer on the team. +- **No more "works on my machine" for AI tools.** Lock files ensure everyone runs the same versions of the same configurations. + +--- + +## Common Objections + +### "Don't plugins and marketplace installs already handle this?" + +Plugins handle single-tool installation for a single AI platform. APM adds capabilities that plugins do not provide: + +- **Cross-tool composition.** One manifest manages configuration for Copilot, Claude, Cursor, and any other agent runtime simultaneously. +- **Consumer-side lock files.** Plugins install the latest version. APM pins exact versions so your team stays synchronized. +- **CI enforcement.** There is no plugin equivalent of `apm install --check` in a CI pipeline. +- **Multi-source dependency resolution.** APM resolves transitive dependencies across packages from multiple git hosts. +- **Shared organizational packages.** Plugins are published by tool vendors. APM packages are published by your own teams, containing your own standards and configurations. + +Plugins and APM are complementary. APM can install and manage plugins alongside other primitives. + +### "Is this just another tool to maintain?" + +APM is a dev-time tool with zero runtime footprint. The workflow is: + +1. Run `apm install`. +2. Get configuration files. +3. Done. + +There is no daemon, no background process, no runtime dependency. It is analogous to running `npm install` — you do not "maintain" npm at runtime. APM runs during setup and CI, then gets out of the way. + +Installation is a single binary with no system dependencies. Updates are a binary swap. The total operational surface is: one CLI binary, one manifest file, one lock file. + +### "What about vendor lock-in?" + +APM outputs native configuration formats: `.github/instructions/`, `.github/prompts/`, `.claude/`, `AGENTS.md`. These are standard files that your AI tools read directly. + +If you stop using APM, delete `apm.yml` and `apm.lock`. Your configuration files remain and continue to work. Zero lock-in by design. + +### "We only use one AI tool, not multiple." + +Multi-tool support is a bonus, not a requirement. APM provides value with a single AI tool through: + +- **Lock file reproducibility.** Every developer and CI run uses the same configuration versions. +- **Shared packages.** Publish and reuse configuration across repositories. +- **CI governance.** Enforce configuration standards automatically. +- **Dependency management.** Declare and resolve transitive dependencies between configuration packages. + +### "Our setup is simple, we don't need this." + +APM is worth adopting when any of the following apply: + +- You use more than 3 plugins or MCP servers. +- Your team has more than 5 developers. +- You need reproducible agent configuration in CI. +- You share configuration standards across multiple repositories. +- You need an audit trail for compliance. + +Below that threshold, manual setup is fine. APM is designed to help when manual management stops scaling. + +### "What if the project gets abandoned?" + +APM generates standard files that work independently of APM. If you stop using APM: + +- Your `.github/instructions/`, `.github/prompts/`, and other config files remain and continue working. +- Your AI tools read native config formats, not APM-specific formats. +- You lose automated dependency resolution and lock file management, but your existing setup is unaffected. + +This is a deliberate design choice. APM adds value on top of native formats rather than replacing them. + +--- + +## Sample RFC Paragraph + +The following is ready to copy into an internal proposal or RFC: + +> We propose adopting APM (Agent Package Manager) to manage AI agent configuration across our repositories. APM is an open-source, dev-time tool that provides a declarative manifest (`apm.yml`) and lock file (`apm.lock`) for AI coding agent setup — instructions, prompts, skills, plugins, and MCP servers. It resolves dependencies, generates native configuration files for each AI platform, and produces reproducible installs from locked versions. APM has zero runtime footprint: it runs during setup and CI, outputs standard config files, and introduces no vendor lock-in. Adopting APM will eliminate manual agent setup for new developers, enforce consistent configuration across teams, and provide an auditable record of all agent configuration changes through git history. The tool is MIT-licensed, maintained under the Microsoft GitHub organization, and supports GitHub, GitLab, Bitbucket, and Azure DevOps as package sources. + +--- + +## Quick Comparison + +For stakeholders familiar with existing tools, this comparison clarifies where APM fits. + +| Capability | Manual Setup | Single-Tool Plugin | APM | +|------------|-------------|-------------------|-----| +| Install AI tool configs | Copy files by hand | Per-tool marketplace | One command, all tools | +| Version pinning | None | Vendor-controlled | Consumer-side lock file | +| Cross-tool support | N separate processes | Single tool only | Unified manifest | +| Dependency resolution | Manual | None | Automatic, transitive | +| CI enforcement | Custom scripts | Not available | Built-in (`--check` flag) | +| Shared org standards | Wiki pages, copy-paste | Not available | Versioned packages | +| Audit trail | Implicit via git | Varies by vendor | Explicit via `apm.lock` | +| Lock-in | To manual process | To specific vendor | None (native output files) | + +--- + +## ROI Framework + +Use these categories to estimate return on investment for your organization. + +### Time Saved + +| Factor | Estimate | +|--------|----------| +| Manual setup time per developer | 15-60 minutes per repository | +| Team size | N developers | +| Onboarding frequency | Per new hire, per new repo, per environment rebuild | +| Standards update propagation | Hours per repo, per update cycle | +| **Savings formula** | Setup time x team size x frequency per quarter | + +With APM, setup reduces to `apm install` (under 30 seconds). Standards updates reduce to a version bump in `apm.yml` and a single `apm install`. + +**Example calculation.** A team of 20 developers, each setting up 2 new repos per quarter, spending 30 minutes on manual agent configuration per repo: 20 hours per quarter in setup time alone. With APM, that drops to under 20 minutes total. + +### Risk Reduced + +| Risk | APM Mitigation | +|------|----------------| +| Version drift between developers | Lock file pins exact versions and commit SHAs | +| Configuration divergence across repos | Shared packages enforce a single source of truth | +| Compliance audit gaps | Git history provides full change trail for every config change | +| Unreviewed agent configuration changes | CI gates catch drift before merge | +| Supply chain concerns | Dependency provenance traced to specific git commits | + +### Consistency Gains + +| Scenario | Without APM | With APM | +|----------|-------------|----------| +| Updating a coding standard across 10 repos | 10 manual PRs, hope nothing is missed | 1 package update, 10 version bumps | +| New developer onboarding | Follow a setup doc, troubleshoot differences | `git clone && apm install` | +| CI reproducibility | "Worked locally" debugging | Locked versions, identical environments | +| Adding a new MCP server to all repos | Manual config in each repo, inconsistent rollout | Add to shared package, teams pull on next install | +| Auditing agent configuration | Grep across repos, compare manually | Review `apm.lock` diffs in git history | + +--- + +## Resources + +| Topic | Link | +|-------|------| +| Quick Start | [Installation](../../getting-started/installation/) | +| APM for Teams | [Team workflows and shared packages](../teams/) | +| CI/CD Integration | [Pipeline setup and enforcement](../../integrations/ci-cd/) | +| Adoption Playbook | [Phased rollout guide](../adoption-playbook/) | +| Why APM | [Problem statement and design principles](../../introduction/why-apm/) | +| How It Works | [Architecture and compilation pipeline](../../introduction/how-it-works/) | +| Manifest Schema | [apm.yml reference](../../reference/manifest-schema/) | +| Key Concepts | [Primitives, packages, and compilation](../../introduction/key-concepts/) | +| Org-Wide Packages | [Publishing shared configuration](../../guides/org-packages/) | + +--- + +## Next Steps + +1. Review the [Adoption Playbook](../adoption-playbook/) for a phased rollout plan. +2. Start with a single team or repository as a pilot. +3. Publish a shared package with your organization's standards using the [APM for Teams](../teams/) guide. +4. Add `apm install --check` to CI and measure drift reduction over 30 days. diff --git a/docs/src/content/docs/enterprise/security.md b/docs/src/content/docs/enterprise/security.md new file mode 100644 index 00000000..37f77ee1 --- /dev/null +++ b/docs/src/content/docs/enterprise/security.md @@ -0,0 +1,212 @@ +--- +title: "Security Model" +description: "How APM handles dependency provenance, path security, and supply chain integrity." +sidebar: + order: 3 +--- + +This page documents APM's security posture for enterprise security reviews, compliance audits, and supply chain assessments. + +## What APM does + +APM is a build-time dependency manager for AI prompts and configuration. It performs four operations: + +1. **Resolves git repositories** — clones or sparse-checks-out packages from GitHub or Azure DevOps. +2. **Deploys static files** — copies markdown, JSON, and YAML files into project directories (`.github/`, `.claude/`). +3. **Generates compiled output** — produces `AGENTS.md`, `CLAUDE.md`, and similar files from templates and prompts. +4. **Records a lock file** — writes `apm.lock` with exact commit SHAs for every resolved dependency. + +## What APM does NOT do + +APM has no runtime footprint. Once `apm install` or `apm compile` completes, the process exits. + +- **No runtime component.** APM generates files then terminates. It does not run alongside your application. +- **No network calls after install.** All network activity (git clone/fetch) occurs during dependency resolution. There are no callbacks, webhooks, or phone-home requests. +- **No arbitrary code execution.** APM does not execute scripts from packages, evaluate expressions in templates, or run downloaded code. +- **No access to application data.** APM never reads databases, API responses, application state, or user data. +- **No persistent background processes.** APM does not install daemons, services, or scheduled tasks. +- **No telemetry or data collection.** APM collects no usage data, analytics, or diagnostics. Nothing is transmitted to Microsoft or any third party. + +## Dependency provenance + +APM resolves dependencies directly from git repositories. There is no intermediary registry, proxy, or mirror. + +### Exact commit pinning + +Every resolved dependency is recorded in `apm.lock` with its full commit SHA: + +```yaml +lockfile_version: "1" +dependencies: + - repo_url: owner/repo + host: github.com + resolved_commit: a1b2c3d4e5f6... + resolved_ref: main + depth: 1 + deployed_files: + - .github/skills/example/skill.md +``` + +The `resolved_commit` field is a full 40-character SHA, not a branch name or tag. Subsequent `apm install` calls resolve to the same commit unless the lock file is explicitly updated. + +### No registry + +APM does not use a package registry. Dependencies are specified as git repository URLs in `apm.yaml`. This eliminates the registry compromise vector entirely — there is no centralized service that can be poisoned to redirect installs. + +### Reproducible installs + +Given the same `apm.lock`, `apm install` produces identical file output regardless of when or where it runs. The lock file is the single source of truth for dependency state. + +## Path security + +APM deploys files only to controlled subdirectories within the project root. Three mechanisms enforce this boundary. + +### Path traversal prevention + +All deploy paths are validated before any file operation. The `validate_deploy_path` check enforces three rules: + +1. **No `..` segments.** Any path containing `..` is rejected outright. +2. **Allowed prefixes only.** Paths must start with an allowed prefix (`.github/` or `.claude/`). +3. **Resolution containment.** The fully resolved path must remain within the project root directory. + +A path must pass all three checks. Failure on any check prevents the file from being written. + +### Symlink handling + +Symlinks are never followed during artifact operations: + +- **Tree copy operations** skip symlinks entirely — they are excluded from the copy via an ignore filter. +- **MCP configuration files** that are symlinks are rejected with a warning and not parsed. +- **Manifest parsing** requires files to pass both `.is_file()` and `not .is_symlink()` checks. + +This prevents symlink-based attacks that could escape allowed directories or cause APM to read or write outside the project root. + +### Collision detection + +When APM deploys a file, it checks whether a file already exists at the target path: + +- If the file is **tracked in the managed files set** (deployed by a previous APM install), it is overwritten. +- If the file is **not tracked** (user-authored or created by another tool), APM skips it and prints a warning. +- The `--force` flag overrides collision detection, allowing APM to overwrite untracked files. + +Managed file lookups use pre-normalized paths for O(1) set membership checks. + +### Managed files tracking + +The lock file records every file deployed by APM in the `deployed_files` list for each dependency. This enables: + +- **Clean uninstall.** `apm uninstall` removes exactly the files APM deployed, nothing more. +- **Orphan detection.** Files present on disk but absent from the lock file are flagged. +- **Collision awareness.** The managed set distinguishes APM-deployed files from user-authored files. + +## MCP server trust model + +APM integrates MCP (Model Context Protocol) server configurations from packages. Trust is explicit and scoped by dependency depth. + +### Direct dependencies + +MCP servers declared by your direct dependencies (packages listed in your `apm.yaml`) are auto-trusted. You explicitly chose to depend on these packages, so their MCP server declarations are accepted. + +### Transitive dependencies + +MCP servers declared by transitive dependencies (dependencies of your dependencies) are **blocked by default**. APM prints a warning and skips the MCP server entry. + +To allow transitive MCP servers, you must either: + +- **Re-declare the dependency** in your own `apm.yaml`, promoting it to a direct dependency. +- **Pass `--trust-transitive-mcp`** to explicitly opt in to transitive MCP servers for that install. + +### Design rationale + +Transitive MCP servers can request tool access, file system permissions, or network capabilities from the AI assistant. Blocking them by default ensures that adding a prompt package cannot silently grant MCP access to an unknown transitive dependency. + +## Token handling + +APM authenticates to git hosts using personal access tokens (PATs) read from environment variables. + +### Token resolution + +| Purpose | Environment variables (checked in order) | +|---|---| +| GitHub packages | `GITHUB_APM_PAT`, `GITHUB_TOKEN`, `GH_TOKEN` | +| Azure DevOps packages | `ADO_APM_PAT` | + +### Security properties + +- **Never stored in files.** Tokens are read from the environment at runtime. They are never written to `apm.yaml`, `apm.lock`, or any generated file. +- **Never logged.** Token values are not included in console output, error messages, or debug logs. +- **Scoped to their git host.** A GitHub token is only sent to GitHub. An Azure DevOps token is only sent to Azure DevOps. Tokens are never transmitted to any other endpoint. + +### Recommended token scope + +For GitHub, a fine-grained PAT with read-only `Contents` permission on the repositories you depend on is sufficient. APM only performs git clone and fetch operations. + +## Supply chain considerations + +### Attack surface comparison + +APM's design eliminates several supply chain attack vectors common in traditional package managers: + +| Vector | Traditional package manager | APM | +|---|---|---| +| Registry compromise | Attacker poisons central registry | No registry exists | +| Version substitution | Malicious version replaces legitimate one | Lock file pins exact commit SHA | +| Post-install scripts | Arbitrary code runs after install | No code execution | +| Typosquatting | Similar package names on registry | Dependencies are full git URLs | +| Build-time injection | Malicious build steps execute | No build step — files are copied | + +### Auditing dependency changes + +Because `apm.lock` is a plain YAML file checked into version control, standard git tooling provides a full audit trail: + +```bash +# View all dependency changes over time +git log --oneline apm.lock + +# See exactly what changed in a specific commit +git diff HEAD~1 -- apm.lock + +# Find when a specific dependency was added +git log --all -p -- apm.lock | grep -A5 "owner/repo" +``` + +### Pinning and updates + +- `apm install` respects the existing lock file. Dependencies are not re-resolved unless explicitly requested. +- `apm update` re-resolves dependencies and updates the lock file. The diff is visible in version control before merging. +- There is no automatic update mechanism. Dependency changes require a deliberate action and a code review. + +## Frequently asked questions + +### Does APM execute any code from packages? + +No. APM copies static files (markdown, JSON, YAML) and generates compiled output from templates. It does not execute scripts, evaluate expressions, or run any code from the packages it installs. + +### Does APM phone home or collect telemetry? + +No. APM makes no network requests beyond git clone/fetch operations to resolve dependencies. There is no telemetry, analytics, or usage reporting of any kind. + +### Can a malicious package write files outside the project? + +No. All deploy paths are validated against the project root using path traversal checks, prefix allowlists, and resolved path containment. Symlinks are skipped entirely. A package cannot write files outside `.github/` or `.claude/` within the project root. + +### Can a transitive dependency inject MCP servers? + +Not by default. Transitive MCP server declarations are blocked unless you explicitly opt in with `--trust-transitive-mcp` or re-declare the dependency as a direct dependency. + +### How do I audit what APM installed? + +The `apm.lock` file records every dependency (with exact commit SHA) and every file deployed. It is a plain YAML file suitable for automated policy checks, diff review, and compliance tooling. + +### Is the APM binary signed? + +APM is distributed as: + +- A PyPI package (`apm-cli`) built and published through GitHub Actions CI/CD. +- Pre-built binaries attached to GitHub Releases under the `microsoft` GitHub organization. + +Both distribution channels use GitHub Actions workflows with pinned dependencies and are auditable through the public repository. + +### Where is the source code? + +APM is open source under the MIT license, hosted on GitHub under the `microsoft` organization. The full source code, build pipeline, and release process are publicly auditable. diff --git a/docs/src/content/docs/enterprise/teams.md b/docs/src/content/docs/enterprise/teams.md new file mode 100644 index 00000000..030e7434 --- /dev/null +++ b/docs/src/content/docs/enterprise/teams.md @@ -0,0 +1,156 @@ +--- +title: "APM for Teams" +description: "How APM provides reproducibility, governance, and consistency for AI agent configuration at scale." +sidebar: + order: 1 +--- + +APM is an open-source dependency manager for AI agent configuration. +One manifest (`apm.yml`), one command (`apm install`), locked versions (`apm.lock`). +Every developer gets the same agent setup. +Every CI run is reproducible. +Every configuration change is auditable. + +## The problem at scale + +Consider a mid-to-large engineering organization: 50 repositories, 200 developers, three AI coding tools (Copilot, Claude, Cursor). + +Without centralized configuration management, a predictable set of problems emerges: + +- **Manual configuration per repo.** Each team sets up agent configuration independently. Conventions diverge. Knowledge silos form. The "right" way to configure an agent depends on who you ask. +- **No audit trail.** When security or compliance asks "what agent configuration was active at release 4.2.1?" — there is no answer. Configuration files were hand-edited, and no one tracked which version of which plugin was in use. +- **Version drift.** Developer A has v1.2 of a rules plugin. Developer B has v1.4. CI has whatever was last committed. Bugs that only reproduce under specific configurations become difficult to trace. +- **Onboarding friction.** A new developer reads the README, runs N install commands, copies configuration from a colleague's machine, and hopes nothing was missed. The gap between "environment works" and "environment matches the team standard" is invisible. + +These are not hypothetical problems. They are the direct consequence of treating AI agent configuration as a manual, per-developer responsibility rather than as a managed dependency. + +## How APM solves this + +APM applies the same model that package managers brought to application dependencies — declare, lock, install, audit — to AI agent configuration. + +### Declare + +A single `apm.yml` file in the repository root declares all agent configuration dependencies: + +```yaml +packages: + - name: org-security-rules + source: github:your-org/apm-packages + version: "^2.0" + - name: team-coding-standards + source: github:your-org/team-packages + version: "~1.3" + - name: project-context + source: ./local-packages/context +``` + +This file is version-controlled, reviewed in pull requests, and readable by anyone on the team. + +### Lock + +Running `apm install` resolves versions and writes `apm.lock`, which pins the exact version of every dependency. The lock file is committed to the repository. + +``` +# apm.lock (auto-generated) +org-security-rules==2.1.0 +team-coding-standards==1.3.4 +project-context==local +``` + +Two developers running `apm install` from the same lock file get identical configuration. A CI pipeline running `apm install` gets the same result as a developer workstation. + +### Install + +`apm install` reads the lock file and deploys configuration into the native formats expected by each tool — `.github/` for Copilot, `.claude/` for Claude, `.cursor/` for Cursor. APM generates static files and then gets out of the way. There is no runtime, no daemon, no background process. + +### Audit + +Because `apm.lock` is a committed file, standard Git tooling answers governance questions directly: + +- **What changed?** `git diff apm.lock` +- **When did it change?** `git log apm.lock` +- **What was active at a specific release?** `git show v4.2.1:apm.lock` +- **Is this environment current?** `apm audit` + +## Developer stories + +### Solo or small team (2–5 developers) + +A small team uses 5 configuration packages across 2 AI tools. + +Without APM, each developer runs 5 separate install commands, in the right order, from the right sources. When a package updates, someone notices (or doesn't), and the team re-runs the process. + +With APM, the workflow is: + +```bash +git clone the-repo +apm install +``` + +Configuration is ready. Updates are a pull request to `apm.yml`. + +### Mid-size team (10–50 developers) + +A mid-size organization maintains three layers of configuration: organization-wide security rules, team-specific coding standards, and project-level context. Different teams need different combinations. + +APM composes these layers through its dependency model. The organization publishes shared packages. Each team's `apm.yml` references the org packages it needs alongside team and project packages. Compilation merges them in the correct order. + +```yaml +packages: + # Organization layer + - name: org-security-rules + source: github:acme-corp/apm-packages + version: "^2.0" + # Team layer + - name: backend-standards + source: github:acme-corp/backend-team + version: "~1.0" + # Project layer + - name: service-context + source: ./packages/context +``` + +A new developer joining the team runs `apm install` and gets the full, correct configuration stack. There is nothing to forget. + +### Enterprise (100+ developers) + +At enterprise scale, the primary concerns shift from convenience to governance: reproducibility, audit, and policy enforcement. + +APM addresses these through mechanisms that engineering leadership and platform teams can build on: + +- **Reproducibility.** `apm.lock` guarantees that every environment — developer workstation, CI runner, staging — uses identical configuration. "Works on my machine" stops applying to agent setup. +- **Audit trail.** `git log apm.lock` provides a complete, timestamped history of every configuration change, who made it, and which pull request approved it. +- **CI enforcement.** `apm audit` in a CI pipeline fails the build if local configuration has drifted from the declared and locked state, catching unauthorized or accidental changes before they reach production. +- **Centralized standards.** Organization-wide packages are published once and consumed by every repository. Updates propagate through version bumps in `apm.yml`, reviewed and approved through the normal pull request process. + +## What APM adds on top of native plugin systems + +Each AI tool has its own plugin or extension system. APM does not replace these — it orchestrates across them. + +| Capability | Native plugin systems | With APM | +|---|---|---| +| Install plugins for one tool | Yes | Yes | +| Install across all tools, one command | No | Yes | +| Consumer-side version lock | No | Yes (`apm.lock`) | +| CI gate for configuration drift | No | Yes (`apm audit`) | +| Audit trail | No | Yes (`git log apm.lock`) | +| Multi-source composition | No | Yes | + +The distinction matters: native plugin systems solve distribution for a single tool. APM solves consistency across tools, teams, and time. + +## What APM is not + +**APM is not a runtime.** It generates static configuration files in the formats each tool expects, then exits. There is no daemon, no background process, no performance overhead. + +**APM is not lock-in.** The output of `apm install` is native configuration: `.github/copilot-instructions.md`, `.claude/settings.json`, `.cursor/rules/`. If you stop using APM, the generated configuration remains and continues to work. There is nothing proprietary in the output. + +**APM is not competing with plugins.** Plugin ecosystems handle discovery and distribution for individual tools. APM handles the cross-cutting concerns — version locking, multi-tool deployment, composition, and audit — that no single plugin system addresses. + +## Getting started + +For hands-on setup and deeper topics, start here: + +- [Quick Start](../../getting-started/installation/) — install APM and configure your first project in five minutes. +- [Organization-Wide Packages](../../guides/org-packages/) — publish and maintain shared configuration packages across your organization. +- [Compilation Guide](../../guides/compilation/) — understand how APM merges and transforms configuration from multiple sources. +- [Dependencies Guide](../../guides/dependencies/) — version constraints, lock file mechanics, and update workflows. diff --git a/docs/src/content/docs/getting-started/authentication.md b/docs/src/content/docs/getting-started/authentication.md index 26a3e47e..e3bee610 100644 --- a/docs/src/content/docs/getting-started/authentication.md +++ b/docs/src/content/docs/getting-started/authentication.md @@ -1,7 +1,7 @@ --- title: "Authentication" sidebar: - order: 3 + order: 4 --- APM works without any tokens for public packages. Authentication is only needed for private repositories and enterprise hosts. diff --git a/docs/src/content/docs/getting-started/first-package.md b/docs/src/content/docs/getting-started/first-package.md index 7e2e38ac..bd90ad7d 100644 --- a/docs/src/content/docs/getting-started/first-package.md +++ b/docs/src/content/docs/getting-started/first-package.md @@ -2,7 +2,7 @@ title: "Your First Package" description: "Create, publish, and install your first APM package in minutes." sidebar: - order: 2 + order: 3 --- This tutorial walks you through creating an APM package from scratch, publishing it, and installing it in another project. diff --git a/docs/src/content/docs/getting-started/installation.md b/docs/src/content/docs/getting-started/installation.md index b3e4a208..4e24d231 100644 --- a/docs/src/content/docs/getting-started/installation.md +++ b/docs/src/content/docs/getting-started/installation.md @@ -6,6 +6,28 @@ sidebar: Get APM running in seconds. No tokens, no configuration — just install and go. +## Try APM in 60 Seconds + +See APM in action before reading anything else: + +```bash +# Install APM +curl -sSL https://raw.githubusercontent.com/microsoft/apm/main/install.sh | sh + +# Install a sample package into any project +cd your-project +apm install microsoft/apm-sample-package + +# See what was installed +apm deps list +``` + +That's it — your project now has agent instructions, prompts, and skills configured. Open it in VS Code or Claude to see the difference. + +Ready for a deeper walkthrough? See the [Quick Start guide](../quick-start/). + +--- + ## Quick Install (Recommended) The fastest way to get APM running: diff --git a/docs/src/content/docs/getting-started/migration.md b/docs/src/content/docs/getting-started/migration.md new file mode 100644 index 00000000..ef08dd7a --- /dev/null +++ b/docs/src/content/docs/getting-started/migration.md @@ -0,0 +1,189 @@ +--- +title: "Migrating Existing Projects" +description: "Adopt APM in projects that already have AI agent configuration — without disruption." +sidebar: + order: 5 +--- + +Most teams adopting APM already have some form of AI agent configuration in place. This guide covers how to introduce APM into a project that already uses `.github/copilot-instructions.md`, `AGENTS.md`, `CLAUDE.md`, `.cursor-rules`, manually managed `.github/instructions/`, or plugin configurations — without breaking what already works. + +## Before You Start + +Take stock of what you currently have. Common configurations include: + +| File / Directory | Purpose | +|---|---| +| `.github/copilot-instructions.md` | Repository-level Copilot instructions | +| `.github/instructions/*.md` | File-pattern or task-specific Copilot instructions | +| `AGENTS.md` | Agent instructions (Codex, multi-agent workflows) | +| `CLAUDE.md` | Claude Code project instructions | +| `.cursor-rules` or `.cursorrules` | Cursor IDE rules | +| `.aider*` files | Aider conventions | +| Plugin configs (MCP servers, tools) | Manually installed tool integrations | + +If you have any of these, you are in the right place. + +## What APM Will (and Will Not) Do + +APM is additive. Running `apm init` and `apm compile` will never delete, overwrite, or modify your existing configuration files unless you explicitly ask it to. The compiled output targets (like `AGENTS.md` or `.github/copilot-instructions.md`) are clearly marked as generated, so there is no ambiguity about which files APM manages and which are yours. + +If you later decide APM is not for you, delete `apm.yml` and `apm.lock` and your original files remain untouched. + +## Step-by-Step Migration + +### Step 1: Inventory Your Existing Config + +List everything you currently have. A quick way to check: + +```bash +ls -la .github/copilot-instructions.md .github/instructions/ \ + AGENTS.md CLAUDE.md .cursor-rules .cursorrules 2>/dev/null +``` + +Write down which files are hand-maintained and which are copy-pasted from other projects or team templates. The copy-pasted ones are your best candidates for replacing with shared APM packages. + +### Step 2: Initialize APM + +Run `apm init` in your project root: + +```bash +apm init +``` + +This creates an `apm.yml` manifest alongside your existing files. Nothing is deleted or moved. If you already have an `apm.yml`, this step is a no-op. + +Review the generated `apm.yml` — it will contain a basic structure with empty dependency and primitive sections ready for you to populate. + +### Step 3: Wrap Existing Primitives (Optional) + +If you have local instructions, prompts, or agent definitions that you want APM to manage, move them into the `.apm/` directory structure: + +``` +.apm/ +├── instructions/ +│ └── coding-standards.instructions.md +├── prompts/ +│ └── review.prompt.md +└── agents/ + └── reviewer.agent.md +``` + +Then reference them in your `apm.yml`: + +```yaml +prompts: + - prompts/review.prompt.md + +instructions: + - instructions/coding-standards.instructions.md +``` + +This step is optional. APM also discovers files placed directly in `.github/instructions/` and other standard locations. Wrapping them in `.apm/` gives you explicit control over what gets compiled and where. + +### Step 4: Add External Dependencies + +Replace copy-pasted configuration with shared packages: + +```bash +apm install microsoft/copilot-best-practices +apm install your-org/team-standards +``` + +Each package brings in versioned, maintained primitives instead of stale copies. Your `apm.yml` now tracks these as dependencies with pinned versions in `apm.lock`. + +### Step 5: Compile and Verify + +Run compilation to see what APM would generate: + +```bash +apm compile --verbose --dry-run +``` + +The `--dry-run` flag shows you the output without writing any files. Compare it against your current `AGENTS.md` or other target files. The compiled output should match or improve on what you had before. + +When satisfied, run without `--dry-run`: + +```bash +apm compile +``` + +Review the generated files. If a compiled file conflicts with a hand-maintained one, APM will warn you. You decide whether to let APM manage that file or keep your manual version. + +### Step 6: Commit the Manifest + +Add the APM manifest and lock file to version control: + +```bash +git add apm.yml apm.lock +git commit -m "Add APM manifest for agent configuration management" +``` + +Your teammates can now run `apm install` followed by `apm compile` to get an identical setup. No more copy-pasting configuration between repositories or Slack threads. + +### Step 7: Gradually Convert + +You do not need to migrate everything at once. A practical approach: + +1. Start with `apm install` for external packages only — keep all local config manual. +2. Move one or two local files into `.apm/` and verify the compiled output. +3. Over time, convert remaining hand-maintained files as you gain confidence. +4. Eventually, your `apm.yml` becomes the single source of truth for all agent configuration. + +There is no deadline. APM and manual configuration coexist indefinitely. + +## Common Migration Patterns + +### From Manual copilot-instructions.md + +**Before:** A hand-maintained `.github/copilot-instructions.md` that drifts across repositories. + +**After:** An instruction primitive in `.apm/instructions/` compiled into `.github/copilot-instructions.md` by `apm compile`. Changes propagate to every repo that depends on the package. + +### From Copy-Pasted AGENTS.md + +**Before:** An `AGENTS.md` copied from a template repo, manually edited per project, gradually falling out of date. + +**After:** `apm compile` generates `AGENTS.md` from your dependency tree. Updates arrive via `apm update` instead of manual diffing. + +### From Individual Plugin Installs + +**Before:** Each developer manually installs MCP servers and tool integrations, with inconsistent versions across the team. + +**After:** Plugin dependencies declared in `apm.yml`. Running `apm install` gives every developer the same plugin set. + +### From Scattered Team Standards + +**Before:** Coding standards, review guidelines, and prompt templates live in a wiki, a shared drive, or a pinned Slack message. + +**After:** A shared APM package (`your-org/team-standards`) that every repository depends on. Update the package once, run `apm update` everywhere. + +## Rollback + +APM does not take ownership of your project. If you want to stop using it: + +1. Delete `apm.yml` and `apm.lock`. +2. Optionally remove the `.apm/` directory if you created one. +3. Your native configuration files (`.github/`, `.claude/`, `AGENTS.md`) continue to work exactly as they did before APM. + +No uninstall script, no cleanup command — just remove the manifest files. + +## Troubleshooting + +### Compiled output overwrites my manual file + +APM-generated files include a header comment marking them as managed. If you have a hand-maintained file at the same path, rename it or move your content into an APM primitive so compilation produces the combined result. + +### Existing AGENTS.md has custom sections + +Use `apm compile --verbose` to inspect how the output is assembled. You can add local primitives that contribute content to specific sections, preserving your custom additions in a structured way. + +### Team members do not have APM installed + +APM-generated files are standard Markdown. Team members without APM installed can still read and use the generated `AGENTS.md`, `.github/copilot-instructions.md`, and other output files directly. APM is only needed to update or recompile them. + +## Next Steps + +- [Compilation guide](../../guides/compilation/) — understand how `apm compile` assembles output +- [Dependencies](../../guides/dependencies/) — managing external packages +- [Manifest schema](../../reference/manifest-schema/) — full `apm.yml` reference +- [CLI commands](../../reference/cli-commands/) — complete command reference diff --git a/docs/src/content/docs/getting-started/quick-start.md b/docs/src/content/docs/getting-started/quick-start.md new file mode 100644 index 00000000..cf6fa950 --- /dev/null +++ b/docs/src/content/docs/getting-started/quick-start.md @@ -0,0 +1,194 @@ +--- +title: "Quick Start" +description: "Get from zero to a fully configured AI agent setup in 5 minutes." +sidebar: + order: 2 +--- + +This walkthrough takes you from an empty directory to a fully configured AI agent setup. Every step is a command you can run right now. + +## 1. Install APM + +One command, no prerequisites beyond Python 3.10+: + +```bash +curl -sSL https://raw.githubusercontent.com/microsoft/apm/main/install.sh | sh +``` + +Verify the installation: + +```bash +apm --version +``` + +``` +apm, version x.x.x +``` + +For alternative methods (Homebrew, pip), see the [Installation guide](../installation/). + +## 2. Initialize a project + +Create a new project and move into it: + +```bash +apm init my-project && cd my-project +``` + +``` +Created project directory: my-project +Initializing APM project: my-project +APM project initialized successfully! + + Created Files + ✨ apm.yml Project configuration +``` + +The generated `apm.yml` is your project manifest — equivalent to `package.json` or `requirements.txt`, but for AI agent configuration: + +```yaml +name: my-project +version: 1.0.0 +dependencies: + apm: [] +``` + +If you already have a repository, run `apm init` (without a project name) inside it. APM detects your existing project metadata automatically. + +## 3. Add your first dependency + +Install a sample package to see how APM works: + +```bash +apm install microsoft/apm-sample-package +``` + +``` +Installing APM dependencies... +Resolving: microsoft/apm-sample-package +Downloaded: microsoft/apm-sample-package@latest +Deployed 3 files to .github/instructions/ +``` + +APM did three things: + +1. **Downloaded** the package from GitHub into `apm_modules/microsoft/apm-sample-package/`. +2. **Resolved** any transitive dependencies the package declares. +3. **Deployed** instruction files into `.github/instructions/` where your AI tools can find them. + +Your `apm.yml` now includes the dependency: + +```yaml +dependencies: + apm: + - microsoft/apm-sample-package +``` + +And a lockfile (`apm.lock`) pins the exact commit so every developer on your team gets the same version. + +## 4. See the result + +After install, your project tree looks like this: + +``` +my-project/ + apm.yml # Project manifest + apm.lock # Pinned dependency versions + apm_modules/ # Downloaded packages (like node_modules/) + microsoft/ + apm-sample-package/ + apm.yml + .apm/ + instructions/ + skills/ + prompts/ + .github/ + instructions/ # Deployed instructions for Copilot/Cursor + apm-sample-package/ + ... +``` + +The `.github/instructions/` directory is where VS Code, GitHub Copilot, and Cursor look for agent context. Open your editor — your AI agent is now configured with the skills, instructions, and prompts from the package you installed. + +## 5. Compile instructions + +For tools that read a single root file (like Claude Code or Codex), compile everything into one output: + +```bash +apm compile +``` + +``` +Compiling APM context... +Target: all (auto-detected) +Generated: AGENTS.md +Generated: CLAUDE.md +``` + +By default, `apm compile` targets all platforms. You can narrow it: + +```bash +# Copilot/Cursor/Codex only — produces AGENTS.md +apm compile --target copilot + +# Claude Code only — produces CLAUDE.md +apm compile --target claude +``` + +Use `--dry-run` to preview what would be generated without writing any files: + +```bash +apm compile --dry-run +``` + +## 6. Check what is installed + +List all installed packages: + +```bash +apm deps list +``` + +``` +Installed APM Dependencies + + Package Source Version + microsoft/apm-sample-package github abc1234 +``` + +View the full dependency tree, including transitive dependencies: + +```bash +apm deps tree +``` + +``` +my-project + microsoft/apm-sample-package@abc1234 +``` + +## 7. Day-to-day workflow + +Once set up, the workflow for your team is straightforward: + +```bash +# A new developer clones and installs — same as npm install +git clone +cd +apm install + +# Add another package later +apm install github/awesome-copilot/skills/review-and-refactor + +# Recompile after adding dependencies +apm compile +``` + +Commit `apm.yml` and `apm.lock` to version control. The `apm_modules/` directory should be in `.gitignore` — APM recreates it from the lockfile on `apm install`. + +## What's next + +- [Your First Package](../first-package/) — create and publish your own APM package. +- [Compilation guide](../../guides/compilation/) — learn about distributed compilation, targets, and options. +- [Dependency management](../../guides/dependencies/) — version pinning, updates, and transitive resolution. +- [CLI reference](../../reference/cli-commands/) — full list of commands, flags, and examples. diff --git a/docs/src/content/docs/guides/org-packages.md b/docs/src/content/docs/guides/org-packages.md new file mode 100644 index 00000000..93421aed --- /dev/null +++ b/docs/src/content/docs/guides/org-packages.md @@ -0,0 +1,283 @@ +--- +title: "Org-Wide Packages" +description: "Build shared standards packages that standardize AI agent configuration across your organization." +sidebar: + order: 7 +--- + +## The pattern + +A central team publishes a standards package — say `acme-corp/apm-standards`. Every repository in the organization adds it as a dependency. When the standards team pushes an update, every consumer gets it on their next `apm deps update`. + +``` +acme-corp/apm-standards (central package) + ├── .apm/instructions/coding-standards.md + ├── .apm/instructions/security-baseline.md + ├── .apm/agents/review-agent.md + └── apm.yml + +repo-A/ ──depends on──▶ acme-corp/apm-standards +repo-B/ ──depends on──▶ acme-corp/apm-standards +repo-C/ ──depends on──▶ acme-corp/apm-standards +``` + +One update to the standards package propagates to all consumers. No copy-pasting, no drift. + +## Why shared packages? + +**Consistency.** Every repository gets the same coding standards, security baselines, and review agents. New repos start with the org's best practices from day one. + +**Single update point.** Change a security policy once in the standards package. Every consumer picks it up with `apm deps update` — no need to open PRs across dozens of repos. + +**Versioned.** Consumers pin to a specific version and upgrade on their own schedule. No forced rollouts, no surprise breakage. + +**Composable.** Layer packages from broad to narrow: org-wide base, then team-specific, then project-specific. Each layer can override or extend the one below it. + +## Creating an org package + +Start by initializing a new APM package: + +```bash +apm init acme-standards && cd acme-standards +``` + +Then populate it with the shared configuration your org needs. + +### Instructions — coding standards and policies + +Place organization-wide instructions in `.apm/instructions/`: + +```markdown + +# Coding Standards + +- Write clear, self-documenting code. Prefer readability over cleverness. +- All public functions must have docstrings. +- Use type hints in Python, TypeScript types in JS/TS projects. +- Keep functions under 50 lines. Extract when they grow. +``` + +```markdown + +# Security Baseline + +- Never commit secrets, tokens, or credentials to source control. +- Validate all user input at API boundaries. +- Use parameterized queries for database access. +- Dependencies must be pinned to exact versions in lock files. +``` + +### Agents — standard review and advisory agents + +Define reusable agent configurations in `.apm/agents/`: + +```markdown + +--- +name: security-reviewer +description: Reviews code changes for security vulnerabilities +--- + +You are a security-focused code reviewer. When reviewing changes: + +1. Check for injection vulnerabilities (SQL, command, template). +2. Verify authentication and authorization on all endpoints. +3. Flag hardcoded secrets or credentials. +4. Ensure error messages don't leak internal details. +5. Verify input validation at trust boundaries. + +Be specific. Reference the exact file and line. Suggest a fix. +``` + +### Prompts — common workflows + +Add shared prompt templates in `.apm/prompts/`: + +```markdown + +# Design Review + +Review the proposed design for: + +1. **Scalability** — Will this handle 10x the current load? +2. **Failure modes** — What happens when dependencies are unavailable? +3. **Data consistency** — Are there race conditions or stale reads? +4. **API surface** — Is the interface minimal and hard to misuse? + +Provide concrete recommendations, not abstract concerns. +``` + +### Skills — shared capabilities + +Place reusable skill definitions in `.apm/skills/`: + +```markdown + +# API Design Skill + +When designing or reviewing APIs: + +- Use consistent naming: plural nouns for collections, singular for items. +- Return appropriate HTTP status codes (201 for creation, 204 for deletion). +- Version APIs in the URL path (/v1/resources). +- Paginate list endpoints by default. +- Include request IDs in all responses for traceability. +``` + +### Package manifest + +The `apm.yml` defines what the package contains: + +```yaml +# apm.yml +name: acme-standards +version: "1.0.0" +description: "Acme Corp organization-wide AI agent standards" +``` + +## Layered composition + +Shared packages become powerful when you layer them. Build from broad to narrow — org-wide, then team-specific, then project-specific. + +### Team package — extends the org base + +```yaml +# acme-corp/acme-team-frontend/apm.yml +name: acme-team-frontend +version: "1.0.0" +description: "Frontend team standards, extends org base" + +dependencies: + apm: + - acme-corp/apm-standards # org-wide base + - acme-corp/frontend-skills # frontend-specific capabilities +``` + +The team package adds frontend-specific instructions and agents while inheriting the org-wide security baseline and coding standards. + +### Project — pulls in everything transitively + +```yaml +# my-project/apm.yml +name: my-project + +dependencies: + apm: + - acme-corp/acme-team-frontend # pulls in org + team transitively + - some-other/project-specific-pkg +``` + +After installing: + +```bash +apm install +``` + +The project gets the full stack: org-wide standards from `apm-standards`, frontend-specific skills from `frontend-skills`, team configuration from `acme-team-frontend`, and anything from `project-specific-pkg` — all resolved and deployed automatically. + +### Override order + +When files from different packages target the same path, the most specific package wins: + +1. Project-local files (highest priority) +2. Direct dependencies +3. Transitive dependencies (lowest priority) + +This means a project can always override an org default when it has a legitimate reason to diverge. + +## Versioning strategy + +### Tagging releases + +Use git tags to mark versions of your standards package: + +```bash +# In the standards package repo +git add -A && git commit -m "Add API design standards" +git tag v1.0.0 +git push origin main --tags +``` + +### Consumer pinning + +Consumers reference specific versions to control when they adopt changes: + +```yaml +# Pin to exact version +dependencies: + apm: + - acme-corp/apm-standards@v1.0.0 + +# Pin to major version (gets v1.x.x updates) +dependencies: + apm: + - acme-corp/apm-standards@v1 +``` + +Regardless of the version specifier, `apm.lock` always pins the exact commit SHA. This guarantees reproducible installs even if the tag is moved. + +### When to bump versions + +- **Patch** (v1.0.1): Fix typos, clarify wording, add non-breaking examples. +- **Minor** (v1.1.0): Add new instructions or agents. Existing behavior unchanged. +- **Major** (v2.0.0): Remove or rename files, change agent behavior, restructure directories. + +## Update workflow + +### Package author + +When updating the standards package: + +```bash +# Make changes to instructions, agents, prompts, or skills +# ... + +# Test before publishing +apm compile --dry-run + +# Commit, tag, push +git add -A && git commit -m "Tighten input validation policy" +git tag v1.1.0 +git push origin main --tags +``` + +### Consumer + +To pick up the latest version within your pinned range: + +```bash +apm deps update +``` + +This updates `apm.lock` to the latest commit matching your version pin and deploys the updated files. + +### CI integration + +In continuous integration, always use the lock file for reproducible builds: + +```bash +# CI pipeline — installs exact versions from lock file +apm install +``` + +This ensures every CI run uses the same dependency versions, regardless of what has been published since. + +## Best practices + +**Keep packages focused.** Separate concerns into distinct packages rather than bundling everything into a monolith: + +- `acme-corp/security-baseline` — security policies and review agents +- `acme-corp/coding-standards` — language-specific coding guidelines +- `acme-corp/review-agents` — standard code review agent configurations + +This lets teams adopt what they need without pulling in irrelevant configuration. + +**Use semantic versioning for breaking changes.** Consumers rely on version pins to control their upgrade cadence. A surprise rename or deletion in a patch release breaks trust and workflows. + +**Document what each package provides.** Include a clear README in every standards package listing the files it deploys and what each one does. Consumers should know what they're getting without reading every file. + +**Test before tagging.** Run `apm compile --dry-run` to verify the package compiles cleanly before publishing a new version. Catch issues before they propagate to consumers. + +**Start small.** Begin with one focused package — security baseline is a good first choice. Expand to additional packages as patterns emerge. It is easier to split a package later than to merge two that diverged. + +**Review changes like code.** Standards packages affect every repo in the org. Treat updates with the same rigor as production code changes — pull requests, reviews, and testing. diff --git a/docs/src/content/docs/guides/pack-distribute.md b/docs/src/content/docs/guides/pack-distribute.md new file mode 100644 index 00000000..ffb33b57 --- /dev/null +++ b/docs/src/content/docs/guides/pack-distribute.md @@ -0,0 +1,319 @@ +--- +title: "Pack & Distribute" +description: "Bundle resolved dependencies for offline distribution, CI pipelines, and air-gapped environments." +sidebar: + order: 6 +--- + +Bundle your resolved APM dependencies into a portable artifact that can be distributed, cached, and consumed without APM, Python, or network access. + +## Why bundles? + +Every CI job that runs `apm install` pays the same tax: install APM, authenticate against GitHub, clone N repositories, compile prompts. Multiply that across a matrix of jobs, nightly builds, and staging environments and the cost adds up fast. + +A bundle removes all of that. You resolve once, pack the output, and distribute the artifact. Consumers extract it and get the exact files that `apm install` would have produced — no toolchain required. + +Common motivations: + +- **CI cost reduction** — resolve once, fan out to many jobs +- **Air-gapped environments** — no network access at deploy time +- **Reproducibility** — the bundle is a snapshot of exactly what was resolved +- **Faster onboarding** — new contributors get pre-built context without running install +- **Audit trail** — attach the bundle to a release for traceability + +## The pipeline + +The pack/distribute workflow fits between install and consumption: + +``` +apm install -> apm pack -> upload artifact -> download -> apm unpack (or tar xzf) +``` + +The left side (install, pack) runs where APM is available. The right side (download, unpack) runs anywhere — a CI job, a dev container, a colleague's laptop. The bundle is the boundary. + +## `apm pack` + +Creates a self-contained bundle from installed dependencies. Reads the `deployed_files` manifest in `apm.lock` as the source of truth — it does not scan the disk. + +```bash +# Default: apm format, target auto-detected from apm.yml +apm pack + +# Filter by target +apm pack --target vscode # only .github/ files +apm pack --target claude # only .claude/ files +apm pack --target all # both targets + +# Bundle format +apm pack --format plugin # valid plugin directory structure + +# Produce a .tar.gz archive +apm pack --archive + +# Custom output directory (default: ./build) +apm pack -o ./dist/ + +# Preview without writing +apm pack --dry-run +``` + +### Options + +| Flag | Default | Description | +|------|---------|-------------| +| `--format` | `apm` | Bundle format (`apm` or `plugin`) | +| `-t, --target` | auto-detect | File filter: `vscode`, `claude`, `all` | +| `--archive` | off | Produce `.tar.gz` instead of directory | +| `-o, --output` | `./build` | Output directory | +| `--dry-run` | off | List files without writing | + +### Target filtering + +The target flag controls which deployed files are included based on path prefix: + +| Target | Includes | +|--------|----------| +| `vscode` | Paths starting with `.github/` | +| `claude` | Paths starting with `.claude/` | +| `all` | Both `.github/` and `.claude/` | + +When no target is specified, APM auto-detects from the `target` field in `apm.yml`, falling back to `all`. + +## Bundle structure + +The bundle mirrors the directory structure that `apm install` produces. It is not an intermediate format — extract it at the project root and the files land exactly where they belong. + +Output is written to `./build/-/` by default, where name and version come from `apm.yml`. + +### VS Code / Copilot target + +``` +build/my-project-1.0.0/ + .github/ + prompts/ + design-review.prompt.md + code-quality.prompt.md + agents/ + architect.md + skills/ + security-scan/ + skill.md + apm.lock # enriched copy (see below) +``` + +### Claude target + +``` +build/my-project-1.0.0/ + .claude/ + commands/ + review.md + debug.md + skills/ + code-analysis/ + skill.md + apm.lock +``` + +### All targets + +``` +build/my-project-1.0.0/ + .github/ + prompts/ + ... + agents/ + ... + .claude/ + commands/ + ... + apm.lock +``` + +The bundle is self-describing: its `apm.lock` lists every file it contains and the dependency graph that produced them. + +## Lockfile enrichment + +The bundle includes a copy of `apm.lock` enriched with a `pack:` section. The project's own `apm.lock` is never modified. + +```yaml +pack: + format: apm + target: vscode + packed_at: '2025-07-14T09:30:00+00:00' +lockfile_version: '1' +generated_at: '2025-07-14T09:28:00+00:00' +apm_version: '0.5.0' +dependencies: + - repo_url: microsoft/apm-sample-package + host: github.com + resolved_commit: a1b2c3d4 + resolved_ref: main + version: 1.0.0 + depth: 1 + package_type: apm + deployed_files: + - .github/prompts/design-review.prompt.md + - .github/agents/architect.md +``` + +The `pack:` section records: + +- **format** — the bundle format used (`apm` or `plugin`) +- **target** — the effective target filter applied +- **packed_at** — UTC timestamp of when the bundle was created + +This metadata lets consumers verify what they received and trace it back to a build. + +## `apm unpack` + +Extracts an APM bundle into a project directory. Accepts both `.tar.gz` archives and unpacked bundle directories. + +```bash +# Extract and verify +apm unpack ./build/my-project-1.0.0.tar.gz + +# Extract to a specific directory +apm unpack ./build/my-project-1.0.0.tar.gz -o ./ + +# Skip integrity check +apm unpack --skip-verify ./build/my-project-1.0.0.tar.gz + +# Preview without writing +apm unpack ./build/my-project-1.0.0.tar.gz --dry-run +``` + +### Options + +| Flag | Default | Description | +|------|---------|-------------| +| `-o, --output` | `.` (current dir) | Target project directory | +| `--skip-verify` | off | Skip completeness check against lockfile | +| `--dry-run` | off | List files without writing | + +### Behavior + +- **Additive-only**: `unpack` writes files listed in the bundle's lockfile. It never deletes existing files in the target directory. +- **Overwrite on conflict**: if a file already exists at the target path, the bundle file wins. +- **Verification**: by default, `unpack` checks that every path in the bundle's `deployed_files` manifest exists in the bundle before extracting. Pass `--skip-verify` to skip this check for partial bundles. +- **Lockfile not copied**: the bundle's enriched `apm.lock` is metadata for verification only — it is not written to the output directory. + +## Consumption scenarios + +### CI: cross-job artifact sharing + +Resolve once in a setup job, fan out to N consumer jobs. No APM installation in downstream jobs. + +```yaml +# .github/workflows/ci.yml +jobs: + setup: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: microsoft/apm-action@v1 + - run: apm pack --archive + - uses: actions/upload-artifact@v4 + with: + name: apm-bundle + path: build/*.tar.gz + + test: + needs: setup + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: apm-bundle + path: ./bundle + - run: tar xzf ./bundle/*.tar.gz -C . + # Prompts and agents are now in place — no APM needed +``` + +### Agentic workflows + +GitHub's agentic workflow runners operate in sandboxed environments with no network access. Pre-pack the bundle and include it as a workflow artifact so the agent has full context from the start. + +### Release audit trail + +Attach the bundle as a release artifact. Anyone auditing the release can inspect exactly which prompts, agents, and skills shipped with that version. + +```bash +apm pack --archive -o ./release-artifacts/ +gh release upload v1.2.0 ./release-artifacts/*.tar.gz +``` + +### Dev Containers and Codespaces + +Include a pre-built bundle in the dev container image or restore it during `onCreateCommand`. New contributors get working AI context without running `apm install`. + +```json +{ + "onCreateCommand": "tar xzf .devcontainer/apm-bundle.tar.gz -C ." +} +``` + +### Org-wide distribution + +A central platform team maintains the canonical prompt library. Monthly, they run `apm install && apm pack --archive`, publish the bundle to an internal artifact registry, and downstream repos pull it during CI or onboarding. + +## `apm-action` integration + +The official [apm-action](https://github.com/microsoft/apm-action) supports pack and restore as first-class modes. + +### Pack mode + +Generate a bundle as part of a GitHub Actions workflow: + +```yaml +- uses: microsoft/apm-action@v1 + with: + pack: true +``` + +### Restore mode + +Consume a bundle without installing APM. The action extracts the archive directly: + +```yaml +- uses: microsoft/apm-action@v1 + with: + bundle: ./path/to/bundle.tar.gz +``` + +No APM binary, no Python runtime, no network calls. The action handles extraction and verification internally. + +## Prerequisites + +`apm pack` requires two things: + +1. **`apm.lock`** — the resolved lockfile produced by `apm install`. Pack reads the `deployed_files` manifest from this file to know what to include. +2. **Installed files on disk** — the actual files referenced in `deployed_files` must exist at their expected paths. Pack verifies this and fails with a clear error if files are missing. + +The typical sequence is: + +```bash +apm install # resolve dependencies and deploy files +apm pack # bundle the deployed files +``` + +Pack reads from the lockfile, not from a disk scan. If a file exists on disk but is not listed in `apm.lock`, it will not be included. If a file is listed in `apm.lock` but missing from disk, pack will fail and prompt you to re-run `apm install`. + +## Troubleshooting + +### "apm.lock not found" + +Pack requires a lockfile. Run `apm install` first to resolve dependencies and generate `apm.lock`. + +### "deployed files are missing on disk" + +The lockfile references files that do not exist. This usually means dependencies were installed but the files were deleted. Run `apm install` to restore them. + +### "bundle verification failed" + +During unpack, verification found files listed in the bundle's lockfile that are missing from the bundle itself. The bundle may have been created from a partial install or corrupted during transfer. Re-pack from a clean install, or pass `--skip-verify` if you know the bundle is intentionally partial. + +### Empty bundle + +If `apm pack` produces zero files, check that your dependencies have `deployed_files` entries in `apm.lock`. This can happen if `apm install` completed but no integration files were deployed (e.g., the package has no prompts or agents for the active target). diff --git a/docs/src/content/docs/integrations/ci-cd.md b/docs/src/content/docs/integrations/ci-cd.md index 2912d78f..ac3e382e 100644 --- a/docs/src/content/docs/integrations/ci-cd.md +++ b/docs/src/content/docs/integrations/ci-cd.md @@ -83,6 +83,67 @@ apm install apm compile --verbose ``` +## Governance with `apm audit` + +Run `apm audit --ci` in pull requests to verify the lock file matches the installed state. This catches configuration drift before it reaches your default branch. + +```yaml +# .github/workflows/apm-audit.yml +name: APM Audit +on: [pull_request] +jobs: + audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: microsoft/apm-action@v1 + with: + commands: | + apm install + apm audit --ci + env: + GITHUB_APM_PAT: ${{ secrets.APM_PAT }} +``` + +Configure this workflow as a **required status check** in your branch protection rules (or [GitHub Rulesets](../github-rulesets/)) to block PRs that introduce config drift. See the [Governance & Compliance](../../enterprise/governance/) page for policy details. + +## Pack & Distribute + +Use `apm pack` in CI to build a distributable bundle once, then consume it in downstream jobs without needing APM installed. + +### Pack in CI (build once) + +```yaml +- uses: microsoft/apm-action@v1 + with: + commands: | + apm install + apm pack --archive --target all +- uses: actions/upload-artifact@v4 + with: + name: agent-config + path: build/*.tar.gz +``` + +### Consume in another job (no APM needed) + +```yaml +- uses: actions/download-artifact@v4 + with: + name: agent-config +- run: tar xzf build/*.tar.gz -C ./ +``` + +Or use the apm-action restore mode to unpack a bundle directly: + +```yaml +- uses: microsoft/apm-action@v1 + with: + bundle: ./agent-config.tar.gz +``` + +See the [Pack & Distribute guide](../../guides/pack-distribute/) for the full workflow. + ## Best Practices - **Pin APM version** in CI to avoid unexpected changes: `pip install apm-cli==0.7.7` diff --git a/docs/src/content/docs/integrations/gh-aw.md b/docs/src/content/docs/integrations/gh-aw.md index d8604e36..016bce9b 100644 --- a/docs/src/content/docs/integrations/gh-aw.md +++ b/docs/src/content/docs/integrations/gh-aw.md @@ -56,8 +56,95 @@ gh extension install github/gh-aw 2. Configure your project with APM packages, then add gh-aw workflows that reference the compiled context. +## Integration Tiers + +APM integrates with GitHub Agentic Workflows at three levels of depth. + +### Tier 1: Pre-Step with apm-action (Works Today) + +The minimum viable integration. Zero changes to gh-aw. Uses the `steps:` frontmatter field: + +```yaml +--- +on: + issues: + types: [opened] +engine: copilot + +steps: + - name: Install agent primitives + uses: microsoft/apm-action@v1 + with: + script: install + env: + GITHUB_TOKEN: ${{ github.token }} +--- + +# Issue Triage + +Triage this issue using the installed compliance rules and security skills. +``` + +The repo has an `apm.yml` with dependencies and `apm.lock` for reproducibility. The APM action runs `apm install && apm compile` as a pre-agent step. Primitives deploy to `.github/`. The coding agent discovers them naturally. + +### Tier 2: Inline Dependencies (APM Enhancement) + +Declare dependencies directly in workflow frontmatter -- no separate `apm.yml` needed: + +```yaml +--- +on: + issues: + types: [opened] +engine: copilot + +steps: + - uses: microsoft/apm-action@v1 + with: + dependencies: | + microsoft/compliance-rules@v2.1.0 + myorg/security-skill@v1.0.0 + isolated: true +--- + +# Issue Triage +Analyze the opened issue for security implications. +``` + +`isolated: true` means: install packages to a clean workspace, ignore the repo's existing `.github/instructions/`. The agent sees only APM-managed context. + +### Tier 3: Native Frontmatter Integration (Future Vision) + +The endgame: gh-aw recognizes APM as a dependency manager natively via an `apm:` frontmatter field. No `steps:` boilerplate. Subject to gh-aw team collaboration. + +## Using APM Bundles with gh-aw + +For sandboxed environments where network access is restricted, use pre-built APM bundles: + +```yaml +--- +on: pull_request +engine: copilot +imports: + - .github/agents/code-reviewer.md # produced by APM bundle + - .github/agents/security-auditor.md # produced by APM bundle +--- + +# Code Review +Review the PR using team standards. +``` + +Bundles complement gh-aw's native `imports:` -- resolving full dependency trees rather than individual files, with zero network required at workflow runtime. + +See the [CI/CD Integration guide](/apm/integrations/ci-cd/) for details on building and distributing bundles. + +## Solving Instruction Pollution + +When a gh-aw workflow runs in a repo with developer-focused instructions (like "use 4-space tabs"), those instructions become noise for an automated triage bot. APM's `--isolated` mode (Tier 2) addresses this by creating a clean execution context with only the workflow's declared dependencies. + ## Learn More - [gh-aw Documentation](https://github.github.com/gh-aw/) - [APM Compilation Guide](/apm/guides/compilation/) - [APM CLI Reference](/apm/reference/cli-commands/) +- [CI/CD Integration](/apm/integrations/ci-cd/) diff --git a/docs/src/content/docs/integrations/github-rulesets.md b/docs/src/content/docs/integrations/github-rulesets.md new file mode 100644 index 00000000..aca5b69a --- /dev/null +++ b/docs/src/content/docs/integrations/github-rulesets.md @@ -0,0 +1,165 @@ +--- +title: "GitHub Rulesets" +description: "Enforce AI agent configuration governance using APM with GitHub branch protection and Rulesets." +sidebar: + order: 5 +--- + +GitHub Rulesets and branch protection rules can require status checks before merging. APM's `apm audit --ci` integrates as a required status check to enforce agent configuration governance, ensuring that changes to agent context go through the manifest and lock file rather than being made ad hoc. + +## How It Works + +The workflow is straightforward: + +1. `apm audit --ci` runs in a GitHub Actions workflow on every pull request. +2. It verifies that the lock file matches the installed state, no undeclared config changes exist, and all dependencies are resolvable. +3. You configure this workflow as a required status check in branch protection or Rulesets. +4. PRs that change agent config without updating the manifest or lock file are blocked from merging. + +This turns APM from a development convenience into an enforceable policy. + +## Setup + +### Step 1: Create the GitHub Actions Workflow + +Add a workflow file at `.github/workflows/apm-audit.yml`: + +```yaml +# .github/workflows/apm-audit.yml +name: APM Audit +on: + pull_request: + +jobs: + audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install & audit + uses: microsoft/apm-action@v1 + with: + commands: | + apm install + apm audit --ci + env: + GITHUB_APM_PAT: ${{ secrets.APM_PAT }} +``` + +The `GITHUB_APM_PAT` secret is only required if your `apm.yml` references private repositories. For public dependencies you can omit it. + +### Step 2: Add the Required Status Check + +1. Go to your repository **Settings** > **Rules**. +2. Select an existing branch ruleset or create a new one targeting your default branch. +3. Enable **Require status checks to pass** and add `APM Audit` (the workflow job name) as a required check. + +Alternatively, in classic branch protection rules under **Settings** > **Branches** > **Branch protection rules**, enable **Require status checks to pass before merging** and search for `APM Audit`. + +Once configured, any PR that modifies agent configuration files without a corresponding manifest and lock file update will fail the check. + +## What It Catches + +`apm audit --ci` detects the following issues: + +- **Lock file out of sync** — `apm.lock` does not match the current state of `apm.yml`. +- **Undeclared config changes** — manual edits to files in `.github/instructions/` or other managed paths that bypass the manifest. +- **Missing dependencies** — packages declared in `apm.yml` that cannot be resolved. +- **Deleted or modified managed files** — files that APM deployed but were removed or altered outside of APM. + +When any of these conditions is detected, the command exits with a non-zero status code and the check fails. + +## Governance Levels + +APM's integration with GitHub governance is evolving: + +| Level | Description | Status | +|-------|-------------|--------| +| 1 | `apm audit --ci` as a required status check | Available now | +| 2 | GitHub recommends apm-action for agent governance | Future | +| 3 | Native Rulesets UI for agent configuration policy | Future | + +Level 1 is fully functional today. Levels 2 and 3 represent deeper platform integration that would reduce setup friction. + +## Combining with Other Checks + +APM audit complements your existing CI checks — it does not replace them. A typical PR pipeline might include: + +- **Linting and formatting** — code style enforcement +- **Unit and integration tests** — functional correctness +- **Security scanning** — vulnerability detection +- **APM audit** — agent configuration governance + +Each check has a distinct purpose. APM audit focuses exclusively on whether agent context changes are properly declared and consistent. + +## Customizing the Workflow + +### Running Audit Alongside Compile + +You can combine audit with compilation to catch both governance violations and output drift in a single workflow: + +```yaml +jobs: + apm: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: APM checks + uses: microsoft/apm-action@v1 + with: + commands: | + apm install + apm audit --ci + apm compile + git diff --exit-code AGENTS.md || \ + (echo "Compiled output is out of date. Run 'apm compile' locally." && exit 1) + env: + GITHUB_APM_PAT: ${{ secrets.APM_PAT }} +``` + +### Separate Jobs for Granular Status + +If you want audit and compile as separate required checks, split them into distinct jobs: + +```yaml +jobs: + audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: microsoft/apm-action@v1 + with: + commands: | + apm install + apm audit --ci + env: + GITHUB_APM_PAT: ${{ secrets.APM_PAT }} + + compile: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: microsoft/apm-action@v1 + with: + commands: | + apm install + apm compile --verbose +``` + +This lets you require both `audit` and `compile` as independent status checks in your ruleset. + +## Troubleshooting + +### Audit Fails on a Clean PR + +If `apm audit --ci` fails on a PR that did not touch agent config, the lock file is likely already out of sync on the base branch. Run `apm install && apm audit` locally on the base branch to confirm, then commit the fix. + +### Status Check Not Appearing in Rulesets + +The status check name must match the **job name** in your workflow file (e.g., `audit`), not the workflow name. Run the workflow at least once so GitHub registers the check name, then add it to your ruleset. + +## Related + +- [CI/CD Pipelines](../ci-cd/) — full CI integration guide +- [Manifest Schema](../../reference/manifest-schema/) — manifest and lock file reference diff --git a/docs/src/content/docs/integrations/ide-tool-integration.md b/docs/src/content/docs/integrations/ide-tool-integration.md index 4414ebc7..57e972b1 100644 --- a/docs/src/content/docs/integrations/ide-tool-integration.md +++ b/docs/src/content/docs/integrations/ide-tool-integration.md @@ -10,7 +10,7 @@ APM is designed to work seamlessly with your existing development tools and work APM manages the **context foundation** and provides **advanced context management** for software projects. It works exceptionally well alongside [Spec-kit](https://github.com/github/spec-kit) for specification-driven development, as well as with other AI Native Development methodologies like vibe coding. -### 🔧 APM: Context Foundation +### APM: Context Foundation APM provides the infrastructure layer for AI development: @@ -19,7 +19,7 @@ APM provides the infrastructure layer for AI development: - **Performance Optimization**: Optimized context delivery for large, complex projects - **Memory Management**: Strategic LLM token usage across conversations -### 📋 Spec-kit: Specification Layer +### Spec-kit: Specification Layer When using Spec-kit for Specification-Driven Development (SDD), APM automatically integrates the Spec-kit constitution: @@ -28,7 +28,7 @@ When using Spec-kit for Specification-Driven Development (SDD), APM automaticall - **Contextual Augmentation**: APM embeds your team's context modules into `AGENTS.md` after Spec-kit's constitution - **SDD Enhancement**: Augments the Spec Driven Development process with additional context curated by your teams -### 🚀 Integrated Workflow +### Integrated Workflow ```bash # 1. Set up APM contextual foundation @@ -144,26 +144,26 @@ apm runtime test codex apm runtime test llm ``` -## VSCode Integration +## VS Code Integration -APM works natively with VSCode's GitHub Copilot implementation. +APM works natively with VS Code's GitHub Copilot implementation. -> **Auto-Detection**: VSCode integration is automatically enabled when a `.github/` folder exists in your project. If neither `.github/` nor `.claude/` exists, `apm install` skips folder integration (packages are still installed to `apm_modules/`). +> **Auto-Detection**: VS Code integration is automatically enabled when a `.github/` folder exists in your project. If neither `.github/` nor `.claude/` exists, `apm install` skips folder integration (packages are still installed to `apm_modules/`). -### Native VSCode Primitives +### Native VS Code Primitives -VSCode implements core primitives for GitHub Copilot that APM integrates with: +VS Code implements core primitives for GitHub Copilot that APM integrates with: - **Agents**: AI personas and workflows with `.agent.md` files in `.github/agents/` (legacy: `.chatmode.md` in `.github/chatmodes/`) - **Instructions Files**: Modular instructions with `copilot-instructions.md` and `.instructions.md` files - **Prompt Files**: Reusable task templates with `.prompt.md` files in `.github/prompts/` - **Skills**: Structured capabilities with `SKILL.md` in `.github/skills/` -> **Note**: APM supports both the new `.agent.md` format and legacy `.chatmode.md` format. VSCode provides Quick Fix actions to migrate from `.chatmode.md` to `.agent.md`. +> **Note**: APM supports both the new `.agent.md` format and legacy `.chatmode.md` format. VS Code provides Quick Fix actions to migrate from `.chatmode.md` to `.agent.md`. ### Automatic Prompt and Agent Integration -APM automatically integrates prompts and agents from installed packages into VSCode's native structure: +APM automatically integrates prompts and agents from installed packages into VS Code's native structure: ```bash # Install APM packages - integration happens automatically when .github/ exists @@ -186,7 +186,7 @@ apm install microsoft/apm-sample-package - **Zero-Config**: Always enabled, works automatically with no configuration needed - **Auto-Cleanup**: Removes integrated files when you uninstall or prune packages (tracked via `deployed_files` in `apm.lock`) - **Collision Detection**: If a local file has the same name as a package file, APM skips it with a warning (use `--force` to overwrite) -- **Always Overwrite**: Package-owned files are always copied fresh — no version comparison +- **Always Overwrite**: Package-owned files are always copied fresh -- no version comparison - **Link Resolution**: Context links are resolved during integration **Integration Flow**: @@ -199,13 +199,13 @@ apm install microsoft/apm-sample-package 7. Copies hooks to `.github/hooks/` with their original filename and copies referenced scripts 8. If a local file already exists with the same name, skips with a warning (use `--force` to overwrite) 9. Records all deployed files in `apm.lock` under `deployed_files` per package -10. VSCode automatically loads all prompts, agents, instructions, and hooks for your coding agents +10. VS Code automatically loads all prompts, agents, instructions, and hooks for your coding agents 11. Run `apm uninstall` to automatically remove integrated primitives (using `deployed_files` manifest) **Intent-First Discovery**: -Files keep their original names for natural autocomplete in VSCode: -- Type `/design` → VSCode shows `design-review.prompt.md` -- Type `/accessibility` → VSCode shows `accessibility-audit.prompt.md` +Files keep their original names for natural autocomplete in VS Code: +- Type `/design` -- VS Code shows `design-review.prompt.md` +- Type `/accessibility` -- VS Code shows `accessibility-audit.prompt.md` - Search by what you want to do, not where it comes from **Example**: @@ -213,27 +213,27 @@ Files keep their original names for natural autocomplete in VSCode: # Install package with auto-integration apm install microsoft/apm-sample-package -# Result in VSCode: +# Result in VS Code: # Prompts: -# .github/prompts/accessibility-audit.prompt.md ✓ Available in chat -# .github/prompts/design-review.prompt.md ✓ Available in chat -# .github/prompts/style-guide-check.prompt.md ✓ Available in chat +# .github/prompts/accessibility-audit.prompt.md - Available in chat +# .github/prompts/design-review.prompt.md - Available in chat +# .github/prompts/style-guide-check.prompt.md - Available in chat # Agents: -# .github/agents/design-reviewer.agent.md ✓ Available as chat mode -# .github/agents/accessibility-expert.agent.md ✓ Available as chat mode +# .github/agents/design-reviewer.agent.md - Available as chat mode +# .github/agents/accessibility-expert.agent.md - Available as chat mode # Instructions: -# .github/instructions/python.instructions.md ✓ Applied to matching files +# .github/instructions/python.instructions.md - Applied to matching files # Use with natural autocomplete: # Type: /design -# VSCode suggests: design-review.prompt.md ✨ +# VS Code suggests: design-review.prompt.md ``` -**VSCode Native Features**: -- All integrated prompts appear in VSCode's prompt picker -- All integrated agents appear in VSCode's chat mode selector +**VS Code Native Features**: +- All integrated prompts appear in VS Code's prompt picker +- All integrated agents appear in VS Code's chat mode selector - Native chat integration with primitives - Seamless `/prompt` command support - File-pattern based instruction application @@ -286,7 +286,7 @@ APM automatically deploys agent files from installed packages into `.claude/agen apm install danielmeppiel/design-guidelines # Result: -# .claude/agents/security.md → Sub-agent available for Claude Code +# .claude/agents/security.md -- Sub-agent available for Claude Code ``` **How it works:** @@ -303,8 +303,8 @@ APM automatically converts `.prompt.md` files from installed packages into Claud apm install microsoft/apm-sample-package # Result: -# .claude/commands/accessibility-audit.md → /accessibility-audit -# .claude/commands/design-review.md → /design-review +# .claude/commands/accessibility-audit.md -- /accessibility-audit +# .claude/commands/design-review.md -- /design-review ``` **How it works:** @@ -321,8 +321,8 @@ APM automatically integrates skills from installed packages into `.github/skills apm install ComposioHQ/awesome-claude-skills/mcp-builder # Result: -# .github/skills/mcp-builder/SKILL.md → Skill available for agents -# .github/skills/mcp-builder/... → Full skill folder copied +# .github/skills/mcp-builder/SKILL.md -- Skill available for agents +# .github/skills/mcp-builder/... -- Full skill folder copied ``` **Skill Folder Naming**: Uses the source folder name directly (e.g., `mcp-builder`, `design-guidelines`), not flattened paths. @@ -336,7 +336,7 @@ apm install ComposioHQ/awesome-claude-skills/mcp-builder ### Automatic Hook Integration -APM automatically integrates hooks from installed packages. Hooks define lifecycle event handlers (e.g., `PreToolUse`, `PostToolUse`, `Stop`) supported by both VSCode Copilot and Claude Code. +APM automatically integrates hooks from installed packages. Hooks define lifecycle event handlers (e.g., `PreToolUse`, `PostToolUse`, `Stop`) supported by both VS Code Copilot and Claude Code. > **Note:** Hook packages must be authored in the target platform's native format. APM handles path rewriting and file placement but does not translate between hook schema formats (e.g., Claude's `command` key vs GitHub Copilot's `bash`/`powershell` keys, or event name casing differences). @@ -344,9 +344,9 @@ APM automatically integrates hooks from installed packages. Hooks define lifecyc # Install a package with hooks apm install anthropics/claude-plugins-official/plugins/hookify -# VSCode result (.github/hooks/): -# .github/hooks/hookify-hooks.json → Hook definitions -# .github/hooks/scripts/hookify/hooks/*.py → Referenced scripts +# VS Code result (.github/hooks/): +# .github/hooks/hookify-hooks.json -- Hook definitions +# .github/hooks/scripts/hookify/hooks/*.py -- Referenced scripts # Claude result (.claude/settings.json): # Hooks merged into .claude/settings.json hooks key @@ -355,7 +355,7 @@ apm install anthropics/claude-plugins-official/plugins/hookify **How hook integration works:** 1. `apm install` discovers hook JSON files in `.apm/hooks/` or `hooks/` directories -2. For VSCode: copies hook JSON to `.github/hooks/` and rewrites script paths +2. For VS Code: copies hook JSON to `.github/hooks/` and rewrites script paths 3. For Claude: merges hook definitions into `.claude/settings.json` under the `hooks` key 4. Copies referenced scripts to the target location 5. Rewrites `${CLAUDE_PLUGIN_ROOT}` and relative script paths for the target platform @@ -373,7 +373,7 @@ apm compile apm compile --target claude # Creates: CLAUDE.md (instructions only) -# Generate only VSCode/Copilot formats +# Generate only VS Code/Copilot formats apm compile --target copilot # Creates: AGENTS.md (instructions only) ``` @@ -405,8 +405,8 @@ apm install github/awesome-copilot/skills/review-and-refactor apm compile --target claude # 3. In Claude Code, use: -# /code-review → Runs the code review workflow -# /gdpr-assessment → Runs GDPR compliance check +# /code-review -- Runs the code review workflow +# /gdpr-assessment -- Runs GDPR compliance check # 4. CLAUDE.md provides project instructions automatically # 5. Agents in .claude/agents/ are available as sub-agents @@ -428,118 +428,26 @@ APM maintains synchronization between packages and Claude primitives: - **Update**: Refreshes agents, commands, and skills when package version changes - **Virtual Packages**: Individual files and skills (e.g., `github/awesome-copilot/skills/review-and-refactor`) are tracked via `apm.lock` and removed correctly on uninstall -## Development Tool Integrations +## Other IDE Support -### Git Integration +### IDEs with GitHub Copilot -APM integrates with Git workflows for context-aware development: - -```yaml -# .apm/prompts/git-workflow.prompt.md ---- -description: Git-aware development workflow -mode: developer -tools: ["git"] ---- - -# Git-Aware Development - -## Current Branch Analysis -Analyze current branch: `git branch --show-current` -Recent commits: `git log --oneline -10` - -## Context-Aware Changes -Based on Git history, understand: -- Feature branch purpose -- Related file changes -- Commit message patterns -- Code review feedback -``` - -### CI/CD Integration - -Integrate APM workflows into your CI/CD pipelines: - -```yaml -# .github/workflows/apm-quality-gate.yml -name: APM Quality Gate -on: [pull_request] - -jobs: - apm-review: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup APM - run: curl -sSL https://raw.githubusercontent.com/microsoft/apm/main/install.sh | sh - - name: Code Review - run: | - apm compile - apm run code-review --param files="${{ github.event.pull_request.changed_files }}" - - name: Security Scan - run: apm run security-review --param severity="high" - - name: Performance Check - run: apm run performance-review --param threshold="200ms" -``` - -### Docker Integration - -Containerize APM workflows for consistent environments: - -```dockerfile -# Dockerfile.apm -FROM python:3.12-slim - -# Install APM -RUN curl -sSL https://raw.githubusercontent.com/microsoft/apm/main/install.sh | sh - -# Install runtimes -RUN apm runtime setup copilot - -# Copy project -COPY . /workspace -WORKDIR /workspace - -# Compile primitives -RUN apm compile - -ENTRYPOINT ["apm"] -``` +Any IDE with GitHub Copilot support works with APM's file-level integration. APM deploys primitives to `.github/`, which Copilot discovers automatically: ```bash -# Use in CI/CD -docker run --rm -v $(pwd):/workspace apm run code-review -``` - -### IDE Integration - -Beyond VSCode, APM works with other popular IDEs: - -#### Other IDEs with GitHub Copilot - -Any IDE with GitHub Copilot support (JetBrains, Visual Studio, etc.) works with APM's prompt integration: - -```bash -# Install APM packages apm install microsoft/apm-sample-package -# GitHub Copilot automatically picks up: -# .github/prompts/*.prompt.md (integrated prompts) -# .github/agents/*.agent.md (integrated agents) -# .github/agents/ or .github/chatmodes/ (AI personas - both formats supported) -# .github/instructions/*.instructions.md (file-pattern rules from packages) -# .github/instructions/ (file-pattern rules) +# GitHub Copilot picks up: +# .github/prompts/*.prompt.md +# .github/agents/*.agent.md +# .github/instructions/*.instructions.md ``` -**Supported IDEs**: -- JetBrains (IntelliJ, PyCharm, WebStorm, etc.) -- Visual Studio -- VS Code -- Any IDE with GitHub Copilot integration +**Supported IDEs**: JetBrains (IntelliJ, PyCharm, WebStorm, etc.), Visual Studio, VS Code, and any IDE with GitHub Copilot integration. -#### Cursor +### Cursor -Cursor does not follow the VSCode/GitHub Copilot `.github/` primitive structure. APM supports Cursor through compiled context output: +Cursor does not follow the `.github/` primitive structure. APM supports Cursor through compiled context output: ```bash # Compile APM context into AGENTS.md (Cursor reads this format) @@ -635,8 +543,8 @@ APM also handles stale server cleanup: when a package is uninstalled or an MCP d The MCP registry API may return empty `registry_name` fields for packages. APM infers the package type from: 1. Explicit `registry_name` (when provided) -2. `runtime_hint` (e.g. `npx` → npm, `uvx` → pypi) -3. Package name patterns (e.g. `@scope/name` → npm, `ghcr.io/…` → docker, `PascalCase.Name` → nuget) +2. `runtime_hint` (e.g. `npx` to npm, `uvx` to pypi) +3. Package name patterns (e.g. `@scope/name` to npm, `ghcr.io/...` to docker, `PascalCase.Name` to nuget) ### Supported Package Types @@ -651,7 +559,7 @@ When installing registry MCP servers, APM selects the best available package for | Other (with runtime_hint) | Yes (generic) | Yes (generic) | Yes (generic) | | HTTP/SSE remotes | Yes | Yes | Yes | -### MCP Server Management +### MCP Server Declaration ```yaml # apm.yml - MCP dependencies @@ -691,241 +599,19 @@ apm mcp info ghcr.io/github/github-mcp-server apm mcp list ``` -### MCP Tool Usage in Workflows - -```yaml -# .apm/prompts/github-integration.prompt.md ---- -description: GitHub-aware development workflow -mode: developer -mcp: - - ghcr.io/github/github-mcp-server ---- - -# GitHub Integration Workflow - -## Available Tools -- `github_create_issue` - Create GitHub issues -- `github_list_prs` - List pull requests -- `github_get_file` - Read repository files -- `github_search_code` - Search code across repositories - -## Example Usage -Create an issue for the bug we just identified: -``` -github_create_issue( - title="Performance regression in /api/users endpoint", - body="Response time increased from 100ms to 500ms", - labels=["bug", "performance"] -) -``` -``` - -## API and Webhook Integration - -### REST API Integration - -APM can generate workflows that integrate with existing APIs: - -```yaml -# .apm/context/api-endpoints.context.md - -# Company API Endpoints - -## Internal APIs -- **User Service**: https://api.internal.com/users/v1 -- **Payment Service**: https://api.internal.com/payments/v1 -- **Analytics Service**: https://api.internal.com/analytics/v1 - -## External APIs -- **Stripe**: https://api.stripe.com/v1 -- **SendGrid**: https://api.sendgrid.com/v3 -- **Twilio**: https://api.twilio.com/2010-04-01 -``` - -### Webhook-Driven Workflows - -```yaml -# .apm/prompts/webhook-handler.prompt.md ---- -description: Process incoming webhooks and trigger appropriate actions -mode: integration-developer -input: [webhook_source, event_type, payload] ---- - -# Webhook Event Handler - -## Event Processing -Source: ${input:webhook_source} -Event: ${input:event_type} -Payload: ${input:payload} - -## Processing Rules -Based on the webhook source and event type: -1. Validate payload signature -2. Parse event data -3. Trigger appropriate business logic -4. Send confirmation response -5. Log event for audit trail -``` - -## Database and ORM Integration - -### Database-Aware Development - -```yaml -# .apm/context/database-schema.context.md - -# Database Schema Context - -## Core Tables -- **users**: User accounts and profiles -- **organizations**: Company/team structures -- **projects**: Development projects -- **permissions**: Role-based access control - -## Relationships -- users belong to organizations -- projects belong to organizations -- permissions link users to resources - -## Conventions -- All tables have created_at/updated_at timestamps -- Use UUIDs for primary keys -- Soft deletes with deleted_at column -``` - -### ORM-Specific Patterns - -```yaml -# .apm/instructions/sqlalchemy.instructions.md ---- -applyTo: "**/*models*.py" ---- - -# SQLAlchemy Best Practices - -## Model Definition Standards -- Use declarative base for all models -- Include __tablename__ explicitly -- Add proper relationships with lazy loading -- Include validation at the model level - -## Query Patterns -- Use select() for new code (SQLAlchemy 2.0 style) -- Implement proper connection pooling -- Use transactions for multi-table operations -- Add query optimization with proper indexing hints -``` - -## Security Tool Integration - -### Security Scanning Integration - -```bash -# Integrate security tools into APM workflows -apm run security-audit --param tools="bandit,safety,semgrep" --param scope="all" -``` - -```yaml -# .apm/prompts/security-audit.prompt.md ---- -description: Comprehensive security audit using multiple tools -mode: security-engineer -input: [tools, scope] ---- - -# Security Audit Workflow - -## Tools Integration -Run security analysis using: ${input:tools} -Scope: ${input:scope} - -## Automated Scanning -1. **Bandit**: Python security linter -2. **Safety**: Python dependency vulnerability scanner -3. **Semgrep**: Multi-language static analysis -4. **Custom Rules**: Company-specific security patterns - -## Report Generation -Consolidate findings into prioritized security report: -- Critical vulnerabilities requiring immediate action -- High-priority issues for next sprint -- Medium/low priority items for backlog -- False positives and exceptions -``` - -## Monitoring and Observability - -### APT Integration with Observability Stack - -```yaml -# .apm/prompts/add-monitoring.prompt.md ---- -description: Add comprehensive monitoring to services -mode: sre-engineer -input: [service_name, monitoring_level] ---- - -# Service Monitoring Setup - -## Service: ${input:service_name} -## Level: ${input:monitoring_level} - -## Monitoring Components -1. **Metrics**: Application and business metrics -2. **Logging**: Structured logging with correlation IDs -3. **Tracing**: Distributed tracing for request flows -4. **Alerting**: SLO-based alerting rules - -## Implementation Steps -- Add Prometheus metrics endpoints -- Configure structured logging with correlation -- Implement OpenTelemetry tracing -- Create Grafana dashboards -- Set up PagerDuty alerting rules -``` - -## Team Workflow Integration - -### Agile/Scrum Integration - -```yaml -# .apm/prompts/sprint-planning.prompt.md ---- -description: AI-assisted sprint planning and task breakdown -mode: scrum-master -input: [epic, team_capacity, sprint_duration] ---- - -# Sprint Planning Assistant - -## Epic Breakdown -Epic: ${input:epic} -Team Capacity: ${input:team_capacity} -Sprint Duration: ${input:sprint_duration} - -## Task Analysis -1. **Epic Decomposition**: Break epic into implementable stories -2. **Effort Estimation**: Use team velocity for story points -3. **Dependency Mapping**: Identify cross-team dependencies -4. **Risk Assessment**: Highlight potential blockers -5. **Capacity Planning**: Match tasks to team member skills - -## Sprint Goal -Generate clear, measurable sprint goal aligned with epic objectives. -``` +## Roadmap -## Next Steps +The following IDE integrations are planned for future releases: -Ready to integrate APM with your existing tools? +- **JetBrains IDE support**: Native integration with IntelliJ, PyCharm, WebStorm, and other JetBrains IDEs +- **Windsurf support**: Integration with the Windsurf AI coding environment +- **Cursor deeper integration**: Enhanced support beyond AGENTS.md, including native Cursor rules generation -- **[Getting Started](../../getting-started/installation/)** - Set up APM in your environment -- **[Context Guide](../../introduction/key-concepts/)** - Build custom integration workflows -- **[Examples & Use Cases](../../reference/examples/)** - See integration patterns in action -- **[CLI Reference](../../reference/cli-commands/)** - Complete command documentation +## Related Resources -Or explore specific integration patterns: +- **[Getting Started](../../getting-started/installation/)** -- Set up APM in your environment +- **[Key Concepts](../../introduction/key-concepts/)** -- Core APM concepts and terminology +- **[CLI Reference](../../reference/cli-commands/)** -- Complete command documentation - Review the [VSCode Copilot Customization Guide](https://code.visualstudio.com/docs/copilot/copilot-customization) for VSCode-specific features - Check the [Spec-kit documentation](https://github.com/github/spec-kit) for SDD integration details - Explore [MCP servers](https://modelcontextprotocol.io/servers) for tool integration options \ No newline at end of file diff --git a/docs/src/content/docs/introduction/how-it-works.md b/docs/src/content/docs/introduction/how-it-works.md index 611778ed..464ffbc6 100644 --- a/docs/src/content/docs/introduction/how-it-works.md +++ b/docs/src/content/docs/introduction/how-it-works.md @@ -1,7 +1,7 @@ --- title: "How It Works" sidebar: - order: 2 + order: 3 --- APM implements the complete [AI-Native Development framework](https://danielmeppiel.github.io/awesome-ai-native/docs/concepts/) - a systematic approach to making AI coding assistants reliable, scalable, and team-friendly. diff --git a/docs/src/content/docs/introduction/key-concepts.md b/docs/src/content/docs/introduction/key-concepts.md index 6cc8f680..f84d4598 100644 --- a/docs/src/content/docs/introduction/key-concepts.md +++ b/docs/src/content/docs/introduction/key-concepts.md @@ -1,7 +1,7 @@ --- title: "Key Concepts" sidebar: - order: 3 + order: 4 --- Context components are the configurable tools that deploy proven prompt engineering and context engineering techniques. APM implements these as the core building blocks for reliable, reusable AI development workflows. diff --git a/docs/src/content/docs/introduction/what-is-apm.md b/docs/src/content/docs/introduction/what-is-apm.md new file mode 100644 index 00000000..c9cbdcd4 --- /dev/null +++ b/docs/src/content/docs/introduction/what-is-apm.md @@ -0,0 +1,244 @@ +--- +title: "What is APM?" +description: "Agent Package Manager — the open-source dependency manager for AI agent configuration." +sidebar: + order: 1 +--- + +Software teams solved dependency management for application code decades ago. +`npm`, `pip`, `cargo`, `go mod` — declare what you need, install it reproducibly, lock versions, ship. + +AI agent configuration has no equivalent. Until now. + +## What is agent package management? + +AI coding agents — GitHub Copilot, Claude, Cursor, Codex, Gemini — are only as +good as the context they receive. That context is made up of instructions, +skills, prompts, agent definitions, hooks, plugins, and MCP server +configurations. + +Today, teams manage this context by hand: + +- Copy instruction files between repos +- Write prompts from scratch for every project +- Configure MCP servers manually on each developer's machine +- Hope everyone's setup matches + +This is the same class of problem that `package.json` solved for JavaScript, +`requirements.txt` for Python, and `Cargo.toml` for Rust. Agent configuration +is infrastructure. It deserves a dependency manager. + +**Agent package management** is the practice of declaring, resolving, locking, +and distributing AI agent configuration as versioned, composable packages. + +APM is the tool that does it. + +## The shape of the problem + +Consider what happens when a team adopts AI coding agents without a package +manager: + +| Without APM | With APM | +|---|---| +| Each dev configures agents manually | `apm install` sets up everything | +| Instructions drift across machines | `apm.lock` pins exact versions | +| No way to share or reuse prompts | Publish and install from any git host | +| MCP servers configured per-developer | Declared in manifest, installed consistently | +| Onboarding requires tribal knowledge | Clone, `apm install`, done | +| No audit trail for agent config | Lock file tracks every dependency | + +The cost compounds with team size. A 5-person team with manual setup has 5 +divergent agent configurations. A 50-person team has 50. + +## How APM works + +APM introduces `apm.yml` — a declarative manifest for AI agent configuration: + +```yaml +name: my-project +version: 1.0.0 +dependencies: + apm: + - microsoft/apm-sample-package + - anthropics/skills/skills/frontend-design + - github/awesome-copilot/agents/api-architect.agent.md +``` + +One command installs everything: + +```bash +apm install +``` + +APM resolves transitive dependencies, places files in the correct directories, +and generates a lock file that pins every version. + +## The seven primitives + +APM manages seven types of agent configuration. Each is a first-class citizen +in the manifest and dependency tree. + +| Primitive | What it does | Example | +|---|---|---| +| **Instructions** | Coding standards and guardrails | "Use type hints in all Python files" | +| **Skills** | Reusable AI capabilities and workflows | Form builder, code reviewer | +| **Prompts** | Slash commands for common tasks | `/security-audit`, `/design-review` | +| **Agents** | Specialized AI personas | Accessibility auditor, API designer | +| **Hooks** | Lifecycle event handlers | Pre-tool validation, post-tool linting | +| **Plugins** | Pre-packaged agent bundles | Context engineering kit, commit helpers | +| **MCP Servers** | External tool integrations | Database access, API connectors | + +These primitives map directly to the configuration surfaces of major AI coding +tools. APM does not invent new abstractions — it manages the ones that already +exist. + +For detailed definitions, see [Primitive Types](../../reference/primitive-types/). + +## The lifecycle + +APM follows a five-stage lifecycle that mirrors how teams actually work with +agent configuration: + +``` +CONSUME --> COMPOSE --> LOCK --> BUILD --> DISTRIBUTE +``` + +**Consume.** Install packages from any git host. APM resolves the full +dependency tree and places primitives in the correct directories. + +```bash +apm install microsoft/apm-sample-package +``` + +**Compose.** Combine primitives from multiple sources. Your project's +`apm.yml` is the single source of truth for all agent configuration. + +```yaml +dependencies: + apm: + - org/team-standards # company-wide instructions + - org/api-patterns # API development skills + - community/security-audit # open-source prompt +``` + +**Lock.** `apm.lock` pins every dependency to an exact commit. Two developers +running `apm install` on the same lock file get identical setups. + +**Build.** `apm compile` produces optimized output files for each AI tool — +`AGENTS.md` for Copilot, Cursor, and Codex; `CLAUDE.md` for Claude. + +```bash +apm compile +``` + +**Distribute.** Any git repository is a valid APM package. Publish by pushing +to a git remote. No registry required. + +## Supported tools + +APM compiles agent configuration into the native format of each supported tool: + +| AI Tool | Output format | Integration | +|---|---|---| +| GitHub Copilot | `AGENTS.md`, `.github/instructions/`, `.github/prompts/` | Full | +| Cursor | `.cursor/rules/`, `.cursor/prompts/` | Full | +| Claude | `CLAUDE.md`, `.claude/commands/` | Full | +| Codex | `AGENTS.md` | Full | +| Gemini | `GEMINI.md` | Full | + +The output is native. Each tool reads its own format — APM is transparent to +the AI agent at runtime. + +For setup details, see [IDE and Tool Integration](../../integrations/ide-tool-integration/). + +## Install from anywhere + +APM installs packages from any git host that supports HTTPS or SSH: + +```bash +# GitHub +apm install microsoft/apm-sample-package + +# GitLab +apm install gitlab.com/org/repo + +# Bitbucket +apm install bitbucket.org/org/repo + +# Azure DevOps +apm install dev.azure.com/org/project/_git/repo + +# GitHub Enterprise +apm install github.example.com/org/repo +``` + +Packages are git repositories. If you can clone it, APM can install it. + +For authentication setup, see [Authentication](../../getting-started/authentication/). + +## Positioning: APM and plugin ecosystems + +APM is not a plugin system. It does not compete with GitHub Copilot Extensions, +Claude plugins, or Cursor features. Those systems define *what agents can do*. + +APM is the **governance, composition, and reproducibility layer** that sits +underneath: + +``` ++--------------------------------------------------+ +| AI Coding Tools | +| (Copilot, Claude, Cursor, Codex, Gemini) | ++--------------------------------------------------+ +| Plugin / Extension Systems | +| (tool-specific capabilities) | ++--------------------------------------------------+ +| APM | +| (dependency management, composition, lock files) | ++--------------------------------------------------+ +| Git | +| (source of truth, distribution) | ++--------------------------------------------------+ +``` + +APM manages *which* configuration gets deployed, *how* it composes, and +*whether* everyone on the team has the same setup. The plugin systems handle +the rest. + +## Zero lock-in + +APM's output is the native configuration format of each tool. If you stop using +APM: + +- Your `AGENTS.md` still works with Copilot and Codex +- Your `CLAUDE.md` still works with Claude +- Your `.cursor/rules/` still work with Cursor +- Your `.github/prompts/` still work with Copilot + +APM adds a dependency management layer. It does not add a runtime dependency. +The compiled output is plain files that each tool already understands. + +## Key value propositions + +**Reproducibility.** `apm.lock` guarantees identical agent setups across +developers, CI, and environments. No more "works on my machine" for AI +configuration. + +**One-command install.** Clone a repo, run `apm install`, and every primitive +is in place. Onboarding goes from hours of setup to seconds. + +**Composition.** Combine packages from your organization, the community, and +your own project. APM resolves the full dependency tree. + +**Audit and governance.** The lock file is a complete, diffable record of every +agent configuration dependency. Review it in PRs like any other infrastructure +change. + +**Multi-tool output.** Write your configuration once. APM compiles it for +every supported AI tool. + +## What's next + +- [Installation](../../getting-started/installation/) — get APM running in under a minute +- [Why APM?](../why-apm/) — the problem space in detail +- [How It Works](../how-it-works/) — architecture and compilation pipeline +- [Key Concepts](../key-concepts/) — primitives, manifests, and lock files diff --git a/docs/src/content/docs/introduction/why-apm.md b/docs/src/content/docs/introduction/why-apm.md index ed87875d..0bbc4fd0 100644 --- a/docs/src/content/docs/introduction/why-apm.md +++ b/docs/src/content/docs/introduction/why-apm.md @@ -2,7 +2,7 @@ title: "Why APM?" description: "The problem APM solves — why AI agents need a dependency manager." sidebar: - order: 1 + order: 2 --- AI coding agents are powerful — but only when they have the right context. Today, setting up that context is entirely manual. @@ -38,6 +38,41 @@ Run `apm install` and APM: - **Integrates primitives** — instructions go to `.github/instructions/`, prompts to `.github/prompts/`, skills to `.github/skills/`. - **Compiles context** — `apm compile` produces optimized `AGENTS.md` and `CLAUDE.md` files for every major AI coding agent. +## APM vs. Manual Setup + +Consider a project that uses 5 agent plugins across GitHub Copilot and Claude: + +**Without APM:** + +```bash +# Every developer, every clone, every time +git clone my-project && cd my-project +# Read README for AI setup instructions +# Manually install plugin A (Copilot) +# Manually install plugin B (Copilot) +# Manually install plugin C (Claude) +# Manually install plugin D (Claude) +# Manually install plugin E (shared) +# Hope the versions match what the rest of the team is using +# Hope you didn't miss a step +``` + +**With APM:** + +```bash +git clone my-project && cd my-project +apm install +# Done. All 5 plugins resolved, installed, and compiled. +``` + +| | Without APM | With APM | +|---|---|---| +| Setup steps | 5+ install commands | 1 command | +| Version consistency | Hope-based | Lock file enforced | +| New contributor onboarding | Read docs, follow steps, debug mismatches | `apm install` | +| CI/CD reproducibility | Fragile or nonexistent | Deterministic via `apm.lock` | +| Cross-tool coordination | Manual per tool | Unified manifest | + ## What APM Manages APM handles seven types of agent primitives: @@ -54,9 +89,41 @@ APM handles seven types of agent primitives: All declared in one manifest. All installed with one command. +## Developer Stories + +**Solo / Small Team (2-5 devs)** — "I use Copilot AND Claude. The project needs 5 plugins. Without APM, every new contributor runs 5 install commands and hopes they got the right versions. With APM, they run `apm install`." + +**Mid-size Team (10-50 devs)** — "We have org-wide security standards, team-specific plugins, and project-level config. `apm.yml` composes all three layers through dependency resolution. `apm.lock` ensures every developer and CI runner gets the exact same setup." + +**Enterprise (100+ devs)** — "When security asks 'what agent instructions were active when release 4.2.1 shipped?' — `git log apm.lock` answers that. Every change to agent configuration is versioned, auditable, and reproducible." + ## Design Principles - **Familiar** — APM works like the package managers you already know. - **Fast** — install, compile, and run in seconds. - **Open** — built on [AGENTS.md](https://agents.md), [Agent Skills](https://agentskills.io), and [MCP](https://modelcontextprotocol.io). - **Portable** — install from GitHub, GitLab, Bitbucket, Azure DevOps, or any git host. + +## When You Might Not Need APM + +APM is not the right tool for every situation: + +- **You use a single AI tool with 1-2 plugins** — the overhead of a manifest may not be worth it yet. +- **You work solo and don't need reproducible setups** — if no one else needs to replicate your environment, manual setup is fine. +- **Your org doesn't require audit trails for AI agent configuration** — if compliance isn't a concern, the lock file adds little value. + +APM shines when complexity grows: multiple tools, team coordination, compliance requirements, or CI/CD integration. Start without it if your setup is simple. Adopt it when manual management becomes a bottleneck. + +## FAQ + +**"Don't plugins already handle this?"** + +Yes, for single-tool installation. APM adds what plugins don't provide: cross-tool install with one command, consumer-side lock files (plugins have none), CI enforcement, and multi-source composition. APM works WITH plugin ecosystems, not against them. + +**"Is APM another tool I have to maintain?"** + +APM is a dev-time tool. Run `apm install`, get your files, done. There is no runtime process, no background daemon, no maintenance burden. It runs when you ask it to and does nothing otherwise. + +**"What if I stop using APM?"** + +Delete `apm.yml` and `apm.lock`. Your `.github/` and `.claude/` config files still work exactly as they did before. APM deploys standard files in standard locations. Zero lock-in by design. diff --git a/docs/src/content/docs/reference/lockfile-spec.md b/docs/src/content/docs/reference/lockfile-spec.md new file mode 100644 index 00000000..36f3559d --- /dev/null +++ b/docs/src/content/docs/reference/lockfile-spec.md @@ -0,0 +1,275 @@ +--- +title: "Lock File Specification" +description: "The apm.lock format — how APM pins dependencies to exact versions for reproducible installs." +sidebar: + order: 3 +--- + +
+
Version
0.1 (Working Draft)
+
Date
2026-03-09
+
Editors
Daniel Meppiel (Microsoft)
+
Repository
https://github.com/microsoft/apm
+
Format
YAML 1.2
+
+ +## Status of This Document + +This is a **Working Draft**. The lock file format is stable at version `"1"` and +breaking changes will be gated behind a `lockfile_version` bump. + +## Abstract + +`apm.lock` records the exact resolved state of every dependency in an APM +project. It is the receipt of what was installed — commit SHAs, source URLs, +and every file deployed into the workspace. Its role is analogous to +`package-lock.json` (npm) or `.terraform.lock.hcl` (Terraform): given the same +lock file, APM MUST reproduce the same file tree. + +--- + +## 1. Conformance + +The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" in this +document are to be interpreted as described in [RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119). + +## 2. Purpose + +The lock file serves four goals: + +1. **Reproducibility** — the same lock file yields the same deployed files on + every machine, every time. +2. **Provenance** — every dependency is traceable to an exact source commit. +3. **Completeness** — `deployed_files` lists every file APM placed in the + project, enabling precise removal. +4. **Auditability** — `git log apm.lock` provides a full history of dependency + changes across the lifetime of the project. + +## 3. Lifecycle + +`apm.lock` is created and updated at well-defined points: + +| Event | Effect on `apm.lock` | +|-------|----------------------| +| `apm install` (first run) | Created. All dependencies resolved, commits pinned, files recorded. | +| `apm install` (subsequent) | Read. Locked commits reused. New dependencies appended. | +| `apm install --update` | Re-resolved. All refs re-resolved to latest matching commits. | +| `apm deps update` | Re-resolved. Refreshes versions for specified or all dependencies. | +| `apm pack` | Enriched. A `pack:` section is prepended to the bundled copy (see [section 6](#6-pack-enrichment)). | +| `apm uninstall` | Updated. Removed dependency entries and their `deployed_files` references. | + +The lock file SHOULD be committed to version control. It MUST NOT be +manually edited — APM is the sole writer. + +## 4. Document Structure + +A conforming lock file MUST be a YAML 1.2 document with the following +top-level structure: + +```yaml +lockfile_version: "1" +generated_at: "2026-03-09T14:00:00Z" +apm_version: "0.7.7" + +dependencies: + - repo_url: https://github.com/acme-corp/security-baseline + resolved_commit: a1b2c3d4e5f6789012345678901234567890abcd + resolved_ref: v2.1.0 + version: "2.1.0" + depth: 1 + package_type: apm_package + deployed_files: + - .github/instructions/security.instructions.md + - .github/agents/security-auditor.agent.md + + - repo_url: https://github.com/acme-corp/common-prompts + resolved_commit: f6e5d4c3b2a1098765432109876543210fedcba9 + resolved_ref: main + depth: 2 + resolved_by: https://github.com/acme-corp/security-baseline + package_type: apm_package + deployed_files: + - .github/instructions/common-guidelines.instructions.md +``` + +### 4.1 Top-Level Fields + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `lockfile_version` | string | MUST | Lock file format version. Currently `"1"`. | +| `generated_at` | string (ISO 8601) | MUST | UTC timestamp of when the lock file was last written. | +| `apm_version` | string | MUST | Version of APM that generated this lock file. | +| `dependencies` | array | MUST | Ordered list of resolved dependencies (see [section 4.2](#42-dependency-entries)). | +| `mcp_servers` | array | MAY | List of MCP server identifiers registered by installed packages. | + +### 4.2 Dependency Entries + +The `dependencies` list MUST be sorted by `depth` (ascending), then by +`repo_url` (lexicographic). Each entry is a YAML mapping with the following +fields: + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `repo_url` | string | MUST | Source repository URL. | +| `host` | string | MAY | Git host identifier (e.g., `github.com`). Omitted when inferrable from `repo_url`. | +| `resolved_commit` | string | MUST | Full 40-character commit SHA that was checked out. | +| `resolved_ref` | string | MUST | Git ref (tag, branch, SHA) that resolved to `resolved_commit`. | +| `version` | string | MAY | Semantic version of the package, if declared in its manifest. | +| `virtual_path` | string | MAY | Sub-path within the repository for virtual (monorepo) packages. | +| `is_virtual` | boolean | MAY | `true` if the package is a virtual sub-package. Omitted when `false`. | +| `depth` | integer | MUST | Dependency depth. `1` = direct dependency, `2`+ = transitive. | +| `resolved_by` | string | MAY | `repo_url` of the parent that introduced this transitive dependency. Present only when `depth >= 2`. | +| `package_type` | string | MUST | Package type: `apm_package`, `plugin`, `virtual`, or other registered types. | +| `deployed_files` | array of strings | MUST | Every file path APM deployed for this dependency, relative to project root. | + +Fields with empty or default values (empty strings, `false` booleans, empty +lists) SHOULD be omitted from the serialized output to keep the file concise. + +### 4.3 Unique Key + +Each dependency is uniquely identified by its `repo_url`, or by the +combination of `repo_url` and `virtual_path` for virtual packages. A +conforming lock file MUST NOT contain duplicate entries for the same key. + +## 5. Path Conventions + +All paths in `deployed_files` MUST use forward slashes (POSIX format), +regardless of the host operating system. Paths are relative to the project +root directory. + +```yaml +# Correct +deployed_files: + - .github/instructions/security.instructions.md + - .github/agents/code-review.agent.md + +# Incorrect — backslashes are not permitted +deployed_files: + - .github\instructions\security.instructions.md +``` + +This convention ensures lock files are portable across operating systems and +produce consistent diffs in version control. + +## 6. Pack Enrichment + +When `apm pack` creates a bundle, it prepends a `pack:` section to the lock +file copy included in the bundle. This section is informational and is not +written back to the project's `apm.lock`. + +```yaml +pack: + format: apm + target: vscode + packed_at: "2026-03-09T14:30:00Z" + +lockfile_version: "1" +generated_at: "2026-03-09T14:00:00Z" +# ... rest of lock file +``` + +### 6.1 Pack Fields + +| Field | Type | Description | +|-------|------|-------------| +| `pack.format` | string | Bundle format: `"apm"` or `"plugin"`. | +| `pack.target` | string | Target environment: `"vscode"`, `"claude"`, or `"all"`. | +| `pack.packed_at` | string (ISO 8601) | UTC timestamp of when the bundle was created. | + +The original lock file is not mutated. The enriched copy exists only inside the +packed archive. + +## 7. Resolver Behaviour + +The dependency resolver interacts with the lock file as follows: + +1. **First install** — resolve all refs to commits, write `apm.lock`. +2. **Subsequent installs** — read `apm.lock`, reuse locked commits. Only + newly added dependencies trigger resolution. +3. **Update** (`--update` flag or `apm deps update`) — re-resolve all refs, + overwrite the lock file with fresh commits. + +When a locked commit is no longer reachable (force-pushed branch, deleted tag), +APM MUST report an error and refuse to install until the lock file is updated. + +## 8. Migration + +The lock file reader supports one historical migration: + +- **`deployed_skills`** — renamed to `deployed_files`. If a lock file contains + the legacy key, it is silently migrated on read. New lock files MUST use + `deployed_files`. + +## 9. Auditing Patterns + +Because `apm.lock` is committed to version control, standard Git operations +provide a complete audit trail: + +```bash +# Full history of dependency changes +git log --oneline apm.lock + +# What changed in the last commit +git diff HEAD~1 -- apm.lock + +# State of dependencies at a specific release +git show v4.2.1:apm.lock + +# Who last modified the lock file +git log -1 --format='%an <%ae> %ai' -- apm.lock +``` + +In CI pipelines, `apm audit --ci` verifies the lock file is in sync with the +manifest and that all deployed files are present. + +## 10. Example: Complete Lock File + +```yaml +lockfile_version: "1" +generated_at: "2026-03-09T14:00:00Z" +apm_version: "0.7.7" + +dependencies: + - repo_url: https://github.com/acme-corp/security-baseline + resolved_commit: a1b2c3d4e5f6789012345678901234567890abcd + resolved_ref: v2.1.0 + version: "2.1.0" + depth: 1 + package_type: apm_package + deployed_files: + - .github/instructions/security.instructions.md + - .github/agents/security-auditor.agent.md + - .github/agents/threat-model.agent.md + + - repo_url: https://github.com/acme-corp/common-prompts + resolved_commit: f6e5d4c3b2a1098765432109876543210fedcba9 + resolved_ref: main + depth: 2 + resolved_by: https://github.com/acme-corp/security-baseline + package_type: apm_package + deployed_files: + - .github/instructions/common-guidelines.instructions.md + + - repo_url: https://github.com/example-org/monorepo-tools + host: github.com + resolved_commit: 0123456789abcdef0123456789abcdef01234567 + resolved_ref: v1.0.0 + version: "1.0.0" + virtual_path: packages/linter-config + is_virtual: true + depth: 1 + package_type: virtual + deployed_files: + - .github/instructions/linter.instructions.md + +mcp_servers: + - security-scanner +``` + +--- + +## Appendix A: Revision History + +| Version | Date | Changes | +|---------|------|---------| +| 0.1 | 2026-03-09 | Initial working draft. |